index.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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. :tools="false"
  18. >
  19. <template #status="{ row }">
  20. <dict-data
  21. code="refund_status"
  22. type="text"
  23. :model-value="row.status"
  24. />
  25. </template>
  26. <template #isPush="{ row }">
  27. <el-tag type="success" v-if="row.checkStatus == 1">已推送</el-tag>
  28. <el-tag type="danger" v-else>未推送</el-tag>
  29. </template>
  30. <template #isFirstOrder="{ row }">
  31. <dict-data
  32. code="is_first_order"
  33. type="tag"
  34. :model-value="row.firstOrder"
  35. />
  36. </template>
  37. <template #orderNumber="{ row }">
  38. <order-number :row="row" isReturn></order-number>
  39. </template>
  40. <template #customer="{ row }">
  41. <refund-customer :row="row"></refund-customer>
  42. </template>
  43. <template #amount="{ row }">
  44. <div class="common-text flex flex-col">
  45. <el-text>余额</el-text>
  46. <el-text>邮费:¥ {{ row.expressMoney || '0' }} </el-text>
  47. </div>
  48. </template>
  49. <template #remarks="{ row }">
  50. <el-popover
  51. trigger="hover"
  52. width="240px"
  53. @show="handleShowPopover(row)"
  54. @hide="showOrderId = ''"
  55. >
  56. <template #reference>
  57. <el-icon
  58. style="cursor: pointer"
  59. :size="24"
  60. :color="row.remarkLabel || '#777777'"
  61. @click="handleRemarks(row)"
  62. >
  63. <Flag />
  64. </el-icon>
  65. </template>
  66. <orderTimeline
  67. :orderId="showOrderId"
  68. title="备注历史记录"
  69. ></orderTimeline>
  70. </el-popover>
  71. </template>
  72. <template #action="{ row }">
  73. <div>
  74. <el-button
  75. type="success"
  76. link
  77. v-permission="'recycleOrder:needReturned:detail'"
  78. @click="toOrderDetail(row)"
  79. >
  80. [订单详情]
  81. </el-button>
  82. <el-button
  83. color="#7728f5"
  84. v-if="row.status !== '3'"
  85. link
  86. plain
  87. v-permission="'recycleOrder:needReturned:manualDelivery'"
  88. @click="handleManualDelivery(row)"
  89. >
  90. [手工发货]
  91. </el-button>
  92. <el-button
  93. type="danger"
  94. link
  95. v-permission="'recycleOrder:needReturned:cancel'"
  96. @click="cancelOrder(row)"
  97. >
  98. [取消订单]
  99. </el-button>
  100. <el-button
  101. type="warning"
  102. link
  103. v-permission="'recycleOrder:needReturned:log'"
  104. @click="openOrderLog(row)"
  105. >
  106. [订单日志]
  107. </el-button>
  108. </div>
  109. </template>
  110. </ele-pro-table>
  111. </ele-card>
  112. <slot></slot>
  113. <orderRemarks ref="remarksRef" />
  114. <orderLog ref="logRef" />
  115. <manualDelivery ref="deliveryRef" @success="reload()" />
  116. <orderRefundDetail ref="orderDetailRef" />
  117. </ele-page>
  118. </template>
  119. <script setup>
  120. import { ref, getCurrentInstance } from 'vue';
  121. import { ElMessageBox } from 'element-plus/es';
  122. import { Flag, ChatDotSquare } from '@element-plus/icons-vue';
  123. import returnSearch from './return-search.vue';
  124. import OrderNumber from '@/views/recycleOrder/components/order-number.vue';
  125. import RefundCustomer from '@/views/recycleOrder/components/refund-customer.vue';
  126. import { useDictData } from '@/utils/use-dict-data';
  127. import orderRemarks from '@/views/recycleOrder/components/order-remarks.vue';
  128. import orderTimeline from '@/views/recycleOrder/components/order-timeline.vue';
  129. import orderLog from '@/views/recycleOrder/components/order-log.vue';
  130. import manualDelivery from '@/views/recycleOrder/components/manual-delivery.vue';
  131. //订单详情
  132. import orderRefundDetail from '@/views/recycleOrder/needReturned/order-refund-detail.vue';
  133. import { useRouter } from 'vue-router';
  134. let router = useRouter();
  135. let props = defineProps({
  136. pageConfig: {
  137. type: Object,
  138. default: () => ({
  139. cacheKey: 'recycleOrderTable',
  140. fileName: '需退回订单'
  141. })
  142. },
  143. pageUrl: { type: String, default: '/order/orderInfo/refund/pageList' },
  144. exportUrl: { type: String, default: '/system/post/export' }
  145. });
  146. let { proxy } = getCurrentInstance();
  147. /** 字典数据 */
  148. const [statusDicts] = useDictData(['sys_normal_disable']);
  149. /** 表格实例 */
  150. const tableRef = ref(null);
  151. /** 表格列配置 */
  152. const columns = ref([
  153. {
  154. type: 'selection',
  155. columnKey: 'selection',
  156. width: 50,
  157. align: 'center',
  158. fixed: 'left'
  159. },
  160. {
  161. label: '单号',
  162. prop: 'refundOrderId',
  163. slot: 'orderNumber',
  164. minWidth: 180
  165. },
  166. { label: '客户', prop: 'userNick', slot: 'customer', minWidth: 380 },
  167. { label: '金额', prop: 'balanceMoney', slot: 'amount', minWidth: 100 },
  168. { label: '是否推送', prop: 'plat', slot: 'isPush' },
  169. {
  170. label: '订单状态',
  171. prop: 'status',
  172. slot: 'status',
  173. formatter: (row) =>
  174. statusDicts.value.find((d) => d.dictValue == row.status)?.dictLabel
  175. },
  176. {
  177. label: '入库状态',
  178. prop: 'stockStatus',
  179. formatter: (row) => (row.stockStatus == 1 ? '已入库' : '-')
  180. },
  181. { label: '是否首单', prop: 'firstOrder', slot: 'isFirstOrder' },
  182. { label: '备注', prop: 'remarkLabel', slot: 'remarks' },
  183. {
  184. columnKey: 'action',
  185. label: '操作',
  186. width: 120,
  187. align: 'center',
  188. slot: 'action',
  189. hideInPrint: true,
  190. hideInExport: true
  191. }
  192. ]);
  193. /** 表格选中数据 */
  194. const selections = ref([]);
  195. /** 当前编辑数据 */
  196. const current = ref(null);
  197. /** 是否显示编辑弹窗 */
  198. const showEdit = ref(false);
  199. async function queryPage(params) {
  200. const res = await proxy.$http.get(props.pageUrl, { params });
  201. if (res.data.code === 200) {
  202. return res.data;
  203. }
  204. return Promise.reject(new Error(res.data.msg));
  205. }
  206. /** 表格数据源 */
  207. const datasource = ({ pages, where, orders }) => {
  208. return queryPage({ ...where, ...orders, ...pages });
  209. };
  210. /** 搜索 */
  211. const reload = (where) => {
  212. tableRef.value?.reload?.({ page: 1, where });
  213. };
  214. //订单详情
  215. const orderDetailRef = ref(null);
  216. function toOrderDetail(row) {
  217. orderDetailRef.value?.handleOpen(row);
  218. }
  219. //弹窗确认
  220. function messageBoxConfirm({ message, url, row }) {
  221. ElMessageBox.confirm(message, '提示', {
  222. confirmButtonText: '确定',
  223. cancelButtonText: '关闭',
  224. type: 'warning'
  225. }).then(() => {
  226. console.log(row, 'row');
  227. });
  228. }
  229. //取消订单
  230. function cancelOrder(row) {
  231. messageBoxConfirm({ message: '确认取消?', url: '', row });
  232. }
  233. //人工发货
  234. const deliveryRef = ref(null);
  235. function handleManualDelivery(row) {
  236. deliveryRef.value?.handleOpen(row);
  237. }
  238. //订单日志
  239. const logRef = ref(null);
  240. const openOrderLog = (row) => {
  241. logRef.value?.handleOpen(row.refundOrderId);
  242. };
  243. //修改备注
  244. const remarksRef = ref(null);
  245. function handleRemarks(row) {
  246. remarksRef.value?.handleOpen(row);
  247. }
  248. //备注弹窗显示
  249. const showOrderId = ref();
  250. function handleShowPopover(row) {
  251. showOrderId.value = row.originOrderId;
  252. }
  253. </script>