|
@@ -1,9 +1,10 @@
|
|
|
<template>
|
|
|
- <div class='m-container'>
|
|
|
- <h2>
|
|
|
- <div class="squrt"></div>意见反馈
|
|
|
- </h2>
|
|
|
- <div class="m-core">
|
|
|
+ <div class="m-container">
|
|
|
+ <!-- <h2>
|
|
|
+ <div class="squrt"></div>
|
|
|
+ 意见反馈
|
|
|
+ </h2> -->
|
|
|
+
|
|
|
<save-form
|
|
|
:inline="true"
|
|
|
class="searchForm"
|
|
@@ -13,6 +14,90 @@
|
|
|
:model.sync="searchForm"
|
|
|
ref="searchForm"
|
|
|
>
|
|
|
+ <el-form-item prop="search">
|
|
|
+ <el-input
|
|
|
+ class="search"
|
|
|
+ v-model.trim="searchForm.search"
|
|
|
+ clearable
|
|
|
+ @keyup.enter.native="
|
|
|
+ e => {
|
|
|
+ e.target.blur();
|
|
|
+ $refs.searchForm.save();
|
|
|
+ search();
|
|
|
+ }
|
|
|
+ "
|
|
|
+ placeholder="用户/手机号"
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="operatorSearch">
|
|
|
+ <el-input
|
|
|
+ class="search"
|
|
|
+ v-model.trim="searchForm.operatorSearch"
|
|
|
+ clearable
|
|
|
+ @keyup.enter.native="
|
|
|
+ e => {
|
|
|
+ e.target.blur();
|
|
|
+ $refs.searchForm.save();
|
|
|
+ search();
|
|
|
+ }
|
|
|
+ "
|
|
|
+ placeholder="处理人"
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+
|
|
|
+ <!-- operatorSearch -->
|
|
|
+ <!-- <el-form-item prop="suggestionType">
|
|
|
+ <el-select
|
|
|
+ v-model="searchForm.suggestionType"
|
|
|
+ placeholder="建议类型"
|
|
|
+ clearable
|
|
|
+ class="w100"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="(item, index) in suggestionTypeList"
|
|
|
+ :key="index"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ ></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item> -->
|
|
|
+ <el-form-item prop="suggestionType">
|
|
|
+ <el-select
|
|
|
+ v-model="searchForm.suggestionType"
|
|
|
+ placeholder="反馈类型"
|
|
|
+ clearable
|
|
|
+ class="w100"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="(item, index) in suggestionList"
|
|
|
+ :key="index"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.value"
|
|
|
+ ></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="handleFlag">
|
|
|
+ <el-select
|
|
|
+ v-model="searchForm.handleFlag"
|
|
|
+ placeholder="处理状态"
|
|
|
+ clearable
|
|
|
+ class="w100"
|
|
|
+ >
|
|
|
+ <el-option label="已处理" :value="true"></el-option>
|
|
|
+ <el-option label="未处理" :value="false"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="feedbackFlag">
|
|
|
+ <el-select
|
|
|
+ v-model="searchForm.feedbackFlag"
|
|
|
+ placeholder="是否反馈用户"
|
|
|
+ clearable
|
|
|
+ class="w100"
|
|
|
+ >
|
|
|
+ <el-option label="是" :value="true"></el-option>
|
|
|
+ <el-option label="否" :value="false"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
<el-form-item prop="clientType">
|
|
|
<el-select
|
|
|
clearable
|
|
@@ -33,12 +118,12 @@
|
|
|
style="width: 400px"
|
|
|
type="daterange"
|
|
|
:picker-options="{
|
|
|
- firstDayOfWeek: 1,
|
|
|
+ firstDayOfWeek: 1
|
|
|
}"
|
|
|
value-format="yyyy-MM-dd"
|
|
|
range-separator="至"
|
|
|
- start-placeholder="开始日期"
|
|
|
- end-placeholder="结束日期"
|
|
|
+ start-placeholder="反馈开始时间"
|
|
|
+ end-placeholder="反馈结束日期"
|
|
|
></el-date-picker>
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
@@ -51,59 +136,98 @@
|
|
|
:data="dataList"
|
|
|
:header-cell-style="{ background: '#EDEEF0', color: '#444' }"
|
|
|
>
|
|
|
- <el-table-column align="center" label="反馈时间" prop="createTime">
|
|
|
- <template slot-scope="scope">
|
|
|
- {{ scope.row.createTime | dateForMinFormat }}
|
|
|
+ <!-- <el-table-column prop="content" label="建议类型" show-overflow-tooltip>
|
|
|
+ <template #default="scope">
|
|
|
+ <div>
|
|
|
+ {{ scope.row.type | suggestionType }}
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column> -->
|
|
|
+ <el-table-column prop="roleName" label="反馈时间">
|
|
|
+ <template #default="scope">
|
|
|
+ <div>
|
|
|
+ {{ scope.row.createTime | dateForMinFormat }}
|
|
|
+ </div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <!-- <el-table-column align="center" prop="name" label="标题"> -->
|
|
|
- <!-- </el-table-column> -->
|
|
|
- <el-table-column align="center" label="内容" prop="content">
|
|
|
+ <el-table-column
|
|
|
+ prop="suggestionTypeName"
|
|
|
+ label="反馈类型"
|
|
|
+ ></el-table-column>
|
|
|
+ <el-table-column prop="content" label="内容">
|
|
|
<template slot-scope="scope">
|
|
|
<tooltip :content="scope.row.content" />
|
|
|
- <!-- <el-popover placement="top-start"
|
|
|
- width="300"
|
|
|
- trigger="hover"
|
|
|
- :content="scope.row.content">
|
|
|
- <span slot="reference">{{ scope.row.content }}</span>
|
|
|
- </el-popover> -->
|
|
|
- <!-- <div :title="scope.row.content">{{ scope.row.content }}</div> -->
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column
|
|
|
- align="center"
|
|
|
- label="用户"
|
|
|
- prop="username"
|
|
|
- ></el-table-column>
|
|
|
- <el-table-column align="center" prop="mobileNo" label="邮箱或手机号">
|
|
|
+ <el-table-column prop="attachmentUrls" label="图片" width="100px">
|
|
|
+ <template #default="scope">
|
|
|
+ <div style="display: flex; align-items: center;">
|
|
|
+ <el-image
|
|
|
+ v-if="scope.row.url"
|
|
|
+ style="width: 60px; height: 60px; flex-shrink: 0"
|
|
|
+ fit="cover"
|
|
|
+ :src="scope.row.url.split(',')[0]"
|
|
|
+ :previewSrcList="scope.row.url.split(',')"
|
|
|
+ >
|
|
|
+ </el-image>
|
|
|
+ <span v-if="scope.row.url && scope.row.url.split(',').length > 1"
|
|
|
+ >+{{ scope.row.url.split(",").length - 1 }}</span
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column align="center" label="客户端" prop="clientType">
|
|
|
+ <el-table-column prop="username" label="用户"></el-table-column>
|
|
|
+ <el-table-column prop="mobileNo" label="手机号"></el-table-column>
|
|
|
+ <el-table-column prop="clientType" label="客户端">
|
|
|
<template slot-scope="scope">
|
|
|
<div>
|
|
|
{{ scope.row.clientType | clientTypeFilter }}
|
|
|
</div>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column align="center" prop="url" label="反馈图片">
|
|
|
+ <el-table-column prop="deviceNo" label="设备号">
|
|
|
<template slot-scope="scope">
|
|
|
- <el-image
|
|
|
- v-if="scope.row.url"
|
|
|
- style="width: 60px; height: 60px"
|
|
|
- fit="cover"
|
|
|
- :src="scope.row.url.split(',')[0]"
|
|
|
- :previewSrcList="scope.row.url.split(',')"
|
|
|
+ <tooltip :content="scope.row.deviceNo" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="处理状态">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ scope.row.operatorId ? "已处理" : "未处理" }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="operatorTime" label="处理时间"></el-table-column>
|
|
|
+ <el-table-column prop="operatorName" label="处理人"></el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ prop="feedbackFlag"
|
|
|
+ label="是否需要反馈用户"
|
|
|
+ show-overflow-tooltip
|
|
|
+ >
|
|
|
+ <template #default="scope">
|
|
|
+ {{
|
|
|
+ scope.row.operatorId
|
|
|
+ ? scope.row.feedbackFlag
|
|
|
+ ? "需处理"
|
|
|
+ : "不予处理"
|
|
|
+ : ""
|
|
|
+ }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="operatorMemo" label="备注">
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <tooltip :content="scope.row.operatorMemo" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" width="100" fixed="right">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-button
|
|
|
+ size="small"
|
|
|
+ type="text"
|
|
|
+ @click="onDetail(scope.row)"
|
|
|
+ v-permission="'sysSuggestion/dispose'"
|
|
|
+ >{{ scope.row.operatorId ? "处理详情" : "处理" }}</el-button
|
|
|
>
|
|
|
- </el-image>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <!-- <el-table-column align="center" prop="createTime" label="反馈时间">
|
|
|
- </el-table-column> -->
|
|
|
- <!-- <el-table-column align="center"
|
|
|
- label="操作">
|
|
|
- <template slot-scope="scope">
|
|
|
- <el-button type="text" v-permission="'/entryOperationLook'" @click="onChargeOperation('look', scope.row)">查看</el-button>
|
|
|
- </template>
|
|
|
- </el-table-column> -->
|
|
|
</el-table>
|
|
|
<pagination
|
|
|
sync
|
|
@@ -115,20 +239,35 @@
|
|
|
save-key="Suggestion"
|
|
|
/>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ <el-dialog
|
|
|
+ :title="'处理反馈' + (detail.actionType === 'look' ? '详情' : '')"
|
|
|
+ width="1000px"
|
|
|
+ :close-on-click-modal="false"
|
|
|
+ :visible.sync="visitVisiable"
|
|
|
+ v-if="visitVisiable"
|
|
|
+ >
|
|
|
+ <suggestionDetail
|
|
|
+ v-if="visitVisiable && detail"
|
|
|
+ :detail="detail"
|
|
|
+ @close="visitVisiable = false"
|
|
|
+ @submited="getList"
|
|
|
+ />
|
|
|
+ </el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script>
|
|
|
import pagination from "@/components/Pagination/index";
|
|
|
-import { sysSuggestionList } from "@/api/appTenant";
|
|
|
-import { clientList } from "@/utils/searchArray";
|
|
|
-import { getTimes } from "@/utils";
|
|
|
+import { sysSuggestionList, sysSuggestionTypePage } from "@/api/appTenant";
|
|
|
+import { clientList, suggestionTypeList } from "@/utils/searchArray";
|
|
|
+import { getTimeFormat } from "@/utils";
|
|
|
+import suggestionDetail from "./modals/suggestionDetail.vue";
|
|
|
import Tooltip from "@/components/Tooltip/index";
|
|
|
export default {
|
|
|
- components: { pagination, Tooltip },
|
|
|
+ components: { pagination, Tooltip, suggestionDetail },
|
|
|
name: "chargesList",
|
|
|
data() {
|
|
|
return {
|
|
|
+ suggestionTypeList,
|
|
|
clientList,
|
|
|
id: null,
|
|
|
dataList: [],
|
|
@@ -137,18 +276,28 @@ export default {
|
|
|
limit: 10, // 限制显示条数
|
|
|
page: 1, // 当前页
|
|
|
total: 0, // 总条数
|
|
|
- page_size: [10, 20, 40, 50], // 选择限制显示条数
|
|
|
+ page_size: [10, 20, 40, 50] // 选择限制显示条数
|
|
|
},
|
|
|
searchForm: {
|
|
|
+ search: "",
|
|
|
+ operatorSearch: "",
|
|
|
+ suggestionType: "",
|
|
|
+ handleFlag: "",
|
|
|
+ feedbackFlag: "",
|
|
|
timer: [],
|
|
|
- clientType:''
|
|
|
+ clientType: ""
|
|
|
},
|
|
|
+ visitVisiable: false,
|
|
|
+ detail: {},
|
|
|
+ suggestionList: []
|
|
|
};
|
|
|
},
|
|
|
activated() {
|
|
|
+ this.getSuggestionType();
|
|
|
this.getList();
|
|
|
},
|
|
|
mounted() {
|
|
|
+ this.getSuggestionType();
|
|
|
this.getList();
|
|
|
},
|
|
|
methods: {
|
|
@@ -157,17 +306,29 @@ export default {
|
|
|
let params = {
|
|
|
rows: this.pageInfo.limit,
|
|
|
page: this.pageInfo.page,
|
|
|
- type: "APP",
|
|
|
...rest,
|
|
|
- ...getTimes(timer, ["startTime", "endTime"]),
|
|
|
+ ...getTimeFormat(timer, ["startTime", "endTime"]),
|
|
|
+ type: "APP"
|
|
|
};
|
|
|
- sysSuggestionList(params).then((res) => {
|
|
|
+ sysSuggestionList(params).then(res => {
|
|
|
if (res.code == 200) {
|
|
|
this.dataList = res.data.rows;
|
|
|
this.pageInfo.total = res.data.total;
|
|
|
}
|
|
|
});
|
|
|
},
|
|
|
+ async getSuggestionType() {
|
|
|
+ try {
|
|
|
+ const { data } = await sysSuggestionTypePage({ page: 1, rows: 999 });
|
|
|
+ const temp = data.rows || [];
|
|
|
+ temp.forEach(item => {
|
|
|
+ this.suggestionList.push({
|
|
|
+ label: item.type,
|
|
|
+ value: item.id
|
|
|
+ });
|
|
|
+ });
|
|
|
+ } catch {}
|
|
|
+ },
|
|
|
onReSet() {
|
|
|
this.$refs["searchForm"].resetFields();
|
|
|
this.search();
|
|
@@ -176,11 +337,20 @@ export default {
|
|
|
this.pageInfo.page = 1;
|
|
|
this.getList();
|
|
|
},
|
|
|
- },
|
|
|
+ onDetail(row) {
|
|
|
+ const imgList = row.url ? row.url.split(",") : [];
|
|
|
+ const activeRow = {
|
|
|
+ ...row,
|
|
|
+ imgList,
|
|
|
+ actionType: row.operatorId ? "look" : "update"
|
|
|
+ };
|
|
|
+ this.detail = activeRow;
|
|
|
+ this.visitVisiable = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
};
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
-
|
|
|
::v-deep .el-table .cell {
|
|
|
display: -webkit-box;
|
|
|
overflow: hidden;
|