order-page.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <template>
  2. <ele-page flex-table>
  3. <!-- 搜索表单 -->
  4. <order-search @search="reload" />
  5. <ele-card :body-style="{ paddingTop: '8px' }" flex-table>
  6. <!-- 表格 -->
  7. <ele-pro-table ref="tableRef" row-key="orderId" :columns="columns" :datasource="datasource"
  8. :show-overflow-tooltip="true" v-model:selections="selections" highlight-current-row
  9. :export-config="{ fileName: pageConfig.fileName }" :cache-key="pageConfig.cacheKey">
  10. <template #toolbar>
  11. <slot name="toolbar"></slot>
  12. </template>
  13. <template #status="{ row }">
  14. <dict-data code="order_status" type="tag" :model-value="row.status" />
  15. </template>
  16. <template #orderNumber="{ row }">
  17. <order-number :row="row"></order-number>
  18. </template>
  19. <template #customer="{ row }">
  20. <order-customer :row="row"></order-customer>
  21. </template>
  22. <template #amount="{ row }">
  23. <order-amount :row="row"></order-amount>
  24. </template>
  25. <template #time="{ row }">
  26. <order-time :row="row"></order-time>
  27. </template>
  28. <template #sender="{ row }">
  29. <div class="common-text">
  30. <el-text>推送人:</el-text>
  31. <el-text>{{row.exceptOrderCheckInfo?.createName}}</el-text>
  32. </div>
  33. <div class="common-text">
  34. <el-text>推送时间:</el-text>
  35. <el-text>{{row.exceptOrderCheckInfo?.createTime||'-'}}</el-text>
  36. </div>
  37. </template>
  38. <template #dealer="{ row }">
  39. <div class="common-text">
  40. <el-text>处理人:</el-text>
  41. <el-text>{{row.exceptOrderCheckInfo?.checkName||'-'}}</el-text>
  42. </div>
  43. <div class="common-text">
  44. <el-text>处理时间:</el-text>
  45. <el-text>{{row.exceptOrderCheckInfo?.checkTime||'-'}}</el-text>
  46. </div>
  47. </template>
  48. <template #checkStatus="{ row }">
  49. <dict-data code="abnormal_check_status" type="tag" :model-value="row.exceptOrderCheckInfo?.checkStatus" />
  50. </template>
  51. <template #remarks="{ row }">
  52. <el-popover trigger="hover" width="240px" @show="handleShowPopover(row)" @hide="showOrderId = ''">
  53. <template #reference>
  54. <el-button :icon="Flag" link style="font-size: 20px" @click="handleRemarks(row)">
  55. </el-button>
  56. </template>
  57. <orderTimeline :orderId="showOrderId" title="备注历史记录"></orderTimeline>
  58. </el-popover>
  59. </template>
  60. <template #action="{ row }">
  61. <slot name="action" :row="row"></slot>
  62. </template>
  63. </ele-pro-table>
  64. </ele-card>
  65. <slot></slot>
  66. <orderRemarks ref="remarksRef" />
  67. </ele-page>
  68. </template>
  69. <script setup>
  70. import { ref, getCurrentInstance, computed } from 'vue';
  71. import { ElMessageBox } from 'element-plus/es';
  72. import { EleMessage } from 'ele-admin-plus/es';
  73. import { Flag, ChatDotSquare } from '@element-plus/icons-vue';
  74. import OrderSearch from './order-search.vue';
  75. import OrderNumber from '@/views/recycleOrder/components/order-number.vue';
  76. import OrderCustomer from '@/views/recycleOrder/components/order-customer.vue';
  77. import OrderAmount from '@/views/recycleOrder/components/order-amount.vue';
  78. import OrderTime from '@/views/recycleOrder/components/order-time.vue';
  79. import { useDictData } from '@/utils/use-dict-data';
  80. import { download, toFormData, checkDownloadRes } from '@/utils/common';
  81. import orderRemarks from '@/views/recycleOrder/components/order-remarks.vue';
  82. import orderTimeline from '@/views/recycleOrder/components/order-timeline.vue';
  83. let props = defineProps({
  84. pageConfig: {
  85. type: Object,
  86. default: () => ({
  87. cacheKey: 'abnormalSignTable',
  88. fileName: '异常订单查询'
  89. })
  90. },
  91. pageUrl: { type: String, default: '/order/orderInfo/exceptionOrderList' },
  92. exportUrl: { type: String, default: '/order/orderInfo/exceptionOrderExport' }
  93. });
  94. let { proxy } = getCurrentInstance();
  95. /** 字典数据 */
  96. const [statusDicts] = useDictData(['sys_normal_disable']);
  97. /** 表格实例 */
  98. const tableRef = ref(null);
  99. /** 表格列配置 */
  100. const baseColumns = [
  101. {
  102. type: 'selection',
  103. columnKey: 'selection',
  104. width: 50,
  105. align: 'center',
  106. fixed: 'left'
  107. },
  108. { label: '单号', prop: 'orderNumber', slot: 'orderNumber', minWidth: 240 },
  109. { label: '客户', prop: 'customer', slot: 'customer', minWidth: 360 },
  110. { label: '信息', prop: 'amount', slot: 'amount', minWidth: 160 },
  111. {
  112. label: '状态',
  113. prop: 'status',
  114. slot: 'status',
  115. minWidth: 140,
  116. formatter: (row) =>
  117. statusDicts.value.find((d) => d.dictValue == row.status)?.dictLabel
  118. },
  119. { label: '时间', prop: 'time', slot: 'time', minWidth: 220 },
  120. { label: '推送人', prop: 'createName', slot: 'sender', minWidth: 170 },
  121. { label: '处理备注', prop: 'remarks', slot: 'remarks' },
  122. {
  123. columnKey: 'action',
  124. label: '操作',
  125. width: 180,
  126. align: 'center',
  127. slot: 'action',
  128. fixed: 'right',
  129. }
  130. ];
  131. const historyColumns = [
  132. { label: '处理人', prop: 'checkName', slot: 'dealer', minWidth: 170 },
  133. {
  134. label: '处理结果',
  135. prop: 'checkStatus',
  136. slot: 'checkStatus',
  137. minWidth: 120
  138. }
  139. ];
  140. const columns = computed(() => {
  141. // Insert history columns before the action column if not in pending status
  142. if (props.pageConfig.pageUrl.includes('exceptionHistoryList')) {
  143. return [
  144. ...baseColumns.slice(0, -2),
  145. ...historyColumns,
  146. ...baseColumns.slice(-2)
  147. ];
  148. }
  149. return baseColumns;
  150. });
  151. /** 表格选中数据 */
  152. const selections = ref([]);
  153. /** 当前编辑数据 */
  154. const current = ref(null);
  155. /** 是否显示编辑弹窗 */
  156. const showEdit = ref(false);
  157. //备注弹窗显示
  158. const showOrderId = ref();
  159. function handleShowPopover(row) {
  160. showOrderId.value = row.orderId;
  161. }
  162. async function queryPage(params) {
  163. const res = await proxy.$http.get(props.pageConfig.pageUrl, { params });
  164. if (res.data.code === 200) {
  165. return res.data;
  166. }
  167. return Promise.reject(new Error(res.data.msg));
  168. }
  169. /** 表格数据源 */
  170. const datasource = ({ pages, where, orders }) => {
  171. return queryPage({ ...where, ...orders, ...pages });
  172. };
  173. /** 搜索 */
  174. const reload = (where) => {
  175. tableRef.value?.reload?.({ page: 1, where });
  176. };
  177. /** 批量操作 */
  178. const operatBatch = ({ row, url, title }) => {
  179. const rows = row == null ? selections.value : [row];
  180. if (!rows.length) {
  181. EleMessage.error('请至少选择一条数据');
  182. return;
  183. }
  184. title = title || '是否确认当前操作?';
  185. ElMessageBox.confirm(title, '提示', {
  186. type: 'warning',
  187. draggable: true
  188. })
  189. .then(() => {
  190. const loading = EleMessage.loading({
  191. message: '请求中..',
  192. plain: true
  193. });
  194. proxy.$http
  195. .delete(url)
  196. .then(() => {
  197. loading.close();
  198. EleMessage.success('操作成功');
  199. reload();
  200. })
  201. .catch((e) => {
  202. loading.close();
  203. EleMessage.error(e.message);
  204. });
  205. })
  206. .catch(() => { });
  207. };
  208. /// 导出数据
  209. async function exportPage(params, name) {
  210. const res = await proxy.$http({
  211. url: props.exportUrl,
  212. method: 'POST',
  213. data: toFormData(params),
  214. responseType: 'blob'
  215. });
  216. await checkDownloadRes(res);
  217. download(
  218. res.data,
  219. name ? `${name}_${Date.now()}.xlsx` : `post_${Date.now()}.xlsx`
  220. );
  221. }
  222. /** 导出数据 */
  223. const exportData = (name) => {
  224. const loading = EleMessage.loading({
  225. message: '请求中..',
  226. plain: true
  227. });
  228. tableRef.value?.fetch?.(({ where, orders }) => {
  229. exportPage({ ...where, ...orders }, name)
  230. .then(() => {
  231. loading.close();
  232. })
  233. .catch((e) => {
  234. loading.close();
  235. EleMessage.error(e.message);
  236. });
  237. });
  238. };
  239. //修改备注
  240. const remarksRef = ref(null);
  241. function handleRemarks(row) {
  242. remarksRef.value?.handleOpen(row);
  243. }
  244. defineExpose({ reload, exportData, operatBatch });
  245. </script>