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