Procházet zdrojové kódy

添加意见反馈

lex před 1 rokem
rodič
revize
0ea137a51e

+ 109 - 70
src/api/appTenant.js

@@ -1,187 +1,226 @@
-import request from '@/utils/request'
-import request2 from '@/utils/request2'
-import qs from 'qs'
-let api = '/api-web'
+import request from "@/utils/request";
+import request2 from "@/utils/request2";
+import qs from "qs";
+let api = "/api-web";
 // 分页查询活动列表
 export function getEntryActivities(data) {
   return request({
-    url: api + '/tenantEntryActivities/queryPage',
-    method: 'get',
+    url: api + "/tenantEntryActivities/queryPage",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 新增、修改活动
 export function getActivitieMerge(data) {
   return request({
-    url: api + '/tenantEntryActivities/merge',
-    method: 'post',
+    url: api + "/tenantEntryActivities/merge",
+    method: "post",
     data: data
-  })
+  });
 }
 
 // 启用,停止
 export function getActivitieUpdateDelFlag(data) {
   return request({
-    url: api + '/tenantEntryActivities/updateDelFlag',
-    method: 'post',
+    url: api + "/tenantEntryActivities/updateDelFlag",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 查询单条活动
 export function getActivitieQuery(data) {
   return request({
-    url: api + '/tenantEntryActivities/query',
-    method: 'get',
+    url: api + "/tenantEntryActivities/query",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 帮助中心分类列表
 export function helpCenterCatalogList(data) {
   return request({
-    url: '/api-cms/helpCenterCatalog/list',
-    method: 'get',
+    url: "/api-cms/helpCenterCatalog/list",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 帮助中心分类列表 添加或修改
 export function helpCenterCatalogModify(data) {
   return request({
-    url: '/api-cms/helpCenterCatalog/modify',
-    method: 'post',
+    url: "/api-cms/helpCenterCatalog/modify",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 帮助中心分类列表 删除
 export function helpCenterCatalogDelete(data) {
   return request({
-    url: '/api-cms/helpCenterCatalog/delete',
-    method: 'post',
+    url: "/api-cms/helpCenterCatalog/delete",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 帮助中心内容列表
 export function helpCenterContentList(data) {
   return request({
-    url: '/api-cms/helpCenterContent/list',
-    method: 'get',
+    url: "/api-cms/helpCenterContent/list",
+    method: "get",
     params: data
-  })
+  });
 }
 
 // 帮助中心内容 添加或修改
 export function helpCenterContentModify(data) {
   return request({
-    url: '/api-cms/helpCenterContent/modify',
-    method: 'post',
+    url: "/api-cms/helpCenterContent/modify",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
 // 帮助中心内容 删除
 export function helpCenterContentDelete(data) {
   return request({
-    url: '/api-cms/helpCenterContent/delete',
-    method: 'post',
+    url: "/api-cms/helpCenterContent/delete",
+    method: "post",
     data: qs.stringify(data)
-  })
+  });
 }
 
-
 // 意见反馈管理
 export function sysSuggestionList(data) {
   return request({
-    url: '/api-web/sysSuggestion/queryPage',
-    method: 'get',
+    url: "/api-web/sysSuggestion/queryPage",
+    method: "post",
+    data
+  });
+}
+
+// 意见反馈管理类型
+export function sysSuggestionTypePage(data) {
+  return request({
+    url: "/api-web/sysSuggestionType/queryPage",
+    method: "post",
+    data
+  });
+}
+
+// 意见反馈管理删除
+export function sysSuggestionTypeDel(data) {
+  return request({
+    url: "/api-web/sysSuggestionType/del",
+    method: "get",
     params: data
-  })
+  });
+}
+
+// 意见反馈管理添加
+export function sysSuggestionTypeAdd(data) {
+  return request({
+    url: "/api-web/sysSuggestionType/add",
+    method: "post",
+    data
+  });
+}
+// 意见反馈管理 处理意见反馈
+export function sysSuggestionDispose(data) {
+  return request({
+    url: "/api-web/sysSuggestion/dispose",
+    method: "post",
+    data
+  });
+}
+
+// 意见反馈管理修改
+export function sysSuggestionTypeUpdate(data) {
+  return request({
+    url: "/api-web/sysSuggestionType/update",
+    method: "post",
+    data
+  });
 }
 
 // 人力资源列表
 export function employeeInfo(data) {
   return request({
-    method: 'get',
-    url: '/api-web/employeeInfo/queryPage',
+    method: "get",
+    url: "/api-web/employeeInfo/queryPage",
     params: data
-  })
+  });
 }
 
 // 人力资源添加
 export function employeeCreate(data) {
   return request({
-    method: 'post',
-    url: '/api-web/employeeInfo/insert',
+    method: "post",
+    url: "/api-web/employeeInfo/insert",
     data
-  })
+  });
 }
 
 // 人力资源修改
 export function employeeUpdate(data) {
   return request({
-    method: 'post',
-    url: '/api-web/employeeInfo/update',
+    method: "post",
+    url: "/api-web/employeeInfo/update",
     data
-  })
+  });
 }
 
 // 新增回访记录
 export function insertVisit(data) {
   return request({
-    method: 'post',
-    url: '/api-web/employeeInfo/insertVisit',
+    method: "post",
+    url: "/api-web/employeeInfo/insertVisit",
     data
-  })
+  });
 }
 
 // 回访记录
 export function employeeQueryDetail(data) {
   return request({
-    method: 'get',
-    url: '/api-web/employeeInfo/queryDetail',
+    method: "get",
+    url: "/api-web/employeeInfo/queryDetail",
     params: data
-  })
+  });
 }
 
 export function queryEmployeeByRole(data) {
   return request({
-    method: 'get',
-    url: '/api-web/employee/queryEmployeeByRole',
+    method: "get",
+    url: "/api-web/employee/queryEmployeeByRole",
     params: data
-  })
+  });
 }
 
 // 上传图片
 export function uploadFile(data) {
   return request({
-    method: 'post',
-    url: '/api-web/uploadFile',
+    method: "post",
+    url: "/api-web/uploadFile",
     data
-  })
+  });
 }
 
-
 // 上传图片 base64
 export function uploadFileWithBase64(data) {
   return request({
-    method: 'post',
-    url: '/api-web/uploadFileWithBase64',
+    method: "post",
+    url: "/api-web/uploadFileWithBase64",
     data
-  })
+  });
 }
 
-
 // 获取上传信息
 export function policy(data) {
   return request2({
-    method: 'post',
-    url: '/api-web/getUploadSign',
-    data,
-  })
+    method: "post",
+    url: "/api-web/getUploadSign",
+    data
+  });
 }
-
-

+ 6 - 0
src/constant/index.js

@@ -626,3 +626,9 @@ export const courseEmnu = {
   TUBA_SINGLE: "大号"
   // TEST_CLARINET: '测试竖笛'
 };
+
+// 平台建议
+export const suggestionType = {
+  APP: "软件反馈",
+  SMART_PRACTICE: "智能陪练"
+};

+ 1 - 1
src/router/index.js

@@ -350,7 +350,7 @@ export const asyncRoutes = {
   // 添加或修改
   entryOperation: () => import("@/views/app/entryOperation"),
   // 意见反馈
-  suggestion: () => import("@/views/app/suggestion"),
+  suggestion: () => import("@/views/app/suggestionIndex"),
   // 云教练意见反馈
   clouldSuggestion: () => import("@/views/app/clouldSuggestion"),
   // 帮助分类

+ 3 - 1
src/utils/searchArray.js

@@ -33,7 +33,8 @@ import {
   problemType,
   schoolUserType,
   shareLiveType,
-  courseEmnu
+  courseEmnu,
+  suggestionType
 } from "../constant";
 // 课程类型
 let tenantConfig = sessionStorage.getItem("tenantConfig");
@@ -910,6 +911,7 @@ export const problemTypeList = getValueForKey(problemType);
 export const schoolUserTypeList = getValueForKey(schoolUserType);
 export const shareLiveTypeList = getValueForKey(shareLiveType);
 export const courseEmnuList = getValueForKey(courseEmnu);
+export const suggestionTypeList = getValueForKey(suggestionType);
 //downListType
 function getValueForKey(obj) {
   let arr = [];

+ 3 - 0
src/utils/vueFilter.js

@@ -953,3 +953,6 @@ Vue.filter("joinCourseType", value => {
 Vue.filter("courseEmnu", value => {
   return constant.courseEmnu[value];
 });
+Vue.filter("suggestionType", value => {
+  return constant.suggestionType[value];
+});

+ 90 - 0
src/views/app/modals/addType.vue

@@ -0,0 +1,90 @@
+<template>
+  <div>
+    <el-form
+      :model="visitForm"
+      label-width="100px"
+      label-position="right"
+      ref="visitForm"
+    >
+      <el-form-item
+        label="反馈类型"
+        prop="type"
+        :rules="[{ required: true, message: '请输入反馈类型' }]"
+      >
+        <el-input
+          v-model="visitForm.type"
+          style="width: 100% !important"
+          placeholder="请输入反馈类型"
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer" style="text-align: right;">
+      <el-button @click="$emit('close')">取 消</el-button>
+      <el-button type="primary" @click="submitAddVisit">确 定</el-button>
+    </div>
+  </div>
+</template>
+<script>
+import cleanDeep from "clean-deep";
+import {
+  visitChiose,
+  visitChiose1,
+  feedbackTypeList,
+  feedbackTypeDescList
+} from "@/utils/searchArray";
+
+import { sysSuggestionTypeAdd, sysSuggestionTypeUpdate } from "@/api/appTenant";
+export default {
+  // useVisitType 自定义回访类型
+  props: ["detail"],
+  data() {
+    return {
+      visitForm: {
+        id: "",
+        type: ""
+      }
+    };
+  },
+  mounted() {
+    if (this.detail.id) {
+      console.log(this.detail);
+      this.visitForm.type = this.detail.type;
+      this.visitForm.id = this.detail.id;
+    }
+  },
+  methods: {
+    submitAddVisit() {
+      this.$refs.visitForm.validate(res => {
+        if (res) {
+          if (this.visitForm.id) {
+            console.log("update");
+            sysSuggestionTypeUpdate(this.visitForm).then(res => {
+              if (res.code === 200) {
+                this.$message.success("修改成功");
+                this.$emit("close");
+                this.$emit("submited");
+              }
+            });
+          } else {
+            sysSuggestionTypeAdd(cleanDeep(this.visitForm)).then(res => {
+              if (res.code === 200) {
+                this.$message.success("添加成功");
+                this.$emit("close");
+                this.$emit("submited");
+              }
+            });
+          }
+        }
+      });
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.visitBtnWrap {
+  position: absolute;
+  right: 90px;
+  top: 82px;
+  z-index: 20;
+}
+</style>

+ 193 - 0
src/views/app/modals/suggestionDetail.vue

@@ -0,0 +1,193 @@
+<template>
+  <div>
+    <el-form
+      :model="forms"
+      label-width="100px"
+      label-position="right"
+      ref="visitForm"
+    >
+      <el-row :gutter="15">
+        <!-- <el-col :span="5">
+          <el-form-item label="建议类型"
+            >{{ detail.type | suggestionType }}
+          </el-form-item>
+        </el-col> -->
+        <el-col :span="6">
+          <el-form-item label="客户端"
+            >{{ detail.clientType | clientTypeFilter }}
+          </el-form-item>
+        </el-col>
+        <el-col :span="5">
+          <el-form-item label="反馈类型"
+            >{{ detail.suggestionTypeName }}
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="反馈时间">{{ detail.createTime }} </el-form-item>
+        </el-col>
+        <el-col :span="5">
+          <el-form-item label="用户">{{ detail.username }} </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="手机号">{{ detail.mobileNo }} </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="设备号">{{ detail.userAgent }} </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="反馈内容">{{ detail.content }} </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-form-item label="图片">
+            <span v-if="detail.imgList.length > 0">
+              <el-image
+                v-for="(item, index) in detail.imgList"
+                :key="index"
+                :src="item"
+                :preview-src-list="detail.imgList"
+                :initial-index="index"
+                style="width: 100px; height: 100px; margin-right: 12px;"
+                fit="cover"
+              />
+            </span>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item
+            label="处理"
+            prop="handleFlag"
+            :rules="[
+              {
+                required: true,
+                message: '请选择是否需要处理',
+                trigger: 'blur'
+              }
+            ]"
+          >
+            <el-radio-group
+              v-model="forms.handleFlag"
+              :disabled="actionType == 'look'"
+            >
+              <el-radio :label="true">需处理</el-radio>
+              <el-radio :label="false">不予处理</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item
+            label="反馈用户"
+            prop="feedbackFlag"
+            :rules="[
+              {
+                required: true,
+                message: '请选择是否需要反馈用户',
+                trigger: 'blur'
+              }
+            ]"
+          >
+            <el-radio-group
+              v-model="forms.feedbackFlag"
+              :disabled="actionType == 'look'"
+            >
+              <el-radio :label="true">是</el-radio>
+              <el-radio :label="false">否</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24" class="mb10">
+          <el-form-item
+            label="备注"
+            prop="operatorMemo"
+            :rules="[
+              {
+                required: true,
+                message: '请输入备注',
+                trigger: 'blur'
+              }
+            ]"
+          >
+            <el-input
+              :disabled="actionType == 'look'"
+              v-model="forms.operatorMemo"
+              placeholder="请输入备注"
+              style="width: 100%"
+              type="textarea"
+              maxlength="200"
+              rows="3"
+              show-word-limit
+            ></el-input>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <div
+      slot="footer"
+      class="dialog-footer"
+      style="text-align: right;"
+      v-if="actionType === 'update'"
+    >
+      <el-button @click="$emit('close')">取 消</el-button>
+      <el-button type="primary" @click="submitAddVisit">确 定</el-button>
+    </div>
+  </div>
+</template>
+<script>
+import cleanDeep from "clean-deep";
+import { clientList, suggestionTypeList } from "@/utils/searchArray";
+import { sysSuggestionDispose } from "@/api/appTenant";
+export default {
+  // useVisitType 自定义回访类型
+  props: ["detail"],
+  data() {
+    return {
+      clientList,
+      suggestionTypeList,
+      actionType: "update",
+      forms: {
+        id: "",
+        handleFlag: true,
+        feedbackFlag: true,
+        operatorMemo:
+          "感谢你对音乐数字课堂的关注与支持,我们会认真处理您的反馈,尽快修复和完善相关功能!"
+      }
+    };
+  },
+  mounted() {
+    if (this.detail.id) {
+      this.actionType = this.detail.actionType;
+      if (this.detail.operatorId) {
+        this.forms.handleFlag = this.detail.handleFlag;
+        this.forms.feedbackFlag = this.detail.feedbackFlag;
+        this.forms.operatorMemo =
+          this.detail.operatorMemo ||
+          "感谢你对音乐数字课堂的关注与支持,我们会认真处理您的反馈,尽快修复和完善相关功能!";
+      }
+
+      this.forms.id = this.detail.id;
+    }
+  },
+  methods: {
+    submitAddVisit() {
+      this.$refs.visitForm.validate(res => {
+        if (res) {
+          sysSuggestionDispose(this.forms).then(res => {
+            if (res.code === 200) {
+              this.$message.success("处理成功");
+              this.$emit("close");
+              this.$emit("submited");
+            }
+          });
+        }
+      });
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.visitBtnWrap {
+  position: absolute;
+  right: 90px;
+  top: 82px;
+  z-index: 20;
+}
+</style>

+ 226 - 56
src/views/app/suggestion.vue

@@ -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;

+ 25 - 10
src/views/app/suggestionIndex.vue

@@ -10,12 +10,26 @@
         type="card"
         @tab-click="handleClick"
       >
-        <el-tab-pane label="APP反馈" lazy name="1" v-if="permissionList.suggestion">
+        <el-tab-pane
+          label="意见反馈"
+          lazy
+          name="1"
+          v-if="permissionList.suggestion"
+        >
           <suggestion v-if="activeIndex === '1'" />
         </el-tab-pane>
-        <el-tab-pane label="云教练反馈" lazy name="2" v-if="permissionList.clouldSuggestion">
-          <clouldSuggestion v-if="activeIndex === '2'"  />
+        <el-tab-pane label="反馈类型配置" lazy name="2">
+          <!-- v-if="permissionList.suggestionType" -->
+          <suggestionType v-if="activeIndex === '2'" />
         </el-tab-pane>
+        <!-- <el-tab-pane
+          label="云教练反馈"
+          lazy
+          name="3"
+          v-if="permissionList.clouldSuggestion"
+        >
+          <clouldSuggestion v-if="activeIndex === '3'" />
+        </el-tab-pane> -->
       </tab-router>
     </div>
   </div>
@@ -23,17 +37,19 @@
 <script>
 import suggestion from "./suggestion";
 import clouldSuggestion from "./clouldSuggestion";
+import suggestionType from "./suggestionType";
 import { permission } from "@/utils/directivePage";
 // /suggestion /clouldSuggestion
 export default {
-  components: { suggestion, clouldSuggestion },
+  components: { suggestion, clouldSuggestion, suggestionType },
   data() {
     return {
       activeIndex: "1",
       permissionList: {
         suggestion: permission("/suggestion"),
-        clouldSuggestion: permission("/clouldSuggestion"),
-      },
+        suggestionType: permission("/suggestionType"),
+        clouldSuggestion: permission("/clouldSuggestion")
+      }
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
@@ -43,9 +59,8 @@ export default {
   methods: {
     handleClick(evt) {
       // this.changeHash(evt.name);
-    },
-  },
+    }
+  }
 };
 </script>
-<style lang="scss" scoped>
-</style>
+<style lang="scss" scoped></style>

+ 177 - 0
src/views/app/suggestionType.vue

@@ -0,0 +1,177 @@
+<template>
+  <div class="m-container">
+    <!-- <h2>
+      <div class="squrt"></div>
+      意见反馈
+    </h2> -->
+
+    <div class="tableWrap">
+      <el-button
+        type="primary"
+        v-permission="'sysSuggestionType/add'"
+        style="margin-bottom: 10px;"
+        @click="onOpentType()"
+        >添加</el-button
+      >
+      <el-table
+        :data="dataList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      >
+        <el-table-column
+          prop="type"
+          label="反馈类型"
+          show-overflow-tooltip
+        ></el-table-column>
+        <el-table-column
+          prop="operatorName"
+          label="操作人"
+          show-overflow-tooltip
+        ></el-table-column>
+        <el-table-column
+          prop="updateTime"
+          label="操作时间"
+          show-overflow-tooltip
+        ></el-table-column>
+        <el-table-column label="操作" width="100">
+          <template #default="scope">
+            <el-button
+              size="small"
+              v-permission="'sysSuggestionType/update'"
+              type="text"
+              @click="onOpentType(scope.row)"
+              >修改</el-button
+            >
+            <el-button
+              :disabled="scope.row.isEnable"
+              size="small"
+              type="text"
+              v-permission="'sysSuggestionType/del'"
+              @click="onDel(scope.row)"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        sync
+        :total.sync="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+        save-key="Suggestion"
+      />
+    </div>
+
+    <el-dialog
+      :title="actionType === 'add' ? '新增反馈类型' : '修改反馈类型'"
+      width="500px"
+      :close-on-click-modal="false"
+      :visible.sync="visitVisiable"
+      v-if="visitVisiable"
+    >
+      <addType
+        v-if="visitVisiable && detail"
+        :detail="detail"
+        @close="visitVisiable = false"
+        @submited="getList"
+      />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import { sysSuggestionTypePage, sysSuggestionTypeDel } from "@/api/appTenant";
+import { clientList } from "@/utils/searchArray";
+import { getTimes } from "@/utils";
+import addType from "./modals/addType.vue";
+import Tooltip from "@/components/Tooltip/index";
+export default {
+  components: { pagination, Tooltip, addType },
+  name: "chargesList",
+  data() {
+    return {
+      clientList,
+      id: null,
+      dataList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      visitVisiable: false,
+      actionType: "add",
+      detail: {}
+    };
+  },
+  mounted() {
+    this.getList();
+  },
+  methods: {
+    getList() {
+      let params = {
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page
+      };
+      sysSuggestionTypePage(params).then(res => {
+        if (res.code == 200) {
+          this.dataList = res.data.rows;
+          this.pageInfo.total = res.data.total;
+        }
+      });
+    },
+    onOpentType(row) {
+      if (row) {
+        this.actionType = "update";
+        this.detail = row;
+      } else {
+        this.acgtionType = "add";
+        this.detail = {};
+      }
+      this.visitVisiable = true;
+    },
+    onDel(row) {
+      this.$confirm(`是否删除反馈类型${row.type}?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(async () => {
+        await sysSuggestionTypeDel({
+          id: row.id
+        });
+        this.$message.success("删除成功");
+        this.getList();
+      });
+    },
+    onReSet() {
+      this.$refs["searchForm"].resetFields();
+      this.search();
+    },
+    search() {
+      this.pageInfo.page = 1;
+      this.getList();
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-table .cell {
+  display: -webkit-box;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 3;
+  -webkit-box-orient: vertical;
+}
+::v-deep .el-date-editor.el-input {
+  width: 100% !important;
+}
+::v-deep .el-select {
+  width: 98% !important;
+}
+
+::v-deep .el-table {
+  display: inline-block;
+}
+</style>