From 11d7990309ddace2fa600cbeae58e3ab5ac368f9 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期日, 20 九月 2026 19:25:45 +0800
Subject: [PATCH] 新疆-融邦 1. 委外管理:新增合作商档案、委外订单、往来台账三个页面及接口;合作商附件弹框支持直接上传/删除并即时保存。   2. 信托基金与代储台账:客户档案加「信托基金 / 代储金额」并对超限标红提示;销售台账拆「卖油 / 代储」页签,代储走油库+储罐+合同金额,卖油保留产品明细;台账列表加审批状态与超限红字;审批中心显示销售合同号并能下钻台账明细。   3. 储罐号带入库存:储罐信息表单加「是否启用 / 用途 / 租客信息」联动与校验;库存管理、批号明细、入库/出库表单与列表补齐储罐号、油品、物流、过磅等字段展示。   4. 出库即发货与往来备件:出库台账区分「发货单 / 油品出库」两类来源并分别处理详情;新增备件出入库流水页面。   5. 车辆管理与残油联动:新增车辆管理页面;油品出入库表单物流信息顺序调整,车牌/车挂牌号联动只读。   6. 油品出库联动发货台账:发货台账加「发货单号 / 销售合同号」筛选,修复油品出库行批号列取错字段。   7. 采购申请模块:新增采购申请页面及接口。   8. 付款流水组件:抽出公共「付款流水」弹框组件,采购付款分栏、收付款台账与委外往来台账复用。   9. 列调整:收付款台账删除「付款金额 / 退货金额」;委外往来台账删除「回款金额」,并去掉金额列右对齐。

---
 src/views/salesManagement/deliveryLedger/index.vue |  233 +++++++++++++++++++++++-----------------------------------
 1 files changed, 92 insertions(+), 141 deletions(-)

diff --git a/src/views/salesManagement/deliveryLedger/index.vue b/src/views/salesManagement/deliveryLedger/index.vue
index 33fa45f..e8eaeae 100644
--- a/src/views/salesManagement/deliveryLedger/index.vue
+++ b/src/views/salesManagement/deliveryLedger/index.vue
@@ -2,7 +2,17 @@
   <div class="app-container">
     <div class="search_form">
       <el-form :model="searchForm" :inline="true">
-        <el-form-item label="閿�鍞鍗曞彿锛�">
+        <el-form-item label="鍙戣揣鍗曞彿锛�">
+          <el-input
+            v-model="searchForm.shippingNo"
+            placeholder="璇疯緭鍏�"
+            clearable
+            prefix-icon="Search"
+            style="width: 200px"
+            @change="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="閿�鍞悎鍚屽彿锛�">
           <el-input
             v-model="searchForm.salesContractNo"
             placeholder="璇疯緭鍏�"
@@ -15,16 +25,6 @@
         <el-form-item label="杞︾墝鍙凤細">
           <el-input
             v-model="searchForm.shippingCarNumber"
-            placeholder="璇疯緭鍏�"
-            clearable
-            prefix-icon="Search"
-            style="width: 200px"
-            @change="handleQuery"
-          />
-        </el-form-item>
-        <el-form-item label="蹇�掑崟鍙凤細">
-          <el-input
-            v-model="searchForm.expressNumber"
             placeholder="璇疯緭鍏�"
             clearable
             prefix-icon="Search"
@@ -50,17 +50,27 @@
         border
         v-loading="tableLoading"
         @selection-change="handleSelectionChange"
-        :row-key="(row) => row.id"
+        :row-key="(row) => `${row.source || 'shipping'}-${row.stockOutRecordId ?? row.id}`"
         style="width: 100%"
         height="calc(100vh - 21.5em)"
       >
-        <el-table-column align="center" type="selection" width="55" />
-        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
         <el-table-column
-          label="閿�鍞鍗�"
-          prop="salesContractNo"
-          show-overflow-tooltip
+          align="center"
+          type="selection"
+          :selectable="isRowSelectable"
+          width="55"
         />
+        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table-column label="鏉ユ簮" prop="source" align="center" width="100">
+          <template #default="scope">
+            <el-tag
+              :type="isOilOutRow(scope.row) ? 'success' : 'info'"
+              size="small"
+            >
+              {{ isOilOutRow(scope.row) ? "娌瑰搧鍑哄簱" : "鍙戣揣鍗�" }}
+            </el-tag>
+          </template>
+        </el-table-column>
         <el-table-column
           label="鍙戣揣璁㈠崟鍙�"
           prop="shippingNo"
@@ -72,6 +82,16 @@
           show-overflow-tooltip
         />
         <el-table-column
+          label="瀹㈡埛瀵规帴浜�"
+          prop="contactPerson"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="瀵规帴浜虹數璇�"
+          prop="contactPhone"
+          show-overflow-tooltip
+        />
+        <el-table-column
           label="浜у搧鍚嶇О"
           prop="productName"
           show-overflow-tooltip
@@ -79,6 +99,27 @@
         <el-table-column
           label="瑙勬牸鍨嬪彿"
           prop="specificationModel"
+          show-overflow-tooltip
+        />
+        <el-table-column label="鎵瑰彿" show-overflow-tooltip>
+          <!-- 娌瑰搧鍑哄簱琛岀殑鎵瑰彿鏄� outBatchNo锛坆atch_no锛夛紝鍙戣揣鍗曡娌℃湁璇ュ瓧娈� -->
+          <template #default="scope">
+            {{
+              isOilOutRow(scope.row)
+                ? scope.row.outBatchNo || "--"
+                : scope.row.batchNo || "--"
+            }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鍑哄簱绫诲埆"
+          prop="outCategory"
+          show-overflow-tooltip
+        />
+        <el-table-column label="鍌ㄧ綈鍙�" prop="tankNo" show-overflow-tooltip />
+        <el-table-column
+          label="娌瑰簱"
+          prop="oilDepotName"
           show-overflow-tooltip
         />
         <el-table-column
@@ -97,13 +138,8 @@
           show-overflow-tooltip
         />
         <el-table-column
-          label="蹇�掑叕鍙�"
-          prop="expressCompany"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="蹇�掑崟鍙�"
-          prop="expressNumber"
+          label="鍙告満濮撳悕"
+          prop="driverName"
           show-overflow-tooltip
         />
         <el-table-column
@@ -173,21 +209,6 @@
       >
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="鍙戣揣绫诲瀷锛�" prop="type">
-              <el-select
-                v-model="form.type"
-                placeholder="璇烽�夋嫨鍙戣揣绫诲瀷"
-                style="width: 100%"
-                @change="handleShippingTypeChange"
-              >
-                <el-option label="璐ц溅" value="璐ц溅" />
-                <el-option label="蹇��" value="蹇��" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="24">
             <el-form-item label="鍙戣揣鏃ユ湡锛�" prop="shippingDate">
               <el-date-picker
                 style="width: 100%"
@@ -202,31 +223,11 @@
           </el-col>
         </el-row>
         <el-row :gutter="30">
-          <el-col :span="24" v-if="form.type === '璐ц溅'">
+          <el-col :span="24">
             <el-form-item label="鍙戣揣杞︾墝鍙凤細" prop="shippingCarNumber">
               <el-input
                 v-model="form.shippingCarNumber"
                 placeholder="璇疯緭鍏ュ彂璐ц溅鐗屽彿"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="24" v-else>
-            <el-form-item label="蹇�掑叕鍙革細" prop="expressCompany">
-              <el-input
-                v-model="form.expressCompany"
-                placeholder="璇疯緭鍏ュ揩閫掑叕鍙�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30" v-if="form.type === '蹇��'">
-          <el-col :span="24">
-            <el-form-item label="蹇�掑崟鍙凤細" prop="expressNumber">
-              <el-input
-                v-model="form.expressNumber"
-                placeholder="璇疯緭鍏ュ揩閫掑崟鍙�"
                 clearable
               />
             </el-form-item>
@@ -257,14 +258,17 @@
     >
       <div v-if="detailRow" class="detail-wrapper">
         <el-descriptions :column="2" border>
-          <el-descriptions-item label="閿�鍞鍗�">{{
-            detailRow.salesContractNo || "--"
-          }}</el-descriptions-item>
           <el-descriptions-item label="鍙戣揣璁㈠崟鍙�">{{
             detailRow.shippingNo || "--"
           }}</el-descriptions-item>
           <el-descriptions-item label="瀹㈡埛鍚嶇О">{{
             detailRow.customerName || "--"
+          }}</el-descriptions-item>
+          <el-descriptions-item label="瀹㈡埛瀵规帴浜�">{{
+            detailRow.contactPerson || "--"
+          }}</el-descriptions-item>
+          <el-descriptions-item label="瀵规帴浜虹數璇�">{{
+            detailRow.contactPhone || "--"
           }}</el-descriptions-item>
           <el-descriptions-item label="浜у搧鍚嶇О">{{
             detailRow.productName || "--"
@@ -272,8 +276,14 @@
           <el-descriptions-item label="瑙勬牸鍨嬪彿">{{
             detailRow.specificationModel || "--"
           }}</el-descriptions-item>
-          <el-descriptions-item label="鍙戣揣绫诲瀷">{{
-            detailRow.type || "--"
+          <el-descriptions-item label="鍑哄簱绫诲埆">{{
+            detailRow.outCategory || "--"
+          }}</el-descriptions-item>
+          <el-descriptions-item label="鍌ㄧ綈鍙�">{{
+            detailRow.tankNo || "--"
+          }}</el-descriptions-item>
+          <el-descriptions-item label="娌瑰簱">{{
+            detailRow.oilDepotName || "--"
           }}</el-descriptions-item>
           <el-descriptions-item label="鍙戣揣鏃ユ湡">{{
             detailRow.shippingDate || "--"
@@ -284,11 +294,8 @@
           <el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{
             detailRow.shippingCarNumber || "--"
           }}</el-descriptions-item>
-          <el-descriptions-item label="蹇�掑叕鍙�">{{
-            detailRow.expressCompany || "--"
-          }}</el-descriptions-item>
-          <el-descriptions-item label="蹇�掑崟鍙�" :span="2">{{
-            detailRow.expressNumber || "--"
+          <el-descriptions-item label="鍙告満濮撳悕">{{
+            detailRow.driverName || "--"
           }}</el-descriptions-item>
           <el-descriptions-item label="鍑哄簱鍗曞彿" :span="2">{{
             detailRow.outboundBatches || "--"
@@ -321,7 +328,7 @@
           />
           <el-table-column
             label="鍙戣揣鏁伴噺"
-            prop="deliveryQuantity"
+            prop="totalQuantity"
             min-width="120"
             align="center"
           />
@@ -356,7 +363,6 @@
 const tableData = ref([]);
 const selectedRows = ref([]);
 const tableLoading = ref(false);
-const salesOrderOptions = ref([]);
 const page = reactive({
   current: 1,
   size: 100,
@@ -373,46 +379,27 @@
 const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    salesContractNo: "", // 閿�鍞鍗曞彿
+    shippingNo: "", // 鍙戣揣鍗曞彿锛堜袱绫绘潵婧愰兘鍖归厤锛�
+    salesContractNo: "", // 閿�鍞悎鍚屽彿锛堝彧鍖归厤鍙戣揣鍗曡锛�
     shippingCarNumber: "", // 杞︾墝鍙�
-    expressNumber: "", // 蹇�掑崟鍙�
   },
   form: {
     id: null,
-    salesContractNo: "",
     customerName: "",
     specificationModel: "",
     productName: "",
-    type: "璐ц溅", // 璐ц溅, 蹇��
     shippingDate: "",
     shippingCarNumber: "",
-    expressCompany: "",
-    expressNumber: "", // 蹇�掑崟鍙�
   },
   rules: {
-    salesContractNo: [
-      { required: true, message: "璇烽�夋嫨閿�鍞鍗�", trigger: "change" },
-    ],
     customerName: [
       { required: true, message: "璇疯緭鍏ュ鎴峰悕绉�", trigger: "blur" },
     ],
-    type: [{ required: true, message: "璇烽�夋嫨鍙戣揣绫诲瀷", trigger: "change" }],
     shippingDate: [
       { required: true, message: "璇烽�夋嫨鍙戣揣鏃堕棿", trigger: "change" },
     ],
     shippingCarNumber: [
-      {
-        validator: (_, value, callback) =>
-          validateShippingCarNumber(value, callback),
-        trigger: "blur",
-      },
-    ],
-    expressCompany: [
-      {
-        validator: (_, value, callback) =>
-          validateExpressCompany(value, callback),
-        trigger: "blur",
-      },
+      { required: true, message: "璇疯緭鍏ュ彂璐ц溅鐗屽彿", trigger: "blur" },
     ],
   },
 });
@@ -444,19 +431,14 @@
     });
 };
 
-// 閿�鍞鍗曞彉鍖栨椂鑷姩濉厖瀹㈡埛鍚嶇О
-const handleSalesOrderChange = (value) => {
-  const selectedOrder = salesOrderOptions.value.find(
-    (item) => item.salesContractNo === value
-  );
-  if (selectedOrder) {
-    form.value.customerName = selectedOrder.customerName;
-  }
-};
+// 娌瑰搧鍑哄簱琛屾潵鑷� stock_out_record锛宨d 涓� shipping_info 浼氭挒鍙凤紝
+// 鍙戣揣/鍒犻櫎/璇︽儏绛夋帴鍙h儗鍚庨兘鏄� shipping_info锛屼笉鑳界敤浜庤繖绫昏
+const isOilOutRow = (row) => row?.source === "oilOut";
+const isRowSelectable = (row) => !isOilOutRow(row);
 
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
+  selectedRows.value = selection.filter((item) => !isOilOutRow(item));
 };
 
 // 鎵撳紑寮规
@@ -472,13 +454,9 @@
   if (type === "edit" && row) {
     form.value = {
       id: row.id ?? null,
-      salesContractNo: row.salesContractNo ?? "",
       customerName: row.customerName ?? "",
-      type: row.type || "璐ц溅",
       shippingDate: row.shippingDate || getCurrentDate(),
       shippingCarNumber: row.shippingCarNumber ?? "",
-      expressCompany: row.expressCompany ?? "",
-      expressNumber: row.expressNumber ?? "",
     };
     deliveryFileList.value = row.storageBlobVOs || [];
   }
@@ -491,7 +469,8 @@
   detailRow.value = row || null;
   detailProductList.value = [];
   detailDialogVisible.value = true;
-  if (!row?.id) return;
+  // 娌瑰搧鍑哄簱琛屼笉璧板彂璐у崟璇︽儏鎺ュ彛锛坕d 浼氭挒鍙凤級锛岀洿鎺ョ敤鍒楄〃琛屾暟鎹睍绀�
+  if (!row?.id || isOilOutRow(row)) return;
   try {
     const res = await getDeliveryDetail(row.id);
     const detailData = res?.data;
@@ -554,7 +533,9 @@
     productName: item.productName ?? row.productName ?? "--",
     specificationModel:
       item.specificationModel ?? item.model ?? row.specificationModel ?? "--",
-    deliveryQuantity:
+    totalQuantity:
+      item.totalQuantity ??
+      row.totalQuantity ??
       item.deliveryQuantity ??
       item.quantity ??
       item.shippingQuantity ??
@@ -582,14 +563,8 @@
     if (valid) {
       const payload = {
         id: form.value.id,
-        type: form.value.type,
         shippingDate: form.value.shippingDate,
-        shippingCarNumber:
-          form.value.type === "璐ц溅" ? form.value.shippingCarNumber : "",
-        expressCompany:
-          form.value.type === "蹇��" ? form.value.expressCompany : "",
-        expressNumber:
-          form.value.type === "蹇��" ? form.value.expressNumber : "",
+        shippingCarNumber: form.value.shippingCarNumber,
         storageBlobDTOs: deliveryFileList.value || [],
       };
       deductStock(payload).then((res) => {
@@ -680,20 +655,6 @@
     });
 };
 
-// 鍙戣揣绫诲瀷鏍¢獙锛氳揣杞︽椂瑕佹眰杞︾墝锛屽揩閫掓椂瑕佹眰蹇�掑叕鍙�
-const validateShippingCarNumber = (value, callback) => {
-  if (form.value.type === "璐ц溅") {
-    if (!value) return callback(new Error("璇疯緭鍏ュ彂璐ц溅鐗屽彿"));
-  }
-  callback();
-};
-const validateExpressCompany = (value, callback) => {
-  if (form.value.type === "蹇��") {
-    if (!value) return callback(new Error("璇疯緭鍏ュ揩閫掑叕鍙�"));
-  }
-  callback();
-};
-
 // 鍙戣揣鍥剧墖涓婁紶鍓嶆牎妫�
 function handleDeliveryBeforeUpload(file) {
   // 鏍℃鏂囦欢绫诲瀷
@@ -764,16 +725,6 @@
     }
   }
 }
-
-// 鍙戣揣绫诲瀷鍒囨崲鏃舵竻绌哄搴斿瓧娈�
-const handleShippingTypeChange = (val) => {
-  if (val === "璐ц溅") {
-    form.value.expressCompany = "";
-    form.value.expressNumber = "";
-  } else {
-    form.value.shippingCarNumber = "";
-  }
-};
 
 // 鑾峰彇瀹℃牳鐘舵�佹枃鏈�
 const getApprovalStatusText = (status) => {

--
Gitblit v1.9.3