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/inventoryManagement/dispatchLog/Record.vue |  361 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 322 insertions(+), 39 deletions(-)

diff --git a/src/views/inventoryManagement/dispatchLog/Record.vue b/src/views/inventoryManagement/dispatchLog/Record.vue
index 5a056d6..5658104 100644
--- a/src/views/inventoryManagement/dispatchLog/Record.vue
+++ b/src/views/inventoryManagement/dispatchLog/Record.vue
@@ -18,7 +18,7 @@
             </el-form-item>
           </el-col>
           <el-col :span="4">
-            <el-form-item label="浜у搧澶х被"
+            <el-form-item label="娌瑰搧"
                           prop="productName">
               <el-input v-model="searchForm.productName"
                         style="width: 240px"
@@ -102,46 +102,211 @@
                          label="搴忓彿"
                          type="index"
                          width="60" />
-        <el-table-column label="鍑哄簱鎵规"
-                         prop="outboundBatches"
-                         min-width="100"
-                         show-overflow-tooltip />
-        <el-table-column label="鍑哄簱鏃ユ湡"
-                         prop="createTime"
-                         show-overflow-tooltip />
-        <el-table-column label="浜у搧澶х被"
-                         prop="productName"
-                         show-overflow-tooltip />
-        <el-table-column label="瑙勬牸鍨嬪彿"
-                         prop="model"
-                         show-overflow-tooltip />
-        <el-table-column label="鎵瑰彿"
-                         prop="batchNo"
-                         show-overflow-tooltip />
-        <el-table-column label="鍗曚綅"
-                         prop="unit"
-                         show-overflow-tooltip />
-        <el-table-column label="鍑哄簱鏁伴噺"
-                         prop="stockOutNum"
-                         show-overflow-tooltip />
-        <el-table-column label="鍑哄簱浜�"
-                         prop="createBy"
-                         show-overflow-tooltip />
-        <el-table-column label="鏉ユ簮"
-                         prop="recordType"
-                         show-overflow-tooltip>
-          <template #default="scope">
-            {{ getRecordType(scope.row.recordType) }}
-          </template>
+        <el-table-column label="鍑哄簱淇℃伅"
+                         align="center"
+                         :header-cell-style="groupHeaderStyle">
+          <el-table-column label="鍑哄簱鎵规"
+                           prop="outboundBatches"
+                           min-width="120"
+                           show-overflow-tooltip />
+          <el-table-column label="鍑哄簱鏃ユ湡"
+                           prop="outDate"
+                           min-width="110"
+                           show-overflow-tooltip />
+          <el-table-column label="鍑哄簱绫诲埆"
+                           prop="outCategory"
+                           min-width="90"
+                           show-overflow-tooltip />
+          <el-table-column label="娌瑰簱"
+                           prop="oilDepotName"
+                           min-width="160"
+                           show-overflow-tooltip />
+          <el-table-column label="鍌ㄧ綈鍙�"
+                           prop="tankNo"
+                           min-width="90"
+                           show-overflow-tooltip />
+          <el-table-column label="娌瑰搧"
+                           prop="productName"
+                           min-width="90"
+                           show-overflow-tooltip />
+          <el-table-column label="鍑哄簱鍚ㄦ暟(鍚�)"
+                           prop="outTonnage"
+                           min-width="110"
+                           show-overflow-tooltip />
+          <el-table-column label="瑙勬牸鍨嬪彿"
+                           prop="model"
+                           min-width="110"
+                           show-overflow-tooltip />
+          <el-table-column label="鎵瑰彿"
+                           prop="batchNo"
+                           min-width="140"
+                           show-overflow-tooltip />
+          <el-table-column label="鍗曚綅"
+                           prop="unit"
+                           min-width="70"
+                           show-overflow-tooltip />
+          <el-table-column label="鍑哄簱鏁伴噺"
+                           prop="stockOutNum"
+                           min-width="100"
+                           show-overflow-tooltip />
+          <el-table-column label="瀹為檯鎵e噺鏁伴噺"
+                           prop="deductQuantity"
+                           min-width="120"
+                           show-overflow-tooltip />
+          <el-table-column label="鍓╀綑娌归噺(鍚�)"
+                           prop="residualOil"
+                           min-width="110"
+                           show-overflow-tooltip />
+          <el-table-column label="鍑哄簱浜�"
+                           prop="createBy"
+                           min-width="90"
+                           show-overflow-tooltip />
+          <el-table-column label="鍙戣揣鍗曞彿"
+                           prop="shippingNo"
+                           min-width="140"
+                           show-overflow-tooltip />
+          <el-table-column label="鏉ユ簮"
+                           prop="recordType"
+                           min-width="90"
+                           show-overflow-tooltip>
+            <template #default="scope">
+              {{ getRecordType(scope.row.recordType) }}
+            </template>
+          </el-table-column>
+          <el-table-column label="瀹℃壒鐘舵��"
+                           prop="approvalStatus"
+                           min-width="100"
+                           show-overflow-tooltip>
+            <template #default="scope">
+              <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)"
+                      size="small">
+                {{ getApprovalStatusLabel(scope.row.approvalStatus) }}
+              </el-tag>
+            </template>
+          </el-table-column>
         </el-table-column>
-        <el-table-column label="瀹℃壒鐘舵��"
-                         prop="approvalStatus"
-                         show-overflow-tooltip>
+        <el-table-column label="瀹㈡埛淇℃伅"
+                         align="center"
+                         :header-cell-style="groupHeaderStyle">
+          <el-table-column label="瀹㈡埛鍚嶇О"
+                           prop="customerName"
+                           min-width="160"
+                           show-overflow-tooltip />
+          <el-table-column label="瀹㈡埛瀵规帴浜�"
+                           prop="contactPerson"
+                           min-width="100"
+                           show-overflow-tooltip />
+          <el-table-column label="瀵规帴浜虹數璇�"
+                           prop="contactPhone"
+                           min-width="120"
+                           show-overflow-tooltip />
+        </el-table-column>
+        <el-table-column label="鐗╂祦淇℃伅"
+                         align="center"
+                         :header-cell-style="groupHeaderStyle">
+          <el-table-column label="鍙告満濮撳悕"
+                           prop="driverName"
+                           min-width="100"
+                           show-overflow-tooltip />
+          <el-table-column label="鍙告満鐢佃瘽"
+                           prop="driverPhone"
+                           min-width="120"
+                           show-overflow-tooltip />
+          <el-table-column label="鎶艰繍鍛樺鍚�"
+                           prop="escortName"
+                           min-width="100"
+                           show-overflow-tooltip />
+          <el-table-column label="鎶艰繍鍛樼數璇�"
+                           prop="escortPhone"
+                           min-width="120"
+                           show-overflow-tooltip />
+          <el-table-column label="杞︾墝鍙�"
+                           prop="truckPlateNo"
+                           min-width="110"
+                           show-overflow-tooltip />
+          <el-table-column label="杞︽寕鐗屽彿"
+                           prop="trailerPlateNo"
+                           min-width="110"
+                           show-overflow-tooltip />
+        </el-table-column>
+        <el-table-column label="瑁呮补鎿嶄綔淇℃伅"
+                         align="center"
+                         :header-cell-style="groupHeaderStyle">
+          <el-table-column label="瑁呮补妫�楠�"
+                           prop="loadingInspectionStatus"
+                           min-width="90"
+                           show-overflow-tooltip />
+          <el-table-column label="瑁呰溅楣や綅"
+                           prop="loadingCranePosition"
+                           min-width="100"
+                           show-overflow-tooltip />
+          <el-table-column label="瀵嗗害"
+                           prop="density"
+                           min-width="80"
+                           show-overflow-tooltip />
+          <el-table-column label="瑁呮补鎷嶇収"
+                           prop="loadingPhotos"
+                           align="center"
+                           min-width="90">
+            <template #default="scope">
+              <el-image v-if="toPhotoArray(scope.row.loadingPhotos).length"
+                        :src="getPhotoUrl(toPhotoArray(scope.row.loadingPhotos)[0])"
+                        :preview-src-list="getPhotoUrls(scope.row.loadingPhotos)"
+                        preview-teleported
+                        fit="cover"
+                        style="width: 40px; height: 40px; border-radius: 4px" />
+              <span v-else>--</span>
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column label="鍑哄簱杩囩鏁版嵁"
+                         align="center"
+                         :header-cell-style="groupHeaderStyle">
+          <el-table-column label="姣涢噸(鍚�)"
+                           prop="grossWeight"
+                           min-width="90"
+                           show-overflow-tooltip />
+          <el-table-column label="鐨噸(鍚�)"
+                           prop="tareWeight"
+                           min-width="90"
+                           show-overflow-tooltip />
+          <el-table-column label="鍑�閲�(鍚�)"
+                           prop="netWeight"
+                           min-width="90"
+                           show-overflow-tooltip />
+          <el-table-column label="浜忛噺(鍚�)"
+                           prop="lossQuantity"
+                           min-width="90"
+                           show-overflow-tooltip />
+          <el-table-column label="瀹為檯鍑哄簱浣撶Н(鍗�)"
+                           prop="actualVolume"
+                           min-width="130"
+                           show-overflow-tooltip />
+          <el-table-column label="纾呭崟"
+                           prop="poundPhotos"
+                           align="center"
+                           min-width="90">
+            <template #default="scope">
+              <el-image v-if="toPhotoArray(scope.row.poundPhotos).length"
+                        :src="getPhotoUrl(toPhotoArray(scope.row.poundPhotos)[0])"
+                        :preview-src-list="getPhotoUrls(scope.row.poundPhotos)"
+                        preview-teleported
+                        fit="cover"
+                        style="width: 40px; height: 40px; border-radius: 4px" />
+              <span v-else>--</span>
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column fixed="right"
+                         label="鎿嶄綔"
+                         width="110"
+                         align="center">
           <template #default="scope">
-            <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)"
-                    size="small">
-              {{ getApprovalStatusLabel(scope.row.approvalStatus) }}
-            </el-tag>
+            <el-button v-if="isSalesOutRecord(scope.row)"
+                       link
+                       type="primary"
+                       @click="openResidualOil(scope.row)">褰曞叆娈嬫补
+            </el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -152,6 +317,41 @@
                   :limit="page.size"
                   @pagination="paginationChange" />
     </div>
+    <!-- 娈嬫补褰曞叆锛氶�佸畬璐у悗鍥炲~鍓╀綑娌归噺锛屽彧鏇存柊 residualOil 涓�鍒� -->
+    <el-dialog v-model="residualDialogVisible"
+               title="褰曞叆鍓╀綑娌归噺"
+               width="30%"
+               append-to-body>
+      <el-form label-width="130px"
+               label-position="top">
+        <el-form-item label="鍑哄簱鎵规">
+          <el-input :model-value="residualForm.outboundBatches || '--'"
+                    readonly />
+        </el-form-item>
+        <el-form-item label="杞︾墝鍙�">
+          <el-input :model-value="residualForm.truckPlateNo || '--'"
+                    readonly />
+        </el-form-item>
+        <el-form-item label="鍑哄簱鏁伴噺(鍚�)">
+          <el-input :model-value="residualForm.stockOutNum ?? '--'"
+                    readonly />
+        </el-form-item>
+        <el-form-item label="鍓╀綑娌归噺(鍚�)">
+          <el-input-number v-model="residualForm.residualOil"
+                           :precision="4"
+                           :step="1"
+                           :min="0"
+                           style="width: 100%" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary"
+                     @click="submitResidualOil">纭</el-button>
+          <el-button @click="residualDialogVisible = false">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -166,6 +366,7 @@
     delPendingStockOut,
     batchApproveStockOutRecords,
     batchUnapproveStockOutRecords,
+    updateResidualOil,
   } from "@/api/inventoryManagement/stockOut.js";
   import {
     findAllQualifiedStockOutRecordTypeOptions,
@@ -290,6 +491,40 @@
     return "warning";
   };
 
+  // 鍒嗙粍鐖惰〃澶存牱寮忥細鍖哄垎鍚勫垎绫�
+  const groupHeaderStyle = {
+    background: "#e8f3ff",
+    color: "#1d6fd8",
+    fontWeight: "700",
+    fontSize: "13px",
+  };
+
+  // 鐓х墖瀛楁鍚庣瀛樼殑鏄� JSON 瀛楃涓诧紝鍑哄弬闇�鑷瑙f瀽
+  const toPhotoArray = value => {
+    if (!value) {
+      return [];
+    }
+    if (Array.isArray(value)) {
+      return value;
+    }
+    if (typeof value === "string") {
+      try {
+        const parsed = JSON.parse(value);
+        return Array.isArray(parsed) ? parsed : [];
+      } catch (e) {
+        return [];
+      }
+    }
+    return [];
+  };
+
+  const getPhotoUrl = photo =>
+    typeof photo === "string" ? photo : photo?.url || photo?.previewURL || "";
+
+  // 鍥剧墖鍒楋細鍙栧叏閮ㄥ湴鍧�鐢ㄤ簬棰勮
+  const getPhotoUrls = photos =>
+    toPhotoArray(photos).map(getPhotoUrl).filter(Boolean);
+
   // 鑾峰彇鏉ユ簮绫诲瀷閫夐」
   const fetchStockRecordTypeOptions = () => {
     if (props.type === "0") {
@@ -349,6 +584,54 @@
 
   const expandedRowKeys = ref([]);
 
+  // 娈嬫补褰曞叆锛氬彧瀵归攢鍞被鍑哄簱寮�鏀撅紙娈嬫补閾惧彧瀵� outCategory='閿�鍞�' 鐢熸晥锛�
+  const residualDialogVisible = ref(false);
+  const residualForm = ref({
+    id: null,
+    outboundBatches: "",
+    truckPlateNo: "",
+    stockOutNum: null,
+    residualOil: null,
+  });
+
+  const isSalesOutRecord = row => row?.outCategory === "閿�鍞�";
+
+  const openResidualOil = row => {
+    residualForm.value = {
+      id: row.id,
+      outboundBatches: row.outboundBatches || "",
+      truckPlateNo: row.truckPlateNo || "",
+      stockOutNum: row.stockOutNum ?? null,
+      residualOil: row.residualOil ?? null,
+    };
+    residualDialogVisible.value = true;
+  };
+
+  const submitResidualOil = () => {
+    const { id, residualOil, stockOutNum } = residualForm.value;
+    if (residualOil === null || residualOil === undefined || residualOil === "") {
+      proxy.$modal.msgWarning("璇疯緭鍏ュ墿浣欐补閲�");
+      return;
+    }
+    if (Number(residualOil) < 0) {
+      proxy.$modal.msgWarning("鍓╀綑娌归噺涓嶈兘灏忎簬0");
+      return;
+    }
+    if (
+      stockOutNum !== null &&
+      stockOutNum !== undefined &&
+      Number(residualOil) > Number(stockOutNum)
+    ) {
+      proxy.$modal.msgWarning("鍓╀綑娌归噺涓嶈兘澶т簬鍑哄簱鏁伴噺");
+      return;
+    }
+    updateResidualOil(id, { residualOil }).then(() => {
+      proxy.$modal.msgSuccess("褰曞叆鎴愬姛");
+      residualDialogVisible.value = false;
+      getList();
+    });
+  };
+
   const handleBatchApprove = () => {
     if (selectedRows.value.length === 0) {
       proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");

--
Gitblit v1.9.3