index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. <template>
  2. <div class="p-2">
  3. <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
  4. <div v-show="showSearch" class="mb-[10px]">
  5. <el-card shadow="hover">
  6. <el-form ref="queryFormRef" :model="queryParams" :inline="true">
  7. <el-form-item label="订单编号" prop="orderNo">
  8. <el-input v-model="queryParams.orderNo" placeholder="请输入订单编号" clearable @keyup.enter="handleQuery" />
  9. </el-form-item>
  10. <el-form-item label="客户编号" prop="customerCode">
  11. <el-input v-model="queryParams.customerCode" placeholder="请输入客户编号" clearable @keyup.enter="handleQuery" />
  12. </el-form-item>
  13. <el-form-item label="客户名称" prop="customerName">
  14. <el-input v-model="queryParams.customerName" placeholder="请输入客户名称" clearable @keyup.enter="handleQuery" />
  15. </el-form-item>
  16. <el-form-item label="订单来源" prop="orderSource">
  17. <el-select v-model="queryParams.orderSource" placeholder="请选择订单来源" clearable>
  18. <el-option v-for="dict in order_source" :key="dict.value" :label="dict.label" :value="dict.value" />
  19. </el-select>
  20. </el-form-item>
  21. <!-- <el-form-item label="订单状态" prop="orderStatus">
  22. <el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable>
  23. <el-option v-for="dict in order_status" :key="dict.value" :label="dict.label" :value="dict.value" />
  24. </el-select>
  25. </el-form-item> -->
  26. <el-form-item label="提交时间" prop="dateRange">
  27. <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
  28. </el-form-item>
  29. <el-form-item>
  30. <el-button type="primary" icon="Search" @click="handleQuery()">搜索</el-button>
  31. <el-button icon="Refresh" @click="resetQuery">重置</el-button>
  32. </el-form-item>
  33. </el-form>
  34. </el-card>
  35. </div>
  36. </transition>
  37. <el-card shadow="never">
  38. <template #header>
  39. <el-row :gutter="10" class="mb8">
  40. <el-col :span="18"> 订单分配列表 </el-col>
  41. <el-col :span="1.5">
  42. <el-button type="primary" :disabled="!ids.length" plain @click="handleAssignment(null)">批量整单分配</el-button>
  43. </el-col>
  44. <el-col :span="1.5">
  45. <el-button type="primary" :disabled="!ids.length" plain>关闭订单</el-button>
  46. </el-col>
  47. <el-col :span="1.5">
  48. <el-button type="primary" :disabled="!ids.length" plain>删除订单</el-button>
  49. </el-col>
  50. <el-col :span="1.5">
  51. <el-button type="primary" :disabled="!ids.length" plain>导出订单</el-button>
  52. </el-col>
  53. </el-row>
  54. </template>
  55. <el-table v-loading="loading" border :data="orderMainList" @selection-change="handleSelectionChange">
  56. <el-table-column type="selection" width="55" align="center" />
  57. <el-table-column label="订单时间" align="center" prop="orderTime" />
  58. <el-table-column label="订单编号" align="center" prop="orderNo" />
  59. <el-table-column label="客户编号" align="center" prop="customerCode" />
  60. <el-table-column label="订单总金额" align="center" prop="totalAmount" />
  61. <el-table-column label="支付方式" align="center" prop="payType">
  62. <template #default="scope">
  63. <dict-tag :options="pay_method" :value="scope.row.payType" />
  64. </template>
  65. </el-table-column>
  66. <el-table-column label="业务员" align="center" prop="businessStaff" />
  67. <el-table-column label="客服" align="center" prop="customerService" />
  68. <el-table-column label="归属部门" align="center" prop="businessDept" />
  69. <el-table-column label="订单来源" align="center" prop="orderSource">
  70. <template #default="scope">
  71. <dict-tag :options="order_source" :value="scope.row.orderSource" />
  72. </template>
  73. </el-table-column>
  74. <el-table-column label="分配状态" align="center" prop="assignmentStatus">
  75. <template #default="scope">
  76. <dict-tag :options="order_assignment_status" :value="scope.row.assignmentStatus" />
  77. </template>
  78. </el-table-column>
  79. <el-table-column label="当前平台" align="center" prop="platformCode">
  80. <template #default="scope">
  81. <dict-tag :options="sys_platform_code" :value="scope.row.platformCode" />
  82. </template>
  83. </el-table-column>
  84. <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="180">
  85. <template #default="scope">
  86. <el-button link type="primary" @click="handleReview(scope.row)">查看</el-button>
  87. <el-button
  88. link
  89. type="primary"
  90. v-if="scope.row.checkStatus == '1' && scope.row.assignmentStatus == '0'"
  91. @click="handleAssignment(scope.row)"
  92. >订单分配</el-button
  93. >
  94. <el-button
  95. link
  96. type="primary"
  97. v-if="scope.row.checkStatus == '1' && scope.row.assignmentStatus == '1'"
  98. @click="handleAssignment(scope.row)"
  99. >重新分配</el-button
  100. >
  101. </template>
  102. </el-table-column>
  103. </el-table>
  104. <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
  105. </el-card>
  106. <!-- 订单分配对话框 -->
  107. <assignment-dialog ref="assignmentDialogRef" @success="getList" />
  108. <!-- 拆单分配对话框 -->
  109. <split-assign-dialog ref="splitAssignDialogRef" @success="getList" />
  110. </div>
  111. </template>
  112. <script setup name="OrderAssignment" lang="ts">
  113. import { listOrderAssignment, getOrderMain, delOrderMain } from '@/api/order/orderMain';
  114. import { OrderMainVO, OrderMainQuery, OrderMainForm } from '@/api/order/orderMain/types';
  115. import AssignmentDialog from './assignmentDialog.vue';
  116. import SplitAssignDialog from './splitAssignDialog.vue';
  117. const { proxy } = getCurrentInstance() as ComponentInternalInstance;
  118. const { order_assignment_status, order_check_status, pay_method, order_source, sys_platform_code } = toRefs<any>(
  119. proxy?.useDict('order_assignment_status', 'order_check_status', 'pay_method', 'order_source', 'sys_platform_code')
  120. );
  121. const orderMainList = ref<OrderMainVO[]>([]);
  122. const buttonLoading = ref(false);
  123. const loading = ref(true);
  124. const showSearch = ref(true);
  125. const ids = ref<Array<string | number>>([]);
  126. const single = ref(true);
  127. const multiple = ref(true);
  128. const total = ref(0);
  129. const router = useRouter();
  130. const queryFormRef = ref<ElFormInstance>();
  131. const orderMainFormRef = ref<ElFormInstance>();
  132. const assignmentDialogRef = ref<InstanceType<typeof AssignmentDialog>>();
  133. const splitAssignDialogRef = ref<InstanceType<typeof SplitAssignDialog>>();
  134. const dateRange = ref<[DateModelType, DateModelType]>(['', '']);
  135. const dialog = reactive<DialogOption>({
  136. visible: false,
  137. title: ''
  138. });
  139. const initFormData: OrderMainForm = {
  140. id: undefined,
  141. orderNo: undefined,
  142. shipmentNo: undefined,
  143. subOrderNo: undefined,
  144. companyId: undefined,
  145. customerId: undefined,
  146. customerCode: undefined,
  147. userId: undefined,
  148. shippingAddressId: undefined,
  149. purchaseReason: undefined,
  150. invoiceType: undefined,
  151. payType: undefined,
  152. warehouseId: undefined,
  153. creditLimit: undefined,
  154. expectedDeliveryTime: undefined,
  155. businessStaff: undefined,
  156. customerService: undefined,
  157. businessDept: undefined,
  158. userDept: undefined,
  159. productQuantity: undefined,
  160. shippingFee: undefined,
  161. totalAmount: undefined,
  162. payableAmount: undefined,
  163. paymentStatus: undefined,
  164. orderSource: undefined,
  165. orderStatus: undefined,
  166. orderTime: undefined,
  167. confirmTime: undefined,
  168. shippingTime: undefined,
  169. receivingTime: undefined,
  170. shippedQuantity: undefined,
  171. unshippedQuantity: undefined,
  172. packageCount: undefined,
  173. signedQuantity: undefined,
  174. afterSaleCompleted: undefined,
  175. afterSalePending: undefined,
  176. deliveryDesc: undefined,
  177. pushStatus: undefined,
  178. attachmentPath: undefined,
  179. deliveryType: undefined,
  180. orderCategory: undefined,
  181. productCode: undefined,
  182. cancelReason: undefined,
  183. expenseType: undefined,
  184. userNo: undefined,
  185. status: undefined,
  186. remark: undefined,
  187. isSplitChild: undefined,
  188. orderProductBos: [],
  189. customerSalesInfoVo: {}
  190. };
  191. const data = reactive<PageData<OrderMainForm, OrderMainQuery>>({
  192. form: { ...initFormData },
  193. queryParams: {
  194. pageNum: 1,
  195. pageSize: 10,
  196. checkStatus: '1',
  197. orderNo: undefined,
  198. shipmentNo: undefined,
  199. subOrderNo: undefined,
  200. companyId: undefined,
  201. customerCode: undefined,
  202. customerId: undefined,
  203. userId: undefined,
  204. payType: undefined,
  205. warehouseId: undefined,
  206. expectedDeliveryTime: undefined,
  207. businessStaff: undefined,
  208. customerService: undefined,
  209. businessDept: undefined,
  210. productQuantity: undefined,
  211. totalAmount: undefined,
  212. payableAmount: undefined,
  213. paymentStatus: undefined,
  214. orderSource: undefined,
  215. orderStatus: undefined,
  216. orderTime: undefined,
  217. confirmTime: undefined,
  218. status: undefined,
  219. isSplitChild: '1',
  220. params: {}
  221. },
  222. rules: {}
  223. });
  224. const { queryParams, form, rules } = toRefs(data);
  225. /** 查询订单主信息列表 */
  226. const getList = async () => {
  227. loading.value = true;
  228. const res = await listOrderAssignment(proxy?.addDateRange(queryParams.value, dateRange.value));
  229. orderMainList.value = res.rows;
  230. total.value = res.total;
  231. loading.value = false;
  232. };
  233. /** 取消按钮 */
  234. const cancel = () => {
  235. reset();
  236. dialog.visible = false;
  237. };
  238. /** 表单重置 */
  239. const reset = () => {
  240. form.value = { ...initFormData };
  241. orderMainFormRef.value?.resetFields();
  242. };
  243. /** 搜索按钮操作 */
  244. const handleQuery = (orderStatus?: string) => {
  245. if (orderStatus) {
  246. queryParams.value.orderStatus = orderStatus;
  247. } else {
  248. queryParams.value.orderStatus = undefined;
  249. }
  250. queryParams.value.pageNum = 1;
  251. getList();
  252. };
  253. /** 重置按钮操作 */
  254. const resetQuery = () => {
  255. dateRange.value = ['', ''];
  256. queryFormRef.value?.resetFields();
  257. handleQuery();
  258. };
  259. /** 多选框选中数据 */
  260. const handleSelectionChange = (selection: OrderMainVO[]) => {
  261. ids.value = selection.map((item) => item.id);
  262. single.value = selection.length != 1;
  263. multiple.value = !selection.length;
  264. };
  265. const handleReview = (row?: OrderMainVO) => {
  266. router.push({
  267. path: '/order-center/order-sendDetail',
  268. query: { id: row.id }
  269. });
  270. };
  271. /** 订单分配按钮操作 */
  272. const handleAssignment = async (row?: OrderMainVO | null) => {
  273. let orderIds: Array<string | number>;
  274. if (row) {
  275. // 单个订单分配 - 直接打开统一的分配抽屉
  276. splitAssignDialogRef.value?.open(row.id);
  277. } else {
  278. // 批量分配 - 只支持整单分配
  279. if (!ids.value || ids.value.length === 0) {
  280. proxy?.$modal.msgWarning('请选择要分配的订单');
  281. return;
  282. }
  283. orderIds = ids.value;
  284. assignmentDialogRef.value?.open(orderIds, undefined, undefined);
  285. }
  286. };
  287. /** 删除按钮操作 */
  288. const handleDelete = async (row?: OrderMainVO) => {
  289. const _ids = row?.id || ids.value;
  290. await proxy?.$modal.confirm('是否确认删除订单主信息编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
  291. await delOrderMain(_ids);
  292. proxy?.$modal.msgSuccess('删除成功');
  293. await getList();
  294. };
  295. /** 导出按钮操作 */
  296. const handleExport = () => {
  297. proxy?.download(
  298. 'order/orderMain/export',
  299. {
  300. ...queryParams.value
  301. },
  302. `orderMain_${new Date().getTime()}.xlsx`
  303. );
  304. };
  305. onMounted(() => {
  306. getList();
  307. });
  308. onActivated(() => {
  309. getList();
  310. });
  311. </script>