From c57fe99f8767c670f128c2bc86b7c8711af6bd33 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 25 三月 2026 11:29:07 +0800
Subject: [PATCH] 打印销售台账
---
src/views/salesManagement/salesLedger/index.vue | 382 ++++++++++++++++++++++++++++++++++++------------------
1 files changed, 256 insertions(+), 126 deletions(-)
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 11e6131..c5495dd 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -121,7 +121,7 @@
<el-table-column label="澶囨敞" prop="remarks" width="200" show-overflow-tooltip />
<el-table-column fixed="right" label="鎿嶄綔" min-width="100" align="center">
<template #default="scope">
- <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">缂栬緫</el-button>
+ <el-button link type="primary" size="small" @click="openForm('edit', scope.row)" :disabled="!scope.row.isEdit">缂栬緫</el-button>
<!-- <el-button link type="primary" size="small" @click="openForm('view', scope.row)">璇︽儏</el-button>-->
<el-button link type="primary" size="small" @click="downLoadFile(scope.row)">闄勪欢</el-button>
<!-- <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)">鍙戣揣</el-button>-->
@@ -243,14 +243,14 @@
</el-table>
<el-row :gutter="30">
<el-col :span="24">
- <el-form-item label="澶囨敞路锛�" prop="remark">
- <el-input v-model="form.remark" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" :disabled="operationType === 'view'" />
+ <el-form-item label="澶囨敞锛�" prop="remarks">
+ <el-input v-model="form.remarks" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" :disabled="operationType === 'view'" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="24">
- <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
+ <el-form-item label="闄勪欢鏉愭枡锛�" prop="salesLedgerFiles">
<el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
:headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError"
:on-success="handleUploadSuccess" :on-remove="handleRemove">
@@ -318,6 +318,15 @@
</template>
</el-table-column>
</el-table>
+
+ <pagination
+ v-show="quotationPage.total > 0"
+ :total="quotationPage.total"
+ layout="total, sizes, prev, pager, next, jumper"
+ :page="quotationPage.current"
+ :limit="quotationPage.size"
+ @pagination="quotationPaginationChange"
+ />
<template #footer>
<el-button @click="quotationDialogVisible = false">鍏抽棴</el-button>
@@ -472,51 +481,77 @@
<div v-for="(item, index) in printData" :key="index" class="print-page">
<div class="delivery-note">
<div class="header">
- <div class="company-name">榧庤瘹鐟炲疄涓氭湁闄愯矗浠诲叕鍙�</div>
- <div class="document-title">闆跺敭鍙戣揣鍗�</div>
+ <div class="company-name">婀栧崡楣忓垱鐢靛瓙鏈夐檺鍏徃</div>
+ <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.shippingCarNumber }}</span>
- </div>
+ <div>
+ <span class="label">瀹㈡埛鍚嶇О锛�</span>
+ <span class="value">{{ item.customerName }}</span>
+ </div>
+ <div>
+ <span class="label">閫佽揣鍦板潃锛�</span>
+ <span class="value">{{ item.companyAddress }}</span>
+ </div>
</div>
<div class="info-row">
- <div>
- <span class="label">瀹㈡埛鍚嶇О锛�</span>
- <span class="value">{{ item.customerName || '寮犵埍鏈�' }}</span>
- </div>
- <span class="label">鍗曞彿锛�</span>
- <span class="value">{{ item.salesContractNo }}</span>
+ <div>
+ <span class="label">鍗曟嵁缂栧彿锛�</span>
+ <span class="value">{{ item.salesContractNo }}</span>
+ </div>
+
+ <div>
+ <span class="label">閫佽揣鏃ユ湡锛�</span>
+ <span class="value">{{ formatDate(null) }}</span>
+ </div>
+
+ <div>
+ <span class="label">鑱旂郴鐢佃瘽锛�</span>
+ <span class="value">{{ item.contactPhone }}</span>
+ </div>
</div>
</div>
-
+
+ <div class="info-section">
+ <div class="info-row">
+ <div>
+ <span class="label">鑱旂郴鏂瑰紡锛�</span>
+ <span class="value"></span>
+ </div>
+ <div>
+ <span class="label">閫佽揣鍗曚綅锛�</span>
+ <span class="value">婀栧崡楣忓垱鐢靛瓙鏈夐檺鍏徃</span>
+ </div>
+ <div>
+ <span class="label">鍦板潃锛�</span>
+ <span class="value">婀栧崡鑰掗槼甯傚垱鏂板垱涓氬洯A1鏍�</span>
+ </div>
+ </div>
+ </div>
+
+ <span style="font-size: 16px;">璐х墿璇︾粏淇℃伅锛�</span>
<div class="table-section">
<table class="product-table">
<thead>
<tr>
- <th>浜у搧鍚嶇О</th>
- <th>瑙勬牸鍨嬪彿</th>
+ <th>搴忓彿</th>
+ <th>鐗╂枡缂栧彿</th>
+ <th>鍝佸悕/瑙勬牸</th>
<th>鍗曚綅</th>
- <th>鍗曚环</th>
- <th>闆跺敭鏁伴噺</th>
- <th>闆跺敭閲戦</th>
+ <th>鏁伴噺</th>
+ <th>璁㈠崟鍙�</th>
</tr>
</thead>
<tbody>
- <tr v-for="product in item.products" :key="product.id">
- <td>{{ product.productCategory || '' }}</td>
- <td>{{ product.specificationModel || '' }}</td>
+ <tr v-for="(product, index) in item.products" :key="product.id">
+ <td>{{ index + 1 }}</td>
+ <td>{{ product.materialCode || '' }}</td>
+ <td>{{`${product.productCategory || ''}/${product.specificationModel || ''}` }}</td>
<td>{{ product.unit || '' }}</td>
- <td>{{ product.taxInclusiveUnitPrice || '0' }}</td>
<td>{{ product.quantity || '0' }}</td>
- <td>{{ product.taxInclusiveTotalPrice || '0' }}</td>
+ <td>{{ item.salesContractNo || '' }}</td>
</tr>
<tr v-if="!item.products || item.products.length === 0">
<td colspan="6" style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td>
@@ -524,43 +559,30 @@
</tbody>
<tfoot>
<tr>
+ <td class="label"></td>
<td class="label">鍚堣</td>
<td class="total-value"></td>
<td class="total-value"></td>
- <td class="total-value"></td>
<td class="total-value">{{ getTotalQuantity(item.products) }}</td>
- <td class="total-value">{{ getTotalAmount(item.products) }}</td>
+ <td class="total-value"></td>
</tr>
</tfoot>
</table>
+
+ <div style="width: 30px;">
+ 鍏卞洓鑱斿瓨鏍瑰洖鍗曞鎴蜂粨搴�
+ </div>
</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>
+
+ <el-descriptions :column="1">
+ <el-descriptions-item label="澶囨敞锛�">璐靛叕鍙稿湪鏀惰揣鍚庤鍗冲埢鏍稿疄鏁伴噺鍙婂搧璐紝鑻ユ湁寮傝锛岃鍦�3鏃ュ唴鎻愬嚭锛屽惁鍒欒涓烘敹濡ャ��</el-descriptions-item>
+ </el-descriptions>
+ <el-descriptions :column="2">
+ <el-descriptions-item label="閫佽揣鍗曚綅锛堢绔狅級锛�"/>
+ <el-descriptions-item label="鏀惰揣鍗曚綅锛�"/>
+ <el-descriptions-item label="閫佽揣浜猴細"/>
+ <el-descriptions-item label="鏀惰揣浜猴細"/>
+ </el-descriptions>
</div>
</div>
</div>
@@ -780,6 +802,12 @@
const quotationSearchForm = reactive({
quotationNo: "",
customer: "",
+});
+// 鎶ヤ环鍗曞脊妗嗗垎椤�
+const quotationPage = reactive({
+ current: 1,
+ size: 10,
+ total: 0,
});
const selectedQuotation = ref(null);
@@ -1005,6 +1033,7 @@
// 娣诲姞琛ㄨ绫诲悕鏂规硶
const tableRowClassName = ({ row }) => {
+ if (!row.deliveryDate) return '';
if (row.isFh) return '';
const diff = row.deliveryDaysDiff;
@@ -1074,6 +1103,8 @@
const openQuotationDialog = async () => {
if (operationType.value === "view") return;
quotationDialogVisible.value = true;
+ // 鎵撳紑寮圭獥鏃堕噸缃垎椤靛埌绗竴椤�
+ quotationPage.current = 1;
// 鍏堢‘淇濆鎴峰垪琛ㄥ凡鍔犺浇锛屼究浜庡悗缁洖濉� customerId
if (!customerOption.value || customerOption.value.length === 0) {
try {
@@ -1090,14 +1121,15 @@
quotationLoading.value = true;
try {
const params = {
- // 鍏煎鍚庣鍒嗛〉瀛楁锛氳繖閲屾部鐢ㄦ姤浠烽〉闈㈠凡鏈夊彲鐢ㄧ殑瀛楁鍛藉悕
- currentPage: 1,
- pageSize: 100,
+ // 鍚庣鍒嗛〉瀛楁锛歝urrent / size
+ current: quotationPage.current,
+ size: quotationPage.size,
...quotationSearchForm,
status: "閫氳繃",
};
const res = await getQuotationList(params);
quotationList.value = res?.data?.records || [];
+ quotationPage.total = res?.data?.total || 0;
} finally {
quotationLoading.value = false;
}
@@ -1106,7 +1138,15 @@
const resetQuotationSearch = async () => {
quotationSearchForm.quotationNo = "";
quotationSearchForm.customer = "";
+ quotationPage.current = 1;
await fetchQuotationList();
+};
+
+// 鎶ヤ环鍗曞脊妗嗗垎椤靛垏鎹�
+const quotationPaginationChange = (obj) => {
+ quotationPage.current = obj.page;
+ quotationPage.size = obj.limit;
+ fetchQuotationList();
};
// 閫変腑鎶ヤ环鍗曞悗鍥炲~鍒板彴璐﹁〃鍗�
@@ -1561,7 +1601,7 @@
}
.label {
font-weight: bold;
- width: 60px;
+ min-width: 60px;
font-size: 12px;
}
.value {
@@ -1569,10 +1609,11 @@
min-width: 80px;
font-size: 12px;
}
- .table-section {
- margin-bottom: 40px;
- // flex: 0.6;
- }
+ .table-section {
+ margin-bottom: 4px;
+ flex: 1;
+ display: flex;
+ }
.product-table {
width: 100%;
border-collapse: collapse;
@@ -1600,13 +1641,66 @@
line-height: 22px;
justify-content: space-between;
}
+ .remarks-section {
+ margin: 10px 0;
+
+ .remark-item {
+ display: flex;
+ align-items: flex-start;
+
+ .label {
+ font-weight: bold;
+ min-width: 30px;
+ font-size: 14px;
+ margin-right: 10px;
+ white-space: nowrap;
+ }
+
+ .value {
+ flex: 1;
+ font-size: 14px;
+ line-height: 1.4;
+ }
+ }
+ }
+
+ .sign-section {
+ margin-top: 15px;
+
+ .sign-row {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 10px;
+
+ .sign-item {
+ display: flex;
+ align-items: center;
+ width: 48%;
+
+ .label {
+ font-weight: bold;
+ font-size: 14px;
+ margin-right: 10px;
+ white-space: nowrap;
+ }
+
+ .value {
+ flex: 1;
+ min-height: 30px;
+ border-bottom: 1px solid #000;
+ font-size: 14px;
+ }
+ }
+ }
+ }
+
.footer-item {
display: flex;
margin-right: 20px;
}
.footer-item .label {
font-weight: bold;
- width: 80px;
+ min-width: 80px;
font-size: 12px;
}
.footer-item .value {
@@ -1643,93 +1737,125 @@
<div class="print-page">
<div class="delivery-note">
<div class="header">
- <div class="company-name">榧庤瘹鐟炲疄涓氭湁闄愯矗浠诲叕鍙�</div>
- <div class="document-title">闆跺敭鍙戣揣鍗�</div>
+ <div class="company-name">婀栧崡楣忓垱鐢靛瓙鏈夐檺鍏徃</div>
+ <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 class="info-row">
+ <div>
+ <span class="label">瀹㈡埛鍚嶇О锛�</span>
+ <span class="value">${item.customerName || ''}</span>
+ </div>
+ <div>
+ <span class="label">閫佽揣鍦板潃锛�</span>
+ <span class="value">${item.companyAddress || ''}</span>
+ </div>
</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="info-row">
+ <div>
+ <span class="label">鍗曟嵁缂栧彿锛�</span>
+ <span class="value">${item.salesContractNo || ''}</span>
+ </div>
+ <div>
+ <span class="label">閫佽揣鏃ユ湡锛�</span>
+ <span class="value">${ formatDate(null)}</span>
+ </div>
+
+ <div>
+ <span class="label">鑱旂郴鐢佃瘽锛�</span>
+ <span class="value">${item.contactPhone || ''}</span>
+ </div>
+ </div>
+ </div>
+
+ <div class="info-section">
+ <div class="info-row">
+ <div>
+ <span class="label">鑱旂郴鏂瑰紡锛�</span>
+ <span class="value"></span>
+ </div>
+ <div>
+ <span class="label">閫佽揣鍗曚綅锛�</span>
+ <span class="value">婀栧崡楣忓垱鐢靛瓙鏈夐檺鍏徃</span>
+ </div>
+ <div>
+ <span class="label">鍦板潃锛�</span>
+ <span class="value">婀栧崡鑰掗槼甯傚垱鏂板垱涓氬洯A1鏍�</span>
+ </div>
+ </div>
+ </div>
+
+ <span style="font-size: 16px;">璐х墿璇︾粏淇℃伅锛�</span>
<div class="table-section">
<table class="product-table">
<thead>
<tr>
- <th>浜у搧鍚嶇О</th>
- <th>瑙勬牸鍨嬪彿</th>
+ <th>搴忓彿</th>
+ <th>鐗╂枡缂栧彿</th>
+ <th>鍝佸悕/瑙勬牸</th>
<th>鍗曚綅</th>
- <th>鍗曚环</th>
- <th>闆跺敭鏁伴噺</th>
- <th>闆跺敭閲戦</th>
+ <th>鏁伴噺</th>
+ <th>璁㈠崟鍙�</th>
</tr>
</thead>
- <tbody>
+ <tbody>
${item.products && item.products.length > 0 ?
- item.products.map(product => `
+ item.products.map((product, index) => `
<tr>
- <td>${product.productCategory || ''}</td>
- <td>${product.specificationModel || ''}</td>
+ <td>${index + 1}</td>
+ <td>${product.materialCode || ''}</td>
+ <td>${product.productCategory || ''}/${product.specificationModel || ''}</td>
<td>${product.unit || ''}</td>
- <td>${product.taxInclusiveUnitPrice || '0'}</td>
<td>${product.quantity || '0'}</td>
- <td>${product.taxInclusiveTotalPrice || '0'}</td>
+ <td>${item.salesContractNo || ''}</td>
</tr>
`).join('') :
- '<tr><td colspan="6" style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td></tr>'
- }
+ '<tr><td colspan="6" style="text-align: center; color: #999;">鏆傛棤浜у搧鏁版嵁</td></tr>'
+ }
</tbody>
<tfoot>
<tr>
+ <td></td>
<td class="label">鍚堣</td>
<td class="total-value"></td>
<td class="total-value"></td>
+ <td class="total-value">${ getTotalQuantity(item.products) || '0'}</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 style="width: 30px;">
+ 鍏卞洓鑱斿瓨鏍瑰洖鍗曞鎴蜂粨搴�
+ </div>
</div>
- <div class="footer-section">
- <div class="footer-row">
- <div class="footer-item">
- <span class="label">鏀惰揣鐢佃瘽锛�</span>
- <span class="value"></span>
+ <div class="remarks-section">
+ <div class="remark-item">
+ <span class="label">澶囨敞锛�</span>
+ <span class="value">璐靛叕鍙稿湪鏀惰揣鍚庤鍗冲埢鏍稿疄鏁伴噺鍙婂搧璐紝鑻ユ湁寮傝锛岃鍦�3鏃ュ唴鎻愬嚭锛屽惁鍒欒涓烘敹濡ャ��</span>
+ </div>
+ </div>
+ <div class="sign-section">
+ <div class="sign-row">
+ <div class="sign-item">
+ <span class="label">閫佽揣鍗曚綅锛堢绔狅級锛�</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 class="sign-item">
+ <span class="label">鏀惰揣鍗曚綅锛�</span>
</div>
</div>
- <div class="footer-row">
- <div class="footer-item">
- <span class="label">鎿嶄綔鍛橈細</span>
- <span class="value">${userStore.nickName || '鎾曞紑鍓�'}</span>
+ <div class="sign-row">
+ <div class="sign-item">
+ <span class="label">閫佽揣浜猴細</span>
</div>
- <div class="footer-item">
- <span class="label">鎵撳嵃鏃ユ湡锛�</span>
- <span class="value">${formatDateTime(new Date())}</span>
+ <div class="sign-item">
+ <span class="label">鏀惰揣浜猴細</span>
</div>
</div>
</div>
+
</div>
</div>
`;
@@ -1755,13 +1881,14 @@
};
// 鏍煎紡鍖栨棩鏈�
const formatDate = (dateString) => {
- if (!dateString) return getCurrentDate();
+ if (!dateString) return getCurrentDate().replace(/-/g, '/');
const date = new Date(dateString);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
return `${year}/${month}/${day}`;
};
+
// 鏍煎紡鍖栨棩鏈熸椂闂�
const formatDateTime = (date) => {
const year = date.getFullYear();
@@ -2222,7 +2349,7 @@
.print-page {
width: 220mm;
- height: 90mm;
+ min-height: 90mm;
padding: 10mm;
margin: 0 auto;
background: white;
@@ -2283,6 +2410,7 @@
.table-section {
margin-bottom: 4px;
flex: 1;
+ display: flex;
.product-table {
width: 100%;
@@ -2317,20 +2445,22 @@
display: flex;
margin-bottom: 3px;
line-height: 20px;
- justify-content: space-between;
+ justify-content: flex-start;
.footer-item {
display: flex;
+ align-items: center;
margin-right: 20px;
-
+
.label {
font-weight: bold;
- width: 80px;
+ white-space: nowrap;
+ margin-right: 10px;
font-size: 14px;
}
.value {
- min-width: 80px;
+ min-width: 300px;
font-size: 14px;
}
--
Gitblit v1.9.3