Эх сурвалжийг харах

feat: 新增打印选项以包含仓库信息,并调整打印逻辑以支持该功能

xieyong 1 долоо хоног өмнө
parent
commit
0c7ca2a666

+ 57 - 22
src/views/saleManage/saleOrder/components/printTemplateHt.vue

@@ -80,6 +80,7 @@
               <td style="padding: 2px; width: 8%"> 税率</td>
               <td style="padding: 2px; width: 8%"> 金额</td>
               <td style="padding: 2px; width: 8%"> 颜色 </td>
+              <td v-if="showWarehouse" style="padding: 2px; width: 12%"> 仓库 </td>
               <td style="padding: 2px; width: 10%"> 备注</td>
             </tr>
 
@@ -99,6 +100,7 @@
               <td style="padding: 2px"> {{ item.taxRate }}{{ item.taxRate !== undefined && item.taxRate !== null ? '%' : '' }}</td>
               <td style="padding: 2px"> {{ item.totalPrice }}</td>
               <td style="padding: 2px"> {{ item.colorKey }}</td>
+              <td v-if="showWarehouse" style="padding: 2px"> {{ item.warehouseName }}</td>
               <!-- <td style="padding: 5px"> {{ item.modelKey }}</td> -->
               <td style="padding: 2px"> {{ item.remark }}</td>
             </tr>
@@ -113,6 +115,7 @@
               <td style="padding: 2px"> </td>
               <td style="padding: 2px">{{ getTotalValue(wrapperItem, 'totalPrice', 2) }}</td>
               <td style="padding: 2px"> </td>
+              <td v-if="showWarehouse" style="padding: 2px"> </td>
               <td style="padding: 2px"> </td>
               <!-- <td style="padding: 2px"> </td> -->
               <!-- <td style="padding: 2px"> </td> -->
@@ -195,6 +198,8 @@
         checked: '',
         QRvisible: false,
         isPrintPrice: false,
+        // 是否在明细中显示「仓库」列(默认关闭,handlePrint 保持原样)
+        showWarehouse: false,
         formData: {
           contactName: '',
           createTime: '',
@@ -208,7 +213,9 @@
     },
 
     methods: {
-      async open(id) {
+      // 第二个参数 showWarehouse 控制是否在明细中显示「仓库」列
+      async open(id, showWarehouse = false) {
+        this.showWarehouse = !!showWarehouse;
         const list = await getSaleOrderDetails(id);
         this.formData = await Promise.all(
           list.map(async (wrapperItem) => {
@@ -351,12 +358,24 @@
         const td = `${cellBase}font-family:'宋体';font-size:11pt;`;
         const labelLeft = `${border}padding:4px;mso-number-format:"\\@";vertical-align:middle;text-align:left;mso-horizontal-align:left;font-family:'宋体';font-size:11pt;`;
 
-        const colWidths = [45, 135, 45, 55, 65, 55, 75, 55, 75];
+        // 是否显示仓库列,并据此决定列数和列宽
+        const showWarehouse = !!this.showWarehouse;
+        const totalCols = showWarehouse ? 10 : 9;
+        const colWidths = showWarehouse
+          ? [45, 120, 45, 55, 60, 55, 75, 55, 90, 70]
+          : [45, 135, 45, 55, 65, 55, 75, 55, 75];
         const colGroup = colWidths
           .map((w) => `<col width="${w}" style="width:${w}pt;" />`)
           .join('');
 
+        // 左右对称分列的 colspan(5/4 -> 5/5 等)
+        const halfLeft = Math.ceil(totalCols / 2);
+        const halfRight = totalCols - halfLeft;
+
         const title = `${this.groupName || ''}销售订单`;
+        const warehouseTh = showWarehouse
+          ? `<td align="center" valign="middle" style="${th}">仓库</td>`
+          : '';
 
         // 遍历多个单据生成多个表格
         let tables = '';
@@ -367,8 +386,11 @@
           const totalChinese = this.numberToChinese(totalPrice);
 
           const rows = list
-            .map(
-              (item, index) => `
+            .map((item, index) => {
+              const warehouseTd = showWarehouse
+                ? `<td align="center" valign="middle" style="${td}">${item.warehouseName || ''}</td>`
+                : '';
+              return `
               <tr height="24" style="height:24pt;">
                 <td align="center" valign="middle" style="${td}">${index + 1}</td>
                 <td align="center" valign="middle" style="${td}">${item.modelType || ''}</td>
@@ -376,33 +398,44 @@
                 <td align="center" valign="middle" style="${td}">${item.saleCount ?? ''}</td>
                 <td align="center" valign="middle" style="${td}">${item.singlePrice ?? ''}</td>
                 <td align="center" valign="middle" style="${td}">${
-              item.taxRate ? item.taxRate + '%' : '0%'
-            }</td>
+                item.taxRate ? item.taxRate + '%' : '0%'
+              }</td>
                 <td align="center" valign="middle" style="${td}">${item.totalPrice ?? ''}</td>
                 <td align="center" valign="middle" style="${td}">${item.colorKey || ''}</td>
+                ${warehouseTd}
                 <td align="center" valign="middle" style="${td}">${item.remark || ''}</td>
-              </tr>`
-            )
+              </tr>`;
+            })
             .join('');
 
+          // 合计行多出的空单元格(仓库列对应位置)
+          const totalExtraEmpty = showWarehouse
+            ? `<td align="center" valign="middle" style="${td}"></td>`
+            : '';
+          // 制单人行:3+2+2+2=9,仓库列追加时变为 3+2+2+3=10
+          const signLeft = showWarehouse ? 3 : 3;
+          const signLeftMid = 2;
+          const signRightMid = 2;
+          const signRight = showWarehouse ? 3 : 2;
+
           tables += `
           <table border="1" cellspacing="0" cellpadding="0" align="center"
             style="border-collapse:collapse;border:1px solid #000;mso-border-alt:solid #000 0.5pt;font-family:'宋体';font-size:11pt;text-align:center;">
             <colgroup>${colGroup}</colgroup>
             <tr height="40" style="height:40pt;">
-              <td colspan="9" align="center" valign="middle" style="${border}padding:6px;text-align:center;font-family:'宋体';font-size:22pt;font-weight:bold;">${title}</td>
+              <td colspan="${totalCols}" align="center" valign="middle" style="${border}padding:6px;text-align:center;font-family:'宋体';font-size:22pt;font-weight:bold;">${title}</td>
             </tr>
             <tr height="26" style="height:26pt;">
-              <td colspan="5" align="left" valign="middle" style="${labelLeft}"></td>
-              <td colspan="4" align="left" valign="middle" style="${labelLeft}">门店:${wrapperItem.salesDeptName || ''}</td>
+              <td colspan="${halfLeft}" align="left" valign="middle" style="${labelLeft}"></td>
+              <td colspan="${halfRight}" align="left" valign="middle" style="${labelLeft}">门店:${wrapperItem.salesDeptName || ''}</td>
             </tr>
             <tr height="26" style="height:26pt;">
-              <td colspan="5" align="left" valign="middle" style="${labelLeft}">客户:${wrapperItem.partaName || ''}</td>
-              <td colspan="4" align="left" valign="middle" style="${labelLeft}">单据日期:${wrapperItem.createTime ? wrapperItem.createTime.split(' ')[0] : ''}</td>
+              <td colspan="${halfLeft}" align="left" valign="middle" style="${labelLeft}">客户:${wrapperItem.partaName || ''}</td>
+              <td colspan="${halfRight}" align="left" valign="middle" style="${labelLeft}">单据日期:${wrapperItem.createTime ? wrapperItem.createTime.split(' ')[0] : ''}</td>
             </tr>
             <tr height="26" style="height:26pt;">
-              <td colspan="5" align="left" valign="middle" style="${labelLeft}">项目名称:${wrapperItem.projectName || ''}</td>
-              <td colspan="4" align="left" valign="middle" style="${labelLeft}">单据编号:${wrapperItem.orderNo || ''}</td>
+              <td colspan="${halfLeft}" align="left" valign="middle" style="${labelLeft}">项目名称:${wrapperItem.projectName || ''}</td>
+              <td colspan="${halfRight}" align="left" valign="middle" style="${labelLeft}">单据编号:${wrapperItem.orderNo || ''}</td>
             </tr>
 
             <tr height="28" style="height:28pt;">
@@ -414,6 +447,7 @@
               <td align="center" valign="middle" style="${th}">税率</td>
               <td align="center" valign="middle" style="${th}">金额</td>
               <td align="center" valign="middle" style="${th}">颜色</td>
+              ${warehouseTh}
               <td align="center" valign="middle" style="${th}">备注</td>
             </tr>
             ${rows}
@@ -425,20 +459,21 @@
               <td align="center" valign="middle" style="${td}"></td>
               <td align="center" valign="middle" style="${td};font-weight:bold;">${totalPrice}</td>
               <td align="center" valign="middle" style="${td}"></td>
+              ${totalExtraEmpty}
               <td align="center" valign="middle" style="${td}"></td>
             </tr>
             <tr height="28" style="height:28pt;">
-              <td colspan="3" align="left" valign="middle" style="${labelLeft}">业务员:${wrapperItem.salesmanName || ''}</td>
-              <td colspan="2" align="left" valign="middle" style="${labelLeft}">制单人:${wrapperItem.createUserName || ''}</td>
-              <td colspan="2" align="left" valign="middle" style="${labelLeft}">核对人:${wrapperItem.reviewerName || ''}</td>
-              <td colspan="2" align="left" valign="middle" style="${labelLeft}">发货人:</td>
+              <td colspan="${signLeft}" align="left" valign="middle" style="${labelLeft}">业务员:${wrapperItem.salesmanName || ''}</td>
+              <td colspan="${signLeftMid}" align="left" valign="middle" style="${labelLeft}">制单人:${wrapperItem.createUserName || ''}</td>
+              <td colspan="${signRightMid}" align="left" valign="middle" style="${labelLeft}">核对人:${wrapperItem.reviewerName || ''}</td>
+              <td colspan="${signRight}" align="left" valign="middle" style="${labelLeft}">发货人:</td>
             </tr>
             <tr height="28" style="height:28pt;">
-              <td colspan="5" align="left" valign="middle" style="${labelLeft}">地址:${wrapperItem.partbAddress || ''}</td>
-              <td colspan="4" align="left" valign="middle" style="${labelLeft}">客户签字:</td>
+              <td colspan="${halfLeft}" align="left" valign="middle" style="${labelLeft}">地址:${wrapperItem.partbAddress || ''}</td>
+              <td colspan="${halfRight}" align="left" valign="middle" style="${labelLeft}">客户签字:</td>
             </tr>
             <tr height="28" style="height:28pt;">
-              <td colspan="9" align="left" valign="middle" style="${labelLeft}">备注:${wrapperItem.remark || ''}</td>
+              <td colspan="${totalCols}" align="left" valign="middle" style="${labelLeft}">备注:${wrapperItem.remark || ''}</td>
             </tr>
           </table>
           <br style="mso-special-character:line-break;page-break-before:always" />`;

+ 9 - 0
src/views/saleManage/saleOrder/index.vue

@@ -153,6 +153,11 @@
                         @click.native="handleOutboundPrint"
                         >打印(出库单)</el-dropdown-item
                       >
+                      <el-dropdown-item
+                        v-if="$hasPermission('eom:saleorder:print')"
+                        @click.native="handlePrintWithWarehouse"
+                        >打印(含仓库)</el-dropdown-item
+                      >
                     </el-dropdown-menu>
                   </el-dropdown>
 
@@ -1403,6 +1408,10 @@ export default {
     },
     handleOutboundPrint() {
       this.$refs.printTemplateHt1Ref.open(this.selection.map((v) => v.id), false, 'saleOrder');
+    },
+    // 打印逻辑同 handlePrint,模板带仓库列
+    handlePrintWithWarehouse() {
+      this.$refs.printTemplateHtRef.open(this.selection.map((v) => v.id), true);
     }
   }
 };