Просмотр исходного кода

feat: 入库管理批量打印,库存台账流水明细

liujt 3 недель назад
Родитель
Сommit
0f953dfcb9

+ 12 - 0
package-lock.json

@@ -25,6 +25,7 @@
         "el-table-infinite-scroll": "^2.0.2",
         "ele-admin": "^1.11.2",
         "element-ui": "2.15.7",
+        "file-saver": "^2.0.5",
         "github-markdown-css": "^5.1.0",
         "highlight.js": "^9.18.5",
         "jsbarcode": "^3.11.6",
@@ -6670,6 +6671,12 @@
         "node": "^10.12.0 || >=12.0.0"
       }
     },
+    "node_modules/file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==",
+      "license": "MIT"
+    },
     "node_modules/fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
@@ -20330,6 +20337,11 @@
         "flat-cache": "^3.0.4"
       }
     },
+    "file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+    },
     "fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",

+ 2 - 1
package.json

@@ -52,7 +52,8 @@
     "vuex-persistedstate": "^4.1.0",
     "xgplayer-vue": "^1.1.5",
     "xlsx": "^0.14.1",
-    "xml-js": "1.6.11"
+    "xml-js": "1.6.11",
+    "file-saver": "^2.0.5"
   },
   "devDependencies": {
     "@vue/cli-plugin-babel": "^5.0.8",

+ 23 - 1
src/api/warehouseManagement/index.js

@@ -90,6 +90,15 @@ export default {
     }
     return Promise.reject(new Error(res.data.message));
   },
+
+  // 获取多个入库详情
+  getInboundDetailsByIds: async (data) => {
+    const res = await request.post(`/wms/outintwo/getByIds`, data);
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+    return Promise.reject(new Error(res.data.message));
+  },
   // 出入库物品列表
   getInboundGoodsList: async (params) => {
     const res = await request.get(`/wms/outintwo/goodsPage`, {
@@ -200,9 +209,22 @@ export default {
     return Promise.reject(new Error(res.data.message));
   },
   // 包装维度流水
+  // outInRecordsPage: async (params) => {
+  //   const res = await request.get(
+  //     `/wms/outInDetailRecordTwo/outInRecordsPage`,
+  //     {
+  //       params
+  //     }
+  //   );
+  //   if (res.data.code == 0) {
+  //     return res.data.data;
+  //   }
+  //   return Promise.reject(new Error(res.data.message));
+  // },
+  // 包装维度流水
   outInRecordsPage: async (params) => {
     const res = await request.get(
-      `/wms/outInDetailRecordTwo/outInRecordsPage`,
+      `/wms/snapshot/page`,
       {
         params
       }

+ 16 - 2
src/views/warehouseManagement/stockLedger/components/details/InWarehouse.vue

@@ -268,6 +268,20 @@ export default {
           align: 'center',
           minWidth: 110
         },
+        {
+          prop: 'balanceBatchQuantity',
+          label: '批次期末',
+          showOverflowTooltip: true,
+          align: 'center',
+          minWidth: 110
+        },
+        {
+          prop: 'balanceQuantity',
+          label: '物品期末',
+          showOverflowTooltip: true,
+          align: 'center',
+          minWidth: 110
+        },
         {
           align: 'center',
           prop: 'measureQuantity',
@@ -328,7 +342,7 @@ export default {
           minWidth: 110
         },
         {
-          prop: 'createTime',
+          prop: 'storageTime',
           label: '入库时间',
           align: 'center',
           showOverflowTooltip: true,
@@ -489,7 +503,7 @@ export default {
         categoryId: this.$route.query.id,
         size: this.size,
         pageNum: this.pageNum,
-        type: 1,
+        bizType: 1,
         ...this.baseParams
         // ...this.searchForm,
         // batchNum: this.baseParams.batchNum || this.searchForm.batchNum

+ 16 - 2
src/views/warehouseManagement/stockLedger/components/details/OutWarehouse.vue

@@ -282,6 +282,20 @@
             align: 'center',
             minWidth: 110
           },
+          {
+            prop: 'balanceBatchQuantity',
+            label: '批次期末',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
+          {
+            prop: 'balanceQuantity',
+            label: '物品期末',
+            showOverflowTooltip: true,
+            align: 'center',
+            minWidth: 110
+          },
           {
             align: 'center',
             prop: 'measureQuantity',
@@ -332,7 +346,7 @@
             minWidth: 110
           },
           {
-            prop: 'createTime',
+            prop: 'storageTime',
             label: '出库时间',
             align: 'center',
             showOverflowTooltip: true,
@@ -471,7 +485,7 @@
           categoryId: this.$route.query.id,
           size: this.size,
           pageNum: this.pageNum,
-          type: 2,
+          bizType: 2,
           ...this.baseParams
           // ...this.searchForm,
           // batchNum: this.baseParams.batchNum || this.searchForm.batchNum

+ 229 - 125
src/views/warehouseManagement/stockManagement/components/printStockEnterHt.vue

@@ -6,105 +6,103 @@
     width="1100px"
     @close="close"
   >
-    <div
-      id="printSection"
-      style="
-        font-family: SimSun, serif;
-        padding: 20px;
-        width: 24cm;
-        height: 14cm;
-        margin: 0 auto;
-        box-sizing: border-box;
-      "
-    >
-      <!-- 入库单标题 -->
-      <div style="text-align: center; margin-bottom: 20px;">
-        <h2 style="margin: 0; font-size: 24px; font-weight: bold;">{{ groupName }}入库单</h2>
-      </div>
-      
-      <!-- 供应商信息 -->
-      <div style="margin-bottom: 20px; width: 100%;">
-        <div style="width: 100%; display: flex;">
-          <div style="width: 40%;">
-            <strong>供应商名称:</strong>{{ rowList.extInfo?.supplierName || '' }}
-          </div>
-          <div style="width: 30%;">
-            <strong>日期:</strong>{{ rowList.storageTime || '' }}
-          </div>
-          <div style="width: 30%;">
-            <strong>编号:</strong>{{ rowList.bizNo || '' }}
-          </div>
-        </div>
-      </div>
-      
-      <!-- 入库物品表格 -->
-      <table
-        border="1"
-        cellspacing="0"
+    <div id="printSectionHt">
+      <!-- 24cm*14cm -->
+      <div
+        v-for="(rowItem, idx) in formData"
+        :key="rowItem.id || idx"
         style="
-          width: 100%;
-          border-collapse: collapse;
-          font-size: 14px;
+          font-family: SimSun, serif;
+          padding: 20px;
+          width: 24cm;
+          margin: 0 auto;
+          box-sizing: border-box;
+          page-break-after: always;
         "
       >
-        <thead>
-          <tr>
-            <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 5%;">编号</th>
-            <!-- <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 18%;">名称</th> -->
-            <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 25%;">型号规格</th>
-            <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 10%;">颜色</th>
-            <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 10%;">单位</th>
-            <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 10%;">入库数量</th>
-            <!-- <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 8%;">单价</th>
-            <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 10%;">金额</th> -->
-            <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 12%;">批次号</th>
-          </tr>
-        </thead>
-        <tbody>
-          <tr v-for="(row, index) in rowList.outInDetailList" :key="index">
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ index + 1 }}</td>
-            <!-- <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.categoryName || '' }}</td> -->
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{row.categoryModel || '' }}{{ row.categoryModel && row?.specification ? '/' : '' }}{{ row?.specification || '' }}</td>
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.colorKey || '' }}</td>
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.measureUnit || '' }}</td>
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.measureQuantity || '' }}</td>
-            <!-- <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.unitPrice || 0 }}</td>
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.totalMoney || 0}}</td> -->
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.batchNo || '' }}</td>
-          </tr>
-          
-          <!-- 合计金额行 -->
-          <tr>
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;" colspan="2">合计:</td>
-            <!-- <td style="border: 1px solid #000; padding: 4px; text-align: center;"></td> -->
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;"></td>
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;"></td>
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ totalAmount || '' }}</td>
-            <!-- <td style="border: 1px solid #000; padding: 4px; text-align: center;"></td> -->
-            <!-- <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ totalAllPrice || '' }}</td> -->
-            <td style="border: 1px solid #000; padding: 4px; text-align: center;"></td>
-          </tr>
-        </tbody>
-      </table>
-      
-      <!-- 签字区域 -->
-      <div style="margin-top: 20px; display: flex; width: 100%;">
-        <div style="width: 25%;">
-          <strong>主管:</strong>{{ rowList.verifyName || '' }}
-        </div>
-        <div style="width: 25%;">
-          <strong>仓库:</strong>{{ row?.warehouseName || '' }}
+        <!-- 入库单标题 -->
+        <div style="text-align: center; margin-bottom: 20px;">
+          <h2 style="margin: 0; font-size: 24px; font-weight: bold;">{{ groupName }}入库单</h2>
         </div>
-        <div style="width: 25%;">
-          <strong>记账:</strong>{{ rowList.extInfo?.createUserName || '' }}
+        
+        <!-- 供应商信息 -->
+        <div style="margin-bottom: 20px; width: 100%;">
+          <div style="width: 100%; display: flex;">
+            <div style="width: 40%;">
+              <strong>供应商名称:</strong>{{ supplierMap[rowItem.id] || '' }}
+            </div>
+            <div style="width: 30%;">
+              <strong>日期:</strong>{{ rowItem.storageTime || '' }}
+            </div>
+            <div style="width: 30%;">
+              <strong>编号:</strong>{{ rowItem.bizNo || '' }}
+            </div>
+          </div>
         </div>
-        <div style="width: 25%;">
-          <strong>经手人:</strong>{{ rowList?.fromUser || '' }}
+        
+        <!-- 入库物品表格 -->
+        <table
+          border="1"
+          cellspacing="0"
+          style="
+            width: 100%;
+            border-collapse: collapse;
+            font-size: 14px;
+          "
+        >
+          <thead>
+            <tr>
+              <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 5%;">编号</th>
+              <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 25%;">型号规格</th>
+              <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 15%;">客户</th>
+              <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 10%;">颜色</th>
+              <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 10%;">单位</th>
+              <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 10%;">入库数量</th>
+              <th style="border: 1px solid #000; padding: 4px; text-align: center; width: 12%;">批次号</th>
+            </tr>
+          </thead>
+          <tbody>
+            <tr v-for="(row, index) in rowItem.outInDetailList" :key="index">
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ index + 1 }}</td>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{row.categoryModel || '' }}{{ row.categoryModel && row?.specification ? '/' : '' }}{{ row?.specification || '' }}</td>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.clientName || '' }}</td>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.colorKey || '' }}</td>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.measureUnit || '' }}</td>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.measureQuantity || '' }}</td>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ row?.batchNo || '' }}</td>
+            </tr>
+            
+            <!-- 合计行 -->
+            <tr>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;" colspan="2">合计:</td>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;"></td>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;"></td>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;">{{ getTotalAmount(rowItem) }}</td>
+              <td style="border: 1px solid #000; padding: 4px; text-align: center;"></td>
+            </tr>
+          </tbody>
+        </table>
+        
+        <!-- 签字区域 -->
+        <div style="margin-top: 20px; display: flex; width: 100%;">
+          <div style="width: 25%;">
+            <strong>主管:</strong>{{ rowItem.verifyName || '' }}
+          </div>
+          <div style="width: 25%;">
+            <strong>仓库:</strong>{{ warehouseMap[rowItem.id] || '' }}
+          </div>
+          <div style="width: 25%;">
+            <strong>记账:</strong>{{ rowItem.extInfo?.createUserName || '' }}
+          </div>
+          <div style="width: 25%;">
+            <strong>经手人:</strong>{{ rowItem?.fromUser || '' }}
+          </div>
         </div>
       </div>
     </div>
 
     <div slot="footer">
+      <el-button type="primary" @click="exportExcel">导出</el-button>
       <el-button @click="print">打印预览</el-button>
       <el-button @click="close">关闭</el-button>
     </div>
@@ -113,34 +111,10 @@
 
 <script>
   import storageApi from '@/api/warehouseManagement';
+  import { saveAs } from 'file-saver';
   export default {
     name: 'print',
     components: {},
-    computed: {
-      // 计算总数量
-      totalAmount() {
-        if (!this.rowList?.outInDetailList || !Array.isArray(this.rowList.outInDetailList)) {
-          return 0;
-        }
-        
-        return this.rowList.outInDetailList.reduce((sum, row) => {
-          const amount = parseFloat(row.measureQuantity || 0);
-          return sum + (isNaN(amount) ? 0 : amount);
-        }, 0);
-      },
-      
-      // 计算总金额
-      totalAllPrice() {
-        if (!this.rowList?.outInDetailList || !Array.isArray(this.rowList.outInDetailList)) {
-          return 0;
-        }
-        
-        return this.rowList.outInDetailList.reduce((sum, row) => {
-          const amount = parseFloat(row.totalMoney || 0);
-          return sum + (isNaN(amount) ? 0 : amount);
-        }, 0);
-      }
-    },
     props: {
       groupName: {
         type: String,
@@ -150,28 +124,53 @@
     data() {
       return {
         QRvisible: false,
-        rowList: [],
-        row: {}
+        formData: [],
+        warehouseMap: {},
+        supplierMap: {}
       };
     },
 
     methods: {
+      // 计算单个入库单的总数量
+      getTotalAmount(rowItem) {
+        if (!rowItem?.outInDetailList || !Array.isArray(rowItem.outInDetailList)) {
+          return 0;
+        }
+        return rowItem.outInDetailList.reduce((sum, row) => {
+          const amount = parseFloat(row.measureQuantity || 0);
+          return sum + (isNaN(amount) ? 0 : amount);
+        }, 0);
+      },
+
+      async init(ids, rows) {
+        console.log('ids~~', ids, rows);
+        // 批量获取每个入库单的详情
+        // const promises = ids.map((id) => storageApi.getInboundDetailsByIds({ids: [id]}));
+        // const results = await Promise.all(promises);
+        const res = await storageApi.getInboundDetailsByIds(ids)
+        this.formData = res;
 
-      async init(id, row) {
-        this.row = row;
-        const res = await storageApi.getInboundDetailsById(id);
-        console.log('res', res);
-        this.rowList = res;
+        // 构建仓库映射
+        this.warehouseMap = {};
+        this.supplierMap = {};
+        rows.forEach((row) => {
+          this.warehouseMap[row.id] = row.warehouseName || '';
+          this.supplierMap[row.id] = row.supplierName || '';
+        });
+
+        console.log('formData', this.formData, this.warehouseMap, this.supplierMap);
         this.QRvisible = true;
       },
 
       close() {
-        this.rowList = [];
+        this.formData = [];
+        this.warehouseMap = {};
+        this.supplierMap = {};
         this.QRvisible = false;
       },
       
       print() {
-        const printSection = document.getElementById('printSection');
+        const printSection = document.getElementById('printSectionHt');
         
         // 创建打印任务
         const printWindow = window.open('', '_blank');
@@ -180,8 +179,8 @@
         printWindow.document.write(
           '<style type="text/css">' +
           '@page { size: 24cm 14cm; margin: 0; }' +
-          'body { width: 24cm; height: 14cm; margin: 0; padding: 0; }' +
-          '#printSection { margin: 0 auto; width: 24cm; height: 14cm; box-sizing: border-box; }' +
+          'body { margin: 0; padding: 0; }' +
+          'div[style*="page-break-after"] { page-break-after: always; }' +
           '</style>'
         );
         printWindow.document.write('</head><body>');
@@ -191,6 +190,111 @@
         printWindow.onload = function () {
           printWindow.print();
         };
+      },
+
+      exportExcel() {
+        const border =
+          'border-top:1px solid #000;border-right:1px solid #000;border-bottom:1px solid #000;border-left:1px solid #000;';
+        const cellBase = `${border}padding:4px;mso-number-format:"\\@";vertical-align:middle;text-align:center;mso-horizontal-align:center;`;
+        const th = `${cellBase}font-weight:bold;font-family:'宋体';font-size:12pt;`;
+        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 title = `${this.groupName || ''}入库单`;
+        const colWidths = [55, 250, 90, 70, 90, 100];
+        const colGroup = colWidths
+          .map((w) => `<col width="${w}" style="width:${w}pt;" />`)
+          .join('');
+
+        // 遍历多个单据生成多个表格
+        let tables = '';
+        this.formData.forEach((rowItem, wi) => {
+          const list = rowItem.outInDetailList || [];
+          const totalAmount = this.getTotalAmount(rowItem);
+          const warehouseName = this.warehouseMap[rowItem.id] || '';
+          const supplierName = this.supplierMap[rowItem.id] || '';
+
+          const rows = list
+            .map(
+              (item, index) => `
+              <tr height="24" style="height:24pt;">
+                <td align="center" valign="middle" style="${td}">${index + 1}</td>
+                <td align="center" valign="middle" style="${td}">${item.categoryModel || ''}${item.categoryModel && item.specification ? '/' : ''}${item.specification || ''}</td>
+                <td align="center" valign="middle" style="${td}">${item.colorKey || ''}</td>
+                <td align="center" valign="middle" style="${td}">${item.measureUnit || ''}</td>
+                <td align="center" valign="middle" style="${td}">${item.measureQuantity || ''}</td>
+                <td align="center" valign="middle" style="${td}">${item.batchNo || ''}</td>
+              </tr>`
+            )
+            .join('');
+
+          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="6" 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="3" align="left" valign="middle" style="${labelLeft}">供应商名称:${supplierName}</td>
+              <td align="left" valign="middle" style="${labelLeft}">日期:${rowItem.storageTime || ''}</td>
+              <td colspan="2" align="left" valign="middle" style="${labelLeft}">编号:${rowItem.bizNo || ''}</td>
+            </tr>
+            
+            <tr height="28" style="height:28pt;">
+              <td align="center" valign="middle" style="${th}">编号</td>
+              <td align="center" valign="middle" style="${th}">型号规格</td>
+              <td align="center" valign="middle" style="${th}">颜色</td>
+              <td align="center" valign="middle" style="${th}">单位</td>
+              <td align="center" valign="middle" style="${th}">入库数量</td>
+              <td align="center" valign="middle" style="${th}">批次号</td>
+            </tr>
+            ${rows}
+            <tr height="26" style="height:26pt;">
+              <td colspan="2" align="center" valign="middle" style="${td};font-weight:bold;">合计:</td>
+              <td align="center" valign="middle" style="${td}"></td>
+              <td align="center" valign="middle" style="${td}"></td>
+              <td align="center" valign="middle" style="${td};font-weight:bold;">${totalAmount}</td>
+              <td align="center" valign="middle" style="${td}"></td>
+            </tr>
+            <tr height="28" style="height:28pt;">
+              <td align="left" valign="middle" style="${labelLeft}">主管:${rowItem.verifyName || ''}</td>
+              <td align="left" valign="middle" style="${labelLeft}">仓库:${warehouseName}</td>
+              <td align="left" valign="middle" style="${labelLeft}">记账:${rowItem.extInfo?.createUserName || ''}</td>
+              <td colspan="3" align="left" valign="middle" style="${labelLeft}">经手人:${rowItem.fromUser || ''}</td>
+            </tr>
+          </table>
+          <br style="mso-special-character:line-break;page-break-before:always" />`;
+        });
+
+        const html = `<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">
+        <head>
+        <meta charset="UTF-8" />
+        <style>
+          br { mso-data-placement: same-cell; }
+          table { mso-displayed-decimal-separator:"."; mso-displayed-thousand-separator:","; }
+          td { mso-ignore:padding; }
+        </style>
+        <!--[if gte mso 9]><xml>
+        <x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
+        <x:Name>${title}</x:Name>
+        <x:WorksheetOptions>
+          <x:DefaultRowHeight>260</x:DefaultRowHeight>
+          <x:Print><x:ValidPrinterInfo/><x:HorizontalResolution>600</x:HorizontalResolution><x:VerticalResolution>600</x:VerticalResolution></x:Print>
+          <x:Selected/>
+          <x:DoNotDisplayGridlines/>
+        </x:WorksheetOptions>
+        </x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook>
+        </xml><![endif]-->
+        </head>
+        <body>${tables}</body></html>`;
+
+        const blob = new Blob(['' + html], {
+          type: 'application/vnd.ms-excel;charset=utf-8'
+        });
+        const firstBizNo = this.formData[0]?.bizNo || '';
+        const suffix = this.formData.length > 1 ? `等${this.formData.length}条` : firstBizNo;
+        saveAs(blob, `${title}_${suffix}.xls`);
       }
     }
   };

+ 41 - 33
src/views/warehouseManagement/stockManagement/index.vue

@@ -176,6 +176,7 @@
       <ele-pro-table
         ref="table"
         :columns="columns"
+        :selection.sync="selection"
         height="calc(100vh-300px)"
         :pageSize="20"
         :datasource="datasource"
@@ -338,6 +339,7 @@
     data() {
       return {
         auditStatus,
+        selection: [],
         warehousingType,
         sceneState,
         codeList: [],
@@ -370,10 +372,16 @@
         ],
         currentRow: {},
         columns: [
+          // {
+          //   slot: 'selection',
+          //   label: '选择',
+          //   width: 50,
+          //   align: 'center'
+          // },
           {
-            slot: 'selection',
-            label: '选择',
-            width: 50,
+            width: 45,
+            type: 'selection',
+            columnKey: 'selection',
             align: 'center'
           },
           {
@@ -594,29 +602,29 @@
         console.log('下架');
       },
       priceMaintenance() {
-        if (Object.keys(this.currentRow).length == 0) {
-          return this.$message.error('请选择单据');
+        if (this.selection.length != 1) {
+          return this.$message.error('请选择一条单据');
         } else {
-          if (this.currentRow.verifyStatus == 2) {
+          if (this.selection[0].verifyStatus == 2) {
             this.$router.push({
               path: '/warehouseManagement/stockManagement/priceMaintenance',
               query: {
-                ids: this.currentRow.id
+                ids: this.selection[0].id
               }
             });
-            /* this.$refs.priceMaintenanceDialogRef.open(this.currentRow.id); */
+            /* this.$refs.priceMaintenanceDialogRef.open(this.selection[0].id); */
           } else {
             this.$message.error('该单据未审核通过');
           }
         }
       },
       async outbound() {
-        if (Object.keys(this.currentRow).length == 0) {
-          return this.$message.error('请选择单据');
+        if (this.selection.length != 1) {
+          return this.$message.warning('请选择一条单据');
         } else {
-          if (this.currentRow.verifyStatus == 2) {
+          if (this.selection[0].verifyStatus == 2) {
             const res = await storageApi.getInboundDetailsById(
-              this.currentRow.id
+              this.selection[0].id
             );
             const arr = [];
             for (const key in res.outInDetailList) {
@@ -771,15 +779,15 @@
         this.search();
       },
       print() {
-        if (!this.currentRow.id) {
+        if (this.selection.length != 1) {
           return this.$message({
-            message: '请先选择单据',
+            message: '请先选择一条单据',
             type: 'warning',
             duration: 2000
           });
         }
 
-        if (this.currentRow.verifyStatus !== 2) {
+        if (this.selection[0].verifyStatus !== 2) {
           return this.$message({
             message: '该单据未审核通过',
             type: 'warning',
@@ -787,51 +795,51 @@
           });
         }
 
-        console.log(this.currentRow);
+        console.log(this.selection[0]);
 
-        this.$refs.printQRCodeRef.init(this.currentRow.id);
+        this.$refs.printQRCodeRef.init(this.selection[0].id);
 
         console.log('print');
       },
 
       printkEnter() {
-        if (!this.currentRow.id) {
+        if (this.selection.length != 1) {
           return this.$message({
-            message: '请先选择单据',
+            message: '请先选择一条单据',
             type: 'warning',
             duration: 2000
           });
         }
 
-        this.$refs.printStockEnterRef.init(this.currentRow.id, this.currentRow);
+        this.$refs.printStockEnterRef.init(this.selection[0].id, this.selection[0]);
       },
       printkEnterHt() {
-        if (!this.currentRow.id) {
-          return this.$message({
-            message: '请先选择单据',
-            type: 'warning',
-            duration: 2000
-          });
-        }
-
-        this.$refs.printStockEnterHtRef.init(this.currentRow.id, this.currentRow);
+        // if (this.selection.length != 1) {
+        //   return this.$message({
+        //     message: '请先选择一条单据',
+        //     type: 'warning',
+        //     duration: 2000
+        //   });
+        // }
+
+        this.$refs.printStockEnterHtRef.init( this.selection.map(item => item.id), this.selection);
       },
       handlePrint(refName) {
-        if (!this.currentRow.id) {
+        if (this.selection.length != 1) {
           return this.$message({
-            message: '请先选择单据',
+            message: '请先选择一条单据',
             type: 'warning',
             duration: 2000
           });
         }
-        if (this.currentRow.verifyStatus !== 2) {
+        if (this.selection[0].verifyStatus !== 2) {
           return this.$message({
             message: '该单据未审核通过',
             type: 'warning',
             duration: 2000
           });
         }
-        this.$refs[refName].init(this.currentRow.id, this.currentRow);
+        this.$refs[refName].init(this.selection[0].id, this.selection[0]);
       }
     }
   };

+ 2 - 2
vue.config.js

@@ -35,9 +35,9 @@ module.exports = {
         // target: 'http://124.71.68.31:50001',
         // target: 'http://192.168.1.132:18086',
         // target: 'http://192.168.1.105:18086', //开发
-        target: 'http://192.168.1.251:18086', //开发
+        // target: 'http://192.168.1.25:18086', //开发
         // target: 'http://192.168.1.251:18186', //测试
-        // target: 'http://192.168.1.25:18086',
+        target: 'http://192.168.1.116:18086',
 
         // target: 'http://192.168.1.116:18086',
         changeOrigin: true, // 只有这个值为true的情况下 才表示开启跨域

Разница между файлами не показана из-за своего большого размера
+ 796 - 705
yarn.lock


Некоторые файлы не были показаны из-за большого количества измененных файлов