From 989d2e51cb7295ab79b285f4682d41ae2164a933 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期六, 28 三月 2026 11:08:09 +0800
Subject: [PATCH] feat: 编辑/新增销售台账产品信息数据展示新增
---
src/views/salesManagement/salesLedger/index.vue | 255 +++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 198 insertions(+), 57 deletions(-)
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 8f69d26..6a4f061 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -35,27 +35,30 @@
:bound-route-name="processFlowSelectBoundRouteName"
@confirm="handleProcessFlowSelectConfirm"
/>
- <div>
- <el-button type="primary" @click="openForm('add')">
- 鏂板鍙拌处
- </el-button>
- <el-button type="primary" @click="handleBulkDelivery">
- 鍙戣揣
- </el-button>
- <el-button type="primary" plain @click="handleImport">瀵煎叆</el-button>
- <el-button @click="handleOut">瀵煎嚭</el-button>
- <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
- <el-dropdown @command="handlePrintCommand">
- <el-button type="primary" plain>
- 鎵撳嵃鍗曟嵁<el-icon class="el-icon--right"><ArrowDown /></el-icon>
- </el-button>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item command="finishedProcessCard">鎵撳嵃鐢熶骇娴佺▼鍗★紙鎴愬搧锛�</el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- </div>
+ <el-space wrap>
+ <el-button type="primary" @click="openForm('add')">鏂板鍙拌处</el-button>
+ <el-button type="primary" @click="handleBulkDelivery">鍙戣揣</el-button>
+ <el-button type="primary" plain @click="handleImport">瀵煎叆</el-button>
+ <el-button @click="handleOut">瀵煎嚭</el-button>
+
+ <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+
+ <el-dropdown @command="handlePrintCommand">
+ <el-button type="primary" plain>
+ 鎵撳嵃鍗曟嵁<el-icon class="el-icon--right">
+ <ArrowDown />
+ </el-icon>
+ </el-button>
+ <template #dropdown>
+ <el-dropdown-menu>
+ <el-dropdown-item command="finishedProcessCard">鐢熶骇娴佺▼鍗★紙鎴愬搧锛�</el-dropdown-item>
+ <el-dropdown-item command="salesOrder">閿�鍞鍗�</el-dropdown-item>
+ <el-dropdown-item command="salesDeliveryNote">閿�鍞彂璐у崟</el-dropdown-item>
+ </el-dropdown-menu>
+ </template>
+ </el-dropdown>
+ <el-button type="primary" plain @click="handlePrintLabel">鎵撳嵃鏍囩</el-button>
+ </el-space>
</div>
<el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
:expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" :row-class-name="tableRowClassName" show-summary style="width: 100%"
@@ -65,13 +68,42 @@
<template #default="props">
<el-table :data="props.row.children" border show-summary :summary-method="summarizeChildrenTable">
<el-table-column align="center" label="搴忓彿" type="index"/>
+ <el-table-column label="妤煎眰缂栧彿" prop="floorCode" min-width="100" show-overflow-tooltip />
<el-table-column label="浜у搧澶х被" prop="productCategory" />
<el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
<el-table-column label="鍘氬害" prop="thickness" min-width="90">
<template #default="scope">
{{ scope.row.thickness ?? "" }}
</template>
- </el-table-column>
+ </el-table-column>
+ <el-table-column label="瀹�(mm)" prop="width" min-width="80">
+ <template #default="scope">
+ {{ scope.row.width ?? "" }}
+ </template>
+ </el-table-column>
+ <el-table-column label="楂�(mm)" prop="height" min-width="80">
+ <template #default="scope">
+ {{ scope.row.height ?? "" }}
+ </template>
+ </el-table-column>
+ <el-table-column label="鍛ㄩ暱(cm)" prop="perimeter" min-width="90">
+ <template #default="scope">
+ {{ scope.row.perimeter ?? "" }}
+ </template>
+ </el-table-column>
+ <el-table-column label="鎬婚潰绉�(cm虏)" prop="actualTotalArea" min-width="100">
+ <template #default="scope">
+ {{ scope.row.actualTotalArea ?? "" }}
+ </template>
+ </el-table-column>
+ <el-table-column label="鍔犲伐瑕佹眰" prop="processRequirement" min-width="120"
+ show-overflow-tooltip />
+ <el-table-column label="澶囨敞" prop="remark" min-width="120" show-overflow-tooltip />
+ <el-table-column label="閲嶇" prop="heavyBox" min-width="80">
+ <template #default="scope">
+ {{ scope.row.heavyBox ?? "" }}
+ </template>
+ </el-table-column>
<el-table-column label="浜у搧鐘舵��"
width="100px"
align="center">
@@ -255,6 +287,21 @@
<el-table-column label="鍘氬害" prop="thickness" min-width="90">
<template #default="scope">
{{ scope.row.thickness ?? "" }}
+ </template>
+ </el-table-column>
+ <el-table-column label="瀹�(mm)" prop="width" min-width="80">
+ <template #default="scope">
+ {{ scope.row.width ?? "" }}
+ </template>
+ </el-table-column>
+ <el-table-column label="楂�(mm)" prop="height" min-width="80">
+ <template #default="scope">
+ {{ scope.row.height ?? "" }}
+ </template>
+ </el-table-column>
+ <el-table-column label="闈㈢Н(m虏)" prop="actualTotalArea" min-width="100">
+ <template #default="scope">
+ {{ scope.row.actualTotalArea ?? "" }}
</template>
</el-table-column>
<el-table-column label="鏁伴噺" prop="quantity" />
@@ -577,7 +624,7 @@
style="width: 100%"
placeholder="璇疯緭鍏�"
clearable
- @change="recalcAreaTotals"
+ @change="() => { recalcAreaTotals(); calculateFromUnitPrice(true); }"
/>
</el-form-item>
</el-col>
@@ -890,12 +937,18 @@
saleProcessBind,
getSaleProcessBindInfo,
getProcessCard,
+ getSalesOrder,
+ getSalesInvoices,
+ getSalesLabel,
} from "@/api/salesManagement/salesLedger.js";
import { modelList, productTreeList } from "@/api/basicData/product.js";
import useFormData from "@/hooks/useFormData.js";
import dayjs from "dayjs";
import { getCurrentDate } from "@/utils/index.js";
import { printFinishedProcessCard } from "./components/processCardPrint.js";
+import { printSalesOrder } from "./components/salesOrderPrint.js";
+import { printSalesDeliveryNote } from "./components/salesDeliveryPrint.js";
+import { printSalesLabel } from "./components/salesLabelPrint.js";
// import { salesLedgerProductSetProcessFlowConfig } from "@/api/salesManagement/salesProcessFlowConfig.js";
const userStore = useUserStore();
@@ -1640,8 +1693,9 @@
productData.value = products.map((p) => {
const quantity = Number(p.quantity ?? 0) || 0;
const unitPrice = Number(p.unitPrice ?? 0) || 0;
+ const settlePieceArea = Number(p.settlePieceArea ?? 0) || 1;
const taxRate = "13"; // 榛樿 13%锛屼究浜庣洿鎺ユ彁浜わ紙濡傞渶鍙湪浜у搧涓嚜琛屼慨鏀癸級
- const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
+ const taxInclusiveTotalPrice = (unitPrice * settlePieceArea * quantity).toFixed(2);
const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(taxInclusiveTotalPrice, taxRate);
return {
// 鍙拌处瀛楁
@@ -2023,27 +2077,114 @@
};
const handlePrintCommand = async (command) => {
- if (command !== "finishedProcessCard") return;
- if (selectedRows.value.length !== 1) {
+ if (command !== "finishedProcessCard" && command !== "salesOrder" && command !== "salesDeliveryNote") return;
+ if (command === "salesDeliveryNote") {
+ if (selectedRows.value.length === 0) {
+ proxy.$modal.msgWarning("璇疯嚦灏戦�夋嫨涓�鏉¢攢鍞彴璐︽暟鎹繘琛屾墦鍗�");
+ return;
+ }
+ const customerNames = Array.from(
+ new Set(selectedRows.value.map((item) => String(item?.customerName ?? "").trim()))
+ );
+ if (customerNames.length > 1) {
+ proxy.$modal.msgWarning("浠呮敮鎸佺浉鍚屽鎴峰悕绉扮殑閿�鍞彴璐﹀悎骞跺彂璐ф墦鍗�");
+ return;
+ }
+ } else if (selectedRows.value.length !== 1) {
proxy.$modal.msgWarning("璇烽�夋嫨涓�鏉¢攢鍞彴璐︽暟鎹繘琛屾墦鍗�");
return;
}
const selectedRow = selectedRows.value[0];
const selectedId = selectedRow?.id;
+ if (command === "salesDeliveryNote") {
+ const selectedIds = selectedRows.value
+ .map((item) => item?.id)
+ .filter((id) => id !== null && id !== undefined && id !== "");
+ if (selectedIds.length !== selectedRows.value.length) {
+ proxy.$modal.msgWarning("褰撳墠閫夋嫨鏁版嵁瀛樺湪缂哄皯ID鐨勮褰曪紝鏃犳硶鎵撳嵃");
+ return;
+ }
+ const loadingText =
+ command === "salesOrder"
+ ? "姝e湪鑾峰彇閿�鍞鍗曟暟鎹紝璇风◢鍊�..."
+ : command === "salesDeliveryNote"
+ ? "姝e湪鑾峰彇閿�鍞彂璐у崟鏁版嵁锛岃绋嶅��..."
+ : "姝e湪鑾峰彇鐢熶骇娴佺▼鍗℃暟鎹紝璇风◢鍊�...";
+ proxy.$modal.loading(loadingText);
+ try {
+ const res = await getSalesInvoices(selectedIds);
+ const salesInvoiceData = res?.data ?? {};
+ printSalesDeliveryNote(salesInvoiceData, selectedRow);
+ } catch (error) {
+ console.error("鎵撳嵃閿�鍞彂璐у崟澶辫触:", error);
+ proxy.$modal.msgError("鎵撳嵃澶辫触锛岃绋嶅悗閲嶈瘯");
+ } finally {
+ proxy.$modal.closeLoading();
+ }
+ return;
+ }
if (!selectedId) {
proxy.$modal.msgWarning("褰撳墠閫夋嫨鏁版嵁缂哄皯ID锛屾棤娉曟墦鍗�");
return;
}
- proxy.$modal.loading("姝e湪鑾峰彇鐢熶骇娴佺▼鍗℃暟鎹紝璇风◢鍊�...");
+ const loadingText =
+ command === "salesOrder"
+ ? "姝e湪鑾峰彇閿�鍞鍗曟暟鎹紝璇风◢鍊�..."
+ : command === "salesDeliveryNote"
+ ? "姝e湪鑾峰彇閿�鍞彂璐у崟鏁版嵁锛岃绋嶅��..."
+ : "姝e湪鑾峰彇鐢熶骇娴佺▼鍗℃暟鎹紝璇风◢鍊�...";
+ proxy.$modal.loading(loadingText);
try {
- const res = await getProcessCard(selectedId);
- const processCardData = res?.data ?? {};
- printFinishedProcessCard(processCardData);
+ if (command === "salesOrder") {
+ const res = await getSalesOrder(selectedId);
+ const salesOrderData = res?.data ?? {};
+ printSalesOrder(salesOrderData);
+ } else {
+ const res = await getProcessCard(selectedId);
+ const processCardData = res?.data ?? {};
+ printFinishedProcessCard(processCardData);
+ }
} catch (error) {
- console.error("鎵撳嵃鐢熶骇娴佺▼鍗″け璐�:", error);
+ console.error(
+ command === "salesOrder"
+ ? "鎵撳嵃閿�鍞鍗曞け璐�:"
+ : command === "salesDeliveryNote"
+ ? "鎵撳嵃閿�鍞彂璐у崟澶辫触:"
+ : "鎵撳嵃鐢熶骇娴佺▼鍗″け璐�:",
+ error
+ );
proxy.$modal.msgError("鎵撳嵃澶辫触锛岃绋嶅悗閲嶈瘯");
+ } finally {
+ proxy.$modal.closeLoading();
+ }
+};
+
+const handlePrintLabel = async () => {
+ if (selectedRows.value.length !== 1) {
+ proxy.$modal.msgWarning("璇烽�夋嫨涓�鏉¢攢鍞彴璐︽暟鎹繘琛屾爣绛炬墦鍗�");
+ return;
+ }
+
+ const selectedId = selectedRows.value[0]?.id;
+ if (!selectedId) {
+ proxy.$modal.msgWarning("褰撳墠閫夋嫨鏁版嵁缂哄皯ID锛屾棤娉曟墦鍗版爣绛�");
+ return;
+ }
+
+ proxy.$modal.loading("姝e湪鑾峰彇鏍囩鏁版嵁锛岃绋嶅��...");
+ try {
+ const res = await getSalesLabel(selectedId);
+ const labelList = res?.data ?? [];
+ if (!Array.isArray(labelList) || labelList.length === 0) {
+ proxy.$modal.msgWarning("鏆傛棤鍙墦鍗版爣绛炬暟鎹�");
+ return;
+ }
+ printSalesLabel(labelList);
+ } catch (error) {
+ console.error("鎵撳嵃鏍囩澶辫触:", error);
+ proxy.$modal.msgError("鎵撳嵃鏍囩澶辫触锛岃绋嶅悗閲嶈瘯");
} finally {
proxy.$modal.closeLoading();
}
@@ -2057,10 +2198,11 @@
if (!productForm.value.quantity) {
return;
}
- // 鍚◣鎬讳环璁$畻
+ const settlePieceArea = parseFloat(productForm.value.settlePieceArea) || 1;
+ // 鍚◣鎬讳环璁$畻 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺
productForm.value.taxInclusiveTotalPrice =
proxy.calculateTaxIncludeTotalPrice(
- productForm.value.taxInclusiveUnitPrice,
+ productForm.value.taxInclusiveUnitPrice * settlePieceArea,
productForm.value.quantity
);
if (productForm.value.taxRate) {
@@ -2123,15 +2265,12 @@
const computed = Number(computedPieceArea.toFixed(5));
productForm.value.actualPieceArea = computed;
-
- // settlePieceArea锛氳嫢鐢ㄦ埛鏈~鍐�/涓�0锛屽垯榛樿浣跨敤瀹介珮璁$畻鍊�
- const settlePieceRaw = Number(productForm.value.settlePieceArea ?? 0) || 0;
- if (!settlePieceRaw) {
- productForm.value.settlePieceArea = computed;
- }
+ productForm.value.settlePieceArea = computed;
recalcPerimeterFromWidthHeight();
recalcAreaTotals();
+ // 闈㈢Н鏇存柊鍚庯紝閲嶆柊璁$畻鍚◣鎬讳环 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺
+ calculateFromUnitPrice(true);
};
// 鏍规嵁鍚◣鎬讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
@@ -2198,19 +2337,20 @@
return;
}
if (isCalculating.value) return;
-
+
const quantity = parseFloat(productForm.value.quantity);
const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice);
-
+ const settlePieceArea = parseFloat(productForm.value.settlePieceArea) || 1;
+
if (!quantity || quantity <= 0 || !unitPrice) {
return;
}
-
+
isCalculating.value = true;
-
- // 璁$畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
-
+
+ // 璁$畻鍚◣鎬讳环 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺
+ productForm.value.taxInclusiveTotalPrice = (unitPrice * settlePieceArea * quantity).toFixed(2);
+
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
productForm.value.taxExclusiveTotalPrice =
@@ -2219,30 +2359,31 @@
productForm.value.taxRate
);
}
-
+
isCalculating.value = false;
};
// 鏍规嵁鍚◣鍗曚环鍙樺寲璁$畻鎬讳环
-const calculateFromUnitPrice = () => {
+const calculateFromUnitPrice = (silent = false) => {
if (!productForm.value.taxRate) {
- proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+ if (!silent) proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
return;
}
if (isCalculating.value) return;
-
+
const quantity = parseFloat(productForm.value.quantity);
const unitPrice = parseFloat(productForm.value.taxInclusiveUnitPrice);
-
+ const settlePieceArea = parseFloat(productForm.value.settlePieceArea) || 1;
+
if (!quantity || quantity <= 0 || !unitPrice) {
return;
}
-
+
isCalculating.value = true;
-
- // 璁$畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
-
+
+ // 璁$畻鍚◣鎬讳环 = 鍗曚环 * 缁撶畻闈㈢Н * 鏁伴噺
+ productForm.value.taxInclusiveTotalPrice = (unitPrice * settlePieceArea * quantity).toFixed(2);
+
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
productForm.value.taxExclusiveTotalPrice =
@@ -2251,7 +2392,7 @@
productForm.value.taxRate
);
}
-
+
isCalculating.value = false;
};
--
Gitblit v1.9.3