index.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <template>
  2. <ele-page flex-table>
  3. <!-- 搜索表单 -->
  4. <return-search @search="reload" />
  5. <ele-card :body-style="{ paddingTop: '8px' }" flex-table>
  6. <!-- 表格 -->
  7. <ele-pro-table
  8. ref="tableRef"
  9. row-key="postId"
  10. :columns="columns"
  11. :datasource="datasource"
  12. :show-overflow-tooltip="true"
  13. v-model:selections="selections"
  14. highlight-current-row
  15. :export-config="{ fileName: '需退回订单' }"
  16. cache-key="needReturnedTable"
  17. >
  18. <template #toolbar>
  19. <!-- 0-创建(待付款) 1-已付款 2-已推送 3-已发货 4-已签收 5-已完成 6-已取消 7-超时取消 -->
  20. <el-radio-group v-model="status" @change="handleStatusChange">
  21. <el-radio-button label="全部" value="0" />
  22. <el-radio-button label="待发货" value="1" />
  23. <el-radio-button label="已发货" value="2" />
  24. <el-radio-button label="已完成" value="3" />
  25. <el-radio-button label="已取消" value="4" />
  26. </el-radio-group>
  27. </template>
  28. <template #status="{ row }">
  29. <dict-data
  30. code="refund_status"
  31. type="text"
  32. :model-value="row.status"
  33. />
  34. </template>
  35. <template #isPush="{ row }">
  36. <el-tag type="success" v-if="row.checkStatus == 1">已推送</el-tag>
  37. <el-tag type="danger" v-else>未推送</el-tag>
  38. </template>
  39. <template #isFirstOrder="{ row }">
  40. <dict-data
  41. code="is_first_order"
  42. type="tag"
  43. :model-value="row.firstOrder"
  44. />
  45. </template>
  46. <template #orderNumber="{ row }">
  47. <order-number :row="row" isReturn></order-number>
  48. </template>
  49. <template #customer="{ row }">
  50. <refund-customer :row="row"></refund-customer>
  51. </template>
  52. <template #amount="{ row }">
  53. <div class="common-text flex flex-col">
  54. <el-text>余额</el-text>
  55. <el-text>邮费:¥ {{ row.expressMoney || '0' }} </el-text>
  56. </div>
  57. </template>
  58. <template #remarks="{ row }">
  59. <el-popover
  60. trigger="hover"
  61. width="240px"
  62. @show="handleShowPopover(row)"
  63. @hide="showOrderId = ''"
  64. >
  65. <template #reference>
  66. <el-icon
  67. style="cursor: pointer"
  68. :size="24"
  69. :color="row.remarkLabel || '#777777'"
  70. @click="handleRemarks(row)"
  71. >
  72. <Flag />
  73. </el-icon>
  74. </template>
  75. <orderTimeline
  76. :orderId="showOrderId"
  77. title="备注历史记录"
  78. ref="remarkPopoverRef"
  79. ></orderTimeline>
  80. </el-popover>
  81. </template>
  82. <template #action="{ row }">
  83. <div class="flex flex-wrap flex-col">
  84. <el-button
  85. type="success"
  86. link
  87. v-permission="'recycleOrder:needReturned:detail'"
  88. @click="toOrderDetail(row)"
  89. >
  90. [订单详情]
  91. </el-button>
  92. <el-button
  93. color="#7728f5"
  94. v-if="row.status !== '3'"
  95. link
  96. plain
  97. v-permission="'recycleOrder:needReturned:manualDelivery'"
  98. @click="handleManualDelivery(row)"
  99. >
  100. [手工发货]
  101. </el-button>
  102. <el-button
  103. type="danger"
  104. link
  105. v-if="row.status < 3"
  106. v-permission="'recycleOrder:needReturned:cancel'"
  107. @click="cancelOrder(row)"
  108. >
  109. [取消订单]
  110. </el-button>
  111. <el-button
  112. type="danger"
  113. link
  114. v-if="row.status == '6'"
  115. v-permission="'recycleOrder:needReturned:cancelRecover'"
  116. @click="cancelRecover(row)"
  117. >
  118. [恢复订单]
  119. </el-button>
  120. <el-button
  121. type="warning"
  122. link
  123. v-permission="'recycleOrder:needReturned:log'"
  124. @click="openOrderLog(row)"
  125. >
  126. [订单日志]
  127. </el-button>
  128. </div>
  129. </template>
  130. </ele-pro-table>
  131. </ele-card>
  132. <slot></slot>
  133. <orderRemarks ref="remarksRef" isRefund @refresh="reload()" />
  134. <orderLog ref="logRef" type="refund" />
  135. <manualDelivery ref="deliveryRef" @success="reload()" />
  136. <orderRefundDetail ref="orderDetailRef" />
  137. </ele-page>
  138. </template>
  139. <script setup>
  140. import { ref, getCurrentInstance } from 'vue';
  141. import { EleMessage } from 'ele-admin-plus/es';
  142. import { ElMessageBox } from 'element-plus/es';
  143. import { Flag } from '@element-plus/icons-vue';
  144. import returnSearch from './return-search.vue';
  145. import OrderNumber from '@/views/recycleOrder/components/order-number.vue';
  146. import RefundCustomer from '@/views/recycleOrder/components/refund-customer.vue';
  147. import { useDictData } from '@/utils/use-dict-data';
  148. import orderRemarks from '@/views/recycleOrder/components/order-remarks.vue';
  149. import orderTimeline from '@/views/recycleOrder/components/order-timeline.vue';
  150. import orderLog from '@/views/recycleOrder/components/order-log.vue';
  151. import manualDelivery from '@/views/recycleOrder/components/manual-delivery.vue';
  152. //订单详情
  153. import orderRefundDetail from '@/views/recycleOrder/needReturned/order-refund-detail.vue';
  154. const status = ref('0');
  155. let props = defineProps({
  156. pageConfig: {
  157. type: Object,
  158. default: () => ({
  159. cacheKey: 'recycleOrderTable',
  160. fileName: '需退回订单'
  161. })
  162. },
  163. pageUrl: { type: String, default: '/order/orderInfo/refund/pageList' }
  164. });
  165. let { proxy } = getCurrentInstance();
  166. /** 字典数据 */
  167. const [statusDicts] = useDictData(['sys_normal_disable']);
  168. /** 表格实例 */
  169. const tableRef = ref(null);
  170. function handleStatusChange(val) {
  171. status.value = val;
  172. reload();
  173. }
  174. /** 表格列配置 */
  175. const columns = ref([
  176. {
  177. type: 'selection',
  178. columnKey: 'selection',
  179. width: 50,
  180. align: 'center',
  181. fixed: 'left'
  182. },
  183. {
  184. label: '单号',
  185. prop: 'refundOrderId',
  186. slot: 'orderNumber',
  187. minWidth: 180
  188. },
  189. { label: '客户', prop: 'userNick', slot: 'customer', minWidth: 380 },
  190. { label: '金额', prop: 'balanceMoney', slot: 'amount', minWidth: 100 },
  191. { label: '是否推送', prop: 'plat', slot: 'isPush' },
  192. {
  193. label: '订单状态',
  194. prop: 'status',
  195. slot: 'status',
  196. formatter: (row) =>
  197. statusDicts.value.find((d) => d.dictValue == row.status)?.dictLabel
  198. },
  199. {
  200. label: '入库状态',
  201. prop: 'stockStatus',
  202. formatter: (row) =>
  203. row.stockStatus == 1 ? '已入库' : row.stockStatus == 0 ? '未入库' : '-'
  204. },
  205. { label: '是否首单', prop: 'firstOrder', slot: 'isFirstOrder' },
  206. { label: '备注', prop: 'remarkLabel', slot: 'remarks' },
  207. {
  208. columnKey: 'action',
  209. label: '操作',
  210. width: 120,
  211. align: 'center',
  212. slot: 'action',
  213. hideInPrint: true,
  214. hideInExport: true
  215. }
  216. ]);
  217. /** 表格选中数据 */
  218. const selections = ref([]);
  219. async function queryPage(params) {
  220. const res = await proxy.$http.get(props.pageUrl, { params });
  221. if (res.data.code === 200) {
  222. return res.data;
  223. }
  224. return Promise.reject(new Error(res.data.msg));
  225. }
  226. /** 表格数据源 */
  227. const datasource = ({ pages, where, orders }) => {
  228. return queryPage({
  229. ...where,
  230. ...orders,
  231. ...pages,
  232. tabStatus: status.value
  233. });
  234. };
  235. /** 搜索 */
  236. const reload = (where) => {
  237. tableRef.value?.reload?.({
  238. page: 1,
  239. where
  240. });
  241. };
  242. //订单详情
  243. const orderDetailRef = ref(null);
  244. function toOrderDetail(row) {
  245. orderDetailRef.value?.handleOpen(row);
  246. }
  247. //弹窗确认
  248. function messageBoxConfirm({ message, url, row }) {
  249. ElMessageBox.confirm(message, '提示', {
  250. confirmButtonText: '确定',
  251. cancelButtonText: '关闭',
  252. type: 'warning'
  253. }).then(() => {
  254. proxy.$http.post(url, { orderIds: [row.refundOrderId] }).then((res) => {
  255. if (res.data.code === 200) {
  256. EleMessage.success('操作成功');
  257. reload();
  258. } else {
  259. EleMessage.error(res.data.msg || '操作失败');
  260. }
  261. });
  262. });
  263. }
  264. //取消订单
  265. function cancelOrder(row) {
  266. messageBoxConfirm({
  267. message: '确认取消?',
  268. url: '/order/orderInfo/refund/cancel',
  269. row
  270. });
  271. }
  272. //恢复订单
  273. function cancelRecover(row) {
  274. messageBoxConfirm({
  275. message: '确认恢复?',
  276. url: '/order/orderInfo/refund/cancelRecover',
  277. row
  278. });
  279. }
  280. //人工发货
  281. const deliveryRef = ref(null);
  282. function handleManualDelivery(row) {
  283. deliveryRef.value?.handleOpen(row);
  284. }
  285. //订单日志
  286. const logRef = ref(null);
  287. const openOrderLog = (row) => {
  288. logRef.value?.handleOpen(row.refundOrderId);
  289. };
  290. //修改备注
  291. const remarksRef = ref(null);
  292. function handleRemarks(row) {
  293. remarksRef.value?.handleOpen(row);
  294. }
  295. //备注弹窗显示
  296. const showOrderId = ref();
  297. const remarkPopoverRef = ref(null);
  298. function handleShowPopover(row) {
  299. nextTick(() => {
  300. remarkPopoverRef.value?.getRemarks(row.refundOrderId, true);
  301. });
  302. if (showOrderId.value !== row.refundOrderId) {
  303. showOrderId.value = row.refundOrderId;
  304. }
  305. }
  306. </script>