|  |  | 
 |  |  |             getWeighingOrder: (params = {}) => vm.$u.get('/mes/weighingVerification/pageVerificationMain', params), | 
 |  |  |             // 核磅详情     | 
 |  |  |             createDetail: (params = {}) => vm.$u.post('/mes/weighingVerification/createDetail', params), | 
 |  |  |  | 
 |  |  |             // 核磅记录 | 
 |  |  |             queryPacking: (params = {}) => vm.$u.get('/mes/weighingVerification/queryPacking', params), | 
 |  |  |         }, | 
 |  |  |         // 取消领料 | 
 |  |  |         cancelMaterialRequisition: { | 
 
 |  |  | 
 |  |  |           waivDevRejNo: codeInfo.WDR ? codeInfo.WDR : "*", // wdr号 | 
 |  |  |           productType: that.form.productType, | 
 |  |  |         }; | 
 |  |  |         if (codeInfo.CN != that.form.customerName1) { | 
 |  |  |           // 扫描报工单二维码 | 
 |  |  |           uni.showModal({ | 
 |  |  |             title: "提示", | 
 |  |  |             content: | 
 |  |  |               "客户不一致:" + codeInfo.CN + "||" + that.form.customerName1, | 
 |  |  |             showCancel: true, | 
 |  |  |             success: function (res) { | 
 |  |  |               const isDuplicate = that.ScanCodeRecord.some( | 
 |  |  |                 (item) => item.outBatchNo === codeInfo.BN | 
 |  |  |               ); | 
 |  |  |               if (!isDuplicate) { | 
 |  |  |                 if (that.form.productType == "TG01") { | 
 |  |  |                   that.$refs.saveForm.open(ScanCodeRecordList); | 
 |  |  |         if (codeInfo.CN != "") { | 
 |  |  |           if (codeInfo.CN != that.form.customerName1) { | 
 |  |  |             // 扫描报工单二维码 | 
 |  |  |             uni.showModal({ | 
 |  |  |               title: "提示", | 
 |  |  |               content: | 
 |  |  |                 "客户不一致:" + codeInfo.CN + "||" + that.form.customerName1, | 
 |  |  |               showCancel: true, | 
 |  |  |               success: function (res) { | 
 |  |  |                 const isDuplicate = that.ScanCodeRecord.some( | 
 |  |  |                   (item) => item.outBatchNo === codeInfo.BN | 
 |  |  |                 ); | 
 |  |  |                 if (!isDuplicate) { | 
 |  |  |                   if (that.form.productType == "TG01") { | 
 |  |  |                     that.$refs.saveForm.open(ScanCodeRecordList); | 
 |  |  |                   } else { | 
 |  |  |                     that.ScanCodeRecord.push(ScanCodeRecordList); | 
 |  |  |                   } | 
 |  |  |                 } else { | 
 |  |  |                   that.ScanCodeRecord.push(ScanCodeRecordList); | 
 |  |  |                   uni.showToast({ | 
 |  |  |                     icon: "none", | 
 |  |  |                     title: "请勿重复扫码!", | 
 |  |  |                     duration: 2 * 1000, | 
 |  |  |                   }); | 
 |  |  |                 } | 
 |  |  |               } else { | 
 |  |  |                 uni.showToast({ | 
 |  |  |                   icon: "none", | 
 |  |  |                   title: "请勿重复扫码!", | 
 |  |  |                   duration: 2 * 1000, | 
 |  |  |                 }); | 
 |  |  |               } | 
 |  |  |             }, | 
 |  |  |           }); | 
 |  |  |               }, | 
 |  |  |             }); | 
 |  |  |           } else { | 
 |  |  |             if (that.form.productType == "TG01") { | 
 |  |  |               that.$refs.saveForm.open(ScanCodeRecordList); | 
 |  |  |             } else { | 
 |  |  |               that.ScanCodeRecord.push(ScanCodeRecordList); | 
 |  |  |             } | 
 |  |  |           } | 
 |  |  |         } else { | 
 |  |  |           if (that.form.productType == "TG01") { | 
 |  |  |             that.$refs.saveForm.open(ScanCodeRecordList); | 
 |  |  | 
 |  |  |         }) | 
 |  |  |         .catch((err) => { | 
 |  |  |           uni.hideLoading(); | 
 |  |  |           uni.showToast({ | 
 |  |  |             title: err.message || "网络异常,请重试", | 
 |  |  |             icon: "none", | 
 |  |  |           uni.showModal({ | 
 |  |  |             title: "提示", | 
 |  |  |             content: err.message || "网络异常,请重试", | 
 |  |  |             showCancel: true, | 
 |  |  |             success: function (res) {}, | 
 |  |  |           }); | 
 |  |  |           // this.$u.toast(err.message || "网络异常,请重试"); | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |  | 
 |  |  | 
 |  |  |     }, | 
 |  |  |     //核磅记录 | 
 |  |  |     openNuclearScaleRecord() { | 
 |  |  |       if (this.form.verificationNo == "") { | 
 |  |  |       if (!this.form.verificationNo) { | 
 |  |  |         uni.showToast({ | 
 |  |  |           icon: "none", | 
 |  |  |           title: "请先选择核磅单号!", | 
 |  |  | 
 |  |  |         }); | 
 |  |  |         return; | 
 |  |  |       } | 
 |  |  |       uni.navigateTo({ | 
 |  |  |         url: "/pages/wareHouse/nuclearScale/nuclearscalerecord", | 
 |  |  |       }); | 
 |  |  |        uni.navigateTo({ | 
 |  |  |          url: "/pages/wareHouse/nuclearScale/nuclearscalerecord?verificationNo=" + | 
 |  |  |                         encodeURIComponent(JSON.stringify(this.form.verificationNo)), | 
 |  |  |        }); | 
 |  |  |     }, | 
 |  |  |     // 存订单号 | 
 |  |  |     setNo(val) { | 
 
 |  |  | 
 |  |  | <template> | 
 |  |  |   <view class="page"> | 
 |  |  |     <view class="finishProductIn-locno-bg" /> | 
 |  |  |     <u-navbar | 
 |  |  |       title="核磅记录" | 
 |  |  |       :background="background" | 
 |  |  |       :border-bottom="false" | 
 |  |  |       :title-bold="true" | 
 |  |  |       title-color="#000" | 
 |  |  |       back-icon-color="#000" | 
 |  |  |     > | 
 |  |  |       <view class="navbar-right" slot="right" @click="goPrintAll"> | 
 |  |  |         全部打印 | 
 |  |  |       </view> | 
 |  |  |     </u-navbar> | 
 |  |  |     <view class="wrap"> | 
 |  |  |       <!-- 连接和打印状态指示器 --> | 
 |  |  |       <view | 
 |  |  |         class="status-indicator" | 
 |  |  |         :class="{ | 
 |  |  |     <view class="page"> | 
 |  |  |         <view class="finishProductIn-locno-bg" /> | 
 |  |  |         <u-navbar title="核磅记录" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" | 
 |  |  |             back-icon-color="#000"> | 
 |  |  |             <view class="navbar-right" slot="right" @click="goPrintAll"> | 
 |  |  |                 全部打印 | 
 |  |  |             </view> | 
 |  |  |         </u-navbar> | 
 |  |  |         <view class="wrap"> | 
 |  |  |             <!-- 连接和打印状态指示器 --> | 
 |  |  |             <view class="status-indicator" :class="{ | 
 |  |  |           connected: connectionStatus === 'connected', | 
 |  |  |           connecting: connectionStatus === 'connecting', | 
 |  |  |           disconnected: connectionStatus === 'disconnected', | 
 |  |  |         }" | 
 |  |  |       > | 
 |  |  |         <text class="status-text">{{ getConnectionStatusText() }}</text> | 
 |  |  |         <text class="print-status" v-if="printStatus !== 'idle'" | 
 |  |  |           >- {{ getPrintStatusText() }}</text | 
 |  |  |         > | 
 |  |  |       </view> | 
 |  |  |       <scroll-view | 
 |  |  |         class="finishProductIn-locno-scroll-list" | 
 |  |  |         scroll-y="true" | 
 |  |  |         @scrolltolower="getmoreList()" | 
 |  |  |       > | 
 |  |  |         <u-cell-group | 
 |  |  |           class="finishProductIn-locno-scroll-list-group" | 
 |  |  |           :border="false" | 
 |  |  |         > | 
 |  |  |           <view | 
 |  |  |             class="content" | 
 |  |  |             v-for="(item, index) in list" | 
 |  |  |             :key="item.locNo" | 
 |  |  |             :index="index" | 
 |  |  |             @click="selectNo(item)" | 
 |  |  |           > | 
 |  |  |             <view class="content-header"> | 
 |  |  |               <view class="content-header-title">{{ index + 1 }}</view> | 
 |  |  |             </view> | 
 |  |  |             <view class="content-body"> | 
 |  |  |               <view class="row-list"> | 
 |  |  |                 <view class="_label"> | 
 |  |  |                   <view class="_label-icon-1"> </view> | 
 |  |  |                   <view class="_label-name">批次号:</view> | 
 |  |  |                 </view> | 
 |  |  |                 <view class="_content"> | 
 |  |  |                   {{ item.outBatchNo }} | 
 |  |  |                 </view> | 
 |  |  |               </view> | 
 |  |  |               <view class="row-list"> | 
 |  |  |                 <view class="_label"> | 
 |  |  |                   <view class="_label-icon-2"> </view> | 
 |  |  |                   <view class="_label-name">产品描述:</view> | 
 |  |  |                 </view> | 
 |  |  |                 <view class="_content"> | 
 |  |  |                   {{ item.netWeight }} | 
 |  |  |                 </view> | 
 |  |  |               </view> | 
 |  |  |               <view class="row-list"> | 
 |  |  |                 <view class="_label"> | 
 |  |  |                   <view class="_label-icon-3"> </view> | 
 |  |  |                   <view class="_label-name">零件号:</view> | 
 |  |  |                 </view> | 
 |  |  |                 <view class="_content"> | 
 |  |  |                   {{ item.partNo }} | 
 |  |  |                 </view> | 
 |  |  |               </view> | 
 |  |  |               <view class="row-list"> | 
 |  |  |                 <view class="_label"> | 
 |  |  |                   <view class="_label-icon-1"> </view> | 
 |  |  |                   <view class="_label-name">毛重:</view> | 
 |  |  |                 </view> | 
 |  |  |                 <view class="_content"> | 
 |  |  |                   {{ item.grossWeight }} | 
 |  |  |                 </view> | 
 |  |  |               </view> | 
 |  |  |               <view class="row-list"> | 
 |  |  |                 <view class="_label"> | 
 |  |  |                   <view class="_label-icon-2"> </view> | 
 |  |  |                   <view class="_label-name">盘重:</view> | 
 |  |  |                 </view> | 
 |  |  |                 <view class="_content"> | 
 |  |  |                   {{ item.trayWeight }} | 
 |  |  |                 </view> | 
 |  |  |               </view> | 
 |  |  |               <view class="row-list"> | 
 |  |  |                 <view class="_label"> | 
 |  |  |                   <view class="_label-icon-3"> </view> | 
 |  |  |                   <view class="_label-name">净重:</view> | 
 |  |  |                 </view> | 
 |  |  |                 <view class="_content"> | 
 |  |  |                   {{ item.value5 }} | 
 |  |  |                 </view> | 
 |  |  |               </view> | 
 |  |  |               <view class="row-list"> | 
 |  |  |                 <view class="_label"> | 
 |  |  |                   <view class="_label-icon-1"> </view> | 
 |  |  |                   <view class="_label-name">核磅重量:</view> | 
 |  |  |                 </view> | 
 |  |  |                 <view class="_content"> | 
 |  |  |                   {{ item.netWeight }} | 
 |  |  |                 </view> | 
 |  |  |               </view> | 
 |  |  |               <view class="row-list"> | 
 |  |  |                 <view class="_label"> | 
 |  |  |                   <view class="_label-icon-2"> </view> | 
 |  |  |                   <view class="_label-name">叉车盘重:</view> | 
 |  |  |                 </view> | 
 |  |  |                 <view class="_content"> | 
 |  |  |                   {{ item.value7 }} | 
 |  |  |                 </view> | 
 |  |  |               </view> | 
 |  |  |             </view> | 
 |  |  |           </view> | 
 |  |  |         </u-cell-group> | 
 |  |  |         <view class="loadmore" @click="getmoreList()"> | 
 |  |  |           <u-loadmore | 
 |  |  |             :status="status" | 
 |  |  |             :load-text="loadText" | 
 |  |  |             @loadmore="getmoreList()" | 
 |  |  |           /> | 
 |  |  |         </view> | 
 |  |  |       </scroll-view> | 
 |  |  |     </view> | 
 |  |  |     <u-toast ref="uToast" /> | 
 |  |  |     <u-modal v-model="maskShow" title="" :show-confirm-button="false"> | 
 |  |  |       <view @touchmove.stop.prevent="moveHandle" @click="maskclose"> | 
 |  |  |         <scroll-view | 
 |  |  |           class="uni-scroll_box" | 
 |  |  |           scroll-y | 
 |  |  |           @touchmove.stop.prevent="moveHandle" | 
 |  |  |           @click.stop="moveHandle" | 
 |  |  |         > | 
 |  |  |           <view class="modal-title">选择蓝牙设备</view> | 
 |  |  |           <view v-if="listDevice.length === 0" class="empty-tip">暂无设备</view> | 
 |  |  |           <view | 
 |  |  |             v-for="(item, index) in listDevice" | 
 |  |  |             :key="index" | 
 |  |  |             @click="tapQuery(item)" | 
 |  |  |             class="device-item" | 
 |  |  |           > | 
 |  |  |             <view class="device-name"> | 
 |  |  |               <text>名称:</text> | 
 |  |  |               <text>{{ item.name || "未知设备" }}</text> | 
 |  |  |             </view> | 
 |  |  |             <view class="device-uuid"> | 
 |  |  |               <text>UUID:</text> | 
 |  |  |               <text>{{ item.address || "无地址" }}</text> | 
 |  |  |             </view> | 
 |  |  |           </view> | 
 |  |  |         </scroll-view> | 
 |  |  |       </view> | 
 |  |  |     </u-modal> | 
 |  |  |   </view> | 
 |  |  |         }"> | 
 |  |  |                 <text class="status-text">{{ getConnectionStatusText() }}</text> | 
 |  |  |                 <text class="print-status" v-if="printStatus !== 'idle'">- {{ getPrintStatusText() }}</text> | 
 |  |  |             </view> | 
 |  |  |             <scroll-view class="finishProductIn-locno-scroll-list" scroll-y="true" @scrolltolower="getmoreList()"> | 
 |  |  |                 <u-cell-group class="finishProductIn-locno-scroll-list-group" :border="false"> | 
 |  |  |                     <view class="content" v-for="(item, index) in list" :key="item.locNo" :index="index" | 
 |  |  |                         @click="selectNo(item)"> | 
 |  |  |                         <view class="content-header"> | 
 |  |  |                             <view class="content-header-title">{{ index + 1 }}</view> | 
 |  |  |                         </view> | 
 |  |  |                         <view class="content-body"> | 
 |  |  |                             <view class="row-list"> | 
 |  |  |                                 <view class="_label"> | 
 |  |  |                                     <view class="_label-icon-1"> </view> | 
 |  |  |                                     <view class="_label-name">批次号:</view> | 
 |  |  |                                 </view> | 
 |  |  |                                 <view class="_content"> | 
 |  |  |                                     {{ item.batchNo }} | 
 |  |  |                                 </view> | 
 |  |  |                             </view> | 
 |  |  |                             <view class="row-list"> | 
 |  |  |                                 <view class="_label"> | 
 |  |  |                                     <view class="_label-icon-2"> </view> | 
 |  |  |                                     <view class="_label-name">产品描述:</view> | 
 |  |  |                                 </view> | 
 |  |  |                                 <view class="_content"> | 
 |  |  |                                     {{ item.partDescription }} | 
 |  |  |                                 </view> | 
 |  |  |                             </view> | 
 |  |  |                             <view class="row-list"> | 
 |  |  |                                 <view class="_label"> | 
 |  |  |                                     <view class="_label-icon-3"> </view> | 
 |  |  |                                     <view class="_label-name">零件号:</view> | 
 |  |  |                                 </view> | 
 |  |  |                                 <view class="_content"> | 
 |  |  |                                     {{ item.partNo }} | 
 |  |  |                                 </view> | 
 |  |  |                             </view> | 
 |  |  |                             <view class="row-list"> | 
 |  |  |                                 <view class="_label"> | 
 |  |  |                                     <view class="_label-icon-1"> </view> | 
 |  |  |                                     <view class="_label-name">毛重:</view> | 
 |  |  |                                 </view> | 
 |  |  |                                 <view class="_content"> | 
 |  |  |                                     {{ item.newGrossWeight }} | 
 |  |  |                                 </view> | 
 |  |  |                             </view> | 
 |  |  |                             <view class="row-list"> | 
 |  |  |                                 <view class="_label"> | 
 |  |  |                                     <view class="_label-icon-2"> </view> | 
 |  |  |                                     <view class="_label-name">盘重:</view> | 
 |  |  |                                 </view> | 
 |  |  |                                 <view class="_content"> | 
 |  |  |                                     {{ item.newWeight }} | 
 |  |  |                                 </view> | 
 |  |  |                             </view> | 
 |  |  |                             <view class="row-list"> | 
 |  |  |                                 <view class="_label"> | 
 |  |  |                                     <view class="_label-icon-3"> </view> | 
 |  |  |                                     <view class="_label-name">净重:</view> | 
 |  |  |                                 </view> | 
 |  |  |                                 <view class="_content"> | 
 |  |  |                                     {{ item.newNetWeight }} | 
 |  |  |                                 </view> | 
 |  |  |                             </view> | 
 |  |  |                             <view class="row-list"> | 
 |  |  |                                 <view class="_label"> | 
 |  |  |                                     <view class="_label-icon-1"> </view> | 
 |  |  |                                     <view class="_label-name">核磅重量:</view> | 
 |  |  |                                 </view> | 
 |  |  |                                 <view class="_content"> | 
 |  |  |                                     {{ item.verificationWeight }} | 
 |  |  |                                 </view> | 
 |  |  |                             </view> | 
 |  |  |                             <view class="row-list"> | 
 |  |  |                                 <view class="_label"> | 
 |  |  |                                     <view class="_label-icon-2"> </view> | 
 |  |  |                                     <view class="_label-name">叉车盘重:</view> | 
 |  |  |                                 </view> | 
 |  |  |                                 <view class="_content"> | 
 |  |  |                                     {{ item.forkliftWeight }} | 
 |  |  |                                 </view> | 
 |  |  |                             </view> | 
 |  |  |                         </view> | 
 |  |  |                     </view> | 
 |  |  |                 </u-cell-group> | 
 |  |  |                 <view class="loadmore" @click="getmoreList()"> | 
 |  |  |                     <u-loadmore :status="status" :load-text="loadText" @loadmore="getmoreList()" /> | 
 |  |  |                 </view> | 
 |  |  |             </scroll-view> | 
 |  |  |         </view> | 
 |  |  |         <u-toast ref="uToast" /> | 
 |  |  |         <u-modal v-model="maskShow" title="" :show-confirm-button="false"> | 
 |  |  |             <view @touchmove.stop.prevent="moveHandle" @click="maskclose"> | 
 |  |  |                 <scroll-view class="uni-scroll_box" scroll-y @touchmove.stop.prevent="moveHandle" | 
 |  |  |                     @click.stop="moveHandle"> | 
 |  |  |                     <view class="modal-title">选择蓝牙设备</view> | 
 |  |  |                     <view v-if="listDevice.length === 0" class="empty-tip">暂无设备</view> | 
 |  |  |                     <view v-for="(item, index) in listDevice" :key="index" @click="tapQuery(item)" class="device-item"> | 
 |  |  |                         <view class="device-name"> | 
 |  |  |                             <text>名称:</text> | 
 |  |  |                             <text>{{ item.name || "未知设备" }}</text> | 
 |  |  |                         </view> | 
 |  |  |                         <view class="device-uuid"> | 
 |  |  |                             <text>UUID:</text> | 
 |  |  |                             <text>{{ item.address || "无地址" }}</text> | 
 |  |  |                         </view> | 
 |  |  |                     </view> | 
 |  |  |                 </scroll-view> | 
 |  |  |             </view> | 
 |  |  |         </u-modal> | 
 |  |  |     </view> | 
 |  |  | </template> | 
 |  |  | <script> | 
 |  |  | import content_bg from "@/static/custom/finishProductIn/locNoBg.png"; | 
 |  |  | const jcapi = uni.requireNativePlugin("JCSDK-JCApiModule"); | 
 |  |  |     import content_bg from "@/static/custom/finishProductIn/locNoBg.png"; | 
 |  |  |     const jcapi = uni.requireNativePlugin("JCSDK-JCApiModule"); | 
 |  |  |  | 
 |  |  | // 二维码类型 | 
 |  |  | const QrCodeType = { | 
 |  |  |   QrCode: 31, | 
 |  |  |   PDF417: 32, | 
 |  |  |   DataMatrix: 33, | 
 |  |  |   AZTEC: 34, | 
 |  |  | }; | 
 |  |  | // 线条类型 | 
 |  |  | const LineType = { | 
 |  |  |   Solid: 1, // 实线 | 
 |  |  |   Dotted: 2, // 虚线(默认虚实1:1相间) | 
 |  |  | }; | 
 |  |  | // 换行方式 | 
 |  |  | const LineModeType = { | 
 |  |  |   Justified: 1, // 宽高固定,内容自适应(字号/字间距/行间距按比例缩放) | 
 |  |  |   AutoHeight: 2, // 宽度固定,高度自适应 | 
 |  |  |   Fixed: 4, // 宽高固定,超出部分裁剪 | 
 |  |  |   Adapt: 6, // 宽高固定,内容超过时预设宽高自动缩小 | 
 |  |  | }; | 
 |  |  | export default { | 
 |  |  |   data() { | 
 |  |  |     return { | 
 |  |  |       background: { | 
 |  |  |         backgroundImage: `url(${content_bg})`, | 
 |  |  |         backgroundAttachment: "fixed", | 
 |  |  |         backgroundSize: "100% auto", | 
 |  |  |         backgroundRepeat: "no-repeat", | 
 |  |  |       }, | 
 |  |  |       keywords: "", | 
 |  |  |       list: [], | 
 |  |  |       total: 0, | 
 |  |  |       pageNum: 1, | 
 |  |  |       pageSize: 10, | 
 |  |  |       status: "loading", | 
 |  |  |       loadText: { | 
 |  |  |         loadmore: "加载更多...", | 
 |  |  |         loading: "努力加载中...", | 
 |  |  |         nomore: "没有更多了", | 
 |  |  |       }, | 
 |  |  |       maskShow: false, | 
 |  |  |       listDevice: [], //蓝牙设备数据 | 
 |  |  |       printQueue: [], // 打印队列 | 
 |  |  |       printing: false, // 是否正在打印 | 
 |  |  |       printDensity: 3, // 默认打印浓度 | 
 |  |  |       labelType: 1, // 默认标签类型 | 
 |  |  |       // 1:间隙纸 | 
 |  |  |       // 2:黑标纸 | 
 |  |  |       // 3:连续纸 | 
 |  |  |       // 4:定孔纸 | 
 |  |  |       // 5:透明纸 | 
 |  |  |       printMode: 2, // 默认打印模式 | 
 |  |  |       //    1:热敏 | 
 |  |  |       //     2:热转印 | 
 |  |  |       connectedDevice: null, // 已连接的打印机 | 
 |  |  |       connectionStatus: "disconnected", // 连接状态: disconnected, connecting, connected | 
 |  |  |       printStatus: "idle", // 打印状态: idle, printing, error | 
 |  |  |       errorMessage: "", // 错误信息 | 
 |  |  |     }; | 
 |  |  |   }, | 
 |  |  |   onLoad() { | 
 |  |  |     this.getlist(); | 
 |  |  |     // 初始化SDK | 
 |  |  |     jcapi.initSDK(); | 
 |  |  |     // 监听页码回调 | 
 |  |  |     jcapi.didReadPrintCountInfo(function (r) { | 
 |  |  |       console.log(r); | 
 |  |  |     }); | 
 |  |  |     // 二维码类型 | 
 |  |  |     const QrCodeType = { | 
 |  |  |         QrCode: 31, | 
 |  |  |         PDF417: 32, | 
 |  |  |         DataMatrix: 33, | 
 |  |  |         AZTEC: 34, | 
 |  |  |     }; | 
 |  |  |     // 线条类型 | 
 |  |  |     const LineType = { | 
 |  |  |         Solid: 1, // 实线 | 
 |  |  |         Dotted: 2, // 虚线(默认虚实1:1相间) | 
 |  |  |     }; | 
 |  |  |     // 换行方式 | 
 |  |  |     const LineModeType = { | 
 |  |  |         Justified: 1, // 宽高固定,内容自适应(字号/字间距/行间距按比例缩放) | 
 |  |  |         AutoHeight: 2, // 宽度固定,高度自适应 | 
 |  |  |         Fixed: 4, // 宽高固定,超出部分裁剪 | 
 |  |  |         Adapt: 6, // 宽高固定,内容超过时预设宽高自动缩小 | 
 |  |  |     }; | 
 |  |  |     export default { | 
 |  |  |         data() { | 
 |  |  |             return { | 
 |  |  |                 background: { | 
 |  |  |                     backgroundImage: `url(${content_bg})`, | 
 |  |  |                     backgroundAttachment: "fixed", | 
 |  |  |                     backgroundSize: "100% auto", | 
 |  |  |                     backgroundRepeat: "no-repeat", | 
 |  |  |                 }, | 
 |  |  |                 keywords: "", | 
 |  |  |                 list: [], | 
 |  |  |                 total: 0, | 
 |  |  |                 pageNum: 1, | 
 |  |  |                 pageSize: 10, | 
 |  |  |                 status: "loading", | 
 |  |  |                 loadText: { | 
 |  |  |                     loadmore: "加载更多...", | 
 |  |  |                     loading: "努力加载中...", | 
 |  |  |                     nomore: "没有更多了", | 
 |  |  |                 }, | 
 |  |  |                 maskShow: false, | 
 |  |  |                 listDevice: [], //蓝牙设备数据 | 
 |  |  |                 printQueue: [], // 打印队列 | 
 |  |  |                 printing: false, // 是否正在打印 | 
 |  |  |                 printDensity: 3, // 默认打印浓度 | 
 |  |  |                 labelType: 1, // 默认标签类型 | 
 |  |  |                 // 1:间隙纸 | 
 |  |  |                 // 2:黑标纸 | 
 |  |  |                 // 3:连续纸 | 
 |  |  |                 // 4:定孔纸 | 
 |  |  |                 // 5:透明纸 | 
 |  |  |                 printMode: 2, // 默认打印模式 | 
 |  |  |                 //    1:热敏 | 
 |  |  |                 //     2:热转印 | 
 |  |  |                 connectedDevice: null, // 已连接的打印机 | 
 |  |  |                 connectionStatus: "disconnected", // 连接状态: disconnected, connecting, connected | 
 |  |  |                 printStatus: "idle", // 打印状态: idle, printing, error | 
 |  |  |                 errorMessage: "", // 错误信息 | 
 |  |  |                 verificationNo:'' | 
 |  |  |             }; | 
 |  |  |     }, | 
 |  |  |     onLoad(options) { | 
 |  |  |             this.verificationNo = JSON.parse(decodeURIComponent(options.verificationNo)) | 
 |  |  |             this.getlist(); | 
 |  |  |             // 初始化SDK | 
 |  |  |             jcapi.initSDK(); | 
 |  |  |             // 监听页码回调 | 
 |  |  |             jcapi.didReadPrintCountInfo(function(r) { | 
 |  |  |                 console.log('页码',r); | 
 |  |  |             }); | 
 |  |  |  | 
 |  |  |     // 监听错误回调 | 
 |  |  |     jcapi.didReadPrintErrorInfo((r) => { | 
 |  |  |       console.log(r); | 
 |  |  |       if (r.code == 23) { | 
 |  |  |         // 打印机断开连接 | 
 |  |  |         this.connectedDevice = null; | 
 |  |  |         uni.showToast({ | 
 |  |  |           icon: "none", | 
 |  |  |           title: "打印机连接已断开,请重新连接", | 
 |  |  |           duration: 2 * 1000, | 
 |  |  |         }); | 
 |  |  |       } else { | 
 |  |  |         uni.showToast({ | 
 |  |  |           icon: "none", | 
 |  |  |           title: JSON.stringify(r), | 
 |  |  |           duration: 2 * 1000, | 
 |  |  |         }); | 
 |  |  |       } | 
 |  |  |     }); | 
 |  |  |   }, | 
 |  |  |   methods: { | 
 |  |  |     getmoreList() { | 
 |  |  |       if (this.pageSize >= this.total) { | 
 |  |  |         this.status = "nomore"; | 
 |  |  |         return; | 
 |  |  |       } | 
 |  |  |       this.status = "loading"; | 
 |  |  |       setTimeout(() => { | 
 |  |  |         this.pageSize += this.pageSize; | 
 |  |  |         this.getlist(); | 
 |  |  |       }, 1000); | 
 |  |  |     }, | 
 |  |  |     getlist() { | 
 |  |  |       this.$u.api.workReporting | 
 |  |  |         .getWorkshopOrder({ | 
 |  |  |           current: this.pageNum, | 
 |  |  |           size: this.pageSize, | 
 |  |  |         }) | 
 |  |  |         .then((res) => { | 
 |  |  |           this.list = res.data.records; | 
 |  |  |           this.total = res.data.total; | 
 |  |  |           if (this.pageSize >= this.total) { | 
 |  |  |             this.status = "nomore"; | 
 |  |  |           } else { | 
 |  |  |             this.status = "loadmore"; | 
 |  |  |           } | 
 |  |  |         }); | 
 |  |  |     }, | 
 |  |  |     search(value) { | 
 |  |  |       if (value) { | 
 |  |  |         this.list = []; | 
 |  |  |         this.pageSize = 10; | 
 |  |  |         this.$u.api.workReporting | 
 |  |  |           .getWorkshopOrder({ | 
 |  |  |             current: this.pageNum, | 
 |  |  |             size: this.pageSize, | 
 |  |  |             moNo: value, | 
 |  |  |           }) | 
 |  |  |           .then((res) => { | 
 |  |  |             this.list = res.data.records; | 
 |  |  |             this.total = res.data.total; | 
 |  |  |             if (this.pageSize >= this.total) { | 
 |  |  |               this.status = "nomore"; | 
 |  |  |             } else { | 
 |  |  |               this.status = "loadmore"; | 
 |  |  |             } | 
 |  |  |           }); | 
 |  |  |       } else { | 
 |  |  |         this.getlist(); | 
 |  |  |       } | 
 |  |  |     }, | 
 |  |  |     // 检查蓝牙连接状态 | 
 |  |  |     async checkBluetoothConnection() { | 
 |  |  |       if (!this.connectedDevice) { | 
 |  |  |         this.connectionStatus = "disconnected"; | 
 |  |  |         return false; | 
 |  |  |       } | 
 |  |  |             // 监听错误回调 | 
 |  |  |             jcapi.didReadPrintErrorInfo((r) => { | 
 |  |  |                 console.log('错误',r); | 
 |  |  |                 if (r.code == 23) { | 
 |  |  |                     // 打印机断开连接 | 
 |  |  |                     this.connectedDevice = null; | 
 |  |  |                     uni.showToast({ | 
 |  |  |                         icon: "none", | 
 |  |  |                         title: "打印机连接已断开,请重新连接", | 
 |  |  |                         duration: 2 * 1000, | 
 |  |  |                     }); | 
 |  |  |                 } else { | 
 |  |  |                     uni.showToast({ | 
 |  |  |                         icon: "none", | 
 |  |  |                         title: JSON.stringify(r), | 
 |  |  |                         duration: 2 * 1000, | 
 |  |  |                     }); | 
 |  |  |                 } | 
 |  |  |             }); | 
 |  |  |         }, | 
 |  |  |         methods: { | 
 |  |  |             getmoreList() { | 
 |  |  |                 if (this.pageSize >= this.total) { | 
 |  |  |                     this.status = "nomore"; | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |                 this.status = "loading"; | 
 |  |  |                 setTimeout(() => { | 
 |  |  |                     this.pageSize += this.pageSize; | 
 |  |  |                     this.getlist(); | 
 |  |  |                 }, 1000); | 
 |  |  |             }, | 
 |  |  |             getlist() { | 
 |  |  |                 this.$u.api.NuclearScaleEntry | 
 |  |  |                     .queryPacking({ | 
 |  |  |                         current: this.pageNum, | 
 |  |  |                         size: this.pageSize, | 
 |  |  |                         verificationNo: this.verificationNo, | 
 |  |  |                     }) | 
 |  |  |                     .then((res) => { | 
 |  |  |                         this.list = res.data; | 
 |  |  |                         this.total = res.data.length; | 
 |  |  |                         if (this.pageSize >= this.total) { | 
 |  |  |                             this.status = "nomore"; | 
 |  |  |                         } else { | 
 |  |  |                             this.status = "loadmore"; | 
 |  |  |                         } | 
 |  |  |                     }); | 
 |  |  |             }, | 
 |  |  |             search(value) { | 
 |  |  |                 if (value) { | 
 |  |  |                     this.list = []; | 
 |  |  |                     this.pageSize = 10; | 
 |  |  |                     this.$u.api.NuclearScaleEntry | 
 |  |  |                         .queryPacking({ | 
 |  |  |                             current: this.pageNum, | 
 |  |  |                             size: this.pageSize, | 
 |  |  |                             moNo: value, | 
 |  |  |                         }) | 
 |  |  |                         .then((res) => { | 
 |  |  |                             this.list = res.data.records; | 
 |  |  |                             this.total = res.data.total; | 
 |  |  |                             if (this.pageSize >= this.total) { | 
 |  |  |                                 this.status = "nomore"; | 
 |  |  |                             } else { | 
 |  |  |                                 this.status = "loadmore"; | 
 |  |  |                             } | 
 |  |  |                         }); | 
 |  |  |                 } else { | 
 |  |  |                     this.getlist(); | 
 |  |  |                 } | 
 |  |  |             }, | 
 |  |  |             // 检查蓝牙连接状态 | 
 |  |  |             async checkBluetoothConnection() { | 
 |  |  |                 if (!this.connectedDevice) { | 
 |  |  |                     this.connectionStatus = "disconnected"; | 
 |  |  |                     return false; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |       // 设置为连接中状态 | 
 |  |  |       this.connectionStatus = "connecting"; | 
 |  |  |                 // 设置为连接中状态 | 
 |  |  |                 this.connectionStatus = "connecting"; | 
 |  |  |  | 
 |  |  |       // 增强连接状态检测 | 
 |  |  |       return new Promise((resolve) => { | 
 |  |  |         // 简化连接状态检测,直接使用已记录的连接状态 | 
 |  |  |         if (this.connectedDevice) { | 
 |  |  |           this.connectionStatus = "connected"; | 
 |  |  |           resolve(true); | 
 |  |  |         } else { | 
 |  |  |           this.connectionStatus = "disconnected"; | 
 |  |  |           uni.showToast({ | 
 |  |  |             icon: "none", | 
 |  |  |             title: "打印机未连接,请先连接", | 
 |  |  |             duration: 2000, | 
 |  |  |           }); | 
 |  |  |           resolve(false); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |                 // 增强连接状态检测 | 
 |  |  |                 return new Promise((resolve) => { | 
 |  |  |                     // 简化连接状态检测,直接使用已记录的连接状态 | 
 |  |  |                     if (this.connectedDevice) { | 
 |  |  |                         this.connectionStatus = "connected"; | 
 |  |  |                         resolve(true); | 
 |  |  |                     } else { | 
 |  |  |                         this.connectionStatus = "disconnected"; | 
 |  |  |                         uni.showToast({ | 
 |  |  |                             icon: "none", | 
 |  |  |                             title: "打印机未连接,请先连接", | 
 |  |  |                             duration: 2000, | 
 |  |  |                         }); | 
 |  |  |                         resolve(false); | 
 |  |  |                     } | 
 |  |  |                 }); | 
 |  |  |             }, | 
 |  |  |  | 
 |  |  |     // 添加到打印队列 | 
 |  |  |     addToPrintQueue(items) { | 
 |  |  |       if (!Array.isArray(items)) { | 
 |  |  |         items = [items]; | 
 |  |  |       } | 
 |  |  |             // 添加到打印队列 | 
 |  |  |             addToPrintQueue(items) { | 
 |  |  |                 if (!Array.isArray(items)) { | 
 |  |  |                     items = [items]; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |       this.printQueue.push(...items); | 
 |  |  |       // 如果不在打印中,则开始处理队列 | 
 |  |  |       if (!this.printing) { | 
 |  |  |         this.processPrintQueue(); | 
 |  |  |       } | 
 |  |  |     }, | 
 |  |  |                 this.printQueue.push(...items); | 
 |  |  |                 // 如果不在打印中,则开始处理队列 | 
 |  |  |                 if (!this.printing) { | 
 |  |  |                     this.processPrintQueue(); | 
 |  |  |                 } | 
 |  |  |             }, | 
 |  |  |  | 
 |  |  |     // 处理打印队列 | 
 |  |  |     async processPrintQueue() { | 
 |  |  |       while (this.printQueue.length > 0) { | 
 |  |  |         // 检查连接状态 | 
 |  |  |         const isConnected = await this.checkBluetoothConnection(); | 
 |  |  |         if (!isConnected) { | 
 |  |  |           // 如果未连接,显示蓝牙连接对话框 | 
 |  |  |           this.searchDevice(); | 
 |  |  |           // 不是直接return,而是等待用户连接后再继续处理 | 
 |  |  |           return; | 
 |  |  |         } | 
 |  |  |             // 处理打印队列 | 
 |  |  |             async processPrintQueue() { | 
 |  |  |                 while (this.printQueue.length > 0) { | 
 |  |  |                     // 检查连接状态 | 
 |  |  |                     const isConnected = await this.checkBluetoothConnection(); | 
 |  |  |                     if (!isConnected) { | 
 |  |  |                         // 如果未连接,显示蓝牙连接对话框 | 
 |  |  |                         this.searchDevice(); | 
 |  |  |                         // 不是直接return,而是等待用户连接后再继续处理 | 
 |  |  |                         return; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |         this.printing = true; | 
 |  |  |         this.printStatus = "printing"; | 
 |  |  |                     this.printing = true; | 
 |  |  |                     this.printStatus = "printing"; | 
 |  |  |  | 
 |  |  |         // 取出队列中的第一个任务 | 
 |  |  |         const item = this.printQueue.shift(); | 
 |  |  |                     // 取出队列中的第一个任务 | 
 |  |  |                     const item = this.printQueue.shift(); | 
 |  |  |  | 
 |  |  |         try { | 
 |  |  |           // 执行打印 | 
 |  |  |           await this.printQrCode(item); | 
 |  |  |                     try { | 
 |  |  |                         // 执行打印 | 
 |  |  |                         await this.printQrCode(item); | 
 |  |  |  | 
 |  |  |           // 打印成功后继续处理下一个 | 
 |  |  |           uni.showToast({ | 
 |  |  |             title: "打印成功", | 
 |  |  |             icon: "success", | 
 |  |  |             duration: 1000, | 
 |  |  |           }); | 
 |  |  |                         // 打印成功后继续处理下一个 | 
 |  |  |                         uni.showToast({ | 
 |  |  |                             title: "打印成功", | 
 |  |  |                             icon: "success", | 
 |  |  |                             duration: 1000, | 
 |  |  |                         }); | 
 |  |  |  | 
 |  |  |           // 短暂延迟,避免打印机缓存溢出 | 
 |  |  |           await new Promise((resolve) => setTimeout(resolve, 1000)); | 
 |  |  |         } catch (error) { | 
 |  |  |           console.error("打印出错:", error); | 
 |  |  |           this.printStatus = "error"; | 
 |  |  |           this.errorMessage = error.message || "打印时发生未知错误"; | 
 |  |  |           this.printing = false; | 
 |  |  |                         // 短暂延迟,避免打印机缓存溢出 | 
 |  |  |                         await new Promise((resolve) => setTimeout(resolve, 1000)); | 
 |  |  |                     } catch (error) { | 
 |  |  |                         console.error("打印出错:", error); | 
 |  |  |                         this.printStatus = "error"; | 
 |  |  |                         this.errorMessage = error.message || "打印时发生未知错误"; | 
 |  |  |                         this.printing = false; | 
 |  |  |  | 
 |  |  |           // 记录失败的任务,不重新添加到队列 | 
 |  |  |           this.failedPrintJobs = this.failedPrintJobs || []; | 
 |  |  |           this.failedPrintJobs.push(item); | 
 |  |  |                         // 记录失败的任务,不重新添加到队列 | 
 |  |  |                         this.failedPrintJobs = this.failedPrintJobs || []; | 
 |  |  |                         this.failedPrintJobs.push(item); | 
 |  |  |  | 
 |  |  |           uni.showToast({ | 
 |  |  |             title: `打印失败: ${this.errorMessage}`, | 
 |  |  |             icon: "none", | 
 |  |  |             duration: 2000, | 
 |  |  |           }); | 
 |  |  |           // 继续处理下一个任务 | 
 |  |  |           continue; | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |                         uni.showToast({ | 
 |  |  |                             title: `打印失败: ${this.errorMessage}`, | 
 |  |  |                             icon: "none", | 
 |  |  |                             duration: 2000, | 
 |  |  |                         }); | 
 |  |  |                         // 继续处理下一个任务 | 
 |  |  |                         continue; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |       this.printing = false; | 
 |  |  |       this.printStatus = "idle"; | 
 |  |  |     }, | 
 |  |  |     // 打印单个信息 | 
 |  |  |     selectNo(item) { | 
 |  |  |       let that = this; | 
 |  |  |       uni.showModal({ | 
 |  |  |         title: "提示", | 
 |  |  |         content: "是否打印装箱单?", | 
 |  |  |         showCancel: true, | 
 |  |  |         success: async function (res) { | 
 |  |  |           if (res.confirm) { | 
 |  |  |             // 添加到打印队列 | 
 |  |  |             that.addToPrintQueue(item); | 
 |  |  |           } | 
 |  |  |         }, | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |                 this.printing = false; | 
 |  |  |                 this.printStatus = "idle"; | 
 |  |  |             }, | 
 |  |  |             // 打印单个信息 | 
 |  |  |             selectNo(item) { | 
 |  |  |                 let that = this; | 
 |  |  |                 uni.showModal({ | 
 |  |  |                     title: "提示", | 
 |  |  |                     content: "是否打印装箱单?", | 
 |  |  |                     showCancel: true, | 
 |  |  |                     success: async function(res) { | 
 |  |  |                         if (res.confirm) { | 
 |  |  |                             // 添加到打印队列 | 
 |  |  |                             that.addToPrintQueue(item); | 
 |  |  |                         } | 
 |  |  |                     }, | 
 |  |  |                 }); | 
 |  |  |             }, | 
 |  |  |  | 
 |  |  |     // 打印全部信息 | 
 |  |  |     goPrintAll() { | 
 |  |  |       let that = this; | 
 |  |  |       uni.showModal({ | 
 |  |  |         title: "提示", | 
 |  |  |         content: `是否打印全部${that.list.length}条装箱单?`, | 
 |  |  |         showCancel: true, | 
 |  |  |         success: async function (res) { | 
 |  |  |           if (res.confirm) { | 
 |  |  |             // 添加到打印队列 | 
 |  |  |             that.addToPrintQueue([...that.list]); | 
 |  |  |           } | 
 |  |  |         }, | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     moveHandle() {}, | 
 |  |  |     maskclose() {}, | 
 |  |  |     //打印二维码 | 
 |  |  |     async printQrCode(item) { | 
 |  |  |       return new Promise(async (resolve, reject) => { | 
 |  |  |         const params = { | 
 |  |  |             rwMatlBindId: item.id | 
 |  |  |         }; | 
 |  |  |         try { | 
 |  |  |           let res = await this.$u.api.dailyPaper.zongjianLabelInfo(params) | 
 |  |  |           if (!res.data) { | 
 |  |  |             this.$refs.uToast.show({ | 
 |  |  |               title: "未查询到该标签信息!", | 
 |  |  |               type: "warning ", | 
 |  |  |             }); | 
 |  |  |             reject(new Error("未查询到该标签信息")); | 
 |  |  |             return; | 
 |  |  |           } | 
 |  |  |             // 打印全部信息 | 
 |  |  |             goPrintAll() { | 
 |  |  |                 let that = this; | 
 |  |  |                 uni.showModal({ | 
 |  |  |                     title: "提示", | 
 |  |  |                     content: `是否打印全部${that.list.length}条装箱单?`, | 
 |  |  |                     showCancel: true, | 
 |  |  |                     success: async function(res) { | 
 |  |  |                         if (res.confirm) { | 
 |  |  |                             // 添加到打印队列 | 
 |  |  |                             that.addToPrintQueue([...that.list]); | 
 |  |  |                         } | 
 |  |  |                     }, | 
 |  |  |                 }); | 
 |  |  |             }, | 
 |  |  |             moveHandle() {}, | 
 |  |  |             maskclose() {}, | 
 |  |  |             //打印二维码 | 
 |  |  |              printQrCode(item) { | 
 |  |  |                 // return new Promise(async (resolve, reject) => { | 
 |  |  |                     // const params = { | 
 |  |  |                     //     rwMatlBindId: item.id | 
 |  |  |                     // }; | 
 |  |  |                  try { | 
 |  |  |                         // let res = await this.$u.api.dailyPaper.zongjianLabelInfo(params) | 
 |  |  |                         if (!item) { | 
 |  |  |                             this.$refs.uToast.show({ | 
 |  |  |                                 title: "未查询到该标签信息!", | 
 |  |  |                                 type: "warning ", | 
 |  |  |                             }); | 
 |  |  |                             reject(new Error("未查询到该标签信息")); | 
 |  |  |                             return; | 
 |  |  |                         } | 
 |  |  |  | 
 |  |  |           // 从API响应中提取所需数据 | 
 |  |  |           const { ht, lj, ljms, fh, scdt, scph, fhdw, shdw } = res.data; | 
 |  |  |                         const ht =  item.contractNo | 
 |  |  |                         const lj =  item.partNo | 
 |  |  |                         const ljms =  item.ccontrProModel | 
 |  |  |                         const fh =  item.newNetWeight | 
 |  |  |                         const scdt =  item.outboundDate | 
 |  |  |                         const scph =  item.batchNo | 
 |  |  |                         const shdw =  item.customerName | 
 |  |  |                         const fhdw = '江东合金技术有限公司' | 
 |  |  |  | 
 |  |  |           // 初始化画板 | 
 |  |  |           jcapi.initDrawingBoard({ | 
 |  |  |             width: 70, | 
 |  |  |             height: 49, | 
 |  |  |             rotate: 90, | 
 |  |  |           }); | 
 |  |  |                         // 初始化画板 | 
 |  |  |                         jcapi.initDrawingBoard({ | 
 |  |  |                             width: 70, | 
 |  |  |                             height: 49, | 
 |  |  |                             rotate: 90, | 
 |  |  |                         }); | 
 |  |  |  | 
 |  |  |           // 绘制二维码 | 
 |  |  |           const qrContent = `ht:${ht}\nlj:${lj}\nljms:${ljms}\nfh:${fh}\nscdt:${scdt}\nscph:${scph}\nfhdw:${fhdw}\nshdw:${shdw}`; | 
 |  |  |           jcapi.drawLabelQrCode({ | 
 |  |  |             x: 43.5, | 
 |  |  |             y: 2, | 
 |  |  |             width: 24, | 
 |  |  |             height: 24, | 
 |  |  |             value: qrContent, | 
 |  |  |             rotate: 0, | 
 |  |  |             codeType: QrCodeType.QrCode, | 
 |  |  |           }); | 
 |  |  |                         // 绘制二维码 | 
 |  |  |                      const qrContent = { | 
 |  |  |                         company : item.customerNo, | 
 |  |  |                           line_no : item.lineNo, | 
 |  |  |                          lot_batch_no : item.batchNo, | 
 |  |  |                          order_no :  item.contractNo, | 
 |  |  |                          part_no :  item.partNo, | 
 |  |  |                           total_qty : item.newNetWeight, | 
 |  |  |                           qty_arrived : item.newNetWeight, | 
 |  |  |                           release_no : item.relNo,	 | 
 |  |  |                         } | 
 |  |  | 						 | 
 |  |  |                         jcapi.drawLabelQrCode({ | 
 |  |  |                             x: 43.5, | 
 |  |  |                             y: 2, | 
 |  |  |                             width: 24, | 
 |  |  |                             height: 24, | 
 |  |  |                             value: qrContent, | 
 |  |  |                             rotate: 0, | 
 |  |  |                             codeType: QrCodeType.QrCode, | 
 |  |  |                         }); | 
 |  |  |  | 
 |  |  |           // 绘制横线 | 
 |  |  |           this.getDrawLabelLine(1, 1, 67, 0.5, 0, LineType.Solid); | 
 |  |  |           this.getDrawLabelLine(1, 6, 42, 0.3, 0, LineType.Solid); | 
 |  |  |           this.getDrawLabelLine(1, 11, 42, 0.3, 0, LineType.Solid); | 
 |  |  |           this.getDrawLabelLine(1, 16, 42, 0.3, 0, LineType.Solid); | 
 |  |  |           this.getDrawLabelLine(1, 21, 42, 0.3, 0, LineType.Solid); | 
 |  |  |           this.getDrawLabelLine(1, 27, 67, 0.3, 0, LineType.Solid); | 
 |  |  |           this.getDrawLabelLine(1, 32, 67, 0.3, 0, LineType.Solid); | 
 |  |  |           this.getDrawLabelLine(1, 37, 67, 0.3, 0, LineType.Solid); | 
 |  |  |           this.getDrawLabelLine(1, 42, 67, 0.3, 0, LineType.Solid); | 
 |  |  |           this.getDrawLabelLine(1, 47, 67, 0.5, 0, LineType.Solid); | 
 |  |  |                         // 绘制横线 | 
 |  |  |                         this.getDrawLabelLine(1, 1, 67, 0.5, 0, LineType.Solid); | 
 |  |  |                         this.getDrawLabelLine(1, 6, 42, 0.3, 0, LineType.Solid); | 
 |  |  |                         this.getDrawLabelLine(1, 11, 42, 0.3, 0, LineType.Solid); | 
 |  |  |                         this.getDrawLabelLine(1, 16, 42, 0.3, 0, LineType.Solid); | 
 |  |  |                         this.getDrawLabelLine(1, 21, 42, 0.3, 0, LineType.Solid); | 
 |  |  |                         this.getDrawLabelLine(1, 27, 67, 0.3, 0, LineType.Solid); | 
 |  |  |                         this.getDrawLabelLine(1, 32, 67, 0.3, 0, LineType.Solid); | 
 |  |  |                         this.getDrawLabelLine(1, 37, 67, 0.3, 0, LineType.Solid); | 
 |  |  |                         this.getDrawLabelLine(1, 42, 67, 0.3, 0, LineType.Solid); | 
 |  |  |                         this.getDrawLabelLine(1, 47, 67, 0.5, 0, LineType.Solid); | 
 |  |  |  | 
 |  |  |           //绘制竖线 | 
 |  |  |           this.getDrawLabelLine(1, 1, 0.5, 46, 0, LineType.Solid); // 竖线1 | 
 |  |  |           this.getDrawLabelLine(43, 1, 0.3, 26, 0, LineType.Solid); // 竖线2 | 
 |  |  |           this.getDrawLabelLine(68, 1, 0.5, 46, 0, LineType.Solid); // 竖线3 | 
 |  |  |                         //绘制竖线 | 
 |  |  |                         this.getDrawLabelLine(1, 1, 0.5, 46, 0, LineType.Solid); // 竖线1 | 
 |  |  |                         this.getDrawLabelLine(43, 1, 0.3, 26, 0, LineType.Solid); // 竖线2 | 
 |  |  |                         this.getDrawLabelLine(68, 1, 0.5, 46, 0, LineType.Solid); // 竖线3 | 
 |  |  |  | 
 |  |  |           // 绘制文本 | 
 |  |  |           this.getDrawLabelText(3,2.5,40,8,"中天科技装箱清单",2.5,0,LineModeType.AutoHeight,0,0,1,1,1); | 
 |  |  |           this.getDrawLabelText(2,7,25,8,"合同号:",2.5,0,LineModeType.AutoHeight,0,0,0,1,1); | 
 |  |  |           this.getDrawLabelText(2,12,25,8,"零件号:",2.5,0,LineModeType.AutoHeight,0,0,0,1,1); | 
 |  |  |           this.getDrawLabelText(2,17,25,8,"零件描述:",2.5,0,LineModeType.AutoHeight,0,0,0,1,1); | 
 |  |  |           this.getDrawLabelText(2,22.5,25,8,"发货/装箱数:",2.5,0,LineModeType.AutoHeight,0,0,0,1,1); | 
 |  |  |           this.getDrawLabelText(2,27.5,25,8,"生产日期:",2.5,0,LineModeType.AutoHeight,0,0,0,1,1); | 
 |  |  |           this.getDrawLabelText(2,32.5,25,8,"生产批号:",2.5,0,LineModeType.AutoHeight,0,0,0,1,1); | 
 |  |  |           this.getDrawLabelText(2,37.5,25,8,"发货单位:",2.5,0,LineModeType.AutoHeight,0,0,0,1,1); | 
 |  |  |           this.getDrawLabelText(2,42.5,25,8,"收货单位:",2.5,0,LineModeType.AutoHeight,0,0,0,1,1); | 
 |  |  |                         // 绘制文本 | 
 |  |  |                         this.getDrawLabelText(3, 2.5, 40, 8, "中天科技装箱清单", 2.5, 0, LineModeType.AutoHeight, | 
 |  |  |                             0, 0, 1, 1, 1); | 
 |  |  |                         this.getDrawLabelText(2, 7, 25, 8, "合同号:", 2.5, 0, LineModeType.AutoHeight, 0, 0, | 
 |  |  |                             0, 1, 1); | 
 |  |  |                         this.getDrawLabelText(2, 12, 25, 8, "零件号:", 2.5, 0, LineModeType.AutoHeight, 0, 0, | 
 |  |  |                             0, 1, 1); | 
 |  |  |                         this.getDrawLabelText(2, 17, 25, 8, "零件描述:", 2.5, 0, LineModeType.AutoHeight, 0, 0, | 
 |  |  |                             0, 1, 1); | 
 |  |  |                         this.getDrawLabelText(2, 22.5, 25, 8, "发货/装箱数:", 2.5, 0, LineModeType.AutoHeight, | 
 |  |  |                             0, 0, 0, 1, 1); | 
 |  |  |                         this.getDrawLabelText(2, 27.5, 25, 8, "生产日期:", 2.5, 0, LineModeType.AutoHeight, 0, | 
 |  |  |                             0, 0, 1, 1); | 
 |  |  |                         this.getDrawLabelText(2, 32.5, 25, 8, "生产批号:", 2.5, 0, LineModeType.AutoHeight, 0, | 
 |  |  |                             0, 0, 1, 1); | 
 |  |  |                         this.getDrawLabelText(2, 37.5, 25, 8, "发货单位:", 2.5, 0, LineModeType.AutoHeight, 0, | 
 |  |  |                             0, 0, 1, 1); | 
 |  |  |                         this.getDrawLabelText(2, 42.5, 25, 8, "收货单位:", 2.5, 0, LineModeType.AutoHeight, 0, | 
 |  |  |                             0, 0, 1, 1); | 
 |  |  |  | 
 |  |  |           // 填充参数值 | 
 |  |  |           this.getDrawLabelText(11,7,30,8,ht,2.5,0,LineModeType.AutoHeight,0,0,0,0,1); | 
 |  |  |           this.getDrawLabelText(11,12,32,8,lj,2.5,0,LineModeType.AutoHeight,0,0,0,0,1); | 
 |  |  |           this.getDrawLabelText(14,17,30,8,ljms,2.5,0,LineModeType.AutoHeight,0,0,0,0,1); | 
 |  |  |           this.getDrawLabelText(17,22.5,27,8,fh,2.5,0,LineModeType.AutoHeight,0,0,0,0,1); | 
 |  |  |           this.getDrawLabelText(14,27.5,55,8,scdt,2.5,0,LineModeType.AutoHeight,0,0,0,0,1); | 
 |  |  |           this.getDrawLabelText(14,32.7,55,8,scph,2.5,0,LineModeType.AutoHeight,0,0,0,0,1); | 
 |  |  |           this.getDrawLabelText(14,37.5,55,8,fhdw,2.5,0,LineModeType.AutoHeight,0,0,0,0,1); | 
 |  |  |           this.getDrawLabelText(14,42.5,55,8,shdw,2.5,0,LineModeType.AutoHeight,0,0,0,0,1); | 
 |  |  |                         // 填充参数值 | 
 |  |  |                         this.getDrawLabelText(11, 7, 30, 8, ht, 2.5, 0, LineModeType.AutoHeight, 0, 0, 0, | 
 |  |  |                             0, 1); | 
 |  |  |                         this.getDrawLabelText(11, 12, 32, 8, lj, 2.5, 0, LineModeType.AutoHeight, 0, 0, 0, | 
 |  |  |                             0, 1); | 
 |  |  |                         this.getDrawLabelText(14, 17, 30, 8, ljms, 2.5, 0, LineModeType.AutoHeight, 0, 0, | 
 |  |  |                             0, 0, 1); | 
 |  |  |                         this.getDrawLabelText(17, 22.5, 27, 8, fh, 2.5, 0, LineModeType.AutoHeight, 0, 0, | 
 |  |  |                             0, 0, 1); | 
 |  |  |                         this.getDrawLabelText(14, 27.5, 55, 8, scdt, 2.5, 0, LineModeType.AutoHeight, 0, 0, | 
 |  |  |                             0, 0, 1); | 
 |  |  |                         this.getDrawLabelText(14, 32.7, 55, 8, scph, 2.5, 0, LineModeType.AutoHeight, 0, 0, | 
 |  |  |                             0, 0, 1); | 
 |  |  |                         this.getDrawLabelText(14, 37.5, 55, 8, fhdw, 2.5, 0, LineModeType.AutoHeight, 0, 0, | 
 |  |  |                             0, 0, 1); | 
 |  |  |                         this.getDrawLabelText(14, 42.5, 55, 8, shdw, 2.5, 0, LineModeType.AutoHeight, 0, 0, | 
 |  |  |                             0, 0, 1); | 
 |  |  |                         // 生成打印数据 | 
 |  |  |                         let imageJsonObj = jcapi.generateLabelJson(); | 
 |  |  |  | 
 |  |  |           // 生成打印数据 | 
 |  |  |           let imageJsonObj = jcapi.generateLabelJson(); | 
 |  |  |                         // 设置打印任务 | 
 |  |  |                         jcapi.startJob({ | 
 |  |  |                                 totalCount: 1, | 
 |  |  |                                 density: this.printDensity, | 
 |  |  |                                 labelType: this.labelType, | 
 |  |  |                                 printMode: this.printMode, | 
 |  |  |                             }, | 
 |  |  |                             function (r) { | 
 |  |  |                                 if (r.code == 0) { | 
 |  |  |                                     // 打印数据 | 
 |  |  |                                     // 存储原始打印计数回调 | 
 |  |  |                                     const originalPrintCountCallback = | 
 |  |  |                                         jcapi.didReadPrintCountInfo._callback; | 
 |  |  |                                     // 临时打印计数回调,用于确认打印完成 | 
 |  |  |                                     const tempPrintCountCallback = (printResult) => { | 
 |  |  |                                         // 恢复原始回调 | 
 |  |  |                                         jcapi.didReadPrintCountInfo(originalPrintCountCallback); | 
 |  |  |                                         // 清除打印超时 | 
 |  |  |                                         clearTimeout(printTimeout); | 
 |  |  |                                         // 结束当前打印任务 | 
 |  |  |                                         // 解析Promise表示打印完成 | 
 |  |  |                                         resolve(); | 
 |  |  |                                     }; | 
 |  |  |                                     // 设置临时回调 | 
 |  |  |                                     jcapi.didReadPrintCountInfo(tempPrintCountCallback); | 
 |  |  |  | 
 |  |  |           // 设置打印任务 | 
 |  |  |           jcapi.startJob( | 
 |  |  |             { | 
 |  |  |               totalCount: 1, | 
 |  |  |               density: this.printDensity, | 
 |  |  |               labelType: this.labelType, | 
 |  |  |               printMode: this.printMode, | 
 |  |  |             }, | 
 |  |  |             function (r) { | 
 |  |  |               if (r.code == 0) { | 
 |  |  |                 // 打印数据 | 
 |  |  |                 // 存储原始打印计数回调 | 
 |  |  |                 const originalPrintCountCallback = | 
 |  |  |                   jcapi.didReadPrintCountInfo._callback; | 
 |  |  |                 // 临时打印计数回调,用于确认打印完成 | 
 |  |  |                 const tempPrintCountCallback = (printResult) => { | 
 |  |  |                   // 恢复原始回调 | 
 |  |  |                   jcapi.didReadPrintCountInfo(originalPrintCountCallback); | 
 |  |  |                   // 清除打印超时 | 
 |  |  |                   clearTimeout(printTimeout); | 
 |  |  |                   // 结束当前打印任务 | 
 |  |  |                   // 解析Promise表示打印完成 | 
 |  |  |                   resolve(); | 
 |  |  |                 }; | 
 |  |  |                 // 设置临时回调 | 
 |  |  |                 jcapi.didReadPrintCountInfo(tempPrintCountCallback); | 
 |  |  |                                     // 添加打印超时处理 | 
 |  |  |                                     const printTimeout = setTimeout(() => { | 
 |  |  |                                         jcapi.didReadPrintCountInfo( | 
 |  |  |                                             originalPrintCountCallback); | 
 |  |  |                                         reject(new Error("打印超时未响应")); | 
 |  |  |                                     }, 20000); | 
 |  |  |  | 
 |  |  |                 // 添加打印超时处理 | 
 |  |  |                 const printTimeout = setTimeout(() => { | 
 |  |  |                   jcapi.didReadPrintCountInfo(originalPrintCountCallback); | 
 |  |  |                   reject(new Error("打印超时未响应")); | 
 |  |  |                 }, 20000); | 
 |  |  |                                     jcapi.printData( | 
 |  |  |                                         imageJsonObj, { | 
 |  |  |                                             printQuantity: 1, | 
 |  |  |                                         }, | 
 |  |  |                                         function(r) { | 
 |  |  |                                             if (r.code != 0) { | 
 |  |  |                                                 // 恢复原始回调 | 
 |  |  |                                                 jcapi.didReadPrintCountInfo( | 
 |  |  |                                                     originalPrintCountCallback); | 
 |  |  |                                                 // 结束当前打印任务 | 
 |  |  |                                                 reject(new Error(r.msg || "打印失败")); | 
 |  |  |                                             } | 
 |  |  |                                             // 打印数据发送成功后等待打印计数回调确认实际打印完成 | 
 |  |  |                                         } | 
 |  |  |                                     ); | 
 |  |  |                                 } else { | 
 |  |  |                                     reject(new Error(r.msg || "设置打印任务失败")); | 
 |  |  |                                 } | 
 |  |  |                             } | 
 |  |  |                         ); | 
 |  |  |                     } catch (error) { | 
 |  |  |                         reject(error); | 
 |  |  |                     } | 
 |  |  |                 // }); | 
 |  |  |             }, | 
 |  |  |             tapQuery(item) { | 
 |  |  |                 this.maskShow = false; | 
 |  |  |                 // 连接打印机 | 
 |  |  |                 let _this = this; | 
 |  |  |  | 
 |  |  |                 jcapi.printData( | 
 |  |  |                   imageJsonObj, | 
 |  |  |                   { | 
 |  |  |                     printQuantity: 1, | 
 |  |  |                   }, | 
 |  |  |                   function (r) { | 
 |  |  |                     if (r.code != 0) { | 
 |  |  |                       // 恢复原始回调 | 
 |  |  |                       jcapi.didReadPrintCountInfo(originalPrintCountCallback); | 
 |  |  |                       // 结束当前打印任务 | 
 |  |  |                       reject(new Error(r.msg || "打印失败")); | 
 |  |  |                     } | 
 |  |  |                     // 打印数据发送成功后等待打印计数回调确认实际打印完成 | 
 |  |  |                   } | 
 |  |  |                 ); | 
 |  |  |               } else { | 
 |  |  |                 reject(new Error(r.msg || "设置打印任务失败")); | 
 |  |  |               } | 
 |  |  |             } | 
 |  |  |           ); | 
 |  |  |         } catch (error) { | 
 |  |  |           reject(error); | 
 |  |  |         } | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     tapQuery(item) { | 
 |  |  |       this.maskShow = false; | 
 |  |  |       // 连接打印机 | 
 |  |  |       let _this = this; | 
 |  |  |                 // 设置为连接中状态 | 
 |  |  |                 this.connectionStatus = "connecting"; | 
 |  |  |  | 
 |  |  |       // 设置为连接中状态 | 
 |  |  |       this.connectionStatus = "connecting"; | 
 |  |  |                 jcapi.openPrinterByDevice({ | 
 |  |  |                         address: item.address, | 
 |  |  |                         name: item.name, | 
 |  |  |                         deviceType: 0, // 设备类型:0-蓝牙,1-网络 | 
 |  |  |                     }, | 
 |  |  |                     function(r) { | 
 |  |  |                         if (r.code == 0) { | 
 |  |  |                             _this.connectedDevice = item; | 
 |  |  |                             _this.connectionStatus = "connected"; | 
 |  |  |                             uni.showToast({ | 
 |  |  |                                 title: "连接成功", | 
 |  |  |                                 duration: 1500, | 
 |  |  |                             }); | 
 |  |  |                             // 开始处理打印队列 | 
 |  |  |                             if (_this.printQueue.length > 0) { | 
 |  |  |                                 _this.processPrintQueue(); | 
 |  |  |                             } | 
 |  |  |                         } else { | 
 |  |  |                             _this.connectionStatus = "disconnected"; | 
 |  |  |                             uni.showToast({ | 
 |  |  |                                 title: "连接失败: " + (r.msg || "未知错误"), | 
 |  |  |                                 icon: "none", | 
 |  |  |                                 duration: 2000, | 
 |  |  |                             }); | 
 |  |  |                         } | 
 |  |  |                     } | 
 |  |  |                 ); | 
 |  |  |             }, | 
 |  |  |             //打印相关 | 
 |  |  |             searchDevice() { | 
 |  |  |                 let _this = this; | 
 |  |  |                 uni.openBluetoothAdapter({ | 
 |  |  |                     // 确认蓝牙是否打开 | 
 |  |  |                     success(r) { | 
 |  |  |                         uni.showLoading({ | 
 |  |  |                             title: "搜索中...", | 
 |  |  |                         }); | 
 |  |  |                         // 未授予蓝牙相关权限和未打开手机定位会搜索不到设备 | 
 |  |  |                         jcapi.getBluetoothDevices(function(r) { | 
 |  |  |                             console.log("device:" + JSON.stringify(r)); | 
 |  |  |                             // 搜索到设备回调 | 
 |  |  |                             uni.hideLoading(); | 
 |  |  |                             // 如果之前有连接的设备但不在搜索结果中,说明设备已更换 | 
 |  |  |                             if ( | 
 |  |  |                                 _this.connectedDevice && | 
 |  |  |                                 !r.some((dev) => dev.address === _this.connectedDevice.address) | 
 |  |  |                             ) { | 
 |  |  |                                 _this.connectedDevice = null; | 
 |  |  |                                 uni.showToast({ | 
 |  |  |                                     icon: "none", | 
 |  |  |                                     title: "已连接的蓝牙设备已更换,请重新选择", | 
 |  |  |                                     duration: 2000, | 
 |  |  |                                 }); | 
 |  |  |                             } | 
 |  |  |                             _this.listDevice = r; | 
 |  |  |                             _this.maskShow = true; | 
 |  |  |                         }); | 
 |  |  |                     }, | 
 |  |  |                     fail(e) { | 
 |  |  |                         uni.showModal({ | 
 |  |  |                             title: "提示", | 
 |  |  |                             content: "打开蓝牙失败,请检查蓝牙是否开启", | 
 |  |  |                             showCancel: false, | 
 |  |  |                         }); | 
 |  |  |                         console.log("开启蓝牙设备失败" + e); | 
 |  |  |                     }, | 
 |  |  |                 }); | 
 |  |  |             }, | 
 |  |  |             // 绘制横线 | 
 |  |  |             getDrawLabelLine(x, y, width, height, rotate, lineType) { | 
 |  |  |                 jcapi.drawLabelLine({ | 
 |  |  |                     x: x, | 
 |  |  |                     y: y, | 
 |  |  |                     width: width, | 
 |  |  |                     height: height, | 
 |  |  |                     rotate: rotate, | 
 |  |  |                     lineType: lineType, | 
 |  |  |                 }); | 
 |  |  |             }, | 
 |  |  |             // 填冲文字标题 | 
 |  |  |             getDrawLabelText( | 
 |  |  |                 x, | 
 |  |  |                 y, | 
 |  |  |                 width, | 
 |  |  |                 height, | 
 |  |  |                 value, | 
 |  |  |                 fontSize, | 
 |  |  |                 rotate, | 
 |  |  |                 lineMode, | 
 |  |  |                 lineSpace, | 
 |  |  |                 letterSpace, | 
 |  |  |                 textAlignHorizontal, | 
 |  |  |                 textAlignVertical, | 
 |  |  |                 bold | 
 |  |  |             ) { | 
 |  |  |                 jcapi.drawLabelText({ | 
 |  |  |                     x: x, | 
 |  |  |                     y: y, | 
 |  |  |                     width: width, | 
 |  |  |                     height: height, | 
 |  |  |                     value: value, | 
 |  |  |                     fontSize: fontSize, | 
 |  |  |                     rotate: rotate, | 
 |  |  |                     lineMode: lineMode, | 
 |  |  |                     lineSpace: lineSpace, | 
 |  |  |                     letterSpace: letterSpace, | 
 |  |  |                     textAlignHorizontal: textAlignHorizontal, | 
 |  |  |                     textAlignVertical: textAlignVertical, | 
 |  |  |                     bold: bold, | 
 |  |  |                 }); | 
 |  |  |             }, | 
 |  |  |             getConnectionStatusText() { | 
 |  |  |                 switch (this.connectionStatus) { | 
 |  |  |                     case "connected": | 
 |  |  |                         return "蓝牙已连接"; | 
 |  |  |                     case "connecting": | 
 |  |  |                         return "蓝牙连接中..."; | 
 |  |  |                     default: | 
 |  |  |                         return "蓝牙未连接"; | 
 |  |  |                 } | 
 |  |  |             }, | 
 |  |  |             getPrintStatusText() { | 
 |  |  |                 switch (this.printStatus) { | 
 |  |  |                     case "printing": | 
 |  |  |                         const total = this.printQueue.length + 1; // 队列中剩余 + 当前正在打印 | 
 |  |  |                         const current = total - this.printQueue.length; | 
 |  |  |                         return `打印中(${current}/${total})`; | 
 |  |  |                     case "error": | 
 |  |  |                         return `打印错误: ${this.errorMessage}`; | 
 |  |  |                     default: | 
 |  |  |                         return "就绪"; | 
 |  |  |                 } | 
 |  |  |             }, | 
 |  |  |             //刷新上一个页面 | 
 |  |  |             refreshLastPage(no) { | 
 |  |  |                 // 告知 A.vue 更新数据 | 
 |  |  |                 // 获取页面栈 | 
 |  |  |                 let pages = getCurrentPages(); | 
 |  |  |  | 
 |  |  |       jcapi.openPrinterByDevice( | 
 |  |  |         { | 
 |  |  |           address: item.address, | 
 |  |  |           name: item.name, | 
 |  |  |           deviceType: 0, // 设备类型:0-蓝牙,1-网络 | 
 |  |  |         }, | 
 |  |  |         function (r) { | 
 |  |  |           if (r.code == 0) { | 
 |  |  |             _this.connectedDevice = item; | 
 |  |  |             _this.connectionStatus = "connected"; | 
 |  |  |             uni.showToast({ | 
 |  |  |               title: "连接成功", | 
 |  |  |               duration: 1500, | 
 |  |  |             }); | 
 |  |  |             // 开始处理打印队列 | 
 |  |  |             if (_this.printQueue.length > 0) { | 
 |  |  |               _this.processPrintQueue(); | 
 |  |  |             } | 
 |  |  |           } else { | 
 |  |  |             _this.connectionStatus = "disconnected"; | 
 |  |  |             uni.showToast({ | 
 |  |  |               title: "连接失败: " + (r.msg || "未知错误"), | 
 |  |  |               icon: "none", | 
 |  |  |               duration: 2000, | 
 |  |  |             }); | 
 |  |  |           } | 
 |  |  |         } | 
 |  |  |       ); | 
 |  |  |     }, | 
 |  |  |     //打印相关 | 
 |  |  |     searchDevice() { | 
 |  |  |       let _this = this; | 
 |  |  |       uni.openBluetoothAdapter({ | 
 |  |  |         // 确认蓝牙是否打开 | 
 |  |  |         success(r) { | 
 |  |  |           uni.showLoading({ | 
 |  |  |             title: "搜索中...", | 
 |  |  |           }); | 
 |  |  |           // 未授予蓝牙相关权限和未打开手机定位会搜索不到设备 | 
 |  |  |           jcapi.getBluetoothDevices(function (r) { | 
 |  |  |             console.log("device:" + JSON.stringify(r)); | 
 |  |  |             // 搜索到设备回调 | 
 |  |  |             uni.hideLoading(); | 
 |  |  |             // 如果之前有连接的设备但不在搜索结果中,说明设备已更换 | 
 |  |  |             if ( | 
 |  |  |               _this.connectedDevice && | 
 |  |  |               !r.some((dev) => dev.address === _this.connectedDevice.address) | 
 |  |  |             ) { | 
 |  |  |               _this.connectedDevice = null; | 
 |  |  |               uni.showToast({ | 
 |  |  |                 icon: "none", | 
 |  |  |                 title: "已连接的蓝牙设备已更换,请重新选择", | 
 |  |  |                 duration: 2000, | 
 |  |  |               }); | 
 |  |  |             } | 
 |  |  |             _this.listDevice = r; | 
 |  |  |             _this.maskShow = true; | 
 |  |  |           }); | 
 |  |  |         }, | 
 |  |  |         fail(e) { | 
 |  |  |           uni.showModal({ | 
 |  |  |             title: "提示", | 
 |  |  |             content: "打开蓝牙失败,请检查蓝牙是否开启", | 
 |  |  |             showCancel: false, | 
 |  |  |           }); | 
 |  |  |           console.log("开启蓝牙设备失败" + e); | 
 |  |  |         }, | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     // 绘制横线 | 
 |  |  |     getDrawLabelLine(x, y, width, height, rotate, lineType) { | 
 |  |  |       jcapi.drawLabelLine({ | 
 |  |  |         x: x, | 
 |  |  |         y: y, | 
 |  |  |         width: width, | 
 |  |  |         height: height, | 
 |  |  |         rotate: rotate, | 
 |  |  |         lineType: lineType, | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     // 填冲文字标题 | 
 |  |  |     getDrawLabelText( | 
 |  |  |       x, | 
 |  |  |       y, | 
 |  |  |       width, | 
 |  |  |       height, | 
 |  |  |       value, | 
 |  |  |       fontSize, | 
 |  |  |       rotate, | 
 |  |  |       lineMode, | 
 |  |  |       lineSpace, | 
 |  |  |       letterSpace, | 
 |  |  |       textAlignHorizontal, | 
 |  |  |       textAlignVertical, | 
 |  |  |       bold | 
 |  |  |     ) { | 
 |  |  |       jcapi.drawLabelText({ | 
 |  |  |         x: x, | 
 |  |  |         y: y, | 
 |  |  |         width: width, | 
 |  |  |         height: height, | 
 |  |  |         value: value, | 
 |  |  |         fontSize: fontSize, | 
 |  |  |         rotate: rotate, | 
 |  |  |         lineMode: lineMode, | 
 |  |  |         lineSpace: lineSpace, | 
 |  |  |         letterSpace: letterSpace, | 
 |  |  |         textAlignHorizontal: textAlignHorizontal, | 
 |  |  |         textAlignVertical: textAlignVertical, | 
 |  |  |         bold: bold, | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |     getConnectionStatusText() { | 
 |  |  |       switch (this.connectionStatus) { | 
 |  |  |         case "connected": | 
 |  |  |           return "蓝牙已连接"; | 
 |  |  |         case "connecting": | 
 |  |  |           return "蓝牙连接中..."; | 
 |  |  |         default: | 
 |  |  |           return "蓝牙未连接"; | 
 |  |  |       } | 
 |  |  |     }, | 
 |  |  |     getPrintStatusText() { | 
 |  |  |       switch (this.printStatus) { | 
 |  |  |         case "printing": | 
 |  |  |           const total = this.printQueue.length + 1; // 队列中剩余 + 当前正在打印 | 
 |  |  |           const current = total - this.printQueue.length; | 
 |  |  |           return `打印中(${current}/${total})`; | 
 |  |  |         case "error": | 
 |  |  |           return `打印错误: ${this.errorMessage}`; | 
 |  |  |         default: | 
 |  |  |           return "就绪"; | 
 |  |  |       } | 
 |  |  |     }, | 
 |  |  |     //刷新上一个页面 | 
 |  |  |     refreshLastPage(no) { | 
 |  |  |       // 告知 A.vue 更新数据 | 
 |  |  |       // 获取页面栈 | 
 |  |  |       let pages = getCurrentPages(); | 
 |  |  |                 // 获取上一页栈 | 
 |  |  |                 let prevPage = pages[pages.length - 2]; | 
 |  |  |  | 
 |  |  |       // 获取上一页栈 | 
 |  |  |       let prevPage = pages[pages.length - 2]; | 
 |  |  |                 // 触发上一页 upData 函数(并携带参数) | 
 |  |  |                 prevPage.$vm.setNo(no); | 
 |  |  |  | 
 |  |  |       // 触发上一页 upData 函数(并携带参数) | 
 |  |  |       prevPage.$vm.setNo(no); | 
 |  |  |  | 
 |  |  |       // 返回上一页 | 
 |  |  |       uni.navigateBack({ | 
 |  |  |         delta: 1, | 
 |  |  |       }); | 
 |  |  |     }, | 
 |  |  |   }, | 
 |  |  | }; | 
 |  |  |                 // 返回上一页 | 
 |  |  |                 uni.navigateBack({ | 
 |  |  |                     delta: 1, | 
 |  |  |                 }); | 
 |  |  |             }, | 
 |  |  |         }, | 
 |  |  |     }; | 
 |  |  | </script> | 
 |  |  | <style lang="scss"> | 
 |  |  | .finishProductIn-locno-bg { | 
 |  |  |   background-color: #f6f9ff; | 
 |  |  |   background-image: url("~@/static/custom/finishProductIn/locNoBg.png"); | 
 |  |  |   // background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0)); | 
 |  |  |   padding: 0 20rpx; | 
 |  |  |   background-attachment: fixed; | 
 |  |  |   background-size: 100% auto; | 
 |  |  |   background-repeat: no-repeat; | 
 |  |  |   position: fixed; | 
 |  |  |   top: 0; | 
 |  |  |   bottom: 0; | 
 |  |  |   width: 100%; | 
 |  |  |   z-index: -1; | 
 |  |  | } | 
 |  |  |     .finishProductIn-locno-bg { | 
 |  |  |         background-color: #f6f9ff; | 
 |  |  |         background-image: url("~@/static/custom/finishProductIn/locNoBg.png"); | 
 |  |  |         // background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0)); | 
 |  |  |         padding: 0 20rpx; | 
 |  |  |         background-attachment: fixed; | 
 |  |  |         background-size: 100% auto; | 
 |  |  |         background-repeat: no-repeat; | 
 |  |  |         position: fixed; | 
 |  |  |         top: 0; | 
 |  |  |         bottom: 0; | 
 |  |  |         width: 100%; | 
 |  |  |         z-index: -1; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | .finishProductIn-locno-search { | 
 |  |  |   padding: 40rpx 30rpx 20rpx 30rpx; | 
 |  |  | } | 
 |  |  |     .finishProductIn-locno-search { | 
 |  |  |         padding: 40rpx 30rpx 20rpx 30rpx; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | .wrap .finishProductIn-locno-scroll-list { | 
 |  |  |   height: calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx); | 
 |  |  |   width: 100%; | 
 |  |  | } | 
 |  |  |     .wrap .finishProductIn-locno-scroll-list { | 
 |  |  |         height: calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx); | 
 |  |  |         width: 100%; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | .finishProductIn-locno-scroll-list-group { | 
 |  |  |   ::v-deep .u-cell-item-box { | 
 |  |  |     background-color: rgba(250, 252, 255, 0.36) !important; | 
 |  |  |     padding: 0rpx 30rpx; | 
 |  |  |   } | 
 |  |  |     .finishProductIn-locno-scroll-list-group { | 
 |  |  |         ::v-deep .u-cell-item-box { | 
 |  |  |             background-color: rgba(250, 252, 255, 0.36) !important; | 
 |  |  |             padding: 0rpx 30rpx; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |   .content { | 
 |  |  |     font-size: 12px; | 
 |  |  |     background-color: #ffffff; | 
 |  |  |     box-sizing: border-box; | 
 |  |  |     border-radius: 10rpx; | 
 |  |  |     margin: 0rpx 0rpx 16rpx; | 
 |  |  |     padding: 20rpx 8rpx; | 
 |  |  |     box-shadow: none; | 
 |  |  |     display: flex; | 
 |  |  |     align-items: center; | 
 |  |  |         .content { | 
 |  |  |             font-size: 12px; | 
 |  |  |             background-color: #ffffff; | 
 |  |  |             box-sizing: border-box; | 
 |  |  |             border-radius: 10rpx; | 
 |  |  |             margin: 0rpx 0rpx 16rpx; | 
 |  |  |             padding: 20rpx 8rpx; | 
 |  |  |             box-shadow: none; | 
 |  |  |             display: flex; | 
 |  |  |             align-items: center; | 
 |  |  |  | 
 |  |  |     .content-header { | 
 |  |  |       width: 40rpx; | 
 |  |  |       height: 90rpx; | 
 |  |  |       display: flex; | 
 |  |  |       align-items: center; | 
 |  |  |             .content-header { | 
 |  |  |                 width: 40rpx; | 
 |  |  |                 height: 90rpx; | 
 |  |  |                 display: flex; | 
 |  |  |                 align-items: center; | 
 |  |  |  | 
 |  |  |       .content-header-icon { | 
 |  |  |         background-image: url("~@/static/custom/moveWareHouse/header_icon.png"); | 
 |  |  |         background-size: 100% auto; | 
 |  |  |         background-repeat: no-repeat; | 
 |  |  |         height: 28rpx; | 
 |  |  |         width: 28rpx; | 
 |  |  |       } | 
 |  |  |                 .content-header-icon { | 
 |  |  |                     background-image: url("~@/static/custom/moveWareHouse/header_icon.png"); | 
 |  |  |                     background-size: 100% auto; | 
 |  |  |                     background-repeat: no-repeat; | 
 |  |  |                     height: 28rpx; | 
 |  |  |                     width: 28rpx; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |       .content-header-title { | 
 |  |  |         margin-left: 11rpx; | 
 |  |  |         font-size: 26rpx; | 
 |  |  |         font-weight: bold; | 
 |  |  |         color: #3d52f5; | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |                 .content-header-title { | 
 |  |  |                     margin-left: 11rpx; | 
 |  |  |                     font-size: 26rpx; | 
 |  |  |                     font-weight: bold; | 
 |  |  |                     color: #3d52f5; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |     .content-body { | 
 |  |  |       flex: 1; | 
 |  |  |       background: #f5f9ff; | 
 |  |  |       border-radius: 10rpx; | 
 |  |  |       padding: 0rpx 23rpx; | 
 |  |  |             .content-body { | 
 |  |  |                 flex: 1; | 
 |  |  |                 background: #f5f9ff; | 
 |  |  |                 border-radius: 10rpx; | 
 |  |  |                 padding: 0rpx 23rpx; | 
 |  |  |  | 
 |  |  |       .row-list { | 
 |  |  |         height: 60rpx; | 
 |  |  |         display: flex; | 
 |  |  |         flex-direction: row; | 
 |  |  |         padding: 0px; | 
 |  |  |         align-items: center; | 
 |  |  |       } | 
 |  |  |                 .row-list { | 
 |  |  |                     height: 60rpx; | 
 |  |  |                     display: flex; | 
 |  |  |                     flex-direction: row; | 
 |  |  |                     padding: 0px; | 
 |  |  |                     align-items: center; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |       .row-list ._label { | 
 |  |  |         display: flex; | 
 |  |  |         flex: 0.8; | 
 |  |  |         color: #909399; | 
 |  |  |         align-items: center; | 
 |  |  |                 .row-list ._label { | 
 |  |  |                     display: flex; | 
 |  |  |                     flex: 0.8; | 
 |  |  |                     color: #909399; | 
 |  |  |                     align-items: center; | 
 |  |  |  | 
 |  |  |         ._label-icon-1 { | 
 |  |  |           background-image: url("~@/static/custom/moveWareHouse/label-icon-1.png"); | 
 |  |  |           background-size: 100% auto; | 
 |  |  |           background-repeat: no-repeat; | 
 |  |  |           height: 26rpx; | 
 |  |  |           width: 26rpx; | 
 |  |  |         } | 
 |  |  |                     ._label-icon-1 { | 
 |  |  |                         background-image: url("~@/static/custom/moveWareHouse/label-icon-1.png"); | 
 |  |  |                         background-size: 100% auto; | 
 |  |  |                         background-repeat: no-repeat; | 
 |  |  |                         height: 26rpx; | 
 |  |  |                         width: 26rpx; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |         ._label-icon-2 { | 
 |  |  |           background-image: url("~@/static/custom/moveWareHouse/label-icon-2.png"); | 
 |  |  |           background-size: 100% auto; | 
 |  |  |           background-repeat: no-repeat; | 
 |  |  |           height: 26rpx; | 
 |  |  |           width: 26rpx; | 
 |  |  |         } | 
 |  |  |                     ._label-icon-2 { | 
 |  |  |                         background-image: url("~@/static/custom/moveWareHouse/label-icon-2.png"); | 
 |  |  |                         background-size: 100% auto; | 
 |  |  |                         background-repeat: no-repeat; | 
 |  |  |                         height: 26rpx; | 
 |  |  |                         width: 26rpx; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |         ._label-icon-3 { | 
 |  |  |           background-image: url("~@/static/custom/moveWareHouse/label-icon-3.png"); | 
 |  |  |           background-size: 100% auto; | 
 |  |  |           background-repeat: no-repeat; | 
 |  |  |           height: 26rpx; | 
 |  |  |           width: 26rpx; | 
 |  |  |         } | 
 |  |  |                     ._label-icon-3 { | 
 |  |  |                         background-image: url("~@/static/custom/moveWareHouse/label-icon-3.png"); | 
 |  |  |                         background-size: 100% auto; | 
 |  |  |                         background-repeat: no-repeat; | 
 |  |  |                         height: 26rpx; | 
 |  |  |                         width: 26rpx; | 
 |  |  |                     } | 
 |  |  |  | 
 |  |  |         ._label-name { | 
 |  |  |           margin-left: 11rpx; | 
 |  |  |           font-size: 26rpx; | 
 |  |  |           font-weight: 500; | 
 |  |  |           color: #666666; | 
 |  |  |         } | 
 |  |  |       } | 
 |  |  |                     ._label-name { | 
 |  |  |                         margin-left: 11rpx; | 
 |  |  |                         font-size: 26rpx; | 
 |  |  |                         font-weight: 500; | 
 |  |  |                         color: #666666; | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |       .row-list ._content { | 
 |  |  |         flex: 1.5; | 
 |  |  |         text-align: right; | 
 |  |  |         color: #909399; | 
 |  |  |         font-size: 24rpx; | 
 |  |  |       } | 
 |  |  |                 .row-list ._content { | 
 |  |  |                     flex: 1.5; | 
 |  |  |                     text-align: right; | 
 |  |  |                     color: #909399; | 
 |  |  |                     font-size: 24rpx; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |       .row-list .s1 { | 
 |  |  |         color: #d35651; | 
 |  |  |       } | 
 |  |  |     } | 
 |  |  |   } | 
 |  |  | } | 
 |  |  |                 .row-list .s1 { | 
 |  |  |                     color: #d35651; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | .navbar-right { | 
 |  |  |   font-weight: 500; | 
 |  |  |   font-size: 13px; | 
 |  |  |   color: #0b0b0b; | 
 |  |  |   line-height: 36rpx; | 
 |  |  |   margin-right: 32rpx; | 
 |  |  | } | 
 |  |  |     .navbar-right { | 
 |  |  |         font-weight: 500; | 
 |  |  |         font-size: 13px; | 
 |  |  |         color: #0b0b0b; | 
 |  |  |         line-height: 36rpx; | 
 |  |  |         margin-right: 32rpx; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | /* 模态框样式优化 */ | 
 |  |  | .u-modal { | 
 |  |  |   --modal-width: 85% !important; | 
 |  |  |   --modal-radius: 16rpx !important; | 
 |  |  |   --modal-bg-color: #ffffff !important; | 
 |  |  | } | 
 |  |  |     /* 模态框样式优化 */ | 
 |  |  |     .u-modal { | 
 |  |  |         --modal-width: 85% !important; | 
 |  |  |         --modal-radius: 16rpx !important; | 
 |  |  |         --modal-bg-color: #ffffff !important; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | /* 模态框内容区域 */ | 
 |  |  | .uni-scroll_box { | 
 |  |  |   height: 500rpx !important; | 
 |  |  |   padding: 20rpx; | 
 |  |  | } | 
 |  |  |     /* 模态框内容区域 */ | 
 |  |  |     .uni-scroll_box { | 
 |  |  |         height: 500rpx !important; | 
 |  |  |         padding: 20rpx; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | /* 设备列表项样式 */ | 
 |  |  | .device-item { | 
 |  |  |   background-color: #f5f9ff; | 
 |  |  |   border-radius: 12rpx; | 
 |  |  |   padding: 20rpx; | 
 |  |  |   margin-bottom: 16rpx; | 
 |  |  |   box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05); | 
 |  |  | } | 
 |  |  |     /* 设备列表项样式 */ | 
 |  |  |     .device-item { | 
 |  |  |         background-color: #f5f9ff; | 
 |  |  |         border-radius: 12rpx; | 
 |  |  |         padding: 20rpx; | 
 |  |  |         margin-bottom: 16rpx; | 
 |  |  |         box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | /* 设备名称样式 */ | 
 |  |  | .device-name { | 
 |  |  |   font-size: 28rpx; | 
 |  |  |   font-weight: 500; | 
 |  |  |   color: #333333; | 
 |  |  |   margin-bottom: 10rpx; | 
 |  |  |   display: flex; | 
 |  |  |   justify-content: space-between; | 
 |  |  | } | 
 |  |  |     /* 设备名称样式 */ | 
 |  |  |     .device-name { | 
 |  |  |         font-size: 28rpx; | 
 |  |  |         font-weight: 500; | 
 |  |  |         color: #333333; | 
 |  |  |         margin-bottom: 10rpx; | 
 |  |  |         display: flex; | 
 |  |  |         justify-content: space-between; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | /* UUID文本样式 */ | 
 |  |  | .device-uuid { | 
 |  |  |   font-size: 28rpx; | 
 |  |  |   font-weight: 500; | 
 |  |  |   color: #333333; | 
 |  |  |   margin-bottom: 10rpx; | 
 |  |  |   display: flex; | 
 |  |  |   justify-content: space-between; | 
 |  |  | } | 
 |  |  |     /* UUID文本样式 */ | 
 |  |  |     .device-uuid { | 
 |  |  |         font-size: 28rpx; | 
 |  |  |         font-weight: 500; | 
 |  |  |         color: #333333; | 
 |  |  |         margin-bottom: 10rpx; | 
 |  |  |         display: flex; | 
 |  |  |         justify-content: space-between; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | /* 模态框标题 */ | 
 |  |  | .modal-title { | 
 |  |  |   font-size: 32rpx; | 
 |  |  |   font-weight: bold; | 
 |  |  |   color: #333333; | 
 |  |  |   text-align: center; | 
 |  |  |   margin-bottom: 20rpx; | 
 |  |  |   padding-bottom: 10rpx; | 
 |  |  |   border-bottom: 1rpx solid #eeeeee; | 
 |  |  | } | 
 |  |  |     /* 模态框标题 */ | 
 |  |  |     .modal-title { | 
 |  |  |         font-size: 32rpx; | 
 |  |  |         font-weight: bold; | 
 |  |  |         color: #333333; | 
 |  |  |         text-align: center; | 
 |  |  |         margin-bottom: 20rpx; | 
 |  |  |         padding-bottom: 10rpx; | 
 |  |  |         border-bottom: 1rpx solid #eeeeee; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | /* 空状态提示 */ | 
 |  |  | .empty-tip { | 
 |  |  |   text-align: center; | 
 |  |  |   padding: 100rpx 0; | 
 |  |  |   color: #999999; | 
 |  |  |   font-size: 28rpx; | 
 |  |  | } | 
 |  |  |     /* 空状态提示 */ | 
 |  |  |     .empty-tip { | 
 |  |  |         text-align: center; | 
 |  |  |         padding: 100rpx 0; | 
 |  |  |         color: #999999; | 
 |  |  |         font-size: 28rpx; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | .status-indicator { | 
 |  |  |   padding: 8rpx 16rpx; | 
 |  |  |   font-size: 24rpx; | 
 |  |  |   text-align: center; | 
 |  |  |   color: #fff; | 
 |  |  |   background-color: #666; | 
 |  |  |     .status-indicator { | 
 |  |  |         padding: 8rpx 16rpx; | 
 |  |  |         font-size: 24rpx; | 
 |  |  |         text-align: center; | 
 |  |  |         color: #fff; | 
 |  |  |         background-color: #666; | 
 |  |  |  | 
 |  |  |   &.connected { | 
 |  |  |     background-color: #07c160; | 
 |  |  |   } | 
 |  |  |         &.connected { | 
 |  |  |             background-color: #07c160; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |   &.connecting { | 
 |  |  |     background-color: #ff976a; | 
 |  |  |   } | 
 |  |  |         &.connecting { | 
 |  |  |             background-color: #ff976a; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |   &.disconnected { | 
 |  |  |     background-color: #f53f3f; | 
 |  |  |   } | 
 |  |  |         &.disconnected { | 
 |  |  |             background-color: #f53f3f; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |   .print-status { | 
 |  |  |     margin-left: 10rpx; | 
 |  |  |     font-size: 22rpx; | 
 |  |  |   } | 
 |  |  | } | 
 |  |  |         .print-status { | 
 |  |  |             margin-left: 10rpx; | 
 |  |  |             font-size: 22rpx; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | </style> |