فهرست منبع

feat(发货单): 添加送货单打印功能及金额转中文工具函数,特瑞

liujt 7 ماه پیش
والد
کامیت
007112377a

+ 74 - 0
src/utils/util.js

@@ -83,3 +83,77 @@ export function getSummaries(param, key, unit) {
 
   return sums;
 }
+
+// 数字金额转大写金额
+export function convertToChinese(num) {
+  if (num === 0 || num === '0' || !num) return '零元整';
+  
+  // 中文数字
+  const cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
+  // 单位
+  const cnIntRadice = ['', '拾', '佰', '仟'];
+  // 整数部分扩展单位
+  const cnIntUnits = ['', '万', '亿', '兆'];
+  // 小数部分单位
+  const cnDecUnits = ['角', '分'];
+  // 整数部分前缀
+  const cnInteger = '整';
+  // 零前缀
+  const cnIntLast = '元';
+  
+  // 处理数字
+  let integerNum;
+  let decimalNum;
+  let chineseInteger = '';
+  let chineseDecimal = '';
+  
+  // 转换为字符串并分割整数和小数部分
+  const numStr = parseFloat(num).toFixed(2);
+  const parts = numStr.split('.');
+  integerNum = parts[0];
+  decimalNum = parts[1];
+  
+  // 处理整数部分
+  if (parseInt(integerNum, 10) > 0) {
+    let zeroCount = 0;
+    for (let i = 0; i < integerNum.length; i++) {
+      const n = parseInt(integerNum.charAt(i), 10);
+      const p = integerNum.length - i - 1;
+      const q = p / 4;
+      const m = p % 4;
+      
+      if (n === 0) {
+        zeroCount++;
+      } else {
+        if (zeroCount > 0) {
+          chineseInteger += cnNums[0];
+        }
+        zeroCount = 0;
+        chineseInteger += cnNums[n] + cnIntRadice[m];
+      }
+      
+      if (m === 0 && zeroCount < 4) {
+        chineseInteger += cnIntUnits[q];
+      }
+    }
+  } else {
+    chineseInteger += cnNums[0];
+  }
+  
+  // 处理小数部分
+  if (decimalNum !== '00') {
+    for (let i = 0; i < decimalNum.length; i++) {
+      const n = parseInt(decimalNum.charAt(i), 10);
+      if (n !== 0) {
+        chineseDecimal += cnNums[n] + cnDecUnits[i];
+      }
+    }
+  }
+  
+  // 组合结果
+  if (chineseDecimal === '') {
+    return chineseInteger + cnIntLast + cnInteger;
+  } else {
+    return chineseInteger + cnIntLast + chineseDecimal;
+  }
+}

+ 214 - 0
src/views/saleManage/saleOrder/invoice/components/print-template-tr.vue

@@ -0,0 +1,214 @@
+<template>
+  <ele-modal
+    title="送货单"
+    :visible.sync="QRvisible"
+    v-if="QRvisible"
+    width="90%"
+  >
+    <div
+      id="printSection"
+      style="
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        flex-direction: column;
+      "
+    >
+      <div>
+        <div
+          style="
+            font-size: 20px;
+            font-weight: 800;
+            padding-right: 20px;
+            width: 400px;
+            margin: 0 auto;
+          "
+          >{{ groupName }}送货单</div
+        >
+      </div>
+      <!-- 表头信息 -->
+      <div style="width: 100%; margin-bottom: 10px; margin-top: 20px;">
+        <table cellspacing="0" style="width: 100%; font-size: 12px;">
+          <tbody>
+            <tr>
+              <td style="text-align: right; width: 80px; padding: 3px;">购货单位:</td>
+              <td style="padding: 3px; width: 30%;">{{ formData.contactName }}</td>
+              <td style="text-align: right; width: 80px; padding: 3px;">票据类型:</td>
+              <td style="padding: 3px;"></td>
+            </tr>
+            <tr>
+              <td style="text-align: right; padding: 3px;">送货地址:</td>
+              <td style="padding: 3px;" colspan="3">{{ formData.receiveAddress }}</td>
+            </tr>
+            <tr>
+              <td style="text-align: right; padding: 3px;">联系人:</td>
+              <td style="padding: 3px; width: 150px;">{{ formData.linkName || '' }}</td>
+              <td style="text-align: right; padding: 3px;">联系电话:</td>
+              <td style="padding: 3px; width: 150px;">{{ formData.linkPhone || '' }}</td>
+              <td style="text-align: right; padding: 3px;">发货日期:</td>
+              <td style="padding: 3px;">{{ formData.createTime }}</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+      <table
+        cellspacing="0"
+        border
+        style="
+          width: 100%;
+          table-layout: fixed;
+          word-break: break-all;
+          word-wrap: break-word;
+          font-size: 12px;
+        "
+      >
+        <tbody>
+          <tr align="center">
+            <td style="padding: 5px; width: 100px"> 商品条码 </td>
+            <td style="padding: 5px"> 产品名称 </td>
+            <td style="padding: 5px"> 规格型号 </td>
+            <td style="padding: 5px; width: 60px"> 单位 </td>
+            <td style="padding: 5px; width: 80px"> 数量 </td>
+            <td style="padding: 5px; width: 80px"> 单价 </td>
+            <td style="padding: 5px; width: 90px"> 金额 </td>
+            <td style="padding: 5px"> 注册证号 </td>
+            <td style="padding: 5px"> 注册人 </td>
+            <td style="padding: 5px"> 生产批号 </td>
+            <td style="padding: 5px; width: 120px"> 生产/失效日期 </td>
+            <td style="padding: 5px"> 存储条件 </td>
+            <td style="padding: 5px"> 备注 </td>
+          </tr>
+
+          <tr align="center" v-for="(item, index) in formData.productList">
+            <td style="padding: 5px"> {{ item.productCode || '' }} </td>
+            <td style="padding: 5px"> {{ item.productName }} </td>
+            <td style="padding: 5px"> {{ item.specification }}/{{ item.modelType }} </td>
+            <td style="padding: 5px"> {{ item.measuringUnit }}</td>
+            <td style="padding: 5px"> {{ item.totalCount }}</td>
+            <td style="padding: 5px"> {{ item.singlePrice }} </td>
+            <td style="padding: 5px"> {{ item.totalPrice }} </td>
+            <td style="padding: 5px">  </td>
+            <td style="padding: 5px">  </td>
+            <td style="padding: 5px"> {{ item.batchNo }} </td>
+            <td style="padding: 5px"> {{ item.produceDeliveryDeadline }} / {{ item.guaranteePeriodDeadline }} </td>
+            <td style="padding: 5px">  </td>
+            <td style="padding: 5px"> {{ item.remark }} </td>
+          </tr>
+          <tr align="center">
+            <td style="padding: 5px" colspan="4"> 合计 </td>
+            <!-- <td style="padding: 5px" colspan="4">  </td> -->
+            <td style="padding: 5px">{{ getTotalValue('totalCount', 2) }} </td>
+            <td style="padding: 5px"> </td>
+            <td style="padding: 5px"> {{ getTotalValue('totalPrice', 2) }} </td>
+            <td style="padding: 5px" colspan="6">  </td>
+          </tr>
+          <tr align="center">
+            <td style="padding: 5px;" colspan="4">合计金额大写</td>
+            <td style="padding: 5px;" colspan="9">{{ convertToChinese(getTotalValue('totalPrice', 2)) }}</td>
+          </tr>
+        </tbody>
+      </table>
+      <!-- 联系信息 -->
+      <div style="width: 100%; margin-top: 10px; font-size: 12px; display: flex; align-items: center;">
+        <div style="width: 33%;">制单:{{ formData.makerName }}</div>
+        <div style="width: 33%;">发货人:{{ formData.createUserName }}</div>
+        <div style="width: 33%;">审核人:{{ formData.reviewerName }}</div>
+      </div>
+      
+      <!-- 生产企业信息 -->
+      <div style="width: 100%; margin-top: 10px; font-size: 12px; display: flex; align-items: center;">
+        <div style="width: 50%;">生产企业:{{ companyInfo?.name || '' }}</div>
+        <div style="width: 50%;">生产许可证号:{{ companyInfo?.unifiedSocialCreditCode || '' }}</div>
+      </div>
+
+      <!-- 生产企业信息 -->
+      <div style="width: 100%; margin-top: 10px; font-size: 12px; display: flex; align-items: center;">
+        <div style="width: 100%;">公司地址:{{ companyInfo?.address || '' }}</div>
+      </div>
+
+      <!-- 生产企业信息 -->
+      <div style="width: 100%; margin-top: 10px; font-size: 12px; display: flex; align-items: center;">
+        <div style="width: 33%;">电话:  {{ companyInfo?.tel || '' }}</div>
+        <div style="width: 33%;">传真:{{ companyInfo?.fax || '' }}</div>
+      </div>
+    </div>
+
+    <div slot="footer">
+      <el-button @click="print">打印预览</el-button>
+      <el-button @click="close">关闭</el-button>
+    </div>
+  </ele-modal>
+</template>
+
+<script>
+  import { getSendSaleOrderrecordDetailSplit } from '@/api/saleManage/saleordersendrecord';
+  import { mapGetters } from 'vuex';
+  import { convertToChinese as numToChinese } from '@/utils/util';
+  export default {
+    name: 'print',
+    computed: {
+      ...mapGetters(['user'])
+    },
+    props: {
+      groupName: '',
+      companyInfo: {}
+    },
+    data() {
+      return {
+        checked: '',
+        QRvisible: false,
+        isPrintPrice: false,
+        formData: {}
+      };
+    },
+
+    methods: {
+      async open(id, isPrintPrice) {
+        console.log('this.companyInfo',this.companyInfo)
+        this.formData = await getSendSaleOrderrecordDetailSplit(id);
+        this.QRvisible = true;
+        this.isPrintPrice = isPrintPrice;
+        //包装维度
+      },
+      close() {
+        this.QRvisible = false;
+      },
+      getTotalValue(key, num) {
+          let val = this.formData?.productList?.reduce((total, item) => {
+            return (total += Number(item[key] || 0));
+          }, 0);
+
+          return (
+            (val &&
+              parseFloat(val)
+                .toFixed(num)
+                .replace(/\.?0+$/, '')) ||
+            0
+          );
+        },
+        // 将导入的函数添加到methods中,使其在模板中可用
+        convertToChinese(num) {
+          return numToChinese(num);
+        },
+      print() {
+        const printSection = document.getElementById('printSection');
+        // 创建打印任务
+        const printWindow = window.open('', '_blank');
+        printWindow.document.open();
+        printWindow.document.write('<html><head><title>打印预览</title>');
+        printWindow.document.write(
+          '<link rel="stylesheet" href="your-stylesheet-url.css" type="text/css" />'
+        );
+        printWindow.document.write('</head><body>');
+        printWindow.document.write(printSection.innerHTML);
+        printWindow.document.write('</body></html>');
+        printWindow.document.close();
+        printWindow.onload = function () {
+          printWindow.print();
+        };
+      }
+    }
+  };
+</script>
+
+<style lang="scss"></style>

+ 16 - 1
src/views/saleManage/saleOrder/invoice/index.vue

@@ -84,6 +84,12 @@
                   @click.native="handlePrint('printTemplateJrRef')"
                   >发货单</el-dropdown-item
                 >
+
+                <el-dropdown-item
+                  v-if="$hasPermission('eom:print-invoice8')"
+                  @click.native="handlePrint('printTemplateTrRef')"
+                  >送货单打印</el-dropdown-item
+                >
               </el-dropdown-menu>
             </el-dropdown>
             <exportButton
@@ -240,6 +246,11 @@
       ref="printTemplateHtRef"
       :groupName="groupName"
     ></printTemplateHt>
+    <printTemplateTr
+      ref="printTemplateTrRef"
+      :groupName="groupName"
+      :companyInfo="companyInfo"
+    ></printTemplateTr>
 
     <process-submit-dialog
       :isNotNeedProcess="false"
@@ -274,6 +285,7 @@
   import printTemplateBs from '@/views/saleManage/saleOrder/invoice/components/print-template-bs.vue';
   import printTemplateJr from '@/views/saleManage/saleOrder/invoice/components/print-template-jr.vue';
   import printTemplateHt from '@/views/saleManage/saleOrder/invoice/components/print-template-ht.vue';
+  import printTemplateTr from '@/views/saleManage/saleOrder/invoice/components/print-template-tr.vue';
   import {
     deleteSendInformation,
     getSendTableList,
@@ -306,7 +318,8 @@
       printTemplateBs,
       printTemplateJr,
       exportButton,
-      printTemplateHt
+      printTemplateHt,
+      printTemplateTr
     },
 
     //客户管理数据
@@ -328,6 +341,7 @@
       return {
         params: {},
         activeComp: 'saleorder',
+        companyInfo: {},
         tabOptions: [
           { key: 'saleorder', name: '销售订单' },
           { key: 'invoice', name: '发货单' },
@@ -491,6 +505,7 @@
       }).then((res) => {
         if (res.list?.length > 0) {
           this.groupName = res.list[0].name;
+          this.companyInfo = res.list[0];
         }
       });