From 86c6109d652a6b863b4f890e3bea573877503932 Mon Sep 17 00:00:00 2001
From: deslrey <deslre0381@gmail.com>
Date: 星期一, 12 一月 2026 11:56:09 +0800
Subject: [PATCH] 外购订单的标签打印功能

---
 src/api/business/productOrder.js                                       |   10 +
 src/views/business/outsourcingFinishProduct/index.vue                  |    4 
 src/views/business/outsourcingFinishProduct/components/printDialog.vue |  318 +++++++++++++++++++++++++++++++++-------------------
 3 files changed, 211 insertions(+), 121 deletions(-)

diff --git a/src/api/business/productOrder.js b/src/api/business/productOrder.js
index 881ca80..32c583b 100644
--- a/src/api/business/productOrder.js
+++ b/src/api/business/productOrder.js
@@ -98,6 +98,16 @@
     data: query
   })
 }
+
+//  澶栬喘涓嬪崟鎴愬搧鏍囩鎵撳嵃淇℃伅
+export function labelOutsideOrderPrinting(query) {
+  return request({
+    url: '/insOrder/labelOutsideOrderPrinting',
+    method: 'post',
+    data: query
+  })
+}
+
 // 鏍规嵁璁㈠崟id鏌ヨ鏍峰搧
 export function getSampleByOrderId(query) {
   return request({
diff --git a/src/views/business/outsourcingFinishProduct/components/printDialog.vue b/src/views/business/outsourcingFinishProduct/components/printDialog.vue
index 77a921f..67aea38 100644
--- a/src/views/business/outsourcingFinishProduct/components/printDialog.vue
+++ b/src/views/business/outsourcingFinishProduct/components/printDialog.vue
@@ -1,60 +1,67 @@
 <template>
   <div>
-    <el-dialog :visible.sync="isShow" title="鏍囩鎵撳嵃" top="5vh" width="600px" @close="$emit('closePrintDialog')">
+    <el-dialog title="鏍囩鎵撳嵃" :visible.sync="isShow" width="600px" top="5vh" @close="$emit('closePrintDialog')">
       <div style="width:100%;height: 400px;overflow-y: auto;text-align: left">
         <div class="dia_body">
-          <el-checkbox
-            v-model="checkAll"
-            :indeterminate="isIndeterminate"
-            style="margin: 10px 5px;"
+          <el-checkbox style="margin: 10px 5px;" :indeterminate="isIndeterminate" v-model="checkAll"
             @change="handleCheckAllChange">鍏ㄩ��</el-checkbox>
-          <el-checkbox-group v-model="checkIndexList" @change="changePrintCode()">
-            <el-card v-for="(item, i) in barcodeData" :key="i" class="box-card" style="margin-bottom: 15px; font-size: 16px !important;">
-              <el-checkbox :key="i" :label="i" style="position: relative;top:0;left:10px"><br></el-checkbox>
+          <el-checkbox-group @change="changePrintCode()" v-model="checkIndexList">
+            <el-card class="box-card" v-for="(item, i) in barcodeData" :key="i"
+              style="margin-bottom: 15px; font-size: 16px !important;">
+              <el-checkbox :label="i" :key="i" style="position: relative;top:0;left:10px"><br></el-checkbox>
               <div>
-                <div class="titleH1" style="text-align: center; margin-bottom: 2px;font-size: 16px">妫�娴嬩腑蹇冩牱鍝佹爣璇嗗崱</div>
-                <div style="text-align: center;">
-                  <barcode :displayValue="false" :height="34" :value="item.barcode" :width="2"></barcode>
-                </div>
-                <div style="margin-left: 20px;text-align: left">
-                  <div class="item">
-                    <span class="full-title">鏍峰搧鍚嶇О</span>:
-                    <span class="info">{{ item.sampleView }}</span>
+                <div style="text-align: center; margin-bottom: 2px;font-size: 22px;font-weight: bold;">鎴愬搧妫�娴�</div>
+                <div style="text-align: center; margin-bottom: 2px;font-size: 16px;font-weight: bold;">{{ item.partDesc
+                }}</div>
+                <div style="display: flex; align-items: center;">
+                  <div style="flex: 0 0 45%; text-align: center;">
+                    <vueQr :text="getQrCodeText(item)" :size="160" :margin="2"></vueQr>
+                    <div style="margin-top: 5px; font-size: 14px;">
+                      <span class="print-person-label">鎵撳嵃浜�</span>
+                      <span style="margin-left: 20px; font-weight: bold;">{{ nickName }}</span>
+                    </div>
                   </div>
-                  <div class="item">
-                    <span class="full-title">鐢熶骇鍗曚綅</span>:
-                    <span class="info">{{ item.production }}</span>
-                  </div>
-                  <div class="item2">
-                    <span class="full-title">瑙勬牸鍨嬪彿</span>:
-                    <span class="info">{{ item.sampleModel }}</span>
-                  </div>
-                  <div class="item">
-                    <span class="full-title">濮旀墭鏃ユ湡</span>:
-                    <span class="info">{{ item.sendTime }}</span>
-                  </div>
-                  <div class="item">
-                    <span class="full-title">濮旀墭浜�</span>:
-                    <span class="info2">{{ item.prepareUser }}</span>
-                    <span class="full-title">妫�娴嬬紪鍙�</span>:
-                    <span class="info">{{ item.entrustCode }}</span>
-                  </div>
-                  <div class="item">
-                    <span class="full-title">鏍峰搧鏁伴噺</span>:
-                    <span class="info2">{{ item.testQuantity }}</span>
-                  </div>
-                  <div style="font-weight: bold;display: flex;align-items: center;">
-                    <span class="full-title">鏍峰搧鐘舵��</span>:
-                    <el-radio-group v-model="item.insState" v-removeAriaHidden style="margin-top: 7px;margin-left: 4px;">
-                      <el-radio :label="0" style="font-weight: bold;margin-right: 7px;">寰呮</el-radio>
-                      <el-radio :label="1" style="font-weight: bold;margin-right: 7px;">鍦ㄦ</el-radio>
-                      <el-radio :label="2" style="font-weight: bold;margin-right: 7px;">宸叉</el-radio>
-                    </el-radio-group>
-                    <span>
-                      <el-radio v-model="item.isLeave"
-                                :label="true"
-                                size="small" style="margin-left: 14px;margin-top: 3px;" @click.native.prevent="changeIsLeave(item)">鐣欐牱</el-radio>
-                    </span>
+                  <div style="flex: 1; margin-left: 10px;text-align: left">
+                    <div class="item">
+                      <span class="full-title">SN鍙�</span>
+                      <span class="info">{{ item.lotBatchNo }}</span>
+                    </div>
+                    <div class="item">
+                      <span class="full-title">缁濈紭棰滆壊</span>
+                      <span class="info">{{ item.insulationColor }}</span>
+                    </div>
+                    <div class="item2">
+                      <span class="full-title">鎶ゅ棰滆壊</span>
+                      <span class="info">{{ item.outerColor }}</span>
+                    </div>
+                    <div class="item">
+                      <span class="full-title">杞藉叿缂栧彿</span>
+                      <span class="info">{{ item.drumNo }}</span>
+                    </div>
+                    <div class="item">
+                      <span class="full-title">璧锋绫虫爣</span>
+                      <span class="info">{{ item.startMeterMark }} - {{ item.endMeterMark }}</span>
+                    </div>
+                    <div class="item">
+                      <span class="full-title">闀垮害(km)</span>
+                      <span class="info">{{ calcInbondLength(item.startMeterMark, item.endMeterMark) }}</span>
+                    </div>
+                    <div class="item">
+                      <span class="full-title">妫�娴嬩汉鍛�</span>
+                      <span class="info">{{ item.inspectorName }}</span>
+                    </div>
+                    <div class="item">
+                      <span class="full-title">妫�娴嬬粨璁�</span>
+                      <span class="info">{{ formatData(item.insState) }}</span>
+                    </div>
+                    <div class="item">
+                      <span class="full-title">鍏ュ簱鏃堕棿</span>
+                      <span class="info">{{ item.updateTime }}</span>
+                    </div>
+                    <div class="item">
+                      <span class="full-title">闆朵欢鍙�</span>
+                      <span class="info">{{ item.partNo }}</span>
+                    </div>
                   </div>
                 </div>
               </div>
@@ -69,49 +76,63 @@
         </el-row>
       </span>
     </el-dialog>
-    <div class="el-dialog-body" style="overflow-y: auto;margin-top: 0;position: fixed;top: 20px;right: 10px;z-index: 99999;">
-      <div id="printOrder" ref="printOrder" class="printOrder">
-        <el-card v-for="(item, i) in checkDataList" :key="i" class="box-card" style="font-size: 0.29cm !important;font-weight: 700;page-break-after: always;color: #000;box-shadow: none;margin: 0 !important;padding: 0 !important;">
+    <div class="el-dialog-body"
+      style="overflow-y: auto;margin-top: 0;position: fixed;top: 20px;right: 10px;z-index: 99999;width: 500px;">
+      <div id="printOrder" class="printOrder" ref="printOrder">
+        <el-card class="box-card" v-for="(item, i) in checkDataList" :key="i"
+          style="font-size: 0.29cm !important;font-weight: 700;page-break-after: always;color: #000;box-shadow: none;margin: 0 !important;padding: 0 !important;">
           <div>
-            <div class="titleH1" style="text-align: center;margin-bottom: 1px">妫�娴嬩腑蹇冩牱鍝佹爣璇嗗崱</div>
-            <div style="text-align: center;">
-              <barcode :displayValue="false" :height="22" :value="item.barcode" :width="1.6"></barcode>
-            </div>
-            <div style="margin-left: 12px;text-align: left">
-              <div class="item">
-                <span class="full-title4">鏍峰搧鍚嶇О:</span>
-                <span class="info4">{{ item.sampleView }}</span>
+            <div class="titleH1" style="text-align: center;margin-bottom: 1px">鎴愬搧妫�娴�</div>
+            <div class="titleH1" style="text-align: center;margin-bottom: 1px">{{ item.partDesc }}</div>
+            <div style="display: flex; align-items: center;">
+              <div style="flex: 0 0 45%; text-align: center;">
+                <vueQr :text="getQrCodeText(item)" :size="160" :margin="2"></vueQr>
+                <div style="margin-top: 5px;">
+                  <span class="print-person-label">鎵撳嵃浜�</span>
+                  <span style="margin-left: 20px; font-weight: bold;">{{ nickName }}</span>
+                </div>
               </div>
-              <div class="item">
-                <span class="full-title2">鐢熶骇鍗曚綅</span>:
-                <span class="info">{{ item.production }}</span>
-              </div>
-              <div class="item2">
-                <span class="full-title4">瑙勬牸鍨嬪彿:</span>
-                <span class="info4">{{ item.sampleModel }}</span>
-              </div>
-              <div class="item">
-                <span class="full-title2">濮旀墭鏃ユ湡</span>:
-                <span class="info">{{ item.sendTime }}</span>
-              </div>
-              <div class="item">
-                <span class="full-title2">濮旀墭浜�</span>:
-                <span class="info3">{{ item.prepareUser }}</span>
-                <span class="full-title2">妫�娴嬬紪鍙�</span>:
-                <span class="info">{{ item.entrustCode }}</span>
-              </div>
-              <div class="item">
-                <span class="full-title2">鏍峰搧鏁伴噺</span>:
-                <span class="info3">{{ item.testQuantity }}</span>
-              </div>
-              <div>
-                <span class="full-title2">鏍峰搧鐘舵��</span>:
-                <span style="white-space: nowrap;margin-left: 2px">
-                  寰呮<span v-if="item.insState!==0" class="scor"></span><span v-if="item.insState===0" class="checked">鈭�</span>
-                  鍦ㄦ<span v-if="item.insState!==1" class="scor"></span><span v-if="item.insState===1" class="checked">鈭�</span>
-                  宸叉<span v-if="item.insState!==2" class="scor"></span><span v-if="item.insState===2" class="checked">鈭�</span>
-                  鐣欐牱<span v-if="!item.isLeave" class="scor"></span><span v-if="item.isLeave" class="checked">鈭�</span>
-                </span>
+              <div style="flex: 1; margin-left: 5px;text-align: left">
+                <div class="item">
+                  <span class="full-title">SN鍙�</span>
+                  <span class="info">{{ item.lotBatchNo }}</span>
+                </div>
+                <div class="item">
+                  <span class="full-title">缁濈紭棰滆壊</span>
+                  <span class="info">{{ item.insulationColor }}</span>
+                </div>
+                <div class="item2">
+                  <span class="full-title">鎶ゅ棰滆壊</span>
+                  <span class="info">{{ item.outerColor }}</span>
+                </div>
+                <div class="item">
+                  <span class="full-title">杞藉叿缂栧彿</span>
+                  <span class="info">{{ item.drumNo }}</span>
+                </div>
+                <div class="item">
+                  <span class="full-title">璧锋绫虫爣</span>
+                  <span class="info">{{ item.startMeterMark }} - {{ item.endMeterMark }}</span>
+                </div>
+                <div class="item">
+                  <span class="full-title">闀垮害(km)</span>
+                  <span class="info">{{ calcInbondLength(item.startMeterMark, item.endMeterMark) }}</span>
+                </div>
+                <div class="item">
+                  <span class="full-title">妫�娴嬩汉鍛�</span>
+                  <span class="info">{{ item.inspectorName }}</span>
+                </div>
+                <div class="item">
+                  <span class="full-title">妫�娴嬬粨璁�</span>
+                  <span class="info">{{ formatData(item.insState) }}</span>
+                </div>
+                <div class="item">
+                  <span class="full-title">鍏ュ簱鏃堕棿</span>
+                  <span class="info">{{ item.updateTime }}</span>
+                </div>
+                <div class="item">
+                  <span class="full-title">闆朵欢鍙�</span>
+                  <span class="info">{{ item.partNo }}</span>
+                </div>
               </div>
             </div>
           </div>
@@ -123,17 +144,25 @@
 
 <script>
 import PrintJS from "print-js";
-import {labelOrderPrinting} from "@/api/business/productOrder";
+import vueQr from "vue-qr";
+import { labelOutsideOrderPrinting } from "@/api/business/productOrder";
+import { mapGetters } from "vuex";
 
 export default {
   name: "printDialog",
   // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
-  components: {},
+  // 2. 鍦ㄨ繖閲屾敞鍐岀粍浠�
+  components: {
+    vueQr
+  },
   props: {
     printDialog: {
       type: Boolean,
       default: () => false
     },
+  },
+  computed: {
+    ...mapGetters(["nickName"]),
   },
   data() {
     // 杩欓噷瀛樻斁鏁版嵁
@@ -158,17 +187,17 @@
         selection.map(m => {
           ids.push(m.id)
         })
-        labelOrderPrinting({
-          ids: ids
-        }).then(res => {
+        labelOutsideOrderPrinting({ ids: ids }).then(res => {
           if (res.code === 200 && res.data.length > 0) {
             res.data.forEach(item => {
+              console.log('item---', item)
               item.sendTime = item.sendTime && item.sendTime.substring(0, 10)
               item.sampleNumber = item.qtyArrived + item.buyUnitMeas
               this.$set(item, 'barcode', item.entrustCode)
-              this.$set(item, 'isLeave', item.insState === '2')
+              this.$set(item, 'isLeave', item.labelStatus === '2')
             })
             this.barcodeData = res.data
+            console.log('barcodeData---', this.barcodeData)
           }
         })
       } catch (e) {
@@ -176,10 +205,27 @@
       }
 
     },
-    changeIsLeave(item) {
-      const index = this.barcodeData.findIndex(val => val.entrustCode === item.entrustCode)
-      if (index > -1) {
-        this.barcodeData[index].isLeave = !this.barcodeData[index].isLeave
+    calcInbondLength(startMeterMark, endMeterMark) {
+      let inboundLength = null;
+      if ((startMeterMark != null && startMeterMark !== '') && (endMeterMark != null && endMeterMark !== '')) {
+        let minus = this.$Big(endMeterMark).minus(this.$Big(startMeterMark));
+        inboundLength = Math.abs(minus)
+      }
+      return inboundLength;
+    },
+    formatData(params) {
+      if (params == 0) {
+        return '妫�楠屼腑'
+      } else if (params == 1) {
+        return '鍚堟牸'
+      } else if (params == 2) {
+        return '涓嶅悎鏍�'
+      } else if (params == 3) {
+        return '鏈笅鍗�'
+      } else if (params == 4) {
+        return '璁╂鏀捐'
+      } else {
+        return null
       }
     },
     // 鍏ㄩ�夊閫夋鍥炶皟
@@ -197,6 +243,17 @@
     },
     changeType(type) {
       type = type === '1' ? '0' : '1'
+    },
+    // 鐢熸垚浜岀淮鐮佸唴瀹�
+    getQrCodeText(item) {
+      const data = {
+        sn_no: item.lotBatchNo,
+        vehicle_no: item.drumNo,
+        qty_arrived: this.calcInbondLength(item.startMeterMark, item.endMeterMark),
+        lot_batch_no: item.lotBatchNo,
+        part_no: item.partNo,
+      };
+      return JSON.stringify(data, null, 2);
     },
     //閫夋嫨瑕佹墦鍗扮殑浜岀淮鐮�
     changePrintCode() {
@@ -238,7 +295,7 @@
           }
           @media print{
             width: 400px;
-            height: 75px;
+            height: 800px;
             margin:0;
           }`,
         onPrintDialogClose: this.erexcel = false,
@@ -261,56 +318,70 @@
 
 <style scoped>
 .item {
-  margin-bottom: 4px;
+  margin-bottom: 2px;
+  line-height: 1.2;
 }
 
 .item2 {
-  margin-bottom: 8px;
+  margin-bottom: 2px;
   vertical-align: top;
+  line-height: 1.2;
 }
 
 .full-title {
   display: inline-block;
-  width: 80px;
+  width: 70px;
   text-align-last: justify;
+  text-align: justify;
+  font-weight: bold;
 }
 
+/* For the print section which might use smaller font */
 .full-title2 {
   display: inline-block;
-  width: 50px;
+  width: 60px;
   text-align-last: justify;
+  text-align: justify;
+  font-weight: bold;
 }
 
 .full-title4 {
   display: inline-block;
-  width: 53px;
+  width: 60px;
   text-align-last: justify;
+  text-align: justify;
   vertical-align: top;
+  font-weight: bold;
 }
 
 .info {
-  margin-left: 2px;
+  margin-left: 15px;
+  font-weight: bold;
 }
 
 .info2 {
-  margin-left: 2px;
-  margin-right: 30px;
-  width: 80px;
+  margin-left: 15px;
+  margin-right: 10px;
+  width: auto;
   display: inline-block;
+  font-weight: bold;
 }
 
 .info3 {
-  margin-left: 2px;
-  margin-right: 8px;
-  width: 44px;
+  margin-left: 15px;
+  margin-right: 10px;
+  width: auto;
   display: inline-block;
+  font-weight: bold;
 }
 
 .info4 {
   display: inline-block;
-  margin-left: 2px;
+  margin-left: 15px;
   white-space: normal;
-  width: 260px;
+  width: 200px;
+  font-weight: bold;
+  vertical-align: top;
 }
 
 .checkboxInfo {
@@ -331,17 +402,26 @@
 .checked {
   margin-right: 14px;
   margin-left: 4px;
+  font-weight: bold;
 }
 
->>> .el-checkbox {
+.print-person-label {
+  display: inline-block;
+  width: 50px;
+  text-align-last: justify;
+  text-align: justify;
+  font-weight: bold;
+}
+
+>>>.el-checkbox {
   margin-right: 10px;
 }
 
->>> .el-card {
+>>>.el-card {
   border: none;
 }
 
->>> .el-card__body {
+>>>.el-card__body {
   padding: 4px 2px 6px 14px;
 }
 </style>
diff --git a/src/views/business/outsourcingFinishProduct/index.vue b/src/views/business/outsourcingFinishProduct/index.vue
index 1acea36..3caa180 100644
--- a/src/views/business/outsourcingFinishProduct/index.vue
+++ b/src/views/business/outsourcingFinishProduct/index.vue
@@ -124,7 +124,7 @@
     <!-- 鎾ら攢鎶ユ -->
     <el-dialog :visible.sync="declareDialogVisible" title="鎶ユ鎾ら攢" width="30%">
       <p style="font-size:16px;color:#333333">鎵瑰彿<span style="color:#34BD66">{{ this.insOrderRow.updateBatchNo
-      }}</span>鐨勪俊鎭槸鍚�<span style="color: #FF4902">鎾ら攢鎶ユ</span>
+          }}</span>鐨勪俊鎭槸鍚�<span style="color: #FF4902">鎾ら攢鎶ユ</span>
       </p>
       <span slot="footer" class="dialog-footer">
         <el-row>
@@ -187,7 +187,7 @@
 </template>
 
 <script>
-import PrintDialog from "@/views/business/materialOrderComponents/materialOrder/printDialog.vue";
+import PrintDialog from "@/views/business/outsourcingFinishProduct/components/printDialog.vue";
 import ShowInfo from "@/views/business/materialOrderComponents/materialOrder/showInfo.vue";
 import DataLookVisible from "@/views/business/materialOrderComponents/materialOrder/dataLookVisible.vue";
 import FilesLookVisible from "@/views/business/materialOrderComponents/materialOrder/filesLookVisible.vue";

--
Gitblit v1.9.3