index.vue 13 KB

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