From c7ac44a1004dcf791fe7282368f1f657e035c961 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 13 五月 2026 11:37:26 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_NEW_pro' into dev_NEW_pro
---
src/views/salesManagement/returnOrder/components/detailDia.vue | 245 ++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 220 insertions(+), 25 deletions(-)
diff --git a/src/views/salesManagement/returnOrder/components/detailDia.vue b/src/views/salesManagement/returnOrder/components/detailDia.vue
index 9ff4e89..e4a69f3 100644
--- a/src/views/salesManagement/returnOrder/components/detailDia.vue
+++ b/src/views/salesManagement/returnOrder/components/detailDia.vue
@@ -10,8 +10,8 @@
<el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detail.customerName }}</el-descriptions-item>
<el-descriptions-item label="閿�鍞崟鍙�">{{ detail.salesContractNo }}</el-descriptions-item>
<el-descriptions-item label="涓氬姟鍛�">{{ detail.salesman }}</el-descriptions-item>
- <el-descriptions-item label="鍏宠仈鍑哄簱鍗曞彿">{{ detail.shippingNo }}</el-descriptions-item>
- <el-descriptions-item label="椤圭洰鍚嶇О">{{ detail.projectName }}</el-descriptions-item>
+ <el-descriptions-item label="鍏宠仈鍙戣揣鍗曞彿">{{ detail.shippingNo }}</el-descriptions-item>
+ <!-- <el-descriptions-item label="椤圭洰鍚嶇О">{{ detail.projectName }}</el-descriptions-item> -->
<el-descriptions-item label="鍒跺崟浜�">{{ detail.maker }}</el-descriptions-item>
<el-descriptions-item label="鍒跺崟鏃堕棿">{{ detail.makeTime }}</el-descriptions-item>
<el-descriptions-item label="閫�璐у師鍥�">{{ detail.returnReason }}</el-descriptions-item>
@@ -41,11 +41,206 @@
const tableData = ref([]);
const availableProducts = ref([]);
+const sameKey = (a, b) => a != null && b != null && String(a) === String(b);
+
+/** 涓� formDia 涓�鑷达細涓や唤鍒楄〃鎸� id 鍚堝苟锛岄伩鍏嶅彧鍙� productDtoData 鏃剁己鍑哄簱鍗曞彿/鎵规/鏁伴噺 */
+const mergeShippingProductLists = (data) => {
+ const lists = [data?.shippingProductVoList, data?.productDtoData].filter(Array.isArray);
+ if (!lists.length) return [];
+ const map = new Map();
+ for (const list of lists) {
+ for (const p of list) {
+ if (p == null) continue;
+ const key = p.id != null ? String(p.id) : null;
+ if (!key) continue;
+ const prev = map.get(key);
+ map.set(key, prev ? { ...prev, ...p } : { ...p });
+ }
+ }
+ return Array.from(map.values());
+};
+
+const pickShippingLine = (normalized) => {
+ const pid = normalized?.returnSaleLedgerProductId ?? normalized?.id;
+ const sid = normalized?.stockOutRecordId ?? normalized?.shippingProductId;
+ const direct = availableProducts.value.find(
+ (p) =>
+ sameKey(p?.id, pid) ||
+ sameKey(p?.stockOutRecordId, pid) ||
+ sameKey(p?.id, sid) ||
+ sameKey(p?.stockOutRecordId, sid)
+ );
+ if (direct) return direct;
+ const pmid = normalized?.productModelId;
+ if (pmid == null || pmid === "") return undefined;
+ const candidates = availableProducts.value.filter((p) => sameKey(p?.productModelId, pmid));
+ if (!candidates.length) return undefined;
+ if (candidates.length === 1) return candidates[0];
+ const spec = String(normalized?.specificationModel ?? normalized?.model ?? "");
+ if (spec) {
+ const hit = candidates.find((p) => {
+ const ps = String(p?.specificationModel ?? p?.model ?? "");
+ return ps && ps === spec;
+ });
+ if (hit) return hit;
+ }
+ return candidates[0];
+};
+
+const isEmptyText = (v) => v === "" || v == null || v === undefined;
+
+const firstFiniteNumber = (...vals) => {
+ for (const v of vals) {
+ if (v === "" || v == null || v === undefined) continue;
+ const n = Number(v);
+ if (Number.isFinite(n)) return n;
+ }
+ return undefined;
+};
+
+const firstNonEmptyText = (...vals) => {
+ const hit = vals.find((v) => !isEmptyText(v));
+ return hit === undefined ? "" : hit;
+};
+
+/** 璇︽儏琛ㄧ敤 productName / model锛涘悎骞舵椂鍕胯绌轰覆鐩栨帀鍑哄簱琛屽瓧娈� */
+const mergeDetailProductRow = (product, normalized) => {
+ const row = { ...product, ...normalized };
+ row.outboundBatches = firstNonEmptyText(
+ row.outboundBatches,
+ product?.outboundBatches,
+ product?.shippingNo,
+ product?.outboundNo,
+ normalized?.outboundBatches,
+ normalized?.outboundNo,
+ normalized?.shippingNo
+ );
+ row.batchNo = firstNonEmptyText(
+ row.batchNo,
+ product?.batchNo,
+ product?.batchNumber,
+ product?.lotNo,
+ product?.batchCode,
+ product?.shippingBatchNo,
+ normalized?.batchNo,
+ normalized?.batchNumber,
+ normalized?.lotNo,
+ normalized?.shippingBatchNo
+ );
+ const stock = firstFiniteNumber(
+ row.stockOutNum,
+ product?.stockOutNum,
+ product?.totalQuantity,
+ product?.shippingQuantity,
+ product?.deliveryQuantity,
+ product?.quantity,
+ product?.outQuantity,
+ normalized?.stockOutNum,
+ normalized?.totalQuantity,
+ normalized?.shippingQuantity,
+ normalized?.deliveryQuantity
+ );
+ if (stock !== undefined) row.stockOutNum = stock;
+ const un = firstFiniteNumber(
+ row.unQuantity,
+ product?.unQuantity,
+ product?.remainingQuantity,
+ product?.noReturnQuantity,
+ product?.canReturnQuantity,
+ product?.availableReturnNum,
+ normalized?.unQuantity,
+ normalized?.remainingQuantity,
+ normalized?.noReturnQuantity,
+ normalized?.canReturnQuantity
+ );
+ if (un !== undefined) row.unQuantity = un;
+ else {
+ const s = Number(row.stockOutNum);
+ const ret = Number(row.totalReturnNum ?? 0);
+ if (Number.isFinite(s) && s >= 0 && Number.isFinite(ret) && ret >= 0) {
+ row.unQuantity = Math.max(0, s - ret);
+ }
+ }
+ const returned = firstFiniteNumber(
+ row.totalReturnNum,
+ product?.totalReturnNum,
+ product?.totalReturnedNum,
+ normalized?.totalReturnNum,
+ normalized?.totalReturnedNum
+ );
+ if (returned !== undefined) row.totalReturnNum = returned;
+ else if (isEmptyText(row.totalReturnNum)) row.totalReturnNum = 0;
+ if (isEmptyText(row.unit)) {
+ row.unit = firstNonEmptyText(product?.unit, normalized?.unit);
+ }
+ row.productName = firstNonEmptyText(
+ row.productName,
+ normalized?.productName,
+ normalized?.productCategory,
+ product?.productName,
+ product?.productCategory
+ );
+ row.model = firstNonEmptyText(
+ row.model,
+ normalized?.model,
+ normalized?.specificationModel,
+ product?.model,
+ product?.specificationModel
+ );
+ return row;
+};
+
+const normalizeDetailRow = (raw) => {
+ const ledgerId =
+ raw?.returnSaleLedgerProductId ??
+ raw?.saleLedgerProductId ??
+ raw?.stockOutRecordId ??
+ raw?.shippingProductId;
+ const productId = ledgerId ?? raw?.id;
+ const num = Number(raw?.num ?? raw?.returnQuantity ?? 0);
+ return {
+ ...raw,
+ id: productId,
+ returnSaleLedgerProductId: productId,
+ productModelId: raw?.productModelId,
+ stockOutRecordId: raw?.stockOutRecordId,
+ shippingProductId: raw?.shippingProductId,
+ productName: raw?.productName ?? raw?.productCategory ?? raw?.productTypeName ?? "",
+ model: raw?.model ?? raw?.specificationModel ?? raw?.specModel ?? "",
+ outboundBatches: raw?.outboundBatches ?? raw?.outboundNo ?? raw?.shippingNo,
+ batchNo:
+ raw?.batchNo ??
+ raw?.batchNumber ??
+ raw?.lotNo ??
+ raw?.batchCode ??
+ raw?.shippingBatchNo,
+ stockOutNum:
+ raw?.stockOutNum ??
+ raw?.totalQuantity ??
+ raw?.shippingQuantity ??
+ raw?.deliveryQuantity ??
+ raw?.quantity,
+ totalReturnNum: raw?.totalReturnNum ?? raw?.totalReturnedNum,
+ unQuantity:
+ raw?.unQuantity ??
+ raw?.remainingQuantity ??
+ raw?.noReturnQuantity ??
+ raw?.canReturnQuantity,
+ returnQuantity: Number.isFinite(num) ? num : 0,
+ price: Number(raw?.taxInclusiveUnitPrice ?? raw?.price ?? 0),
+ amount: Number(raw?.amount ?? 0).toFixed(2),
+ isQuality: raw?.isQuality ?? 2,
+ remark: raw?.remark ?? "",
+ };
+};
+
const tableColumn = [
- {align: "center", label: "浜у搧澶х被", prop: "productCategory"},
- {align: "center", label: "瑙勬牸鍨嬪彿", prop: "specificationModel"},
+ {align: "center", label: "鍑哄簱鍗曞彿", prop: "outboundBatches"},
+ {align: "center", label: "鎵规鍙�", prop: "batchNo"},
+ {align: "center", label: "浜у搧澶х被", prop: "productName"},
+ {align: "center", label: "瑙勬牸鍨嬪彿", prop: "model"},
{align: "center", label: "鍗曚綅", prop: "unit", width: 80},
- {align: "center", label: "鎬绘暟閲�", prop: "quantity", width: 120},
+ {align: "center", label: "鎬绘暟閲�", prop: "stockOutNum", width: 120},
{align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120},
{align: "center", label: "鏈��璐ф暟閲�", prop: "unQuantity", width: 120},
{align: "center", label: "閫�璐ф暟閲�", prop: "returnQuantity", width: 120},
@@ -82,30 +277,30 @@
if (detail.value.shippingId) {
const productRes = await returnManagementGetByShippingId({ shippingId: detail.value.shippingId });
if (productRes.code === 200) {
- availableProducts.value = productRes.data.productDtoData || [];
+ availableProducts.value = mergeShippingProductLists(productRes.data);
}
}
-
+
const list =
detail.value?.returnSaleProducts ||
- detail.value?.returnSaleProductList ||
- detail.value?.returnSaleProductDtoData ||
- [];
-
- tableData.value = Array.isArray(list) ? list.map(raw => {
- const productId = raw?.returnSaleLedgerProductId ?? raw?.saleLedgerProductId ?? raw?.id;
- const product = availableProducts.value.find((p) => p.id === productId);
- const normalized = {
- ...raw,
- id: productId,
- returnQuantity: Number(raw?.num ?? raw?.returnQuantity ?? 0),
- price: Number(raw?.taxInclusiveUnitPrice ?? raw?.price ?? 0),
- amount: Number(raw?.amount ?? 0).toFixed(2),
- isQuality: raw?.isQuality ?? 2,
- remark: raw?.remark ?? "",
- };
- return product ? { ...product, ...normalized } : normalized;
- }) : [];
+ detail.value?.returnSaleProductList ||
+ detail.value?.returnSaleProductDtoData ||
+ [];
+
+ tableData.value = Array.isArray(list)
+ ? list.map((raw) => {
+ const normalized = normalizeDetailRow(raw);
+ const product = pickShippingLine(normalized);
+ return product ? mergeDetailProductRow(product, normalized) : normalized;
+ })
+ : [];
+
+ const headerShipNo = detail.value?.shippingNo;
+ if (headerShipNo && Array.isArray(tableData.value) && tableData.value.length) {
+ tableData.value = tableData.value.map((r) =>
+ isEmptyText(r.outboundBatches) ? { ...r, outboundBatches: headerShipNo } : r
+ );
+ }
} catch (e) {
console.error("Failed to load detail", e);
} finally {
--
Gitblit v1.9.3