index.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. <script setup lang="tsx">
  2. import { nextTick, ref, watch } from 'vue';
  3. import { useRouter } from 'vue-router';
  4. import { NTag } from 'naive-ui';
  5. import { fetchAudit, fetchGetOrderList, fetchGetStatusNum } from '@/service/api/djk-manage/normal-order';
  6. // import { fetchGetLoginUserList } from '@/service/api/common';
  7. // import { useAuth } from '@/hooks/business/auth';
  8. // import { copyTextToClipboard } from '@/utils/zt';
  9. import { useTable } from '@/components/zt/Table/hooks/useTable';
  10. // import { type } from '../../../../packages/axios/src/index';
  11. import { DJKOrderStatus, SearchForm } from './normal-order';
  12. const router = useRouter();
  13. const activeTab = ref('all');
  14. const statusList = ref<{ label: string; value: string; num?: number }[]>([]);
  15. // const ShipmentModal = useTemplateRef('Shipment');
  16. const channelIdList = ref([]);
  17. const loading = ref(false);
  18. const columns: NaiveUI.TableColumn<Api.delivery.deliveryOrder>[] = [
  19. {
  20. key: 'shopName',
  21. title: '门店名称',
  22. align: 'center',
  23. width: 220
  24. },
  25. {
  26. key: 'orderNumber',
  27. title: '订单编号',
  28. align: 'center'
  29. },
  30. {
  31. key: 'accessName',
  32. title: '渠道',
  33. align: 'center',
  34. width: 120
  35. },
  36. {
  37. key: 'consigneeMobile',
  38. title: '客户手机号',
  39. align: 'center'
  40. },
  41. {
  42. key: 'activityName',
  43. title: '活动名称',
  44. align: 'center'
  45. },
  46. {
  47. key: 'goodsName',
  48. title: '商品名称',
  49. align: 'center'
  50. },
  51. {
  52. key: 'actualTotal',
  53. title: '金额',
  54. align: 'center',
  55. render: row => {
  56. return <div>¥{row.actualTotal}</div>;
  57. }
  58. },
  59. {
  60. key: 'hbOrderStatus',
  61. title: '订单状态',
  62. align: 'center',
  63. width: 120,
  64. render: row => {
  65. const statusKey = row.hbOrderStatus as keyof typeof DJKOrderStatus;
  66. const statusText = DJKOrderStatus[statusKey as keyof typeof DJKOrderStatus] || '未知状态';
  67. return <NTag>{statusText}</NTag>;
  68. }
  69. }
  70. ];
  71. const [registerTable, { refresh, getSeachForm }] = useTable({
  72. searchFormConfig: {
  73. schemas: [...SearchForm]
  74. },
  75. tableConfig: {
  76. keyField: 'id',
  77. title: '',
  78. showAddButton: false,
  79. showTableHeaderAction: true,
  80. opWdith: 180,
  81. fieldMapToTime: [['createTime', ['startTime', 'endTime']]]
  82. }
  83. });
  84. // const dialog = useDialog();
  85. // async function handleDeivery(row: Api.delivery.deliveryOrder) {
  86. // if (!row.orderNumber) {
  87. // window.$message?.error('订单异常');
  88. // return;
  89. // }
  90. // ShipmentModal.value?.handleOpenOrder(row.orderNumber);
  91. // }
  92. function handleOrderDetail(row: Api.delivery.deliveryOrder) {
  93. if (!row.orderNumber) {
  94. window.$message?.error('订单异常');
  95. }
  96. router.push({
  97. path: '/order-manage/order-detail',
  98. query: {
  99. orderNumber: row.orderNumber
  100. }
  101. });
  102. // orderMoadl.value?.open(String(row.orderNumber));
  103. }
  104. async function handleAudit(row: any) {
  105. window.$dialog?.info({
  106. title: '提示',
  107. content: `此操作将核销该订单,且无法撤销,确定要核销吗?`,
  108. positiveText: '确定',
  109. negativeText: '取消',
  110. onPositiveClick: async () => {
  111. if (loading.value) return;
  112. loading.value = true;
  113. const { error } = await fetchAudit({ orderNumber: row.orderNumber });
  114. loading.value = false;
  115. if (!error) {
  116. refresh();
  117. }
  118. }
  119. });
  120. }
  121. async function getNums() {
  122. const form = getSeachForm();
  123. const params = {
  124. ...form,
  125. channelIdList: channelIdList.value,
  126. startTime: form?.createTime && form.createTime[0],
  127. endTime: form?.createTime && form.createTime[1],
  128. createTime: null
  129. };
  130. const { data: keyData } = await fetchGetStatusNum(params);
  131. if (!keyData) return;
  132. const orderStatusList = [
  133. {
  134. label: '全部',
  135. value: 'all'
  136. },
  137. {
  138. label: '待支付',
  139. value: 'paddingPay'
  140. },
  141. {
  142. label: '待使用',
  143. value: 'pendingUse'
  144. },
  145. {
  146. label: '已核销',
  147. value: 'verification'
  148. },
  149. {
  150. label: '已退款',
  151. value: 'refunded'
  152. },
  153. {
  154. label: '已过期',
  155. value: 'expire'
  156. },
  157. {
  158. label: '已取消',
  159. value: 'cancel'
  160. }
  161. ];
  162. const updatedOrderStatusList = orderStatusList.map(item => {
  163. const key = item.value as keyof typeof keyData;
  164. if (Object.hasOwn(keyData, key)) {
  165. return {
  166. ...item,
  167. num: keyData[key]
  168. };
  169. }
  170. return item;
  171. });
  172. // console.log(updatedOrderStatusList, 'updatedOrderStatusList');
  173. statusList.value = updatedOrderStatusList;
  174. }
  175. getNums();
  176. // async function handleCopy(row: Api.delivery.deliveryOrder, key: string) {
  177. // if (!row[key]) {
  178. // window.$message?.error('订单编号不存在');
  179. // return;
  180. // }
  181. // await copyTextToClipboard(row[key]);
  182. // }
  183. // async function handleExport() {
  184. // setTableLoading(true);
  185. // try {
  186. // // await commonExport(
  187. // // '/platform/order/export',
  188. // // { ...getFieldsValue(), orderStatus: activeTab.value },
  189. // // '正常订单列表.xlsx'
  190. // // );
  191. // await fetchExportOrderList({ ...getSeachForm(), orderStatus: activeTab.value });
  192. // dialog.success({
  193. // title: '提示',
  194. // content: () => {
  195. // return (
  196. // <div>
  197. // <p>导出操作进行中......</p>
  198. // <p>是否进入导出记录</p>
  199. // </div>
  200. // );
  201. // },
  202. // positiveText: '确定',
  203. // negativeText: '取消',
  204. // onPositiveClick: () => {
  205. // openModal();
  206. // },
  207. // onNegativeClick: () => {}
  208. // });
  209. // } finally {
  210. // setTableLoading(false);
  211. // }
  212. // }
  213. // async function handleExportLog() {
  214. // setTableLoading(true);
  215. // try {
  216. // openModal();
  217. // } finally {
  218. // setTableLoading(false);
  219. // }
  220. // }
  221. watch(
  222. () => [activeTab.value],
  223. () => {
  224. nextTick(() => {
  225. refresh();
  226. });
  227. }
  228. );
  229. </script>
  230. <template>
  231. <LayoutTable>
  232. <ZTable
  233. :columns="columns"
  234. :api="fetchGetOrderList"
  235. :default-params="{ orderStatus: activeTab }"
  236. @register="registerTable"
  237. >
  238. <template #op="{ row }">
  239. <NButton size="small" type="primary" ghost @click="handleOrderDetail(row)">订单详情</NButton>
  240. <NButton v-if="row.hbOrderStatus == 20" size="small" type="primary" ghost @click="handleAudit(row)">
  241. 核销
  242. </NButton>
  243. </template>
  244. <template #header>
  245. <div class="flex items-center">
  246. <NScrollbar x-scrollable>
  247. <div class="flex items-center">
  248. <div class="max-w-800px">
  249. <NTabs v-model:value="activeTab" type="line" animated display-directive="show">
  250. <NTab
  251. v-for="item in statusList"
  252. :key="item.value"
  253. :name="item.value"
  254. :tab="`${item.label}(${item.num})`"
  255. ></NTab>
  256. </NTabs>
  257. </div>
  258. </div>
  259. </NScrollbar>
  260. </div>
  261. </template>
  262. </ZTable>
  263. </LayoutTable>
  264. </template>
  265. <style scoped></style>