From 66026cb727dfee50700d7ed3e54fd1c44fc3bab8 Mon Sep 17 00:00:00 2001
From: sen <sen@qq.com>
Date: 星期五, 10 四月 2026 14:49:45 +0800
Subject: [PATCH] 修改调度单委托报关卸货,多选,增加作废

---
 ui/admin-ui3/src/api/tms/tmsDispatchOrder.ts          |    3 
 ui/admin-ui3/src/api/tms/tmsApBill.ts                 |   11 ++
 ui/admin-ui3/src/api/tms/tmsArBill.ts                 |   10 ++
 ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue |  138 ++++++++++++++++++++++++++-------
 ui/admin-ui3/src/views/tms/tmsApBill/index.vue        |   23 +++++
 ui/admin-ui3/src/views/tms/tmsArBill/index.vue        |   22 +++++
 6 files changed, 171 insertions(+), 36 deletions(-)

diff --git a/ui/admin-ui3/src/api/tms/tmsApBill.ts b/ui/admin-ui3/src/api/tms/tmsApBill.ts
index 5629272..fd08f20 100644
--- a/ui/admin-ui3/src/api/tms/tmsApBill.ts
+++ b/ui/admin-ui3/src/api/tms/tmsApBill.ts
@@ -103,4 +103,13 @@
         method:'get',
          params: query
     })
-}
\ No newline at end of file
+}
+/**
+ * 浣滃簾搴斾粯璐﹀崟
+ */
+export const tmsApBillCancelPush: requestType = (id) => {
+    return request({
+        url: '/tms/tmsApBill/cancelPush/' + id,
+        method: 'post',
+    })
+}
diff --git a/ui/admin-ui3/src/api/tms/tmsArBill.ts b/ui/admin-ui3/src/api/tms/tmsArBill.ts
index 9ea906d..a43f550 100644
--- a/ui/admin-ui3/src/api/tms/tmsArBill.ts
+++ b/ui/admin-ui3/src/api/tms/tmsArBill.ts
@@ -120,4 +120,14 @@
         method:'get',
         params:query
     })
+}
+
+/**
+ * 浣滃簾
+ */
+export const tmsArBillCancelPush: requestType = (id) => {
+    return request({
+        url: '/tms/tmsArBill/cancelPush/' + id,
+        method: 'post',
+    })
 }
\ No newline at end of file
diff --git a/ui/admin-ui3/src/api/tms/tmsDispatchOrder.ts b/ui/admin-ui3/src/api/tms/tmsDispatchOrder.ts
index 3610466..7b7f6f8 100644
--- a/ui/admin-ui3/src/api/tms/tmsDispatchOrder.ts
+++ b/ui/admin-ui3/src/api/tms/tmsDispatchOrder.ts
@@ -260,6 +260,8 @@
         data
     })
 }
+
+
 export const loadingOrder: requestType = (data) => {
     return request({
         url: '/tms/tmsDispatchOrder/loadingOrder',
@@ -267,7 +269,6 @@
         data
     })
 }
-
 
 /**
  * 瀵煎嚭璋冨害鍗曠鐞�
diff --git a/ui/admin-ui3/src/views/tms/tmsApBill/index.vue b/ui/admin-ui3/src/views/tms/tmsApBill/index.vue
index 296a124..b00b52a 100644
--- a/ui/admin-ui3/src/views/tms/tmsApBill/index.vue
+++ b/ui/admin-ui3/src/views/tms/tmsApBill/index.vue
@@ -32,6 +32,10 @@
         <el-link size="small" type="primary" v-if="row.pushStatus == 3 || row.pushStatus == 4|| row.pushStatus == 0"
           @click="handleManualPush(row)" class="link-btn" underline="never" icon="el-icon-upload">鎵嬪姩鎺ㄩ��
         </el-link>
+           <el-link size="small" type="primary" v-if="[0, 2].includes(row.status)" @click="handleClose(row)"
+            class="link-btn" v-hasPermi="['tms:tmsApBill:closeOrder']" underline="never" icon="el-icon-close">
+            浣滃簾
+          </el-link>
         <el-link size="small" type="primary" v-if="row.status == 0" @click="handleEdit(row)" class="link-btn"
           :underline="false" icon="el-icon-edit">璐﹀崟纭
         </el-link>
@@ -132,7 +136,7 @@
   exportTmsApBill,
   getTmsApBill,
   listTmsApBill,
-  updateTmsApBill, manualPushTmsApBill,getPayableAuditLog
+  updateTmsApBill, manualPushTmsApBill,getPayableAuditLog,tmsApBillCancelPush
 } from "@/api/tms/tmsApBill";
 import useCurrentInstance from "@/utils/useCurrentInstance";
 import { computed, reactive, ref, toRefs } from "vue";
@@ -470,4 +474,21 @@
 
   })
 }
+
+const handleClose = (row: any) => {
+  ElMessageBox.confirm("鏄惁瀵瑰簲浠樿处鍗�" + row.systemNo + "杩涜浣滃簾锛�", '绯荤粺鎻愮ず', {
+    confirmButtonText: '纭畾',
+    cancelButtonText: '鍙栨秷',
+    type: 'warning'
+  }).then(() => {
+    return tmsApBillCancelPush(row.id);
+  }).then(() => {
+    onLoad(page.value);
+    ElMessage({
+      message: "鎿嶄綔鎴愬姛锛�",
+      type: 'success'
+    })
+  });
+}
+
 </script>
diff --git a/ui/admin-ui3/src/views/tms/tmsArBill/index.vue b/ui/admin-ui3/src/views/tms/tmsArBill/index.vue
index a5d0642..b18dc16 100644
--- a/ui/admin-ui3/src/views/tms/tmsArBill/index.vue
+++ b/ui/admin-ui3/src/views/tms/tmsArBill/index.vue
@@ -47,6 +47,10 @@
         <el-link size="small" type="primary" @click="handleEdit(row)" class="link-btn" underline="never"
           icon="el-icon-edit">淇敼
         </el-link>
+           <el-link size="small" type="primary" v-if="[0, 2].includes(row.status)" @click="handleClose(row)"
+            class="link-btn" v-hasPermi="['tms:tmsArBill:closeOrder']" underline="never" icon="el-icon-close">
+            浣滃簾
+          </el-link>
         <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" underline="never"
           icon="el-icon-tickets">鏃ュ織
         </el-link>
@@ -144,7 +148,7 @@
   getTmsArBill,
   listTmsArBill,
   updateTmsArBill, cancelArBill,
-  exportArBillFormat,manualPushTmsArBill,listReceivableAuditLog
+  exportArBillFormat,manualPushTmsArBill,listReceivableAuditLog,tmsArBillCancelPush
 } from "@/api/tms/tmsArBill";
 import useCurrentInstance from "@/utils/useCurrentInstance";
 import { computed, reactive, ref, toRefs } from "vue";
@@ -535,5 +539,19 @@
 
   })
 }
-
+const handleClose = (row: any) => {
+  ElMessageBox.confirm("鏄惁瀵瑰簲鏀惰处鍗�" + row.systemNo + "杩涜浣滃簾锛�", '绯荤粺鎻愮ず', {
+    confirmButtonText: '纭畾',
+    cancelButtonText: '鍙栨秷',
+    type: 'warning'
+  }).then(() => {
+    return tmsArBillCancelPush(row.id);
+  }).then(() => {
+    onLoad(page.value);
+    ElMessage({
+      message: "鎿嶄綔鎴愬姛锛�",
+      type: 'success'
+    })
+  });
+}
 </script>
diff --git a/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue b/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
index 9c46032..7b708bb 100644
--- a/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
+++ b/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -23,7 +23,8 @@
           <span>{{ dictFormat(order_type, row?.orderType || form?.orderType) }}</span>
         </template>
         <template v-else>
-          <el-select v-model="form.orderType" placeholder="璇烽�夋嫨璁㈠崟绫诲瀷"  @change="(val) => handleOrderTypeChange(val)" style="width: 100%" clearable>
+          <el-select v-model="form.orderType" placeholder="璇烽�夋嫨璁㈠崟绫诲瀷" @change="(val) => handleOrderTypeChange(val)"
+            style="width: 100%" clearable>
             <el-option v-for="item in order_type" :key="item.value" :label="item.label" :value="parseInt(item.value)" />
           </el-select>
         </template>
@@ -78,11 +79,10 @@
         <el-button type="primary" icon="Male" :disabled="pageF.single" @click="handleConnectHang"
           v-hasPermi="['tms:tmsDispatchOrder:connectHang']">鎺ユ寕
         </el-button>
-
-        <el-button type="warning" icon="Avatar" :disabled="!(isCustoms == 0)" @click="handleCustoms"
+        <el-button type="warning" icon="Avatar" :disabled="selectionList.length === 0" @click="handleCustoms"
           v-hasPermi="['tms:tmsDispatchOrder:customs']">濮旀墭鎶ュ叧淇℃伅
         </el-button>
-        <el-button type="primary" icon="UserFilled" :disabled="!(isLoad == 0)" @click="handleLoading"
+        <el-button type="primary" icon="UserFilled" :disabled="selectionList.length === 0" @click="handleLoading"
           v-hasPermi="['tms:tmsDispatchOrder:loading']">濮旀墭鍗歌揣淇℃伅
         </el-button>
         <el-button type="primary" icon="UserFilled" :disabled="pageF.single" @click="handleZZ"
@@ -299,26 +299,40 @@
       </div>
 
       <div v-if="optionType == 'customs'">
-        <el-descriptions style="margin-bottom: 20px" :column="2" border>
+        <el-descriptions v-if="optionNum == 'radio'" style="margin-bottom: 20px" :column="2" border>
           <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
           <el-descriptions-item label="瀹㈡埛">{{ form.customerName }}</el-descriptions-item>
           <el-descriptions-item label="椤圭洰鍚嶇О">{{ form.projectName }}</el-descriptions-item>
           <el-descriptions-item label="杩愯緭璺嚎">{{ form.transportLine }}</el-descriptions-item>
         </el-descriptions>
+        <el-table v-if="optionNum == 'checkbox'" :data="clearanceList" border size="small"
+          style="width: 100%; margin-bottom: 20px">
+          <el-table-column prop="dispatchNo" label="璋冨害鍗曞彿" width="150" />
+          <el-table-column prop="customerName" label="瀹㈡埛" min-width="120" show-overflow-tooltip />
+          <el-table-column prop="projectName" label="椤圭洰鍚嶇О" min-width="120" show-overflow-tooltip />
+          <el-table-column prop="transportLine" label="杩愯緭璺嚎" min-width="150" show-overflow-tooltip />
+        </el-table>
+
         <avue-form v-model="form" ref="boxFormRef" :option="boxFormOption">
 
         </avue-form>
       </div>
 
       <div v-if="optionType == 'loading'">
-        <el-descriptions style="margin-bottom: 20px" :column="2" border>
+            <el-descriptions v-if="optionNum == 'radio'" style="margin-bottom: 20px" :column="2" border>
           <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
           <el-descriptions-item label="瀹㈡埛">{{ form.customerName }}</el-descriptions-item>
           <el-descriptions-item label="椤圭洰鍚嶇О">{{ form.projectName }}</el-descriptions-item>
           <el-descriptions-item label="杩愯緭璺嚎">{{ form.transportLine }}</el-descriptions-item>
         </el-descriptions>
+        <el-table v-if="optionNum == 'checkbox'" :data="clearanceList" border size="small"
+          style="width: 100%; margin-bottom: 20px">
+          <el-table-column prop="dispatchNo" label="璋冨害鍗曞彿" width="150" />
+          <el-table-column prop="customerName" label="瀹㈡埛" min-width="120" show-overflow-tooltip />
+          <el-table-column prop="projectName" label="椤圭洰鍚嶇О" min-width="120" show-overflow-tooltip />
+          <el-table-column prop="transportLine" label="杩愯緭璺嚎" min-width="150" show-overflow-tooltip />
+        </el-table>
         <avue-form v-model="form" ref="boxFormRef" :option="boxFormOption">
-
         </avue-form>
       </div>
       <template #footer>
@@ -665,7 +679,7 @@
   importTemplateTmsDispatchOrder, ypdddjSumbit,
   tmsTmsDispatchOrderImportLog,
   saveTmsFinanceDetail2,
-  getLastLicensePlate
+  getLastLicensePlate, 
 } from "@/api/tms/tmsDispatchOrder";
 import useCurrentInstance from "@/utils/useCurrentInstance";
 import { computed, onMounted, onBeforeUnmount, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
@@ -3199,9 +3213,9 @@
   }
 });
 const zzItemsTableData = ref();
-
-
-
+/* 鎶ュ叧鍒楄〃 */
+const clearanceList = ref([]);
+const optionNum = ref(''); // 鐢ㄤ簬鍖哄垎鏄姤鍏宠繕鏄鍗�
 
 const {
   tableData,
@@ -3237,6 +3251,7 @@
   },
   handleSelectionChangeFunc: (selection: any) => {
     selectionList.value = selection;
+    clearanceList.value = selection;
     if (selection.length > 0) {
       isCustoms.value = selection[0].isCustoms;
       isLoad.value = selection[0].isLoad;
@@ -3538,11 +3553,24 @@
       pageF.isUploading = false;
     })
   } else if (optionType.value === 'customs') {
-    customsOrder({
-      id: form.value.id,
-      customsServiceProviderId: form.value.customsServiceProviderId,
-      customsServiceProviderName: form.value.customsServiceProviderName,
-    }).then(res => {
+    let result = <any>[];
+    if (optionNum.value == 'checkbox') {
+      result = clearanceList.value.map(item => {
+        return {
+          id: item.id,
+          customsServiceProviderId: form.value.customsServiceProviderId,
+          customsServiceProviderName: form.value.customsServiceProviderName
+        };
+      });
+    }else if (optionNum.value == 'radio') {
+      result = [{
+        id: form.value.id,
+        customsServiceProviderId: form.value.customsServiceProviderId,
+        customsServiceProviderName: form.value.customsServiceProviderName
+      }]
+    }
+
+    customsOrder(result).then(res => {
       ElMessage({
         message: "鎻愪氦鎴愬姛锛�",
         type: 'success'
@@ -3553,11 +3581,25 @@
       pageF.isUploading = false;
     })
   } else if (optionType.value === 'loading') {
-    loadingOrder({
-      id: form.value.id,
-      loadingServiceProviderId: form.value.loadingServiceProviderId,
-      loadingServiceProviderName: form.value.loadingServiceProviderName,
-    }).then(res => {
+
+       let result = <any>[];
+    if (optionNum.value == 'checkbox') {
+      result = clearanceList.value.map(item => {
+        return {
+          id: item.id,
+          loadingServiceProviderId: form.value.loadingServiceProviderId,
+          loadingServiceProviderName: form.value.loadingServiceProviderName
+        };
+      });
+    }else if (optionNum.value == 'radio') {
+      result = [{
+        id: form.value.id,
+        loadingServiceProviderId: form.value.loadingServiceProviderId,
+        loadingServiceProviderName: form.value.loadingServiceProviderName
+      }]
+    }
+
+    loadingOrder(result).then(res => {
       ElMessage({
         message: "鎻愪氦鎴愬姛锛�",
         type: 'success'
@@ -4194,17 +4236,32 @@
 const handleCustoms = () => {
   title.value = '琛ュ厖濮旀墭鎶ュ叧淇℃伅';
   open.value = true;
-  form.value = selectionList.value[0];
+  form.value = clearanceList.value[0];
   optionType.value = 'customs';
+  optionNum.value = 'checkbox'
   boxFormOption.value = customsOption.value;
 
 }
 
-const handleCustomsAdd = (selectionList) => {
+const handleCustomsAdd = (row) => {
   title.value = '琛ュ厖濮旀墭瑁呭嵏淇℃伅';
+
+   clearanceList.value = [];
+  // 2. 娓呴櫎琛ㄦ牸瑙嗚涓婄殑閫変腑鐘舵��
+  if (crudRef.value) {
+    crudRef.value.clearSelection();
+  }
+
+  // 3. 閲嶇疆琛ㄥ崟
+  form.value = {};
+
+  // 4. 灏嗗綋鍓嶇偣鍑荤殑琛屾暟鎹祴鍊肩粰 form锛岀敤浜庡脊绐楃紪杈�
+  Object.assign(form.value, row);
+
   open.value = true;
-  form.value = selectionList;
   optionType.value = 'loading';
+  optionNum.value = 'radio';
+
   boxFormOption.value = loadingOption.value;
 }
 const handleLoading = () => {
@@ -4212,14 +4269,33 @@
   open.value = true;
   form.value = selectionList.value[0];
   optionType.value = 'loading';
+  optionNum.value = 'checkbox'
   boxFormOption.value = loadingOption.value;
 }
-const handleLoadingAdd = (selectionList) => {
-  title.value = '琛ュ厖濮旀墭瑁呭嵏淇℃伅';
+const handleLoadingAdd = (row: any) => {
+  // 1. 娓呯┖鎵归噺閫変腑鐨勬暟鎹垪琛紝瀵艰嚧椤堕儴鎸夐挳 disabled (length === 0)
+  clearanceList.value = [];
+  // 2. 娓呴櫎琛ㄦ牸瑙嗚涓婄殑閫変腑鐘舵��
+  if (crudRef.value) {
+    crudRef.value.clearSelection();
+  }
+
+  // 3. 閲嶇疆琛ㄥ崟
+  form.value = {};
+
+  // 4. 灏嗗綋鍓嶇偣鍑荤殑琛屾暟鎹祴鍊肩粰 form锛岀敤浜庡脊绐楃紪杈�
+  Object.assign(form.value, row);
+
+  // 5. 璁剧疆寮圭獥閰嶇疆
+  title.value = '琛ュ厖濮旀墭鎶ュ叧淇℃伅';
+  optionType.value = 'customs';
+  optionNum.value = 'radio';
+  boxFormOption.value = customsOption.value;
+
+  // 6. 鎵撳紑寮圭獥
   open.value = true;
-  form.value = selectionList;
-  optionType.value = 'loading';
-  boxFormOption.value = loadingOption.value;
+
+  // 銆愯皟璇曘�戞鏃舵墦鍗帮紝闀垮害搴斾负 0
 }
 const quotationItems = ref();
 const getQuotationItems = async () => {
@@ -4959,7 +5035,7 @@
 const handleOrderTypeChange = (value: any) => {
   // 闃叉 value 涓� null 鎴� undefined 鏃跺嚭閿� (褰撴竻绌洪�夋嫨鏃�)
   if (value === null || value === undefined) {
-     return;
+    return;
   }
 
   option.value.group.forEach((item: any) => {
@@ -4970,7 +5046,7 @@
           cItem.required = !(value == 1);
         });
       }
-      
+
       // 澶勭悊鍗歌揣鐐瑰繀濉鍒�
       if (item.column.receiverId && item.column.receiverId.rules) {
         item.column.receiverId.rules.forEach((cItem: any) => {

--
Gitblit v1.8.0