index.vue 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  1. <template>
  2. <div class="ele-body">
  3. <el-card shadow="never" v-loading="loading">
  4. <search :levelList="levelList" @search="reload"></search>
  5. <!-- 数据表格 -->
  6. <ele-pro-table
  7. ref="table"
  8. :columns="columns"
  9. :datasource="datasource"
  10. cache-key="systemRoleTable"
  11. :pageSize="20"
  12. >
  13. <!-- 表头工具栏 -->
  14. <template v-slot:toolbar>
  15. <el-button
  16. size="small"
  17. type="primary"
  18. icon="el-icon-plus"
  19. class="ele-btn-icon"
  20. @click="openEdit('', 'add')"
  21. >新建</el-button>
  22. </template>
  23. <template v-slot:code="{ row }">
  24. <el-link type="primary" :underline="false" @click="openEdit(row, 'view')">{{ row.code }}</el-link>
  25. </template>
  26. <!-- 操作列 -->
  27. <template v-slot:action="{ row }">
  28. <el-link
  29. type="primary"
  30. :underline="false"
  31. @click="openEdit(row, 'edit')"
  32. v-if="row.demandStatus != 1"
  33. >修改</el-link>
  34. <el-popconfirm
  35. v-if="row.demandStatus != 1"
  36. class="ele-action"
  37. title="确定要删除此售后需求吗?"
  38. @confirm="handleRemove(row)"
  39. >
  40. <template v-slot:reference>
  41. <el-link type="danger" :underline="false" icon="el-icon-delete">删除</el-link>
  42. </template>
  43. </el-popconfirm>
  44. <el-dropdown
  45. @command="(command) => handleCommand(command, row)"
  46. v-if="row.demandStatus == 0"
  47. >
  48. <span class="el-dropdown-link">
  49. 操作菜单
  50. <i class="el-icon-arrow-down el-icon--right"></i>
  51. </span>
  52. <el-dropdown-menu slot="dropdown">
  53. <el-dropdown-item command="handleRevoke">撤回</el-dropdown-item>
  54. <el-dropdown-item command="handleAudit">提交</el-dropdown-item>
  55. </el-dropdown-menu>
  56. </el-dropdown>
  57. </template>
  58. </ele-pro-table>
  59. </el-card>
  60. <!-- 新建或编辑弹窗 -->
  61. <AddDialog ref="addDialogRef" :dialogTitle="addDialogTitle" @refresh="reload" />
  62. <!-- 审核弹窗 -->
  63. <ele-modal
  64. :centered="true"
  65. :visible.sync="auditDialog"
  66. title="审核"
  67. :close-on-click-modal="false"
  68. width="25%"
  69. append-to-body
  70. @close="handleClose"
  71. >
  72. <el-form ref="form" :model="formData">
  73. <el-form-item
  74. prop="approvalResult"
  75. label="审核结果"
  76. :rules="{
  77. required: true,
  78. message: '请选择',
  79. trigger: 'change'
  80. }"
  81. >
  82. <el-select
  83. v-model="formData.approvalResult"
  84. placeholder="请选择"
  85. style="width: 100%"
  86. clearable
  87. >
  88. <el-option
  89. v-for="item in approvalResultOptions"
  90. :key="item.value"
  91. :label="item.label"
  92. :value="item.value"
  93. ></el-option>
  94. </el-select>
  95. </el-form-item>
  96. <el-form-item
  97. prop="rejectCause"
  98. label="审核意见"
  99. :rules="{
  100. required: formData.approvalResult == 0,
  101. message: '请输入',
  102. trigger: 'change'
  103. }"
  104. >
  105. <el-input v-model="formData.rejectCause" placeholder="请输入" type="textarea"></el-input>
  106. </el-form-item>
  107. </el-form>
  108. <div slot="footer" class="footer">
  109. <el-button type="primary" @click="handleSubmit">确认</el-button>
  110. <el-button @click="handleClose">取消</el-button>
  111. </div>
  112. </ele-modal>
  113. </div>
  114. </template>
  115. <script>
  116. import {
  117. getPageSalesDemand,
  118. deleteSalesDemand,
  119. auditSalesDemand,
  120. revokeSalesDemand
  121. } from '@/api/salesServiceManagement/index.js';
  122. import search from './components/searchTable.vue';
  123. import AddDialog from './components/addDialog.vue';
  124. import { getByCode } from '@/api/system/dictionary-data';
  125. import dictMixins from '@/mixins/dictMixins';
  126. export default {
  127. mixins: [dictMixins],
  128. components: {
  129. search,
  130. AddDialog
  131. },
  132. data() {
  133. return {
  134. // 表格列配置
  135. columns: [
  136. {
  137. columnKey: 'index',
  138. label: '序号',
  139. type: 'index',
  140. width: 55,
  141. align: 'center',
  142. showOverflowTooltip: true,
  143. fixed: 'left'
  144. },
  145. {
  146. slot: 'code',
  147. prop: 'code',
  148. label: '编码',
  149. align: 'center',
  150. showOverflowTooltip: true,
  151. minWidth: 110
  152. },
  153. {
  154. prop: 'contactCode',
  155. label: '客户编码',
  156. align: 'center',
  157. showOverflowTooltip: true
  158. },
  159. {
  160. prop: 'contactName',
  161. label: '客户名称',
  162. align: 'center',
  163. showOverflowTooltip: true
  164. },
  165. {
  166. slot: 'faultLevel',
  167. prop: 'faultLevel',
  168. label: '故障等级',
  169. align: 'center',
  170. showOverflowTooltip: true,
  171. formatter: (row) => {
  172. return this.levelData[row.faultLevel];
  173. }
  174. },
  175. {
  176. prop: 'createUserName',
  177. label: '创建人',
  178. align: 'center',
  179. showOverflowTooltip: true
  180. },
  181. {
  182. prop: 'createTime',
  183. label: '创建时间',
  184. align: 'center',
  185. showOverflowTooltip: true,
  186. formatter: (_row, _column, cellValue) => {
  187. return this.$util.toDateString(cellValue);
  188. }
  189. },
  190. {
  191. prop: 'approvalUserName',
  192. label: '审核人',
  193. align: 'center',
  194. showOverflowTooltip: true
  195. },
  196. {
  197. prop: 'approvalTime',
  198. label: '审核时间',
  199. align: 'center',
  200. showOverflowTooltip: true,
  201. formatter: (_row, _column, cellValue) => {
  202. return this.$util.toDateString(cellValue);
  203. }
  204. },
  205. {
  206. prop: 'demandStatus',
  207. label: '状态',
  208. align: 'center',
  209. showOverflowTooltip: true,
  210. formatter: (_row, _column, cellValue) => {
  211. return cellValue == 0
  212. ? '待审核'
  213. : cellValue == 2
  214. ? '已拒绝'
  215. : cellValue == 1
  216. ? '已通过'
  217. : cellValue == 3
  218. ? '已撤回'
  219. : '';
  220. }
  221. },
  222. {
  223. columnKey: 'action',
  224. slot: 'action',
  225. label: '操作',
  226. align: 'center',
  227. width: 230,
  228. resizable: false,
  229. showOverflowTooltip: true
  230. }
  231. ],
  232. // 加载状态
  233. loading: false,
  234. infoData: {},
  235. repairInfoLogs: [],
  236. addDialogTitle: '新建售后需求',
  237. auditDialog: false,
  238. rowData: {},
  239. formData: {
  240. approvalResult: null,
  241. rejectCause: '',
  242. approvalUserId: '',
  243. approvalUserName: ''
  244. },
  245. approvalResultOptions: [
  246. { label: '驳回', value: 0 },
  247. { label: '同意', value: 1 }
  248. ],
  249. levelData: {},
  250. levelList: [],
  251. };
  252. },
  253. computed: {},
  254. created() {
  255. this.requestDict('报修来源');
  256. this.requestDict('报修状态');
  257. this.getLevelCode('fault_level');
  258. },
  259. methods: {
  260. /* 表格数据源 */
  261. datasource({ page, limit, where, order }) {
  262. return getPageSalesDemand({ pageNum: page, size: limit, ...where });
  263. },
  264. async changeEnable(row) {
  265. const res = await putRoles(row);
  266. if (res.code == 0) {
  267. this.$message({
  268. type: 'success',
  269. message: '修改成功',
  270. customClass: 'ele-message-border'
  271. });
  272. this.reload();
  273. }
  274. },
  275. //查询问题等级字典
  276. async getLevelCode(code) {
  277. const res = await getByCode(code);
  278. if (res?.code === '0') {
  279. let obj = {};
  280. let arr = [];
  281. res.data.map((el) => {
  282. arr.push({ label: Object.values(el)[0], value: Object.keys(el)[0] });
  283. obj = { ...obj, ...el };
  284. });
  285. this.levelList = arr;
  286. this.levelData = obj;
  287. }
  288. },
  289. /* 刷新表格 */
  290. reload(where) {
  291. this.$refs.table.reload({ page: 1, where });
  292. },
  293. openEdit(row, type) {
  294. this.$refs.addDialogRef.init(row, type);
  295. },
  296. handleRemove(row) {
  297. deleteSalesDemand([row.id]).then((res) => {
  298. this.$message.success('删除成功!');
  299. this.reload();
  300. });
  301. },
  302. async handleAudit(row) {
  303. this.auditDialog = true;
  304. this.rowData = row;
  305. },
  306. handleClose() {
  307. this.auditDialog = false;
  308. },
  309. async handleSubmit() {
  310. this.$refs.form.validate(async (valid) => {
  311. if (valid) {
  312. const data = this.$store.state.user.info;
  313. let pdata = {
  314. id: this.rowData.id,
  315. approvalResult: this.formData.approvalResult,
  316. rejectCause: this.formData.rejectCause,
  317. approvalUserId: data.userId,
  318. approvalUserName: data.name
  319. };
  320. const res = await auditSalesDemand(pdata);
  321. if (res) {
  322. this.$message.success('审核成功!');
  323. this.auditDialog = false;
  324. this.reload();
  325. }
  326. }
  327. });
  328. },
  329. async handleRevoke(row) {
  330. const res = await revokeSalesDemand({ id: row.id });
  331. if (!res) return;
  332. this.$message.success('撤回成功!');
  333. this.reload();
  334. },
  335. handleCommand(command, row) {
  336. if (command === 'handleRevoke') {
  337. this.handleRevoke(row);
  338. }
  339. if (command === 'handleAudit') {
  340. this.handleAudit(row);
  341. }
  342. }
  343. }
  344. };
  345. </script>
  346. <style lang="scss" scoped>
  347. .el-dropdown-link {
  348. cursor: pointer;
  349. color: var(--color-primary-5);
  350. }
  351. .el-icon-arrow-down {
  352. font-size: 12px;
  353. }
  354. </style>