From 0ce4aec75d87508cece9437be816e057ea433765 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期一, 03 八月 2026 11:50:24 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_pro_河南鹤壁' into dev_pro_河南鹤壁
---
src/views/salesManagement/salesLedger/index.vue | 565 ++++++++++++++++----------------------------------------
1 files changed, 164 insertions(+), 401 deletions(-)
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index d40b1bf..9362a18 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -249,7 +249,7 @@
<el-button link
type="primary"
@click="openFileDialog(scope.row)">闄勪欢
- </el-button>
+ </el-button> <!--downloadOrder(scope.row.id) 涓嬭浇-->
</template>
</el-table-column>
</el-table>
@@ -329,7 +329,7 @@
:label="item.customerName"
:value="item.id">
{{
- item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber
+ item.taxpayerIdentificationNumber ? item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber : item.customerName
}}
</el-option>
</el-select>
@@ -378,7 +378,7 @@
:reserve-keyword="false"
placeholder="璇烽�夋嫨"
clearable
- :disabled="operationType === 'view'"
+ disabled
@change="changs">
<el-option v-for="item in userList"
:key="item.userId"
@@ -566,7 +566,7 @@
width="160"
align="right">
<template #default="scope">
- {{ Number(scope.row.totalAmount ?? 0).toFixed(2) }}
+ {{ formatDecimal(scope.row.totalAmount) }}
</template>
</el-table-column>
<el-table-column fixed="right"
@@ -604,35 +604,22 @@
:rules="productRules"
ref="productFormRef">
<el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="浜у搧澶х被锛�"
- prop="productCategory">
- <el-tree-select v-model="productForm.productCategory"
- placeholder="璇烽�夋嫨"
- clearable
- filterable
- check-strictly
- @change="getModels"
- :data="productOptions"
- :render-after-expand="false"
- style="width: 100%" />
+ <el-col :span="12">
+ <el-form-item label="浜у搧澶х被锛�" prop="productCategory">
+ <el-input v-model="productForm.productCategory"
+ placeholder="鐐瑰嚮閫夋嫨"
+ readonly
+ @click="showProductSelectDialog = true"
+ style="cursor:pointer" />
</el-form-item>
</el-col>
- </el-row>
- <el-row :gutter="30">
- <el-col :span="24">
- <el-form-item label="瑙勬牸鍨嬪彿锛�"
- prop="productModelId">
- <el-select v-model="productForm.productModelId"
- placeholder="璇烽�夋嫨"
- clearable
- @change="getProductModel"
- filterable>
- <el-option v-for="item in modelOptions"
- :key="item.id"
- :label="item.model"
- :value="item.id" />
- </el-select>
+ <el-col :span="12">
+ <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
+ <el-input v-model="productForm.specificationModel"
+ placeholder="鐐瑰嚮閫夋嫨"
+ readonly
+ @click="showProductSelectDialog = true"
+ style="cursor:pointer" />
</el-form-item>
</el-col>
</el-row>
@@ -664,11 +651,11 @@
<el-col :span="12">
<el-form-item label="鍚◣鍗曚环(鍏�)锛�"
prop="taxInclusiveUnitPrice">
- <el-input-number :step="0.01"
+ <el-input-number :step="0.000001"
:min="0"
v-model="productForm.taxInclusiveUnitPrice"
style="width: 100%"
- :precision="2"
+ :precision="6"
placeholder="璇疯緭鍏�"
clearable
@change="calculateFromUnitPrice" />
@@ -722,20 +709,44 @@
</el-select>
</el-form-item>
</el-col>
-<!-- <el-col :span="12">
+ <el-col :span="12">
<el-form-item label="鏄惁鐢熶骇锛�"
prop="isProduction">
+ <div style="display: flex; align-items: center; width: 100%;">
<el-radio-group v-model="productForm.isProduction">
<el-radio label="鏄�"
:value="true" />
<el-radio label="鍚�"
:value="false" />
</el-radio-group>
+ <div
+ v-if="currentStock !== null"
+ :style="{
+ marginLeft: '20px',
+ padding: '0 12px',
+ height: '28px',
+ lineHeight: '28px',
+ borderRadius: '4px',
+ fontSize: '13px',
+ fontWeight: '500',
+ display: 'inline-block',
+ whiteSpace: 'nowrap',
+ backgroundColor: (productForm.quantity || 0) > currentStock ? '#fff0f0' : '#f0f9eb',
+ border: (productForm.quantity || 0) > currentStock ? '1px solid #ffcccc' : '1px solid #e1f3d8',
+ color: (productForm.quantity || 0) > currentStock ? '#f56c6c' : '#67c23a'
+ }"
+ >
+ <span>褰撳墠搴撳瓨锛歿{ currentStock }} {{ productForm.unit || '' }}</span>
+ </div>
+ </div>
</el-form-item>
- </el-col>-->
+ </el-col>
</el-row>
</el-form>
</FormDialog>
+ <ProductSelectDialog v-model="showProductSelectDialog"
+ @confirm="handleProductSelect"
+ single />
<!-- 瀵煎叆寮圭獥 -->
<FormDialog v-model="importUpload.open"
:title="importUpload.title"
@@ -1017,6 +1028,7 @@
<template #footer>
<div class="dialog-footer">
<el-button type="primary"
+ :loading="deliveryLoading"
@click="submitDelivery">纭鍙戣揣
</el-button>
<el-button @click="closeDeliveryDia">鍙栨秷</el-button>
@@ -1047,13 +1059,21 @@
delProduct,
delLedgerFile,
getProductInventory,
+ getPrintData,
} from "@/api/salesManagement/salesLedger.js";
+ import { downloadSalesJpg, printSalesMulti } from "@/utils/documentPrint.js";
import { getStockInventoryByModelId } from "@/api/inventoryManagement/stockInventory.js";
import { modelList, productTreeList } from "@/api/basicData/product.js";
import useFormData from "@/hooks/useFormData.js";
import dayjs from "dayjs";
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+ import {
+ tableAmountFormatter,
+ formatDecimal,
+ buildAmountSummaryFormat,
+ } from "@/utils/numberFormat";
import ImageUpload from "@/components/AttachmentUpload/image/index.vue";
+ import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
import { getCurrentDate } from "@/utils/index.js";
import { listCustomer } from "@/api/basicData/customer.js";
@@ -1082,6 +1102,7 @@
const total = ref(0);
const fileList = ref([]);
const deliveryFileList = ref([]);
+ const showProductSelectDialog = ref(false);
// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
const operationType = ref("");
@@ -1124,7 +1145,9 @@
const currentId = ref("");
const productFormData = reactive({
productForm: {
+ productId: "",
productCategory: "",
+ productModelId: "",
specificationModel: "",
unit: "",
quantity: "",
@@ -1136,11 +1159,8 @@
isProduction: false,
},
productRules: {
- productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
- specificationModel: [
- { required: true, message: "璇烽�夋嫨", trigger: "change" },
- ],
+ productCategory: [{ required: true, message: "璇烽�夋嫨浜у搧澶х被", trigger: "change" }],
+ productModelId: [{ required: true, message: "璇烽�夋嫨瑙勬牸鍨嬪彿", trigger: "change" }],
unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
taxInclusiveUnitPrice: [
@@ -1182,6 +1202,7 @@
// 鍙戣揣鐩稿叧
const deliveryFormVisible = ref(false);
+ const deliveryLoading = ref(false);
const currentDeliveryRow = ref(null);
const getDeliveryBatchQuantity = item => {
const quantity =
@@ -1192,6 +1213,27 @@
item?.qualifiedQuantity ??
item?.stockQuantity;
return quantity ?? 0;
+ };
+ const currentStock = ref(null);
+ const fetchCurrentStock = async (productModelId) => {
+ if (!productModelId) {
+ currentStock.value = null;
+ return;
+ }
+ try {
+ const res = await getStockInventoryByModelId(productModelId);
+ const rawList = Array.isArray(res?.data)
+ ? res.data
+ : res?.data?.records || res?.data?.rows || [];
+ let total = 0;
+ rawList.forEach(item => {
+ total += Number(getDeliveryBatchQuantity(item) || 0);
+ });
+ currentStock.value = total;
+ } catch (e) {
+ console.error(e);
+ currentStock.value = 0;
+ }
};
const getCurrentDeliveryRowQuantity = () => {
return Number(currentDeliveryRow.value?.noQuantity || 0);
@@ -1396,12 +1438,7 @@
return productOptions.value;
});
};
- const formattedNumber = (row, column, cellValue) => {
- if (cellValue === undefined || cellValue === null || cellValue === "") {
- return "0.00";
- }
- return parseFloat(cellValue).toFixed(2);
- };
+ const formattedNumber = tableAmountFormatter;
const findLedgerRecordByRow = row => {
if (!row) return null;
if (
@@ -1455,9 +1492,22 @@
}
return formattedNumber(row, column, cellValue);
};
+ // ProductSelectDialog 閫変腑鍥炶皟
+ const handleProductSelect = (products) => {
+ if (!products || !products.length) return;
+ const p = products[0];
+ productForm.value.productId = p.productId;
+ productForm.value.productCategory = p.productName || '';
+ productForm.value.productModelId = p.id;
+ productForm.value.specificationModel = p.model || '';
+ productForm.value.unit = p.unit || '';
+ fetchCurrentStock(productForm.value.productModelId);
+ showProductSelectDialog.value = false;
+ };
// 鑾峰彇tree瀛愭暟鎹�
const getModels = value => {
productForm.value.productCategory = findNodeById(productOptions.value, value);
+ currentStock.value = null;
modelList({ id: value }).then(res => {
modelOptions.value = res;
});
@@ -1467,9 +1517,11 @@
if (index !== -1) {
productForm.value.specificationModel = modelOptions.value[index].model;
productForm.value.unit = modelOptions.value[index].unit;
+ fetchCurrentStock(value);
} else {
productForm.value.specificationModel = null;
productForm.value.unit = null;
+ currentStock.value = null;
}
};
const findNodeById = (nodes, productId) => {
@@ -1564,11 +1616,15 @@
};
// 涓昏〃鍚堣鏂规硶
const summarizeMainTable = param => {
- return proxy.summarizeTable(param, [
+ return proxy.summarizeTable(
+ param,
+ ["contractAmount", "taxInclusiveTotalPrice", "taxExclusiveTotalPrice"],
+ buildAmountSummaryFormat([
"contractAmount",
"taxInclusiveTotalPrice",
"taxExclusiveTotalPrice",
- ]);
+ ])
+ );
};
// 瀛愯〃鍚堣鏂规硶
const summarizeChildrenTable = (param, parentRow) => {
@@ -1590,11 +1646,19 @@
return "";
});
}
- return proxy.summarizeTable(param, [
+ return proxy.summarizeTable(
+ param,
+ [
"taxInclusiveUnitPrice",
"taxInclusiveTotalPrice",
"taxExclusiveTotalPrice",
- ]);
+ ],
+ buildAmountSummaryFormat([
+ "taxInclusiveUnitPrice",
+ "taxInclusiveTotalPrice",
+ "taxExclusiveTotalPrice",
+ ])
+ );
};
// 鎵撳紑寮规
const openForm = async (type, row) => {
@@ -1722,7 +1786,7 @@
const quantity = Number(p.quantity ?? 0) || 0;
const unitPrice = Number(p.unitPrice ?? 0) || 0;
const taxRate = "13"; // 榛樿 13%锛屼究浜庣洿鎺ユ彁浜わ紙濡傞渶鍙湪浜у搧涓嚜琛屼慨鏀癸級
- const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
+ const taxInclusiveTotalPrice = formatDecimal(unitPrice * quantity);
const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(
taxInclusiveTotalPrice,
taxRate
@@ -1734,7 +1798,7 @@
unit: p.unit || "",
quantity: quantity,
taxRate: taxRate,
- taxInclusiveUnitPrice: unitPrice.toFixed(2),
+ taxInclusiveUnitPrice: formatDecimal(unitPrice),
taxInclusiveTotalPrice: taxInclusiveTotalPrice,
taxExclusiveTotalPrice: taxExclusiveTotalPrice,
invoiceType: "澧炴櫘绁�",
@@ -1793,6 +1857,7 @@
productOperationType.value = type;
productForm.value = {};
+ currentStock.value = null;
if (type === "add") {
productForm.value.isProduction = true;
}
@@ -1819,6 +1884,7 @@
);
if (currentModel) {
productForm.value.productModelId = currentModel.id;
+ fetchCurrentStock(currentModel.id);
}
}
} catch (e) {
@@ -2021,359 +2087,31 @@
});
};
- // 鎵撳嵃鍔熻兘
+ // 鎵撳嵃鍔熻兘 - 澶氶�夊悎骞堕瑙�
const handlePrint = async () => {
if (selectedRows.value.length === 0) {
proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
return;
}
-
- // 鏄剧ず鍔犺浇鐘舵��
- proxy.$modal.loading("姝e湪鑾峰彇浜у搧鏁版嵁锛岃绋嶅��...");
-
+ proxy.$modal.loading("姝e湪鍔犺浇鎵撳嵃鏁版嵁...");
try {
- // 涓烘瘡涓�変腑鐨勯攢鍞彴璐﹁褰曟煡璇㈠搴旂殑浜у搧鏁版嵁
- const printDataWithProducts = [];
-
+ const orders = [];
+ let companyName = '';
for (const row of selectedRows.value) {
- try {
- // 璋冪敤productList鎺ュ彛鏌ヨ浜у搧鏁版嵁
- const productRes = await productList({
- salesLedgerId: row.id,
- type: 1,
- });
-
- // 灏嗕骇鍝佹暟鎹暣鍚堝埌閿�鍞彴璐﹁褰曚腑
- const rowWithProducts = {
- ...row,
- products: productRes.data || [],
- };
-
- printDataWithProducts.push(rowWithProducts);
- } catch (error) {
- console.error(`鑾峰彇閿�鍞彴璐� ${row.id} 鐨勪骇鍝佹暟鎹け璐�:`, error);
- // 鍗充娇鏌愪釜璁板綍鐨勪骇鍝佹暟鎹幏鍙栧け璐ワ紝涔熻鍖呭惈璇ヨ褰�
- printDataWithProducts.push({
- ...row,
- products: [],
- });
+ const res = await getPrintData(row.id);
+ const data = res.data || res;
+ companyName = data.companyName || companyName;
+ orders.push(data.ledger);
}
- }
-
- printData.value = printDataWithProducts;
- console.log("鎵撳嵃鏁版嵁锛堝寘鍚骇鍝侊級:", printData.value);
- printPreviewVisible.value = true;
- } catch (error) {
- console.error("鑾峰彇浜у搧鏁版嵁澶辫触:", error);
- proxy.$modal.msgError("鑾峰彇浜у搧鏁版嵁澶辫触锛岃閲嶈瘯");
+ printSalesMulti(companyName, orders);
+ } catch (e) {
+ console.error('鎵撳嵃澶辫触:', e);
+ proxy.$modal.msgError("鎵撳嵃澶辫触");
} finally {
proxy.$modal.closeLoading();
}
};
- // 鎵ц鎵撳嵃
- const executePrint = () => {
- console.log("寮�濮嬫墽琛屾墦鍗帮紝鏁版嵁鏉℃暟:", printData.value.length);
- console.log("鎵撳嵃鏁版嵁:", printData.value);
- // 鍒涘缓涓�涓柊鐨勬墦鍗扮獥鍙�
- const printWindow = window.open("", "_blank", "width=800,height=600");
-
- // 鏋勫缓鎵撳嵃鍐呭
- let printContent = `
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>鎵撳嵃棰勮</title>
- <style>
- body {
- margin: 0;
- padding: 0;
- font-family: "SimSun", serif;
- background: white;
- }
- .print-page {
- width: 200mm;
- height: 75mm;
- padding: 10mm;
- padding-left: 20mm;
- background: white;
- box-sizing: border-box;
- page-break-after: always;
- page-break-inside: avoid;
- }
- .print-page:last-child {
- page-break-after: avoid;
- }
- .delivery-note {
- width: 100%;
- height: 100%;
- font-size: 12px;
- line-height: 1.2;
- display: flex;
- flex-direction: column;
- color: #000;
- }
- .header {
- text-align: center;
- margin-bottom: 8px;
- }
- .company-name {
- font-size: 18px;
- font-weight: bold;
- margin-bottom: 4px;
- }
- .document-title {
- font-size: 16px;
- font-weight: bold;
- }
- .info-section {
- margin-bottom: 8px;
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
- .info-row {
- line-height: 20px;
- }
- .label {
- font-weight: bold;
- width: 60px;
- font-size: 12px;
- }
- .value {
- margin-right: 20px;
- min-width: 80px;
- font-size: 12px;
- }
- .table-section {
- margin-bottom: 40px;
- // flex: 0.6;
- }
- .product-table {
- width: 100%;
- border-collapse: collapse;
- border: 1px solid #000;
- }
- .product-table th, .product-table td {
- border: 1px solid #000;
- padding: 6px;
- text-align: center;
- font-size: 12px;
- line-height: 1.4;
- }
- .product-table th {
- font-weight: bold;
- }
- .total-value {
- font-weight: bold;
- }
- .footer-section {
- margin-top: auto;
- }
- .footer-row {
- display: flex;
- margin-bottom: 3px;
- line-height: 22px;
- justify-content: space-between;
- }
- .footer-item {
- display: flex;
- margin-right: 20px;
- }
- .footer-item .label {
- font-weight: bold;
- width: 80px;
- font-size: 12px;
- }
- .footer-item .value {
- min-width: 80px;
- font-size: 12px;
- }
- .address-item .address-value {
- min-width: 200px;
- }
- @media print {
- body {
- margin: 0;
- padding: 0;
- }
- .print-page {
- margin: 0;
- padding: 10mm;
- /* padding-left: 20mm; */
- page-break-inside: avoid;
- page-break-after: always;
- }
- .print-page:last-child {
- page-break-after: avoid;
- }
- }
- </style>
- </head>
- <body>
- `;
-
- // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
- printData.value.forEach((item, index) => {
- printContent += `
- <div class="print-page">
- <div class="delivery-note">
- <div class="header">
- <div class="document-title">闆跺敭鍙戣揣鍗�</div>
- </div>
-
- <div class="info-section">
- <div class="info-row">
- <div>
- <span class="label">鍙戣揣鏃ユ湡锛�</span>
- <span class="value">${formatDate(
- item.createTime
- )}</span>
- </div>
- <div>
- <span class="label">瀹㈡埛鍚嶇О锛�</span>
- <span class="value">${
- item.customerName
- }</span>
- </div>
- </div>
- <div class="info-row">
- <span class="label">鍗曞彿锛�</span>
- <span class="value">${
- item.salesContractNo ||
- ""
- }</span>
- </div>
- </div>
-
- <div class="table-section">
- <table class="product-table">
- <thead>
- <tr>
- <th>浜у搧鍚嶇О</th>
- <th>瑙勬牸鍨嬪彿</th>
- <th>鍗曚綅</th>
- <th>鍗曚环</th>
- <th>闆跺敭鏁伴噺</th>
- <th>闆跺敭閲戦</th>
- </tr>
- </thead>
- <tbody>
- ${
- item.products &&
- item
- .products
- .length >
- 0
- ? item.products
- .map(
- product => `
- <tr>
- <td>${
- product.productCategory ||
- ""
- }</td>
- <td>${
- product.specificationModel ||
- ""
- }</td>
- <td>${
- product.unit ||
- ""
- }</td>
- <td>${
- product.taxInclusiveUnitPrice ||
- "0"
- }</td>
- <td>${
- product.quantity ||
- "0"
- }</td>
- <td>${
- product.taxInclusiveTotalPrice ||
- "0"
- }</td>
- </tr>
- `
- )
- .join(
- ""
- )
- : '<tr><td colspan="6" style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td></tr>'
- }
- </tbody>
- <tfoot>
- <tr>
- <td class="label">鍚堣</td>
- <td class="total-value"></td>
- <td class="total-value"></td>
- <td class="total-value"></td>
- <td class="total-value">${getTotalQuantityForPrint(
- item.products
- )}</td>
- <td class="total-value">${getTotalAmountForPrint(
- item.products
- )}</td>
- </tr>
- </tfoot>
- </table>
- </div>
-
- <div class="footer-section">
- <div class="footer-row">
- <div class="footer-item">
- <span class="label">鏀惰揣鐢佃瘽锛�</span>
- <span class="value"></span>
- </div>
- <div class="footer-item">
- <span class="label">鏀惰揣浜猴細</span>
- <span class="value"></span>
- </div>
- <div class="footer-item address-item">
- <span class="label">鏀惰揣鍦板潃锛�</span>
- <span class="value address-value"></span>
- </div>
- </div>
- <div class="footer-row">
- <div class="footer-item">
- <span class="label">鎿嶄綔鍛橈細</span>
- <span class="value">${
- userStore.nickName ||
- "鎾曞紑鍓�"
- }</span>
- </div>
- <div class="footer-item">
- <span class="label">鎵撳嵃鏃ユ湡锛�</span>
- <span class="value">${formatDateTime(
- new Date()
- )}</span>
- </div>
- </div>
- </div>
- </div>
- </div>
- `;
- });
-
- printContent += `
- </body>
- </html>
- `;
-
- // 鍐欏叆鍐呭鍒版柊绐楀彛
- printWindow.document.write(printContent);
- printWindow.document.close();
-
- // 绛夊緟鍐呭鍔犺浇瀹屾垚鍚庢墦鍗�
- printWindow.onload = () => {
- setTimeout(() => {
- printWindow.print();
- printWindow.close();
- printPreviewVisible.value = false;
- }, 500);
- };
- };
// 鏍煎紡鍖栨棩鏈�
const formatDate = dateString => {
if (!dateString) return getCurrentDate();
@@ -2408,7 +2146,7 @@
const total = products.reduce((sum, product) => {
return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
}, 0);
- return total.toFixed(2);
+ return formatDecimal(total);
};
// 鐢ㄤ簬鎵撳嵃鐨勮绠楀嚱鏁�
@@ -2425,7 +2163,7 @@
const total = products.reduce((sum, product) => {
return sum + (parseFloat(product.taxInclusiveTotalPrice) || 0);
}, 0);
- return total.toFixed(2);
+ return formatDecimal(total);
};
const mathNum = () => {
@@ -2466,7 +2204,7 @@
isCalculating.value = true;
// 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
- productForm.value.taxInclusiveUnitPrice = (totalPrice / quantity).toFixed(2);
+ productForm.value.taxInclusiveUnitPrice = formatDecimal(totalPrice / quantity);
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
@@ -2503,12 +2241,12 @@
// 鍏堣绠楀惈绋庢�讳环 = 涓嶅惈绋庢�讳环 / (1 - 绋庣巼/100)
const taxRateDecimal = taxRate / 100;
const inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal);
- productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
+ productForm.value.taxInclusiveTotalPrice = formatDecimal(inclusiveTotalPrice);
// 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
- productForm.value.taxInclusiveUnitPrice = (
+ productForm.value.taxInclusiveUnitPrice = formatDecimal(
inclusiveTotalPrice / quantity
- ).toFixed(2);
+ );
isCalculating.value = false;
};
@@ -2531,7 +2269,7 @@
isCalculating.value = true;
// 璁$畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
+ productForm.value.taxInclusiveTotalPrice = formatDecimal(unitPrice * quantity);
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
@@ -2563,7 +2301,7 @@
isCalculating.value = true;
// 璁$畻鍚◣鎬讳环
- productForm.value.taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
+ productForm.value.taxInclusiveTotalPrice = formatDecimal(unitPrice * quantity);
// 濡傛灉鏈夌◣鐜囷紝璁$畻涓嶅惈绋庢�讳环
if (productForm.value.taxRate) {
@@ -2704,6 +2442,28 @@
fileDialogVisible.value = true;
};
+ // 涓嬭浇閿�鍞崟
+ const downloadOrder = async (id) => {
+ try {
+ const res = await getPrintData(id);
+ const data = res.data || res;
+ downloadSalesJpg(data.companyName, data.ledger, '閿�鍞崟_' + (data.ledger.salesContractNo || id) + '.jpg');
+ } catch (e) {
+ console.error('涓嬭浇澶辫触:', e);
+ }
+ };
+
+ // 鎵撳嵃閿�鍞崟
+ const printOrder = async (id) => {
+ try {
+ const res = await getPrintData(id);
+ const data = res.data || res;
+ printSales(data.companyName, data.ledger);
+ } catch (e) {
+ console.error('鎵撳嵃澶辫触:', e);
+ }
+ };
+
// 鎵撳紑鍙戣揣寮规
const openDeliveryForm = async row => {
// 妫�鏌ユ槸鍚﹀彲浠ュ彂璐�
@@ -2760,6 +2520,7 @@
const productModelId =
currentDeliveryRow.value.productModelId ||
currentDeliveryRow.value.modelId;
+ deliveryLoading.value = true;
addShippingInfo({
salesLedgerId: salesLedgerId,
salesLedgerProductId: currentDeliveryRow.value.id,
@@ -2810,6 +2571,8 @@
});
}
});
+ }).finally(() => {
+ deliveryLoading.value = false;
});
}
});
@@ -3044,4 +2807,4 @@
page-break-after: avoid;
}
}
-</style>
\ No newline at end of file
+</style>
--
Gitblit v1.9.3