schangxiang@126.com
2024-12-08 df485888ecb9f69c0051fc192b87aec700cc4f89
增加pda功能
已添加247个文件
60313 ■■■■■ 文件已修改
LA24030_LuLiPackageLine_Pda/.gitignore 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/.hbuilderx/launch.json 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/.keep 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/App.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/README.md 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/borrow/borrow.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/check/check.js 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/container/index.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/deliver.js 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/expressmail.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/hander/hander.js 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/login.js 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/mark/index.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/old/index.js 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/print.js 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/putIn/artificial.js 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/putIn/callTray.js 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/putIn/empty.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/putIn/emptySearch.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/putIn/localBind.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/putIn/material.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/putIn/plane.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/putIn/three.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/putIn/untie.js 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/putaway/putaway.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/receive/receive.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/scrap.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/sort.js 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/takeMaterial/order.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/takeMaterial/orderpiece.js 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/unpack/plan.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/api/wareTool/index.js 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/colorui/animation.css 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/colorui/components/cu-custom.vue 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/colorui/icon.css 1226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/colorui/main.css 3917 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/BottomModal.vue 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/CuModal.vue 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/LeftModal.vue 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/Loding.vue 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/ModalCode.vue 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/MsiUpload.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/ScanCode.vue 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/SelectList.vue 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/blue.vue 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/buttonModal.vue 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/cascader.vue 538 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/cascader2.vue 551 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/noclick.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/print/bluetooth.js 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/print/bluetoothPrinter/bluetoothPrinter.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/print/commands.js 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/print/gbk.js 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/print/printerjobs.js 456 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/print/printerutil.js 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/print/util.js 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/print/weapp.qrcode.esm.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcode.js 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/Barcode.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/CODE128.js 167 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/CODE128A.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/CODE128B.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/CODE128C.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/CODE128_AUTO.js 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/auto.js 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/constants.js 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/index.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE39/index.js 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/EAN.js 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/EAN13.js 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/EAN2.js 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/EAN5.js 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/EAN8.js 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/UPC.js 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/UPCE.js 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/constants.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/encoder.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/index.js 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/GenericBarcode/index.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/ITF/ITF.js 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/ITF/ITF14.js 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/ITF/constants.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/ITF/index.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/MSI.js 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/MSI10.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/MSI1010.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/MSI11.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/MSI1110.js 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/checksums.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/index.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/codabar/index.js 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/index.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/pharmacode/index.js 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-barcode/tki-barcode.vue 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-qrcode/qrcode.js 1201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/components/tki-qrcode/tki-qrcode.vue 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/main.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/manifest.json 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/Blue.js 427 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/blueproduct.js 394 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/checkbox.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/checkboxYueKu.js 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/playSound.js 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/printBanma.js 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/printDoLabel.js 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/printLabelSingle.js 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/printPoLabel.js 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/printShengChanLabel.js 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mixins/sortBlue.js 463 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mock/callHistory.js 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/mock/theCleaning.js 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/nativeplugins/PrintSDK/android/libDevice_v1.7.8_2022-04-29.aar 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/nativeplugins/PrintSDK/android/libPrinter_v1.3.4_2023-06-26.aar 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/nativeplugins/PrintSDK/android/print-release.aar 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/nativeplugins/PrintSDK/package.json 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/package-lock.json 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/package.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages.json 558 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/artificial/artificial.vue 799 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/artificial/artificial.vue2 407 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/artificial/itemsMertial.vue 356 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/borrow/borrow.vue 443 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/callTray/callTray.vue 471 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/callTray/callTray2.vue 288 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/check/check/check.vue 423 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/check/check/index.vue 426 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/check/index.vue 382 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/check/index2.vue 377 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/check/out.vue 730 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/check/return.vue 196 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/check/square.vue 192 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/crossDock/crossDock.vue 938 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/deliver/deliver.vue 595 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/deliver/deliverDo.vue 568 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/expressmail/expressmail.vue 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/hander/handerIn.vue 452 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/hander/handerOut.vue 354 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/index/index copy.vue 691 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/index/index.vue 827 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/login/login.vue 523 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/mark/mark.vue 315 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/old/index.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/old/putIn.vue 245 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/old/putOut.vue 226 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/print/bluePrint.js 341 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/print/bluetoothConnection.vue 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/print/deliver.vue 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/print/gauge.vue 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/print/material.vue 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/print/materialInfo.vue 315 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/print/wms copy.vue 647 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/print/wms.vue 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/putIn/artificial/artificial.vue 450 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/putIn/empty/empty.vue 153 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/putIn/material/material.vue 377 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/putIn/plane/plane.vue 324 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/putIn/putIn.vue 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/putIn/three/three.vue 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/putIn/untie/untie.vue 392 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/putOut/putOut.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/putaway/putaway.vue 665 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/receive/receive.vue 468 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/recommend/recommend.vue 642 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/resume/pickResume.vue 925 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/resume/sortResume.vue 927 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/resume/yukuResume.vue 786 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/scrap/photo.vue 443 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/scrap/scrap.vue 711 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/sort/index.vue 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/sort/kittingSort.vue 641 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/sort/pickRecord.vue 300 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/sort/pickorder.vue 555 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/sort/propComp.vue 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/sort/return.vue 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/sort/search.vue 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/sort/sort.vue 775 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/sort/sort2.vue 611 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/sort/squareSort2.vue 797 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/takeMaterial/former/former.vue 514 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/takeMaterial/give/give.vue 515 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/takeMaterial/noOrder/noOrder.vue 469 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/takeMaterial/order/order.vue 444 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/takeMaterial/orderpiece/doYueku.vue 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/takeMaterial/orderpiece/orderpiece.vue 1260 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/takeMaterial/orderpiece/orderpiecePo.vue 1190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/takeMaterial/orderpiece/poYueku.vue 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/takeMaterial/return/return.vue 463 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/takeMaterial/takeMaterial.vue 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/unpack/plane/plane.vue 301 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/unpack/unpack.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/untie/checkAllMove.vue 562 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/untie/localBind.vue 322 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/untie/localUnBind.vue 368 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/untie/outbound.vue 263 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/untie/untie.vue 524 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/untie/untie2.vue 418 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/untie/untieForMove.vue 501 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/wareTool/borrow.vue 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/pages/wareTool/index.vue 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/1.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/artificial.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/borrow.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/callTray.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/cancel.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/free.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/material.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/ping.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/putIn.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/receive.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/sort.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/takeMaterial.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/tou.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/untie.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/index/ware.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/lanya.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/logo.jpg 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/modal/error.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/modal/iconCk.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/static/modal/success.png 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/store/index.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/store/modules/print.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/store/modules/system.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/store/modules/user.js 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/store/node_modules.rar 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/styles/iconfont/iconfont.css 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/styles/iconfont/iconfont.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/styles/iconfont/iconfont.json 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/styles/iconfont/svg.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/styles/index.css 784 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/styles/main.css 4135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/uni.scss 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/compress.js 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/dateTime.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/md5.js 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/mixin.js 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/print/Blue.js 554 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/print/bluetooth.js 267 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/print/bluetoothPrinter/bluetoothPrinter.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/print/commands.js 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/print/gbk.js 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/print/printerjobs.js 460 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/print/printerutil.js 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/print/util.js 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/print/weapp.qrcode.esm.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/request.js 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/tool.js 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/utils/utf8ByteToUnicodeStr.js 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
LA24030_LuLiPackageLine_Pda/.gitignore
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
node_modules/
uni_modules/
.project
unpackage/
.DS_Store
LA24030_LuLiPackageLine_Pda/.hbuilderx/launch.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
{ // launch.json é…ç½®äº†å¯åŠ¨è°ƒè¯•æ—¶ç›¸å…³è®¾ç½®ï¼Œconfigurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
    "version": "0.0",
    "configurations": [{
         "app-plus" :
         {
             "launchtype" : "local"
         },
         "default" :
         {
             "launchtype" : "local"
         },
         "h5" :
         {
             "launchtype" : "local"
         },
         "type" : "uniCloud"
     }
    ]
}
LA24030_LuLiPackageLine_Pda/.keep
LA24030_LuLiPackageLine_Pda/App.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,89 @@
<script>
    import Vue from 'vue'
    export default {
        onLaunch: function() {
            if (!uni.getStorageSync('switchs')) {
                uni.setStorageSync('switchs', JSON.stringify(true))
            }
            //获取头部高度
            uni.getSystemInfo({
                success: function(e) {
                    // console.log('手机牌子'+e.brand) //手机牌子
                    // console.log('手机型号'+e.model) //手机型号
                    Vue.prototype.PhoneModel = e.model
                    // #ifndef MP
                    Vue.prototype.StatusBar = e.statusBarHeight;
                    Vue.prototype.CustomBar = e.statusBarHeight + 45;
                    console.log(e.platform)
                    // if (e.platform == 'android') {
                    //     Vue.prototype.CustomBar = e.statusBarHeight + 50;
                    // } else {
                    //     Vue.prototype.CustomBar = e.statusBarHeight + 45;
                    // };
                    // #endif
                    // #ifdef MP-WEIXIN || MP-QQ
                    Vue.prototype.StatusBar = e.statusBarHeight;
                    let capsule = wx.getMenuButtonBoundingClientRect();
                    if (capsule) {
                        Vue.prototype.Custom = capsule;
                        // Vue.prototype.capsuleSafe = uni.upx2px(750) - capsule.left + uni.upx2px(750) - capsule.right;
                        Vue.prototype.CustomBar = capsule.bottom + capsule.top - e.statusBarHeight;
                    } else {
                        Vue.prototype.CustomBar = e.statusBarHeight + 50;
                    }
                    // #endif
                    // #ifdef MP-ALIPAY
                    Vue.prototype.StatusBar = e.statusBarHeight;
                    Vue.prototype.CustomBar = e.statusBarHeight + e.titleBarHeight;
                    // #endif
                }
            })
        },
        onShow: function() {
            console.log('App Show')
        },
        onError:function(error,msg){
            console.log(error.toString())
            if(error.toString().indexOf('SyntaxError') != -1 ){ //子页面token失效报错
                if(!uni.getStorageSync('userInfo')){
                    uni.showToast({
                            title: 'token失效,请重新登陆',
                            icon: 'none',
                            duration: 2000
                    });
                    // è·³è½¬åˆ°ç™»å½•
                    uni.redirectTo({
                        url: '/pages/login/login'
                    })
                }
            }
        },
        methods: {
        }
    }
</script>
<style lang="scss">
    /* è¦å†™åœ¨ç¬¬ä¸€è¡Œï¼ŒåŒæ—¶ç»™style标签加入lang="scss"属性 */
    @import "uview-ui/index.scss";
    /*每个页面公共css */
    @import "styles/iconfont/iconfont.css";
    @import "styles/main.css";
    @import "styles/index.css";
    page {
        width: 100%;
        min-height: 100vh;
        background-color: #F2F2F2;
        box-sizing: border-box;
    }
</style>
LA24030_LuLiPackageLine_Pda/README.md
LA24030_LuLiPackageLine_Pda/api/borrow/borrow.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
import {request} from '../../utils/request.js'
export function query(data){ //查询物料
    return request({
        url: `/delivery/order/detail/query?OrderNo=${data}`,
        method: 'get',
        contentType:'application/json',
        // data: data
     })
}
export function updateHead(data){ //确认提交
    return request({
        url: `/delivery/order/updateHead`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
LA24030_LuLiPackageLine_Pda/api/check/check.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,150 @@
import {request} from '../../utils/request.js'
import qs from 'qs'
export function query(){ //单据状态统计
    return request({
        url: `/check/order/status/query`,
        method: 'get',
        contentType:'application/json'
     })
}
export function Status(data){ //单据查询
    return request({
      url: `/api/wmsInventoryCheckOrder/page`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function OrderSearch(data){ // ç›˜ç‚¹ä¸‹å‘-根据容器编号分组查询
    return request({
        url: `/api/wmsInventoryCheckOrderDetails/pageForPda`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function material(data){ //单据容器查询
    return request({
        url: `/api/wmsInventoryCheckOrderDetails/Page`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function materialSNcode(data){
    return request({
        url: `/api/WmsInventoryCheckOrderDetails/PDAInventoryQueryAndInsert?${qs.stringify(data)}`,
        method: 'get',
        contentType:'application/json',
        data: data
     })
}
export function submit(data){ //确认出库
    return request({
        url: `/api/WmsInventoryCheckOrder/Out`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function checkTask(data){ //查询盘点任务
    return request({
        url: `/check/order/out/material/query?${qs.stringify(data)}`,
        method: 'get',
        contentType:'application/json',
        data: data
     })
}
export function issueSubmit(data){ //问题标记
    return request({
        url: `/check/order/problem/submit`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function finish(data){ //盘点完成
    return request({
        url: `/api/WmsInventoryCheckOrderDetails/OutFinish`,
        method: 'post',
        contentType:'application/json',
        data
     })
}
export function finishOrderSubmit(data){ //整个单据完成
    return request({
        url: `/api/WmsInventoryCheckOrder/FinishedOrder`,
        method: 'post',
        contentType:'application/json',
        data
     })
}
// pda单据完成验证:单据是否有未盘点的明细
export function finishOrderSubmitValid(data){
    return request({
        url: `/api/WmsInventoryCheckOrder/ValidDetail`,
        method: 'get',
        contentType:'application/json',
        data
     })
}
export function stocktakingWhours(data){ //容器回库
    return request({
        url: `/OrderReceipt/stocktakingWhours`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function getContainerData(data){ //获取平库需要盘点的容器
    return request({
        // url: `/check/order/out/containerCode/query?PageNo=${pageNo}&PageSize=10&WareContainerCode=${containerCode}`,
        url: `/check/order/out/containerCode/query?${qs.stringify(data)}`,
        method: 'get'
     })
}
export function getSquareMaterial(data){ //平库查指定盘点单下需要盘点的物料
    return request({
        url: `/check/order/out/material/query?${qs.stringify(data)}`,
        method: 'get'
     })
}
// æ‹¼ç›˜å‡ºåº“
export function getPinpanCkData(data){
    return request({
        url: `/WareContainer/groupOutboundPage?${qs.stringify(data)}`,
        method: 'get'
     })
}
//拼盘出库
export function PinpanCkConfirm(data){
    return request({
        url: `/task/callDesignatedTray?${qs.stringify(data)}`,
        method: 'post',
        data: data
     })
}
//拼盘出库 - æ‰¹é‡ä¸Šä¼ 
export function PinpanCkConfirmNew(data){
    return request({
        url: `/task/callDesignatedTrayForBatch`,
        method: 'post',
        data: data
     })
}
//盘点单号  - åˆ—表
export function getPandianOrder(data) {
    return request({
        url: `/check/plan/query`,
        method: 'get',
        data
    })
}
LA24030_LuLiPackageLine_Pda/api/container/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
import {request} from '../../utils/request.js'
//空容器入库
export function trayPutStorage(data) {
    return request({
        url: `/task/trayPutStorage`,
        method: 'post',
        data
    })
}
LA24030_LuLiPackageLine_Pda/api/deliver.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,143 @@
import {request} from '../utils/request.js'
import qs from 'qs'
//查询出库单下的发货物料信息
export function getOutMaterial(data) {
    return request({
        // url: `/delivery/detail/query?MaterialCode=${data.MaterialCode}&OrderNo=${data.OrderNo}`,
        url: `/delivery/detail/query?${qs.stringify(data)}`,
        method: 'get'
    })
}
export function getOrderMaterial(data) {
    return request({
        url: `/delivery/detail/query`,
        method: 'get',
        data
    })
}
// æŸ¥è¯¢å¯å‘货物料信息列表,Kitting单专用
export function getOrderKtting(data) {
    return request({
        url: `/delivery/detail/queryForKitting?${qs.stringify(data)}`,
        method: 'get',
        data
    })
}
export function getOrderMaterialDo(data) {
    return request({
        url: `/delivery/detail/query`,
        method: 'get',
        data
    })
}
export function getAllOrder(data) {
    return request({
        url: `/delivery/orderno/query`,
        method: 'get',
        data
    })
}
// åˆ†æ‹£
export function getAllOrderDo(data) {
    return request({
        url: `/api/wmsOrderMovement/page`,
        method: 'post',
        data
    })
}
// å‘è´§ 4.26
export function getAllOrderDelivery(data) {
    return request({
        url: `/delivery/orderno/queryDo`,
        method: 'get',
        data
    })
}
//添加发货记录
export function addDeliverRecord(data) {
    return request({
        url: '/delivery/record/add',
        method: 'post',
        data
    })
}
//删除图片
export function deletePicture(data) {
    return request({
        url: `/api/sysFile/delete?${qs.stringify(data)}`,
        method: 'post'
    })
}
//取货 å¢žåŠ å–è´§æ³¢æ¬¡å·çš„é€‰æ‹©
export function getQuhuoOrderDo(data) {
    return request({
        url: `/Sorting/getPickUpDoListByPO`,
        method: 'post',
        data
    })
}
//取货 å¢žåŠ å·¥åºã€äº§å“ç±»åž‹çš„é€‰æ‹©
export function getPickUpDoListByPOForProductType(data) {
    return request({
        url: `/Sorting/getPickUpDoListByPOForProductType`,
        method: 'post',
        data
    })
}
//分拣 å¢žåŠ å·¥åºã€äº§å“ç±»åž‹çš„é€‰æ‹©
export function getDoListByPOForProductType(data) {
    return request({
        url: `/Sorting/getDoListByPOForProductType`,
        method: 'post',
        data
    })
}
//取货撤销 å¢žåŠ å·¥åºã€äº§å“ç±»åž‹çš„é€‰æ‹©
export function getSortNoListForCancelPickForProductType(data) {
    return request({
        url: `/Sorting/getSortNoListForCancelPickForProductType`,
        method: 'post',
        data
    })
}
//取货撤销 å¢žåŠ å–è´§æ³¢æ¬¡å·çš„é€‰æ‹©
export function getSortNoListForCancelPick(data) {
    return request({
        url: `/Sorting/getSortNoListForCancelPick`,
        method: 'post',
        data
    })
}
//分拣撤销 å¢žåŠ å·¥åºã€äº§å“ç±»åž‹çš„é€‰æ‹©
export function getSortNoListForCancelSortForProductType(data) {
    return request({
        url: `/Sorting/getSortNoListForCancelSortForProductType`,
        method: 'post',
        data
    })
}
//分拣撤销 å¢žåŠ å–è´§æ³¢æ¬¡å·çš„é€‰æ‹©
export function getSortNoListForCancelSort(data) {
    return request({
        url: `/Sorting/getSortNoListForCancelSort`,
        method: 'post',
        data
    })
}
LA24030_LuLiPackageLine_Pda/api/expressmail.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
import {request} from '../utils/request.js'
//出库单和快递单绑定
export function addBindRecord(data) {
    return request({
        url: '/delivery/record/update',
        method: 'post',
        data
    })
}
LA24030_LuLiPackageLine_Pda/api/hander/hander.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
import {request} from '@/utils/request.js'
import qs from 'qs'
// æ‰‹å·¥ä»¶ å‡ºå…¥åº“接口
export function getWarehouseMaterialHander(data){ //查询物料
    return request({
        url: `/Sorting/FindContainerAtMaterial`,
        method: 'post',
        data
     })
}
//物料拆分
export function addWarehouseEstablishmentHander(data){
    return request({
        url: `/api/wmsMaterialSplit/materialSplit`,
        method: 'post',
        data
     })
}
//物料合并
export function addWarehouseHbHander(data){
    return request({
        url: `/api/wmsMaterialSplit/materialMerge`,
        method: 'post',
        data
     })
}
//打印
export function outBoundOrderHander(data) {
    return request({
        url: `/api/wmsRecordSncodePrint/add`,
        method: 'post',
        data
     })
}
//物料合并
export function getSGjRuKuMaterialHander(data){
    return request({
        url: `/api/wmsStockQuan/pageView`,
        method: 'post',
        data
     })
}
//容器信息
export function getWmsContainerPage(data){
    return request({
        url: `/api/wmsContainer/page`,
        method: 'post',
        data
     })
}
//点到点
export function handlePostToPost(data){
    return request({
        url: `/api/WmsOrderMovement/PointToPoint`,
        method: 'post',
        data
     })
}
//异常处理
export function unAbnormalOrder(data) {
    return request({
        url: `/api/WmsStockQuan/Frozen`,
        method: 'post',
        data
     })
}
// ã€çœ‹æ¿å¡å«æ–™ã€‘
export function addKbcardOrderMovement(data) {
    return request({
        url: `/api/wmsConfigKbcard/addKbcardOrderMovement`,
        method: 'post',
        data
     })
}
// ã€çœ‹æ¿å¡å«æ–™ã€‘
export function getWmsConfigKbcard(data){
    return request({
        url: `/api/wmsConfigKbcard/Page`,
        method: 'get',
        data
     })
}
LA24030_LuLiPackageLine_Pda/api/login.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
import {
    request
} from '../utils/request.js'
export function login(data) { //登陆
    return request({
        // url: `/login`,
        url: `/api/sysAuth/login`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
export function getLoginUser(data) { //权限
    return request({
        // url: `/getLoginUser`,
        url: `/api/sysAuth/userInfo`,
        method: 'get',
        contentType: 'application/json',
        data: data
    })
}
export function getWgt() { //PDA程序更新wgt
    return request({
        // url: "/pdaupdate/get",
        url: "/api/wmsGroupDisk/PDAUpdate",
        method: 'get',
        contentType: 'application/json'
    })
}
export function loginOut(data) { //登陆
    return request({
        url: `/api/sysAuth/logout`,
        method: 'post',
        contentType: 'application/json'
    })
}
export function getLoginMenu(data) { //权限
    return request({
        // url: `/getLoginUser`,
        url: `/api/WmsSysPdaMenu/getPdaLoginUser`,
        method: 'get',
        contentType: 'application/json',
        data: data
    })
}
LA24030_LuLiPackageLine_Pda/api/mark/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
import {request} from '../../utils/request.js'
//获取当前容器下的所有物料
export function getContainerMateral(containerCode){ //查询物料
    return request({
        url: `/Scrap/Material?containerCode=${containerCode}`,
        method: 'get',
     })
}
export function scrapMaterial(data){ //确认提交
    return request({
        url: `/ScrapMaterial/add`,
        method: 'post',
        data
     })
}
LA24030_LuLiPackageLine_Pda/api/old/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
import {request} from '@/utils/request.js'
//旧件入库
export function putInOfOld(data) {
    return request({
        url: `/WareOldMaterial/add`,
        method: 'post',
        data
    })
}
//旧件库存查询
export function getExitOfOld(data) {
    return request({
        url: `/WareOldMaterial/page?MaterialCode=${data.materialCode}&PageNo=1&PageSize=10`,
        method: 'get'
    })
}
//出库操作
//旧件入库
export function putOutOfOld(data) {
    return request({
        url: `/WareOldMaterial/update`,
        method: 'post',
        data
    })
}
//获取旧件库列表
export function getOldWarehouseList() {
    return request({
        url: '/WareStoreHouse/page?OrgId=&PartsCenter=&Factory=&StorTypeId=344334449700933&PageNo=1&PageSize=100',
        method: 'get'
    })
}
LA24030_LuLiPackageLine_Pda/api/print.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
import {request} from '@/utils/request.js'
import qs from 'qs'
export function getCollectionPage(data) {
    let param = {
        PurchaseNo:data.PurchaseNo,
        WarematerialCode:data.WarematerialCode
    }
    return request({
        url: `/ConfirmDelivery/page?${qs.stringify(param)}`,
        method: 'get'
    })
}
//物料标签---查询
export function getMaterialContent(data) {
    return request({
        url: `/PurchaseOrder/pageDetails?WareMaterialCode=${data.materialCode}&PurchaseNo=${data.purchase}`,
        method: 'get'
    })
}
export function getMaterialData() {
    return request({
        url: `/WareMaterial/page?PageNo=1&PageSize=1000000`,
        method: 'get'
    })
}
//获取物料信息
export function getMaterialInfo(data) {
    let param = {
        Code:data.materialCode,
        PageNo:1,
        PageSize:10
    }
    return request({
        // url: `/WareMaterial/page?Code=${data.materialCode}&PageNo=1&PageSize=10`,
        url: `/WareMaterial/page?${qs.stringify(param)}`,
        method: 'get'
    })
}
//获取工量具信息
export function getWareToolInfo(data) {
    return request({
        url: `/WareTool/page?Code=${data.materialCode}&PageNo=1&PageSize=10`,
        method: 'get'
    })
}
//添加打印记录
export function addPrintRecord(data) {
    return request({
        url: `/WareMaterialPrintHistory/add`,
        method: 'post',
        data
    })
}
//获取物料的标签信息
//获取工量具信息
export function getMaterialCount(data) {
    return request({
        url: `/WareQrcode/update?PageNo=${data.PageNo}&PageSize=${data.PageSize}`,
        method: 'get'
    })
}
//补打标签 æ ¹æ®åº“位编号
export function getMerterialBaseKuwei(data) {
    return request({
        url: `/inventory/container/queryall?${qs.stringify(data)}`,
        method: 'get'
    })
}
//调用斑马打印机
export function addBanmaRecord(data) {
    return request({
        url: `/WareMaterialPrintHistory/add`,
        method: 'post',
        data
    })
}
//调用斑马打印机 -- æ‰¹é‡æ‰“印
export function addBanmaRecordArr(data) {
    return request({
        url: `/WareMaterialPrintHistory/addBatch`,
        method: 'post',
        data
    })
}
LA24030_LuLiPackageLine_Pda/api/putIn/artificial.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,214 @@
import {request} from '../../utils/request.js'
import qs from 'qs'
//获取当前容器下的组盘详情
export function getContainerRecord(containerCode){ //牧野物料查询
    let data = {
        containerCode:containerCode
    }
    return request({
        // url: `/WarehousOrder/getMaterialList?ContainerCode=${containerCode}`,
        url: `/WarehousOrder/getMaterialList?${qs.stringify(containerCode)}`,
        method: 'get'
     })
}
export function getMaterialList(data){ //物料查询 å¸¦åº“å­˜
    return request({
        // url: `/WareMaterial/page?Code=${materialCode}&PageNo=1&PageSize=10`,
        url: `/WarehousOrder/getInventoryQuantity?${qs.stringify(data)}`,
        method: 'get',
     })
}
//获取容器信息
export function getContainDetail(code) {
     let data = {
        Code:code,
        PageNo:1,
        PageSize:10
    }
    return request({
        // url: `/WareContainer/page?Code=${code}&PageNo=1&PageSize: 10`,
        url: `/WareContainer/page?${qs.stringify(data)}`,
        method: 'get'
     })
}
export function getOrderNo(data){ //自动生成单号
    return request({
        url: `/CriterionEnterWare/getOrderNo`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function getContainerDetails(data){ //空托查询
    return request({
        url: `/CriterionEnterWare/getContainerDetails`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function getMaterialDetails(data){ //物料查询
    return request({
        url: `/CriterionEnterWare/getMaterialDetails?materialCode=${data.materialCode}`,
        method: 'post'
     })
}
export function WarematerialCode(data){ //牧野物料查询
    return request({
        url: `/CollectDelivery/page?WarematerialCode=${data.WarematerialCode}`,
        method: 'get',
        contentType:'application/json',
        data: data
     })
}
export function addGroupDisk(data){ //组盘
    return request({
        url: `/api/wmsGroupDisk/PdaBindUpdate`,
        method: 'post',
        data
     })
}
export function onlyUpdateDutyCycle(data){ //仅更新空间占比数据 ã€Editby shaocx,2023-05-23】
    return request({
        url: `/WarehousOrder/onlyUpdateDutyCycle`,
        method: 'post',
        data
     })
}
export function add(data){ //牧野人工组盘
    return request({
        url: `/OrderReceipt/add`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function getBhbMaterialList(data){ //容器查询
    return request({
        url: `/api/WmsGroupDisk/PdaContainerWithMaterial?${qs.stringify(data)}`,
        // url: `/api/wmsContainerMaterial/list?${qs.stringify(data)}`,
        method: 'get',
     })
}
export function PdaBindListForSNCode(data){ //物料查询
    return request({
        url: `/api/WmsGroupDisk/PdaBindListForSNCode?${qs.stringify(data)}`,
        method: 'get',
     })
}
// è°ƒæ•´åº“龄
export function addAdjustAge(data){
    return request({
        url: `/WareAge/addAdjustAge`,
        method: 'post',
        data
     })
}
// è°ƒæ•´åº“龄
export function getMaterialListForAdjustAge(data){ //物料查询
    return request({
        url: `/WareAge/GetMaterialListForAdjustAge?${qs.stringify(data)}`,
        method: 'get',
     })
}
export function getareaTypesList(data){ //载具类型
    var data1 = {
        isVirtually:false
    }
    return request({
        url: `/api/wmsArea/page`,
        method: 'post',
        data:data1
     })
}
// æŽ¨èåº“位
export function getRecommendList(data) {
    return request({
        // url: `/WareMaterial/getlocation?${qs.stringify(data)}`,
        //url: `/api/wmsPlace/page?${qs.stringify(data)}`,
        url: `/api/WmsPlace/RecommendPlaceList?${qs.stringify(data)}`,
        method: 'post'
    })
}
//容器上架 - æŸ¥è¯¢ç‰©æ–™
export function getWmsContainer(data){
    return request({
        url: `/api/wmsPutaway/getContainerInfoQuan`,
        method: 'post',
        data
     })
}
//组空盘
export function addGroupContainer(data){
    return request({
        url: `/api/wmsPutaway/putawayConfirm`,
        method: 'post',
        data
     })
}
//容器上架确认
export function putContainerConfirm(data){
    return request({
        url: `/api/WmsPutaway/PutawayConfirmxxxxxx`,
        method: 'post',
        data
     })
}
//容器类型
export function getContainerTypeList(data){
    return request({
        url: `/api/wmsContainerType/page`,
        method: 'post',
        data,
     })
}
//库位信息
export function getwmsPlace(data){
    return request({
        url: `/api/wmsPlace/page`,
        method: 'post',
        data
     })
}
//库位信息-容器下架
export function getwmsPlaceForContainerOff(data){
    return request({
        url: `/api/wmsUnshelve/getPlaceInfo`,
        method: 'post',
        data
     })
}
//查物料和库存
export function getwmsContainerType(data){
    return request({
        // url: `/api/WmsContainer/ContainerTypeForPda?${qs.stringify(data)}`,
        url: `/api/wmsUnshelve/getMaterialCodeByInfo?${qs.stringify(data)}`,
        method: 'get'
     })
}
//容器下架
export function addGroupContainerXiajia(data){
    return request({
        url: `/api/wmsUnshelve/containerUnshelveExecute`,
        method: 'post',
        data
     })
}
LA24030_LuLiPackageLine_Pda/api/putIn/callTray.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
import {request} from '../../utils/request.js'
import qs from 'qs'
export function getCallTray(data){ //呼叫空托
    return request({
        url: `/OrderReceipt/getCallTray`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
// export function getVehicleType(data){ //载具类型
//     return request({
//         url: `/OrderReceipt/getVehicleType`,
//         method: 'post',
//         contentType:'application/json',
//         data: data
//      })
// }
export function getContainerTypes(data){ //载具类型
    return request({
        url: `/CriterionEnterWare/getContainerTypes`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function getCollect(data){ //获取目标位置
    return request({
        url: `/OrderReceipt/getStorehouseMouth`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
//获取容器类型列表
export function getContainerTypesList(data){ //载具类型
    return request({
        url: `/WareContainerType/page?PageNo=1&PageSize=10000`,
        method: 'get',
     })
}
//呼叫空托
export function callEmptyContainer(data){
    return request({
        url: `/task/callTray`,
        method: 'post',
        data
     })
}
LA24030_LuLiPackageLine_Pda/api/putIn/empty.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
import {request} from '../../utils/request.js'
export function getWareVehicle(data){ //呼叫容器-查询物料
    return request({
        url: `/OrderReceipt/getWareVehicle?materialCode=${data}`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function getRecommend(data){ //推荐库位
    return request({
        url: `/OrderReceipt/getRecommend?materialCode=${data.materialCode}&quantity=${data.quantity}`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function callContainer(data){ //呼叫容器
    return request({
        url: `/OrderReceipt/callContainer`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
LA24030_LuLiPackageLine_Pda/api/putIn/emptySearch.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
import {request} from '../../utils/request.js'
export function getWareRegion(data){ //获取货区
    return request({
        url: `/OrderReceipt/getWareRegion`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function getGoodsshelves(data){ //获取货架+库位信息
    return request({
        url: `/OrderReceipt/getGoodsshelves`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
LA24030_LuLiPackageLine_Pda/api/putIn/localBind.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
import {request} from '../../utils/request.js'
//容器解绑查询
export function getContainerMaterial(data) {
    return request({
        url: `/api/wmsContainerPlace/containerStock?ContainerCode=${data.containerCode}`,
        method: 'get'
    })
}
//库位解绑查询
export function getplaceStock(data) {
    return request({
        url: `/api/wmsContainerPlace/placeStock?PlaceCode=${data.placeCode}`,
        method: 'get'
    })
}
//容器绑定查询
export function bindContainerStock(data) {
    return request({
        url: `/api/wmsContainerPlace/bindContainerStock?ContainerCode=${data.containerCode}`,
        method: 'get'
    })
}
//绑定
export function placeBind(data) {
    return request({
        url: `/api/wmsContainerPlace/placeBind`,
        method: 'post',
        data
     })
}
// è§£ç»‘
export function Unfreezeing(data) {
    return request({
        url: `/api/wmsContainerPlace/placeUnbind`,
        method: 'post',
        data
     })
}
LA24030_LuLiPackageLine_Pda/api/putIn/material.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
import {request} from '../../utils/request.js'
export function addEnterWare(data){ //确认入库
    return request({
        url: `/CriterionEnterWare/addEnterWare`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function addEnter(data){ //牧野确认入库
    return request({
        url: `/OrderReceipt/addEnterWare`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
LA24030_LuLiPackageLine_Pda/api/putIn/plane.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
import {request} from '../../utils/request.js'
export function getLocationDetails(data){ //查询库位
    return request({
        url: `/CriterionEnterWare/getLocationDetails?locationCode=${data}`,
        method: 'post',
        contentType:'application/json'
     })
}
//确认入库
export function entryConfirm(data){
    return request({
        url: `/CriterionEnterWare/updateFlatWarehouseWarehousing`,
        method: 'post',
        data
     })
}
//获取库位详情
export function getLocationDetail(code){ //查询库位
    return request({
        url: `/WareLocation/page?Code=${code}&PageNo=1&PageSize=10`,
        method: 'get'
     })
}
LA24030_LuLiPackageLine_Pda/api/putIn/three.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
import {request} from '../../utils/request.js'
export function getWarehouseMaterial(data){ //查询物料
    return request({
        url: `/CriterionEnterWare/getWarehouseMaterial?containerCode=${data}`,
        method: 'post',
        contentType:'application/json'
     })
}
export function addWarehouseEstablishment(data){ //入库
    return request({
        url: `/CriterionEnterWare/addWarehouseEstablishment`,
        method: 'post',
        data
     })
}
export function list(data){ //入库口
    return request({
        url: `/WareSite/pageWarehousing`,
        method: 'get',
        contentType:'application/json',
        data: data
     })
}
export function outlist(data){ //出库口
    return request({
        url: `/WareSite/page`,
        method: 'get',
        contentType:'application/json',
        data: data
     })
}
//确认出库
export function outBoundOrder(data) {
    return request({
        url: `/Sorting/UnbindLocation`,
        method: 'post',
        data
     })
}
LA24030_LuLiPackageLine_Pda/api/putIn/untie.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
import {request} from '../../utils/request.js'
export function getUnboundMaterial(data){ //查询物料
    return request({
        url: `/CriterionEnterWare/getUnboundMaterial`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function UpdateunboundContainer(data){ //容器解绑
    return request({
        url: `/CriterionEnterWare/UpdateunboundContainer`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function updateunbound(data){ //牧野容器解绑
    return request({
        url: `/OrderReceipt/UpdateunboundContainer`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function getContainerContent(data) {
    return request({
        url: `/WarehousOrder/getOrderDetails`,
        method: 'post',
        data
     })
}
export function deleteEnterOrder(data) {
    return request({
        url: `/WarehousOrder/delete`,
        method: 'post',
        data
     })
}
export function unBindLocation(data) {
    return request({
        url: `/Sorting/UnbindLocation?containerCode`,
        method: 'post',
        data
    })
}
//单据解绑
export function unbindOrder(data) {
    return request({
        url: `/api/wmsGroupDisk/PdaUnBindUpdate`,
        method: 'post',
        data
     })
}
//移库
export function inventoryTransfer(data) {
    return request({
        url: `/WarehousOrder/inventoryTransfer`,
        method: 'post',
        data
     })
}
//物料与容器解绑
export function getContainerMaterial(data) {
    return request({
        url: `/WarehousOrder/getMaterialList?ContainerCode=${data.containerCode}&materialCode=${data.materialCode}&IsUseForMove=${data.isUseForMove}`,
        method: 'get'
    })
}
export function getCheckAllMaterial(data) {
    return request({
        url: `/WarehousOrder/getMaterialList?ContainerCode=${data.containerCode}&materialCode=${data.materialCode}&IsUseForMove=${data.isUseForMove}&IsCheckAll=${data.IsCheckAll}`,
        method: 'get'
    })
}
//冻结
export function inventoryFrozen(data) {
    return request({
        url: `/api/WmsStockQuan/Frozen`,
        method: 'post',
        data
     })
}
// è§£å†»
export function inventoryUnFrozen(data) {
    return request({
        url: `/api/WmsStockQuan/Unfreezeing`,
        method: 'post',
        data
     })
}
LA24030_LuLiPackageLine_Pda/api/putaway/putaway.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
import {request} from '../../utils/request.js'
import qs from 'qs'
export function getPutawayStockQuan(data){ //获取当前容器下的组盘详情
    return request({
        url: `/api/WmsPutaway/GetPutawayStockQuan?${qs.stringify(data)}`,
        method: 'get',
     })
}
export function putawayConfirm(data){ //上架确认
    return request({
        url: `/api/WmsPutaway/PutawayConfirm`,
        method: 'post',
        data
     })
}
export function bindputawayConfirm(data){ //上架确认
    return request({
        url: `/api/WmsPutaway/BindPutawayConfirm`,
        method: 'post',
        data
     })
}
LA24030_LuLiPackageLine_Pda/api/receive/receive.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
import {
    request
} from '@/utils/request.js'
export function selectpeople(data) { //查询借用人
    return request({
        url: `/delivery/order/selectpeople?input=${data}`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
export function query(data) { //查询物料
    return request({
        url: `/delivery/order/detail/query?OrderNo=${data}`,
        method: 'get',
        contentType: 'application/json',
        // data: data
    })
}
export function borrowAdd(data) { //归还
    return request({
        url: `/BorrowOrder/borrowAdd`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
LA24030_LuLiPackageLine_Pda/api/scrap.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
import {
    request
} from '../utils/request.js'
export function scrapQuery(data) { //查询二维码
    return request({
        url: `/Scrap/scrapQuery`,
        method: 'get',
        contentType: 'application/json',
        data: data
    })
}
export function confirm(data) { //报废
    return request({
        url: `/Scrap/issueconfirm`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
export function queryDetail(data) { //查询报废单
    return request({
        url: `/Scrap/queryDetail?OrderNo=${data}`,
        method: 'get',
        contentType: 'application/json',
        data: data
    })
}
export function imagesUpdate(data) { //报废单拍照
    return request({
        url: `/Scrap/imagesUpdate`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
LA24030_LuLiPackageLine_Pda/api/sort.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,236 @@
import qs from 'qs'
import {
    request
} from '../utils/request.js'
export function getOutWarehouseDetails(data) { //查询物料
    return request({
        url: `/CriterionSorting/getOutWarehouseDetails?WareContainerCode=${data.WareContainerCode}&OrderNo=${data.OrderNo}`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
export function getOutWarehouse(data) { //牧野查询物料
    return request({
        // url: `/Sorting/getOutWarehouse?WareContainerCode=${data.WareContainerCode}`,
        url: `/Sorting/getOutWarehouse`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
export function getOutKittingGroup(data) { //分拣列表
    return request({
        url: `/Sorting/getOutWarehouseForGroupBySort`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
export function getOutWarehouseGroup(data) { //牧野查询物料 --分组
    return request({
        // url: `/Sorting/getOutWarehouse?WareContainerCode=${data.WareContainerCode}`,
        url: `/Sorting/getOutWarehouseForGroup`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
export function addWarehouseDetails(data) { //牧野确认分拣
    return request({
        url: `/Sorting/addWarehouseDetails`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
export function addWarehouseDetailsGroup(data) { //牧野确认分拣 --分组
    return request({
        // url: `/Sorting/addWarehouseDetailsForKitting`,
        url: `/Sorting/ConfirmSort`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
//回库
export function containerReturn(data) {
    return request({
        url: `/Sorting/ContainerReturn`,
        method: 'post',
        data
    })
}
//回库物料详情
export function getContainerDetail(data) {
    return request({
        url: `/task/getMaterial`,
        method: 'post',
        data
    })
}
//获取当前区域需要分拣的容器列表
/**
 * @param {Object} type A3区域 1 A1,A2区域2
 */
export function getContainerQuery(type) {
    return request({
        url: `/Sorting/getContainerList?Type=${type}`,
        method: 'post'
    })
}
// åˆ†æ‹£è®°å½•
export function getPickPrintQuery(data) {
    return request({
        url: `/Sorting/print/detail/query`,
        method: 'post',
        data
    })
}
// åˆ†æ‹£è®°å½• -斑马打印
export function getPickPrintQueryBanMa(data) {
    return request({
        url: `/Sorting/print/detail/queryForKitting`,
        method: 'post',
        data
    })
}
// å·¥åº-一级
export function selectOneQuery(data) {
    return request({
        url: `/Sorting/getProcessList`,
        method: 'post',
        data
    })
}
// æœºåºŠå· -2级
export function selectTwoQuery(data) {
    return request({
        url: `/Sorting/getEquipmentList`,
        method: 'post',
        data
    })
}
//生产订单 - å‘货页面  - æœºåºŠå· -2级 - å¯å‘货的机床号列表
export function selectTwoQueryDelivery(data) {
    return request({
        url: `/delivery/orderno/queryForKitting`,
        method: 'get',
        data
    })
}
// æœºåºŠå·ä¸‹çš„编号  -3级
export function selectThereQuery(data) {
    return request({
        url: `/Sorting/getContainerList`,
        method: 'post',
        data
    })
}
//下架单明细
export function getwmsOrderMovementDetails(data) {
    return request({
        url: `/api/wmsOrderMovementDetails/page`,
        method: 'post',
        data
    })
}
export function getOutWarehousePO(data) {
    return request({
        url: `/api/wmsSort/getSortList`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
export function addWarehouseDetailsPO(data) {
    return request({
        url: `/api/WmsSort/SortConfirm`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
//异常汇报
export function addSortExceptionFlagConfirm(data) {
    return request({
        url: `/api/WmsSort/SortExceptionFlagConfirm`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
export function addconfirmPick(data) {
    return request({
        url: `/Sorting/confirmPick`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
// å–è´§-撤销
export function getOutResumeGroup(data) {
    return request({
        url: `/WarePicking/page`,
        method: 'get',
        contentType: 'application/json',
        data: data
    })
}
// å–è´§-确认撤销
export function reSumeconfirmPick(data) {
    return request({
        url: `/Sorting/cancelConfirmPick`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
// åˆ†æ‹£-撤销
export function getOutResumeSortGroup(data) {
    return request({
        url: `/record/sorting/query`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
// åˆ†æ‹£-确认撤销
export function reSumeconfirmSort(data) {
    return request({
        url: `/Sorting/cancelconfirmSort`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
// è¶Šåº“-撤销
export function getOutYekuGroup(data) {
    return request({
        url: `/ConfirmDeliveryAndDeliver/page`,
        method: 'get',
        contentType: 'application/json',
        data: data
    })
}
// è¶Šåº“-确认撤销
export function reSumeconfirmYeku(data) {
    return request({
        url: `/ReceivingProcess/cancelYuekuForSHQY`,
        method: 'post',
        contentType: 'application/json',
        data: data
    })
}
LA24030_LuLiPackageLine_Pda/api/takeMaterial/order.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
import {request} from '../../utils/request.js'
export function addConfirmReceipt(data){ //确认收货
    return request({
        url: `/CriterionReceiving/addConfirmReceipt`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
LA24030_LuLiPackageLine_Pda/api/takeMaterial/orderpiece.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
import {request} from '../../utils/request.js'
export function getMaterial(data){ //查询PO单
    return request({
        url: `/PurchaseOrder/pageDetails`,
        method: 'get',
        data
     })
}
//根据采购单号和物料编码获取采购明细
export function getPurchaseOrderDetail(data){ //查询PO单
    return request({
        url: `/api/wmsOrderPurchase/QueryDetailsPda`,
        method: 'get',
        data
     })
}
//取货单列表
export function getQhdOrderDetail(data){ //查询PO单
    return request({
        url: `/sorting/order/detail/list`,
        method: 'get',
        data
     })
}
export function addDelivery(data){ //确认收货
    return request({
        url: `/api/receivingProcess/add`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function getCollect(data){ //本次收货
    return request({
        url: `/ReceivingProcess/getCollect`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function getShortageMaterial(data){ //缺料
    return request({
        url: `/ReceivingProcess/getShortageMaterial`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
// 2.29
//根据采购单号和物料编码获取采购明细
export function getPurchaseOrderDetail2(data){ //查询PO单
    return request({
        url: `/ReceivingProcess/QueryDetails`,
        method: 'get',
        data
     })
}
export function addDeliveryNew(data){ //确认收货
    return request({
        url: `/ReceivingProcess/AddPODeliveryForGoods`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function createBatchNo(data){ //自动生成收货批次号 ã€Editby shaocx,2022-12-30】
    return request({
        url: `/PurchaseOrder/createBatchNo`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
export function query(data){ //单据状态统计
    return request({
        // url: `/check/order/status/query`, //
        url: `/ReceivingProcess/AddPODeliveryForGoodsCheck`,
        method: 'post',
        contentType:'application/json',
        data
     })
}
//SAP-下拉
export function getSapSelect(data) {
    return request({
        url: `/ReceivingProcess/getsaplocation`,
        method: 'get',
        data
    })
}
//越库 - ä¸»é¡µåˆ—表
export function getMoveWarehouseGroup(data) {
    return request({
        url: `/PurchaseOrder/queryAllowYKDetails`,
        method: 'get',
        data
     })
}
//越库  - ç¡®è®¤
export function addconfirmMove(data) {
    return request({
        url: `/ReceivingProcess/yuekuForSHQY`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
//越库 -子页列表
export function getMoveOrderDetail(data){
    return request({
        url: `/sorting/order/detail/list`,
        method: 'get',
        data
     })
}
// æ”¶è´§æ ¡éªŒ
export function addShouhuoJiaoYan(data){
    return request({
        url: `/ReceivingProcess/ValidateBeforeAddPODeliveryForGoods`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
LA24030_LuLiPackageLine_Pda/api/unpack/plan.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
import {request} from '../../utils/request.js'
export function query(data){ //查询物料
    return request({
        url: `/delivery/order/query?OrderNo=${data.OrderNo}`,
        method: 'get',
        contentType:'application/json',
        // data: data
     })
}
export function issue(data){ //确认下发
    return request({
        url: `/task/issue`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
LA24030_LuLiPackageLine_Pda/api/wareTool/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
import {request} from '../../utils/request.js'
export function WareToolReturn(data){ //查询工量具
    return request({
        url: `/WareToolReturn/page?Code=${data}`,
        method: 'get',
        contentType:'application/json',
        // data: data
     })
}
export function returnTool(data){ //原件归还
    return request({
        url: `/WareToolReturn/returnTool`,
        method: 'post',
        contentType:'application/json',
        data: data
     })
}
//获取工量具人员(借用,归还)
export function getWarePersonList(){ //查询工量具
    return request({
        url: "/WareToolUsers/page?PageNo=1&PageSize=1000000",
        method: 'get',
        contentType:'application/json',
     })
}
//获取工量具当前库存
export function getWareCount(data) {
    return request({
        url: `/WareToolStock/page?Code=${data.code}&Unit=&PageNo=1&PageSize=10`,
        method: 'get'
     })
}
//工量具借用
export function wareBorrow(data) {
    return request({
        url: `/WareToolStock/borrow`,
        method: 'post',
        data
     })
}
//获取当前借用人下的未归还工量具列表
export function getUnReturnList(data) {
    return request({
        url: `/WareToolReturn/page?BorrowUserName=${data.name}&PageNo=1&PageSize=100000`,
        method: 'get'
     })
}
//工量具归还
export function wareReturn(data) {
    return request({
        url: `/WareToolReturnDetails/add`,
        method: 'post',
        data
     })
}
LA24030_LuLiPackageLine_Pda/colorui/animation.css
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,184 @@
/*
  Animation å¾®åŠ¨ç”»
  åŸºäºŽColorUI组建库的动画模块 by æ–‡æ™“港 2019å¹´3月26日19:52:28
 */
/* css æ»¤é•œ æŽ§åˆ¶é»‘白底色gif的 */
.gif-black{
  mix-blend-mode: screen;
}
.gif-white{
  mix-blend-mode: multiply;
}
/* Animation css */
[class*=animation-] {
    animation-duration: .5s;
    animation-timing-function: ease-out;
    animation-fill-mode: both
}
.animation-fade {
    animation-name: fade;
    animation-duration: .8s;
    animation-timing-function: linear
}
.animation-scale-up {
    animation-name: scale-up
}
.animation-scale-down {
    animation-name: scale-down
}
.animation-slide-top {
    animation-name: slide-top
}
.animation-slide-bottom {
    animation-name: slide-bottom
}
.animation-slide-left {
    animation-name: slide-left
}
.animation-slide-right {
    animation-name: slide-right
}
.animation-shake {
    animation-name: shake
}
.animation-reverse {
    animation-direction: reverse
}
@keyframes fade {
    0% {
        opacity: 0
    }
    100% {
        opacity: 1
    }
}
@keyframes scale-up {
    0% {
        opacity: 0;
        transform: scale(.2)
    }
    100% {
        opacity: 1;
        transform: scale(1)
    }
}
@keyframes scale-down {
    0% {
        opacity: 0;
        transform: scale(1.8)
    }
    100% {
        opacity: 1;
        transform: scale(1)
    }
}
@keyframes slide-top {
    0% {
        opacity: 0;
        transform: translateY(-100%)
    }
    100% {
        opacity: 1;
        transform: translateY(0)
    }
}
@keyframes slide-bottom {
    0% {
        opacity: 0;
        transform: translateY(100%)
    }
    100% {
        opacity: 1;
        transform: translateY(0)
    }
}
@keyframes shake {
    0%,
    100% {
        transform: translateX(0)
    }
    10% {
        transform: translateX(-9px)
    }
    20% {
        transform: translateX(8px)
    }
    30% {
        transform: translateX(-7px)
    }
    40% {
        transform: translateX(6px)
    }
    50% {
        transform: translateX(-5px)
    }
    60% {
        transform: translateX(4px)
    }
    70% {
        transform: translateX(-3px)
    }
    80% {
        transform: translateX(2px)
    }
    90% {
        transform: translateX(-1px)
    }
}
@keyframes slide-left {
    0% {
        opacity: 0;
        transform: translateX(-100%)
    }
    100% {
        opacity: 1;
        transform: translateX(0)
    }
}
@keyframes slide-right {
    0% {
        opacity: 0;
        transform: translateX(100%)
    }
    100% {
        opacity: 1;
        transform: translateX(0)
    }
}
LA24030_LuLiPackageLine_Pda/colorui/components/cu-custom.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,147 @@
<template>
    <view>
        <view class="cu-custom flex align-center zindex" :style="[{height:CustomBar + 'px'}]">
            <view class="cu-bar fixed" :style="style" :class="[bgImage!=''?'none-bg text-white bg-img':'',bgColor]">
                <view class="action" @tap="BackPage" v-if="isBack">
                    <text class="iconfont icon-fanhui"></text>
                    <slot name="backText"></slot>
                </view>
                <view class="action" @tap="$emit('account')" v-if="isHead">
                    <text class="iconfont icon-touxiang"></text>
                </view>
                <view class="content" :style="[{top:StatusBar + 'px'}]">
                    <slot name="content"></slot>
                </view>
                <slot name="right">
                    <!-- <image class="ingLany" src="/static/lanya.png" mode="aspectFit"  @click="getLanya"></image> -->
                </slot>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                StatusBar: this.StatusBar,
                CustomBar: this.CustomBar
            };
        },
        name: 'cu-custom',
        computed: {
            style() {
                var StatusBar = this.StatusBar;
                var CustomBar = this.CustomBar;
                var bgImage = this.bgImage;
                var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
                if (this.bgImage) {
                    style = `${style}background-image:url(${bgImage});`;
                }
                return style
            }
        },
        props: {
            bgColor: {
                type: String,
                default: ''
            },
            isBack: {
                type: [Boolean, String],
                default: false
            },
            isHead: {
                type: [Boolean, String],
                default: false
            },
            bgImage: {
                type: String,
                default: ''
            },
        },
        mounted() {
        },
        methods: {
            BackPage() {
                // if (getCurrentPages().length < 2 && 'undefined' !== typeof __wxConfig) {
                //     let url = '/' + __wxConfig.pages[0]
                //     return uni.redirectTo({
                //         url
                //     })
                // }
                let pages = getCurrentPages();//获取打开的所有页面
                console.log("打开的所有页面")
                console.log(pages)
                let route = pages[pages.length - 1].route; //当前页面
                console.log("当前页面" + route)
                if(route == 'pages/sort/pickorder' || route == 'pages/sort/kittingSort'){
                    uni.showModal({
                        title: '提示',
                        content: '是否确认返回?',
                        showCancel: true,
                        cancelColor: '#333333',
                        success: (res => {
                            if (res.confirm) {
                                uni.redirectTo({
                                    url: '/pages/index/index'
                                })
                            } else if (res.cancel) {
                                return
                            }
                        })
                    });
                    return
                }
                if (route == 'pages/takeMaterial/orderpiece/orderpiecePo' || route == 'pages/recommend/recommend' || route == 'pages/check/check/index' || route == 'pages/check/square' || route == 'pages/hander/handerIn' || route == 'pages/hander/handerOut' || route == 'pages/sort/pickorder'|| route == 'pages/sort/kittingSort' || route == 'pages/artificial/artificial' || route == 'pages/deliver/deliver' || route == 'pages/deliver/deliverDo') {
                    uni.redirectTo({
                        url: '/pages/index/index'
                    })
                    return
                }
                if(route == 'pages/takeMaterial/orderpiece/poYueku'){
                    uni.redirectTo({
                        url: '/pages/takeMaterial/orderpiece/orderpiecePo'
                    })
                    return
                }
                uni.navigateBack({
                    delta: 1
                });
            },
            getLanya() {
                uni.showModal({
                    title: '提示',
                    content: '是否重新连接蓝牙?',
                    showCancel: true,
                    cancelColor: '#333333',
                    success: (res => {
                        if (res.confirm) {
                            uni.navigateTo({
                                url: '../print/bluetoothConnection'
                            })
                        } else if (res.cancel) {}
                    })
                });
            },
        }
    }
</script>
<style>
    .zindex {
        /* z-index: 10; */
    }
    .ingLany{
        width: 28px;
        height: 28px;
        border-radius: 100%;
        margin-right: 1%;
    }
</style>
LA24030_LuLiPackageLine_Pda/colorui/icon.css
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1226 @@
@keyframes cuIcon-spin {
    0% {
        -webkit-transform: rotate(0);
        transform: rotate(0);
    }
    100% {
        -webkit-transform: rotate(359deg);
        transform: rotate(359deg);
    }
}
.cuIconfont-spin {
    -webkit-animation: cuIcon-spin 2s infinite linear;
    animation: cuIcon-spin 2s infinite linear;
    display: inline-block;
}
.cuIconfont-pulse {
    -webkit-animation: cuIcon-spin 1s infinite steps(8);
    animation: cuIcon-spin 1s infinite steps(8);
    display: inline-block;
}
[class*="cuIcon-"] {
    font-family: "cuIcon";
    font-size: inherit;
    font-style: normal;
}
@font-face {
    font-family: "cuIcon";
    src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831');
    /* IE9*/
    src: url('//at.alicdn.com/t/font_533566_yfq2d9wdij.eot?t=1545239985831#iefix') format('embedded-opentype'),
        /* IE6-IE8 */
        url('data:application/x-font-woff;charset=utf-8;base64,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') format('woff'),
        url('//at.alicdn.com/t/font_533566_yfq2d9wdij.ttf?t=1545239985831') format('truetype'),
        /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
        url('//at.alicdn.com/t/font_533566_yfq2d9wdij.svg?t=1545239985831#cuIconfont') format('svg');
    /* iOS 4.1- */
}
.cuIcon-appreciate:before {
    content: "\e644";
}
.cuIcon-check:before {
    content: "\e645";
}
.cuIcon-close:before {
    content: "\e646";
}
.cuIcon-edit:before {
    content: "\e649";
}
.cuIcon-emoji:before {
    content: "\e64a";
}
.cuIcon-favorfill:before {
    content: "\e64b";
}
.cuIcon-favor:before {
    content: "\e64c";
}
.cuIcon-loading:before {
    content: "\e64f";
}
.cuIcon-locationfill:before {
    content: "\e650";
}
.cuIcon-location:before {
    content: "\e651";
}
.cuIcon-phone:before {
    content: "\e652";
}
.cuIcon-roundcheckfill:before {
    content: "\e656";
}
.cuIcon-roundcheck:before {
    content: "\e657";
}
.cuIcon-roundclosefill:before {
    content: "\e658";
}
.cuIcon-roundclose:before {
    content: "\e659";
}
.cuIcon-roundrightfill:before {
    content: "\e65a";
}
.cuIcon-roundright:before {
    content: "\e65b";
}
.cuIcon-search:before {
    content: "\e65c";
}
.cuIcon-taxi:before {
    content: "\e65d";
}
.cuIcon-timefill:before {
    content: "\e65e";
}
.cuIcon-time:before {
    content: "\e65f";
}
.cuIcon-unfold:before {
    content: "\e661";
}
.cuIcon-warnfill:before {
    content: "\e662";
}
.cuIcon-warn:before {
    content: "\e663";
}
.cuIcon-camerafill:before {
    content: "\e664";
}
.cuIcon-camera:before {
    content: "\e665";
}
.cuIcon-commentfill:before {
    content: "\e666";
}
.cuIcon-comment:before {
    content: "\e667";
}
.cuIcon-likefill:before {
    content: "\e668";
}
.cuIcon-like:before {
    content: "\e669";
}
.cuIcon-notificationfill:before {
    content: "\e66a";
}
.cuIcon-notification:before {
    content: "\e66b";
}
.cuIcon-order:before {
    content: "\e66c";
}
.cuIcon-samefill:before {
    content: "\e66d";
}
.cuIcon-same:before {
    content: "\e66e";
}
.cuIcon-deliver:before {
    content: "\e671";
}
.cuIcon-evaluate:before {
    content: "\e672";
}
.cuIcon-pay:before {
    content: "\e673";
}
.cuIcon-send:before {
    content: "\e675";
}
.cuIcon-shop:before {
    content: "\e676";
}
.cuIcon-ticket:before {
    content: "\e677";
}
.cuIcon-back:before {
    content: "\e679";
}
.cuIcon-cascades:before {
    content: "\e67c";
}
.cuIcon-discover:before {
    content: "\e67e";
}
.cuIcon-list:before {
    content: "\e682";
}
.cuIcon-more:before {
    content: "\e684";
}
.cuIcon-scan:before {
    content: "\e689";
}
.cuIcon-settings:before {
    content: "\e68a";
}
.cuIcon-questionfill:before {
    content: "\e690";
}
.cuIcon-question:before {
    content: "\e691";
}
.cuIcon-shopfill:before {
    content: "\e697";
}
.cuIcon-form:before {
    content: "\e699";
}
.cuIcon-pic:before {
    content: "\e69b";
}
.cuIcon-filter:before {
    content: "\e69c";
}
.cuIcon-footprint:before {
    content: "\e69d";
}
.cuIcon-top:before {
    content: "\e69e";
}
.cuIcon-pulldown:before {
    content: "\e69f";
}
.cuIcon-pullup:before {
    content: "\e6a0";
}
.cuIcon-right:before {
    content: "\e6a3";
}
.cuIcon-refresh:before {
    content: "\e6a4";
}
.cuIcon-moreandroid:before {
    content: "\e6a5";
}
.cuIcon-deletefill:before {
    content: "\e6a6";
}
.cuIcon-refund:before {
    content: "\e6ac";
}
.cuIcon-cart:before {
    content: "\e6af";
}
.cuIcon-qrcode:before {
    content: "\e6b0";
}
.cuIcon-remind:before {
    content: "\e6b2";
}
.cuIcon-delete:before {
    content: "\e6b4";
}
.cuIcon-profile:before {
    content: "\e6b7";
}
.cuIcon-home:before {
    content: "\e6b8";
}
.cuIcon-cartfill:before {
    content: "\e6b9";
}
.cuIcon-discoverfill:before {
    content: "\e6ba";
}
.cuIcon-homefill:before {
    content: "\e6bb";
}
.cuIcon-message:before {
    content: "\e6bc";
}
.cuIcon-addressbook:before {
    content: "\e6bd";
}
.cuIcon-link:before {
    content: "\e6bf";
}
.cuIcon-lock:before {
    content: "\e6c0";
}
.cuIcon-unlock:before {
    content: "\e6c2";
}
.cuIcon-vip:before {
    content: "\e6c3";
}
.cuIcon-weibo:before {
    content: "\e6c4";
}
.cuIcon-activity:before {
    content: "\e6c5";
}
.cuIcon-friendaddfill:before {
    content: "\e6c9";
}
.cuIcon-friendadd:before {
    content: "\e6ca";
}
.cuIcon-friendfamous:before {
    content: "\e6cb";
}
.cuIcon-friend:before {
    content: "\e6cc";
}
.cuIcon-goods:before {
    content: "\e6cd";
}
.cuIcon-selection:before {
    content: "\e6ce";
}
.cuIcon-explore:before {
    content: "\e6d2";
}
.cuIcon-present:before {
    content: "\e6d3";
}
.cuIcon-squarecheckfill:before {
    content: "\e6d4";
}
.cuIcon-square:before {
    content: "\e6d5";
}
.cuIcon-squarecheck:before {
    content: "\e6d6";
}
.cuIcon-round:before {
    content: "\e6d7";
}
.cuIcon-roundaddfill:before {
    content: "\e6d8";
}
.cuIcon-roundadd:before {
    content: "\e6d9";
}
.cuIcon-add:before {
    content: "\e6da";
}
.cuIcon-notificationforbidfill:before {
    content: "\e6db";
}
.cuIcon-explorefill:before {
    content: "\e6dd";
}
.cuIcon-fold:before {
    content: "\e6de";
}
.cuIcon-game:before {
    content: "\e6df";
}
.cuIcon-redpacket:before {
    content: "\e6e0";
}
.cuIcon-selectionfill:before {
    content: "\e6e1";
}
.cuIcon-similar:before {
    content: "\e6e2";
}
.cuIcon-appreciatefill:before {
    content: "\e6e3";
}
.cuIcon-infofill:before {
    content: "\e6e4";
}
.cuIcon-info:before {
    content: "\e6e5";
}
.cuIcon-forwardfill:before {
    content: "\e6ea";
}
.cuIcon-forward:before {
    content: "\e6eb";
}
.cuIcon-rechargefill:before {
    content: "\e6ec";
}
.cuIcon-recharge:before {
    content: "\e6ed";
}
.cuIcon-vipcard:before {
    content: "\e6ee";
}
.cuIcon-voice:before {
    content: "\e6ef";
}
.cuIcon-voicefill:before {
    content: "\e6f0";
}
.cuIcon-friendfavor:before {
    content: "\e6f1";
}
.cuIcon-wifi:before {
    content: "\e6f2";
}
.cuIcon-share:before {
    content: "\e6f3";
}
.cuIcon-wefill:before {
    content: "\e6f4";
}
.cuIcon-we:before {
    content: "\e6f5";
}
.cuIcon-lightauto:before {
    content: "\e6f6";
}
.cuIcon-lightforbid:before {
    content: "\e6f7";
}
.cuIcon-lightfill:before {
    content: "\e6f8";
}
.cuIcon-camerarotate:before {
    content: "\e6f9";
}
.cuIcon-light:before {
    content: "\e6fa";
}
.cuIcon-barcode:before {
    content: "\e6fb";
}
.cuIcon-flashlightclose:before {
    content: "\e6fc";
}
.cuIcon-flashlightopen:before {
    content: "\e6fd";
}
.cuIcon-searchlist:before {
    content: "\e6fe";
}
.cuIcon-service:before {
    content: "\e6ff";
}
.cuIcon-sort:before {
    content: "\e700";
}
.cuIcon-down:before {
    content: "\e703";
}
.cuIcon-mobile:before {
    content: "\e704";
}
.cuIcon-mobilefill:before {
    content: "\e705";
}
.cuIcon-copy:before {
    content: "\e706";
}
.cuIcon-countdownfill:before {
    content: "\e707";
}
.cuIcon-countdown:before {
    content: "\e708";
}
.cuIcon-noticefill:before {
    content: "\e709";
}
.cuIcon-notice:before {
    content: "\e70a";
}
.cuIcon-upstagefill:before {
    content: "\e70e";
}
.cuIcon-upstage:before {
    content: "\e70f";
}
.cuIcon-babyfill:before {
    content: "\e710";
}
.cuIcon-baby:before {
    content: "\e711";
}
.cuIcon-brandfill:before {
    content: "\e712";
}
.cuIcon-brand:before {
    content: "\e713";
}
.cuIcon-choicenessfill:before {
    content: "\e714";
}
.cuIcon-choiceness:before {
    content: "\e715";
}
.cuIcon-clothesfill:before {
    content: "\e716";
}
.cuIcon-clothes:before {
    content: "\e717";
}
.cuIcon-creativefill:before {
    content: "\e718";
}
.cuIcon-creative:before {
    content: "\e719";
}
.cuIcon-female:before {
    content: "\e71a";
}
.cuIcon-keyboard:before {
    content: "\e71b";
}
.cuIcon-male:before {
    content: "\e71c";
}
.cuIcon-newfill:before {
    content: "\e71d";
}
.cuIcon-new:before {
    content: "\e71e";
}
.cuIcon-pullleft:before {
    content: "\e71f";
}
.cuIcon-pullright:before {
    content: "\e720";
}
.cuIcon-rankfill:before {
    content: "\e721";
}
.cuIcon-rank:before {
    content: "\e722";
}
.cuIcon-bad:before {
    content: "\e723";
}
.cuIcon-cameraadd:before {
    content: "\e724";
}
.cuIcon-focus:before {
    content: "\e725";
}
.cuIcon-friendfill:before {
    content: "\e726";
}
.cuIcon-cameraaddfill:before {
    content: "\e727";
}
.cuIcon-apps:before {
    content: "\e729";
}
.cuIcon-paintfill:before {
    content: "\e72a";
}
.cuIcon-paint:before {
    content: "\e72b";
}
.cuIcon-picfill:before {
    content: "\e72c";
}
.cuIcon-refresharrow:before {
    content: "\e72d";
}
.cuIcon-colorlens:before {
    content: "\e6e6";
}
.cuIcon-markfill:before {
    content: "\e730";
}
.cuIcon-mark:before {
    content: "\e731";
}
.cuIcon-presentfill:before {
    content: "\e732";
}
.cuIcon-repeal:before {
    content: "\e733";
}
.cuIcon-album:before {
    content: "\e734";
}
.cuIcon-peoplefill:before {
    content: "\e735";
}
.cuIcon-people:before {
    content: "\e736";
}
.cuIcon-servicefill:before {
    content: "\e737";
}
.cuIcon-repair:before {
    content: "\e738";
}
.cuIcon-file:before {
    content: "\e739";
}
.cuIcon-repairfill:before {
    content: "\e73a";
}
.cuIcon-taoxiaopu:before {
    content: "\e73b";
}
.cuIcon-weixin:before {
    content: "\e612";
}
.cuIcon-attentionfill:before {
    content: "\e73c";
}
.cuIcon-attention:before {
    content: "\e73d";
}
.cuIcon-commandfill:before {
    content: "\e73e";
}
.cuIcon-command:before {
    content: "\e73f";
}
.cuIcon-communityfill:before {
    content: "\e740";
}
.cuIcon-community:before {
    content: "\e741";
}
.cuIcon-read:before {
    content: "\e742";
}
.cuIcon-calendar:before {
    content: "\e74a";
}
.cuIcon-cut:before {
    content: "\e74b";
}
.cuIcon-magic:before {
    content: "\e74c";
}
.cuIcon-backwardfill:before {
    content: "\e74d";
}
.cuIcon-playfill:before {
    content: "\e74f";
}
.cuIcon-stop:before {
    content: "\e750";
}
.cuIcon-tagfill:before {
    content: "\e751";
}
.cuIcon-tag:before {
    content: "\e752";
}
.cuIcon-group:before {
    content: "\e753";
}
.cuIcon-all:before {
    content: "\e755";
}
.cuIcon-backdelete:before {
    content: "\e756";
}
.cuIcon-hotfill:before {
    content: "\e757";
}
.cuIcon-hot:before {
    content: "\e758";
}
.cuIcon-post:before {
    content: "\e759";
}
.cuIcon-radiobox:before {
    content: "\e75b";
}
.cuIcon-rounddown:before {
    content: "\e75c";
}
.cuIcon-upload:before {
    content: "\e75d";
}
.cuIcon-writefill:before {
    content: "\e760";
}
.cuIcon-write:before {
    content: "\e761";
}
.cuIcon-radioboxfill:before {
    content: "\e763";
}
.cuIcon-punch:before {
    content: "\e764";
}
.cuIcon-shake:before {
    content: "\e765";
}
.cuIcon-move:before {
    content: "\e768";
}
.cuIcon-safe:before {
    content: "\e769";
}
.cuIcon-activityfill:before {
    content: "\e775";
}
.cuIcon-crownfill:before {
    content: "\e776";
}
.cuIcon-crown:before {
    content: "\e777";
}
.cuIcon-goodsfill:before {
    content: "\e778";
}
.cuIcon-messagefill:before {
    content: "\e779";
}
.cuIcon-profilefill:before {
    content: "\e77a";
}
.cuIcon-sound:before {
    content: "\e77b";
}
.cuIcon-sponsorfill:before {
    content: "\e77c";
}
.cuIcon-sponsor:before {
    content: "\e77d";
}
.cuIcon-upblock:before {
    content: "\e77e";
}
.cuIcon-weblock:before {
    content: "\e77f";
}
.cuIcon-weunblock:before {
    content: "\e780";
}
.cuIcon-my:before {
    content: "\e78b";
}
.cuIcon-myfill:before {
    content: "\e78c";
}
.cuIcon-emojifill:before {
    content: "\e78d";
}
.cuIcon-emojiflashfill:before {
    content: "\e78e";
}
.cuIcon-flashbuyfill:before {
    content: "\e78f";
}
.cuIcon-text:before {
    content: "\e791";
}
.cuIcon-goodsfavor:before {
    content: "\e794";
}
.cuIcon-musicfill:before {
    content: "\e795";
}
.cuIcon-musicforbidfill:before {
    content: "\e796";
}
.cuIcon-card:before {
    content: "\e624";
}
.cuIcon-triangledownfill:before {
    content: "\e79b";
}
.cuIcon-triangleupfill:before {
    content: "\e79c";
}
.cuIcon-roundleftfill-copy:before {
    content: "\e79e";
}
.cuIcon-font:before {
    content: "\e76a";
}
.cuIcon-title:before {
    content: "\e82f";
}
.cuIcon-recordfill:before {
    content: "\e7a4";
}
.cuIcon-record:before {
    content: "\e7a6";
}
.cuIcon-cardboardfill:before {
    content: "\e7a9";
}
.cuIcon-cardboard:before {
    content: "\e7aa";
}
.cuIcon-formfill:before {
    content: "\e7ab";
}
.cuIcon-coin:before {
    content: "\e7ac";
}
.cuIcon-cardboardforbid:before {
    content: "\e7af";
}
.cuIcon-circlefill:before {
    content: "\e7b0";
}
.cuIcon-circle:before {
    content: "\e7b1";
}
.cuIcon-attentionforbid:before {
    content: "\e7b2";
}
.cuIcon-attentionforbidfill:before {
    content: "\e7b3";
}
.cuIcon-attentionfavorfill:before {
    content: "\e7b4";
}
.cuIcon-attentionfavor:before {
    content: "\e7b5";
}
.cuIcon-titles:before {
    content: "\e701";
}
.cuIcon-icloading:before {
    content: "\e67a";
}
.cuIcon-full:before {
    content: "\e7bc";
}
.cuIcon-mail:before {
    content: "\e7bd";
}
.cuIcon-peoplelist:before {
    content: "\e7be";
}
.cuIcon-goodsnewfill:before {
    content: "\e7bf";
}
.cuIcon-goodsnew:before {
    content: "\e7c0";
}
.cuIcon-medalfill:before {
    content: "\e7c1";
}
.cuIcon-medal:before {
    content: "\e7c2";
}
.cuIcon-newsfill:before {
    content: "\e7c3";
}
.cuIcon-newshotfill:before {
    content: "\e7c4";
}
.cuIcon-newshot:before {
    content: "\e7c5";
}
.cuIcon-news:before {
    content: "\e7c6";
}
.cuIcon-videofill:before {
    content: "\e7c7";
}
.cuIcon-video:before {
    content: "\e7c8";
}
.cuIcon-exit:before {
    content: "\e7cb";
}
.cuIcon-skinfill:before {
    content: "\e7cc";
}
.cuIcon-skin:before {
    content: "\e7cd";
}
.cuIcon-moneybagfill:before {
    content: "\e7ce";
}
.cuIcon-usefullfill:before {
    content: "\e7cf";
}
.cuIcon-usefull:before {
    content: "\e7d0";
}
.cuIcon-moneybag:before {
    content: "\e7d1";
}
.cuIcon-redpacket_fill:before {
    content: "\e7d3";
}
.cuIcon-subscription:before {
    content: "\e7d4";
}
.cuIcon-loading1:before {
    content: "\e633";
}
.cuIcon-github:before {
    content: "\e692";
}
.cuIcon-global:before {
    content: "\e7eb";
}
.cuIcon-settingsfill:before {
    content: "\e6ab";
}
.cuIcon-back_android:before {
    content: "\e7ed";
}
.cuIcon-expressman:before {
    content: "\e7ef";
}
.cuIcon-evaluate_fill:before {
    content: "\e7f0";
}
.cuIcon-group_fill:before {
    content: "\e7f5";
}
.cuIcon-play_forward_fill:before {
    content: "\e7f6";
}
.cuIcon-deliver_fill:before {
    content: "\e7f7";
}
.cuIcon-notice_forbid_fill:before {
    content: "\e7f8";
}
.cuIcon-fork:before {
    content: "\e60c";
}
.cuIcon-pick:before {
    content: "\e7fa";
}
.cuIcon-wenzi:before {
    content: "\e6a7";
}
.cuIcon-ellipse:before {
    content: "\e600";
}
.cuIcon-qr_code:before {
    content: "\e61b";
}
.cuIcon-dianhua:before {
    content: "\e64d";
}
.cuIcon-cuIcon:before {
    content: "\e602";
}
.cuIcon-loading2:before {
    content: "\e7f1";
}
.cuIcon-btn:before {
    content: "\e601";
}
LA24030_LuLiPackageLine_Pda/colorui/main.css
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,3917 @@
/*
  ColorUi for uniApp  v2.1.6 | by æ–‡æ™“港 2019-05-31 10:44:24
  ä»…供学习交流,如作它用所承受的法律责任一概与作者无关
  *使用ColorUi开发扩展与插件时,请注明基于ColorUi开发
  ï¼ˆQQ交流群:240787041)
*/
/* ==================
        åˆå§‹åŒ–
 ==================== */
body {
    background-color: #f1f1f1;
    font-size: 14px;
    color: #333333;
    font-family: Helvetica Neue, Helvetica, sans-serif;
}
view,
scroll-view,
swiper,
button,
input,
textarea,
label,
navigator,
image {
    box-sizing: border-box;
}
.round {
    border-radius: 5000upx;
}
.radius {
    border-radius: 6upx;
}
/* ==================
          å›¾ç‰‡
 ==================== */
image {
    max-width: 100%;
    display: inline-block;
    position: relative;
    z-index: 0;
}
image.loading::before {
    content: "";
    background-color: #f5f5f5;
    display: block;
    position: absolute;
    width: 100%;
    height: 100%;
    z-index: -2;
}
image.loading::after {
    content: "\e7f1";
    font-family: "cuIcon";
    position: absolute;
    top: 0;
    left: 0;
    width: 32upx;
    height: 32upx;
    line-height: 32upx;
    right: 0;
    bottom: 0;
    z-index: -1;
    font-size: 32upx;
    margin: auto;
    color: #ccc;
    -webkit-animation: cuIcon-spin 2s infinite linear;
    animation: cuIcon-spin 2s infinite linear;
    display: block;
}
.response {
    width: 100%;
}
/* ==================
         å¼€å…³
 ==================== */
switch,
checkbox,
radio {
    position: relative;
}
switch::after,
switch::before {
    font-family: "cuIcon";
    content: "\e645";
    position: absolute;
    color: #ffffff !important;
    top: 0%;
    left: 0upx;
    font-size: 26upx;
    line-height: 26px;
    width: 50%;
    text-align: center;
    pointer-events: none;
    transform: scale(0, 0);
    transition: all 0.3s ease-in-out 0s;
    z-index: 9;
    bottom: 0;
    height: 26px;
    margin: auto;
}
switch::before {
    content: "\e646";
    right: 0;
    transform: scale(1, 1);
    left: auto;
}
switch[checked]::after,
switch.checked::after {
    transform: scale(1, 1);
}
switch[checked]::before,
switch.checked::before {
    transform: scale(0, 0);
}
/* #ifndef MP-ALIPAY */
radio::before,
checkbox::before {
    font-family: "cuIcon";
    content: "\e645";
    position: absolute;
    color: #ffffff !important;
    top: 50%;
    margin-top: -8px;
    right: 5px;
    font-size: 32upx;
    line-height: 16px;
    pointer-events: none;
    transform: scale(1, 1);
    transition: all 0.3s ease-in-out 0s;
    z-index: 9;
}
radio .wx-radio-input,
checkbox .wx-checkbox-input,
radio .uni-radio-input,
checkbox .uni-checkbox-input {
    margin: 0;
    width: 24px;
    height: 24px;
}
checkbox.round .wx-checkbox-input,
checkbox.round .uni-checkbox-input {
    border-radius: 100upx;
}
/* #endif */
switch[checked]::before {
    transform: scale(0, 0);
}
switch .wx-switch-input,
switch .uni-switch-input {
    border: none;
    padding: 0 24px;
    width: 48px;
    height: 26px;
    margin: 0;
    border-radius: 100upx;
}
switch .wx-switch-input:not([class*="bg-"]),
switch .uni-switch-input:not([class*="bg-"]) {
    background: #8799a3 !important;
}
switch .wx-switch-input::after,
switch .uni-switch-input::after {
    margin: auto;
    width: 26px;
    height: 26px;
    border-radius: 100upx;
    left: 0upx;
    top: 0upx;
    bottom: 0upx;
    position: absolute;
    transform: scale(0.9, 0.9);
    transition: all 0.1s ease-in-out 0s;
}
switch .wx-switch-input.wx-switch-input-checked::after,
switch .uni-switch-input.uni-switch-input-checked::after {
    margin: auto;
    left: 22px;
    box-shadow: none;
    transform: scale(0.9, 0.9);
}
radio-group {
    display: inline-block;
}
switch.radius .wx-switch-input::after,
switch.radius .wx-switch-input,
switch.radius .wx-switch-input::before,
switch.radius .uni-switch-input::after,
switch.radius .uni-switch-input,
switch.radius .uni-switch-input::before {
    border-radius: 10upx;
}
/* switch .wx-switch-input::before,
radio.radio::before,
checkbox .wx-checkbox-input::before,
radio .wx-radio-input::before,
switch .uni-switch-input::before,
radio.radio::before,
checkbox .uni-checkbox-input::before,
radio .uni-radio-input::before {
    display: none;
} */
radio.radio[checked]::after,
radio.radio .uni-radio-input-checked::after {
    content: "";
    background-color: transparent;
    display: block;
    position: absolute;
    width: 8px;
    height: 8px;
    z-index: 999;
    top: 0upx;
    left: 0upx;
    right: 0;
    bottom: 0;
    margin: auto;
    border-radius: 200upx;
    /* #ifndef MP */
    border: 7px solid #ffffff !important;
    /* #endif */
    /* #ifdef MP */
    border: 8px solid #ffffff !important;
    /* #endif */
}
.switch-sex::after {
    content: "\e71c";
}
.switch-sex::before {
    content: "\e71a";
}
.switch-sex .wx-switch-input,
.switch-sex .uni-switch-input {
    background: #e54d42 !important;
    border-color: #e54d42 !important;
}
.switch-sex[checked] .wx-switch-input,
.switch-sex.checked .uni-switch-input {
    background: #0081ff !important;
    border-color: #0081ff !important;
}
switch.red[checked] .wx-switch-input.wx-switch-input-checked,
checkbox.red[checked] .wx-checkbox-input,
radio.red[checked] .wx-radio-input,
switch.red.checked .uni-switch-input.uni-switch-input-checked,
checkbox.red.checked .uni-checkbox-input,
radio.red.checked .uni-radio-input {
    background-color: #e54d42 !important;
    border-color: #e54d42 !important;
    color: #ffffff !important;
}
switch.orange[checked] .wx-switch-input,
checkbox.orange[checked] .wx-checkbox-input,
radio.orange[checked] .wx-radio-input,
switch.orange.checked .uni-switch-input,
checkbox.orange.checked .uni-checkbox-input,
radio.orange.checked .uni-radio-input {
    background-color: #f37b1d !important;
    border-color: #f37b1d !important;
    color: #ffffff !important;
}
switch.yellow[checked] .wx-switch-input,
checkbox.yellow[checked] .wx-checkbox-input,
radio.yellow[checked] .wx-radio-input,
switch.yellow.checked .uni-switch-input,
checkbox.yellow.checked .uni-checkbox-input,
radio.yellow.checked .uni-radio-input {
    background-color: #fbbd08 !important;
    border-color: #fbbd08 !important;
    color: #333333 !important;
}
switch.olive[checked] .wx-switch-input,
checkbox.olive[checked] .wx-checkbox-input,
radio.olive[checked] .wx-radio-input,
switch.olive.checked .uni-switch-input,
checkbox.olive.checked .uni-checkbox-input,
radio.olive.checked .uni-radio-input {
    background-color: #8dc63f !important;
    border-color: #8dc63f !important;
    color: #ffffff !important;
}
switch.green[checked] .wx-switch-input,
switch[checked] .wx-switch-input,
checkbox.green[checked] .wx-checkbox-input,
checkbox[checked] .wx-checkbox-input,
radio.green[checked] .wx-radio-input,
radio[checked] .wx-radio-input,
switch.green.checked .uni-switch-input,
switch.checked .uni-switch-input,
checkbox.green.checked .uni-checkbox-input,
checkbox.checked .uni-checkbox-input,
radio.green.checked .uni-radio-input,
radio.checked .uni-radio-input {
    background-color: #39b54a !important;
    border-color: #39b54a !important;
    color: #ffffff !important;
    border-color: #39B54A !important;
}
switch.cyan[checked] .wx-switch-input,
checkbox.cyan[checked] .wx-checkbox-input,
radio.cyan[checked] .wx-radio-input,
switch.cyan.checked .uni-switch-input,
checkbox.cyan.checked .uni-checkbox-input,
radio.cyan.checked .uni-radio-input {
    background-color: #1cbbb4 !important;
    border-color: #1cbbb4 !important;
    color: #ffffff !important;
}
switch.blue[checked] .wx-switch-input,
checkbox.blue[checked] .wx-checkbox-input,
radio.blue[checked] .wx-radio-input,
switch.blue.checked .uni-switch-input,
checkbox.blue.checked .uni-checkbox-input,
radio.blue.checked .uni-radio-input {
    background-color: #0081ff !important;
    border-color: #0081ff !important;
    color: #ffffff !important;
}
switch.purple[checked] .wx-switch-input,
checkbox.purple[checked] .wx-checkbox-input,
radio.purple[checked] .wx-radio-input,
switch.purple.checked .uni-switch-input,
checkbox.purple.checked .uni-checkbox-input,
radio.purple.checked .uni-radio-input {
    background-color: #6739b6 !important;
    border-color: #6739b6 !important;
    color: #ffffff !important;
}
switch.mauve[checked] .wx-switch-input,
checkbox.mauve[checked] .wx-checkbox-input,
radio.mauve[checked] .wx-radio-input,
switch.mauve.checked .uni-switch-input,
checkbox.mauve.checked .uni-checkbox-input,
radio.mauve.checked .uni-radio-input {
    background-color: #9c26b0 !important;
    border-color: #9c26b0 !important;
    color: #ffffff !important;
}
switch.pink[checked] .wx-switch-input,
checkbox.pink[checked] .wx-checkbox-input,
radio.pink[checked] .wx-radio-input,
switch.pink.checked .uni-switch-input,
checkbox.pink.checked .uni-checkbox-input,
radio.pink.checked .uni-radio-input {
    background-color: #e03997 !important;
    border-color: #e03997 !important;
    color: #ffffff !important;
}
switch.brown[checked] .wx-switch-input,
checkbox.brown[checked] .wx-checkbox-input,
radio.brown[checked] .wx-radio-input,
switch.brown.checked .uni-switch-input,
checkbox.brown.checked .uni-checkbox-input,
radio.brown.checked .uni-radio-input {
    background-color: #a5673f !important;
    border-color: #a5673f !important;
    color: #ffffff !important;
}
switch.grey[checked] .wx-switch-input,
checkbox.grey[checked] .wx-checkbox-input,
radio.grey[checked] .wx-radio-input,
switch.grey.checked .uni-switch-input,
checkbox.grey.checked .uni-checkbox-input,
radio.grey.checked .uni-radio-input {
    background-color: #8799a3 !important;
    border-color: #8799a3 !important;
    color: #ffffff !important;
}
switch.gray[checked] .wx-switch-input,
checkbox.gray[checked] .wx-checkbox-input,
radio.gray[checked] .wx-radio-input,
switch.gray.checked .uni-switch-input,
checkbox.gray.checked .uni-checkbox-input,
radio.gray.checked .uni-radio-input {
    background-color: #f0f0f0 !important;
    border-color: #f0f0f0 !important;
    color: #333333 !important;
}
switch.black[checked] .wx-switch-input,
checkbox.black[checked] .wx-checkbox-input,
radio.black[checked] .wx-radio-input,
switch.black.checked .uni-switch-input,
checkbox.black.checked .uni-checkbox-input,
radio.black.checked .uni-radio-input {
    background-color: #333333 !important;
    border-color: #333333 !important;
    color: #ffffff !important;
}
switch.white[checked] .wx-switch-input,
checkbox.white[checked] .wx-checkbox-input,
radio.white[checked] .wx-radio-input,
switch.white.checked .uni-switch-input,
checkbox.white.checked .uni-checkbox-input,
radio.white.checked .uni-radio-input {
    background-color: #ffffff !important;
    border-color: #ffffff !important;
    color: #333333 !important;
}
/* ==================
          è¾¹æ¡†
 ==================== */
/* -- å®žçº¿ -- */
.solid,
.solid-top,
.solid-right,
.solid-bottom,
.solid-left,
.solids,
.solids-top,
.solids-right,
.solids-bottom,
.solids-left,
.dashed,
.dashed-top,
.dashed-right,
.dashed-bottom,
.dashed-left {
    position: relative;
}
.solid::after,
.solid-top::after,
.solid-right::after,
.solid-bottom::after,
.solid-left::after,
.solids::after,
.solids-top::after,
.solids-right::after,
.solids-bottom::after,
.solids-left::after,
.dashed::after,
.dashed-top::after,
.dashed-right::after,
.dashed-bottom::after,
.dashed-left::after {
    content: " ";
    width: 200%;
    height: 200%;
    position: absolute;
    top: 0;
    left: 0;
    border-radius: inherit;
    transform: scale(0.5);
    transform-origin: 0 0;
    pointer-events: none;
    box-sizing: border-box;
}
.solid::after {
    border: 1upx solid rgba(0, 0, 0, 0.1);
}
.solid-top::after {
    border-top: 1upx solid rgba(0, 0, 0, 0.1);
}
.solid-right::after {
    border-right: 1upx solid rgba(0, 0, 0, 0.1);
}
.solid-bottom::after {
    border-bottom: 1upx solid rgba(0, 0, 0, 0.1);
}
.solid-left::after {
    border-left: 1upx solid rgba(0, 0, 0, 0.1);
}
.solids::after {
    border: 8upx solid #eee;
}
.solids-top::after {
    border-top: 8upx solid #eee;
}
.solids-right::after {
    border-right: 8upx solid #eee;
}
.solids-bottom::after {
    border-bottom: 8upx solid #eee;
}
.solids-left::after {
    border-left: 8upx solid #eee;
}
/* -- è™šçº¿ -- */
.dashed::after {
    border: 1upx dashed #ddd;
}
.dashed-top::after {
    border-top: 1upx dashed #ddd;
}
.dashed-right::after {
    border-right: 1upx dashed #ddd;
}
.dashed-bottom::after {
    border-bottom: 1upx dashed #ddd;
}
.dashed-left::after {
    border-left: 1upx dashed #ddd;
}
/* -- é˜´å½± -- */
.shadow[class*='white'] {
    --ShadowSize: 0 1upx 6upx;
}
.shadow-lg {
    --ShadowSize: 0upx 40upx 100upx 0upx;
}
.shadow-warp {
    position: relative;
    box-shadow: 0 0 10upx rgba(0, 0, 0, 0.1);
}
.shadow-warp:before,
.shadow-warp:after {
    position: absolute;
    content: "";
    top: 20upx;
    bottom: 30upx;
    left: 20upx;
    width: 50%;
    box-shadow: 0 30upx 20upx rgba(0, 0, 0, 0.2);
    transform: rotate(-3deg);
    z-index: -1;
}
.shadow-warp:after {
    right: 20upx;
    left: auto;
    transform: rotate(3deg);
}
.shadow-blur {
    position: relative;
}
.shadow-blur::before {
    content: "";
    display: block;
    background: inherit;
    filter: blur(10upx);
    position: absolute;
    width: 100%;
    height: 100%;
    top: 10upx;
    left: 10upx;
    z-index: -1;
    opacity: 0.4;
    transform-origin: 0 0;
    border-radius: inherit;
    transform: scale(1, 1);
}
/* ==================
          æŒ‰é’®
 ==================== */
.cu-btn {
    position: relative;
    border: 0upx;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    padding: 0 30upx;
    font-size: 28upx;
    height: 64upx;
    line-height: 1;
    text-align: center;
    text-decoration: none;
    overflow: visible;
    margin-left: initial;
    transform: translate(0upx, 0upx);
    margin-right: initial;
}
.cu-btn::after {
    display: none;
}
.cu-btn:not([class*="bg-"]) {
    background-color: #f0f0f0;
}
.cu-btn[class*="line"] {
    background-color: transparent;
}
.cu-btn[class*="line"]::after {
    content: " ";
    display: block;
    width: 200%;
    height: 200%;
    position: absolute;
    top: 0;
    left: 0;
    border: 1upx solid currentColor;
    transform: scale(0.5);
    transform-origin: 0 0;
    box-sizing: border-box;
    border-radius: 12upx;
    z-index: 1;
    pointer-events: none;
}
.cu-btn.round[class*="line"]::after {
    border-radius: 1000upx;
}
.cu-btn[class*="lines"]::after {
    border: 6upx solid currentColor;
}
.cu-btn[class*="bg-"]::after {
    display: none;
}
.cu-btn.sm {
    padding: 0 20upx;
    font-size: 20upx;
    height: 48upx;
}
.cu-btn.lg {
    padding: 0 40upx;
    font-size: 32upx;
    height: 80upx;
}
.cu-btn.cuIcon.sm {
    width: 48upx;
    height: 48upx;
}
.cu-btn.cuIcon {
    width: 64upx;
    height: 64upx;
    border-radius: 500upx;
    padding: 0;
}
button.cuIcon.lg {
    width: 80upx;
    height: 80upx;
}
.cu-btn.shadow-blur::before {
    top: 4upx;
    left: 4upx;
    filter: blur(6upx);
    opacity: 0.6;
}
.cu-btn.button-hover {
    transform: translate(1upx, 1upx);
}
.block {
    display: block;
}
.cu-btn.block {
    display: flex;
}
.cu-btn[disabled] {
    opacity: 0.6;
    color: #ffffff;
}
/* ==================
          å¾½ç« 
 ==================== */
.cu-tag {
    font-size: 24upx;
    vertical-align: middle;
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    padding: 0upx 16upx;
    height: 48upx;
    font-family: Helvetica Neue, Helvetica, sans-serif;
    white-space: nowrap;
}
.cu-tag:not([class*="bg"]):not([class*="line"]) {
    background-color: #f1f1f1;
}
.cu-tag[class*="line-"]::after {
    content: " ";
    width: 200%;
    height: 200%;
    position: absolute;
    top: 0;
    left: 0;
    border: 1upx solid currentColor;
    transform: scale(0.5);
    transform-origin: 0 0;
    box-sizing: border-box;
    border-radius: inherit;
    z-index: 1;
    pointer-events: none;
}
.cu-tag.radius[class*="line"]::after {
    border-radius: 12upx;
}
.cu-tag.round[class*="line"]::after {
    border-radius: 1000upx;
}
.cu-tag[class*="line-"]::after {
    border-radius: 0;
}
.cu-tag+.cu-tag {
    margin-left: 10upx;
}
.cu-tag.sm {
    font-size: 20upx;
    padding: 0upx 12upx;
    height: 32upx;
}
.cu-capsule {
    display: inline-flex;
    vertical-align: middle;
}
.cu-capsule+.cu-capsule {
    margin-left: 10upx;
}
.cu-capsule .cu-tag {
    margin: 0;
}
.cu-capsule .cu-tag[class*="line-"]:last-child::after {
    border-left: 0upx solid transparent;
}
.cu-capsule .cu-tag[class*="line-"]:first-child::after {
    border-right: 0upx solid transparent;
}
.cu-capsule.radius .cu-tag:first-child {
    border-top-left-radius: 6upx;
    border-bottom-left-radius: 6upx;
}
.cu-capsule.radius .cu-tag:last-child::after,
.cu-capsule.radius .cu-tag[class*="line-"] {
    border-top-right-radius: 12upx;
    border-bottom-right-radius: 12upx;
}
.cu-capsule.round .cu-tag:first-child {
    border-top-left-radius: 200upx;
    border-bottom-left-radius: 200upx;
    text-indent: 4upx;
}
.cu-capsule.round .cu-tag:last-child::after,
.cu-capsule.round .cu-tag:last-child {
    border-top-right-radius: 200upx;
    border-bottom-right-radius: 200upx;
    text-indent: -4upx;
}
.cu-tag.badge {
    border-radius: 200upx;
    position: absolute;
    top: -10upx;
    right: -10upx;
    font-size: 20upx;
    padding: 0upx 10upx;
    height: 28upx;
    color: #ffffff;
}
.cu-tag.badge:not([class*="bg-"]) {
    background-color: #dd514c;
}
.cu-tag:empty:not([class*="cuIcon-"]) {
    padding: 0upx;
    width: 16upx;
    height: 16upx;
    top: -4upx;
    right: -4upx;
}
.cu-tag[class*="cuIcon-"] {
    width: 32upx;
    height: 32upx;
    top: -4upx;
    right: -4upx;
}
/* ==================
          å¤´åƒ
 ==================== */
.cu-avatar {
    font-variant: small-caps;
    margin: 0;
    padding: 0;
    display: inline-flex;
    text-align: center;
    justify-content: center;
    align-items: center;
    background-color: #ccc;
    color: #ffffff;
    white-space: nowrap;
    position: relative;
    width: 64upx;
    height: 64upx;
    background-size: cover;
    background-position: center;
    vertical-align: middle;
    font-size: 1.5em;
}
.cu-avatar.sm {
    width: 48upx;
    height: 48upx;
    font-size: 1em;
}
.cu-avatar.lg {
    width: 96upx;
    height: 96upx;
    font-size: 2em;
}
.cu-avatar.xl {
    width: 128upx;
    height: 128upx;
    font-size: 2.5em;
}
.cu-avatar .avatar-text {
    font-size: 0.4em;
}
.cu-avatar-group {
    direction: rtl;
    unicode-bidi: bidi-override;
    padding: 0 10upx 0 40upx;
    display: inline-block;
}
.cu-avatar-group .cu-avatar {
    margin-left: -30upx;
    border: 4upx solid #f1f1f1;
    vertical-align: middle;
}
.cu-avatar-group .cu-avatar.sm {
    margin-left: -20upx;
    border: 1upx solid #f1f1f1;
}
/* ==================
         è¿›åº¦æ¡
 ==================== */
.cu-progress {
    overflow: hidden;
    height: 28upx;
    background-color: #ebeef5;
    display: inline-flex;
    align-items: center;
    width: 100%;
}
.cu-progress+view,
.cu-progress+text {
    line-height: 1;
}
.cu-progress.xs {
    height: 10upx;
}
.cu-progress.sm {
    height: 20upx;
}
.cu-progress view {
    width: 0;
    height: 100%;
    align-items: center;
    display: flex;
    justify-items: flex-end;
    justify-content: space-around;
    font-size: 20upx;
    color: #ffffff;
    transition: width 0.6s ease;
}
.cu-progress text {
    align-items: center;
    display: flex;
    font-size: 20upx;
    color: #333333;
    text-indent: 10upx;
}
.cu-progress.text-progress {
    padding-right: 60upx;
}
.cu-progress.striped view {
    background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
    background-size: 72upx 72upx;
}
.cu-progress.active view {
    animation: progress-stripes 2s linear infinite;
}
@keyframes progress-stripes {
    from {
        background-position: 72upx 0;
    }
    to {
        background-position: 0 0;
    }
}
/* ==================
          åŠ è½½
 ==================== */
.cu-load {
    display: block;
    line-height: 3em;
    text-align: center;
}
.cu-load::before {
    font-family: "cuIcon";
    display: inline-block;
    margin-right: 6upx;
}
.cu-load.loading::before {
    content: "\e67a";
    animation: cuIcon-spin 2s infinite linear;
}
.cu-load.loading::after {
    content: "加载中...";
}
.cu-load.over::before {
    content: "\e64a";
}
.cu-load.over::after {
    content: "没有更多了";
}
.cu-load.erro::before {
    content: "\e658";
}
.cu-load.erro::after {
    content: "加载失败";
}
.cu-load.load-cuIcon::before {
    font-size: 32upx;
}
.cu-load.load-cuIcon::after {
    display: none;
}
.cu-load.load-cuIcon.over {
    display: none;
}
.cu-load.load-modal {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 140upx;
    left: 0;
    margin: auto;
    width: 260upx;
    height: 260upx;
    background-color: #ffffff;
    border-radius: 10upx;
    box-shadow: 0 0 0upx 2000upx rgba(0, 0, 0, 0.5);
    display: flex;
    align-items: center;
    flex-direction: column;
    justify-content: center;
    font-size: 28upx;
    z-index: 9999;
    line-height: 2.4em;
}
.cu-load.load-modal [class*="cuIcon-"] {
    font-size: 60upx;
}
.cu-load.load-modal image {
    width: 70upx;
    height: 70upx;
}
.cu-load.load-modal::after {
    content: "";
    position: absolute;
    background-color: #ffffff;
    border-radius: 50%;
    width: 200upx;
    height: 200upx;
    font-size: 10px;
    border-top: 6upx solid rgba(0, 0, 0, 0.05);
    border-right: 6upx solid rgba(0, 0, 0, 0.05);
    border-bottom: 6upx solid rgba(0, 0, 0, 0.05);
    border-left: 6upx solid #f37b1d;
    animation: cuIcon-spin 1s infinite linear;
    z-index: -1;
}
.load-progress {
    pointer-events: none;
    top: 0;
    position: fixed;
    width: 100%;
    left: 0;
    z-index: 2000;
}
.load-progress.hide {
    display: none;
}
.load-progress .load-progress-bar {
    position: relative;
    width: 100%;
    height: 4upx;
    overflow: hidden;
    transition: all 200ms ease 0s;
}
.load-progress .load-progress-spinner {
    position: absolute;
    top: 10upx;
    right: 10upx;
    z-index: 2000;
    display: block;
}
.load-progress .load-progress-spinner::after {
    content: "";
    display: block;
    width: 24upx;
    height: 24upx;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    border: solid 4upx transparent;
    border-top-color: inherit;
    border-left-color: inherit;
    border-radius: 50%;
    -webkit-animation: load-progress-spinner 0.4s linear infinite;
    animation: load-progress-spinner 0.4s linear infinite;
}
@-webkit-keyframes load-progress-spinner {
    0% {
        -webkit-transform: rotate(0);
        transform: rotate(0);
    }
    100% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}
@keyframes load-progress-spinner {
    0% {
        -webkit-transform: rotate(0);
        transform: rotate(0);
    }
    100% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
    }
}
/* ==================
          åˆ—表
 ==================== */
.grayscale {
    filter: grayscale(1);
}
.cu-list+.cu-list {
    margin-top: 30upx
}
.cu-list>.cu-item {
    transition: all .6s ease-in-out 0s;
    transform: translateX(0upx)
}
.cu-list>.cu-item.move-cur {
    transform: translateX(-260upx)
}
.cu-list>.cu-item .move {
    position: absolute;
    right: 0;
    display: flex;
    width: 260upx;
    height: 100%;
    transform: translateX(100%)
}
.cu-list>.cu-item .move view {
    display: flex;
    flex: 1;
    justify-content: center;
    align-items: center
}
.cu-list.menu-avatar {
    overflow: hidden;
}
.cu-list.menu-avatar>.cu-item {
    position: relative;
    display: flex;
    padding-right: 10upx;
    height: 140upx;
    background-color: #ffffff;
    justify-content: flex-end;
    align-items: center
}
.cu-list.menu-avatar>.cu-item>.cu-avatar {
    position: absolute;
    left: 30upx
}
.cu-list.menu-avatar>.cu-item .flex .text-cut {
    max-width: 510upx
}
.cu-list.menu-avatar>.cu-item .content {
    position: absolute;
    left: 146upx;
    width: calc(100% - 96upx - 60upx - 120upx - 20upx);
    line-height: 1.6em;
}
.cu-list.menu-avatar>.cu-item .content.flex-sub {
    width: calc(100% - 96upx - 60upx - 20upx);
}
.cu-list.menu-avatar>.cu-item .content>view:first-child {
    font-size: 30upx;
    display: flex;
    align-items: center
}
.cu-list.menu-avatar>.cu-item .content .cu-tag.sm {
    display: inline-block;
    margin-left: 10upx;
    height: 28upx;
    font-size: 16upx;
    line-height: 32upx
}
.cu-list.menu-avatar>.cu-item .action {
    width: 100upx;
    text-align: center
}
.cu-list.menu-avatar>.cu-item .action view+view {
    margin-top: 10upx
}
.cu-list.menu-avatar.comment>.cu-item .content {
    position: relative;
    left: 0;
    width: auto;
    flex: 1;
}
.cu-list.menu-avatar.comment>.cu-item {
    padding: 30upx 30upx 30upx 120upx;
    height: auto
}
.cu-list.menu-avatar.comment .cu-avatar {
    align-self: flex-start
}
.cu-list.menu>.cu-item {
    position: relative;
    display: flex;
    padding: 0 30upx;
    min-height: 100upx;
    background-color: #ffffff;
    justify-content: space-between;
    align-items: center
}
.cu-list.menu>.cu-item:last-child:after {
    border: none
}
.cu-list.menu-avatar>.cu-item:after,
.cu-list.menu>.cu-item:after {
    position: absolute;
    top: 0;
    left: 0;
    box-sizing: border-box;
    width: 200%;
    height: 200%;
    border-bottom: 1upx solid #ddd;
    border-radius: inherit;
    content: " ";
    transform: scale(.5);
    transform-origin: 0 0;
    pointer-events: none
}
.cu-list.menu>.cu-item.grayscale {
    background-color: #f5f5f5
}
.cu-list.menu>.cu-item.cur {
    background-color: #fcf7e9
}
.cu-list.menu>.cu-item.arrow {
    padding-right: 90upx
}
.cu-list.menu>.cu-item.arrow:before {
    position: absolute;
    top: 0;
    right: 30upx;
    bottom: 0;
    display: block;
    margin: auto;
    width: 30upx;
    height: 30upx;
    color: #8799a3;
    content: "\e6a3";
    text-align: center;
    font-size: 34upx;
    font-family: cuIcon;
    line-height: 30upx
}
.cu-list.menu>.cu-item button.content {
    padding: 0;
    background-color: transparent;
    justify-content: flex-start
}
.cu-list.menu>.cu-item button.content:after {
    display: none
}
.cu-list.menu>.cu-item .cu-avatar-group .cu-avatar {
    border-color: #ffffff
}
.cu-list.menu>.cu-item .content>view:first-child {
    display: flex;
    align-items: center
}
.cu-list.menu>.cu-item .content>text[class*=cuIcon] {
    display: inline-block;
    margin-right: 10upx;
    width: 1.6em;
    text-align: center
}
.cu-list.menu>.cu-item .content>image {
    display: inline-block;
    margin-right: 10upx;
    width: 1.6em;
    height: 1.6em;
    vertical-align: middle
}
.cu-list.menu>.cu-item .content {
    font-size: 30upx;
    line-height: 1.6em;
    flex: 1
}
.cu-list.menu>.cu-item .content .cu-tag.sm {
    display: inline-block;
    margin-left: 10upx;
    height: 28upx;
    font-size: 16upx;
    line-height: 32upx
}
.cu-list.menu>.cu-item .action .cu-tag:empty {
    right: 10upx
}
.cu-list.menu {
    display: block;
    overflow: hidden
}
.cu-list.menu.sm-border>.cu-item:after {
    left: 30upx;
    width: calc(200% - 120upx)
}
.cu-list.grid>.cu-item {
    position: relative;
    display: flex;
    padding: 20upx 0 30upx;
    transition-duration: 0s;
    flex-direction: column
}
.cu-list.grid>.cu-item:after {
    position: absolute;
    top: 0;
    left: 0;
    box-sizing: border-box;
    width: 200%;
    height: 200%;
    border-right: 1px solid rgba(0, 0, 0, .1);
    border-bottom: 1px solid rgba(0, 0, 0, .1);
    border-radius: inherit;
    content: " ";
    transform: scale(.5);
    transform-origin: 0 0;
    pointer-events: none
}
.cu-list.grid>.cu-item text {
    display: block;
    margin-top: 10upx;
    color: #888;
    font-size: 26upx;
    line-height: 40upx
}
.cu-list.grid>.cu-item [class*=cuIcon] {
    position: relative;
    display: block;
    margin-top: 20upx;
    width: 100%;
    font-size: 48upx
}
.cu-list.grid>.cu-item .cu-tag {
    right: auto;
    left: 50%;
    margin-left: 20upx
}
.cu-list.grid {
    background-color: #ffffff;
    text-align: center
}
.cu-list.grid.no-border>.cu-item {
    padding-top: 10upx;
    padding-bottom: 20upx
}
.cu-list.grid.no-border>.cu-item:after {
    border: none
}
.cu-list.grid.no-border {
    padding: 20upx 10upx
}
.cu-list.grid.col-3>.cu-item:nth-child(3n):after,
.cu-list.grid.col-4>.cu-item:nth-child(4n):after,
.cu-list.grid.col-5>.cu-item:nth-child(5n):after {
    border-right-width: 0
}
.cu-list.card-menu {
    overflow: hidden;
    margin-right: 30upx;
    margin-left: 30upx;
    border-radius: 20upx
}
/* ==================
          æ“ä½œæ¡
 ==================== */
.cu-bar {
    display: flex;
    position: relative;
    align-items: center;
    min-height: 100upx;
    justify-content: space-between;
}
.cu-bar .action {
    display: flex;
    align-items: center;
    height: 100%;
    justify-content: center;
    max-width: 100%;
}
.cu-bar .action.border-title {
    position: relative;
    top: -10upx;
}
.cu-bar .action.border-title text[class*="bg-"]:last-child {
    position: absolute;
    bottom: -0.5rem;
    min-width: 2rem;
    height: 6upx;
    left: 0;
}
.cu-bar .action.sub-title {
    position: relative;
    top: -0.2rem;
}
.cu-bar .action.sub-title text {
    position: relative;
    z-index: 1;
}
.cu-bar .action.sub-title text[class*="bg-"]:last-child {
    position: absolute;
    display: inline-block;
    bottom: -0.2rem;
    border-radius: 6upx;
    width: 100%;
    height: 0.6rem;
    left: 0.6rem;
    opacity: 0.3;
    z-index: 0;
}
.cu-bar .action.sub-title text[class*="text-"]:last-child {
    position: absolute;
    display: inline-block;
    bottom: -0.7rem;
    left: 0.5rem;
    opacity: 0.2;
    z-index: 0;
    text-align: right;
    font-weight: 900;
    font-size: 36upx;
}
.cu-bar.justify-center .action.border-title text:last-child,
.cu-bar.justify-center .action.sub-title text:last-child {
    left: 0;
    right: 0;
    margin: auto;
    text-align: center;
}
.cu-bar .action:first-child {
    margin-left: 30upx;
    font-size: 30upx;
}
.cu-bar .action text.text-cut {
    text-align: left;
    width: 100%;
}
.cu-bar .cu-avatar:first-child {
    margin-left: 20upx;
}
.cu-bar .action:first-child>text[class*="cuIcon-"] {
    margin-left: -0.3em;
    margin-right: 0.3em;
}
.cu-bar .action:last-child {
    margin-right: 30upx;
}
.cu-bar .action>text[class*="cuIcon-"],
.cu-bar .action>view[class*="cuIcon-"] {
    font-size: 36upx;
}
.cu-bar .action>text[class*="cuIcon-"]+text[class*="cuIcon-"] {
    margin-left: 0.5em;
}
.cu-bar .content {
    position: absolute;
    text-align: center;
    width: calc(100% - 340upx);
    left: 0;
    right: 0;
    bottom: 0;
    top: 0;
    margin: auto;
    height: 30px;
    font-size: 16px;
    line-height: 30px;
    cursor: none;
    pointer-events: none;
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}
.cu-bar.ios .content {
    bottom: 7px;
    height: 30px;
    font-size: 16px;
    line-height: 30px;
}
.cu-bar.btn-group {
    justify-content: space-around;
}
.cu-bar.btn-group button {
    padding: 20upx 32upx;
}
.cu-bar.btn-group button {
    flex: 1;
    margin: 0 20upx;
    max-width: 50%;
}
.cu-bar .search-form {
    background-color: #f5f5f5;
    line-height: 64upx;
    height: 64upx;
    font-size: 24upx;
    color: #333333;
    flex: 1;
    display: flex;
    align-items: center;
    margin: 0 30upx;
}
.cu-bar .search-form+.action {
    margin-right: 30upx;
}
.cu-bar .search-form input {
    flex: 1;
    padding-right: 30upx;
    height: 64upx;
    line-height: 64upx;
    font-size: 26upx;
    background-color: transparent;
}
.cu-bar .search-form [class*="cuIcon-"] {
    margin: 0 0.5em 0 0.8em;
}
.cu-bar .search-form [class*="cuIcon-"]::before {
    top: 0upx;
}
.cu-bar.fixed,
.nav.fixed {
    position: fixed;
    width: 100%;
    top: 0;
    z-index: 1024;
    box-shadow: 0 1upx 6upx rgba(0, 0, 0, 0.1);
}
.cu-bar.foot {
    position: fixed;
    width: 100%;
    bottom: 0;
    z-index: 1024;
    box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
}
.cu-bar.tabbar {
    padding: 0;
    height: calc(100upx + env(safe-area-inset-bottom) / 2);
    padding-bottom: calc(env(safe-area-inset-bottom) / 2);
}
.cu-tabbar-height {
    min-height: 100upx;
    height: calc(100upx + env(safe-area-inset-bottom) / 2);
}
.cu-bar.tabbar.shadow {
    box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
}
.cu-bar.tabbar .action {
    font-size: 22upx;
    position: relative;
    flex: 1;
    text-align: center;
    padding: 0;
    display: block;
    height: auto;
    line-height: 1;
    margin: 0;
    background-color: inherit;
    overflow: initial;
}
.cu-bar.tabbar.shop .action {
    width: 140upx;
    flex: initial;
}
.cu-bar.tabbar .action.add-action {
    position: relative;
    z-index: 2;
    padding-top: 50upx;
}
.cu-bar.tabbar .action.add-action [class*="cuIcon-"] {
    position: absolute;
    width: 70upx;
    z-index: 2;
    height: 70upx;
    border-radius: 50%;
    line-height: 70upx;
    font-size: 50upx;
    top: -35upx;
    left: 0;
    right: 0;
    margin: auto;
    padding: 0;
}
.cu-bar.tabbar .action.add-action::after {
    content: "";
    position: absolute;
    width: 100upx;
    height: 100upx;
    top: -50upx;
    left: 0;
    right: 0;
    margin: auto;
    box-shadow: 0 -3upx 8upx rgba(0, 0, 0, 0.08);
    border-radius: 50upx;
    background-color: inherit;
    z-index: 0;
}
.cu-bar.tabbar .action.add-action::before {
    content: "";
    position: absolute;
    width: 100upx;
    height: 30upx;
    bottom: 30upx;
    left: 0;
    right: 0;
    margin: auto;
    background-color: inherit;
    z-index: 1;
}
.cu-bar.tabbar .btn-group {
    flex: 1;
    display: flex;
    justify-content: space-around;
    align-items: center;
    padding: 0 10upx;
}
.cu-bar.tabbar button.action::after {
    border: 0;
}
.cu-bar.tabbar .action [class*="cuIcon-"] {
    width: 100upx;
    position: relative;
    display: block;
    height: auto;
    margin: 0 auto 10upx;
    text-align: center;
    font-size: 40upx;
}
.cu-bar.tabbar .action .cuIcon-cu-image {
    margin: 0 auto;
}
.cu-bar.tabbar .action .cuIcon-cu-image image {
    width: 50upx;
    height: 50upx;
    display: inline-block;
}
.cu-bar.tabbar .submit {
    align-items: center;
    display: flex;
    justify-content: center;
    text-align: center;
    position: relative;
    flex: 2;
    align-self: stretch;
}
.cu-bar.tabbar .submit:last-child {
    flex: 2.6;
}
.cu-bar.tabbar .submit+.submit {
    flex: 2;
}
.cu-bar.tabbar.border .action::before {
    content: " ";
    width: 200%;
    height: 200%;
    position: absolute;
    top: 0;
    left: 0;
    transform: scale(0.5);
    transform-origin: 0 0;
    border-right: 1upx solid rgba(0, 0, 0, 0.1);
    z-index: 3;
}
.cu-bar.tabbar.border .action:last-child:before {
    display: none;
}
.cu-bar.input {
    padding-right: 20upx;
    background-color: #ffffff;
}
.cu-bar.input input {
    overflow: initial;
    line-height: 64upx;
    height: 64upx;
    min-height: 64upx;
    flex: 1;
    font-size: 30upx;
    margin: 0 20upx;
}
.cu-bar.input .action {
    margin-left: 20upx;
}
.cu-bar.input .action [class*="cuIcon-"] {
    font-size: 48upx;
}
.cu-bar.input input+.action {
    margin-right: 20upx;
    margin-left: 0upx;
}
.cu-bar.input .action:first-child [class*="cuIcon-"] {
    margin-left: 0upx;
}
.cu-custom {
    display: block;
    position: relative;
}
.cu-custom .cu-bar .content {
    /* width: calc(100% - 440upx); */
}
/* #ifdef MP-ALIPAY */
.cu-custom .cu-bar .action .cuIcon-back {
    opacity: 0;
}
/* #endif */
.cu-custom .cu-bar .content image {
    height: 60upx;
    width: 240upx;
}
.cu-custom .cu-bar {
    min-height: 0px;
    /* #ifdef MP-WEIXIN */
    padding-right: 220upx;
    /* #endif */
    /* #ifdef MP-ALIPAY */
    padding-right: 150upx;
    /* #endif */
    box-shadow: 0upx 0upx 0upx;
    z-index: 9999;
}
.cu-custom .cu-bar .border-custom {
    position: relative;
    background: rgba(0, 0, 0, 0.15);
    border-radius: 1000upx;
    height: 30px;
}
.cu-custom .cu-bar .border-custom::after {
    content: " ";
    width: 200%;
    height: 200%;
    position: absolute;
    top: 0;
    left: 0;
    border-radius: inherit;
    transform: scale(0.5);
    transform-origin: 0 0;
    pointer-events: none;
    box-sizing: border-box;
    border: 1upx solid #ffffff;
    opacity: 0.5;
}
.cu-custom .cu-bar .border-custom::before {
    content: " ";
    width: 1upx;
    height: 110%;
    position: absolute;
    top: 22.5%;
    left: 0;
    right: 0;
    margin: auto;
    transform: scale(0.5);
    transform-origin: 0 0;
    pointer-events: none;
    box-sizing: border-box;
    opacity: 0.6;
    background-color: #ffffff;
}
.cu-custom .cu-bar .border-custom text {
    display: block;
    flex: 1;
    margin: auto !important;
    text-align: center;
    font-size: 34upx;
}
/* ==================
         å¯¼èˆªæ 
 ==================== */
.nav {
    white-space: nowrap;
}
::-webkit-scrollbar {
    display: none;
}
.nav .cu-item {
    height: 90upx;
    display: inline-block;
    line-height: 90upx;
    margin: 0 10upx;
    padding: 0 20upx;
}
.nav .cu-item.cur {
    border-bottom: 4upx solid;
}
/* ==================
         æ—¶é—´è½´
 ==================== */
.cu-timeline {
    display: block;
    background-color: #ffffff;
}
.cu-timeline .cu-time {
    width: 120upx;
    text-align: center;
    padding: 20upx 0;
    font-size: 26upx;
    color: #888;
    display: block;
}
.cu-timeline>.cu-item {
    padding: 30upx 30upx 30upx 120upx;
    position: relative;
    display: block;
    z-index: 0;
}
.cu-timeline>.cu-item:not([class*="text-"]) {
    color: #ccc;
}
.cu-timeline>.cu-item::after {
    content: "";
    display: block;
    position: absolute;
    width: 1upx;
    background-color: #ddd;
    left: 60upx;
    height: 100%;
    top: 0;
    z-index: 8;
}
.cu-timeline>.cu-item::before {
    font-family: "cuIcon";
    display: block;
    position: absolute;
    top: 36upx;
    z-index: 9;
    background-color: #ffffff;
    width: 50upx;
    height: 50upx;
    text-align: center;
    border: none;
    line-height: 50upx;
    left: 36upx;
}
.cu-timeline>.cu-item:not([class*="cuIcon-"])::before {
    content: "\e763";
}
.cu-timeline>.cu-item[class*="cuIcon-"]::before {
    background-color: #ffffff;
    width: 50upx;
    height: 50upx;
    text-align: center;
    border: none;
    line-height: 50upx;
    left: 36upx;
}
.cu-timeline>.cu-item>.content {
    padding: 30upx;
    border-radius: 6upx;
    display: block;
    line-height: 1.6;
}
.cu-timeline>.cu-item>.content:not([class*="bg-"]) {
    background-color: #f1f1f1;
    color: #333333;
}
.cu-timeline>.cu-item>.content+.content {
    margin-top: 20upx;
}
/* ==================
         èŠå¤©
 ==================== */
.cu-chat {
    display: flex;
    flex-direction: column;
}
.cu-chat .cu-item {
    display: flex;
    padding: 30upx 30upx 70upx;
    position: relative;
}
.cu-chat .cu-item>.cu-avatar {
    width: 80upx;
    height: 80upx;
}
.cu-chat .cu-item>.main {
    max-width: calc(100% - 260upx);
    margin: 0 40upx;
    display: flex;
    align-items: center;
}
.cu-chat .cu-item>image {
    height: 320upx;
}
.cu-chat .cu-item>.main .content {
    padding: 20upx;
    border-radius: 6upx;
    display: inline-flex;
    max-width: 100%;
    align-items: center;
    font-size: 30upx;
    position: relative;
    min-height: 80upx;
    line-height: 40upx;
    text-align: left;
}
.cu-chat .cu-item>.main .content:not([class*="bg-"]) {
    background-color: #ffffff;
    color: #333333;
}
.cu-chat .cu-item .date {
    position: absolute;
    font-size: 24upx;
    color: #8799a3;
    width: calc(100% - 320upx);
    bottom: 20upx;
    left: 160upx;
}
.cu-chat .cu-item .action {
    padding: 0 30upx;
    display: flex;
    align-items: center;
}
.cu-chat .cu-item>.main .content::after {
    content: "";
    top: 27upx;
    transform: rotate(45deg);
    position: absolute;
    z-index: 100;
    display: inline-block;
    overflow: hidden;
    width: 24upx;
    height: 24upx;
    left: -12upx;
    right: initial;
    background-color: inherit;
}
.cu-chat .cu-item.self>.main .content::after {
    left: auto;
    right: -12upx;
}
.cu-chat .cu-item>.main .content::before {
    content: "";
    top: 30upx;
    transform: rotate(45deg);
    position: absolute;
    z-index: -1;
    display: inline-block;
    overflow: hidden;
    width: 24upx;
    height: 24upx;
    left: -12upx;
    right: initial;
    background-color: inherit;
    filter: blur(5upx);
    opacity: 0.3;
}
.cu-chat .cu-item>.main .content:not([class*="bg-"])::before {
    background-color: #333333;
    opacity: 0.1;
}
.cu-chat .cu-item.self>.main .content::before {
    left: auto;
    right: -12upx;
}
.cu-chat .cu-item.self {
    justify-content: flex-end;
    text-align: right;
}
.cu-chat .cu-info {
    display: inline-block;
    margin: 20upx auto;
    font-size: 24upx;
    padding: 8upx 12upx;
    background-color: rgba(0, 0, 0, 0.2);
    border-radius: 6upx;
    color: #ffffff;
    max-width: 400upx;
    line-height: 1.4;
}
/* ==================
         å¡ç‰‡
 ==================== */
.cu-card {
    display: block;
    overflow: hidden;
}
.cu-card>.cu-item {
    display: block;
    background-color: #ffffff;
    overflow: hidden;
    border-radius: 10upx;
    margin: 30upx;
}
.cu-card>.cu-item.shadow-blur {
    overflow: initial;
}
.cu-card.no-card>.cu-item {
    margin: 0upx;
    border-radius: 0upx;
}
.cu-card .grid.grid-square {
    margin-bottom: -20upx;
}
.cu-card.case .image {
    position: relative;
}
.cu-card.case .image image {
    width: 100%;
}
.cu-card.case .image .cu-tag {
    position: absolute;
    right: 0;
    top: 0;
}
.cu-card.case .image .cu-bar {
    position: absolute;
    bottom: 0;
    width: 100%;
    background-color: transparent;
    padding: 0upx 30upx;
}
.cu-card.case.no-card .image {
    margin: 30upx 30upx 0;
    overflow: hidden;
    border-radius: 10upx;
}
.cu-card.dynamic {
    display: block;
}
.cu-card.dynamic>.cu-item {
    display: block;
    background-color: #ffffff;
    overflow: hidden;
}
.cu-card.dynamic>.cu-item>.text-content {
    padding: 0 30upx 0;
    max-height: 6.4em;
    overflow: hidden;
    font-size: 30upx;
    margin-bottom: 20upx;
}
.cu-card.dynamic>.cu-item .square-img {
    width: 100%;
    height: 200upx;
    border-radius: 6upx;
}
.cu-card.dynamic>.cu-item .only-img {
    width: 100%;
    height: 320upx;
    border-radius: 6upx;
}
/* card.dynamic>.cu-item .comment {
  padding: 20upx;
  background-color: #f1f1f1;
  margin: 0 30upx 30upx;
  border-radius: 6upx;
} */
.cu-card.article {
    display: block;
}
.cu-card.article>.cu-item {
    padding-bottom: 30upx;
}
.cu-card.article>.cu-item .title {
    font-size: 30upx;
    font-weight: 900;
    color: #333333;
    line-height: 100upx;
    padding: 0 30upx;
}
.cu-card.article>.cu-item .content {
    display: flex;
    padding: 0 30upx;
}
.cu-card.article>.cu-item .content>image {
    width: 240upx;
    height: 6.4em;
    margin-right: 20upx;
    border-radius: 6upx;
}
.cu-card.article>.cu-item .content .desc {
    flex: 1;
    display: flex;
    flex-direction: column;
    justify-content: space-between;
}
.cu-card.article>.cu-item .content .text-content {
    font-size: 28upx;
    color: #888;
    height: 4.8em;
    overflow: hidden;
}
/* ==================
         è¡¨å•
 ==================== */
.cu-form-group {
    background-color: #ffffff;
    padding: 1upx 30upx;
    display: flex;
    align-items: center;
    min-height: 100upx;
    justify-content: space-between;
}
.cu-form-group+.cu-form-group {
    border-top: 1upx solid #eee;
}
.cu-form-group .title {
    text-align: justify;
    padding-right: 30upx;
    font-size: 30upx;
    position: relative;
    height: 60upx;
    line-height: 60upx;
}
.cu-form-group input {
    flex: 1;
    font-size: 30upx;
    color: #555;
    padding-right: 20upx;
}
.cu-form-group>text[class*="cuIcon-"] {
    font-size: 36upx;
    padding: 0;
    box-sizing: border-box;
}
.cu-form-group textarea {
    margin: 32upx 0 30upx;
    height: 4.6em;
    width: 100%;
    line-height: 1.2em;
    flex: 1;
    font-size: 28upx;
    padding: 0;
}
.cu-form-group.align-start .title {
    height: 1em;
    margin-top: 32upx;
    line-height: 1em;
}
.cu-form-group picker {
    flex: 1;
    padding-right: 40upx;
    overflow: hidden;
    position: relative;
}
.cu-form-group picker .picker {
    line-height: 100upx;
    font-size: 28upx;
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
    width: 100%;
    text-align: right;
}
.cu-form-group picker::after {
    font-family: cuIcon;
    display: block;
    content: "\e6a3";
    position: absolute;
    font-size: 34upx;
    color: #8799a3;
    line-height: 100upx;
    width: 60upx;
    text-align: center;
    top: 0;
    bottom: 0;
    right: -20upx;
    margin: auto;
}
.cu-form-group textarea[disabled],
.cu-form-group textarea[disabled] .placeholder {
    color: transparent;
}
/* ==================
         æ¨¡æ€çª—口
 ==================== */
.cu-modal {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1110;
    opacity: 0;
    outline: 0;
    text-align: center;
    -ms-transform: scale(1.185);
    transform: scale(1.185);
    backface-visibility: hidden;
    perspective: 2000upx;
    background: rgba(0, 0, 0, 0.6);
    transition: all 0.3s ease-in-out 0s;
    pointer-events: none;
}
.cu-modal::before {
    content: "\200B";
    display: inline-block;
    height: 100%;
    vertical-align: middle;
}
.cu-modal.show {
    opacity: 1;
    transition-duration: 0.3s;
    -ms-transform: scale(1);
    transform: scale(1);
    overflow-x: hidden;
    overflow-y: auto;
    pointer-events: auto;
}
.cu-dialog {
    position: relative;
    display: inline-block;
    vertical-align: middle;
    margin-left: auto;
    margin-right: auto;
    width: 680upx;
    max-width: 100%;
    background-color: #f8f8f8;
    border-radius: 10upx;
    overflow: hidden;
}
.cu-modal.bottom-modal::before {
    vertical-align: bottom;
}
.cu-modal.bottom-modal .cu-dialog {
    width: 100%;
    border-radius: 0;
}
.cu-modal.bottom-modal {
    margin-bottom: -1000upx;
}
.cu-modal.bottom-modal.show {
    margin-bottom: 0;
}
.cu-modal.drawer-modal {
    transform: scale(1);
    display: flex;
}
.cu-modal.drawer-modal .cu-dialog {
    height: 100%;
    min-width: 200upx;
    border-radius: 0;
    margin: initial;
    transition-duration: 0.3s;
}
.cu-modal.drawer-modal.justify-start .cu-dialog {
    transform: translateX(-100%);
}
.cu-modal.drawer-modal.justify-end .cu-dialog {
    transform: translateX(100%);
}
.cu-modal.drawer-modal.show .cu-dialog {
    transform: translateX(0%);
}
.cu-modal .cu-dialog>.cu-bar:first-child .action {
    min-width: 100rpx;
    margin-right: 0;
    min-height: 100rpx;
}
/* ==================
         è½®æ’­
 ==================== */
swiper .a-swiper-dot {
    display: inline-block;
    width: 16upx;
    height: 16upx;
    background: rgba(0, 0, 0, .3);
    border-radius: 50%;
    vertical-align: middle;
}
swiper[class*="-dot"] .wx-swiper-dots,
swiper[class*="-dot"] .a-swiper-dots,
swiper[class*="-dot"] .uni-swiper-dots {
    display: flex;
    align-items: center;
    width: 100%;
    justify-content: center;
}
swiper.square-dot .wx-swiper-dot,
swiper.square-dot .a-swiper-dot,
swiper.square-dot .uni-swiper-dot {
    background-color: #ffffff;
    opacity: 0.4;
    width: 10upx;
    height: 10upx;
    border-radius: 20upx;
    margin: 0 8upx !important;
}
swiper.square-dot .wx-swiper-dot.wx-swiper-dot-active,
swiper.square-dot .a-swiper-dot.a-swiper-dot-active,
swiper.square-dot .uni-swiper-dot.uni-swiper-dot-active {
    opacity: 1;
    width: 30upx;
}
swiper.round-dot .wx-swiper-dot,
swiper.round-dot .a-swiper-dot,
swiper.round-dot .uni-swiper-dot {
    width: 10upx;
    height: 10upx;
    position: relative;
    margin: 4upx 8upx !important;
}
swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active::after,
swiper.round-dot .a-swiper-dot.a-swiper-dot-active::after,
swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active::after {
    content: "";
    position: absolute;
    width: 10upx;
    height: 10upx;
    top: 0upx;
    left: 0upx;
    right: 0;
    bottom: 0;
    margin: auto;
    background-color: #ffffff;
    border-radius: 20upx;
}
swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active,
swiper.round-dot .a-swiper-dot.a-swiper-dot-active,
swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active {
    width: 18upx;
    height: 18upx;
}
.screen-swiper {
    min-height: 375upx;
}
.screen-swiper image,
.screen-swiper video,
.swiper-item image,
.swiper-item video {
    width: 100%;
    display: block;
    height: 100%;
    margin: 0;
    pointer-events: none;
}
.card-swiper {
    height: 420upx !important;
}
.card-swiper swiper-item {
    width: 610upx !important;
    left: 70upx;
    box-sizing: border-box;
    padding: 40upx 0upx 70upx;
    overflow: initial;
}
.card-swiper swiper-item .swiper-item {
    width: 100%;
    display: block;
    height: 100%;
    border-radius: 10upx;
    transform: scale(0.9);
    transition: all 0.2s ease-in 0s;
    overflow: hidden;
}
.card-swiper swiper-item.cur .swiper-item {
    transform: none;
    transition: all 0.2s ease-in 0s;
}
.tower-swiper {
    height: 420upx;
    position: relative;
    max-width: 750upx;
    overflow: hidden;
}
.tower-swiper .tower-item {
    position: absolute;
    width: 300upx;
    height: 380upx;
    top: 0;
    bottom: 0;
    left: 50%;
    margin: auto;
    transition: all 0.2s ease-in 0s;
    opacity: 1;
}
.tower-swiper .tower-item.none {
    opacity: 0;
}
.tower-swiper .tower-item .swiper-item {
    width: 100%;
    height: 100%;
    border-radius: 6upx;
    overflow: hidden;
}
/* ==================
          æ­¥éª¤æ¡
 ==================== */
.cu-steps {
    display: flex;
}
scroll-view.cu-steps {
    display: block;
    white-space: nowrap;
}
scroll-view.cu-steps .cu-item {
    display: inline-block;
}
.cu-steps .cu-item {
    flex: 1;
    text-align: center;
    position: relative;
    min-width: 100upx;
}
.cu-steps .cu-item:not([class*="text-"]) {
    color: #8799a3;
}
.cu-steps .cu-item [class*="cuIcon-"],
.cu-steps .cu-item .num {
    display: block;
    font-size: 40upx;
    line-height: 80upx;
}
.cu-steps .cu-item::before,
.cu-steps .cu-item::after,
.cu-steps.steps-arrow .cu-item::before,
.cu-steps.steps-arrow .cu-item::after {
    content: "";
    display: block;
    position: absolute;
    height: 0px;
    width: calc(100% - 80upx);
    border-bottom: 1px solid #ccc;
    left: calc(0px - (100% - 80upx) / 2);
    top: 40upx;
    z-index: 0;
}
.cu-steps.steps-arrow .cu-item::before,
.cu-steps.steps-arrow .cu-item::after {
    content: "\e6a3";
    font-family: 'cuIcon';
    height: 30upx;
    border-bottom-width: 0px;
    line-height: 30upx;
    top: 0;
    bottom: 0;
    margin: auto;
    color: #ccc;
}
.cu-steps.steps-bottom .cu-item::before,
.cu-steps.steps-bottom .cu-item::after {
    bottom: 40upx;
    top: initial;
}
.cu-steps .cu-item::after {
    border-bottom: 1px solid currentColor;
    width: 0px;
    transition: all 0.3s ease-in-out 0s;
}
.cu-steps .cu-item[class*="text-"]::after {
    width: calc(100% - 80upx);
    color: currentColor;
}
.cu-steps .cu-item:first-child::before,
.cu-steps .cu-item:first-child::after {
    display: none;
}
.cu-steps .cu-item .num {
    width: 40upx;
    height: 40upx;
    border-radius: 50%;
    line-height: 40upx;
    margin: 20upx auto;
    font-size: 24upx;
    border: 1px solid currentColor;
    position: relative;
    overflow: hidden;
}
.cu-steps .cu-item[class*="text-"] .num {
    background-color: currentColor;
}
.cu-steps .cu-item .num::before,
.cu-steps .cu-item .num::after {
    content: attr(data-index);
    position: absolute;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    margin: auto;
    transition: all 0.3s ease-in-out 0s;
    transform: translateY(0upx);
}
.cu-steps .cu-item[class*="text-"] .num::before {
    transform: translateY(-40upx);
    color: #ffffff;
}
.cu-steps .cu-item .num::after {
    transform: translateY(40upx);
    color: #ffffff;
    transition: all 0.3s ease-in-out 0s;
}
.cu-steps .cu-item[class*="text-"] .num::after {
    content: "\e645";
    font-family: 'cuIcon';
    color: #ffffff;
    transform: translateY(0upx);
}
.cu-steps .cu-item[class*="text-"] .num.err::after {
    content: "\e646";
}
/* ==================
          å¸ƒå±€
 ==================== */
/*  -- flex弹性布局 -- */
.flex {
    display: flex;
}
.basis-xs {
    flex-basis: 20%;
}
.basis-sm {
    flex-basis: 40%;
}
.basis-df {
    flex-basis: 50%;
}
.basis-lg {
    flex-basis: 60%;
}
.basis-xl {
    flex-basis: 80%;
}
.flex-sub {
    flex: 1;
}
.flex-twice {
    flex: 2;
}
.flex-treble {
    flex: 3;
}
.flex-direction {
    flex-direction: column;
}
.flex-wrap {
    flex-wrap: wrap;
}
.align-start {
    align-items: flex-start;
}
.align-end {
    align-items: flex-end;
}
.align-center {
    align-items: center;
}
.align-stretch {
    align-items: stretch;
}
.self-start {
    align-self: flex-start;
}
.self-center {
    align-self: flex-center;
}
.self-end {
    align-self: flex-end;
}
.self-stretch {
    align-self: stretch;
}
.align-stretch {
    align-items: stretch;
}
.justify-start {
    justify-content: flex-start;
}
.justify-end {
    justify-content: flex-end;
}
.justify-center {
    justify-content: center;
}
.justify-between {
    justify-content: space-between;
}
.justify-around {
    justify-content: space-around;
}
/* grid布局 */
.grid {
    display: flex;
    flex-wrap: wrap;
}
.grid.grid-square {
    overflow: hidden;
}
.grid.grid-square .cu-tag {
    position: absolute;
    right: 0;
    top: 0;
    border-bottom-left-radius: 6upx;
    padding: 6upx 12upx;
    height: auto;
    background-color: rgba(0, 0, 0, 0.5);
}
.grid.grid-square>view>text[class*="cuIcon-"] {
    font-size: 52upx;
    position: absolute;
    color: #8799a3;
    margin: auto;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    flex-direction: column;
}
.grid.grid-square>view {
    margin-right: 20upx;
    margin-bottom: 20upx;
    border-radius: 6upx;
    position: relative;
    overflow: hidden;
}
.grid.grid-square>view.bg-img image {
    width: 100%;
    height: 100%;
    position: absolute;
}
.grid.col-1.grid-square>view {
    padding-bottom: 100%;
    height: 0;
    margin-right: 0;
}
.grid.col-2.grid-square>view {
    padding-bottom: calc((100% - 20upx)/2);
    height: 0;
    width: calc((100% - 20upx)/2);
}
.grid.col-3.grid-square>view {
    padding-bottom: calc((100% - 40upx)/3);
    height: 0;
    width: calc((100% - 40upx)/3);
}
.grid.col-4.grid-square>view {
    padding-bottom: calc((100% - 60upx)/4);
    height: 0;
    width: calc((100% - 60upx)/4);
}
.grid.col-5.grid-square>view {
    padding-bottom: calc((100% - 80upx)/5);
    height: 0;
    width: calc((100% - 80upx)/5);
}
.grid.col-2.grid-square>view:nth-child(2n),
.grid.col-3.grid-square>view:nth-child(3n),
.grid.col-4.grid-square>view:nth-child(4n),
.grid.col-5.grid-square>view:nth-child(5n) {
    margin-right: 0;
}
.grid.col-1>view {
    width: 100%;
}
.grid.col-2>view {
    width: 50%;
}
.grid.col-3>view {
    width: 33.33%;
}
.grid.col-4>view {
    width: 25%;
}
.grid.col-5>view {
    width: 20%;
}
/*  -- å†…外边距 -- */
.margin-0 {
    margin: 0;
}
.margin-xs {
    margin: 10upx;
}
.margin-sm {
    margin: 20upx;
}
.margin {
    margin: 30upx;
}
.margin-lg {
    margin: 40upx;
}
.margin-xl {
    margin: 50upx;
}
.margin-top-xs {
    margin-top: 10upx;
}
.margin-top-sm {
    margin-top: 20upx;
}
.margin-top {
    margin-top: 30upx;
}
.margin-top-lg {
    margin-top: 40upx;
}
.margin-top-xl {
    margin-top: 50upx;
}
.margin-right-xs {
    margin-right: 10upx;
}
.margin-right-sm {
    margin-right: 20upx;
}
.margin-right {
    margin-right: 30upx;
}
.margin-right-lg {
    margin-right: 40upx;
}
.margin-right-xl {
    margin-right: 50upx;
}
.margin-bottom-xs {
    margin-bottom: 10upx;
}
.margin-bottom-sm {
    margin-bottom: 20upx;
}
.margin-bottom {
    margin-bottom: 30upx;
}
.margin-bottom-lg {
    margin-bottom: 40upx;
}
.margin-bottom-xl {
    margin-bottom: 50upx;
}
.margin-left-xs {
    margin-left: 10upx;
}
.margin-left-sm {
    margin-left: 20upx;
}
.margin-left {
    margin-left: 30upx;
}
.margin-left-lg {
    margin-left: 40upx;
}
.margin-left-xl {
    margin-left: 50upx;
}
.margin-lr-xs {
    margin-left: 10upx;
    margin-right: 10upx;
}
.margin-lr-sm {
    margin-left: 20upx;
    margin-right: 20upx;
}
.margin-lr {
    margin-left: 30upx;
    margin-right: 30upx;
}
.margin-lr-lg {
    margin-left: 40upx;
    margin-right: 40upx;
}
.margin-lr-xl {
    margin-left: 50upx;
    margin-right: 50upx;
}
.margin-tb-xs {
    margin-top: 10upx;
    margin-bottom: 10upx;
}
.margin-tb-sm {
    margin-top: 20upx;
    margin-bottom: 20upx;
}
.margin-tb {
    margin-top: 30upx;
    margin-bottom: 30upx;
}
.margin-tb-lg {
    margin-top: 40upx;
    margin-bottom: 40upx;
}
.margin-tb-xl {
    margin-top: 50upx;
    margin-bottom: 50upx;
}
.padding-0 {
    padding: 0;
}
.padding-xs {
    padding: 10upx;
}
.padding-sm {
    padding: 20upx;
}
.padding {
    padding: 30upx;
}
.padding-lg {
    padding: 40upx;
}
.padding-xl {
    padding: 50upx;
}
.padding-top-xs {
    padding-top: 10upx;
}
.padding-top-sm {
    padding-top: 20upx;
}
.padding-top {
    padding-top: 30upx;
}
.padding-top-lg {
    padding-top: 40upx;
}
.padding-top-xl {
    padding-top: 50upx;
}
.padding-right-xs {
    padding-right: 10upx;
}
.padding-right-sm {
    padding-right: 20upx;
}
.padding-right {
    padding-right: 30upx;
}
.padding-right-lg {
    padding-right: 40upx;
}
.padding-right-xl {
    padding-right: 50upx;
}
.padding-bottom-xs {
    padding-bottom: 10upx;
}
.padding-bottom-sm {
    padding-bottom: 20upx;
}
.padding-bottom {
    padding-bottom: 30upx;
}
.padding-bottom-lg {
    padding-bottom: 40upx;
}
.padding-bottom-xl {
    padding-bottom: 50upx;
}
.padding-left-xs {
    padding-left: 10upx;
}
.padding-left-sm {
    padding-left: 20upx;
}
.padding-left {
    padding-left: 30upx;
}
.padding-left-lg {
    padding-left: 40upx;
}
.padding-left-xl {
    padding-left: 50upx;
}
.padding-lr-xs {
    padding-left: 10upx;
    padding-right: 10upx;
}
.padding-lr-sm {
    padding-left: 20upx;
    padding-right: 20upx;
}
.padding-lr {
    padding-left: 30upx;
    padding-right: 30upx;
}
.padding-lr-lg {
    padding-left: 40upx;
    padding-right: 40upx;
}
.padding-lr-xl {
    padding-left: 50upx;
    padding-right: 50upx;
}
.padding-tb-xs {
    padding-top: 10upx;
    padding-bottom: 10upx;
}
.padding-tb-sm {
    padding-top: 20upx;
    padding-bottom: 20upx;
}
.padding-tb {
    padding-top: 30upx;
    padding-bottom: 30upx;
}
.padding-tb-lg {
    padding-top: 40upx;
    padding-bottom: 40upx;
}
.padding-tb-xl {
    padding-top: 50upx;
    padding-bottom: 50upx;
}
/* -- æµ®åЍ --  */
.cf::after,
.cf::before {
    content: " ";
    display: table;
}
.cf::after {
    clear: both;
}
.fl {
    float: left;
}
.fr {
    float: right;
}
/* ==================
          èƒŒæ™¯
 ==================== */
.line-red::after,
.lines-red::after {
    border-color: #e54d42;
}
.line-orange::after,
.lines-orange::after {
    border-color: #f37b1d;
}
.line-yellow::after,
.lines-yellow::after {
    border-color: #fbbd08;
}
.line-olive::after,
.lines-olive::after {
    border-color: #8dc63f;
}
.line-green::after,
.lines-green::after {
    border-color: #39b54a;
}
.line-cyan::after,
.lines-cyan::after {
    border-color: #1cbbb4;
}
.line-blue::after,
.lines-blue::after {
    border-color: #0081ff;
}
.line-purple::after,
.lines-purple::after {
    border-color: #6739b6;
}
.line-mauve::after,
.lines-mauve::after {
    border-color: #9c26b0;
}
.line-pink::after,
.lines-pink::after {
    border-color: #e03997;
}
.line-brown::after,
.lines-brown::after {
    border-color: #a5673f;
}
.line-grey::after,
.lines-grey::after {
    border-color: #8799a3;
}
.line-gray::after,
.lines-gray::after {
    border-color: #aaaaaa;
}
.line-black::after,
.lines-black::after {
    border-color: #333333;
}
.line-white::after,
.lines-white::after {
    border-color: #ffffff;
}
.bg-red {
    background-color: #e54d42;
    color: #ffffff;
}
.bg-orange {
    background-color: #f37b1d;
    color: #ffffff;
}
.bg-yellow {
    background-color: #fbbd08;
    color: #333333;
}
.bg-olive {
    background-color: #8dc63f;
    color: #ffffff;
}
.bg-green {
    background-color: #39b54a;
    color: #ffffff;
}
.bg-cyan {
    background-color: #1cbbb4;
    color: #ffffff;
}
.bg-blue {
    background-color: #0081ff;
    color: #ffffff;
}
.bg-purple {
    background-color: #6739b6;
    color: #ffffff;
}
.bg-mauve {
    background-color: #9c26b0;
    color: #ffffff;
}
.bg-pink {
    background-color: #e03997;
    color: #ffffff;
}
.bg-brown {
    background-color: #a5673f;
    color: #ffffff;
}
.bg-grey {
    background-color: #fff;
    color: #f18202;
    border: 1px solid #f18202;
}
.bg-gray {
    background-color: #f0f0f0;
    color: #333333;
}
.bg-black {
    background-color: #333333;
    color: #ffffff;
}
.bg-white {
    background-color: #ffffff;
    color: #666666;
}
.bg-shadeTop {
    background-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.01));
    color: #ffffff;
}
.bg-shadeBottom {
    background-image: linear-gradient(rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 1));
    color: #ffffff;
}
.bg-red.light {
    color: #e54d42;
    background-color: #fadbd9;
}
.bg-orange.light {
    color: #f37b1d;
    background-color: #fde6d2;
}
.bg-yellow.light {
    color: #fbbd08;
    background-color: #fef2ced2;
}
.bg-olive.light {
    color: #8dc63f;
    background-color: #e8f4d9;
}
.bg-green.light {
    color: #39b54a;
    background-color: #d7f0dbff;
}
.bg-cyan.light {
    color: #1cbbb4;
    background-color: #d2f1f0;
}
.bg-blue.light {
    color: #0081ff;
    background-color: #cce6ff;
}
.bg-purple.light {
    color: #6739b6;
    background-color: #e1d7f0;
}
.bg-mauve.light {
    color: #9c26b0;
    background-color: #ebd4ef;
}
.bg-pink.light {
    color: #e03997;
    background-color: #f9d7ea;
}
.bg-brown.light {
    color: #a5673f;
    background-color: #ede1d9;
}
.bg-grey.light {
    color: #8799a3;
    background-color: #e7ebed;
}
.bg-gradual-red {
    background-image: linear-gradient(45deg, #f43f3b, #ec008c);
    color: #ffffff;
}
.bg-gradual-orange {
    background-image: linear-gradient(45deg, #ff9700, #ed1c24);
    color: #ffffff;
}
.bg-gradual-green {
    background-image: linear-gradient(45deg, #39b54a, #8dc63f);
    color: #ffffff;
}
.bg-gradual-purple {
    background-image: linear-gradient(45deg, #9000ff, #5e00ff);
    color: #ffffff;
}
.bg-gradual-pink {
    background-image: linear-gradient(45deg, #ec008c, #6739b6);
    color: #ffffff;
}
.bg-gradual-blue {
    background-image: linear-gradient(45deg, #0081ff, #1cbbb4);
    color: #ffffff;
}
.shadow[class*="-red"] {
    box-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);
}
.shadow[class*="-orange"] {
    box-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);
}
.shadow[class*="-yellow"] {
    box-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);
}
.shadow[class*="-olive"] {
    box-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);
}
.shadow[class*="-green"] {
    box-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);
}
.shadow[class*="-cyan"] {
    box-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);
}
.shadow[class*="-blue"] {
    box-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);
}
.shadow[class*="-purple"] {
    box-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);
}
.shadow[class*="-mauve"] {
    box-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);
}
.shadow[class*="-pink"] {
    box-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);
}
.shadow[class*="-brown"] {
    box-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);
}
.shadow[class*="-grey"] {
    box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
}
.shadow[class*="-gray"] {
    box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
}
.shadow[class*="-black"] {
    box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
}
.shadow[class*="-white"] {
    box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
}
.text-shadow[class*="-red"] {
    text-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);
}
.text-shadow[class*="-orange"] {
    text-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);
}
.text-shadow[class*="-yellow"] {
    text-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);
}
.text-shadow[class*="-olive"] {
    text-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);
}
.text-shadow[class*="-green"] {
    text-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);
}
.text-shadow[class*="-cyan"] {
    text-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);
}
.text-shadow[class*="-blue"] {
    text-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);
}
.text-shadow[class*="-purple"] {
    text-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);
}
.text-shadow[class*="-mauve"] {
    text-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);
}
.text-shadow[class*="-pink"] {
    text-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);
}
.text-shadow[class*="-brown"] {
    text-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);
}
.text-shadow[class*="-grey"] {
    text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
}
.text-shadow[class*="-gray"] {
    text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
}
.text-shadow[class*="-black"] {
    text-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
}
.bg-img {
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
}
.bg-mask {
    background-color: #333333;
    position: relative;
}
.bg-mask::after {
    content: "";
    border-radius: inherit;
    width: 100%;
    height: 100%;
    display: block;
    background-color: rgba(0, 0, 0, 0.4);
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    top: 0;
}
.bg-mask view,
.bg-mask cover-view {
    z-index: 5;
    position: relative;
}
.bg-video {
    position: relative;
}
.bg-video video {
    display: block;
    height: 100%;
    width: 100%;
    -o-object-fit: cover;
    object-fit: cover;
    position: absolute;
    top: 0;
    z-index: 0;
    pointer-events: none;
}
/* ==================
          æ–‡æœ¬
 ==================== */
.text-xs {
    font-size: 20upx;
}
.text-sm {
    font-size: 24upx;
}
.text-df {
    font-size: 28upx;
}
.text-lg {
    font-size: 32upx;
}
.text-xl {
    font-size: 36upx;
}
.text-xxl {
    font-size: 44upx;
}
.text-sl {
    font-size: 80upx;
}
.text-xsl {
    font-size: 120upx;
}
.text-Abc {
    text-transform: Capitalize;
}
.text-ABC {
    text-transform: Uppercase;
}
.text-abc {
    text-transform: Lowercase;
}
.text-price::before {
    content: "Â¥";
    font-size: 80%;
    margin-right: 4upx;
}
.text-cut {
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}
.text-bold {
    font-weight: bold;
}
.text-center {
    text-align: center;
}
.text-content {
    line-height: 1.6;
}
.text-left {
    text-align: left;
}
.text-right {
    text-align: right;
}
.text-red,
.line-red,
.lines-red {
    color: #e54d42;
}
.text-orange,
.line-orange,
.lines-orange {
    color: #f37b1d;
}
.text-yellow,
.line-yellow,
.lines-yellow {
    color: #fbbd08;
}
.text-olive,
.line-olive,
.lines-olive {
    color: #8dc63f;
}
.text-green,
.line-green,
.lines-green {
    color: #39b54a;
}
.text-cyan,
.line-cyan,
.lines-cyan {
    color: #1cbbb4;
}
.text-blue,
.line-blue,
.lines-blue {
    color: #0081ff;
}
.text-purple,
.line-purple,
.lines-purple {
    color: #6739b6;
}
.text-mauve,
.line-mauve,
.lines-mauve {
    color: #9c26b0;
}
.text-pink,
.line-pink,
.lines-pink {
    color: #e03997;
}
.text-brown,
.line-brown,
.lines-brown {
    color: #a5673f;
}
.text-grey,
.line-grey,
.lines-grey {
    color: #8799a3;
}
.text-gray,
.line-gray,
.lines-gray {
    color: #aaaaaa;
}
.text-black,
.line-black,
.lines-black {
    color: #333333;
}
.text-white,
.line-white,
.lines-white {
    color: #ffffff;
}
LA24030_LuLiPackageLine_Pda/components/BottomModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
<template>
    <view class="cu-modal bottom-modal" :class="BottomModal?'show':''">
        <view class="cu-dialog" :style="'height:'+cudiaheight+'rpx'">
            <view v-if="hidshow" class="cu-bar bg-white">
                <view class="action text-green" @click="$emit('submit')">{{modaltitle}}</view>
                <view class="action text-blue fontSize32rpx" @tap="$emit('hideModal')">取消</view>
            </view>
            <view v-if="inputshow" class="cu-bar bg-white">
                <view style="margin-bottom: 5px;height: 45px;"
                    class="width background_fff border_top_F2F2F2 flex align-center justify-between border_bottom_fff ">
                    <view class="width70  flex align-center">
                        <text class="fontSize42rpx margin_left10rpx iconfont icon-tiaomashuru"></text>
                        <slot name='serinput'></slot>
                    </view>
                    <view @tap="$emit('hideModal');" class="margin_right30rpx fontSize32rpx color_1989FA ">
                        å–消
                    </view>
                </view>
            </view>
            <view class="padding-xl">
                <slot name="content"></slot>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        name:"BottomModal",
        data() {
            return {
                sacncode:''
            };
        },
        props:{
            hidshow:{
                type:Boolean,
                default:true
            },
            inputshow:{
                type:Boolean,
                default:false
            },
            BottomModal:{
                type:Boolean,
                default:false
            },
            focusshow:{
                type:Boolean,
                default:true
            },
            cudiaheight:{
                type:String,
                default:'200'
            },
            placeholder:{
                type:String,
                default:''
            },
            modaltitle:{
                type:String,
                default:'确认'
            }
        },
        methods:{
            butonchange(e){
                console.log(e)
                this.sacncode=e.target.value
                this.$emit('butonchange',e.target.value)
            },
            endsacn(){
                this.sacncode=''
            },
            doSearch(e){
                this.sacncode=e.target.value
                this.$emit('doSearch',e.target.value)
            },
            qkseach(){
                console.log(789456464)
                this.sacncode=''
            }
        }
    }
</script>
<style lang="scss">
</style>
LA24030_LuLiPackageLine_Pda/components/CuModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
<template>
    <view class="cu-modal" :class="modalshow?'show':''">
        <view class="cu-dialog" >
            <view class="cu-bar bg-white justify-end">
                <view class="content">{{placeholder}}</view>
                <view class="action" @tap="$emit('hideModal')">
                    <text class="iconfont icon-guanbi text-red"></text>
                </view>
            </view>
            <view class="padding-xl">
                <slot name="modal"></slot>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        name:"CuModal",
        data() {
            return {
                show:false
            };
        },
        props:{
            modalshow:{
                type:Boolean,
                default:false
            },
            placeholder:{
                type:String,
                default:''
            }
        },
        methods:{
            hideModal(){
            }
        }
    }
</script>
<style lang="scss">
</style>
LA24030_LuLiPackageLine_Pda/components/LeftModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
<template>
    <view class="cu-modal drawer-modal justify-start" :class="DrawerModalL?'show':''" @click="$emit('hindle')">
        <view class="cu-dialog basis-lg" @tap.stop="" :style="[{top:CustomBar+'px',height:'calc(100vh - ' + CustomBar + 'px)'}]" >
            <view class="cu-list menu text-left">
                <slot name="modalcontent"></slot>
            </view>
        </view>
    </view>
</template>
<script>
    export default {
        name:"LeftModal",
        data() {
            return {
                modalName:false,
            };
        },
        props:{
            DrawerModalL:{
                type:Boolean,
                default:false
            }
        },
    }
</script>
<style lang="scss">
</style>
LA24030_LuLiPackageLine_Pda/components/Loding.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
<template>
    <view class="cu-load load-modal" v-if="loadModal">
        <image src="/static/logo.png" mode="aspectFit"></image>
        <view class="gray-text">加载中...</view>
    </view>
</template>
<script>
    export default {
        name:"Loding",
        data() {
            return {
            };
        },
        props:{
            loadModal:{
                type:Boolean,
                default:false
            }
        }
    }
</script>
<style lang="scss">
</style>
LA24030_LuLiPackageLine_Pda/components/ModalCode.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,85 @@
<template>
    <u-modal v-model="show" :show-confirm-button="false" :mask-close-able="!showBtn" :show-cancel-button="false"
        confirm-text="" :show-title="false" @tap="close">
        <view class="slot-content text_align_center flex align-center justify-center align-center"
            style="min-height: 500rpx;">
            <view class="margin_auto padding5_10">
                    <view :class="rescode == 200?'succeicon':'erroricon'"
                    class="margin_auto margin_bottom25rpx"
                    style="width: 250rpx;height: 200rpx;"
                    >
                    </view>
                <!-- </view> -->
                <view class="fontSize38rpx padding15 flex justify-center boxRwd"
                style="width: 450rpx;">
                    {{ resmessage }}
                </view>
                <br>
                <!-- <button v-if="showBtn" class="width95 color_1989FA" @click="close(1)">关闭</button> -->
                <!-- <br> -->
                <!-- <button v-if="showBtn" class="width95 bg-f18202" @click="$emit('goYuKu')">越库</button> -->
            </view>
        </view>
    </u-modal>
</template>
<script>
    export default {
        data() {
            return {
                show: false
            }
        },
        props: {
            rescode: {
                type: [String, Number],
                default: 0
            },
            resmessage: {
                type: [String, Object],
                default: ''
            },
            showBtn: {
                type: [String, Number],
                default: 0
            },
            // show: {
            //     type: Boolean,
            //     default: false
            // }
        },
        methods: {
            close(param){
                if(this.showBtn==1 && !param){
                    return
                }
                this.show = false
            }
        }
    }
</script>
<style lang="scss">
    .modalcode {
        width: 94%;
        margin: auto;
        margin-top: 10px;
        border-radius: 6px;
        box-shadow: 0 0 4px #d4dde5;
    }
    .succeicon {
        background-image: url("../static/modal/success.png");
        background-size: cover;
    }
    .erroricon {
        background-image: url("../static/modal/error.png");
        background-size: cover;
    }
    .boxRwd{
        word-wrap: break-word;
    display: inline-block;
    }
</style>
LA24030_LuLiPackageLine_Pda/components/MsiUpload.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
<template>
    <view>
        <u-upload :action="action" :file-list="fileList" :max-count="count" :header="header" ref="uploadRef"></u-upload>
    </view>
</template>
<script>
    export default {
        name:"MsiUpload",
        props: {
            action: {type: String,required: true},
            count: {type: Number,default: 1},
        },
        data() {
            return {
                header: {Authorization: ''}
            };
        },
        onLoad(){
            this.header.Authorization = 'Bearer ' + uni.getStorageSync('token');
        },
        methods: {
            submit() {
                this.$refs.uploadRef.submit();
            }
        }
    }
</script>
<style>
</style>
LA24030_LuLiPackageLine_Pda/components/ScanCode.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
<template>
    <view class="width background_fff border_top_F2F2F2 flex align-center justify-between border_bottom_fff padding_surround">
        <view class="width70  flex align-center">
            <text class="fontSize32rpx margin_right10rpx iconfont icon-bar-code"></text>
            <input class="fontSize40rpx width" :focus="renamefocus" @focus='focuss' v-model="sacncode" @input="changeinput" @confirm="inputchange"
            type="text" :placeholder="placeholder" />
        </view>
        <button style="padding: 0;background-color: unset;line-height: unset;border: unset;"
        class="margin_right30rpx fontSize60rpx color_1989FA iconfont icon-saoma"
         @click="tel()"></button>
    </view>
</template>
<script>
    // import {mixin} from '../utils/mixin.js'
    export default {
        name:"ScanCode",
        data() {
            return {
                renamefocus:true,//获取焦点
                sacncode:null,
                changecode:null
                };
        },
        // mixins:[mixin],
        props:{
            renameFocus:{
                type:Boolean,
                default:true
            },
            placeholder:{
                type:String,
                default:'请扫描盛具编码'
            }
        },
        onShow() {
            // setTimeout(() => {
            //     // åŠæ¯«ç§’后软键盘隐藏
            //     uni.hideKeyboard()
            // }, 10)
        },
        watch:{
            renameFocus:{
                handler(nv,ov){
                    this.renamefocus=nv
                },
                deep:true
            }
        },
        methods:{
            focuss() {
                // uni.hideKeyboard()
            },
            //扫码
            inputchange(event){
                uni.hideKeyboard()
                this.sacncode=event.target.value
                this.$emit('scancode',this.sacncode)
            },
            //模糊查询
            changeinput(event){
                // uni.hideKeyboard()
                this.changecode=event.target.value
                this.$emit('changecode',this.changecode)
            },
            //调用摄像头扫码
            tel(){
                // uni.scanCode({
                //     success:function(res){
                //         this.sacncode=JSON.stringify(res)
                //             console.log(JSON.stringify(res));
                //         },
                //         fail(res) {
                //             console.log(res)
                //         }
                // });
            },
            clearinquer(event){
                // setTimeout(()=>{
                    this.sacncode=''
                    // this.renamefocus=true
                    uni.hideKeyboard()
                // },500)
            }
        }
    }
</script>
<style lang="scss">
.uni-button{
    padding: 0 !important;
}
</style>
LA24030_LuLiPackageLine_Pda/components/SelectList.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
<template>
    <view class="width background_fff border_top_F2F2F2 flex align-center justify-between border_bottom_fff padding_surround">
        <view class="width70  flex align-center">
            <text class=" margin_right10rpx iconfont icon-chaxun"></text>
            <input class="fontSize32rpx width"  disabled
            type="text" :placeholder="placeholder" @click="inputchange" />
        </view>
        <!-- <text class=" margin_right30rpx iconfont icon-zelvxuanzefeiyongzhengsanjiaoxingzhichi"
            :class="modalshow?'transition_rotate180':'transition_rotate0'"
        ></text> -->
        <cu-modal placeholder='工单编号' :modalshow='modalshow' @hideModal='inputchange' />
    </view>
</template>
<script>
    export default {
        name:"SelectList",
        data() {
            return {
                modalshow:false
            };
        },
        props:{
            placeholder:{
                type:String,
                default:'请选择工单编号'
            }
        },
        methods:{
            inputchange(){
                this.modalshow=!this.modalshow
            }
        }
    }
</script>
<style lang="scss">
</style>
LA24030_LuLiPackageLine_Pda/components/blue.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
<template>
    <view>
        <view class="border margin_top30rpx">
            <h2 class="text_align_center padding_bottom18 padding15 margin_bottom10rpx">选择打印驱动</h2>
            <scroll-view scroll-y="true" style="height: 150rpx;">
                <view style="margin-top: 30upx;" :key="index" v-for="(item,index) in list">
                    <button style="width: 400upx; color: #f18202;background-color: #fff;border: 1px solid #f18202;"
                        @click="longpress(item,index)"
                        :class="active==index?'bg-f18202':'color_f18202 border_1989FA'">{{item.name}}</button>
                </view>
                <view style="margin-top: 30upx;height: 130rpx;" v-if='list.length==0'>
                    <button
                        style="width: 600upx; color: #f18202;background-color: #fff;border: 1px solid #f18202;">暂无驱动</button>
                </view>
            </scroll-view>
            <u-form :model="ware" ref="wareRef" v-if="numberShow" style='border-top: 1px solid #e4e4e4;'>
                <u-row>
                    <u-col span="12">
                        <u-form-item label="打印数量:" prop="num" required label-width='150'
                            class='margin_left30rpx font_weight_bold'>
                            <input v-model="printNum" placeholder="请输入打印数量"  class='width'
                                style="margin-left: 30rpx;text-align: right;">
                            </input>
                        </u-form-item>
                    </u-col>
                </u-row>
            </u-form>
        </view>
        <view class="flex justify-around transition margin_bottom30rpx margin_top30rpx">
            <button class="width25 bg-grey" @click="$emit('back')">上一步</button>
            <button class="width70  bg-f18202 color_F2F2F2" @click="writeBLECharacteristicValue">打印</button>
        </view>
    </view>
</template>
<script>
    import mixBule from '@/mixins/Blue.js'
    export default {
        mixins: [mixBule],
        data() {
            return {
                list: [],
                active: null,
                printNum:'',
                ware: {
                    num: ''
                },
                wareRules: {
                    num: [{
                        required: true,
                        message: '打印数量不能为空',
                        trigger: 'blur'
                    }]
                }
            }
        },
        props: {
            numberShow: {
                type: Boolean,
                default: false
            },
            printlist: {
                type: Object,
                default:{}
            }
        },
        onReady() {
            this.$refs.wareRef.setRules(this.wareRules)
        },
        created() {
            this.tomy()
            this.openBluetoothAdapter()
        },
        mounted() {
            // console.log(this.printlist)
        },
        methods: {
        }
    }
</script>
<style>
</style>
LA24030_LuLiPackageLine_Pda/components/buttonModal.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
<template>
    <view class="width height140rpx fixed transformX left50 bottom0 background_fff padding40_0">
        <button v-if="singforShow" :disabled="disabled" class=" width90  bg-blue transition"
            @click="$emit('submit')">{{singfoTitle}}</button>
        <view v-if="garmenShow" class="flex justify-around   transition">
            <button class="width70 bg-f18202 color_F2F2F2" @click="$emit('submit')">{{garmenTitle}}</button>
            <button class="width25 bg-grey" @click="$emit('reset')">重置</button>
        </view>
        <view v-if="subShow" class="flex justify-around transition" style="padding-top: 10rpx;">
            <button class="width95 bg-f18202" @click="$emit('submit')">{{garmenTitle}}</button>
        </view>
        <view v-if="empTytowerShow" class="flex justify-around transition">
            <button class="width45 bg-grey" @click="$emit('reset')">{{cleaningTitle}}</button>
            <button class="width45  bg-f18202 color_F2F2F2" @click="$emit('submit')">{{garmenTitle}}</button>
        </view>
        <view v-if="cleaningShow" class="flex justify-around transition">
            <button class="width45  bg-grey" @click="$emit('allsubmit')">{{allTitle}}</button>
            <button class="width45 bg-f18202 color_F2F2F2" @click="$emit('submit')">{{cleaningTitle}}</button>
        </view>
        <view v-if="printShow" class="flex justify-around transition">
            <button class="width45 bg-f18202" @click="$emit('submit')">{{garmenTitle}}</button>
            <button class="width25 bg-ffe6c9" @click="$emit('print')">打印</button>
            <button class="width25 bg-grey" @click="$emit('reset')">重置</button>
        </view>
        <view v-if="issueShow" class="flex justify-around transition">
            <button class="width33 bg-ffe6c9 " @click="$emit('issue')">{{issueTitle}}</button>
            <button class="width33 bg-grey" @click="$emit('reset')">{{restTiltle}}</button>
            <button class="width25 bg-f18202 color_F2F2F2" @click="$emit('submit')">{{subTitle}}</button>
        </view>
    </view>
</template>
<script>
    export default {
        name: "buttonModal",
        data() {
            return {
            };
        },
        props: {
            singforShow: {
                type: Boolean,
                default: false
            },
            empTytowerShow: {
                type: Boolean,
                default: false
            },
            disabled: {
                type: Boolean,
                default: false
            },
            garmenShow: {
                type: Boolean,
                default: false
            },
            subShow: {
                type: Boolean,
                default: false
            },
            cleaningShow: {
                type: Boolean,
                default: false
            },
            printShow: {
                type: Boolean,
                default: false
            },
            issueShow: {
                type: Boolean,
                default: false
            },
            garmenTitle: {
                type: String,
                defaultr: '下线绑定'
            },
            singfoTitle: {
                type: String,
                default: '签收'
            },
            resetTitle: {
                type: String,
                default: '全部删除'
            },
            allTitle: {
                type: String,
                defaultr: '全部出库'
            },
            cleaningTitle: {
                type: String,
                defaultr: '出库'
            },
            issueTitle: {
                type: String,
                defaultr: '问题标记'
            },
            restTiltle: {
                type: String,
                defaultr: '重置'
            },
            subTitle: {
                type: String,
                defaultr: '确定'
            },
        }
    }
</script>
<style lang="scss" scoped>
// uni-button{
//     // font-size: 16px !important;
// }
</style>
LA24030_LuLiPackageLine_Pda/components/cascader.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,538 @@
<template>
    <view>
        <u-popup v-model="showPop" mode="bottom">
            <view class="cascader-head">
                <text class="cancel" @click="cancelSelect">取消</text>
                <text class="title">请选择</text>
                <text class="confirem" @click="confiremSelect">确定</text>
            </view>
            <view class="cascader">
                <scroll-view class="item" style="width: 300rpx;" scroll-y="true">
                    <view class="item-block" v-for="(item, index) in selectData" :key="index" v-if="selectData.length > 0"
                        :style="{ 'background': current == index ? 'white' : '#f8f8f8', 'color': current == index ? '#f44c01' : '#333333' }"
                        @click="selectOne(index,item)">
                        <view style="flex: 1;">
                            <text>{{ item.name }}</text>
                        </view>
                    </view>
                </scroll-view>
                <scroll-view class="item" style="background-color: white;" scroll-y="true">
                    <block v-if="selectData.length > 0 && selectData[current].children.length > 0">
                        <view class="item-cont" v-for="(item, index) in selectData[current].children" :key="index">
                            <view class="item-cate" @click="selectTwo(item, index)">
                                <text class="title" :style="{ 'color': item.active ? '#f44c01' : '#333333' }">{{
                                    item.name || '空机床号'}}</text>
                                <u-icon v-if="item.active" name="checkmark" color="#f44c01" size="28"></u-icon>
                            </view>
                            <view class="item-cellbox" v-if="item.children && item.children.length > 0">
                                <text class="item-cell" v-for="(it, ix) in item.children" :key="ix"
                                    @click="selectTree(index, it, ix)"
                                    v-bind:style="{ color: it.active ? '#ffffff' : '#666666', background: it.active ? 'red' : '#f8f8f8' }">{{
                                        it.name }} </text>
                            </view>
                        </view>
                    </block>
                </scroll-view>
            </view>
        </u-popup>
    </view>
</template>
<script>
import { selectOneQuery, selectTwoQuery,selectTwoQueryDelivery, selectThereQuery } from '../api/sort.js'
export default {
    name: 'cascader',
    props: {
        activeIndex: {
            type: Number,
            default: 0
        },
        cascaderShow: {
            type: Boolean,
            default: false,
        },
        //开启一级选择
        oneSelect: {
            type: Boolean,
            default: true,
        },
        //开启二级选择
        twoSelect: {
            type: Boolean,
            default: true,
        },
        //label展示字段
        labelName: {
            type: String,
            default: 'name'
        },
        //value选中字段
        valueName: {
            type: String,
            default: 'id'
        },
        //初始选中值
        selectValue: {
            type: Array,
            default: () => {
                return [];
            }
        },
        //选择数据
        cascaderData: {
            type: Array,
            default: () => {
                return [];
            }
        },
        titleData: {
            type: Object,
            default: () => {
                return {};
            }
        }
    },
    data() {
        return {
            current: this.activeIndex,
            showPop: this.cascaderShow,
            selectDataCopy: JSON.parse(JSON.stringify(this.cascaderData)),
            selectData: JSON.parse(JSON.stringify(this.cascaderData)),
            paramD : {}
        }
    },
    watch: {
        cascaderData(val, oldVal) {
            this.selectData = JSON.parse(JSON.stringify(val));
        }
    },
    mounted() {
        // this.defaultSelect()
    },
    methods: {
        // åˆå§‹åŒ–选中
        defaultSelect() {
            let selectData = this.selectData;
            console.log(this.selectValue)
            for (let i = 0; i < this.selectValue.length; i++) {
                for (let y = 0; y < selectData.length; y++) {
                    if (selectData[y][this.valueName] == this.selectValue[i]) {
                        selectData[y].active = true;
                        break;
                    } else {
                        for (let x = 0; x < selectData[y].children.length; x++) {
                            if (selectData[y].children[x][this.valueName] == this.selectValue[i]) {
                                selectData[y].children[x].active = true;
                                selectData[y].child_active = true;
                                break;
                            } else {
                                for (let z = 0; z < selectData[y].children[x].children.length; z++) {
                                    if (selectData[y].children[x].children[x][this.valueName] == this.selectValue[i]) {
                                        selectData[y].children[x].children[x].active = true;
                                        selectData[y].child_active = true;
                                        selectData[y].children[x].child_active = true;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return;
        },
        show(pram) {
            this.showPop = true;
            this.paramD = pram
            // this.defaultSelect()
            // if (this.selectData.length > 0) {
            //     return
            // }
            // èŽ·å–1级数据 0712
            selectOneQuery(pram).then((res) => {
                if (res.code == 200) {
                        // æµ‹è¯•
                    // if(res.data.length==0){
                    //     res.data = ['gx12','gx23']
                    // }
                    let arr = []
                    if(res.data.length>0){
                            res.data.map((item,index)=>{
                                if(item =='' || item == null){
                                    return
                                }
                                arr.push({
                                    id: item,
                                    name: item,
                                    children: []
                                })
                            })
                        this.selectData = arr
                        this.getTwoData(0,this.selectData[0],pram)
                        this.current = 0
                    }
                }
            }).catch((err)=>{
                this.showPop = false
            })
        },
        // èŽ·å–äºŒçº§æ•°æ®
        getTwoData(index,item) {
            if (this.selectData[index].children.length <= 0) {
                let fnName = selectTwoQuery     // åˆ†æ‹£-查工序机床号
                if(this.titleData.typeInterface && this.titleData.typeInterface=='KingtingDo'){
                    fnName = selectTwoQueryDelivery     // kitting发货-查工序机床号
                }
                fnName({
                    'process': item.id,
                    'locationType':this.titleData.locationType, // 1:A3区域,2:A1-A2区域
                    'type':this.titleData.type,
                    ...this.paramD
                }).then((res) => {
                    if (res.code == 200) {
                            // æµ‹è¯•
                        // if(res.data.length==0){
                            // res.data = ['jq12','jq23','jq23','jq23','jq23','jq23','jq23','jq23last']
                        // }
                        let arr = []
                        if(res.data.length>0){
                            res.data.map((item,index)=>{
                                arr.push({
                                    id: item,
                                    name: item,
                                    children: []
                                })
                            })
                            this.selectData[index].children = arr
                        }
                    }
                }).catch(()=>{
                    this.showPop = false
                })
            }
        },
        // èŽ·å–3级数据
        getThereData(index,item) {
            console.log("selectTwo")
            if (this.selectData[this.current].children[index].children.length <= 0) {
                selectThereQuery({
                    'process': this.selectData[this.current].id,
                    "equipmentList": [item.id],
                    'locationType':this.titleData.locationType, // 1:A3区域,2:A1-A2区域
                    'type':this.titleData.type
                }).then((res) => {
                    if (res.code == 200) {
                        // æµ‹è¯•
                        // if(res.data.length==0){
                            // res.data = ['kwh12','kwh23','kwh23','kwh23','kwh23','kwh23','kwh23','kwh23','kwh23']
                        // }
                        let arr = []
                        if(res.data.length>0){
                            res.data.map((item,index)=>{
                                arr.push({
                                    id: item,
                                    name: item
                                })
                            })
                            this.selectData[this.current].children[index].children = arr
                        }
                    }
                }).catch(()=>{
                    this.showPop = false
                })
            }
        },
        hide() {
            this.showPop = false;
        },
        checkboxChange(e, index) {
            let oneData = this.selectData[index];
            oneData.active = e.value;
            this.$set(this.selectData, index, oneData);
        },
        selectOne(index,item) {
            console.log("selectOne")
            this.current = index;
            // æ¸…空所有选中的库位
            this.selectData.map((it)=>{
                if(it.children&&it.children.length>0){
                    it.children.map((itInner)=>{
                        itInner.active = false
                        if(itInner.children&&itInner.children.length>0){
                            itInner.children.map((itInner2)=>{
                                itInner2.active = false
                            })
                        }
                    })
                }
            })
            // end清空所有选中的库位
            this.getTwoData(index,item)    // èŽ·å–äºŒçº§æ•°æ®
        },
        selectTwo(item, index) {
            // this.getThereData(index,item)
            if (!this.twoSelect) return;
            let twoData = this.selectData[this.current];
            if (twoData.children[index].active) {
                twoData.children[index] = {
                    ...item,
                    active: false
                };
                //判断兄弟中是否已无选中
                let status = false;
                twoData.children.map((cell) => {
                    if (cell.active) {
                        status = true;
                    }
                    if (cell.children && cell.children.length > 0) {
                        cell.children.map((it) => {
                            if (it.active) {
                                status = true;
                            }
                        })
                    }
                })
                if (!status) {
                    twoData.child_active = false;
                }
            } else {
                twoData.children[index] = {
                    ...item,
                    active: true
                };
                twoData.child_active = true;
            }
            this.$set(this.selectData, this.current, twoData);
        },
        selectTree(Pindex, item, index) {
            console.log(this.selectData)
            let twoData = this.selectData[this.current];
            let treeData = twoData.children[Pindex];
            if (treeData.children[index].active) {
                treeData.children[index] = {
                    ...item,
                    active: false
                };
                //判断兄弟中是否已无选中
                let status = false;
                treeData.children.map((cell) => {
                    if (cell.active) {
                        status = true;
                    }
                })
                if (!status) {
                    treeData.child_active = false;
                }
                //查找父级下面是否有选中项
                let pstatus = false;
                twoData.children.map((cell) => {
                    if (cell.active) {
                        pstatus = true;
                    }
                    cell.children.map((it) => {
                        if (it.active) {
                            pstatus = true;
                        }
                    })
                })
                if (!pstatus) {
                    twoData.child_active = false;
                }
            } else {
                // å•选
                treeData.children.forEach((item)=>{
                    item.active = false
                })
                // end单选
                treeData.children[index] = {
                    ...item,
                    active: true
                };
                //标识父级下面选中
                treeData.child_active = true;
                twoData.child_active = true;
            }
            this.$set(this.selectData, this.current, twoData);
        },
        cancelSelect() {
            this.selectData = JSON.parse(JSON.stringify(this.selectDataCopy))
            this.showPop = false;
        },
        // ç¡®è®¤
        confiremSelect() {
            let data = this.selectData;
            let select_ids = [];
            let select_names = [];
            let equipmentList = [];
            data.map((item, index) => {
                if (item.active) {
                    select_ids.push(item[this.valueName]);
                    select_names.push(item[this.labelName]);
                }
                if (item.children && item.children.length > 0) {
                    item.children.map((it, ix) => {
                        if(it.child_active){
                            equipmentList.push(it.id)
                        }
                        if (it.active) {
                            select_ids.push(it[this.valueName]);
                            select_names.push(it[this.labelName]);
                        }
                        if (it.children && it.children.length > 0) {
                            it.children.map((itc, ixc) => {
                                if (itc.active) {
                                    select_ids.push(itc[this.valueName]);
                                    select_names.push(itc[this.labelName]);
                                }
                            })
                        }
                    })
                }
            })
            let select_ids2=Array.from(new Set(select_ids));//去重
            let select_names2=Array.from(new Set(select_names));//去重
            // å•选
            console.log(select_ids2.length)
            // if(select_ids2.length<=0){
            //     uni.showToast({
            //         title: '请选择机床号',
            //         icon: 'none',
            //         duration: 2000
            //     });
            //     return
            // }
            // if(select_ids2.length!=1){
            //     uni.showToast({
            //         title: '不同机器,只能选一个相同的库位编号',
            //         icon: 'none',
            //         duration: 2000
            //     });
            //     return
            // }
            this.$emit('confirem', {
                // select_ids: select_ids2,
                // select_names: select_names2,
                process:this.selectData[this.current].id,
                // equipmentList:equipmentList
                equipmentList:select_ids2
            });
            this.showPop = false;
        }
    }
}
</script>
<style lang="scss" scoped>
.cascader-head {
    height: 100rpx;
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    padding: 0 30rpx;
    border-bottom: 1rpx solid #e6e6e6;
    .cancel {
        font-size: 30rpx;
        color: #666666;
    }
    .title {
        font-size: 30rpx;
        color: #333333;
    }
    .confirem {
        font-size: 30rpx;
        color: #666666;
    }
}
.cascader {
    display: flex;
    flex-direction: row;
    height: 400px;
    background-color: #F8F8F8;
    .item {
        height: 400px;
        .item-block {
            display: flex;
            flex-direction: row;
            align-items: center;
            height: 50px;
            padding: 10px;
            font-size: 14px;
            color: #333333;
        }
        .item-list {
            display: flex;
            flex-direction: row;
            align-items: center;
            height: 50px;
            border-bottom: 1rpx solid #e6e6e6;
            padding: 0 10px;
        }
        .item-cont {
            display: flex;
            flex-direction: column;
            padding: 10px;
            .item-cate {
                border-bottom: 1rpx solid #e6e6e6;
                padding: 10px 0;
                display: flex;
                flex-direction: row;
                align-items: center;
                justify-content: space-between;
                .title {
                    font-size: 15px;
                    color: #333333;
                }
            }
            .item-cellbox {
                display: flex;
                flex-direction: row;
                align-items: center;
                flex-wrap: wrap;
                .item-cell {
                    width: 80px;
                    height: 30px;
                    display: flex;
                    flex-direction: row;
                    align-items: center;
                    justify-content: center;
                    background-color: #F8F8F8;
                    margin-right: 8px;
                    font-size: 14px;
                    color: #666666;
                    margin-top: 10px;
                    border-radius: 5px;
                }
            }
            .active {
                color: '#ffffff';
                background: '#fa3534';
            }
        }
    }
}
</style>
LA24030_LuLiPackageLine_Pda/components/cascader2.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,551 @@
<!-- ä»…供取货页面使用 -->
<template>
    <view>
        <u-popup v-model="showPop" mode="bottom">
            <view class="cascader-head">
                <text class="cancel" @click="cancelSelect">取消</text>
                <text class="title">请选择</text>
                <text class="confirem" @click="confiremSelect">确定</text>
            </view>
            <view class="cascader">
                <scroll-view class="item" style="width: 300rpx;" scroll-y="true">
                    <view class="item-block" v-for="(item, index) in selectData" :key="index" v-if="selectData.length > 0"
                        :style="{ 'background': current == index ? 'white' : '#f8f8f8', 'color': current == index ? '#f44c01' : '#333333' }"
                        @click="selectOne(index,item)">
                        <view style="flex: 1;">
                            <text>{{ item.name }}</text>
                        </view>
                    </view>
                </scroll-view>
                <scroll-view class="item" style="background-color: white;" scroll-y="true">
                    <block v-if="selectData.length > 0 && selectData[current].children.length > 0">
                        <view class="item-cont" v-for="(item, index) in selectData[current].children" :key="index">
                            <view class="item-cate" @click="selectTwo(item, index)">
                                <text class="title" :style="{ 'color': item.active ? '#f44c01' : '#333333' }">{{
                                    item.name || '空机床号'}}</text>
                                <u-icon v-if="item.active" name="checkmark" color="#f44c01" size="28"></u-icon>
                            </view>
                            <view class="item-cellbox" v-if="item.children && item.children.length > 0">
                                <text class="item-cell" v-for="(it, ix) in item.children" :key="ix"
                                    @click="selectTree(index, it, ix)"
                                    v-bind:style="{ color: it.active ? '#ffffff' : '#666666', background: it.active ? 'red' : '#f8f8f8' }">{{
                                        it.name  }} </text>
                            </view>
                        </view>
                    </block>
                </scroll-view>
            </view>
        </u-popup>
    </view>
</template>
<script>
import { selectOneQuery, selectTwoQuery,selectTwoQueryDelivery, selectThereQuery } from '../api/sort.js'
export default {
    name: 'cascader',
    props: {
        activeIndex: {
            type: Number,
            default: 0
        },
        cascaderShow: {
            type: Boolean,
            default: false,
        },
        //开启一级选择
        oneSelect: {
            type: Boolean,
            default: true,
        },
        //开启二级选择
        twoSelect: {
            type: Boolean,
            default: true,
        },
        //label展示字段
        labelName: {
            type: String,
            default: 'name'
        },
        //value选中字段
        valueName: {
            type: String,
            default: 'id'
        },
        //初始选中值
        selectValue: {
            type: Array,
            default: () => {
                return [];
            }
        },
        //选择数据
        cascaderData: {
            type: Array,
            default: () => {
                return [];
            }
        },
        titleData: {
            type: Object,
            default: () => {
                return {};
            }
        }
    },
    data() {
        return {
            current: this.activeIndex,
            showPop: this.cascaderShow,
            selectDataCopy: JSON.parse(JSON.stringify(this.cascaderData)),
            selectData: JSON.parse(JSON.stringify(this.cascaderData)),
            paramD : {}
        }
    },
    watch: {
        cascaderData(val, oldVal) {
            this.selectData = JSON.parse(JSON.stringify(val));
        }
    },
    mounted() {
        // this.defaultSelect()
    },
    methods: {
        // åˆå§‹åŒ–选中
        defaultSelect() {
            let selectData = this.selectData;
            console.log(this.selectValue)
            for (let i = 0; i < this.selectValue.length; i++) {
                for (let y = 0; y < selectData.length; y++) {
                    if (selectData[y][this.valueName] == this.selectValue[i]) {
                        selectData[y].active = true;
                        break;
                    } else {
                        for (let x = 0; x < selectData[y].children.length; x++) {
                            if (selectData[y].children[x][this.valueName] == this.selectValue[i]) {
                                selectData[y].children[x].active = true;
                                selectData[y].child_active = true;
                                break;
                            } else {
                                for (let z = 0; z < selectData[y].children[x].children.length; z++) {
                                    if (selectData[y].children[x].children[x][this.valueName] == this.selectValue[i]) {
                                        selectData[y].children[x].children[x].active = true;
                                        selectData[y].child_active = true;
                                        selectData[y].children[x].child_active = true;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return;
        },
        show(pram) {
            this.showPop = true;
            this.paramD = pram
            // this.defaultSelect()
            // if (this.selectData.length > 0) {
            //     return
            // }
            this.selectData = [
                {
                    id: '机床号',
                    name: '机床号',
                    children: []
                }
            ]
            this.getTwoData(0,this.selectData[0],pram)
            this.current = 0
            // èŽ·å–1级数据 0712
            // selectOneQuery(pram).then((res) => {
            //     if (res.code == 200) {
            //             // æµ‹è¯•
            //         // if(res.data.length==0){
            //         //     res.data = ['gx12','gx23']
            //         // }
            //         let arr = []
            //         if(res.data.length>0){
            //                 res.data.map((item,index)=>{
            //                     if(item =='' || item == null){
            //                         return
            //                     }
            //                     arr.push({
            //                         id: item,
            //                         name: item,
            //                         children: []
            //                     })
            //                 })
            //                 console.log( 222222222222222222222)
            //                 console.log( arr)
            //             this.selectData = arr
            //             this.getTwoData(0,this.selectData[0],pram)
            //             this.current = 0
            //         }
            //     }
            // }).catch((err)=>{
            //     this.showPop = false
            // })
        },
        // èŽ·å–äºŒçº§æ•°æ®
        getTwoData(index,item) {
            if (this.selectData[index].children.length <= 0) {
                let fnName = selectTwoQuery     // åˆ†æ‹£-查工序机床号
                if(this.titleData.typeInterface && this.titleData.typeInterface=='KingtingDo'){
                    fnName = selectTwoQueryDelivery     // kitting发货-查工序机床号
                }
                fnName({
                    // 'process': item.id,
                    'locationType':this.titleData.locationType, // 1:A3区域,2:A1-A2区域
                    'type':this.titleData.type,
                    ...this.paramD
                }).then((res) => {
                    if (res.code == 200) {
                            // æµ‹è¯•
                        // if(res.data.length==0){
                            // res.data = ['jq12','jq23','jq23','jq23','jq23','jq23','jq23','jq23last']
                        // }
                        let arr = []
                        if(res.data.length>0){
                            res.data.map((item,index)=>{
                                arr.push({
                                    id: item,
                                    name: item,
                                    children: []
                                })
                            })
                            this.selectData[index].children = arr
                        }
                    }
                }).catch(()=>{
                    this.showPop = false
                })
            }
        },
        // èŽ·å–3级数据
        getThereData(index,item) {
            console.log("selectTwo")
            if (this.selectData[this.current].children[index].children.length <= 0) {
                selectThereQuery({
                    'process': this.selectData[this.current].id,
                    "equipmentList": [item.id],
                    'locationType':this.titleData.locationType, // 1:A3区域,2:A1-A2区域
                    'type':this.titleData.type
                }).then((res) => {
                    if (res.code == 200) {
                        // æµ‹è¯•
                        // if(res.data.length==0){
                            // res.data = ['kwh12','kwh23','kwh23','kwh23','kwh23','kwh23','kwh23','kwh23','kwh23']
                        // }
                        let arr = []
                        if(res.data.length>0){
                            res.data.map((item,index)=>{
                                arr.push({
                                    id: item,
                                    name: item
                                })
                            })
                            this.selectData[this.current].children[index].children = arr
                        }
                    }
                }).catch(()=>{
                    this.showPop = false
                })
            }
        },
        hide() {
            this.showPop = false;
        },
        checkboxChange(e, index) {
            let oneData = this.selectData[index];
            oneData.active = e.value;
            this.$set(this.selectData, index, oneData);
        },
        selectOne(index,item) {
            console.log("selectOne")
            this.current = index;
            // æ¸…空所有选中的库位
            this.selectData.map((it)=>{
                if(it.children&&it.children.length>0){
                    it.children.map((itInner)=>{
                        itInner.active = false
                        if(itInner.children&&itInner.children.length>0){
                            itInner.children.map((itInner2)=>{
                                itInner2.active = false
                            })
                        }
                    })
                }
            })
            // end清空所有选中的库位
            this.getTwoData(index,item)    // èŽ·å–äºŒçº§æ•°æ®
        },
        selectTwo(item, index) {
            // this.getThereData(index,item)
            if (!this.twoSelect) return;
            let twoData = this.selectData[this.current];
            if (twoData.children[index].active) {
                twoData.children[index] = {
                    ...item,
                    active: false
                };
                //判断兄弟中是否已无选中
                let status = false;
                twoData.children.map((cell) => {
                    if (cell.active) {
                        status = true;
                    }
                    if (cell.children && cell.children.length > 0) {
                        cell.children.map((it) => {
                            if (it.active) {
                                status = true;
                            }
                        })
                    }
                })
                if (!status) {
                    twoData.child_active = false;
                }
            } else {
                twoData.children[index] = {
                    ...item,
                    active: true
                };
                twoData.child_active = true;
            }
            this.$set(this.selectData, this.current, twoData);
        },
        selectTree(Pindex, item, index) {
            console.log(this.selectData)
            let twoData = this.selectData[this.current];
            let treeData = twoData.children[Pindex];
            if (treeData.children[index].active) {
                treeData.children[index] = {
                    ...item,
                    active: false
                };
                //判断兄弟中是否已无选中
                let status = false;
                treeData.children.map((cell) => {
                    if (cell.active) {
                        status = true;
                    }
                })
                if (!status) {
                    treeData.child_active = false;
                }
                //查找父级下面是否有选中项
                let pstatus = false;
                twoData.children.map((cell) => {
                    if (cell.active) {
                        pstatus = true;
                    }
                    cell.children.map((it) => {
                        if (it.active) {
                            pstatus = true;
                        }
                    })
                })
                if (!pstatus) {
                    twoData.child_active = false;
                }
            } else {
                // å•选
                treeData.children.forEach((item)=>{
                    item.active = false
                })
                // end单选
                treeData.children[index] = {
                    ...item,
                    active: true
                };
                //标识父级下面选中
                treeData.child_active = true;
                twoData.child_active = true;
            }
            this.$set(this.selectData, this.current, twoData);
        },
        cancelSelect() {
            this.selectData = JSON.parse(JSON.stringify(this.selectDataCopy))
            this.showPop = false;
        },
        // ç¡®è®¤
        confiremSelect() {
            let data = this.selectData;
            let select_ids = [];
            let select_names = [];
            let equipmentList = [];
            data.map((item, index) => {
                if (item.active) {
                    select_ids.push(item[this.valueName]);
                    select_names.push(item[this.labelName]);
                }
                if (item.children && item.children.length > 0) {
                    item.children.map((it, ix) => {
                        if(it.child_active){
                            equipmentList.push(it.id)
                        }
                        if (it.active) {
                            select_ids.push(it[this.valueName]);
                            select_names.push(it[this.labelName]);
                        }
                        if (it.children && it.children.length > 0) {
                            it.children.map((itc, ixc) => {
                                if (itc.active) {
                                    select_ids.push(itc[this.valueName]);
                                    select_names.push(itc[this.labelName]);
                                }
                            })
                        }
                    })
                }
            })
            let select_ids2=Array.from(new Set(select_ids));//去重
            let select_names2=Array.from(new Set(select_names));//去重
            // å•选
            console.log(select_ids2.length)
            // if(select_ids2.length<=0){
            //     uni.showToast({
            //         title: '请选择机床号',
            //         icon: 'none',
            //         duration: 2000
            //     });
            //     return
            // }
            // if(select_ids2.length!=1){
            //     uni.showToast({
            //         title: '不同机器,只能选一个相同的库位编号',
            //         icon: 'none',
            //         duration: 2000
            //     });
            //     return
            // }
            this.$emit('confirem', {
                // select_ids: select_ids2,
                // select_names: select_names2,
                process:this.selectData[this.current].id,
                // equipmentList:equipmentList
                equipmentList:select_ids2
            });
            this.showPop = false;
        }
    }
}
</script>
<style lang="scss" scoped>
.cascader-head {
    height: 100rpx;
    display: flex;
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    padding: 0 30rpx;
    border-bottom: 1rpx solid #e6e6e6;
    .cancel {
        font-size: 30rpx;
        color: #666666;
    }
    .title {
        font-size: 30rpx;
        color: #333333;
    }
    .confirem {
        font-size: 30rpx;
        color: #666666;
    }
}
.cascader {
    display: flex;
    flex-direction: row;
    height: 400px;
    background-color: #F8F8F8;
    .item {
        height: 400px;
        .item-block {
            display: flex;
            flex-direction: row;
            align-items: center;
            height: 50px;
            padding: 10px;
            font-size: 14px;
            color: #333333;
        }
        .item-list {
            display: flex;
            flex-direction: row;
            align-items: center;
            height: 50px;
            border-bottom: 1rpx solid #e6e6e6;
            padding: 0 10px;
        }
        .item-cont {
            display: flex;
            flex-direction: column;
            padding: 10px;
            .item-cate {
                border-bottom: 1rpx solid #e6e6e6;
                padding: 10px 0;
                display: flex;
                flex-direction: row;
                align-items: center;
                justify-content: space-between;
                .title {
                    font-size: 15px;
                    color: #333333;
                }
            }
            .item-cellbox {
                display: flex;
                flex-direction: row;
                align-items: center;
                flex-wrap: wrap;
                .item-cell {
                    width: 80px;
                    height: 30px;
                    display: flex;
                    flex-direction: row;
                    align-items: center;
                    justify-content: center;
                    background-color: #F8F8F8;
                    margin-right: 8px;
                    font-size: 14px;
                    color: #666666;
                    margin-top: 10px;
                    border-radius: 5px;
                }
            }
            .active {
                color: '#ffffff';
                background: '#fa3534';
            }
        }
    }
}
</style>
LA24030_LuLiPackageLine_Pda/components/noclick.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
// é˜²æ­¢å¤„理多次点击
function noMultipleClicks(methods, info) {
    // methods是需要点击后需要执行的函数, info是点击需要传的参数
    let that = this;
    if (that.noClick) {
        // ç¬¬ä¸€æ¬¡ç‚¹å‡»
        that.noClick = false;
        if (info && info !== '') {
            // info是执行函数需要传的参数
            methods(info);
        } else {
            methods();
        }
        setTimeout(() => {
            that.noClick = true;
        }, 1500)
    } else {
        // è¿™é‡Œæ˜¯é‡å¤ç‚¹å‡»çš„判断
    }
}
//导出
export default {
    noMultipleClicks, //禁止多次点击
}
LA24030_LuLiPackageLine_Pda/components/print/bluetooth.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,268 @@
class Bluetooth {
    constructor() {
        this.isOpenBle = false;
        this.deviceId = "";
        this.serviceId = "";
        this.writeId = "";
        this.notifyId = "";
        this.openBluetoothAdapter();
    }
    showToast(title) {
        uni.showToast({
            title: title,
            icon: 'none',
            'duration': 2000
        });
    }
    openBluetoothAdapter() {
        return new Promise((resolve, reject) => {
            uni.openBluetoothAdapter({
                success: res => {
                    this.isOpenBle = true;
                    this.showToast("初始化蓝牙模块成功");
                    resolve(res);
                },
                fail: err => {
                    this.showToast(`初始化蓝牙模块失败` + JSON.stringify(err));
                    reject(err);
                },
            });
        });
    }
    startBluetoothDevicesDiscovery() {
        if (!this.isOpenBle) {
            this.showToast(`初始化蓝牙模块失败`)
            return;
        }
        let self = this;
        uni.showLoading({
            title: '蓝牙搜索中'
        })
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                uni.startBluetoothDevicesDiscovery({
                    success: res => {
                        resolve(res)
                    },
                    fail: res => {
                        self.showToast(`搜索设备失败` + JSON.stringify(err));
                        reject(err);
                    }
                })
            }, 300);
        });
    }
    stopBluetoothDevicesDiscovery() {
        let self = this;
        return new Promise((resolve, reject) => {
            uni.stopBluetoothDevicesDiscovery({
                success: e => {
                    uni.hideLoading();
                },
                fail: e => {
                    uni.hideLoading();
                    self.showToast(`停止搜索蓝牙设备失败` + JSON.stringify(err));
                }
            })
        });
    }
    createBLEConnection() {
        //设备deviceId
        let deviceId = this.deviceId;
        let self = this;
        uni.showLoading({
            mask: true,
            title: '设别连接中,请稍候...'
        })
        console.log(this.deviceId);
        return new Promise((resolve, reject) => {
            uni.createBLEConnection({
                deviceId,
                success: (res) => {
                    console.log("res:createBLEConnection " + JSON.stringify(res));
                    resolve(res)
                },
                fail: err => {
                    uni.hideLoading();
                    self.showToast(`停止搜索蓝牙设备失败` + JSON.stringify(err));
                    reject(err);
                }
            })
        });
    }
    //获取蓝牙设备所有服务(service)
    getBLEDeviceServices() {
        let _serviceList = [];
        let deviceId = this.deviceId;
        let self = this;
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                uni.getBLEDeviceServices({
                    deviceId,
                    success: res => {
                        for (let service of res.services) {
                            if (service.isPrimary) {
                                this.getBLEDeviceCharacteristics(deviceId,res.services[i].uuid)
                                _serviceList.push(service);
                                return
                            }
                        }
                        uni.hideLoading();
                        console.log("_serviceList: " + JSON.stringify(_serviceList));
                        resolve(_serviceList)
                    },
                    fail: err => {
                        uni.hideLoading();
                        self.showToast(`获取设备Services` + JSON.stringify(err));
                        reject(err);
                    },
                })
            }, 500);
        });
    }
    //获取蓝牙设备某个服务中所有特征值(characteristic)
    getBLEDeviceCharacteristics(deviceId,serviceId) {
        let deviceId = deviceId;
        let serviceId = serviceId;
        let self = this;
        return new Promise((resolve, reject) => {
            uni.getBLEDeviceCharacteristics({
                deviceId,
                serviceId,
                success: res => {
                    for (let _obj of res.characteristics) {
                        //获取notify
                        if (_obj.properties.notify) {
                            self.notifyId = _obj.uuid;
                            uni.setStorageSync('notifyId', self.notifyId);
                        }
                        //获取writeId
                        if (_obj.properties.write) {
                            self.writeId = _obj.uuid;
                            uni.setStorageSync('writeId', self.writeId);
                        }
                    }
                    //console.log("res:getBLEDeviceCharacteristics " + JSON.stringify(res));
                    let result = {
                        'notifyId': self.notifyId,
                        'writeId': self.writeId
                    };
                    self.showToast(`获取服务中所有特征值OK,${JSON.stringify(result)}`);
                    resolve(result)
                },
                fail: err => {
                    self.showToast(`getBLEDeviceCharacteristics` + JSON.stringify(err));
                    reject(err);
                }
            })
        });
    }
    //断开联链接
    closeBLEConnection() {
        let deviceId = this.deviceId;
        uni.closeBLEConnection({
            deviceId,
            success(res) {
                console.log(res)
            }
        })
    }
    notifyBLECharacteristicValue() {
        let deviceId = this.deviceId;
        let serviceId = this.serviceId;
        let characteristicId = this.notifyId;
        uni.notifyBLECharacteristicValueChange({
            state: true, // å¯ç”¨ notify åŠŸèƒ½
            deviceId,
            serviceId,
            characteristicId,
            success(res) {
                uni.onBLECharacteristicValueChange(function(res) {
                });
            },
            fail(res) {
                console.log('notifyBLECharacteristicValueChange failed:' + res.errMsg);
            }
        });
    }
    writeBLECharacteristicValue(buffer) {
        let deviceId = this.deviceId;
        let serviceId = this.serviceId;
        let characteristicId = this.writeId;
        console.log("this: " + JSON.stringify(this));
        return new Promise((resolve, reject) => {
            uni.writeBLECharacteristicValue({
                deviceId,
                serviceId,
                characteristicId,
                value: buffer,
                success(res) {
                    console.log('message发送成功', JSON.stringify(res));
                    resolve(res);
                },
                fail(err) {
                    console.log('message发送失败', JSON.stringify(err));
                    reject(err);
                }
            });
        });
    }
    closeBluetoothAdapter() {
        uni.closeBluetoothAdapter({
            success: res => {
                console.log(res)
            }
        });
    }
    //若APP在之前已有搜索过某个蓝牙设备,并成功建立连接,可直接传入之前搜索获取的 deviceId ç›´æŽ¥å°è¯•连接该设备,无需进行搜索操作。
    reconnect() {
        (async () => {
            try {
                this.deviceId = this.deviceId || uni.getStorageSync("deviceId");
                this.serviceId = this.serviceId || uni.getStorageSync("serviceId");
                let result1 = await this.createBLEConnection();
                console.log("createBLEConnection: " + JSON.stringify(result1));
                let result2 = await this.getBLEDeviceServices();
                console.log("getBLEDeviceServices: " + JSON.stringify(result2));
                let result3 = await this.getBLEDeviceCharacteristics();
                console.log("getBLEDeviceCharacteristics: " + JSON.stringify(result3));
                // this.writeId = uni.getStorageSync("writeId");
                // this.notifyId = uni.getStorageSync("notifyId");
            } catch (err) {
                console.log("err: " + JSON.stringify(err));
            }
        })();
    }
}
export default Bluetooth;
LA24030_LuLiPackageLine_Pda/components/print/bluetoothPrinter/bluetoothPrinter.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
<template>
    <view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
            }
        },
        methods: {
        }
    }
</script>
<style>
</style>
LA24030_LuLiPackageLine_Pda/components/print/commands.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,193 @@
/**
 * ä¿®æ”¹è‡ªhttps://github.com/song940/node-escpos/blob/master/commands.js
 * ESC/POS _ (Constants)
 */
var _ = {
  LF: [0x0a],
  FS: [0x1c],
  FF: [0x0c],
  GS: [0x1d],
  DLE: [0x10],
  EOT: [0x04],
  NUL: [0x00],
  ESC: [0x1b],
  EOL: '\n',
};
/**
 * [FEED_CONTROL_SEQUENCES Feed control sequences]
 * @type {Object}
 */
_.FEED_CONTROL_SEQUENCES = {
  CTL_LF: [0x0a],   // Print and line feed
  CTL_GLF: [0x4a, 0x00],   // Print and feed paper (without spaces between lines)
  CTL_FF: [0x0c],   // Form feed
  CTL_CR: [0x0d],   // Carriage return
  CTL_HT: [0x09],   // Horizontal tab
  CTL_VT: [0x0b],   // Vertical tab
};
_.CHARACTER_SPACING = {
  CS_DEFAULT: [0x1b, 0x20, 0x00],
  CS_SET: [0x1b, 0x20]
};
_.LINE_SPACING = {
  LS_DEFAULT: [0x1b, 0x32],
  LS_SET: [0x1b, 0x33]
};
/**
 * [HARDWARE Printer hardware]
 * @type {Object}
 */
_.HARDWARE = {
  HW_INIT: [0x1b, 0x40], // Clear data in buffer and reset modes
  HW_SELECT: [0x1b, 0x3d, 0x01], // Printer select
  HW_RESET: [0x1b, 0x3f, 0x0a, 0x00], // Reset printer hardware
};
/**
 * [CASH_DRAWER Cash Drawer]
 * @type {Object}
 */
_.CASH_DRAWER = {
  CD_KICK_2: [0x1b, 0x70, 0x00], // Sends a pulse to pin 2 []
  CD_KICK_5: [0x1b, 0x70, 0x01], // Sends a pulse to pin 5 []
};
/**
 * [MARGINS Margins sizes]
 * @type {Object}
 */
_.MARGINS = {
  BOTTOM: [0x1b, 0x4f], // Fix bottom size
  LEFT: [0x1b, 0x6c], // Fix left size
  RIGHT: [0x1b, 0x51], // Fix right size
};
/**
 * [PAPER Paper]
 * @type {Object}
 */
_.PAPER = {
  PAPER_FULL_CUT: [0x1d, 0x56, 0x00], // Full cut paper
  PAPER_PART_CUT: [0x1d, 0x56, 0x01], // Partial cut paper
  PAPER_CUT_A: [0x1d, 0x56, 0x41], // Partial cut paper
  PAPER_CUT_B: [0x1d, 0x56, 0x42], // Partial cut paper
};
/**
 * [TEXT_FORMAT Text format]
 * @type {Object}
 */
_.TEXT_FORMAT = {
  TXT_NORMAL: [0x1b, 0x21, 0x00], // Normal text
  TXT_2HEIGHT: [0x1b, 0x21, 0x10], // Double height text
  TXT_2WIDTH: [0x1b, 0x21, 0x20], // Double width text
  TXT_4SQUARE: [0x1b, 0x21, 0x30], // Double width & height text
  TXT_UNDERL_OFF: [0x1b, 0x2d, 0x00], // Underline font OFF
  TXT_UNDERL_ON: [0x1b, 0x2d, 0x01], // Underline font 1-dot ON
  TXT_UNDERL2_ON: [0x1b, 0x2d, 0x02], // Underline font 2-dot ON
  TXT_BOLD_OFF: [0x1b, 0x45, 0x00], // Bold font OFF
  TXT_BOLD_ON: [0x1b, 0x45, 0x01], // Bold font ON
  TXT_ITALIC_OFF: [0x1b, 0x35], // Italic font ON
  TXT_ITALIC_ON: [0x1b, 0x34], // Italic font ON
  TXT_FONT_A: [0x1b, 0x4d, 0x00], // Font type A
  TXT_FONT_B: [0x1b, 0x4d, 0x01], // Font type B
  TXT_FONT_C: [0x1b, 0x4d, 0x02], // Font type C
  TXT_ALIGN_LT: [0x1b, 0x61, 0x00], // Left justification
  TXT_ALIGN_CT: [0x1b, 0x61, 0x01], // Centering
  TXT_ALIGN_RT: [0x1b, 0x61, 0x02], // Right justification
};
/**
 * [BARCODE_FORMAT Barcode format]
 * @type {Object}
 */
_.BARCODE_FORMAT = {
  BARCODE_TXT_OFF: [0x1d, 0x48, 0x00], // HRI barcode chars OFF
  BARCODE_TXT_ABV: [0x1d, 0x48, 0x01], // HRI barcode chars above
  BARCODE_TXT_BLW: [0x1d, 0x48, 0x02], // HRI barcode chars below
  BARCODE_TXT_BTH: [0x1d, 0x48, 0x03], // HRI barcode chars both above and below
  BARCODE_FONT_A: [0x1d, 0x66, 0x00], // Font type A for HRI barcode chars
  BARCODE_FONT_B: [0x1d, 0x66, 0x01], // Font type B for HRI barcode chars
  BARCODE_HEIGHT: function (height) { // Barcode Height [1-255]
    return [0x1d, 0x68, height];
  },
  BARCODE_WIDTH: function (width) {   // Barcode Width  [2-6]
    return [0x1d, 0x77, width];
  },
  BARCODE_HEIGHT_DEFAULT: [0x1d, 0x68, 0x64], // Barcode height default:100
  BARCODE_WIDTH_DEFAULT: [0x1d, 0x77, 0x01], // Barcode width default:1
  BARCODE_UPC_A: [0x1d, 0x6b, 0x00], // Barcode type UPC-A
  BARCODE_UPC_E: [0x1d, 0x6b, 0x01], // Barcode type UPC-E
  BARCODE_EAN13: [0x1d, 0x6b, 0x02], // Barcode type EAN13
  BARCODE_EAN8: [0x1d, 0x6b, 0x03], // Barcode type EAN8
  BARCODE_CODE39: [0x1d, 0x6b, 0x04], // Barcode type CODE39
  BARCODE_ITF: [0x1d, 0x6b, 0x05], // Barcode type ITF
  BARCODE_NW7: [0x1d, 0x6b, 0x06], // Barcode type NW7
  BARCODE_CODE93: [0x1d, 0x6b, 0x48], // Barcode type CODE93
  BARCODE_CODE128: [0x1d, 0x6b, 0x49], // Barcode type CODE128
};
/**
 * [IMAGE_FORMAT Image format]
 * @type {Object}
 */
_.IMAGE_FORMAT = {
  S_RASTER_N: [0x1d, 0x76, 0x30, 0x00], // Set raster image normal size
  S_RASTER_2W: [0x1d, 0x76, 0x30, 0x01], // Set raster image double width
  S_RASTER_2H: [0x1d, 0x76, 0x30, 0x02], // Set raster image double height
  S_RASTER_Q: [0x1d, 0x76, 0x30, 0x03], // Set raster image quadruple
};
/**
 * [BITMAP_FORMAT description]
 * @type {Object}
 */
_.BITMAP_FORMAT = {
  BITMAP_S8: [0x1b, 0x2a, 0x00],
  BITMAP_D8: [0x1b, 0x2a, 0x01],
  BITMAP_S24: [0x1b, 0x2a, 0x20],
  BITMAP_D24: [0x1b, 0x2a, 0x21]
};
/**
 * [GSV0_FORMAT description]
 * @type {Object}
 */
_.GSV0_FORMAT = {
  GSV0_NORMAL: [0x1d, 0x76, 0x30, 0x00],
  GSV0_DW: [0x1d, 0x76, 0x30, 0x01],
  GSV0_DH: [0x1d, 0x76, 0x30, 0x02],
  GSV0_DWDH: [0x1d, 0x76, 0x30, 0x03]
};
/**
 * [BEEP description]
 * @type {string}
 */
_.BEEP = [0x1b, 0x42]; // Printer Buzzer pre hex
/**
 * [COLOR description]
 * @type {Object}
 */
_.COLOR = {
  0: [0x1b, 0x72, 0x00], // black
  1: [0x1b, 0x72, 0x01] // red
};
/**
 * [exports description]
 * @type {[type]}
 */
module.exports = _;
LA24030_LuLiPackageLine_Pda/components/print/gbk.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,201 @@
/*!
 * gbk.js v0.3.0
 * Homepage https://github.com/cnwhy/GBK.js
 * License MIT
 */
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
    typeof define === 'function' && define.amd ? define(factory) :
    (global.GBK = factory());
}(this, (function () { 'use strict';
    var GBK = function (gbk_us) {
        var arr_index = 0x8140; //33088;
        var gbk = {
            decode: function (arr) {
                var str = "";
                for (var n = 0, max = arr.length; n < max; n++) {
                    var code = arr[n] & 0xff;
                    if (code > 0x80 && n + 1 < max) {
                        var code1 = arr[n + 1] & 0xff;
                        if(code1 >= 0x40){
                            code = gbk_us[(code << 8 | code1) - arr_index];
                            n++;
                        }
                    }
                    str += String.fromCharCode(code);
                }
                return str;
            },
            encode: function (str) {
                str += '';
                var gbk = [];
                var wh = '?'.charCodeAt(0); //gbk中没有的字符的替换符
                for (var i = 0; i < str.length; i++) {
                    var charcode = str.charCodeAt(i);
                    if (charcode < 0x80) gbk.push(charcode);
                    else {
                        var gcode = gbk_us.indexOf(charcode);
                        if (~gcode) {
                            gcode += arr_index;
                            gbk.push(0xFF & (gcode >> 8), 0xFF & gcode);
                        } else {
                            gbk.push(wh);
                        }
                    }
                }
                return gbk;
            }
        };
        return gbk;
    };
    var gbk = GBK;
    var URI = function(GBK){
        var passChars = '!\'()*-._~';
        var otherPassChars = '#$&+,/:;=?@';
        function getModue(passChars){
            var passBits = passChars.split('').sort();
            var isPass = function (s){
                return ~passChars.indexOf(s) || /[0-9a-zA-Z]/.test(s)
            };
            return {
                encode:function(str){
                    return (str+'').replace(/./g,function(v){
                        if(isPass(v)) return v;
                        var bitArr = GBK.encode(v);
                        for(var i=0; i<bitArr.length; i++){
                            bitArr[i] = '%' + ('0'+bitArr[i].toString(16)).substr(-2).toUpperCase();
                        }
                        return bitArr.join('');
                    })
                },
                decode:function(enstr){
                    enstr = String(enstr);
                    var outStr = '';
                    for(var i=0; i<enstr.length; i++){
                        var char = enstr.charAt(i);
                        if(char === '%' && i + 2 < enstr.length){
                            var code1 = parseInt(enstr.substr(i+1,2),16);
                            if(!isNaN(code1)){
                                var _i = i + 2;
                                if(code1 > 0x80){
                                    var code2;
                                    if(enstr.charAt(_i+1) === '%'){
                                        code2 = parseInt(enstr.substr(_i+2,2),16);
                                        _i += 3;
                                    }else{
                                        code2 = enstr.charCodeAt(_i+1);
                                        _i += 1;
                                    }
                                    if(code2 >= 0x40){
                                        i = _i;
                                        outStr += GBK.decode([code1,code2]);
                                        continue;
                                    }
                                }else{
                                    i += 2;
                                    outStr += String.fromCharCode(code1);
                                    continue;
                                }
                            }
                        }
                        outStr += char;
                    }
                    return outStr;
                }
            }
        }
        var URIComponent = getModue(passChars);
        var URI = getModue(passChars + otherPassChars);
        return {
            encodeURI:URI.encode,
            decodeURI:URI.decode,
            encodeURIComponent:URIComponent.encode,
            decodeURIComponent:URIComponent.decode
        }
    };
    var src = function (gbk_us){
        var gbk$$1 = gbk(gbk_us);
        gbk$$1.URI = URI(gbk$$1);
        return gbk$$1;
    };
    // å¤šè¿›åˆ¶è½¬æ¢åŽçš„æ•°å­—还原函数 æž„建时会替换占位符
    var Fn_Hex_decode = function decode(){
                var n = 0, str = arguments[0];
                for (var i = 0,w = str.length; i < w; i++) {
                    var code = str.charCodeAt(i);
                    if(code < 38 || code > 126) return NaN;
                    n += (code - 38) * Math.pow(89, w - i - 1);
                }
                return n;
            };
    // è§£åŽ‹Unicode编码字符串函数 æž„建时会替换占位符
    var Fn_unzip = function unZip() {
                return arguments[0].replace(/\x23(\d+)\x24/g, function (a, b) {
                        return Array(+b + 4).join("#");
                    })
                    .replace(/[\x26-\x7e]\x25[\x26-\x7e]/g,function(a){
                        var b = a.substr(0,1).charCodeAt(0)
                            ,e = a.substr(2).charCodeAt(0)
                            ,str = String.fromCharCode(b);
                        while(b++<e){
                            str += String.fromCharCode(b);
                        }
                        return str;
                    })
                    .replace(/\x23/g, "###")
                    .replace(/([\x26-\x7e]{2})\x21([\x26-\x7e\x23]+)(?:\x20|$)/g, function (all, hd, dt) {
                        return dt.replace(/./g, function (a) {
                            if (a != "#") {
                                return hd + a;
                            } else {
                                return a;
                            }
                        });
                    })
                    .match(/.../g);
            };
    function gbkArray(gbkArr) {
        var data = [];
        for (var i = 0x81, k = 0; i <= 0xfe; i++) {
            if (data.length > 0) {
                data.length += 0x40 + 1;
            }
            for (var j = 0x40; j <= 0xfe; j++) {
                if (
                    (j == 0x7f) ||
                    ((0xa1 <= i && i <= 0xa7) && j <= 0xa0) ||
                    ((0xaa <= i && i <= 0xaf) && j >= 0xa1) ||
                    (0xf8 <= i && j >= 0xa1)
                ) {
                    data.push(undefined);
                    continue;
                }
                var hex = gbkArr[k++];
                var key = Fn_Hex_decode(hex);
                data.push(key ? key : undefined);
            }
        }
        return data;
    }
    var GBK$1 = function () {
        // ç”ŸæˆæŒ‰GBk编码顺数排列的编码映射数组  æž„建时会替换 zipData çš„占位符
        var gbk_us = gbkArray(Fn_unzip("(T!HJ%LUX]e%gilotuwy{} (U!)-%/137>BDGHO%RTUW%\\_a%jl%rtw} (V!*+-0%27>C%EHJ%MP%R\\`cdfn%ptvz{} (W!()*,/3%579;=%CFGM%QWX\\^cdg%ilnprtvy%} (X!&')%.468CDHJLMOPSTWY%\\_b%dg%ilnprtuwxz%|~ (Y!'(*+-469%=?%GI%KO%RT%V[%_bdikmnptuy{}~ (Z!&')+%-/%;>@ACE%GKMNPR%TW[_%ikmo%rt%vy%{} ([!'(%+-%024%;=%BD%LO%QSTX%[]^`%ce%y{} (\\!()+%/1%7:%LN%SU%WY%cf%im%prt%xz%~ (]!&'%*-%/1%68%EG%cgloqs%uwx|%~ (^!')%-/02356;>FJKOPRSVWZ%]_`dfi%kmor%vyz (_!'+%-124%68;=@ACE%MOQRUVX%]_adegjqwx|~ (`!&)*-%/689;%=?%ADFIKLNOVX^%cehilmoq%uwyz|%~ (a!'),%/124%=?AD%HJ%PRSU%[]e%ho%qu%~ (b!()*,%.024%79;%=?A%FH%KM%WY%`c%ei%loq%tvy%| (c!'*+-.1346%8:%<>%GKLOQSUZ%\\_cghjltwy{| (d!(,/1%4679=>@D%JLMOQRTVWZ]`%ce%km%pr%tvy%} (e!+,-/0279%;>?DQW[%]_bdhqu%wy (f!&().47:;>ACEFHIKMP%SU^a%egikm%tx}~ (g!)*,.02%58<>BCGI%MPY[]`%bdeginpuv (h!(*-2%6=>A%CF%KMPRT%WZ\\%`deg%ln%qswxz{} (i!&+-%/1%469;>@AD%HJ%MP%TV%Y[\\abdh%mrsvx~ (j!&,%.0235%7:;>@%FH%PRTVXZ\\_%cf%hjkn%puw%{~ (k!').04578;=?%CFI%NQRTW%^`acdg%ilmo%ru%wz|~ (l!&(*%,.%9=%ACDHIK%OQS%U[%^`%ce%hk%ru%{~ (m!&')%79%CE%KM%PR%^`%hjkmnqxz%~ (n!&(*+./2%478<%>ACG%WYZ\\%^`%cgmnp%txy{} (o!&'%)+,.5%9;<EFHJOQS%UWX[%]`%dj%mp%tw%} (p!&'%)/2469%;=?%AC%KN%TVWZ[]`aefhk%mo%vxz%} (q!&'(,-/024%69%;=?%AC%EG%IK%NPSTV%Z\\%`b%eg%tv%| (r!&'(*+-%/1%57%<>%BE%UWZ\\^%`b%il%ps%ux%~ (s!&)%:<%?A%CE%OQ%SU%bd%ilnpqstvwy%~ (t!&')+,.%246%9=>ACDF%ILNRVXY[\\ac%fiklprsvxy (u!&(%,.013%?BDG%IK%MRVXY[%^abeg%jl%ostyz}~ (v!'(%,.013%9;%=@%CIJMOR%VXZ[]%_a%lnp%rtv~ (w!&(%+-/%24%689<=?A%CE%KNPR%VX%Z\\%`bcf%oq%tv%|~ (x!&'(*+-%5:;=%@B%SU%[^%km%svxy{%~ (y!&(),%1346%:<>@B%DF%HKMNPQSU%Y[%qs%~ (z!()%ACEFH%OQ%_bfnpqwx{}~ ({!&)+-%023569=ADEG%IKMV^%`c%fhinq%swxz (|!&'%)+%-/2%:>@ADEG%KMO%U[\\^`acefi%lnpquwy|%~ (}!&(+-%02%578:%<HIKLQRW%Y[%]_%bdgil%ruw%} (~!'(%*,/%35%7:;>?AI%MP%TVZ%\\^`be%hjlnoq%vx%} )&!&'%+-%356:<>?ABD%MO%TWX[%`b%fhj%mopr%vx{}~ )'!&)%-/%69%@BCG%QSTVX%bdghj%mo%{}~ )(!&'%9;%=?%WY%eg%mo%{} ))!'(+,2458=>@%DGHLOQ%SUVZ[_f%mp%twxz%~ )*!()-%025%:<%BE%IKLNOR%`dfhmp%rtwx{%} )+!(.137%:>%BD%HJP%SU%^a%fjkm%pr%} ),!&(%02568%:B%DFI%KMOQSVWY%[^%aehikmo%uxz%|~ )-!&'%358=%@B%DGIKLORSVX%Z\\^a%cgjq%suwxz~ ).!&(%+-%2467:%?AC%FI%MRSUVY^%`e%gijmnpqstwz{}~ )/!&()+,.9%;=>BCEIJLPQT%V^%`b%fh%loprv%|~ )0!'(*,-/%1457%:>?GJKMNPWY%[^%acdg%jlnp%ruwz{}~ )1!')*.035%79:=%DG%IL%PR%TVWY[^a%ejqruwx{%~ )2!&)%,.1%37%;=%@B%EHILO%QS%eg%nprtvwy%{}~ )3!&'%*,%/1%47%=?%BDF%XZ[]%ac%jl%txy{%~ )4!&'%+-%24%68%<>A%EHJ%Z\\%ik%su%z|~ )5!/058%:<?B%EGIK%NQRT%X^`%bfklq%suvx%~ )6!'(+4578:;=>@D%FH%KN%SW\\_%afijlmp%su%wy%{} )7!(*+-59;?GHJKNTUZ\\_b%ejm%pt%wyz|%~ )8!&(%*-78:=%?ABD%ILMO%RUXY[b%eg%nqu%wy{%} )9!'(*%-014%79;%>CEIK%MOQ%WY\\^cgijmnqsuw%{} ):!&')%+02%46%<>AC%GJKM%PRTVX%[]bce%ilmpqt%y|~ );!()%+-%/14%9;%?ABDFHIOQ%WY[%]_%ce%lnp%rt%} )<!()%.035%=@ADEG%JL%PR%UWX\\^%acfhj%lnpqs%y|~ )=!'(%*-%13%579;%SU%\\^%eg%km%xz%~ )>!'(+%.2578;%?ABEFHIKM%ORSUWZ%\\_`b%eh%jlnpqs%~ )?!&'(*%,/%146%8:<?@BDEHJLNPS%Z\\]`%bdi%lorsu%wz%~ )@!&'(*,-34;%>ABD%HJMNP%RTVY%[_%ac%egj%mor%uwy{| )A!'(%+-/024%:=>@AHIK%NPRSUWY%]a%cehik%mo%qsuvx%{}~ )B!&')%,/%35%=@%DF%JL%OQ%TV%oqu%|~ )C!&(%-/34689;?%EJLMO%QTV%XZ\\^%ceglnpqt%wyz|} )D!&)*,/0279:<%@BG%IKLPQSVY[]%`beghjkmoq%tv%y{~ )E!'+%-0258:=>@E%LNQ%Za%cgkmopr%tvwyz~ )F!()%/14%79@CEGHK%OQ%SU%[^%dg%imnrz~ )G!'),0%9DF%MOR%Z\\^a%hj%ln%pr%{}~ )H!&*%-/2357%@BD%IKMO%RTUWXZ\\%`bce%nps%uw%y|~ )I!&'(*%,.%2479;%FI%KM%TVWY%[]%`b%dfhik%{}~ )J!'(*+.01346%9;<>?A%EIJL%NPRTY%[]%befhil%uxy{}~ )K!&()+,.%02%68%?ACEG%IK%PR%TW%bd%gi%rtv%~ )L!&(%36%;=?%DFH%KMO%QS%Y\\%`bce%ln%twy%} )M!&'(*%46%<>?A%CE%GI%QSV%Z\\%ce%lnq%~ )N!&'%~ )O!&'%178:%CE%HJM%OQ%TVWZ\\]_%jl%sz{}~ )P!&'%136%9>AEG%JMNP%RU%Y[%bd%koq%wy|} )Q!&'%*,.018:<%@B%IL%NP%RTV%XZ%\\^%dh%lnrw|%~ )R!'*,2%48:=>@%CEFJ%LOR%VX%Z]_%aijl%nr%vxz|~ )S!&(%*-.2589;<?@C%FHJ%LNPVZ]^b%ehn%qt%vy{%} )T!&'-%/1249;<>ABGINTUWXZ[]%_bd%fh%kmqrt%y{}~ )U!()+,02%46;<>@EHLQ%TWY[]^`acdg%il%oqru%wy%} )V!&')*-.02359%=?EHOPSTVWYZ\\%ad%fk%mp%su%xz}~ )W!&),-/1%479:<>%@BDG%NP%SUY\\]_bcefhilp%rtvxz{} )X!&'(*,%36%=@%CFHJKM%OQ%[]^`%nq%suxy{%~ )Y!&)%/1%35689;<>@AC%FHKMPQTV%X[%^`%bd%fhjnpqs%u{ )Z!&)%24%79%@B%DFGI%MO%QU%^`%bd%gkmoqstv%|~ )[!&'%+.%024%=?%ACE%GI%KM%RU%WY[%]_ac%ik%mpqu%~ )\\!&'(*%-/%35%?ABDEG%LNP%UW%]`%jlo%z}~ )]!&'%DF%MP%VX%hj%ln%~ )^!&()+%8:%EIL%ORT%VX\\%_a%cf%hj%lnrsuvy%~ )_!&'%,246%8<@AF%IKM%Y\\^%`b%eglpr%xz|%~ )`!'(%14%8:;=@D%NP%W[%^`%mo%rtvx%~ )a!&'%+-/%359%=?%AD%GIKLN%SU%Y[%^`%ce%gj%nq%wy%{}~ )b!&'%)+-%/1%9;%DF%JM%VX%[]_%df%oq%|~ )c!&'%:<%EGIK%MP%RXZ\\^%dg%il%oq%suvxz|~ )d!()*-/%25689;%=@%BGHJ%NQSUVX%ce%psv%xz )e!&'%,1%35%8;=?%BDFG 'W!,-. &(+&.'&-~&'u'W!/1 ')>.<V')!@PBCFG 'W!@A4%;BC<= &'~&(!Kk '/!J;< '.!~| '/!>= '.u'/!K. '0`'/!94 '1t'0T'/!?Bu`\\Q1t '0!)* '/!xy2IH ';!*( &'}')!\\] '+{.;U&'q.>!&' ')Z&'t',5':!GF '9!eiha`;:ML ')e'-!XVWY 'W?'-!67%?#3$ '6!-.%@ '5!rs%~ '6!&'%, '5!^_%g## ']!67%?## '-!&'%1## .;!RST .>+.;!VW%~ .<!&'%U .>)'W!mn%~ 'X!&'%f#8$t%~ 'Y!&'%p#5$ &0!=>%MO%U#5$]%mo%u#4$ .9!89<=BC@AD%G##>?:;4#67#6$ &1!cd%hTi%~ &2!&'%)#12$*%/K0%I#10$ &.!()7 ')!=?O_ '+}',('-!\\]%_ '/!)37fz{ '0z'8!CD%ft%~ '9!&'%)-%/VW|%~ ':!&J '0P'W!>IJ#8$ &(!uU &+7&(T&).&(]&)6&(\\&)F&(a&+9&(`&)h&(g&+;&(f&*-&(n&+=&(m&+!?ACE &(!p^ &,a-Qc&)!_c -Qd&,q#1$'Z!&'%J#18$ 'W!MN%U '^`'a!@AN%PSv 'b!'*+. .93.>!(*# ',@']G#'):#0$'Yv'X!no 'Y!wx 'W2'X!pq .9!LM%UW%Z\\%ik%n -R!*+%6 'W3#10$'7!LM%~ '8!&'%>#12$ )e!HIKN%SVWabei%lnp%uw%y{%~ )f!'+%-23679%;@BCEFHIM%PS%_abdf%ik%rt%~ )g!(*%79%=?@BDFGIJL%OQ%TV%XZ[]%bdfgkn%prsv%y{}~ )h!&'(,-/3%9;%>@B%EGIK%MO%RT%cehil%or%z}~ )i!&'%)+,/13579:?%CE%HJ%\\^`eh%tvwy%} )j!'(%,.13%57%9;<>@%JLN%UY%hj%~ )k!&')%1357;=%CF%IKN%TV%Y[%bdfhj%mqstv%z|} )l!'+1369:<>%ACDFGJM%PR%UZ%ad%fh%npr%tw%{}~ )m!&()+%.0%2479<?@BFJ%NQZ[^_c%ejopr%uw{}~ )n!'(*%,047%:=>@%CEFHIMOQ%TVX%Z\\%_aeg%ilnrswyz|} )o!()+%-/346%=@%EGI%MOQ%TV%\\^%`b%iklnq%suw{|~ )p!&()+-.013%<>%FHILN%WYZ\\ (iC*r5(pM)89(gy(h[(gk)p*)o>*A;)s|*9E)ui)cO*s5*ux)R/({@(Z*)7s)B.(~d*4~)F{*42)@K)pg(_l)>Q)a|*2'*Jb(\\0(u2)4?)\\@*9t)8])5n(eJ(f+)|s(^7)mH))<)7>*Yr*ua)6M*2O(o@*t|*0J)cV)oo)E[)op);L(XR*W~)7F)z6)?3)hN);2)66*8L*xa)Dd)cf)61)76(Wo)k9(cY(a_*.d*b,))v)G`)Jk*6R*.k)HS)vH*E'*oR([d*U/*:L*4b(bm*L>(a&)p!]`bdelnrsu%wy%} )q!&'%-035%7:;=?@BCEFJLN%X[%^ac%egj%lnp%ty{}~ )r!&)+%-/%69%@C *B**t=(Yf(qR*{F({T)6!th )BK*V+++A)b})DT)um)12(c!`& *^r*4P*Wv*mT(Z=)e4(t-)1k)`B*K0(tz*:])Cj)}<)&|*/8)l*)TJ*[[*`!0t +3')Q4*cF)}()-`)v**@.*A<)Q!596 ))I)*v)nD*q<)>X),G).P*_0(s@*7;*a^*rQ*v?*_J*/W*X,)5](YH(e5(cm*_!9:< *a,)F:)-N*6j*JF+,1)3Y(`E)nu)-P)?.)\\_)Z'({u);N(^!A| )EP(T_)yA*{Q)_5)r!DE%GKNPQT%_a%ch%jm%rvwz%~ )s!&'%,/12469;%=?@BD%HJLN%Z\\%df%hk%or )mi)*e)gu*=C)<Z)7R*mh)T7(ci(b+):n*mu)~O(Wj))c*8V*5A*6\\)Wn)Sx*~=)8f(ck(hL*JC(pj(TS))K)Ow*'H*bn)/H)=:)f/*KF)D5)5i*W{)rS*Zw*eB)-M*=?*@y*z>(dx*E0)PD)1!mh )^Z*:;*8Q(Vg)SU*Bu)<z*)0)Ks)C7*;^(dK)}j(Y0(^X)UG(}G*[b):1(e&*;!AK )Eq)v7);C(|=(~@))6*TK)70)F'*V,):_)9r*G2*{`*T{*/a*nL(V;*q_*y+)@U)f))s!tvx}~ )t!&')*,.%18%=?@C%EHJNPSU%WY]_`cdf%hjkrtv%y{}~ )u!&')+-/04%8:%EK%RT%WY%_ (nv(|{)*'*p'([V*3}(d8)>Y)lB(i*(ZQ*Y,)6G*mQ)C[(ky)[T))*(f9)^m*^P)62)<Q)9[)-_)[n*bz*7\\*_A(|v)AX).|)S7*r>*Y(*JJ)<>)yh(pX)Lv)5,(fL(UE)z*)1i)[j*T>)6B*`V*~U)y\\(e`)n?)7k(c()Rg*_p),X*~:*2q+3k(Xj(}?*Xd*1T)?G)_?(]j(^~*D_)&Z({W)7'*d@)lq*ZZ)z?)2()~4(V[*/9)rl(TW*7f(`7(_m)M5(d^*[|*n^*sl)YY*rZ)J))u!`abdfgklnp%ruyz|~ )v!')+%28%;=%@BCE%GI%KO%RT%VY%[]%jl%np%tvxy{|~ )w!&'%*,%.0%6 )tu(\\&)se):o*N`(t*):B)(~){E)Ie(W[*8Y(j8(Tx)mR){])*!Qy *q>(`5(f=)^e)9.*n~(oe)@n)Ig*d[(hY)W=*.I*IY)5O*/1)mY*;=)vD*si*_/)2o)kM*T1)Ov(`T*XP)O3*3G*>{(n-(bn(Vb(Ta(_D*(G*d_*&i(YL*[t*&C){b);m)&g(\\**51)nL*(i)W6*1o)D6(zh(|V)vN)<[):r)9b)8<*ns);3*_O)}h)nt)5o(tM(fJ)P2([z)5P))n)P?(Vw*X7*Ji)-i*`f)w!78%<>%GI%MO%]_%cgil%oqt%|~ )x!&)*2457:%=?A%GJL%PSTW%Z\\%_a%c )/R*2s)7/(U&(cd*b~)9p*4J)@/)R5(X()1n)W+*TB),v*Ef)-7)82(^&*;v)G=(_s)8t*[=(ZB(~G)xH(|Z(`J)zZ)1<*a2)pp).B)-{)ov*[a)^J)om)}])s8(_f*ar(qU(X0)Z3*_{)>G)}/)e0)VG*1n(yJ)6x)++(nl*?3)}@))e),\\*`J*/U*y')9:)Y_)ut)_;(^D*uF(p5)l2(W~)l5)+-)1f(u-)Vc)Px)ue(eY*sr(_!>t )9A(eg*mF*Tg*Ys)cW)u{*G_*_~*Tq(e=)x!de%jl%wy%~ )y!&'%*,%047:<=?@BDF%HKLNOQ%VX%Z]`bdfi%oqrtvwy|} )z!&'%)+.%24578:; (TG)q/(eK*m<*xV+2S*o.({Q*S_(T!hb (^x*>m)47(ai)F>(Xy)0D(_.)Ts(^()6Y)?9*rW*UQ*`O)m|*c*)rJ)Q2)dO)eX*T_(qf)r`*XL)DA*oA*3w)+<)Wk(u_)|\\)s{*o<)Pn)?O*/O(q7(]v*qn(|W(s((f,*[g)>a*x_(my*mP)q>*`y)9?(gq(t!@` (o~*\\N)Cs*ZH*8U(`[)1p(qF*F@)&;+0<(YM*x}*Sv(w@)0O(d:)6?*a.*c/*{T)0B*2B(]d*2i(|r*{J)U-(Uy)z!<>@AC%QS%UWY]_%df%oq%uw%~ ){!&'%57%9;A%DHKMO%RT%VYZ_%adgh *X0(e.*0B)}c(WK(U<*qO)T*)h1*C6))N)lg*21)L')t3*mE*-4(_T)_h(e**_e*:q*X))dt*{B)T0(o-*9z)?[*4.)5[*r((uu(W:*S|*.T)>9*=U*uI(iZ*ye*4)(c9*Ta(e}*4>)+5)Sf*X9*9s*d.(f-)Q{(_y*.Q(oB)`C)S,*(9(tq(W8)/1)2K*(Z(Tv(|_)E7*FD)&C*ne*yU)mS)`&*`Z(^{*/^*Sz(to(_W(X=(f*(tQ)>r*4(({,)69)7,*^z)*4)R&)}:(WJ(Ya)CK){!ijmo%qt%xz%~ )|!&'%+-%79%BDEG%JNOQT%Y[]%ehikm%ortvy%{} )}!&'*%,.0135%7;=A )Uj)VM)x`*K6),T)l()6]*^o(Yx*eW)?I*5!Z| )+2*5{*Xt(a0*MY*XK(t3([\\(Vl*qk)cT*6K*Wx(|**S`*r:(uT*/[(g;(ld(kU*TI)>4)JQ*mL)po)Xz)*a)kn)D+)E])|l*3z*Xv)2F)y>)>]*Xc(^T(`4*mU*/y*3x*.L(~C)Wy)DE*&;)o}+&I*6a*0|*),):}*oQ)z^(fN(h7)O^):`)4}+04*4w)m=(a3*uT*>e)Fo*F&*qP*s1*nF(Tp(ea*.s)Fl*Z-*2K)C2)+0*1H)}!CDFH%KMOQS%XZ\\^abgikmprsuw%~ )~!&'(*+./13578:<%?A%GIJL%NQS%VY%[^%`i%kmnp%rt%{}~ *&&(pL*2u)Gq))-)>6(a`)0F+4-(X}*\\H(^8({b),P))1)Re)7[*Wz(^=*m\\(bf)SM*:M)eC(p,)Di*X-(tE*_-*=*(g@)~H(Wk)Sk(zt(vE+2X(eA*Ee*~r*UB*3~)>@*x^(n6*sd(`H)k2(`j(|?)7l*L.(UC)7:)/\\)H{(^?({O(^l*N<)~\\*{[*08)1o)^'*X/(]n)*n*`S)ix*N>(ni)tz)-6+42*qI*^R+'T*TE)oj)Fu)Eh*Z8*X5(`W*^t)Yr)HN*n_*bs(n9)E(*K~*_X(gs*&!'*%-/%246%:=>@%BD%FI%KM%OQRT%XZ%]_a%hj%lopr%wy%~ *'!&')%.124%@B%GK +&)(zy)Us)R-(V9({j*~Q*d7)3v*b5*v{(f/)VX(|0(_p(j**0=*2&)<i)8^)@:)43)0f)`3)R!^P (tU)DR*8J(sT(l|*Uu)QK*bc(uJ*2M(eT)Ue(fy(j=*<3*=2)Fk)y6(g7(X7(ee)pk*V;*qQ)Sa)V[*Xk*L<+0[*X:(l-+1o)my)-l)eL)0A(hN(V<)LG*J?)0+*^Z(go)_Z*Dm+06)U&({F),U*.<(j)(Y8)fG(f@(dP(ZI(ek(g'(U;)//)ib(su*>u*4e*G])e<*(z)XG*'!LM%UW%{~ *(!&'%*.%8:%@CDFI%KPQSV%Y[%]_`d%hjk ),d*DB(h~)6g(V&)SX)5S*9x(h)(c])fQ)Yi)l8(`,(b~*TA)KF)-n)/2)W8(o2)O4)gi)G-*_i*/T)8s)0|(hv)n5*Um)`>)VF({])*j*;g)2s+1b)v}*G@*'0)oy(_c)1v)`u)A3)*;)0&*Tr)^K)86*^s).H)0;*Eo(ms)Pz)0m)35(cX)1`)AV*X?)yu(WU)_k)RN*Sp*TV*.r*;y)@X(wu+'Z)UM)WA*UL)U7(WT)^F*<s)52)1Q*tQ*X')xI(_n(nz(q+)Cx)lu)z\\)yg)~P*(!opr%tvy{~ *)!&'%+/12458%>@%EG%NPQS%`b%vxz%} **!&'(*%,.%4 *3i*{:*`1)\\M*Sb+/q(v`*/!*J (ef)Df)HY*^{*'V*sc(e')/W)mb)Ry(d)(y2*.A)85(_S*55))9*@7)6C(^L(zs(WI)x>(`\\)18)UJ({!{y *S!^m )@+).W*r;(u`*/(*.D(kP)EC(t_(XU({m(aa*;o*xj*X>)l/*mq(Zw)z[(W2)EB*~H(y*)P5)pj(o=(|t)}N*qC)`w(^H*4-*97(uE*/E*;<)HA)Ex)v4)uS)7M)8r)~;(Yv(a+(_B*;e)KQ*g=*ZC*X1*N;*o/)~h(W1**!56%km%tv%~ *+!&'%= ([<*8P(`k*{D)WZ)Xv)VJ),7(\\s(vP(|d)UB)Rf)m**?<)GB(t|*So(c/*dE*rC*AH)I:)w+)`O*4z(V8*bP)UC*~N(v{(mQ):d*nJ)sy(Y.*5E)eM*NL*{O*/u*.x(a@)>T*dI*^!im (eH){\\):L)9])ox)yp*J5*r,)5F(al*9I)G.)DU)9/)rR)|Z)TV*.m*N](vD)5.*Bo*9l)lI(ZO(V_)mI*TO(}O))F)}_)?F*eL(V^)Tz*M2*)~*o'(VY*U3*_l*u^)A;)xR*_b)_n)Ut*+!>?%JL%RT%~ *,!&'%F (}B(as*;[(^.*:|)rB)Af++l(V@)1J*(!nc *.i(V)*R|)A_*xh*uD(r[)>g*o])-h)mm*uA)|!LK (_3)_1){^):I){<*.:)gP*w&(U2)^S(UJ*d&(d_)>L)@0*7!u~ (g9(}6)m>*v2)7B)eE)ma(}J*~C*=-(}E(g+)sw(U+)S\\*37)7<)9&))0(^C*Z!+l *o0(Yz(eB)1g)_.(a()8a+0:(w:(ZV)qw(d-*.|)<2)>&)6L)9P(ZD)cS*NC(_&*S}*.w(o**=/*mZ(^g(ex)&N*,!GH%~ *-!&'%-/%35%9;%P (YS)|P)UV*bg*~Y(iy(gA(cp(gZ),=):H)JF(_b)36(_}(q[(b@(o1)tB)qK)+M)3E*)7)5w)6Z(V6)^p*29)7a)_f*uK(oZ*:I)E{)Hv)vX*xw)yI(sr(g^(eL)W~(]p(`U({Y*Tb*43(i<(p0)0L(o4(f1){@)0)(zd)9_)6c(e@)6&({~)E;(h?){e*:T*dK)+)*Ki(t^(p8)7x*Z6*4s(o:)~2(Y2).v({t)OP(c0)}d)e.)Fy)t4)qv)@@(_((U|)pm(~k){k*?&(tt+'Y([W*-!QR%tv%~ *.!&'%46%8HNUVp~ */!-:KQ_xz|%~ *0!&'%)+.%7:; *{])2N)Xt(oG)@O)8W(n,)7V)6,)+i*qc(of)73(j'*Fc*5u*_4(i_*<m)DJ*XV*@5(x,)FB)7P*&P*q`(^<)\\)*U;):\\*NB)4G*/G)_D)Y})hf)Jc)eh)+`*bT)CU)Uf)8o(at)d'*27(XN(vY*d>)_[)V@(b:(U=*t;*on*A})vM**-(]F(ou)<o*3h*(+)T?)Hr)J-(_*(dN)H))dF+1l*&S)ed)y3)ZR)hg)D3*eG++X)wf*<E*;i(el)FJ(U*(d?(ar)ts(d<(`C([_(Xm(YY*0!>AC%FHK%OS%UWX[]%`b%eghj%qsuw%{}~ *1!&'(*+/12457%=@B%FIJMOQ%SU%XZ\\^%befh%mqr )n-)|8*(B)SS*sS(a\\)j2(h;(Yr*31*<n*_o*oq)+_)/N)VB))`)>V*5c*nX)/})_>*.]*(^(_<)G[*(a*96(Tj*^p*eJ)An(VB*Ti)<V*3'(\\X)m;)bE(|C*_N)[L(Us)</*od)+l)?;(`1*KG)_J(ad)ez)i;)D|)vz*tZ(Tz*bA+,9)Vn(_N*XA(ez)78)gl*=T*t:+3p*mv(Wq*1)(_?)^P*rk(~Y*xf(eC(Vx)Y4)hj)K*)uG*{d)lV(`2)no)U=)F&(^9+4,*3((gD)}P)|,*1!svwy%|~ *2!(*%03%58=%@DEGIPQS%UWYZa%fhjoprtvwz{}~ *3!&+%.02%468%EH%MO%Z *r|(og)7L*r=)JK(vx):a*&5)ZN*rA*9m(cq*xe)+&)^d)9k(cs*DC++5+11)uh*tv*Z=*XB+0v)[D)xU)-9*r<)5J*~>(er*n7(Y,)?g(}!jf */V*DE)R6)-o)gA)Y|*/@)&9)8,(zz)Y~(d+(U^)9X)lb)6d*^X(Wa(Ve)ST*.P*Sw*>'*HJ*0?*`s*n})~d*~k*K}*>G)Tp*~P*.v(uU+1Y)gU)t6*Dv*~!6L (kb(et(pU(U]+1D(ce*_Y*54)ry*{g*F0)Yy*@k)C:)30)Zj*3![^_begj%oqrtv{ *4!'*%,0479:<=?IK%OS%Y\\cdfgjry{} *5!&)%,.%02367@BDF%HJ%VXY[^%`bd%hj *U4*9Y*;@)q2)Qs).d*<y)f>*:s*nt)Q;)si*my(c~*:p(^^)*,*V>*X8(U5)ge)E&)G_*dJ*tM)a4)SO)qI(xT*oB)Q/*0v)@p(|.(v-(x\\*q!7F (W'*=o*?J)Mp)px*o1)f.)H'(zo)qo*dn*uL*)3*`/*U'),b*'|)yP*N?)Sz*F^({})*1)HJ)q`*/6(^a(]r(b1(wD*/F*uM*:E):.)rk*Bv)yJ)X+)+/(uf*@i)^H)Qq)7))pX)>J)1/*qL)@W*H/+/s*nG(ej(g(*U7);~*5!kl%prtx%z} *6!()*-%13%68:<%>ADEG%JSU%Y[]%`bd%iklp%tvwy{}~ *7!&'%+-%25%8=>@%BDF%L )<&*C^)L>*6n)vk);o+'l)6|)Ci*<g(s'+1v)SY)Z_(|<*rB*To)c})E\\)71)d&(V=(v:)Q-(rk)BE)*D(bG)2|)Cf)q.)rM)d,)ze)7i(h<(fT*mS*b)(w7*.M)Qv(U0(uC*2F(tn(cf)l4*s[(m_)81*5<)0U*qH)Vy(ff*{V(^Q(yR*5((u{*tW(ZZ)T:(}A)7I(XB(cN*6M*`>)YR*A*)72)*c)vA)<b)93)/'(w3*dS+/o(}D)8`*2x({4(ig*o!KN )V()1()El)eJ(_P({8*7!MN%[]%_abdg%kn%svx| *8!'(%+./135%:=@D%GINRZ\\]_%cefhjl%np%wy{%~ *9!'(%.0 )7Q)T3)cy)60*ma*.W*5>)UO(^h),A(uA(ak)/D(u@)B-*DD)mC)8;)4[*)F*T^(h8)O9+/u)Pm*B{(fY([M)SR(ic*Y[)cJ))])/G)i>)77)9J)cj)-|)X4)U:)=T)[>)pq)vS)q<)lQ(`>(e8(U@)+4)?c*2`*4Z)6^(g1(`B)_0*Jk*Yx)T6(f|*4^(q**Ky*XT*r`*cz(XK)SI(jW)p_)te)6k)_{)[t)-Q*@D)H[)uX*&Y*6z)CI+0F)8x)v3(oR)tG*t})6!<n (aI)i=)Q7*9!12%48<%?BCGHJL%NPSWZ%]abegijny|} *:!()*-.01347>DGHKPU%XZ%\\^`acdfhj%nxy{~ *;!'(+-.2%;>?CEGLPR (i]*5i)mV)pG(cH)n)(\\y(}F*S)*&)([&)ce*~a*y_)ZA)k8)x9)<4)s3)7f*xq*X+(gl*35(U?(oM*:g*=p)*b(_`)kL*T((}T(oD)TQ*xg(wa)ti+'\\*_|*(E(`p)5m*nT(VZ*<B*>k*=L*?c(p^)Cr(n?)A^)Ub*U<)Bt)]E)C])OL)FI)56(v/(TI(_7)ZE)E^)S=(^B)HL(tm)Oy)lc)&a*5;+3<)?y)w!rk *~[*Xw(~.(UK(W<(f3(tw)tA(lV)Qt*_U),@)S+)T8*Sh)9H*;!STVWYZ]_%chj%nrw *<!,-%256:%@CDF%IK%MP%SUVY[]%ch%kqwz{~ *=!&')+,.013%68:<%>AE%GI%KN%P )0I)U9)d:)6)*m!Ax (cR*_R)~9(Vs*U1(Uk+1r*m!df (`g)[B*aB)UA*U?(qB)'F)O!2[ )E6(f_*6&*0t(rq*A6),w)6e)Ld*o:)>m)0])G?)s5(UA(Y1))/*v*)<Y*1g)&@(YX){S(_z*:r(TZ)/a){I*mY(Y>(VF)y^)i<(bL*:')=&)y5(|;)S/*u=*^e)R)(Zn(d5)WO)<{)Ad)R7)1E*xW*T[)*u)iD){=)yC(T^*b7)hd)RI(mo*cx)Ss*Y2(cI*Ea)C0*\\K(}M*~;)Wj*=!QRV%Z]%_a%cehj%msu%z|%~ *>!()%-3%:<%AC%EH%OQ%Z\\%`bg%jln%rtx%z|~ *?!(*,- (e3(wQ+3w*YJ(dq(nD*y.)D(*do)Sw(^4)mn)7])dq(`R(a^*/{)^o)o*(d*+0A)K-)uJ*s]*K^*13)`_)b:(^U)E_)k:(sc)=l(mL*Sf*{K)63*.o)1y)_o(sk(V!UN ).X*vy(W6*Sa(_v(uW*.E)5p(Va)@.)5**;M*?z*;x*Gv)ad)YN({p*.l(^c):()E`*3f*;N*IL(]7({1(uO*_B(U`)Rd(^1*LQ*^Y*q}*AI)if*nj*q?)VI*:S),n)<?)Tg*>2*6@++w(r6*X[(TO(dw*?!./%24%7;>@%GIKLN%QS%_abdf%hlmoqstv%y|} *@!&'*,-/%469:<?%CE%GI%SUVX%Z (WY)>^)G+(js(Tm):s*~d)6.(y+)ig*99)VL)Ho(\\e*<J)t7)C~(`S)SG*.K(\\9(i^)a.)}o)AB)h+*:Y)D.(}v(`:)aM*JI*q9*rK)<r*Xa*7,(i})R\\)5c*/o(rj(W_(i?*XO)A<(TP(|x*Kx)G|)8_)z,)_i*9T(bb*w/(|o(h:*b;*.g(u/*XJ*Eb*8!,- *Xf);J(|b)2x)V,)wh*S{)tl)l0(g&(Ws*\\G)W;(w;*._)x/)S6({X(x8)kp*4B)2u)Wa(so)k!u{ )d7(cV*/4*@![\\%ce%hjl%npqs%vxz%~ *A!&'%),%5=%AC%FJ%TVWY%\\^%bd%fh%prt%w{|~ *B!&' )qA)pt(a**4`(n_))P(tW)eZ)?_)Xp*T;(}=*De(cP)t()7h)@?(VT*yf*Dt({U*T*(eO)sp(Xa(}S*~@(v?),L)wd(sj(T\\)F2(Ux)7W*P[*`U(b')@x(j|(lZ*`:(Vi(Xo*eE*{E)Qo))J)/u({[*N@*T9)>1)5g*{k({?(|])9@(i'(e4)nq(^I*A+)E.)H4)PC)6U*^}(e1*82)Vt)m3(US*XN({')ao*BU)B!(p *0Z*FB+1k+2e(}c)Cm*`()FD)DD)5))|C(r])+L)>k)Zp*B!(),.%46%@C%IK%MOQ%SW%\\^`%fh%np%twxz|%~ *C!&'(*%02%57%E )0.(`Q*2C);Z*JN)l&))M)FF)7^*t`(e))c[*Te)R;)rH)z-(f2)s:*xZ*8<*TX)u1)CR)_C)?Q)<B(k})/O)y9(eU(Tc)P4*3c(|X(k*(mp(W!uw *{G));)Dc*2n)/4*xb*`9({B*Sy*TY):{*8x)=2(kD*:=*d9(Y`*)w*`W*(O(\\q(r))YG({v*T-*3`*dL*?M)~R*Dq*s!(, */&+&D)uj(~-)zv*`z*sD)x0(zi)8p)|x*@))H.(hX*/j)hq*)y*n[)5\\(q}(Vj({:(uF(r,*C!FGI%KM%QS%]_%bd%suw%~ *D!&'%+-%/1%@FGI%MO%QS%UW%^ )g')8/*[@*Z]*4R*:B)6o(eM)TE*d2(tP)/3)Rw(o0);P*X*)nv)Z((o>)MD)n;)[S*U8*Tl(oI)QO*Jp)v6)9Z(eV)_/)Rk(r0);0(q3)Ha*6m(hb*)-(ZH*\\V)Vo*YF)_m)9G)V>)Yl*/'*=g)Fv*`;)V{*rl*Se(t})d>*C1*6P)m`*PR)H0(`n*Zp*nk):/*xx*[9(iu(X5)C=(l})1U)V8(`](}N(tO)WE(rC)l-)kr)0E*84*5q)7{)DF*_s)qz*ZA*X4*mt))^(d;(f0)_E*D!acdf%lw%} *E!)*%-/1%69%=@AFHIMNR%TV%Z\\%^`cghmnp%ruwx{%~ *F!'(%*,%.17%9<%?ACF%HMNP%SVX )RG),4([3(VA)+C)8K*8g*`R)G**dB)sA(ei*n6)-H)|R)GP)8V)}f*.y)n&([N)6X(tZ*`G(_k)y;){G(n:)-v*`L)U~(}e(n[(em(]y)X>(mw)9`*xs*6Q*FW*LV*`8(e{(}t*79)7@)5t*5\\+0,*r6*~!8F )IU(ur)7=(i7)8'(gr*Et)U8(vw)k<*Jz)O|(t<*UW),l)Xo)gc*x](T~)_y({C)us)8N)AJ)p/)1K({R(wd(TM*6')Rq)gE(V5)Dn*09)-d)@C)CY).c(uQ(vu*F![]_abfh%jl%oqrtuwxz%|~ *G!&)%/3468%;=%?AC%HJKO%VXZ%\\^`%ch%jmoprsuw%{}~ *H!&(%.0%4 )(n).9(d'*vx*_n)Fx(n0(i()1_(U')[3*/5*:5*=q(vH(W!Ze (}C*.F)Ch*@r(fw)lL*4G(i{+'g(X/)Ww*Tw(|g)3>(cz)nj)Ws*D~)?)*qJ*.S(f?)zR*)a*q=(k(*1P)kD)8.*FY)VD){c)5-)?C(cv):@)S1))3(f`*m[(U9)Rh*TP(}P)@)*9c)H((f!B8 )Q+)Ox(V()8S(cW*8>(WH(Y7(oA)5&*tB)AT)d.(bg(ab)0x*TS)@])ai)Du*MR)u.)t2)A`(l)(f<*n{)d?*H!5679:>@%BDF%IKLNOQ%UW%Y\\%`d%jl%oq%tv%y{%} *I!&'%/1%46%9;%@B%IKN%QS%WZ )yx)0H))T)0b*6o(t;)1\\)aT)_q)YB)RW)dE)MH*K2))u(UM(xu(j<*n=)Tl*)R*s6)5+*.`)ru*Dr(c2*tb*_')Aw)&4(Y))eY(TQ(d\\(t5(ep)98*o)(]m(Vm++P*.>(gc*W}*J2*8W*qA)V1),c(y5)A.*r_)gj)fA(du*6L*{Z*10({a*r!mF *.Y)q8(dX*ow*{n)~l*Lp)XI(UN*1c)x6*TJ)1s(gx(V?*xY))?)L~(\\M(en*Ul*>1)u9*tH(`d(h@(m8*nZ)V+({l)Vi)AC*I![\\%hj%oqrt%vx%z}~ *J!&'%),%13468%>DEHKMOQ%TV%Z^adeghjl%oq%su%y{%~ *K!&(*%/ (|m(zm)FT*3s(iq)|~)>C)I|(V/)OY*G7*uv(c^)80);@*b0)?>*4E*Tt(^e)H1(d.*I0)4=)Sr)TP*U-(}V*BP*9v*nf)O5*_,)?R)/-).N(Yj*I|)@h*67)f<)1z(^@(`+(on)-F*b(*J**df)*g)D4)/Y(vG(]i(_i*4|(bp)S'*sa)aZ(WL(Yw*1-)C{(je*nb)y8*Jt*.}(rw)5(*tD*DN(k_*x[)-t*Su*?u*d+(e6)@6)*~)lY)0=**l(xA*/!+. *^S(jG({Z)1,)?m)g>*K!13%57%;=%@B%EHILMO%RT%VX[\\_%cefkln%twz%| *L!&')+%-/%57%;=@%DH%LN%PR%UX%[]%_ac *`A)oU)qi*.t*u_*BA(zv){:*t.*Iw(b3)a_).5)@5*TF(|Y*~9))))PB)Rb*S!jl *`B*_V(dA)7&+/!v} (fD(Tq*:+)cw*E7)&i*J7)VR*sb(g|(V.*Ss)`2(gh*qX)_a)WC)pi(Tk)tI*FT(~U),3*Nz*x|*q])^i)Sm(tj)9a)q|*J+)ZS*9:(qa)bL(dB)tO*s^(hS)-J)`Y({k*T~*~V)P<(tT+0&)y_)DM)6/(XQ)mE*0r)T`*r))R.(W+)mv(^G)Fj)Z}*a_*6B(uc)i~*L!de%lnoq%~ *M!&'%03%8:%MO%QSUWXZ%t );M(},*aD){W*U.(vN(gW*7y*<+*MT*26)IX(l<*2l)cU*eI(_)(UL*xU)9N(T`(eS)C1*5v(tB)VU(TF(sx(cJ):5*nK(Y&(WE*JA*xp(t]*a6)ys(V~*4t)m5)S0({S(v\\)-A)I-*Du(ZJ)):(UF)sq(Vy*9A)6T)@\\*ap(}~(VS)-]*7?*`p*3a)mO(V:*KY)26)P~).Q(U6)pc)Y:*TG*Sk*T!n5 ),?*22*1[*.h*;J*<'(mu)Pp*w,*r*(vo(e|*nP)W5({|*{C(}>),R*s-*M!uv%~ *N!&'%:=GM%OQ%SUWY%\\^a%df%hj%ln%y{%~ *O!&')%> (d&*:_)LN(x6+0g)+**/i*<u*>!./ *;|*G0*__*Xb)pa)-U*xv)uH)@i(h1)7O(XE*7<)ml)+N*sj*ZX*F;(g:)TH)V/)R?)0X(b/)k~)*l(WS)0y).r(}))l.*b4*ms)d~)Sg)X)*cv)CG(e!(P (X3*eD*TU(d~)*k*_S)W.(U{)p[)JU*DR)2A*8&(X;(Yg*`v++0)20)W!g^ *r{(Uu(wL*t,(TT(~+)y1({>*TQ*1L)gC(pi*9R*bG(e^*a&(j[)&=).,)2/)OD)e]*46*PQ*O!?@%^`%hj%~ *P!&'%@B%H )Up(|1*KZ*xd*Uv*~7+0*)WT(^p(]h(p-*J_(dU):S*_&(n)(f\\(nB)fR)Y(*/Y*_m*:?)2f)/Z*rX)C.*.@*Y!1j *mX(~_*(T)CF)1&*qT*2N(U~*bm(bh*r^(]f*_a*As*d1)AE*w.(ze(c,)tm)D')Fp(gt)^Y({g*^g(^Y(nd(g\\)=f)Ar*X!^C *5:*>v*aL*)6(_r*CH)E/)@2)\\.*E?*[v(lX*`X)ot)^Q)b\\*W|)7S(`3)TR*X<)/@(rv)3\\)C<*X`)5j(jS)Wm)Ck*^Q*P!IJ%PS%Z\\%~ *Q!&'%R *n;*qG)qh)F8)Jw(g6(U:)_:*T,);^)?-({<){J(Zj(|F)sI)QA*PA*(H)Sl)ph)?K*_()''(}Z*D,)F;(co)54)|F)XL*/>)L<)|M)-T)Zr),])9D)VK)D;(TN))X*X&(Vk*4D)o&*s9)7E)@v)6A)Sj*Xu)a7*0Q(]k*3d(eI*aM)6[(hD*F2*_**2;*nq*@o*_j)UU)h.)?A)q_)kZ)t\\*7t*Ww*m;(Y/)Dz)m]*T.*tK)8@*oH*r+*?i)84)r()-e)e\\(Uv)/F)>o)7Y)Ou)>:*Q!ST%uw%~ *R!&'%;=%[ ))o)mk*bW*S~*9d)E))>*(f5*FZ)ss*4&*5-)RH(U8*.a*3))q4)I5)PO)6*(Zl(Xf(n|)7q)Ot*Ye(eG)@1*.R).b)8+)9o*7!lm *0V))d)&,(`P)Aj)ya)z9*X()^t)mx)Yv)Si){X(Ts)p^).k*mR*JU*.b)yE*4C*eH(W!-R *8?(fl))&)U.*T0*(U*^^*3u))b(g=)pJ({P)A,*~n)hA)F]*Ev)Co)f=*T!\\? *`H)|f)_])a>)7.)s7(kx(U(*>a)E}(aj*E[*X.*nR)}e*R!\\]%{}~ *S!&'(*%\\inx *T!+4Nm *U)(X1)T=)x.*~E)6V)cH)7g(TY)tK*^V)<]*XZ*&()GC)*s*KJ(uS)<K(sm)d{)I6*o&*`5*XX(oC*/A*Tj(_9)8Z)7C(cb)G&)i**:o*cy(i=)r')^W)UF(^E(gS*XD(vs)Yc)Vg(zl**)(Vh*(-)Yk(z`*7c)WW(zg+&t)HV*Zx({N*/=)/m*.O*b?*Xp(tu):,)yW*YZ(ca)?q)x'*T)*r1*.^*mn*-u(k{*d])C>*0R(|h*aT)@q)).(X2)Ej([1(X>(o3)+=#2$*U!CD%KM%PSUVX%_a%df%kn%tw%} *V!&'%)-%3568%:=?%EG%IK%_ (Uz(TR(]e(TV),<(cT(T[(V,(Td+'J(z|(lW(Tn)y2(U,(b}(U4(tS)cY(c})Qp(mt*4h*{l)Q3)re+2\\(T|(V3+2U(U!IV (V'*9O(zk(ie(kV(VX(d!CSY[d *uP*X](c)(eR(c!5=M *X\\(c!ur (_!u{ (`!(GMYZfx{v *?`(a!>CBQT (^N*0<(V!OW]V|u (W&(Vr(W!V.] (XF(W!0`bDf (X!@I )>3(X!<? *V!`a%~ *W!&'%f (X!A9 (W!mx (X!XVskeq`] (Y3(X^(Y5(Xv(Y!oqsNcleZh (Z!(Y| (Y|(Z!\\?^].L<UX ([U(Zs([,(Z!x~ ([!CR|~ (\\!'8T (]+(\\!kjdl (]!,0 (Vq)RD(X!:G (YW+43)RM*'}(^:))E+1g*{m(^M(t:(b!au *O((bx(_^(t?(]z(V4(]{(VG*JL*K)(VI*5?*KW)xQ(zD*I:*1G(^!w} (_!0/ *W!gh%uy *X!QRW_eh%jlnoqrx%~ *Y!&')*-%03%79:<%EG%IK%WY]^`bdg%iln%qtwy%{ (_:(^!bnq *S!]cdgqrt *T!&'/326%8:<=@CDHLMRTWZ]`cdfhkpsuvx%z} *U&*T|*U!(*%,02569:=>@A (cx(d0*q!lqp *r'*qy*r!328?JU]bhj~ *s!*4M *a!vz|x *b!2':9<@ *Y|*Z!&'*.%03%57;<>%@BDJL%RT%VY[\\^%ac%jnor%vy{~ *[!'()+%-01348:;A%EH%MO%Z\\]_`cf *b!>6UKDVJMYlhb]aqu *c!+1OKP^\\fps (`'(th(a!cmn (b&(hQ(b!8>X (e<)be)s[),1(_!ho +'G(dl),>)lW))7(o/(p!3+ (rV(s!;DP (n!ehfoujk (o?(n!w~ (o!LhNi_^KPYV (p!7. (oo(p!<Y1> (ov(p!*_bdc\\B~y (q)(p!ng *[!hjl%prsuw%y{}~ *\\!&'%*-%/1%79;%FIJLMO%UW%ik%~ *]!&' (q!<>. (pw(q!1OJuQ (r!=DYarX *{}+2^)4t*9!@DFVQoKUX^`r *:!&, *9w*:!68Q *9!_~u *:!9:/ *9!p{hqf *:!2< *9k*:!OweR}uJb@FziA *;!&/ *:t*;!)* *:!NC *;!1fpq *:v*<N*;!QIF *<W*;!sDd\\XtU,uBOH{z *]!()%~ *^!&'%. *;!}0~ *<!(&)*l4op\\fOXA8re9t7TZdvx} *=!dH; (q8*=!{n@`9 *>!&B *=!ti7Brf[\\M( *<|*>0*=!SD *>!f[dc} *?!89+:) *>!FPs *?!'=? *>!;w *?!r~ *@!(> *?n*@+*?!{pk *@8*?!RjeH *@!=;d )kc*A7*@H*A8*@w*A9*^!/0%OTjv| *_!.1%35%8;=%@C%FHIK%MPQTWZ%^`cghkqrtx} *`!')*,%.2%467?@DFKMP *A!U: *@!WT *A!XGgc]y )s0*A!Bqz *B!JN-5 *Ax*B!TB+_]Vyg *C!)LtRvc *D0),!;E (t!bg *2m(t{(u'(t~(bw(}!'*19 )5h)6!-b~ )7!4DAX )83)7`)8!J\\T )9e):U)9!)2Fl )8~)9!dB )8z)9!ft ):!QW?^ )9|):!=- );X)9!~v );!KG ):!jz );&):k);!,'d )<1);s)<C*`!QT[%]_%dh%loqruwx{}~ *a!'(%+-3%589;%@CEFH%KN%RU%[]`c%fhik%oqsuwy{}~ *b!&*+-%/138=BCEF )<!'deFgm} )=!+86]y )>)),H).])ko),N(cn(e!NZFEXosc (f!OV%XZG (e~(f![]'6 (g!-? (f!{uh (g!EF/ (f!zj (g!H{Xm_}RQ~ (h&(fv(gN(h'(g!fjw (h!+,. (g!TUO (h/(gz(h!0m9rOfEtuacy| (i`(j!/U (i!Bf:N8I5 *b!HILNOQ%SXZ%\\^%`d%fi%koprtv%y{%} *c!&'%),%.02%EG%JL%NQ%[]_%eg%oq (i!0On%p,)U (j!+r (i|(j!QY( (iz(j?(iw(j!v1 (it(k&(j!]^49 (k!1> (ji(kf(jq(k!23 (jt(k-(j!}d (k!6,9: (j!lm (k!/<+ *^~(k!eOSHkjEGnt (l!F'E (ks(l!;PGJ:BtR_Yijs (m!(Dilrv (n!1'5;@FEX ))!Wa\\Yy )*!*+ *c!rtu~ *d!'(%*,-/034:%<?AGN%PT%XZ\\^bcg%mp%ux%} *e!&'+%.1%46%ACFKM%VX%` )*!&3CJMP (~!8&9<B4DE=FHaNiXW]Omcp~ )&7(~w)&!8UVzy )'()&!wqYn )'!R8.7fUiWeEDcn| )(!:> *U~)(!Xf )-!W[fkmpy} ).!'38@G *J@)-E)d!ruy|} )e!/-:9>T[U^`cm_of *e!ab%~ *f!&'%g )eg)f!*&4 )ev)f!10(5L8?KDc`js )g!&)8 *8;(tK*yn(t!J( *{!8<%AILRUY\\_befh%j )*o)+')*z)+!,;6OKTI *XS)+!hgq~ ),'*73).!OTaZ )/5).y)/6).!lo )/!078 ).!ux )/!*KgXMA?[]<qS )0!QRTS )/t*f!hi%~ *g!&'%<>%VX%p )0!CVos )1-)0!v\\ket )1!l;1]XFZ4 )2!GM<J )1t)2!'5Rq )3!Czbu )4!,Ij ).h*sP*q!8:@BDEKMRSUWY%\\^ad%fhi (Tr)c])51)R!<[cQ )S!Q3>B: )R!op{} )S!4W~ )T))S[)T!LMF, )S`)T!5+O@C )S_)T!(DS *g!qr%vx%~ *h!&'%79%y )U5)T!|a )U!?D )T!\\Ync )U!'I*1 )To)U!KNP/ )V4)Uk)V!AC )UZ)V!67 )U!X\\x_ )Wd)V!jh )W!(X )Vb)W!*[0' )V|)W`)VN)WV)VQ)Wu)X!_?\\ )YJ)X!PwDE )W!|o )X5)Y!wI0x )Zl)Y!z=?USOoLg'Z7 )[!H,- )Z!cT8nu )[!1Z )Z!iHh )[!osr^Xb` )\\^*h!z{%~ *i!&'%TV%~ *j!&') )\\!V4FCOn{km| )]!NWOmi )^!*9 ({!7;LJ\\o )l,*~h);:(|!BL *L\\(|N*[<*Qv*_!Gdfv *`&*_!uzw *`+*_y*`!=<C^IENYmneg| *a!01/G7A: )BP*a!S\\agbj )-!4;:< (}@(gV(}!U^ ({((}!hk *1K),!gfj *9;),y+'S(}s(u!NPZvwp *j!*+%LN%~ *k!&'%.0%2 (ud(v>(u!xkq (v!F& (u|(v!K2yzQ|WLm (w'(v}(w!MO,>.[ (x)(w!epW} (x7*4p(x!l]9< (y!'T (xt(y!;= (xz(y!ILZ?OAEr (z!'&BGP (|!sz (z!ju ({*(z!acr *~!?ABDIGJKORTZ\\]`be%gijlmoq *.!9;=?BC *k!34%:<%~ *l!&'%: *.!GJXZ%\\cefjnquz{ */!),/023N7;<?B%DHILMPRSXZ]\\`b%hk%np%tv )*i)l|)(|)l;*at)g!HKh\\Y )h0)g|)h2)g!qmz )h!*)F: *x\\)h!kJH? )gt)h!Sp )i!2c.-0864 *l!;<%IK%vx%~ *m!&'%7DIKz *n!)-.4@Uvz )h!|{ )i!Id_]a )j&)iu)j!-K=/06:MWX?V )k()ji*v!|}~ )D!18C-N )E1)D!lOX} )E3)DZ)E!4*9 )D!p\\a )E|)F<)Ed)F=)E!u< )F?)E!eAf?i )F3)E!ODn )FA)EM)F!0ef )G!:;(< )Fw)G!>] )FP)G!/@ )Ft)GA)F!sq}|\\ )H6)G!iNQmE )HC)J=)H})I!GH )Hz*o!(4>DILV[aouvx%~ *p!&(%s )IL)Hq)I!3) )J&)Hd)I8)J@)Ia)J/)Ij)J!,S:OgG )I\\)KB)J!VW )KD)J!X52Hjv )K1)J!z| )K!J'7@U )Jd)KV)J\\)Ku)LL)Kc)L!45 )M))Kh)L!a[ )Md)L!mxR )M!R= )L!ZEu )M!@UTm[o )f!Je )P!:;@=KLFSTZc *^!UW[%]_`bacdfhklnqu *p!tu%~ *q!&'%6;NVbgjmor%xz%|~ *r!&-%0479@DEG%IL%PR%TVY[\\ac%gin%z} *s!&' *^!wxy *_!)+ *\\j)5!'37;>=A@H *7`)k!EJUegi )>/)@!789Sb )DW)@!L^I )^`)C5)@!f}z )A&)@~*2<)A!OD1?FQGgt| )B!>4Urs} )C'*X!236;=@EFHIGMUY *N!AD%FH%K )d!3d )c{)d!+4CDIPRTW )7r)8C)9h*s!)+.%02378:%CE%LNOQRTUWX\\_`eghmnpqs%|~ *t!&'%+/%24%689<>%ACFGIN%PT%VXY[%_acd );E)=,*2:)Q!JS]UYegfmux%z )R!(0+19 )>!0Pf )c!kptN *DV(`0*3!|yp *4@)CH*4!A5/18;k%n_FH]Q[ )CN*4!aouxq *5!89 *4v*5')CS*5=*Ue*5!aIWC]sw~ *6!F+,C2;NO?9 (q~(xw*6!ZTc )Ym*6!u| *7E)Cd*7!C4 *t!ef%moprsuw%{~ *u!&'(*%<?@BCEGHJNOQ%SU%]`b%fh%oq%uwy%{~ *v!'()+%/ *7:*6x)O!6IKUXk *y!XYZ\\`a )Pl),})P{*Nm)?2+3=)?!5^hfenptx )^![wqx )_!=B9-3jL )`!9<?XZ )a!C,8 )`n)aB)`s)a!HJh )b!*, )a!xp )b!WK^p )c!;F )^G)`A)a6)b0)5!ZY_de )w!ejps )x!,- )w})x!+3(1@8KV[kx )y+).!\\[ *v!01346%<>@BCEG%wz *w!'(%+-0%G )/n)0!63@ )/s)0!2< )1+)2!-4 )3!+wk )4!@F{ *3!]\\ )SA)TK)WF)t!+-5>LMF )?M)t!bQRn%pTqZaX^ )u!*I23 )t[)u,)t|)u!(Fwovcx} )v!&5<(W\\Lou )w/)vw)w!=NH^ +4.+2!>@A )q!1DM9GHZbYmfux )r!78.*AO *w!HI%~ *x!&'%N )r!ILftdgsx )s!-.>CK )l!7=KHEXov )m'*0!@IG *Oi*0!P\\Yaif )p!f~ *Ii*m!89:>=?@BCGJHM%OVW^]`_bcegi%moprw{%~ *n!&'(*%,/%13258%:<>?ABD *x!OP%Tknruy *y!*/%TVW[]^b%dg%mp%~ *z!&'%5 *n!CEHIM%OQSVWY]\\`acdg%il%pruw%y| *o!+,*-2357%9=?@C6E%GJMOPS%UW%Z\\_`^bce%mpr%t; )s!uz *sf)y!Me[c~ )'A)y!{z )z!=3 *z!67%:<=?%[]%~ *{!&'(+%79;HMNPSWX^ )z!XVp +1m*{z){6)oz)p!',2= )k!46 )l)+/!prx%| +0!)(-/.01589;=%@BCEHLNQ%SUZ]%chdj )m!68:DAPGWX\\hUTgfzq )n!.31/62N<GJ[KPWbUpc`d *{!aco%y{|~ *|!&'%u )nf)o.)n!mk )o2)n!x{ )o!1'50 )n~)o!?PFNH]a *1Y)|S){!>?FLN[lfrnsy *J!BGP[]` *K!'K<ANgShjv *L!F( *Km*L**Ku*L!ME?G6`Wbm *M!9N )m/*4i)p!KM )sj*2!HJLRVX[%]_^gAky| *3!*/FN *MV*x!X`c *|!vw%~ *}!&'%| *x!ilmotz{~ *y!&(),- *D!AH`bsnpo *E!C(&G8B>E.DQ_PiKULJdjO *F!+34/5 *Ek*FU*Ey*F6*E!zsl *F!EI:JLOKe}`gp\\ *G!'1 *F!vsky *G!(k *Fd*G!fgdIY5Wt<LeMBN| *H!?8b *}!}~ *~!&'%5<MSWX^_cps%y|%~ +&!&*,.%0457%;>%ACE%HJ%OQS%VX%[]_a%ikm%su%w *HV*G!qn *H!=' *Gl*H!;u<EC[cMaPZkzp~ *I!MJ5ARXps */w*0!*,- *80)|!gjupq )}))|w)}?)||)}![L>-BE498GR2lnY )~0)}!`qt )~!)6 )}v)~!-,KabsgXc@eW]fo *&3)~|*&!.?<GHLn`^qxm +&!xz%~ +'!&(%*,%68%:<%FHIK%RU%X^b%dfhjkm%~ +(!&'%: *'!(3/AJI *7!wz{}e *I{*8!ABCMOHKX[ST^dikoz *9!&/ *J!\\cf *K!]d *M1*1!,.6>?A *(,)>D*(!AMLNRblmqw|}xu *)!.? *95)B?*1!N]dtpux} *2)*)O**u*+!KS *-:*.5+1!VR *Xs*Y!+;8X *X!gm *U!RT *c!w}{| *d8+(!;<%~ +)!&'%A *d!65D=CQRFHM`Ydaevw~ *e!()*0/5 *U`+0u*Y_*Z!9S *[!N^ *Y!\\fcak}~ *Z!(, *Y!uv *Z)*Ym*Z!:EF1GI2WKbkmz|q} *[!/5.*2&>67FG?ekqdiz *\\!+0,8: *V!*4<7JF )?=*N!PXTV +)!BC%~ +*!&'%H *N!_ei *O_*R<*u>*t!-73JELSRnqt *u)+3!loq%vx +2!CPR *s!VYZko )sM*s}*g!Ww *h8*iU*j(*k/*jM*l!Jw ++!369%< )zB++!?BD%FHINOR%WY%]_abd%kn%qx%{~ +,&+*!IJ%~ ++!&'%/12478=>@CGJ%MQ^`cmr%v|} +,!,-56;<'%+.%02%478:= *u!gp|} *v!&A=5DF *~!{z +&(+0O+&!'+-2163<=B +'!][_a`ei *yo*z!;\\ *{!*) +&!PRW`\\l^jy +'!'+7; +1![\\ *-.+0!y~ +1!&)0 *k;+1!;=y%{~} +2!'.,*/4gqt~| +3!)*0 +,!>?%~ +-!&'%~ +.!&'%~ +/!&'%ntw~ +0!'+237DGI%KMPTV%Y\\efik%twxz%} +1!'(*%/2%:<>%CE%QS%UWXZ]%ac%fh%jnpqs%uwx| +2!&()+-0%35%=?BD%OQTVWY%[]_%dfh%prsu%{} +3!&(+%/1%;>%jmny%~ +4!&'%+/%14%8 .*f.+!Zv .,!oy .-!;<%>@BCGN%PRSV%X -R!XY%~ -S!&'%N"));
        var gbk = src(gbk_us);
        return gbk;
    }();
    var gbk_build = GBK$1;
    return gbk_build;
})));
LA24030_LuLiPackageLine_Pda/components/print/printerjobs.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,456 @@
const commands = require('./commands');
const gbk = require('./gbk');
const printerJobs = function() {
    this._queue = Array.from(commands.HARDWARE.HW_INIT);
    this._enqueue = function(cmd) {
        this._queue.push.apply(this._queue, cmd);
    }
};
/**
 * å¢žåŠ æ‰“å°å†…å®¹
 * @param  {string} content  æ–‡å­—内容
 */
printerJobs.prototype.text = function(content) {
    if (content) {
        let uint8Array = gbk.encode(content);
        let encoded = Array.from(uint8Array);
        this._enqueue(encoded);
    }
    return this;
};
/**
 * æ‰“印文字
 * @param  {string} content  æ–‡å­—内容
 */
printerJobs.prototype.print = function(content) {
    this.text(content);
    this._enqueue(commands.LF);
    return this;
};
printerJobs.prototype.printQrcode = function(content) {
    if (content) {
        const cmds = [].concat([27, 97, 1], [29, 118, 48, 0, 30, 0, 240, 0], content, [27, 74, 3], [27, 64]);
        this._enqueue(cmds);
        this._enqueue(commands.LF);
    }
    return this;
};
/**
 * æ‰“印文字并换行
 * @param  {string}  content  æ–‡å­—内容
 */
printerJobs.prototype.println = function(content = '') {
    return this.print(content + commands.EOL);
};
/**
 * è®¾ç½®å¯¹é½æ–¹å¼
 * @param {string} align å¯¹é½æ–¹å¼ LT/CT/RT
 */
printerJobs.prototype.setAlign = function(align) {
    this._enqueue(commands.TEXT_FORMAT['TXT_ALIGN_' + align.toUpperCase()]);
    return this;
};
/**
 * è®¾ç½®å­—体
 * @param  {string} family A/B/C
 */
printerJobs.prototype.setFont = function(family) {
    this._enqueue(commands.TEXT_FORMAT['TXT_FONT_' + family.toUpperCase()]);
    return this;
};
/**
 * è®¾å®šå­—体尺寸
 * @param  {number} width å­—体宽度 1~2
 * @param  {number} height å­—体高度 1~2
 */
printerJobs.prototype.setSize = function(width, height) {
    if (2 >= width && 2 >= height) {
        this._enqueue(commands.TEXT_FORMAT.TXT_NORMAL);
        if (2 === width && 2 === height) {
            this._enqueue(commands.TEXT_FORMAT.TXT_4SQUARE);
        } else if (1 === width && 2 === height) {
            this._enqueue(commands.TEXT_FORMAT.TXT_2HEIGHT);
        } else if (2 === width && 1 === height) {
            this._enqueue(commands.TEXT_FORMAT.TXT_2WIDTH);
        }
    }
    return this;
};
/**
 * è®¾å®šå­—体是否加粗
 * @param  {boolean} bold
 */
printerJobs.prototype.setBold = function(bold) {
    if (typeof bold !== 'boolean') {
        bold = true;
    }
    this._enqueue(bold ? commands.TEXT_FORMAT.TXT_BOLD_ON : commands.TEXT_FORMAT.TXT_BOLD_OFF);
    return this;
};
/**
 * è®¾å®šæ˜¯å¦å¼€å¯ä¸‹åˆ’线
 * @param  {boolean} underline
 */
printerJobs.prototype.setUnderline = function(underline) {
    if (typeof underline !== 'boolean') {
        underline = true;
    }
    this._enqueue(underline ? commands.TEXT_FORMAT.TXT_UNDERL_ON : commands.TEXT_FORMAT.TXT_UNDERL_OFF);
    return this;
};
/**
 * è®¾ç½®è¡Œé—´è·ä¸º n ç‚¹è¡Œ,默认值行间距是 30 ç‚¹
 * @param {number} n 0≤n≤255
 */
printerJobs.prototype.setLineSpacing = function(n) {
    if (n === undefined || n === null) {
        this._enqueue(commands.LINE_SPACING.LS_DEFAULT);
    } else {
        this._enqueue(commands.LINE_SPACING.LS_SET);
        this._enqueue([n]);
    }
    return this;
};
/**
 * æ‰“印空行
 * @param {number} n
 */
printerJobs.prototype.lineFeed = function(n = 1) {
    return this.print(new Array(n).fill(commands.EOL).join(''));
};
/**
 * è®¾ç½®æ”¾å¤§å€æ•°
 * @param x 0-7 å­—符宽放大倍数
 * @param y 0-7 å­—符高放大倍数
 */
printerJobs.prototype.setCharacterMultiple = function ( x,  y) {
  this._enqueue([0x1d, 0x21]);
  if (0 <= x && x <= 7 && 0 <= y && y <= 7) {
    var cmd = x * 16 + y;
    this._enqueue([cmd]);
  }
  return this;
};
 /**
  *  * æ‰“印二维码
  * @param content æ¡ç æ•°æ®
  * @param barcodeType æ¡ç ç±»åž‹ï¼š
  * 0:PDF417, 1:DATAMATRIX ï¼Œ 2:QRCODE。
  * @param param1,param2,param3  æ¡ç å‚数:
  * ä¸‰ä¸ªå‚数表示不同的意思:
  * 1. PDF417
  * param1:表示每行字符数,1<=n<=30。
  * param2:表示纠错等级,0<=n<=8。
  * param3:表示纵向放大倍数。
  * 2. DATAMATRIX
  * param1:表示图形高,0<=n<=144(0:自动选择)。
  * param2:表示图形宽,8<=n<=144(param1 ä¸º 0时,无效)。
  * param3:表示纵向放大倍数。
  * 3. QRCODE
  * param1:表示图形版本号,1<=n<=30(0:自动选择)。
  * param2:表示纠错等级,n = 76,77,81,72(L:7%,M:15%,Q:25%,H:30%)。
  * param3:表示纵向放大倍数。
  *
  */
printerJobs.prototype.printQrcode = function (content, barcodeType, param1, param2, param3) {
  var str = content;
  var length = str.replace(/[^\u0000-\u00ff]/g, "aa").length;
  this._enqueue([0x1d,0x5a]);
  this._enqueue([barcodeType]);
  this._enqueue([0x1b, 0x5a]);
  this._enqueue([param1]);
  this._enqueue([param2]);
  this._enqueue([param3]);
  this._enqueue([length%256]);
  this._enqueue([length/256]);
  this.print(content);
  return this;
};
printerJobs.prototype.queryStatus = function () {
  this._enqueue([0x10, 0x04,0x02]);
  return this;
};
/**
 * æ¸…空任务
 */
printerJobs.prototype.clear = function () {
  this._queue = Array.from(commands.HARDWARE.HW_INIT);
  return this;
};
/**
 * è¿”回ArrayBuffer
 */
printerJobs.prototype.buffer = function () {
  return new Uint8Array(this._queue).buffer;
};
/**
 * CPCL打印
 */
/**
 * è®¾ç½®æ ‡ç­¾å®½é«˜ å¿…须在开头设置
 * width:80mm ä¸º576;58mm为384
 */
printerJobs.prototype.label_set_page = function (width,height) {
  var content= "! 0 200 200 " + height + " 1\r\nPAGE-WIDTH " + width + "\r\n";
  this.text(content);
  return this;
};
/**
 * æ‰“印表格
 * lineWidth:边框线条宽度0-1
 * top_left_x:左上角X坐标
 * top_left_y:左上角Y坐标
 * bottom_right_x:右下角X坐标
 * bottom_right_y:右下角X坐标
 */
printerJobs.prototype.drawbox = function (lineWidth, top_left_x,  top_left_y,  bottom_right_x,  bottom_right_y) {
  var content = "BOX " + top_left_x + " " + top_left_y + " " + bottom_right_x + " " + bottom_right_y + " " + lineWidth + "\r\n";
  this.text(content);
  return this;
};
/**
 *  æ ‡ç­¾æ‰“印 å¿…须在结尾调用
 * @param horizontal 0:正常打印,不旋转;1:整个页面顺时针旋转180°后,打印
 * @param skip       0:打印结束后不定位,直接停止;1:打印结束后定位到标签分割线,如果无缝隙,最大进纸260mm后停止
 */
printerJobs.prototype.label_print = function (horizontal,  skip) {
  var horizontal1;
  var str;
  switch (horizontal) {
    case 0:
      horizontal1 = 0;
      break;
    case 1:
      horizontal1 = 1;
      break;
    case 2:
      horizontal1 = 2;
      break;
    default:
      horizontal1 = 0;
  }
  if (skip == 1) {
    str = "PR " + horizontal1 + "\r\nFORM\r\nPRINT\r\n";
  } else {
    str = "PR " + horizontal1 + "\r\nPRINT\r\n";
  }
  this.text(str);
  return this;
};
/**
 * æ‰“印一维码
 * @param start_x   æ‰“印的起始横坐标
 * @param start_y   æ‰“印的起始纵坐标
 * @param text      å­—符串
 * @param barcodeType      æ¡ç ç±»åž‹
 *                  0:CODE39;1:CODE128;2:CODE93;3:CODEBAR;4:EAN8;5:EAN13;6:UPCA
 *                  ;7:UPC-E;8:ITF
 * @param rotate    æ—‹è½¬è§’度 0:不旋转;1 æ—‹è½¬
 * @param linewidth æ¡ç å®½åº¦
 * @param height    æ¡ç é«˜åº¦
 // */
printerJobs.prototype.drawBarCode = function (start_x, start_y, text, barcodeType,  rotate,  linewidth,  height) {
  var str1 = "BARCODE";
  if (rotate) {
    str1 = "VB";
  }
  var st1 = "128";
  if (barcodeType == 0) {
    st1 = "39";
  } else if (barcodeType == 1) {
    st1 = "128";
  } else if (barcodeType == 2) {
    st1 = "93";
  } else if (barcodeType == 3) {
    st1 = "CODABAR";
  } else if (barcodeType == 4) {
    st1 = "EAN8";
  } else if (barcodeType == 5) {
    st1 = "EAN13";
  } else if (barcodeType == 6) {
    st1 = "UPCA";
  } else if (barcodeType == 7) {
    st1 = "UPCE";
  }
// var content = `BARCODE 128 1 1 50 0 20 123456789`;
  var content = str1 + " " + st1 + " " + linewidth + " 1 " + height + " " + start_x + " " + start_y + " " + text + "\r\n";
  this.text(content);
  return this;
};
/**
 * æ‰“印二维码
 * @param start_x äºŒç»´ç èµ·å§‹ä½ç½®
 * @param start_y äºŒç»´ç ç»“束位置
 * @param text    äºŒç»´ç å†…容
 * @param rotate  æ—‹è½¬è§’度
 * @param ver     : QrCode宽度(2-15)
 * @param lel     : QrCode纠错等级(0-20)
 */
printerJobs.prototype.drawQrCode = function ( start_x,  start_y,  text,  rotate,  ver,  lel) {
   var str1 = "B";
  if (rotate != 0) {
    str1 = "VB";
  }
  var content = str1 + " QR " + start_x + " " + start_y + " " + " M " + " " + 2 + " " + "U" + " " + ver + " " + "\r\n" + "MA," + text + "\r\n" + "ENDQR" + "\r\n";
  this.text(content);
  return this;
};
/**
     * æ‰“印文字
     *
     * @param text_x    èµ·å§‹æ¨ªåæ ‡
     * @param text_y    èµ·å§‹çºµåæ ‡
     * @param text      å­—符串
     * @param fontSize  å­—体大小 20:20点阵 1:16点阵;2:24点阵;3:32点阵;4:24点阵放大一倍;5:32点阵放大一倍
     *                  6:24点阵放大两倍;7:32点阵放大两倍;其他:24点阵
     * @param rotate    æ—‹è½¬è§’度 0:不旋转;1:90度;2:180°;3:270°
     * @param bold      æ˜¯å¦ç²—体 0:取消;1:设置
     * @param underline æ˜¯æœ‰æœ‰ä¸‹åˆ’线 false:没有;true:有
     * @param reverse   æ˜¯å¦åç™½ false:不反白;true:反白
     */
printerJobs.prototype.drawText = function ( text_x,  text_y,  text,  fontSize,  rotate,  bold,  reverse,  underline) {
  var st1 = "";
  if (rotate == 0) {
    st1 = "T";
  } else if (rotate == 1) {
    st1 = "T90";
  } else if (rotate == 2) {
    st1 = "T180";
  } else if (rotate == 3) {
    st1 = "T270";
  }
   var rev = 0;
   var und = 0;
  if (reverse) {
    rev = 1;
  }
  if (underline) {
    und = 1;
  }
  var st2 = 24;
  var st3 = 0;
  if (fontSize == 20) {
    st2 = 20;
    st3 = 0;
  } else if (fontSize == 1) {
    st2 = 55;
    st3 = 0;
  } else if (fontSize == 2) {
    st2 = 24;
    st3 = 0;
  } else if (fontSize == 3) {
    st2 = 55;
    st3 = 11;
  } else if (fontSize == 4) {
    st2 = 24;
    st3 = 11;
  } else if (fontSize == 5) {
    st2 = 55;
    st3 = 33;
  } else if (fontSize == 6) {
    st2 = 24;
    st3 = 22;
  } else if (fontSize == 7) {
    st2 = 55;
    st3 = 77;
  }
 var content = "SETBOLD " + bold + "\r\n" + "IT " + rev + "\r\n" + "UT " + und + "\r\n" + st1 + " " + st2 + " " + st3 + " " + text_x + " " + text_y + " " + text + "\r\n";
  this.text(content);
  return this;
};
/**
 * æ‰“印反显
 */
printerJobs.prototype.inverse = function ( var1,  var2,  var3,  var4,  width) {
  var str1 = "IL";
  var x0 = var1;
  var y0 = var2;
  var x1 = var3;
  var y1 = var4;
  var w = width;
  if (var1 == var3) {
    x0 = var1;                                                                                                                                           y0 = var2;
    x1 = var1 + width;
    y1 = var2;
    w = var4 - var2;
  }
  var content = str1 + " " + x0 + " " + y0 + " " + x1 + " " + y1 + " " + w + "\r\n";
  this.text(content);
  return this;
};
/**
     * çº¿æ¡
     *
     * @param lineWidth çº¿æ¡å®½åº¦
     * @param start_x   çº¿æ¡èµ·å§‹ç‚¹x坐标
     * @param start_y   çº¿æ¡èµ·å§‹ç‚¹y坐标
     * @param end_x     çº¿æ¡ç»“束点x坐标
     * @param end_y     çº¿æ¡ç»“束点y坐标
     * @param fullline  true:实线  false:?虚线
     */
printerJobs.prototype.drawLine = function ( width,  x0,  y0,  x1,  y1) {
  var content = "LINE " + x0 + " " + y0 + " " + x1 + " " + y1 + " " + width + "\r\n";
  this.text(content);
  return this;
};
/**
 * æ¸…空任务
 */
printerJobs.prototype.clear = function() {
    this._queue = Array.from(commands.HARDWARE.HW_INIT);
    return this;
};
/**
 * è¿”回ArrayBuffer
 */
printerJobs.prototype.buffer = function() {
    return new Uint8Array(this._queue).buffer;
};
module.exports = printerJobs;
LA24030_LuLiPackageLine_Pda/components/print/printerutil.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
// æ‰“印机纸宽58mm,页的宽度384,字符宽度为1,每行最多盛放32个字符
const PAGE_WIDTH = 384;
const MAX_CHAR_COUNT_EACH_LINE = 32;
/**
 * @param str
 * @returns {boolean} str是否全是中文
 */
function isChinese(str) {
    return /^[\u4e00-\u9fa5]$/.test(str);
}
/**
 * è¿”回字符串宽度(1个中文=2个英文字符)
 * @param str
 * @returns {number}
 */
function getStringWidth(str) {
    let width = 0;
    for (let i = 0, len = str.length; i < len; i++) {
        width += isChinese(str.charAt(i)) ? 2 : 1;
    }
    return width;
}
/**
 * åŒä¸€è¡Œè¾“出str1, str2,str1居左, str2居右
 * @param {string} str1 å†…容1
 * @param {string} str2 å†…容2
 * @param {number} fontWidth å­—符宽度 1/2
 * @param {string} fillWith str1 str2之间的填充字符
 *
 */
function inline(str1, str2, fillWith = ' ', fontWidth = 1) {
    const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
    // éœ€è¦å¡«å……的字符数量
    let fillCount = lineWidth - (getStringWidth(str1) + getStringWidth(str2)) % lineWidth;
    let fillStr = new Array(fillCount).fill(fillWith.charAt(0)).join('');
    return str1 + fillStr + str2;
}
/**
 * ç”¨å­—符填充一整行
 * @param {string} fillWith å¡«å……字符
 * @param {number} fontWidth å­—符宽度 1/2
 */
function fillLine(fillWith = '-', fontWidth = 1) {
    const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
    return new Array(lineWidth).fill(fillWith.charAt(0)).join('');
}
/**
 * æ–‡å­—内容居中,左右用字符填充
 * @param {string} str æ–‡å­—内容
 * @param {number} fontWidth å­—符宽度 1/2
 * @param {string} fillWith str1 str2之间的填充字符
 */
function fillAround(str, fillWith = '-', fontWidth = 1) {
    const lineWidth = MAX_CHAR_COUNT_EACH_LINE / fontWidth;
    let strWidth = getStringWidth(str);
    // å†…容已经超过一行了,没必要填充
    if (strWidth >= lineWidth) {
        return str;
    }
    // éœ€è¦å¡«å……的字符数量
    let fillCount = lineWidth - strWidth;
    // å·¦ä¾§å¡«å……的字符数量
    let leftCount = Math.round(fillCount / 2);
    // ä¸¤ä¾§çš„填充字符,需要考虑左边需要填充,右边不需要填充的情况
    let fillStr = new Array(leftCount).fill(fillWith.charAt(0)).join('');
    return fillStr + str + fillStr.substr(0, fillCount - leftCount);
}
// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
    const hexArr = Array.prototype.map.call(
        new Uint8Array(buffer),
        function(bit) {
            return ('00' + bit.toString(16)).slice(-2)
        }
    )
    return hexArr.join(',')
}
module.exports = {
    inline: inline,
    fillLine: fillLine,
    fillAround: fillAround,
    ab2hex:ab2hex,
};
LA24030_LuLiPackageLine_Pda/components/print/util.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
const formatTime = date => {
    const year = date.getFullYear()
    const month = date.getMonth() + 1
    const day = date.getDate()
    const hour = date.getHours()
    const minute = date.getMinutes()
    const second = date.getSeconds()
    return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
}
const formatNumber = n => {
    n = n.toString()
    return n[1] ? n : '0' + n
}
//4合1
function convert4to1(res) {
    let arr = [];
    for (let i = 0; i < res.length; i++) {
        if (i % 4 == 0) {
            let rule = 0.29900 * res[i] + 0.58700 * res[i + 1] + 0.11400 * res[i + 2];
            if (rule > 200) {
                res[i] = 0;
            } else {
                res[i] = 1;
            }
            arr.push(res[i]);
        }
    }
    return arr;
}
//8合1
function convert8to1(arr) {
    let data = [];
    for (let k = 0; k < arr.length; k += 8) {
        let temp = arr[k] * 128 + arr[k + 1] * 64 + arr[k + 2] * 32 + arr[k + 3] * 16 + arr[k + 4] * 8 + arr[k + 5] * 4 +
            arr[k + 6] * 2 + arr[k + 7] * 1
        data.push(temp);
    }
    return data;
}
//我的图片宽度是240,那么拼接的指令就是[29, 118, 48, 0, 30, 0, 240, 0]
//我的图片宽度是160,那么拼接的指令就是[29, 118, 48, 0, 20, 0, 160, 0]
//补充一点,打印非二维码的图片,宽度一定要是24的倍数,不然打印也会出现乱码
function toArrayBuffer(res) {
    let arr = convert4to1(res.data);
    let data = convert8to1(arr);
    let cmds = [].concat([27, 97, 1], [29, 118, 48, 0, 30, 0, 240, 0], data, [27, 74, 3], [27, 64]);
    return new Uint8Array(cmds).buffer;
}
function zip_image(res) {
    let arr = convert4to1(res.data);
    let data = convert8to1(arr);
    return data;
}
module.exports = {
    formatTime: formatTime,
    toArrayBuffer: toArrayBuffer,
    zip_image: zip_image,
}
LA24030_LuLiPackageLine_Pda/components/print/weapp.qrcode.esm.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
/**
 * weapp.qrcode.js v1.0.0 (https://github.com/yingye/weapp-qrcode#readme)
 */
var hasOwn=Object.prototype.hasOwnProperty,toStr=Object.prototype.toString,defineProperty=Object.defineProperty,gOPD=Object.getOwnPropertyDescriptor,isArray=function(t){return"function"==typeof Array.isArray?Array.isArray(t):"[object Array]"===toStr.call(t)},isPlainObject=function(t){if(!t||"[object Object]"!==toStr.call(t))return!1;var e,r=hasOwn.call(t,"constructor"),o=t.constructor&&t.constructor.prototype&&hasOwn.call(t.constructor.prototype,"isPrototypeOf");if(t.constructor&&!r&&!o)return!1;for(e in t);return void 0===e||hasOwn.call(t,e)},setProperty=function(t,e){defineProperty&&"__proto__"===e.name?defineProperty(t,e.name,{enumerable:!0,configurable:!0,value:e.newValue,writable:!0}):t[e.name]=e.newValue},getProperty=function(t,e){if("__proto__"===e){if(!hasOwn.call(t,e))return;if(gOPD)return gOPD(t,e).value}return t[e]},extend=function t(){var e,r,o,n,i,a,s=arguments[0],u=1,l=arguments.length,h=!1;for("boolean"==typeof s&&(h=s,s=arguments[1]||{},u=2),(null==s||"object"!=typeof s&&"function"!=typeof s)&&(s={});u<l;++u)if(null!=(e=arguments[u]))for(r in e)o=getProperty(s,r),s!==(n=getProperty(e,r))&&(h&&n&&(isPlainObject(n)||(i=isArray(n)))?(i?(i=!1,a=o&&isArray(o)?o:[]):a=o&&isPlainObject(o)?o:{},setProperty(s,{name:r,newValue:t(h,a,n)})):void 0!==n&&setProperty(s,{name:r,newValue:n}));return s};function QR8bitByte(t){this.mode=QRMode.MODE_8BIT_BYTE,this.data=t}function QRCode(t,e){this.typeNumber=t,this.errorCorrectLevel=e,this.modules=null,this.moduleCount=0,this.dataCache=null,this.dataList=new Array}QR8bitByte.prototype={getLength:function(t){return this.data.length},write:function(t){for(var e=0;e<this.data.length;e++)t.put(this.data.charCodeAt(e),8)}},QRCode.prototype={addData:function(t){var e=new QR8bitByte(t);this.dataList.push(e),this.dataCache=null},isDark:function(t,e){if(t<0||this.moduleCount<=t||e<0||this.moduleCount<=e)throw new Error(t+","+e);return this.modules[t][e]},getModuleCount:function(){return this.moduleCount},make:function(){if(this.typeNumber<1){var t=1;for(t=1;t<40;t++){for(var e=QRRSBlock.getRSBlocks(t,this.errorCorrectLevel),r=new QRBitBuffer,o=0,n=0;n<e.length;n++)o+=e[n].dataCount;for(n=0;n<this.dataList.length;n++){var i=this.dataList[n];r.put(i.mode,4),r.put(i.getLength(),QRUtil.getLengthInBits(i.mode,t)),i.write(r)}if(r.getLengthInBits()<=8*o)break}this.typeNumber=t}this.makeImpl(!1,this.getBestMaskPattern())},makeImpl:function(t,e){this.moduleCount=4*this.typeNumber+17,this.modules=new Array(this.moduleCount);for(var r=0;r<this.moduleCount;r++){this.modules[r]=new Array(this.moduleCount);for(var o=0;o<this.moduleCount;o++)this.modules[r][o]=null}this.setupPositionProbePattern(0,0),this.setupPositionProbePattern(this.moduleCount-7,0),this.setupPositionProbePattern(0,this.moduleCount-7),this.setupPositionAdjustPattern(),this.setupTimingPattern(),this.setupTypeInfo(t,e),this.typeNumber>=7&&this.setupTypeNumber(t),null==this.dataCache&&(this.dataCache=QRCode.createData(this.typeNumber,this.errorCorrectLevel,this.dataList)),this.mapData(this.dataCache,e)},setupPositionProbePattern:function(t,e){for(var r=-1;r<=7;r++)if(!(t+r<=-1||this.moduleCount<=t+r))for(var o=-1;o<=7;o++)e+o<=-1||this.moduleCount<=e+o||(this.modules[t+r][e+o]=0<=r&&r<=6&&(0==o||6==o)||0<=o&&o<=6&&(0==r||6==r)||2<=r&&r<=4&&2<=o&&o<=4)},getBestMaskPattern:function(){for(var t=0,e=0,r=0;r<8;r++){this.makeImpl(!0,r);var o=QRUtil.getLostPoint(this);(0==r||t>o)&&(t=o,e=r)}return e},createMovieClip:function(t,e,r){var o=t.createEmptyMovieClip(e,r);this.make();for(var n=0;n<this.modules.length;n++)for(var i=1*n,a=0;a<this.modules[n].length;a++){var s=1*a;this.modules[n][a]&&(o.beginFill(0,100),o.moveTo(s,i),o.lineTo(s+1,i),o.lineTo(s+1,i+1),o.lineTo(s,i+1),o.endFill())}return o},setupTimingPattern:function(){for(var t=8;t<this.moduleCount-8;t++)null==this.modules[t][6]&&(this.modules[t][6]=t%2==0);for(var e=8;e<this.moduleCount-8;e++)null==this.modules[6][e]&&(this.modules[6][e]=e%2==0)},setupPositionAdjustPattern:function(){for(var t=QRUtil.getPatternPosition(this.typeNumber),e=0;e<t.length;e++)for(var r=0;r<t.length;r++){var o=t[e],n=t[r];if(null==this.modules[o][n])for(var i=-2;i<=2;i++)for(var a=-2;a<=2;a++)this.modules[o+i][n+a]=-2==i||2==i||-2==a||2==a||0==i&&0==a}},setupTypeNumber:function(t){for(var e=QRUtil.getBCHTypeNumber(this.typeNumber),r=0;r<18;r++){var o=!t&&1==(e>>r&1);this.modules[Math.floor(r/3)][r%3+this.moduleCount-8-3]=o}for(r=0;r<18;r++){o=!t&&1==(e>>r&1);this.modules[r%3+this.moduleCount-8-3][Math.floor(r/3)]=o}},setupTypeInfo:function(t,e){for(var r=this.errorCorrectLevel<<3|e,o=QRUtil.getBCHTypeInfo(r),n=0;n<15;n++){var i=!t&&1==(o>>n&1);n<6?this.modules[n][8]=i:n<8?this.modules[n+1][8]=i:this.modules[this.moduleCount-15+n][8]=i}for(n=0;n<15;n++){i=!t&&1==(o>>n&1);n<8?this.modules[8][this.moduleCount-n-1]=i:n<9?this.modules[8][15-n-1+1]=i:this.modules[8][15-n-1]=i}this.modules[this.moduleCount-8][8]=!t},mapData:function(t,e){for(var r=-1,o=this.moduleCount-1,n=7,i=0,a=this.moduleCount-1;a>0;a-=2)for(6==a&&a--;;){for(var s=0;s<2;s++)if(null==this.modules[o][a-s]){var u=!1;i<t.length&&(u=1==(t[i]>>>n&1)),QRUtil.getMask(e,o,a-s)&&(u=!u),this.modules[o][a-s]=u,-1==--n&&(i++,n=7)}if((o+=r)<0||this.moduleCount<=o){o-=r,r=-r;break}}}},QRCode.PAD0=236,QRCode.PAD1=17,QRCode.createData=function(t,e,r){for(var o=QRRSBlock.getRSBlocks(t,e),n=new QRBitBuffer,i=0;i<r.length;i++){var a=r[i];n.put(a.mode,4),n.put(a.getLength(),QRUtil.getLengthInBits(a.mode,t)),a.write(n)}var s=0;for(i=0;i<o.length;i++)s+=o[i].dataCount;if(n.getLengthInBits()>8*s)throw new Error("code length overflow. ("+n.getLengthInBits()+">"+8*s+")");for(n.getLengthInBits()+4<=8*s&&n.put(0,4);n.getLengthInBits()%8!=0;)n.putBit(!1);for(;!(n.getLengthInBits()>=8*s||(n.put(QRCode.PAD0,8),n.getLengthInBits()>=8*s));)n.put(QRCode.PAD1,8);return QRCode.createBytes(n,o)},QRCode.createBytes=function(t,e){for(var r=0,o=0,n=0,i=new Array(e.length),a=new Array(e.length),s=0;s<e.length;s++){var u=e[s].dataCount,l=e[s].totalCount-u;o=Math.max(o,u),n=Math.max(n,l),i[s]=new Array(u);for(var h=0;h<i[s].length;h++)i[s][h]=255&t.buffer[h+r];r+=u;var f=QRUtil.getErrorCorrectPolynomial(l),g=new QRPolynomial(i[s],f.getLength()-1).mod(f);a[s]=new Array(f.getLength()-1);for(h=0;h<a[s].length;h++){var c=h+g.getLength()-a[s].length;a[s][h]=c>=0?g.get(c):0}}var d=0;for(h=0;h<e.length;h++)d+=e[h].totalCount;var R=new Array(d),m=0;for(h=0;h<o;h++)for(s=0;s<e.length;s++)h<i[s].length&&(R[m++]=i[s][h]);for(h=0;h<n;h++)for(s=0;s<e.length;s++)h<a[s].length&&(R[m++]=a[s][h]);return R};for(var QRMode={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},QRErrorCorrectLevel={L:1,M:0,Q:3,H:2},QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:1335,G18:7973,G15_MASK:21522,getBCHTypeInfo:function(t){for(var e=t<<10;QRUtil.getBCHDigit(e)-QRUtil.getBCHDigit(QRUtil.G15)>=0;)e^=QRUtil.G15<<QRUtil.getBCHDigit(e)-QRUtil.getBCHDigit(QRUtil.G15);return(t<<10|e)^QRUtil.G15_MASK},getBCHTypeNumber:function(t){for(var e=t<<12;QRUtil.getBCHDigit(e)-QRUtil.getBCHDigit(QRUtil.G18)>=0;)e^=QRUtil.G18<<QRUtil.getBCHDigit(e)-QRUtil.getBCHDigit(QRUtil.G18);return t<<12|e},getBCHDigit:function(t){for(var e=0;0!=t;)e++,t>>>=1;return e},getPatternPosition:function(t){return QRUtil.PATTERN_POSITION_TABLE[t-1]},getMask:function(t,e,r){switch(t){case QRMaskPattern.PATTERN000:return(e+r)%2==0;case QRMaskPattern.PATTERN001:return e%2==0;case QRMaskPattern.PATTERN010:return r%3==0;case QRMaskPattern.PATTERN011:return(e+r)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(e/2)+Math.floor(r/3))%2==0;case QRMaskPattern.PATTERN101:return e*r%2+e*r%3==0;case QRMaskPattern.PATTERN110:return(e*r%2+e*r%3)%2==0;case QRMaskPattern.PATTERN111:return(e*r%3+(e+r)%2)%2==0;default:throw new Error("bad maskPattern:"+t)}},getErrorCorrectPolynomial:function(t){for(var e=new QRPolynomial([1],0),r=0;r<t;r++)e=e.multiply(new QRPolynomial([1,QRMath.gexp(r)],0));return e},getLengthInBits:function(t,e){if(1<=e&&e<10)switch(t){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+t)}else if(e<27)switch(t){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+t)}else{if(!(e<41))throw new Error("type:"+e);switch(t){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+t)}}},getLostPoint:function(t){for(var e=t.getModuleCount(),r=0,o=0;o<e;o++)for(var n=0;n<e;n++){for(var i=0,a=t.isDark(o,n),s=-1;s<=1;s++)if(!(o+s<0||e<=o+s))for(var u=-1;u<=1;u++)n+u<0||e<=n+u||0==s&&0==u||a==t.isDark(o+s,n+u)&&i++;i>5&&(r+=3+i-5)}for(o=0;o<e-1;o++)for(n=0;n<e-1;n++){var l=0;t.isDark(o,n)&&l++,t.isDark(o+1,n)&&l++,t.isDark(o,n+1)&&l++,t.isDark(o+1,n+1)&&l++,0!=l&&4!=l||(r+=3)}for(o=0;o<e;o++)for(n=0;n<e-6;n++)t.isDark(o,n)&&!t.isDark(o,n+1)&&t.isDark(o,n+2)&&t.isDark(o,n+3)&&t.isDark(o,n+4)&&!t.isDark(o,n+5)&&t.isDark(o,n+6)&&(r+=40);for(n=0;n<e;n++)for(o=0;o<e-6;o++)t.isDark(o,n)&&!t.isDark(o+1,n)&&t.isDark(o+2,n)&&t.isDark(o+3,n)&&t.isDark(o+4,n)&&!t.isDark(o+5,n)&&t.isDark(o+6,n)&&(r+=40);var h=0;for(n=0;n<e;n++)for(o=0;o<e;o++)t.isDark(o,n)&&h++;return r+=10*(Math.abs(100*h/e/e-50)/5)}},QRMath={glog:function(t){if(t<1)throw new Error("glog("+t+")");return QRMath.LOG_TABLE[t]},gexp:function(t){for(;t<0;)t+=255;for(;t>=256;)t-=255;return QRMath.EXP_TABLE[t]},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)},i=0;i<8;i++)QRMath.EXP_TABLE[i]=1<<i;for(i=8;i<256;i++)QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];for(i=0;i<255;i++)QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;function QRPolynomial(t,e){if(void 0==t.length)throw new Error(t.length+"/"+e);for(var r=0;r<t.length&&0==t[r];)r++;this.num=new Array(t.length-r+e);for(var o=0;o<t.length-r;o++)this.num[o]=t[o+r]}function QRRSBlock(t,e){this.totalCount=t,this.dataCount=e}function QRBitBuffer(){this.buffer=new Array,this.length=0}function utf16to8(t){var e,r,o,n;for(e="",o=t.length,r=0;r<o;r++)(n=t.charCodeAt(r))>=1&&n<=127?e+=t.charAt(r):n>2047?(e+=String.fromCharCode(224|n>>12&15),e+=String.fromCharCode(128|n>>6&63),e+=String.fromCharCode(128|n>>0&63)):(e+=String.fromCharCode(192|n>>6&31),e+=String.fromCharCode(128|n>>0&63));return e}function drawQrcode(t){t=t||{},(t=extend(!0,{width:256,height:256,x:0,y:0,typeNumber:-1,correctLevel:QRErrorCorrectLevel.H,background:"#ffffff",foreground:"#000000",image:{imageResource:"",dx:0,dy:0,dWidth:100,dHeight:100}},t)).canvasId||t.ctx?function(){var e,r=new QRCode(t.typeNumber,t.correctLevel);r.addData(utf16to8(t.text)),r.make(),e=t.ctx?t.ctx:t._this?wx.createCanvasContext&&wx.createCanvasContext(t.canvasId,t._this):wx.createCanvasContext&&wx.createCanvasContext(t.canvasId);for(var o=t.width/r.getModuleCount(),n=t.height/r.getModuleCount(),i=0;i<r.getModuleCount();i++)for(var a=0;a<r.getModuleCount();a++){var s=r.isDark(i,a)?t.foreground:t.background;e.setFillStyle(s);var u=Math.ceil((a+1)*o)-Math.floor(a*o),l=Math.ceil((i+1)*o)-Math.floor(i*o);e.fillRect(Math.round(a*o)+t.x,Math.round(i*n)+t.y,u,l)}t.image.imageResource&&e.drawImage(t.image.imageResource,t.image.dx,t.image.dy,t.image.dWidth,t.image.dHeight);e.draw(!1,function(e){t.callback&&t.callback(e)})}():console.warn("please set canvasId or ctx!")}QRPolynomial.prototype={get:function(t){return this.num[t]},getLength:function(){return this.num.length},multiply:function(t){for(var e=new Array(this.getLength()+t.getLength()-1),r=0;r<this.getLength();r++)for(var o=0;o<t.getLength();o++)e[r+o]^=QRMath.gexp(QRMath.glog(this.get(r))+QRMath.glog(t.get(o)));return new QRPolynomial(e,0)},mod:function(t){if(this.getLength()-t.getLength()<0)return this;for(var e=QRMath.glog(this.get(0))-QRMath.glog(t.get(0)),r=new Array(this.getLength()),o=0;o<this.getLength();o++)r[o]=this.get(o);for(o=0;o<t.getLength();o++)r[o]^=QRMath.gexp(QRMath.glog(t.get(o))+e);return new QRPolynomial(r,0).mod(t)}},QRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],QRRSBlock.getRSBlocks=function(t,e){var r=QRRSBlock.getRsBlockTable(t,e);if(void 0==r)throw new Error("bad rs block @ typeNumber:"+t+"/errorCorrectLevel:"+e);for(var o=r.length/3,n=new Array,i=0;i<o;i++)for(var a=r[3*i+0],s=r[3*i+1],u=r[3*i+2],l=0;l<a;l++)n.push(new QRRSBlock(s,u));return n},QRRSBlock.getRsBlockTable=function(t,e){switch(e){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[4*(t-1)+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[4*(t-1)+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[4*(t-1)+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[4*(t-1)+3];default:return}},QRBitBuffer.prototype={get:function(t){var e=Math.floor(t/8);return 1==(this.buffer[e]>>>7-t%8&1)},put:function(t,e){for(var r=0;r<e;r++)this.putBit(1==(t>>>e-r-1&1))},getLengthInBits:function(){return this.length},putBit:function(t){var e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}};export default drawQrcode;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcode.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,190 @@
const barcodes = require('./barcodes/index.js')['default'];
let barcode = {};
(function () {
    // åˆå§‹åŒ–
    barcode = function (cont, ctxid, options, ctxsize, result) {
        let ops = {}, newOptions, encodings, globaContext, ctx, globaCtxid, cbCanvasSize, cbResult;
        globaCtxid = ctxid
        cbCanvasSize = ctxsize
        cbResult = result
        newOptions = Object.assign(ops, options);
        // ä¿®æˆmargin
        fixMargin(newOptions)
        // å¤„理options æ•°æ®
        if (newOptions.text == '' || cont == '') {
            return false
        }
        // èŽ·å–ctx
        globaContext = cont
        ctx = uni.createCanvasContext(globaCtxid, globaContext)
        // èŽ·å–ç¼–ç æ•°æ®
        encodings = new barcodes[newOptions.format.toUpperCase()](newOptions.text, newOptions).encode()
        let fixencodings = fixEncodings(encodings, newOptions)
        // è¿”回canvas实际大小
        cbCanvasSize({ width: fixencodings.width, height: fixencodings.height })
        // ç»˜åˆ¶canvas
        setTimeout(() => {
            drawCanvas.render(newOptions, fixencodings)
        }, 50);
        // ç»˜åˆ¶canvas
        let drawCanvas = {
            render(options, encoding) {
                this.prepare(options, encoding)
                encoding.encodings.forEach((v, i) => {
                    this.barcode(options, v)
                    this.text(options, v)
                    this.move(v)
                });
                this.draw(options, encoding)
            },
            barcode(options, encoding) {
                let binary = encoding.data;
                let yFrom;
                if (options.textPosition == "top") {
                    yFrom = options.marginTop + options.fontSize + options.textMargin;
                } else {
                    yFrom = options.marginTop;
                }
                // ç»˜åˆ¶æ¡ç 
                ctx.fillStyle = options.lineColor;
                for (let b = 0; b < binary.length; b++) {
                    let x = b * options.width + encoding.barcodePadding;
                    let height = options.height
                    if (encoding.options) {
                        if (encoding.options.height != undefined) {
                            height = encoding.options.height
                        }
                    }
                    if (binary[b] === "1") {
                        ctx.fillRect(x, yFrom, options.width, height);
                    } else if (binary[b]) {
                        ctx.fillRect(x, yFrom, options.width, height * binary[b]);
                    }
                }
            },
            text(options, encoding) {
                if (options.displayValue) {
                    let x, y, align, size;
                    if (options.textPosition == "top") {
                        y = options.marginTop + options.fontSize;
                    } else {
                        y = options.height + options.textMargin + options.marginTop + options.fontSize;
                    }
                    if (encoding.options) {
                        if (encoding.options.textAlign != undefined) {
                            align = encoding.options.textAlign
                        }
                        if (encoding.options.fontSize != undefined) {
                            size = encoding.options.fontSize
                        }
                    } else {
                        align = options.textAlign
                        size = options.fontSize
                    }
                    ctx.setFontSize(size)
                    if (align == "left" || encoding.barcodePadding > 0) {
                        x = 0;
                        ctx.setTextAlign('left')
                    } else if (align == "right") {
                        x = encoding.width - 1;
                        ctx.setTextAlign('right')
                    }
                    else {
                        x = encoding.width / 2;
                        ctx.setTextAlign('center');
                    }
                    ctx.fillStyle = options.fontColor;
                    if (encoding.text != undefined) {
                        ctx.fillText(encoding.text, x, y);
                    }
                }
            },
            move(encoding) {
                ctx.translate(encoding.width, 0);
            },
            prepare(options, encoding) {
                // ç»˜åˆ¶èƒŒæ™¯
                if (options.background) {
                    ctx.fillStyle = options.background;
                    ctx.fillRect(0, 0, encoding.width, encoding.height);
                }
                ctx.translate(options.marginLeft, 0);
            },
            draw(options, encoding) {
                ctx.draw(false, () => {
                    this.toImgs(options, encoding)
                })
            },
            toImgs(options, encoding) {
                setTimeout(() => {
                    uni.canvasToTempFilePath({
                        width: encoding.width,
                        height: encoding.height,
                        destWidth: encoding.width,
                        destHeight: encoding.height,
                        canvasId: globaCtxid,
                        fileType: 'png',
                        success: function (res) {
                            cbResult(res.tempFilePath)
                        },
                        fail: function (res) {
                            cbResult(res)
                        },
                        complete: function () {
                            // uni.hideLoading();
                        },
                    }, globaContext);
                }, options.text.length + 100);
            }
        }
        // æ··å…¥canvas数据
        function fixEncodings(encoding, options) {
            let encodingArr = [], width = options.marginLeft + options.marginRight, height;
            if (!Array.isArray(encoding)) {
                encodingArr[0] = JSON.parse(JSON.stringify(encoding))
            } else {
                encodingArr = [...encoding]
            }
            encodingArr.forEach((v, i) => {
                // èŽ·å–æ–‡æœ¬å®½åº¦
                let textWidth = ctx.measureText(encodingArr[i].text ? encodingArr[i].text : '').width;
                // èŽ·å–æ¡å½¢ç å®½åº¦
                let barcodeWidth = encodingArr[i].data.length * options.width;
                // èŽ·å–å†…è¾¹è·
                let barcodePadding = 0;
                if (options.displayValue && barcodeWidth < textWidth) {
                    if (options.textAlign == "center") {
                        barcodePadding = Math.floor((textWidth - barcodeWidth) / 2);
                    } else if (options.textAlign == "left") {
                        barcodePadding = 0;
                    } else if (options.textAlign == "right") {
                        barcodePadding = Math.floor(textWidth - barcodeWidth);
                    }
                }
                // æ··å…¥encodingArr[i]
                encodingArr[i].barcodePadding = barcodePadding
                encodingArr[i].width = Math.ceil(Math.max(textWidth, barcodeWidth))
                width += encodingArr[i].width
                if (encodingArr[i].options) {
                    if (encodingArr[i].options.height != undefined) {
                        encodingArr[i].height = encodingArr[i].options.height + (options.displayValue && (encodingArr[i].text ? encodingArr[i].text : '').length > 0 ? options.fontSize + options.textMargin : 0) + options.marginTop + options.marginBottom;
                    } else {
                        encodingArr[i].height = height = options.height + (options.displayValue && (encodingArr[i].text ? encodingArr[i].text : '').length > 0 ? options.fontSize + options.textMargin : 0) + options.marginTop + options.marginBottom;
                    }
                } else {
                    encodingArr[i].height = height = options.height + (options.displayValue && (encodingArr[i].text ? encodingArr[i].text : '').length > 0 ? options.fontSize + options.textMargin : 0) + options.marginTop + options.marginBottom;
                }
            });
            return { encodings: encodingArr, width, height };
        }
        // ä¿®æ­£Margin
        function fixMargin(options) {
            options.marginTop = options.marginTop == undefined ? options.margin : options.marginTop;
            options.marginBottom = options.marginBottom == undefined ? options.margin : options.marginBottom;
            options.marginRight = options.marginRight == undefined ? options.margin : options.marginRight;
            options.marginLeft = options.marginLeft == undefined ? options.margin : options.marginLeft;
        }
    };
})()
export default barcode
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/Barcode.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var Barcode = function Barcode(data, options) {
    _classCallCheck(this, Barcode);
    this.data = data;
    this.text = options.text || data;
    this.options = options;
};
exports.default = Barcode;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/CODE128.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,167 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Barcode2 = require('../Barcode.js');
var _Barcode3 = _interopRequireDefault(_Barcode2);
var _constants = require('./constants');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
// This is the master class,
// it does require the start code to be included in the string
var CODE128 = function (_Barcode) {
    _inherits(CODE128, _Barcode);
    function CODE128(data, options) {
        _classCallCheck(this, CODE128);
        // Get array of ascii codes from data
        var _this = _possibleConstructorReturn(this, (CODE128.__proto__ || Object.getPrototypeOf(CODE128)).call(this, data.substring(1), options));
        _this.bytes = data.split('').map(function (char) {
            return char.charCodeAt(0);
        });
        return _this;
    }
    _createClass(CODE128, [{
        key: 'valid',
        value: function valid() {
            // ASCII value ranges 0-127, 200-211
            return (/^[\x00-\x7F\xC8-\xD3]+$/.test(this.data)
            );
        }
        // The public encoding function
    }, {
        key: 'encode',
        value: function encode() {
            var bytes = this.bytes;
            // Remove the start code from the bytes and set its index
            var startIndex = bytes.shift() - 105;
            // Get start set by index
            var startSet = _constants.SET_BY_CODE[startIndex];
            if (startSet === undefined) {
                throw new RangeError('The encoding does not start with a start character.');
            }
            if (this.shouldEncodeAsEan128() === true) {
                bytes.unshift(_constants.FNC1);
            }
            // Start encode with the right type
            var encodingResult = CODE128.next(bytes, 1, startSet);
            return {
                text: this.text === this.data ? this.text.replace(/[^\x20-\x7E]/g, '') : this.text,
                data:
                // Add the start bits
                CODE128.getBar(startIndex) +
                // Add the encoded bits
                encodingResult.result +
                // Add the checksum
                CODE128.getBar((encodingResult.checksum + startIndex) % _constants.MODULO) +
                // Add the end bits
                CODE128.getBar(_constants.STOP)
            };
        }
        // GS1-128/EAN-128
    }, {
        key: 'shouldEncodeAsEan128',
        value: function shouldEncodeAsEan128() {
            var isEAN128 = this.options.ean128 || false;
            if (typeof isEAN128 === 'string') {
                isEAN128 = isEAN128.toLowerCase() === 'true';
            }
            return isEAN128;
        }
        // Get a bar symbol by index
    }], [{
        key: 'getBar',
        value: function getBar(index) {
            return _constants.BARS[index] ? _constants.BARS[index].toString() : '';
        }
        // Correct an index by a set and shift it from the bytes array
    }, {
        key: 'correctIndex',
        value: function correctIndex(bytes, set) {
            if (set === _constants.SET_A) {
                var charCode = bytes.shift();
                return charCode < 32 ? charCode + 64 : charCode - 32;
            } else if (set === _constants.SET_B) {
                return bytes.shift() - 32;
            } else {
                return (bytes.shift() - 48) * 10 + bytes.shift() - 48;
            }
        }
    }, {
        key: 'next',
        value: function next(bytes, pos, set) {
            if (!bytes.length) {
                return { result: '', checksum: 0 };
            }
            var nextCode = void 0,
                index = void 0;
            // Special characters
            if (bytes[0] >= 200) {
                index = bytes.shift() - 105;
                var nextSet = _constants.SWAP[index];
                // Swap to other set
                if (nextSet !== undefined) {
                    nextCode = CODE128.next(bytes, pos + 1, nextSet);
                }
                // Continue on current set but encode a special character
                else {
                        // Shift
                        if ((set === _constants.SET_A || set === _constants.SET_B) && index === _constants.SHIFT) {
                            // Convert the next character so that is encoded correctly
                            bytes[0] = set === _constants.SET_A ? bytes[0] > 95 ? bytes[0] - 96 : bytes[0] : bytes[0] < 32 ? bytes[0] + 96 : bytes[0];
                        }
                        nextCode = CODE128.next(bytes, pos + 1, set);
                    }
            }
            // Continue encoding
            else {
                    index = CODE128.correctIndex(bytes, set);
                    nextCode = CODE128.next(bytes, pos + 1, set);
                }
            // Get the correct binary encoding and calculate the weight
            var enc = CODE128.getBar(index);
            var weight = index * pos;
            return {
                result: enc + nextCode.result,
                checksum: weight + nextCode.checksum
            };
        }
    }]);
    return CODE128;
}(_Barcode3.default);
exports.default = CODE128;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/CODE128A.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _CODE2 = require('./CODE128.js');
var _CODE3 = _interopRequireDefault(_CODE2);
var _constants = require('./constants');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var CODE128A = function (_CODE) {
    _inherits(CODE128A, _CODE);
    function CODE128A(string, options) {
        _classCallCheck(this, CODE128A);
        return _possibleConstructorReturn(this, (CODE128A.__proto__ || Object.getPrototypeOf(CODE128A)).call(this, _constants.A_START_CHAR + string, options));
    }
    _createClass(CODE128A, [{
        key: 'valid',
        value: function valid() {
            return new RegExp('^' + _constants.A_CHARS + '+$').test(this.data);
        }
    }]);
    return CODE128A;
}(_CODE3.default);
exports.default = CODE128A;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/CODE128B.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _CODE2 = require('./CODE128.js');
var _CODE3 = _interopRequireDefault(_CODE2);
var _constants = require('./constants');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var CODE128B = function (_CODE) {
    _inherits(CODE128B, _CODE);
    function CODE128B(string, options) {
        _classCallCheck(this, CODE128B);
        return _possibleConstructorReturn(this, (CODE128B.__proto__ || Object.getPrototypeOf(CODE128B)).call(this, _constants.B_START_CHAR + string, options));
    }
    _createClass(CODE128B, [{
        key: 'valid',
        value: function valid() {
            return new RegExp('^' + _constants.B_CHARS + '+$').test(this.data);
        }
    }]);
    return CODE128B;
}(_CODE3.default);
exports.default = CODE128B;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/CODE128C.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _CODE2 = require('./CODE128.js');
var _CODE3 = _interopRequireDefault(_CODE2);
var _constants = require('./constants');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var CODE128C = function (_CODE) {
    _inherits(CODE128C, _CODE);
    function CODE128C(string, options) {
        _classCallCheck(this, CODE128C);
        return _possibleConstructorReturn(this, (CODE128C.__proto__ || Object.getPrototypeOf(CODE128C)).call(this, _constants.C_START_CHAR + string, options));
    }
    _createClass(CODE128C, [{
        key: 'valid',
        value: function valid() {
            return new RegExp('^' + _constants.C_CHARS + '+$').test(this.data);
        }
    }]);
    return CODE128C;
}(_CODE3.default);
exports.default = CODE128C;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/CODE128_AUTO.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _CODE2 = require('./CODE128');
var _CODE3 = _interopRequireDefault(_CODE2);
var _auto = require('./auto');
var _auto2 = _interopRequireDefault(_auto);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var CODE128AUTO = function (_CODE) {
    _inherits(CODE128AUTO, _CODE);
    function CODE128AUTO(data, options) {
        _classCallCheck(this, CODE128AUTO);
        // ASCII value ranges 0-127, 200-211
        if (/^[\x00-\x7F\xC8-\xD3]+$/.test(data)) {
            var _this = _possibleConstructorReturn(this, (CODE128AUTO.__proto__ || Object.getPrototypeOf(CODE128AUTO)).call(this, (0, _auto2.default)(data), options));
        } else {
            var _this = _possibleConstructorReturn(this, (CODE128AUTO.__proto__ || Object.getPrototypeOf(CODE128AUTO)).call(this, data, options));
        }
        return _possibleConstructorReturn(_this);
    }
    return CODE128AUTO;
}(_CODE3.default);
exports.default = CODE128AUTO;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/auto.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _constants = require('./constants');
// Match Set functions
var matchSetALength = function matchSetALength(string) {
    return string.match(new RegExp('^' + _constants.A_CHARS + '*'))[0].length;
};
var matchSetBLength = function matchSetBLength(string) {
    return string.match(new RegExp('^' + _constants.B_CHARS + '*'))[0].length;
};
var matchSetC = function matchSetC(string) {
    return string.match(new RegExp('^' + _constants.C_CHARS + '*'))[0];
};
// CODE128A or CODE128B
function autoSelectFromAB(string, isA) {
    var ranges = isA ? _constants.A_CHARS : _constants.B_CHARS;
    var untilC = string.match(new RegExp('^(' + ranges + '+?)(([0-9]{2}){2,})([^0-9]|$)'));
    if (untilC) {
        return untilC[1] + String.fromCharCode(204) + autoSelectFromC(string.substring(untilC[1].length));
    }
    var chars = string.match(new RegExp('^' + ranges + '+'))[0];
    if (chars.length === string.length) {
        return string;
    }
    return chars + String.fromCharCode(isA ? 205 : 206) + autoSelectFromAB(string.substring(chars.length), !isA);
}
// CODE128C
function autoSelectFromC(string) {
    var cMatch = matchSetC(string);
    var length = cMatch.length;
    if (length === string.length) {
        return string;
    }
    string = string.substring(length);
    // Select A/B depending on the longest match
    var isA = matchSetALength(string) >= matchSetBLength(string);
    return cMatch + String.fromCharCode(isA ? 206 : 205) + autoSelectFromAB(string, isA);
}
// Detect Code Set (A, B or C) and format the string
exports.default = function (string) {
    var newString = void 0;
    var cLength = matchSetC(string).length;
    // Select 128C if the string start with enough digits
    if (cLength >= 2) {
        newString = _constants.C_START_CHAR + autoSelectFromC(string);
    } else {
        // Select A/B depending on the longest match
        var isA = matchSetALength(string) > matchSetBLength(string);
        newString = (isA ? _constants.A_START_CHAR : _constants.B_START_CHAR) + autoSelectFromAB(string, isA);
    }
    return newString.replace(/[\xCD\xCE]([^])[\xCD\xCE]/, // Any sequence between 205 and 206 characters
    function (match, char) {
        return String.fromCharCode(203) + char;
    });
};
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/constants.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _SET_BY_CODE;
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// constants for internal usage
var SET_A = exports.SET_A = 0;
var SET_B = exports.SET_B = 1;
var SET_C = exports.SET_C = 2;
// Special characters
var SHIFT = exports.SHIFT = 98;
var START_A = exports.START_A = 103;
var START_B = exports.START_B = 104;
var START_C = exports.START_C = 105;
var MODULO = exports.MODULO = 103;
var STOP = exports.STOP = 106;
var FNC1 = exports.FNC1 = 207;
// Get set by start code
var SET_BY_CODE = exports.SET_BY_CODE = (_SET_BY_CODE = {}, _defineProperty(_SET_BY_CODE, START_A, SET_A), _defineProperty(_SET_BY_CODE, START_B, SET_B), _defineProperty(_SET_BY_CODE, START_C, SET_C), _SET_BY_CODE);
// Get next set by code
var SWAP = exports.SWAP = {
    101: SET_A,
    100: SET_B,
    99: SET_C
};
var A_START_CHAR = exports.A_START_CHAR = String.fromCharCode(208); // START_A + 105
var B_START_CHAR = exports.B_START_CHAR = String.fromCharCode(209); // START_B + 105
var C_START_CHAR = exports.C_START_CHAR = String.fromCharCode(210); // START_C + 105
// 128A (Code Set A)
// ASCII characters 00 to 95 (0–9, A–Z and control codes), special characters, and FNC 1–4
var A_CHARS = exports.A_CHARS = "[\x00-\x5F\xC8-\xCF]";
// 128B (Code Set B)
// ASCII characters 32 to 127 (0–9, A–Z, a–z), special characters, and FNC 1–4
var B_CHARS = exports.B_CHARS = "[\x20-\x7F\xC8-\xCF]";
// 128C (Code Set C)
// 00–99 (encodes two digits with a single code point) and FNC1
var C_CHARS = exports.C_CHARS = "(\xCF*[0-9]{2}\xCF*)";
// CODE128 includes 107 symbols:
// 103 data symbols, 3 start symbols (A, B and C), and 1 stop symbol (the last one)
// Each symbol consist of three black bars (1) and three white spaces (0).
var BARS = exports.BARS = [11011001100, 11001101100, 11001100110, 10010011000, 10010001100, 10001001100, 10011001000, 10011000100, 10001100100, 11001001000, 11001000100, 11000100100, 10110011100, 10011011100, 10011001110, 10111001100, 10011101100, 10011100110, 11001110010, 11001011100, 11001001110, 11011100100, 11001110100, 11101101110, 11101001100, 11100101100, 11100100110, 11101100100, 11100110100, 11100110010, 11011011000, 11011000110, 11000110110, 10100011000, 10001011000, 10001000110, 10110001000, 10001101000, 10001100010, 11010001000, 11000101000, 11000100010, 10110111000, 10110001110, 10001101110, 10111011000, 10111000110, 10001110110, 11101110110, 11010001110, 11000101110, 11011101000, 11011100010, 11011101110, 11101011000, 11101000110, 11100010110, 11101101000, 11101100010, 11100011010, 11101111010, 11001000010, 11110001010, 10100110000, 10100001100, 10010110000, 10010000110, 10000101100, 10000100110, 10110010000, 10110000100, 10011010000, 10011000010, 10000110100, 10000110010, 11000010010, 11001010000, 11110111010, 11000010100, 10001111010, 10100111100, 10010111100, 10010011110, 10111100100, 10011110100, 10011110010, 11110100100, 11110010100, 11110010010, 11011011110, 11011110110, 11110110110, 10101111000, 10100011110, 10001011110, 10111101000, 10111100010, 11110101000, 11110100010, 10111011110, 10111101110, 11101011110, 11110101110, 11010000100, 11010010000, 11010011100, 1100011101011];
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE128/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.CODE128C = exports.CODE128B = exports.CODE128A = exports.CODE128 = undefined;
var _CODE128_AUTO = require('./CODE128_AUTO.js');
var _CODE128_AUTO2 = _interopRequireDefault(_CODE128_AUTO);
var _CODE128A = require('./CODE128A.js');
var _CODE128A2 = _interopRequireDefault(_CODE128A);
var _CODE128B = require('./CODE128B.js');
var _CODE128B2 = _interopRequireDefault(_CODE128B);
var _CODE128C = require('./CODE128C.js');
var _CODE128C2 = _interopRequireDefault(_CODE128C);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.CODE128 = _CODE128_AUTO2.default;
exports.CODE128A = _CODE128A2.default;
exports.CODE128B = _CODE128B2.default;
exports.CODE128C = _CODE128C2.default;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/CODE39/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.CODE39 = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Barcode2 = require("../Barcode.js");
var _Barcode3 = _interopRequireDefault(_Barcode2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation:
// https://en.wikipedia.org/wiki/Code_39#Encoding
var CODE39 = function (_Barcode) {
    _inherits(CODE39, _Barcode);
    function CODE39(data, options) {
        _classCallCheck(this, CODE39);
        data = data.toUpperCase();
        // Calculate mod43 checksum if enabled
        if (options.mod43) {
            data += getCharacter(mod43checksum(data));
        }
        return _possibleConstructorReturn(this, (CODE39.__proto__ || Object.getPrototypeOf(CODE39)).call(this, data, options));
    }
    _createClass(CODE39, [{
        key: "encode",
        value: function encode() {
            // First character is always a *
            var result = getEncoding("*");
            // Take every character and add the binary representation to the result
            for (var i = 0; i < this.data.length; i++) {
                result += getEncoding(this.data[i]) + "0";
            }
            // Last character is always a *
            result += getEncoding("*");
            return {
                data: result,
                text: this.text
            };
        }
    }, {
        key: "valid",
        value: function valid() {
            return this.data.search(/^[0-9A-Z\-\.\ \$\/\+\%]+$/) !== -1;
        }
    }]);
    return CODE39;
}(_Barcode3.default);
// All characters. The position in the array is the (checksum) value
var characters = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "-", ".", " ", "$", "/", "+", "%", "*"];
// The decimal representation of the characters, is converted to the
// corresponding binary with the getEncoding function
var encodings = [20957, 29783, 23639, 30485, 20951, 29813, 23669, 20855, 29789, 23645, 29975, 23831, 30533, 22295, 30149, 24005, 21623, 29981, 23837, 22301, 30023, 23879, 30545, 22343, 30161, 24017, 21959, 30065, 23921, 22385, 29015, 18263, 29141, 17879, 29045, 18293, 17783, 29021, 18269, 17477, 17489, 17681, 20753, 35770];
// Get the binary representation of a character by converting the encodings
// from decimal to binary
function getEncoding(character) {
    return getBinary(characterValue(character));
}
function getBinary(characterValue) {
    return encodings[characterValue].toString(2);
}
function getCharacter(characterValue) {
    return characters[characterValue];
}
function characterValue(character) {
    return characters.indexOf(character);
}
function mod43checksum(data) {
    var checksum = 0;
    for (var i = 0; i < data.length; i++) {
        checksum += characterValue(data[i]);
    }
    checksum = checksum % 43;
    return checksum;
}
exports.CODE39 = CODE39;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/EAN.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _constants = require('./constants');
var _encoder = require('./encoder');
var _encoder2 = _interopRequireDefault(_encoder);
var _Barcode2 = require('../Barcode');
var _Barcode3 = _interopRequireDefault(_Barcode2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
// Base class for EAN8 & EAN13
var EAN = function (_Barcode) {
    _inherits(EAN, _Barcode);
    function EAN(data, options) {
        _classCallCheck(this, EAN);
        // Make sure the font is not bigger than the space between the guard bars
        var _this = _possibleConstructorReturn(this, (EAN.__proto__ || Object.getPrototypeOf(EAN)).call(this, data, options));
        _this.fontSize = !options.flat && options.fontSize > options.width * 10 ? options.width * 10 : options.fontSize;
        // Make the guard bars go down half the way of the text
        _this.guardHeight = options.height + _this.fontSize / 2 + options.textMargin;
        return _this;
    }
    _createClass(EAN, [{
        key: 'encode',
        value: function encode() {
            return this.options.flat ? this.encodeFlat() : this.encodeGuarded();
        }
    }, {
        key: 'leftText',
        value: function leftText(from, to) {
            return this.text.substr(from, to);
        }
    }, {
        key: 'leftEncode',
        value: function leftEncode(data, structure) {
            return (0, _encoder2.default)(data, structure);
        }
    }, {
        key: 'rightText',
        value: function rightText(from, to) {
            return this.text.substr(from, to);
        }
    }, {
        key: 'rightEncode',
        value: function rightEncode(data, structure) {
            return (0, _encoder2.default)(data, structure);
        }
    }, {
        key: 'encodeGuarded',
        value: function encodeGuarded() {
            var textOptions = { fontSize: this.fontSize };
            var guardOptions = { height: this.guardHeight };
            return [{ data: _constants.SIDE_BIN, options: guardOptions }, { data: this.leftEncode(), text: this.leftText(), options: textOptions }, { data: _constants.MIDDLE_BIN, options: guardOptions }, { data: this.rightEncode(), text: this.rightText(), options: textOptions }, { data: _constants.SIDE_BIN, options: guardOptions }];
        }
    }, {
        key: 'encodeFlat',
        value: function encodeFlat() {
            var data = [_constants.SIDE_BIN, this.leftEncode(), _constants.MIDDLE_BIN, this.rightEncode(), _constants.SIDE_BIN];
            return {
                data: data.join(''),
                text: this.text
            };
        }
    }]);
    return EAN;
}(_Barcode3.default);
exports.default = EAN;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/EAN13.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _constants = require('./constants');
var _EAN2 = require('./EAN');
var _EAN3 = _interopRequireDefault(_EAN2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation:
// https://en.wikipedia.org/wiki/International_Article_Number_(EAN)#Binary_encoding_of_data_digits_into_EAN-13_barcode
// Calculate the checksum digit
// https://en.wikipedia.org/wiki/International_Article_Number_(EAN)#Calculation_of_checksum_digit
var checksum = function checksum(number) {
    var res = number.substr(0, 12).split('').map(function (n) {
        return +n;
    }).reduce(function (sum, a, idx) {
        return idx % 2 ? sum + a * 3 : sum + a;
    }, 0);
    return (10 - res % 10) % 10;
};
var EAN13 = function (_EAN) {
    _inherits(EAN13, _EAN);
    function EAN13(data, options) {
        _classCallCheck(this, EAN13);
        // Add checksum if it does not exist
        if (data.search(/^[0-9]{12}$/) !== -1) {
            data += checksum(data);
        }
        // Adds a last character to the end of the barcode
        var _this = _possibleConstructorReturn(this, (EAN13.__proto__ || Object.getPrototypeOf(EAN13)).call(this, data, options));
        _this.lastChar = options.lastChar;
        return _this;
    }
    _createClass(EAN13, [{
        key: 'valid',
        value: function valid() {
            return this.data.search(/^[0-9]{13}$/) !== -1 && +this.data[12] === checksum(this.data);
        }
    }, {
        key: 'leftText',
        value: function leftText() {
            return _get(EAN13.prototype.__proto__ || Object.getPrototypeOf(EAN13.prototype), 'leftText', this).call(this, 1, 6);
        }
    }, {
        key: 'leftEncode',
        value: function leftEncode() {
            var data = this.data.substr(1, 6);
            var structure = _constants.EAN13_STRUCTURE[this.data[0]];
            return _get(EAN13.prototype.__proto__ || Object.getPrototypeOf(EAN13.prototype), 'leftEncode', this).call(this, data, structure);
        }
    }, {
        key: 'rightText',
        value: function rightText() {
            return _get(EAN13.prototype.__proto__ || Object.getPrototypeOf(EAN13.prototype), 'rightText', this).call(this, 7, 6);
        }
    }, {
        key: 'rightEncode',
        value: function rightEncode() {
            var data = this.data.substr(7, 6);
            return _get(EAN13.prototype.__proto__ || Object.getPrototypeOf(EAN13.prototype), 'rightEncode', this).call(this, data, 'RRRRRR');
        }
        // The "standard" way of printing EAN13 barcodes with guard bars
    }, {
        key: 'encodeGuarded',
        value: function encodeGuarded() {
            var data = _get(EAN13.prototype.__proto__ || Object.getPrototypeOf(EAN13.prototype), 'encodeGuarded', this).call(this);
            // Extend data with left digit & last character
            if (this.options.displayValue) {
                data.unshift({
                    data: '000000000000',
                    text: this.text.substr(0, 1),
                    options: { textAlign: 'left', fontSize: this.fontSize }
                });
                if (this.options.lastChar) {
                    data.push({
                        data: '00'
                    });
                    data.push({
                        data: '00000',
                        text: this.options.lastChar,
                        options: { fontSize: this.fontSize }
                    });
                }
            }
            return data;
        }
    }]);
    return EAN13;
}(_EAN3.default);
exports.default = EAN13;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/EAN2.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _constants = require('./constants');
var _encoder = require('./encoder');
var _encoder2 = _interopRequireDefault(_encoder);
var _Barcode2 = require('../Barcode');
var _Barcode3 = _interopRequireDefault(_Barcode2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation:
// https://en.wikipedia.org/wiki/EAN_2#Encoding
var EAN2 = function (_Barcode) {
    _inherits(EAN2, _Barcode);
    function EAN2(data, options) {
        _classCallCheck(this, EAN2);
        return _possibleConstructorReturn(this, (EAN2.__proto__ || Object.getPrototypeOf(EAN2)).call(this, data, options));
    }
    _createClass(EAN2, [{
        key: 'valid',
        value: function valid() {
            return this.data.search(/^[0-9]{2}$/) !== -1;
        }
    }, {
        key: 'encode',
        value: function encode() {
            // Choose the structure based on the number mod 4
            var structure = _constants.EAN2_STRUCTURE[parseInt(this.data) % 4];
            return {
                // Start bits + Encode the two digits with 01 in between
                data: '1011' + (0, _encoder2.default)(this.data, structure, '01'),
                text: this.text
            };
        }
    }]);
    return EAN2;
}(_Barcode3.default);
exports.default = EAN2;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/EAN5.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _constants = require('./constants');
var _encoder = require('./encoder');
var _encoder2 = _interopRequireDefault(_encoder);
var _Barcode2 = require('../Barcode');
var _Barcode3 = _interopRequireDefault(_Barcode2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation:
// https://en.wikipedia.org/wiki/EAN_5#Encoding
var checksum = function checksum(data) {
    var result = data.split('').map(function (n) {
        return +n;
    }).reduce(function (sum, a, idx) {
        return idx % 2 ? sum + a * 9 : sum + a * 3;
    }, 0);
    return result % 10;
};
var EAN5 = function (_Barcode) {
    _inherits(EAN5, _Barcode);
    function EAN5(data, options) {
        _classCallCheck(this, EAN5);
        return _possibleConstructorReturn(this, (EAN5.__proto__ || Object.getPrototypeOf(EAN5)).call(this, data, options));
    }
    _createClass(EAN5, [{
        key: 'valid',
        value: function valid() {
            return this.data.search(/^[0-9]{5}$/) !== -1;
        }
    }, {
        key: 'encode',
        value: function encode() {
            var structure = _constants.EAN5_STRUCTURE[checksum(this.data)];
            return {
                data: '1011' + (0, _encoder2.default)(this.data, structure, '01'),
                text: this.text
            };
        }
    }]);
    return EAN5;
}(_Barcode3.default);
exports.default = EAN5;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/EAN8.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _EAN2 = require('./EAN');
var _EAN3 = _interopRequireDefault(_EAN2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation:
// http://www.barcodeisland.com/ean8.phtml
// Calculate the checksum digit
var checksum = function checksum(number) {
    var res = number.substr(0, 7).split('').map(function (n) {
        return +n;
    }).reduce(function (sum, a, idx) {
        return idx % 2 ? sum + a : sum + a * 3;
    }, 0);
    return (10 - res % 10) % 10;
};
var EAN8 = function (_EAN) {
    _inherits(EAN8, _EAN);
    function EAN8(data, options) {
        _classCallCheck(this, EAN8);
        // Add checksum if it does not exist
        if (data.search(/^[0-9]{7}$/) !== -1) {
            data += checksum(data);
        }
        return _possibleConstructorReturn(this, (EAN8.__proto__ || Object.getPrototypeOf(EAN8)).call(this, data, options));
    }
    _createClass(EAN8, [{
        key: 'valid',
        value: function valid() {
            return this.data.search(/^[0-9]{8}$/) !== -1 && +this.data[7] === checksum(this.data);
        }
    }, {
        key: 'leftText',
        value: function leftText() {
            return _get(EAN8.prototype.__proto__ || Object.getPrototypeOf(EAN8.prototype), 'leftText', this).call(this, 0, 4);
        }
    }, {
        key: 'leftEncode',
        value: function leftEncode() {
            var data = this.data.substr(0, 4);
            return _get(EAN8.prototype.__proto__ || Object.getPrototypeOf(EAN8.prototype), 'leftEncode', this).call(this, data, 'LLLL');
        }
    }, {
        key: 'rightText',
        value: function rightText() {
            return _get(EAN8.prototype.__proto__ || Object.getPrototypeOf(EAN8.prototype), 'rightText', this).call(this, 4, 4);
        }
    }, {
        key: 'rightEncode',
        value: function rightEncode() {
            var data = this.data.substr(4, 4);
            return _get(EAN8.prototype.__proto__ || Object.getPrototypeOf(EAN8.prototype), 'rightEncode', this).call(this, data, 'RRRR');
        }
    }]);
    return EAN8;
}(_EAN3.default);
exports.default = EAN8;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/UPC.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,165 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
exports.checksum = checksum;
var _encoder = require("./encoder");
var _encoder2 = _interopRequireDefault(_encoder);
var _Barcode2 = require("../Barcode.js");
var _Barcode3 = _interopRequireDefault(_Barcode2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation:
// https://en.wikipedia.org/wiki/Universal_Product_Code#Encoding
var UPC = function (_Barcode) {
    _inherits(UPC, _Barcode);
    function UPC(data, options) {
        _classCallCheck(this, UPC);
        // Add checksum if it does not exist
        if (data.search(/^[0-9]{11}$/) !== -1) {
            data += checksum(data);
        }
        var _this = _possibleConstructorReturn(this, (UPC.__proto__ || Object.getPrototypeOf(UPC)).call(this, data, options));
        _this.displayValue = options.displayValue;
        // Make sure the font is not bigger than the space between the guard bars
        if (options.fontSize > options.width * 10) {
            _this.fontSize = options.width * 10;
        } else {
            _this.fontSize = options.fontSize;
        }
        // Make the guard bars go down half the way of the text
        _this.guardHeight = options.height + _this.fontSize / 2 + options.textMargin;
        return _this;
    }
    _createClass(UPC, [{
        key: "valid",
        value: function valid() {
            return this.data.search(/^[0-9]{12}$/) !== -1 && this.data[11] == checksum(this.data);
        }
    }, {
        key: "encode",
        value: function encode() {
            if (this.options.flat) {
                return this.flatEncoding();
            } else {
                return this.guardedEncoding();
            }
        }
    }, {
        key: "flatEncoding",
        value: function flatEncoding() {
            var result = "";
            result += "101";
            result += (0, _encoder2.default)(this.data.substr(0, 6), "LLLLLL");
            result += "01010";
            result += (0, _encoder2.default)(this.data.substr(6, 6), "RRRRRR");
            result += "101";
            return {
                data: result,
                text: this.text
            };
        }
    }, {
        key: "guardedEncoding",
        value: function guardedEncoding() {
            var result = [];
            // Add the first digit
            if (this.displayValue) {
                result.push({
                    data: "00000000",
                    text: this.text.substr(0, 1),
                    options: { textAlign: "left", fontSize: this.fontSize }
                });
            }
            // Add the guard bars
            result.push({
                data: "101" + (0, _encoder2.default)(this.data[0], "L"),
                options: { height: this.guardHeight }
            });
            // Add the left side
            result.push({
                data: (0, _encoder2.default)(this.data.substr(1, 5), "LLLLL"),
                text: this.text.substr(1, 5),
                options: { fontSize: this.fontSize }
            });
            // Add the middle bits
            result.push({
                data: "01010",
                options: { height: this.guardHeight }
            });
            // Add the right side
            result.push({
                data: (0, _encoder2.default)(this.data.substr(6, 5), "RRRRR"),
                text: this.text.substr(6, 5),
                options: { fontSize: this.fontSize }
            });
            // Add the end bits
            result.push({
                data: (0, _encoder2.default)(this.data[11], "R") + "101",
                options: { height: this.guardHeight }
            });
            // Add the last digit
            if (this.displayValue) {
                result.push({
                    data: "00000000",
                    text: this.text.substr(11, 1),
                    options: { textAlign: "right", fontSize: this.fontSize }
                });
            }
            return result;
        }
    }]);
    return UPC;
}(_Barcode3.default);
// Calulate the checksum digit
// https://en.wikipedia.org/wiki/International_Article_Number_(EAN)#Calculation_of_checksum_digit
function checksum(number) {
    var result = 0;
    var i;
    for (i = 1; i < 11; i += 2) {
        result += parseInt(number[i]);
    }
    for (i = 0; i < 11; i += 2) {
        result += parseInt(number[i]) * 3;
    }
    return (10 - result % 10) % 10;
}
exports.default = UPC;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/UPCE.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _encoder = require('./encoder');
var _encoder2 = _interopRequireDefault(_encoder);
var _Barcode2 = require('../Barcode.js');
var _Barcode3 = _interopRequireDefault(_Barcode2);
var _UPC = require('./UPC.js');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation:
// https://en.wikipedia.org/wiki/Universal_Product_Code#Encoding
//
// UPC-E documentation:
// https://en.wikipedia.org/wiki/Universal_Product_Code#UPC-E
var EXPANSIONS = ["XX00000XXX", "XX10000XXX", "XX20000XXX", "XXX00000XX", "XXXX00000X", "XXXXX00005", "XXXXX00006", "XXXXX00007", "XXXXX00008", "XXXXX00009"];
var PARITIES = [["EEEOOO", "OOOEEE"], ["EEOEOO", "OOEOEE"], ["EEOOEO", "OOEEOE"], ["EEOOOE", "OOEEEO"], ["EOEEOO", "OEOOEE"], ["EOOEEO", "OEEOOE"], ["EOOOEE", "OEEEOO"], ["EOEOEO", "OEOEOE"], ["EOEOOE", "OEOEEO"], ["EOOEOE", "OEEOEO"]];
var UPCE = function (_Barcode) {
    _inherits(UPCE, _Barcode);
    function UPCE(data, options) {
        _classCallCheck(this, UPCE);
        var _this = _possibleConstructorReturn(this, (UPCE.__proto__ || Object.getPrototypeOf(UPCE)).call(this, data, options));
        // Code may be 6 or 8 digits;
        // A 7 digit code is ambiguous as to whether the extra digit
        // is a UPC-A check or number system digit.
        _this.isValid = false;
        if (data.search(/^[0-9]{6}$/) !== -1) {
            _this.middleDigits = data;
            _this.upcA = expandToUPCA(data, "0");
            _this.text = options.text || '' + _this.upcA[0] + data + _this.upcA[_this.upcA.length - 1];
            _this.isValid = true;
        } else if (data.search(/^[01][0-9]{7}$/) !== -1) {
            _this.middleDigits = data.substring(1, data.length - 1);
            _this.upcA = expandToUPCA(_this.middleDigits, data[0]);
            if (_this.upcA[_this.upcA.length - 1] === data[data.length - 1]) {
                _this.isValid = true;
            } else {
                // checksum mismatch
                return _possibleConstructorReturn(_this);
            }
        } else {
            return _possibleConstructorReturn(_this);
        }
        _this.displayValue = options.displayValue;
        // Make sure the font is not bigger than the space between the guard bars
        if (options.fontSize > options.width * 10) {
            _this.fontSize = options.width * 10;
        } else {
            _this.fontSize = options.fontSize;
        }
        // Make the guard bars go down half the way of the text
        _this.guardHeight = options.height + _this.fontSize / 2 + options.textMargin;
        return _this;
    }
    _createClass(UPCE, [{
        key: 'valid',
        value: function valid() {
            return this.isValid;
        }
    }, {
        key: 'encode',
        value: function encode() {
            if (this.options.flat) {
                return this.flatEncoding();
            } else {
                return this.guardedEncoding();
            }
        }
    }, {
        key: 'flatEncoding',
        value: function flatEncoding() {
            var result = "";
            result += "101";
            result += this.encodeMiddleDigits();
            result += "010101";
            return {
                data: result,
                text: this.text
            };
        }
    }, {
        key: 'guardedEncoding',
        value: function guardedEncoding() {
            var result = [];
            // Add the UPC-A number system digit beneath the quiet zone
            if (this.displayValue) {
                result.push({
                    data: "00000000",
                    text: this.text[0],
                    options: { textAlign: "left", fontSize: this.fontSize }
                });
            }
            // Add the guard bars
            result.push({
                data: "101",
                options: { height: this.guardHeight }
            });
            // Add the 6 UPC-E digits
            result.push({
                data: this.encodeMiddleDigits(),
                text: this.text.substring(1, 7),
                options: { fontSize: this.fontSize }
            });
            // Add the end bits
            result.push({
                data: "010101",
                options: { height: this.guardHeight }
            });
            // Add the UPC-A check digit beneath the quiet zone
            if (this.displayValue) {
                result.push({
                    data: "00000000",
                    text: this.text[7],
                    options: { textAlign: "right", fontSize: this.fontSize }
                });
            }
            return result;
        }
    }, {
        key: 'encodeMiddleDigits',
        value: function encodeMiddleDigits() {
            var numberSystem = this.upcA[0];
            var checkDigit = this.upcA[this.upcA.length - 1];
            var parity = PARITIES[parseInt(checkDigit)][parseInt(numberSystem)];
            return (0, _encoder2.default)(this.middleDigits, parity);
        }
    }]);
    return UPCE;
}(_Barcode3.default);
function expandToUPCA(middleDigits, numberSystem) {
    var lastUpcE = parseInt(middleDigits[middleDigits.length - 1]);
    var expansion = EXPANSIONS[lastUpcE];
    var result = "";
    var digitIndex = 0;
    for (var i = 0; i < expansion.length; i++) {
        var c = expansion[i];
        if (c === 'X') {
            result += middleDigits[digitIndex++];
        } else {
            result += c;
        }
    }
    result = '' + numberSystem + result;
    return '' + result + (0, _UPC.checksum)(result);
}
exports.default = UPCE;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/constants.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
// Standard start end and middle bits
var SIDE_BIN = exports.SIDE_BIN = '101';
var MIDDLE_BIN = exports.MIDDLE_BIN = '01010';
var BINARIES = exports.BINARIES = {
    'L': [// The L (left) type of encoding
    '0001101', '0011001', '0010011', '0111101', '0100011', '0110001', '0101111', '0111011', '0110111', '0001011'],
    'G': [// The G type of encoding
    '0100111', '0110011', '0011011', '0100001', '0011101', '0111001', '0000101', '0010001', '0001001', '0010111'],
    'R': [// The R (right) type of encoding
    '1110010', '1100110', '1101100', '1000010', '1011100', '1001110', '1010000', '1000100', '1001000', '1110100'],
    'O': [// The O (odd) encoding for UPC-E
    '0001101', '0011001', '0010011', '0111101', '0100011', '0110001', '0101111', '0111011', '0110111', '0001011'],
    'E': [// The E (even) encoding for UPC-E
    '0100111', '0110011', '0011011', '0100001', '0011101', '0111001', '0000101', '0010001', '0001001', '0010111']
};
// Define the EAN-2 structure
var EAN2_STRUCTURE = exports.EAN2_STRUCTURE = ['LL', 'LG', 'GL', 'GG'];
// Define the EAN-5 structure
var EAN5_STRUCTURE = exports.EAN5_STRUCTURE = ['GGLLL', 'GLGLL', 'GLLGL', 'GLLLG', 'LGGLL', 'LLGGL', 'LLLGG', 'LGLGL', 'LGLLG', 'LLGLG'];
// Define the EAN-13 structure
var EAN13_STRUCTURE = exports.EAN13_STRUCTURE = ['LLLLLL', 'LLGLGG', 'LLGGLG', 'LLGGGL', 'LGLLGG', 'LGGLLG', 'LGGGLL', 'LGLGLG', 'LGLGGL', 'LGGLGL'];
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/encoder.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _constants = require('./constants');
// Encode data string
var encode = function encode(data, structure, separator) {
    var encoded = data.split('').map(function (val, idx) {
        return _constants.BINARIES[structure[idx]];
    }).map(function (val, idx) {
        return val ? val[data[idx]] : '';
    });
    if (separator) {
        var last = data.length - 1;
        encoded = encoded.map(function (val, idx) {
            return idx < last ? val + separator : val;
        });
    }
    return encoded.join('');
};
exports.default = encode;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/EAN_UPC/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.UPCE = exports.UPC = exports.EAN2 = exports.EAN5 = exports.EAN8 = exports.EAN13 = undefined;
var _EAN = require('./EAN13.js');
var _EAN2 = _interopRequireDefault(_EAN);
var _EAN3 = require('./EAN8.js');
var _EAN4 = _interopRequireDefault(_EAN3);
var _EAN5 = require('./EAN5.js');
var _EAN6 = _interopRequireDefault(_EAN5);
var _EAN7 = require('./EAN2.js');
var _EAN8 = _interopRequireDefault(_EAN7);
var _UPC = require('./UPC.js');
var _UPC2 = _interopRequireDefault(_UPC);
var _UPCE = require('./UPCE.js');
var _UPCE2 = _interopRequireDefault(_UPCE);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.EAN13 = _EAN2.default;
exports.EAN8 = _EAN4.default;
exports.EAN5 = _EAN6.default;
exports.EAN2 = _EAN8.default;
exports.UPC = _UPC2.default;
exports.UPCE = _UPCE2.default;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/GenericBarcode/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.GenericBarcode = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Barcode2 = require("../Barcode.js");
var _Barcode3 = _interopRequireDefault(_Barcode2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var GenericBarcode = function (_Barcode) {
    _inherits(GenericBarcode, _Barcode);
    function GenericBarcode(data, options) {
        _classCallCheck(this, GenericBarcode);
        return _possibleConstructorReturn(this, (GenericBarcode.__proto__ || Object.getPrototypeOf(GenericBarcode)).call(this, data, options)); // Sets this.data and this.text
    }
    // Return the corresponding binary numbers for the data provided
    _createClass(GenericBarcode, [{
        key: "encode",
        value: function encode() {
            return {
                data: "10101010101010101010101010101010101010101",
                text: this.text
            };
        }
        // Resturn true/false if the string provided is valid for this encoder
    }, {
        key: "valid",
        value: function valid() {
            return true;
        }
    }]);
    return GenericBarcode;
}(_Barcode3.default);
exports.GenericBarcode = GenericBarcode;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/ITF/ITF.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _constants = require('./constants');
var _Barcode2 = require('../Barcode');
var _Barcode3 = _interopRequireDefault(_Barcode2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var ITF = function (_Barcode) {
    _inherits(ITF, _Barcode);
    function ITF() {
        _classCallCheck(this, ITF);
        return _possibleConstructorReturn(this, (ITF.__proto__ || Object.getPrototypeOf(ITF)).apply(this, arguments));
    }
    _createClass(ITF, [{
        key: 'valid',
        value: function valid() {
            return this.data.search(/^([0-9]{2})+$/) !== -1;
        }
    }, {
        key: 'encode',
        value: function encode() {
            var _this2 = this;
            // Calculate all the digit pairs
            var encoded = this.data.match(/.{2}/g).map(function (pair) {
                return _this2.encodePair(pair);
            }).join('');
            return {
                data: _constants.START_BIN + encoded + _constants.END_BIN,
                text: this.text
            };
        }
        // Calculate the data of a number pair
    }, {
        key: 'encodePair',
        value: function encodePair(pair) {
            var second = _constants.BINARIES[pair[1]];
            return _constants.BINARIES[pair[0]].split('').map(function (first, idx) {
                return (first === '1' ? '111' : '1') + (second[idx] === '1' ? '000' : '0');
            }).join('');
        }
    }]);
    return ITF;
}(_Barcode3.default);
exports.default = ITF;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/ITF/ITF14.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _ITF2 = require('./ITF');
var _ITF3 = _interopRequireDefault(_ITF2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
// Calculate the checksum digit
var checksum = function checksum(data) {
    var res = data.substr(0, 13).split('').map(function (num) {
        return parseInt(num, 10);
    }).reduce(function (sum, n, idx) {
        return sum + n * (3 - idx % 2 * 2);
    }, 0);
    return Math.ceil(res / 10) * 10 - res;
};
var ITF14 = function (_ITF) {
    _inherits(ITF14, _ITF);
    function ITF14(data, options) {
        _classCallCheck(this, ITF14);
        // Add checksum if it does not exist
        if (data.search(/^[0-9]{13}$/) !== -1) {
            data += checksum(data);
        }
        return _possibleConstructorReturn(this, (ITF14.__proto__ || Object.getPrototypeOf(ITF14)).call(this, data, options));
    }
    _createClass(ITF14, [{
        key: 'valid',
        value: function valid() {
            return this.data.search(/^[0-9]{14}$/) !== -1 && +this.data[13] === checksum(this.data);
        }
    }]);
    return ITF14;
}(_ITF3.default);
exports.default = ITF14;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/ITF/constants.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var START_BIN = exports.START_BIN = '1010';
var END_BIN = exports.END_BIN = '11101';
var BINARIES = exports.BINARIES = ['00110', '10001', '01001', '11000', '00101', '10100', '01100', '00011', '10010', '01010'];
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/ITF/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.ITF14 = exports.ITF = undefined;
var _ITF = require('./ITF');
var _ITF2 = _interopRequireDefault(_ITF);
var _ITF3 = require('./ITF14');
var _ITF4 = _interopRequireDefault(_ITF3);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.ITF = _ITF2.default;
exports.ITF14 = _ITF4.default;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/MSI.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Barcode2 = require("../Barcode.js");
var _Barcode3 = _interopRequireDefault(_Barcode2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation
// https://en.wikipedia.org/wiki/MSI_Barcode#Character_set_and_binary_lookup
var MSI = function (_Barcode) {
    _inherits(MSI, _Barcode);
    function MSI(data, options) {
        _classCallCheck(this, MSI);
        return _possibleConstructorReturn(this, (MSI.__proto__ || Object.getPrototypeOf(MSI)).call(this, data, options));
    }
    _createClass(MSI, [{
        key: "encode",
        value: function encode() {
            // Start bits
            var ret = "110";
            for (var i = 0; i < this.data.length; i++) {
                // Convert the character to binary (always 4 binary digits)
                var digit = parseInt(this.data[i]);
                var bin = digit.toString(2);
                bin = addZeroes(bin, 4 - bin.length);
                // Add 100 for every zero and 110 for every 1
                for (var b = 0; b < bin.length; b++) {
                    ret += bin[b] == "0" ? "100" : "110";
                }
            }
            // End bits
            ret += "1001";
            return {
                data: ret,
                text: this.text
            };
        }
    }, {
        key: "valid",
        value: function valid() {
            return this.data.search(/^[0-9]+$/) !== -1;
        }
    }]);
    return MSI;
}(_Barcode3.default);
function addZeroes(number, n) {
    for (var i = 0; i < n; i++) {
        number = "0" + number;
    }
    return number;
}
exports.default = MSI;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/MSI10.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _MSI2 = require('./MSI.js');
var _MSI3 = _interopRequireDefault(_MSI2);
var _checksums = require('./checksums.js');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var MSI10 = function (_MSI) {
    _inherits(MSI10, _MSI);
    function MSI10(data, options) {
        _classCallCheck(this, MSI10);
        return _possibleConstructorReturn(this, (MSI10.__proto__ || Object.getPrototypeOf(MSI10)).call(this, data + (0, _checksums.mod10)(data), options));
    }
    return MSI10;
}(_MSI3.default);
exports.default = MSI10;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/MSI1010.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _MSI2 = require('./MSI.js');
var _MSI3 = _interopRequireDefault(_MSI2);
var _checksums = require('./checksums.js');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var MSI1010 = function (_MSI) {
    _inherits(MSI1010, _MSI);
    function MSI1010(data, options) {
        _classCallCheck(this, MSI1010);
        data += (0, _checksums.mod10)(data);
        data += (0, _checksums.mod10)(data);
        return _possibleConstructorReturn(this, (MSI1010.__proto__ || Object.getPrototypeOf(MSI1010)).call(this, data, options));
    }
    return MSI1010;
}(_MSI3.default);
exports.default = MSI1010;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/MSI11.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _MSI2 = require('./MSI.js');
var _MSI3 = _interopRequireDefault(_MSI2);
var _checksums = require('./checksums.js');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var MSI11 = function (_MSI) {
    _inherits(MSI11, _MSI);
    function MSI11(data, options) {
        _classCallCheck(this, MSI11);
        return _possibleConstructorReturn(this, (MSI11.__proto__ || Object.getPrototypeOf(MSI11)).call(this, data + (0, _checksums.mod11)(data), options));
    }
    return MSI11;
}(_MSI3.default);
exports.default = MSI11;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/MSI1110.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _MSI2 = require('./MSI.js');
var _MSI3 = _interopRequireDefault(_MSI2);
var _checksums = require('./checksums.js');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var MSI1110 = function (_MSI) {
    _inherits(MSI1110, _MSI);
    function MSI1110(data, options) {
        _classCallCheck(this, MSI1110);
        data += (0, _checksums.mod11)(data);
        data += (0, _checksums.mod10)(data);
        return _possibleConstructorReturn(this, (MSI1110.__proto__ || Object.getPrototypeOf(MSI1110)).call(this, data, options));
    }
    return MSI1110;
}(_MSI3.default);
exports.default = MSI1110;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/checksums.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.mod10 = mod10;
exports.mod11 = mod11;
function mod10(number) {
    var sum = 0;
    for (var i = 0; i < number.length; i++) {
        var n = parseInt(number[i]);
        if ((i + number.length) % 2 === 0) {
            sum += n;
        } else {
            sum += n * 2 % 10 + Math.floor(n * 2 / 10);
        }
    }
    return (10 - sum % 10) % 10;
}
function mod11(number) {
    var sum = 0;
    var weights = [2, 3, 4, 5, 6, 7];
    for (var i = 0; i < number.length; i++) {
        var n = parseInt(number[number.length - 1 - i]);
        sum += weights[i % weights.length] * n;
    }
    return (11 - sum % 11) % 11;
}
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/MSI/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.MSI1110 = exports.MSI1010 = exports.MSI11 = exports.MSI10 = exports.MSI = undefined;
var _MSI = require('./MSI.js');
var _MSI2 = _interopRequireDefault(_MSI);
var _MSI3 = require('./MSI10.js');
var _MSI4 = _interopRequireDefault(_MSI3);
var _MSI5 = require('./MSI11.js');
var _MSI6 = _interopRequireDefault(_MSI5);
var _MSI7 = require('./MSI1010.js');
var _MSI8 = _interopRequireDefault(_MSI7);
var _MSI9 = require('./MSI1110.js');
var _MSI10 = _interopRequireDefault(_MSI9);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.MSI = _MSI2.default;
exports.MSI10 = _MSI4.default;
exports.MSI11 = _MSI6.default;
exports.MSI1010 = _MSI8.default;
exports.MSI1110 = _MSI10.default;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/codabar/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,92 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.codabar = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Barcode2 = require("../Barcode.js");
var _Barcode3 = _interopRequireDefault(_Barcode2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding specification:
// http://www.barcodeisland.com/codabar.phtml
var codabar = function (_Barcode) {
    _inherits(codabar, _Barcode);
    function codabar(data, options) {
        _classCallCheck(this, codabar);
        if (data.search(/^[0-9\-\$\:\.\+\/]+$/) === 0) {
            data = "A" + data + "A";
        }
        var _this = _possibleConstructorReturn(this, (codabar.__proto__ || Object.getPrototypeOf(codabar)).call(this, data.toUpperCase(), options));
        _this.text = _this.options.text || _this.text.replace(/[A-D]/g, '');
        return _this;
    }
    _createClass(codabar, [{
        key: "valid",
        value: function valid() {
            return this.data.search(/^[A-D][0-9\-\$\:\.\+\/]+[A-D]$/) !== -1;
        }
    }, {
        key: "encode",
        value: function encode() {
            var result = [];
            var encodings = this.getEncodings();
            for (var i = 0; i < this.data.length; i++) {
                result.push(encodings[this.data.charAt(i)]);
                // for all characters except the last, append a narrow-space ("0")
                if (i !== this.data.length - 1) {
                    result.push("0");
                }
            }
            return {
                text: this.text,
                data: result.join('')
            };
        }
    }, {
        key: "getEncodings",
        value: function getEncodings() {
            return {
                "0": "101010011",
                "1": "101011001",
                "2": "101001011",
                "3": "110010101",
                "4": "101101001",
                "5": "110101001",
                "6": "100101011",
                "7": "100101101",
                "8": "100110101",
                "9": "110100101",
                "-": "101001101",
                "$": "101100101",
                ":": "1101011011",
                "/": "1101101011",
                ".": "1101101101",
                "+": "101100110011",
                "A": "1011001001",
                "B": "1001001011",
                "C": "1010010011",
                "D": "1010011001"
            };
        }
    }]);
    return codabar;
}(_Barcode3.default);
exports.codabar = codabar;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
'use strict';
Object.defineProperty(exports, "__esModule", {
    value: true
});
var _CODE = require('./CODE39/');
var _CODE2 = require('./CODE128/');
var _EAN_UPC = require('./EAN_UPC/');
var _ITF = require('./ITF/');
var _MSI = require('./MSI/');
var _pharmacode = require('./pharmacode/');
var _codabar = require('./codabar');
var _GenericBarcode = require('./GenericBarcode/');
exports.default = {
    CODE39: _CODE.CODE39,
    CODE128: _CODE2.CODE128, CODE128A: _CODE2.CODE128A, CODE128B: _CODE2.CODE128B, CODE128C: _CODE2.CODE128C,
    EAN13: _EAN_UPC.EAN13, EAN8: _EAN_UPC.EAN8, EAN5: _EAN_UPC.EAN5, EAN2: _EAN_UPC.EAN2,
    UPC: _EAN_UPC.UPC, UPCE: _EAN_UPC.UPCE,
    ITF14: _ITF.ITF14,
    ITF: _ITF.ITF,
    MSI: _MSI.MSI, MSI10: _MSI.MSI10, MSI11: _MSI.MSI11, MSI1010: _MSI.MSI1010, MSI1110: _MSI.MSI1110,
    PHARMACODE: _pharmacode.pharmacode,
    CODABAR: _codabar.codabar,
    GENERICBARCODE: _GenericBarcode.GenericBarcode
};
LA24030_LuLiPackageLine_Pda/components/tki-barcode/barcodes/pharmacode/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.pharmacode = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _Barcode2 = require("../Barcode.js");
var _Barcode3 = _interopRequireDefault(_Barcode2);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } // Encoding documentation
// http://www.gomaro.ch/ftproot/Laetus_PHARMA-CODE.pdf
var pharmacode = function (_Barcode) {
    _inherits(pharmacode, _Barcode);
    function pharmacode(data, options) {
        _classCallCheck(this, pharmacode);
        var _this = _possibleConstructorReturn(this, (pharmacode.__proto__ || Object.getPrototypeOf(pharmacode)).call(this, data, options));
        _this.number = parseInt(data, 10);
        return _this;
    }
    _createClass(pharmacode, [{
        key: "encode",
        value: function encode() {
            var z = this.number;
            var result = "";
            // http://i.imgur.com/RMm4UDJ.png
            // (source: http://www.gomaro.ch/ftproot/Laetus_PHARMA-CODE.pdf, page: 34)
            while (!isNaN(z) && z != 0) {
                if (z % 2 === 0) {
                    // Even
                    result = "11100" + result;
                    z = (z - 2) / 2;
                } else {
                    // Odd
                    result = "100" + result;
                    z = (z - 1) / 2;
                }
            }
            // Remove the two last zeroes
            result = result.slice(0, -2);
            return {
                data: result,
                text: this.text
            };
        }
    }, {
        key: "valid",
        value: function valid() {
            return this.number >= 3 && this.number <= 131070;
        }
    }]);
    return pharmacode;
}(_Barcode3.default);
exports.pharmacode = pharmacode;
LA24030_LuLiPackageLine_Pda/components/tki-barcode/tki-barcode.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,201 @@
<template xlang="wxml" minapp="mpvue">
    <view class="tki-barcode">
        <!-- #ifndef MP-ALIPAY -->
        <canvas class="tki-barcode-canvas" :canvas-id="cid" :style="{width:canvasWidth+'px',height:canvasHeight+'px'}" />
        <!-- #endif -->
        <!-- #ifdef MP-ALIPAY -->
        <canvas v-if="val === '' || defaultOpations.text === val" :id="cid" :width="canvasWidth" :height="canvasHeight" class="tki-barcode-canvas" />
        <!-- #endif -->
        <image v-show="show" :src="result" :style="{width:canvasWidth+'px',height:canvasHeight+'px'}" />
    </view>
</template>
<script>
// const barcode = require('./barcode.js');
import barCode from "./barcode.js"
const opations = {
    // format: "CODE128",//选择要使用的条形码类型 å¾®ä¿¡æ”¯æŒçš„æ¡ç ç±»åž‹æœ‰ code128\code39\ena13\ean8\upc\itf14\
    width: 4,//设置条之间的宽度
    height: 120,//高度
    displayValue: true,//是否在条形码下方显示文字
    // text: "1234567890",//覆盖显示的文本
    textAlign: "center",//设置文本的水平对齐方式
    textPosition: "bottom",//设置文本的垂直位置
    textMargin: 0,//设置条形码和文本之间的间距
    fontSize: 24,//设置文本的大小
    fontColor: "#000000",//设置文本的颜色
    lineColor: "#000000",//设置条形码的颜色
    background: "#FFFFFF",//设置条形码的背景色
    margin: 0,//设置条形码周围的空白边距
    marginTop: undefined,//设置条形码周围的上边距
    marginBottom: undefined,//设置条形码周围的下边距
    marginLeft: undefined,//设置条形码周围的左边距
    marginRight: undefined,//设置条形码周围的右边距
}
export default {
    name: "tkiBarcode",
    props: {
        show: {
            type: Boolean,
            default: true
        },
        cid: {
            type: String,
            default: 'tki-barcode-canvas'
        },
        unit: {
            type: String,
            default: 'upx'
        },
        val: {
            type: String,
            default: ''
        },
        format: {
            type: String,
            default: 'CODE128'
        },
        opations: {
            type: Object,
            default: function () {
                return {}
            }
        },
        onval: {
            type: Boolean,
            default: false
        },
        loadMake: {
            type: Boolean,
            default: true
        },
    },
    data() {
        return {
            result: '',
            canvasWidth: 0,
            canvasHeight: 0,
            defaultOpations: Object.assign({}, opations)
        }
    },
    onUnload: function () {
    },
    methods: {
        _makeCode() {
            let that = this
            // åˆå¹¶å‚æ•°
            Object.assign(this.defaultOpations, this.opations)
            if (that.unit == "upx") {
                /* if (that.defaultOpations.width) {
                    that.defaultOpations.width = uni.upx2px(that.defaultOpations.width)
                } */
                if (that.defaultOpations.height) {
                    that.defaultOpations.height = uni.upx2px(that.defaultOpations.height)
                }
                if (that.defaultOpations.fontSize) {
                    that.defaultOpations.fontSize = uni.upx2px(that.defaultOpations.fontSize)
                }
            }
            if (that._empty(that.defaultOpations.text)) {
                that.defaultOpations.text = that.val
            }
            if (that._empty(that.defaultOpations.format)) {
                that.defaultOpations.format = that.format
            }
            // console.log(JSON.stringify(that.defaultOpations))
            this.$nextTick(() => {
                setTimeout(() => {
                    new barCode(that, that.cid, that.defaultOpations,
                        function (res) { // ç”Ÿæˆæ¡å½¢ç æ¬¾é«˜å›žè°ƒ
                            that.canvasWidth = res.width
                            that.canvasHeight = res.height
                        },
                        function (res) { // ç”Ÿæˆæ¡å½¢ç çš„回调
                            // è¿”回值
                            that._result(res)
                            // é‡ç½®é»˜è®¤å‚æ•°
                            that.defaultOpations = opations
                        },
                    );
                }, 100)
            })
        },
        _clearCode() {
            this._result('')
        },
        _saveCode() {
            let that = this;
            if (this.result != "") {
                uni.saveImageToPhotosAlbum({
                    filePath: that.result,
                    success: function () {
                        uni.showToast({
                            title: '条形码保存成功',
                            icon: 'success',
                            duration: 2000
                        });
                    }
                });
            }
        },
        _result(res) {
            this.result = res;
            this.$emit('result', res)
        },
        _empty(v) {
            let tp = typeof v,
                rt = false;
            if (tp == "number" && String(v) == "") {
                rt = true
            } else if (tp == "undefined") {
                rt = true
            } else if (tp == "object") {
                if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
            } else if (tp == "string") {
                if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
            } else if (tp == "function") {
                rt = false
            }
            return rt
        }
    },
    watch: {
        val(n, o) {
            this.defaultOpations.text = n
            if (this.onval) {
                if (n != o && !this._empty(n)) {
                    this._makeCode()
                }
            }
        },
        opations: {
            handler(n,o){
                if (this.onval) {
                    if (!this._empty(n)) {
                        this._makeCode()
                    }
                }
            },
            deep: true
        }
    },
    mounted () {
        if (this.loadMake) {
            if (!this._empty(this.val)) {
                this._makeCode()
            }
        }
    },
}
</script>
<style>
.tki-barcode {
    position: relative;
}
.tki-barcode-canvas {
    position: fixed!important;
    top: -99999upx;
    left: -99999upx;
    z-index: -99999;
}
</style>
LA24030_LuLiPackageLine_Pda/components/tki-qrcode/qrcode.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1201 @@
let QRCode = {};
(function () {
    /**
     * èŽ·å–å•ä¸ªå­—ç¬¦çš„utf8编码
     * unicode BMP平面约65535个字符
     * @param {num} code
     * return {array}
     */
    function unicodeFormat8(code) {
        // 1 byte
        var c0, c1, c2;
        if (code < 128) {
            return [code];
            // 2 bytes
        } else if (code < 2048) {
            c0 = 192 + (code >> 6);
            c1 = 128 + (code & 63);
            return [c0, c1];
            // 3 bytes
        } else {
            c0 = 224 + (code >> 12);
            c1 = 128 + (code >> 6 & 63);
            c2 = 128 + (code & 63);
            return [c0, c1, c2];
        }
    }
    /**
     * èŽ·å–å­—ç¬¦ä¸²çš„utf8编码字节串
     * @param {string} string
     * @return {array}
     */
    function getUTF8Bytes(string) {
        var utf8codes = [];
        for (var i = 0; i < string.length; i++) {
            var code = string.charCodeAt(i);
            var utf8 = unicodeFormat8(code);
            for (var j = 0; j < utf8.length; j++) {
                utf8codes.push(utf8[j]);
            }
        }
        return utf8codes;
    }
    /**
     * äºŒç»´ç ç®—法实现
     * @param {string} data              è¦ç¼–码的信息字符串
     * @param {num} errorCorrectLevel çº é”™ç­‰çº§
     */
    function QRCodeAlg(data, errorCorrectLevel) {
        this.typeNumber = -1; //版本
        this.errorCorrectLevel = errorCorrectLevel;
        this.modules = null; //二维矩阵,存放最终结果
        this.moduleCount = 0; //矩阵大小
        this.dataCache = null; //数据缓存
        this.rsBlocks = null; //版本数据信息
        this.totalDataCount = -1; //可使用的数据量
        this.data = data;
        this.utf8bytes = getUTF8Bytes(data);
        this.make();
    }
    QRCodeAlg.prototype = {
        constructor: QRCodeAlg,
        /**
         * èŽ·å–äºŒç»´ç çŸ©é˜µå¤§å°
         * @return {num} çŸ©é˜µå¤§å°
         */
        getModuleCount: function () {
            return this.moduleCount;
        },
        /**
         * ç¼–码
         */
        make: function () {
            this.getRightType();
            this.dataCache = this.createData();
            this.createQrcode();
        },
        /**
         * è®¾ç½®äºŒä½çŸ©é˜µåŠŸèƒ½å›¾å½¢
         * @param  {bool} test è¡¨ç¤ºæ˜¯å¦åœ¨å¯»æ‰¾æœ€å¥½æŽ©è†œé˜¶æ®µ
         * @param  {num} maskPattern æŽ©è†œçš„版本
         */
        makeImpl: function (maskPattern) {
            this.moduleCount = this.typeNumber * 4 + 17;
            this.modules = new Array(this.moduleCount);
            for (var row = 0; row < this.moduleCount; row++) {
                this.modules[row] = new Array(this.moduleCount);
            }
            this.setupPositionProbePattern(0, 0);
            this.setupPositionProbePattern(this.moduleCount - 7, 0);
            this.setupPositionProbePattern(0, this.moduleCount - 7);
            this.setupPositionAdjustPattern();
            this.setupTimingPattern();
            this.setupTypeInfo(true, maskPattern);
            if (this.typeNumber >= 7) {
                this.setupTypeNumber(true);
            }
            this.mapData(this.dataCache, maskPattern);
        },
        /**
         * è®¾ç½®äºŒç»´ç çš„位置探测图形
         * @param  {num} row æŽ¢æµ‹å›¾å½¢çš„中心横坐标
         * @param  {num} col æŽ¢æµ‹å›¾å½¢çš„中心纵坐标
         */
        setupPositionProbePattern: function (row, col) {
            for (var r = -1; r <= 7; r++) {
                if (row + r <= -1 || this.moduleCount <= row + r) continue;
                for (var c = -1; c <= 7; c++) {
                    if (col + c <= -1 || this.moduleCount <= col + c) continue;
                    if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || (0 <= c && c <= 6 && (r == 0 || r == 6)) || (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
                        this.modules[row + r][col + c] = true;
                    } else {
                        this.modules[row + r][col + c] = false;
                    }
                }
            }
        },
        /**
         * åˆ›å»ºäºŒç»´ç 
         * @return {[type]} [description]
         */
        createQrcode: function () {
            var minLostPoint = 0;
            var pattern = 0;
            var bestModules = null;
            for (var i = 0; i < 8; i++) {
                this.makeImpl(i);
                var lostPoint = QRUtil.getLostPoint(this);
                if (i == 0 || minLostPoint > lostPoint) {
                    minLostPoint = lostPoint;
                    pattern = i;
                    bestModules = this.modules;
                }
            }
            this.modules = bestModules;
            this.setupTypeInfo(false, pattern);
            if (this.typeNumber >= 7) {
                this.setupTypeNumber(false);
            }
        },
        /**
         * è®¾ç½®å®šä½å›¾å½¢
         * @return {[type]} [description]
         */
        setupTimingPattern: function () {
            for (var r = 8; r < this.moduleCount - 8; r++) {
                if (this.modules[r][6] != null) {
                    continue;
                }
                this.modules[r][6] = (r % 2 == 0);
                if (this.modules[6][r] != null) {
                    continue;
                }
                this.modules[6][r] = (r % 2 == 0);
            }
        },
        /**
         * è®¾ç½®çŸ«æ­£å›¾å½¢
         * @return {[type]} [description]
         */
        setupPositionAdjustPattern: function () {
            var pos = QRUtil.getPatternPosition(this.typeNumber);
            for (var i = 0; i < pos.length; i++) {
                for (var j = 0; j < pos.length; j++) {
                    var row = pos[i];
                    var col = pos[j];
                    if (this.modules[row][col] != null) {
                        continue;
                    }
                    for (var r = -2; r <= 2; r++) {
                        for (var c = -2; c <= 2; c++) {
                            if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {
                                this.modules[row + r][col + c] = true;
                            } else {
                                this.modules[row + r][col + c] = false;
                            }
                        }
                    }
                }
            }
        },
        /**
         * è®¾ç½®ç‰ˆæœ¬ä¿¡æ¯ï¼ˆ7以上版本才有)
         * @param  {bool} test æ˜¯å¦å¤„于判断最佳掩膜阶段
         * @return {[type]}      [description]
         */
        setupTypeNumber: function (test) {
            var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
            for (var i = 0; i < 18; i++) {
                var mod = (!test && ((bits >> i) & 1) == 1);
                this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod;
                this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
            }
        },
        /**
         * è®¾ç½®æ ¼å¼ä¿¡æ¯ï¼ˆçº é”™ç­‰çº§å’ŒæŽ©è†œç‰ˆæœ¬ï¼‰
         * @param  {bool} test
         * @param  {num} maskPattern æŽ©è†œç‰ˆæœ¬
         * @return {}
         */
        setupTypeInfo: function (test, maskPattern) {
            var data = (QRErrorCorrectLevel[this.errorCorrectLevel] << 3) | maskPattern;
            var bits = QRUtil.getBCHTypeInfo(data);
            // vertical
            for (var i = 0; i < 15; i++) {
                var mod = (!test && ((bits >> i) & 1) == 1);
                if (i < 6) {
                    this.modules[i][8] = mod;
                } else if (i < 8) {
                    this.modules[i + 1][8] = mod;
                } else {
                    this.modules[this.moduleCount - 15 + i][8] = mod;
                }
                // horizontal
                var mod = (!test && ((bits >> i) & 1) == 1);
                if (i < 8) {
                    this.modules[8][this.moduleCount - i - 1] = mod;
                } else if (i < 9) {
                    this.modules[8][15 - i - 1 + 1] = mod;
                } else {
                    this.modules[8][15 - i - 1] = mod;
                }
            }
            // fixed module
            this.modules[this.moduleCount - 8][8] = (!test);
        },
        /**
         * æ•°æ®ç¼–码
         * @return {[type]} [description]
         */
        createData: function () {
            var buffer = new QRBitBuffer();
            var lengthBits = this.typeNumber > 9 ? 16 : 8;
            buffer.put(4, 4); //添加模式
            buffer.put(this.utf8bytes.length, lengthBits);
            for (var i = 0, l = this.utf8bytes.length; i < l; i++) {
                buffer.put(this.utf8bytes[i], 8);
            }
            if (buffer.length + 4 <= this.totalDataCount * 8) {
                buffer.put(0, 4);
            }
            // padding
            while (buffer.length % 8 != 0) {
                buffer.putBit(false);
            }
            // padding
            while (true) {
                if (buffer.length >= this.totalDataCount * 8) {
                    break;
                }
                buffer.put(QRCodeAlg.PAD0, 8);
                if (buffer.length >= this.totalDataCount * 8) {
                    break;
                }
                buffer.put(QRCodeAlg.PAD1, 8);
            }
            return this.createBytes(buffer);
        },
        /**
         * çº é”™ç ç¼–码
         * @param  {buffer} buffer æ•°æ®ç¼–码
         * @return {[type]}
         */
        createBytes: function (buffer) {
            var offset = 0;
            var maxDcCount = 0;
            var maxEcCount = 0;
            var length = this.rsBlock.length / 3;
            var rsBlocks = new Array();
            for (var i = 0; i < length; i++) {
                var count = this.rsBlock[i * 3 + 0];
                var totalCount = this.rsBlock[i * 3 + 1];
                var dataCount = this.rsBlock[i * 3 + 2];
                for (var j = 0; j < count; j++) {
                    rsBlocks.push([dataCount, totalCount]);
                }
            }
            var dcdata = new Array(rsBlocks.length);
            var ecdata = new Array(rsBlocks.length);
            for (var r = 0; r < rsBlocks.length; r++) {
                var dcCount = rsBlocks[r][0];
                var ecCount = rsBlocks[r][1] - dcCount;
                maxDcCount = Math.max(maxDcCount, dcCount);
                maxEcCount = Math.max(maxEcCount, ecCount);
                dcdata[r] = new Array(dcCount);
                for (var i = 0; i < dcdata[r].length; i++) {
                    dcdata[r][i] = 0xff & buffer.buffer[i + offset];
                }
                offset += dcCount;
                var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
                var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
                var modPoly = rawPoly.mod(rsPoly);
                ecdata[r] = new Array(rsPoly.getLength() - 1);
                for (var i = 0; i < ecdata[r].length; i++) {
                    var modIndex = i + modPoly.getLength() - ecdata[r].length;
                    ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0;
                }
            }
            var data = new Array(this.totalDataCount);
            var index = 0;
            for (var i = 0; i < maxDcCount; i++) {
                for (var r = 0; r < rsBlocks.length; r++) {
                    if (i < dcdata[r].length) {
                        data[index++] = dcdata[r][i];
                    }
                }
            }
            for (var i = 0; i < maxEcCount; i++) {
                for (var r = 0; r < rsBlocks.length; r++) {
                    if (i < ecdata[r].length) {
                        data[index++] = ecdata[r][i];
                    }
                }
            }
            return data;
        },
        /**
         * å¸ƒç½®æ¨¡å—,构建最终信息
         * @param  {} data
         * @param  {} maskPattern
         * @return {}
         */
        mapData: function (data, maskPattern) {
            var inc = -1;
            var row = this.moduleCount - 1;
            var bitIndex = 7;
            var byteIndex = 0;
            for (var col = this.moduleCount - 1; col > 0; col -= 2) {
                if (col == 6) col--;
                while (true) {
                    for (var c = 0; c < 2; c++) {
                        if (this.modules[row][col - c] == null) {
                            var dark = false;
                            if (byteIndex < data.length) {
                                dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
                            }
                            var mask = QRUtil.getMask(maskPattern, row, col - c);
                            if (mask) {
                                dark = !dark;
                            }
                            this.modules[row][col - c] = dark;
                            bitIndex--;
                            if (bitIndex == -1) {
                                byteIndex++;
                                bitIndex = 7;
                            }
                        }
                    }
                    row += inc;
                    if (row < 0 || this.moduleCount <= row) {
                        row -= inc;
                        inc = -inc;
                        break;
                    }
                }
            }
        }
    };
    /**
     * å¡«å……字段
     */
    QRCodeAlg.PAD0 = 0xEC;
    QRCodeAlg.PAD1 = 0x11;
    //---------------------------------------------------------------------
    // çº é”™ç­‰çº§å¯¹åº”的编码
    //---------------------------------------------------------------------
    var QRErrorCorrectLevel = [1, 0, 3, 2];
    //---------------------------------------------------------------------
    // æŽ©è†œç‰ˆæœ¬
    //---------------------------------------------------------------------
    var QRMaskPattern = {
        PATTERN000: 0,
        PATTERN001: 1,
        PATTERN010: 2,
        PATTERN011: 3,
        PATTERN100: 4,
        PATTERN101: 5,
        PATTERN110: 6,
        PATTERN111: 7
    };
    //---------------------------------------------------------------------
    // å·¥å…·ç±»
    //---------------------------------------------------------------------
    var QRUtil = {
        /*
        æ¯ä¸ªç‰ˆæœ¬çŸ«æ­£å›¾å½¢çš„位置
         */
        PATTERN_POSITION_TABLE: [
            [],
            [6, 18],
            [6, 22],
            [6, 26],
            [6, 30],
            [6, 34],
            [6, 22, 38],
            [6, 24, 42],
            [6, 26, 46],
            [6, 28, 50],
            [6, 30, 54],
            [6, 32, 58],
            [6, 34, 62],
            [6, 26, 46, 66],
            [6, 26, 48, 70],
            [6, 26, 50, 74],
            [6, 30, 54, 78],
            [6, 30, 56, 82],
            [6, 30, 58, 86],
            [6, 34, 62, 90],
            [6, 28, 50, 72, 94],
            [6, 26, 50, 74, 98],
            [6, 30, 54, 78, 102],
            [6, 28, 54, 80, 106],
            [6, 32, 58, 84, 110],
            [6, 30, 58, 86, 114],
            [6, 34, 62, 90, 118],
            [6, 26, 50, 74, 98, 122],
            [6, 30, 54, 78, 102, 126],
            [6, 26, 52, 78, 104, 130],
            [6, 30, 56, 82, 108, 134],
            [6, 34, 60, 86, 112, 138],
            [6, 30, 58, 86, 114, 142],
            [6, 34, 62, 90, 118, 146],
            [6, 30, 54, 78, 102, 126, 150],
            [6, 24, 50, 76, 102, 128, 154],
            [6, 28, 54, 80, 106, 132, 158],
            [6, 32, 58, 84, 110, 136, 162],
            [6, 26, 54, 82, 110, 138, 166],
            [6, 30, 58, 86, 114, 142, 170]
        ],
        G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
        G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
        G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
        /*
        BCH编码格式信息
         */
        getBCHTypeInfo: function (data) {
            var d = data << 10;
            while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
                d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)));
            }
            return ((data << 10) | d) ^ QRUtil.G15_MASK;
        },
        /*
        BCH编码版本信息
         */
        getBCHTypeNumber: function (data) {
            var d = data << 12;
            while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
                d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)));
            }
            return (data << 12) | d;
        },
        /*
        èŽ·å–BCH位信息
         */
        getBCHDigit: function (data) {
            var digit = 0;
            while (data != 0) {
                digit++;
                data >>>= 1;
            }
            return digit;
        },
        /*
        èŽ·å–ç‰ˆæœ¬å¯¹åº”çš„çŸ«æ­£å›¾å½¢ä½ç½®
         */
        getPatternPosition: function (typeNumber) {
            return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
        },
        /*
        æŽ©è†œç®—法
         */
        getMask: function (maskPattern, i, j) {
            switch (maskPattern) {
                case QRMaskPattern.PATTERN000:
                    return (i + j) % 2 == 0;
                case QRMaskPattern.PATTERN001:
                    return i % 2 == 0;
                case QRMaskPattern.PATTERN010:
                    return j % 3 == 0;
                case QRMaskPattern.PATTERN011:
                    return (i + j) % 3 == 0;
                case QRMaskPattern.PATTERN100:
                    return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
                case QRMaskPattern.PATTERN101:
                    return (i * j) % 2 + (i * j) % 3 == 0;
                case QRMaskPattern.PATTERN110:
                    return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
                case QRMaskPattern.PATTERN111:
                    return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
                default:
                    throw new Error("bad maskPattern:" + maskPattern);
            }
        },
        /*
        èŽ·å–RS的纠错多项式
         */
        getErrorCorrectPolynomial: function (errorCorrectLength) {
            var a = new QRPolynomial([1], 0);
            for (var i = 0; i < errorCorrectLength; i++) {
                a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
            }
            return a;
        },
        /*
        èŽ·å–è¯„ä»·
         */
        getLostPoint: function (qrCode) {
            var moduleCount = qrCode.getModuleCount(),
                lostPoint = 0,
                darkCount = 0;
            for (var row = 0; row < moduleCount; row++) {
                var sameCount = 0;
                var head = qrCode.modules[row][0];
                for (var col = 0; col < moduleCount; col++) {
                    var current = qrCode.modules[row][col];
                    //level 3 è¯„ä»·
                    if (col < moduleCount - 6) {
                        if (current && !qrCode.modules[row][col + 1] && qrCode.modules[row][col + 2] && qrCode.modules[row][col + 3] && qrCode.modules[row][col + 4] && !qrCode.modules[row][col + 5] && qrCode.modules[row][col + 6]) {
                            if (col < moduleCount - 10) {
                                if (qrCode.modules[row][col + 7] && qrCode.modules[row][col + 8] && qrCode.modules[row][col + 9] && qrCode.modules[row][col + 10]) {
                                    lostPoint += 40;
                                }
                            } else if (col > 3) {
                                if (qrCode.modules[row][col - 1] && qrCode.modules[row][col - 2] && qrCode.modules[row][col - 3] && qrCode.modules[row][col - 4]) {
                                    lostPoint += 40;
                                }
                            }
                        }
                    }
                    //level 2 è¯„ä»·
                    if ((row < moduleCount - 1) && (col < moduleCount - 1)) {
                        var count = 0;
                        if (current) count++;
                        if (qrCode.modules[row + 1][col]) count++;
                        if (qrCode.modules[row][col + 1]) count++;
                        if (qrCode.modules[row + 1][col + 1]) count++;
                        if (count == 0 || count == 4) {
                            lostPoint += 3;
                        }
                    }
                    //level 1 è¯„ä»·
                    if (head ^ current) {
                        sameCount++;
                    } else {
                        head = current;
                        if (sameCount >= 5) {
                            lostPoint += (3 + sameCount - 5);
                        }
                        sameCount = 1;
                    }
                    //level 4 è¯„ä»·
                    if (current) {
                        darkCount++;
                    }
                }
            }
            for (var col = 0; col < moduleCount; col++) {
                var sameCount = 0;
                var head = qrCode.modules[0][col];
                for (var row = 0; row < moduleCount; row++) {
                    var current = qrCode.modules[row][col];
                    //level 3 è¯„ä»·
                    if (row < moduleCount - 6) {
                        if (current && !qrCode.modules[row + 1][col] && qrCode.modules[row + 2][col] && qrCode.modules[row + 3][col] && qrCode.modules[row + 4][col] && !qrCode.modules[row + 5][col] && qrCode.modules[row + 6][col]) {
                            if (row < moduleCount - 10) {
                                if (qrCode.modules[row + 7][col] && qrCode.modules[row + 8][col] && qrCode.modules[row + 9][col] && qrCode.modules[row + 10][col]) {
                                    lostPoint += 40;
                                }
                            } else if (row > 3) {
                                if (qrCode.modules[row - 1][col] && qrCode.modules[row - 2][col] && qrCode.modules[row - 3][col] && qrCode.modules[row - 4][col]) {
                                    lostPoint += 40;
                                }
                            }
                        }
                    }
                    //level 1 è¯„ä»·
                    if (head ^ current) {
                        sameCount++;
                    } else {
                        head = current;
                        if (sameCount >= 5) {
                            lostPoint += (3 + sameCount - 5);
                        }
                        sameCount = 1;
                    }
                }
            }
            // LEVEL4
            var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
            lostPoint += ratio * 10;
            return lostPoint;
        }
    };
    //---------------------------------------------------------------------
    // QRMath使用的数学工具
    //---------------------------------------------------------------------
    var QRMath = {
        /*
        å°†n转化为a^m
         */
        glog: function (n) {
            if (n < 1) {
                throw new Error("glog(" + n + ")");
            }
            return QRMath.LOG_TABLE[n];
        },
        /*
        å°†a^m转化为n
         */
        gexp: function (n) {
            while (n < 0) {
                n += 255;
            }
            while (n >= 256) {
                n -= 255;
            }
            return QRMath.EXP_TABLE[n];
        },
        EXP_TABLE: new Array(256),
        LOG_TABLE: new Array(256)
    };
    for (var i = 0; i < 8; i++) {
        QRMath.EXP_TABLE[i] = 1 << i;
    }
    for (var i = 8; i < 256; i++) {
        QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
    }
    for (var i = 0; i < 255; i++) {
        QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
    }
    //---------------------------------------------------------------------
    // QRPolynomial å¤šé¡¹å¼
    //---------------------------------------------------------------------
    /**
     * å¤šé¡¹å¼ç±»
     * @param {Array} num   ç³»æ•°
     * @param {num} shift a^shift
     */
    function QRPolynomial(num, shift) {
        if (num.length == undefined) {
            throw new Error(num.length + "/" + shift);
        }
        var offset = 0;
        while (offset < num.length && num[offset] == 0) {
            offset++;
        }
        this.num = new Array(num.length - offset + shift);
        for (var i = 0; i < num.length - offset; i++) {
            this.num[i] = num[i + offset];
        }
    }
    QRPolynomial.prototype = {
        get: function (index) {
            return this.num[index];
        },
        getLength: function () {
            return this.num.length;
        },
        /**
         * å¤šé¡¹å¼ä¹˜æ³•
         * @param  {QRPolynomial} e è¢«ä¹˜å¤šé¡¹å¼
         * @return {[type]}   [description]
         */
        multiply: function (e) {
            var num = new Array(this.getLength() + e.getLength() - 1);
            for (var i = 0; i < this.getLength(); i++) {
                for (var j = 0; j < e.getLength(); j++) {
                    num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
                }
            }
            return new QRPolynomial(num, 0);
        },
        /**
         * å¤šé¡¹å¼æ¨¡è¿ç®—
         * @param  {QRPolynomial} e æ¨¡å¤šé¡¹å¼
         * @return {}
         */
        mod: function (e) {
            var tl = this.getLength(),
                el = e.getLength();
            if (tl - el < 0) {
                return this;
            }
            var num = new Array(tl);
            for (var i = 0; i < tl; i++) {
                num[i] = this.get(i);
            }
            while (num.length >= el) {
                var ratio = QRMath.glog(num[0]) - QRMath.glog(e.get(0));
                for (var i = 0; i < e.getLength(); i++) {
                    num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
                }
                while (num[0] == 0) {
                    num.shift();
                }
            }
            return new QRPolynomial(num, 0);
        }
    };
    //---------------------------------------------------------------------
    // RS_BLOCK_TABLE
    //---------------------------------------------------------------------
    /*
    äºŒç»´ç å„个版本信息[块数, æ¯å—中的数据块数, æ¯å—中的信息块数]
     */
    var RS_BLOCK_TABLE = [
        // L
        // M
        // Q
        // H
        // 1
        [1, 26, 19],
        [1, 26, 16],
        [1, 26, 13],
        [1, 26, 9],
        // 2
        [1, 44, 34],
        [1, 44, 28],
        [1, 44, 22],
        [1, 44, 16],
        // 3
        [1, 70, 55],
        [1, 70, 44],
        [2, 35, 17],
        [2, 35, 13],
        // 4
        [1, 100, 80],
        [2, 50, 32],
        [2, 50, 24],
        [4, 25, 9],
        // 5
        [1, 134, 108],
        [2, 67, 43],
        [2, 33, 15, 2, 34, 16],
        [2, 33, 11, 2, 34, 12],
        // 6
        [2, 86, 68],
        [4, 43, 27],
        [4, 43, 19],
        [4, 43, 15],
        // 7
        [2, 98, 78],
        [4, 49, 31],
        [2, 32, 14, 4, 33, 15],
        [4, 39, 13, 1, 40, 14],
        // 8
        [2, 121, 97],
        [2, 60, 38, 2, 61, 39],
        [4, 40, 18, 2, 41, 19],
        [4, 40, 14, 2, 41, 15],
        // 9
        [2, 146, 116],
        [3, 58, 36, 2, 59, 37],
        [4, 36, 16, 4, 37, 17],
        [4, 36, 12, 4, 37, 13],
        // 10
        [2, 86, 68, 2, 87, 69],
        [4, 69, 43, 1, 70, 44],
        [6, 43, 19, 2, 44, 20],
        [6, 43, 15, 2, 44, 16],
        // 11
        [4, 101, 81],
        [1, 80, 50, 4, 81, 51],
        [4, 50, 22, 4, 51, 23],
        [3, 36, 12, 8, 37, 13],
        // 12
        [2, 116, 92, 2, 117, 93],
        [6, 58, 36, 2, 59, 37],
        [4, 46, 20, 6, 47, 21],
        [7, 42, 14, 4, 43, 15],
        // 13
        [4, 133, 107],
        [8, 59, 37, 1, 60, 38],
        [8, 44, 20, 4, 45, 21],
        [12, 33, 11, 4, 34, 12],
        // 14
        [3, 145, 115, 1, 146, 116],
        [4, 64, 40, 5, 65, 41],
        [11, 36, 16, 5, 37, 17],
        [11, 36, 12, 5, 37, 13],
        // 15
        [5, 109, 87, 1, 110, 88],
        [5, 65, 41, 5, 66, 42],
        [5, 54, 24, 7, 55, 25],
        [11, 36, 12],
        // 16
        [5, 122, 98, 1, 123, 99],
        [7, 73, 45, 3, 74, 46],
        [15, 43, 19, 2, 44, 20],
        [3, 45, 15, 13, 46, 16],
        // 17
        [1, 135, 107, 5, 136, 108],
        [10, 74, 46, 1, 75, 47],
        [1, 50, 22, 15, 51, 23],
        [2, 42, 14, 17, 43, 15],
        // 18
        [5, 150, 120, 1, 151, 121],
        [9, 69, 43, 4, 70, 44],
        [17, 50, 22, 1, 51, 23],
        [2, 42, 14, 19, 43, 15],
        // 19
        [3, 141, 113, 4, 142, 114],
        [3, 70, 44, 11, 71, 45],
        [17, 47, 21, 4, 48, 22],
        [9, 39, 13, 16, 40, 14],
        // 20
        [3, 135, 107, 5, 136, 108],
        [3, 67, 41, 13, 68, 42],
        [15, 54, 24, 5, 55, 25],
        [15, 43, 15, 10, 44, 16],
        // 21
        [4, 144, 116, 4, 145, 117],
        [17, 68, 42],
        [17, 50, 22, 6, 51, 23],
        [19, 46, 16, 6, 47, 17],
        // 22
        [2, 139, 111, 7, 140, 112],
        [17, 74, 46],
        [7, 54, 24, 16, 55, 25],
        [34, 37, 13],
        // 23
        [4, 151, 121, 5, 152, 122],
        [4, 75, 47, 14, 76, 48],
        [11, 54, 24, 14, 55, 25],
        [16, 45, 15, 14, 46, 16],
        // 24
        [6, 147, 117, 4, 148, 118],
        [6, 73, 45, 14, 74, 46],
        [11, 54, 24, 16, 55, 25],
        [30, 46, 16, 2, 47, 17],
        // 25
        [8, 132, 106, 4, 133, 107],
        [8, 75, 47, 13, 76, 48],
        [7, 54, 24, 22, 55, 25],
        [22, 45, 15, 13, 46, 16],
        // 26
        [10, 142, 114, 2, 143, 115],
        [19, 74, 46, 4, 75, 47],
        [28, 50, 22, 6, 51, 23],
        [33, 46, 16, 4, 47, 17],
        // 27
        [8, 152, 122, 4, 153, 123],
        [22, 73, 45, 3, 74, 46],
        [8, 53, 23, 26, 54, 24],
        [12, 45, 15, 28, 46, 16],
        // 28
        [3, 147, 117, 10, 148, 118],
        [3, 73, 45, 23, 74, 46],
        [4, 54, 24, 31, 55, 25],
        [11, 45, 15, 31, 46, 16],
        // 29
        [7, 146, 116, 7, 147, 117],
        [21, 73, 45, 7, 74, 46],
        [1, 53, 23, 37, 54, 24],
        [19, 45, 15, 26, 46, 16],
        // 30
        [5, 145, 115, 10, 146, 116],
        [19, 75, 47, 10, 76, 48],
        [15, 54, 24, 25, 55, 25],
        [23, 45, 15, 25, 46, 16],
        // 31
        [13, 145, 115, 3, 146, 116],
        [2, 74, 46, 29, 75, 47],
        [42, 54, 24, 1, 55, 25],
        [23, 45, 15, 28, 46, 16],
        // 32
        [17, 145, 115],
        [10, 74, 46, 23, 75, 47],
        [10, 54, 24, 35, 55, 25],
        [19, 45, 15, 35, 46, 16],
        // 33
        [17, 145, 115, 1, 146, 116],
        [14, 74, 46, 21, 75, 47],
        [29, 54, 24, 19, 55, 25],
        [11, 45, 15, 46, 46, 16],
        // 34
        [13, 145, 115, 6, 146, 116],
        [14, 74, 46, 23, 75, 47],
        [44, 54, 24, 7, 55, 25],
        [59, 46, 16, 1, 47, 17],
        // 35
        [12, 151, 121, 7, 152, 122],
        [12, 75, 47, 26, 76, 48],
        [39, 54, 24, 14, 55, 25],
        [22, 45, 15, 41, 46, 16],
        // 36
        [6, 151, 121, 14, 152, 122],
        [6, 75, 47, 34, 76, 48],
        [46, 54, 24, 10, 55, 25],
        [2, 45, 15, 64, 46, 16],
        // 37
        [17, 152, 122, 4, 153, 123],
        [29, 74, 46, 14, 75, 47],
        [49, 54, 24, 10, 55, 25],
        [24, 45, 15, 46, 46, 16],
        // 38
        [4, 152, 122, 18, 153, 123],
        [13, 74, 46, 32, 75, 47],
        [48, 54, 24, 14, 55, 25],
        [42, 45, 15, 32, 46, 16],
        // 39
        [20, 147, 117, 4, 148, 118],
        [40, 75, 47, 7, 76, 48],
        [43, 54, 24, 22, 55, 25],
        [10, 45, 15, 67, 46, 16],
        // 40
        [19, 148, 118, 6, 149, 119],
        [18, 75, 47, 31, 76, 48],
        [34, 54, 24, 34, 55, 25],
        [20, 45, 15, 61, 46, 16]
    ];
    /**
     * æ ¹æ®æ•°æ®èŽ·å–å¯¹åº”ç‰ˆæœ¬
     * @return {[type]} [description]
     */
    QRCodeAlg.prototype.getRightType = function () {
        for (var typeNumber = 1; typeNumber < 41; typeNumber++) {
            var rsBlock = RS_BLOCK_TABLE[(typeNumber - 1) * 4 + this.errorCorrectLevel];
            if (rsBlock == undefined) {
                throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + this.errorCorrectLevel);
            }
            var length = rsBlock.length / 3;
            var totalDataCount = 0;
            for (var i = 0; i < length; i++) {
                var count = rsBlock[i * 3 + 0];
                var dataCount = rsBlock[i * 3 + 2];
                totalDataCount += dataCount * count;
            }
            var lengthBytes = typeNumber > 9 ? 2 : 1;
            if (this.utf8bytes.length + lengthBytes < totalDataCount || typeNumber == 40) {
                this.typeNumber = typeNumber;
                this.rsBlock = rsBlock;
                this.totalDataCount = totalDataCount;
                break;
            }
        }
    };
    //---------------------------------------------------------------------
    // QRBitBuffer
    //---------------------------------------------------------------------
    function QRBitBuffer() {
        this.buffer = new Array();
        this.length = 0;
    }
    QRBitBuffer.prototype = {
        get: function (index) {
            var bufIndex = Math.floor(index / 8);
            return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1);
        },
        put: function (num, length) {
            for (var i = 0; i < length; i++) {
                this.putBit(((num >>> (length - i - 1)) & 1));
            }
        },
        putBit: function (bit) {
            var bufIndex = Math.floor(this.length / 8);
            if (this.buffer.length <= bufIndex) {
                this.buffer.push(0);
            }
            if (bit) {
                this.buffer[bufIndex] |= (0x80 >>> (this.length % 8));
            }
            this.length++;
        }
    };
    // xzedit
    let qrcodeAlgObjCache = [];
    /**
     * äºŒç»´ç æž„造函数,主要用于绘制
     * @param  {参数列表} opt ä¼ é€’参数
     * @return {}
     */
    QRCode = function (opt) {
        //设置默认参数
        this.options = {
            text: '',
            size: 256,
            correctLevel: 3,
            background: '#ffffff',
            foreground: '#000000',
            pdground: '#000000',
            image: '',
            imageSize: 30,
            canvasId: opt.canvasId,
            context: opt.context,
            usingComponents: opt.usingComponents,
            showLoading: opt.showLoading,
            loadingText: opt.loadingText,
        };
        if (typeof opt === 'string') { // åªç¼–码ASCII字符串
            opt = {
                text: opt
            };
        }
        if (opt) {
            for (var i in opt) {
                this.options[i] = opt[i];
            }
        }
        //使用QRCodeAlg创建二维码结构
        var qrCodeAlg = null;
        for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
            if (qrcodeAlgObjCache[i].text == this.options.text && qrcodeAlgObjCache[i].text.correctLevel == this.options.correctLevel) {
                qrCodeAlg = qrcodeAlgObjCache[i].obj;
                break;
            }
        }
        if (i == l) {
            qrCodeAlg = new QRCodeAlg(this.options.text, this.options.correctLevel);
            qrcodeAlgObjCache.push({
                text: this.options.text,
                correctLevel: this.options.correctLevel,
                obj: qrCodeAlg
            });
        }
        /**
         * è®¡ç®—矩阵点的前景色
         * @param {Obj} config
         * @param {Number} config.row ç‚¹x坐标
         * @param {Number} config.col ç‚¹y坐标
         * @param {Number} config.count çŸ©é˜µå¤§å°
         * @param {Number} config.options ç»„ä»¶çš„options
         * @return {String}
         */
        let getForeGround = function (config) {
            var options = config.options;
            if (options.pdground && (
                (config.row > 1 && config.row < 5 && config.col > 1 && config.col < 5) ||
                (config.row > (config.count - 6) && config.row < (config.count - 2) && config.col > 1 && config.col < 5) ||
                (config.row > 1 && config.row < 5 && config.col > (config.count - 6) && config.col < (config.count - 2))
            )) {
                return options.pdground;
            }
            return options.foreground;
        }
        // åˆ›å»ºcanvas
        let createCanvas = function (options) {
            if (options.showLoading) {
                uni.showLoading({
                    title: options.loadingText,
                    mask: true
                });
            }
            var ctx = uni.createCanvasContext(options.canvasId, options.context);
            var count = qrCodeAlg.getModuleCount();
            var ratioSize = options.size;
            var ratioImgSize = options.imageSize;
            //计算每个点的长宽
            var tileW = (ratioSize / count).toPrecision(4);
            var tileH = (ratioSize / count).toPrecision(4);
            //绘制
            for (var row = 0; row < count; row++) {
                for (var col = 0; col < count; col++) {
                    var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
                    var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW));
                    var foreground = getForeGround({
                        row: row,
                        col: col,
                        count: count,
                        options: options
                    });
                    ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
                    ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
                }
            }
            if (options.image) {
                var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
                var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
                drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
                ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
                // ç”»åœ†è§’矩形
                function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
                    ctxi.setLineWidth(lineWidth);
                    ctxi.setFillStyle(options.background);
                    ctxi.setStrokeStyle(options.background);
                    ctxi.beginPath(); // draw top and top right corner
                    ctxi.moveTo(x + r, y);
                    ctxi.arcTo(x + width, y, x + width, y + r, r); // draw right side and bottom right corner
                    ctxi.arcTo(x + width, y + height, x + width - r, y + height, r); // draw bottom and bottom left corner
                    ctxi.arcTo(x, y + height, x, y + height - r, r); // draw left and top left corner
                    ctxi.arcTo(x, y, x + r, y, r);
                    ctxi.closePath();
                    if (fill) {
                        ctxi.fill();
                    }
                    if (stroke) {
                        ctxi.stroke();
                    }
                }
            }
            setTimeout(() => {
                ctx.draw(true, () => {
                    // ä¿å­˜åˆ°ä¸´æ—¶åŒºåŸŸ
                    setTimeout(() => {
                        uni.canvasToTempFilePath({
                            width: options.width,
                            height: options.height,
                            destWidth: options.width,
                            destHeight: options.height,
                            canvasId: options.canvasId,
                            quality: Number(1),
                            success: function (res) {
                                if (options.cbResult) {
                                    options.cbResult(res.tempFilePath)
                                }
                            },
                            fail: function (res) {
                                if (options.cbResult) {
                                    options.cbResult(res)
                                }
                            },
                            complete: function () {
                                if (options.showLoading){
                                    uni.hideLoading();
                                }
                            },
                        }, options.context);
                    }, options.text.length + 100);
                });
            }, options.usingComponents ? 0 : 150);
        }
        createCanvas(this.options);
        // ç©ºåˆ¤å®š
        let empty = function (v) {
            let tp = typeof v,
                rt = false;
            if (tp == "number" && String(v) == "") {
                rt = true
            } else if (tp == "undefined") {
                rt = true
            } else if (tp == "object") {
                if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
            } else if (tp == "string") {
                if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
            } else if (tp == "function") {
                rt = false
            }
            return rt
        }
    };
    QRCode.prototype.clear = function (fn) {
        var ctx = uni.createCanvasContext(this.options.canvasId, this.options.context)
        ctx.clearRect(0, 0, this.options.size, this.options.size)
        ctx.draw(false, () => {
            if (fn) {
                fn()
            }
        })
    };
})()
export default QRCode
LA24030_LuLiPackageLine_Pda/components/tki-qrcode/tki-qrcode.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,206 @@
<template xlang="wxml" minapp="mpvue">
    <view class="tki-qrcode">
        <!-- #ifndef MP-ALIPAY -->
        <canvas class="tki-qrcode-canvas" :canvas-id="cid" :style="{width:cpSize+'px',height:cpSize+'px'}" />
        <!-- #endif -->
        <!-- #ifdef MP-ALIPAY -->
        <canvas :id="cid" :width="cpSize" :height="cpSize" class="tki-qrcode-canvas" />
        <!-- #endif -->
        <image v-show="show" :src="result" :style="{width:cpSize+'px',height:cpSize+'px'}" />
    </view>
</template>
<script>
import QRCode from "./qrcode.js"
let qrcode
export default {
    name: "tki-qrcode",
    props: {
        cid: {
            type: String,
            default: 'tki-qrcode-canvas'
        },
        size: {
            type: Number,
            default: 200
        },
        unit: {
            type: String,
            default: 'upx'
        },
        show: {
            type: Boolean,
            default: true
        },
        val: {
            type: String,
            default: ''
        },
        background: {
            type: String,
            default: '#ffffff'
        },
        foreground: {
            type: String,
            default: '#000000'
        },
        pdground: {
            type: String,
            default: '#000000'
        },
        icon: {
            type: String,
            default: ''
        },
        iconSize: {
            type: Number,
            default: 40
        },
        lv: {
            type: Number,
            default: 3
        },
        onval: {
            type: Boolean,
            default: false
        },
        loadMake: {
            type: Boolean,
            default: false
        },
        usingComponents: {
            type: Boolean,
            default: true
        },
        showLoading: {
            type: Boolean,
            default: true
        },
        loadingText: {
            type: String,
            default: '二维码生成中'
        },
    },
    data() {
        return {
            result: '',
        }
    },
    methods: {
        _makeCode() {
            let that = this
            if (!this._empty(this.val)) {
                setTimeout(() => {
                    qrcode = new QRCode({
                        context: that, // ä¸Šä¸‹æ–‡çŽ¯å¢ƒ
                        canvasId:that.cid, // canvas-id
                        usingComponents: that.usingComponents, // æ˜¯å¦æ˜¯è‡ªå®šä¹‰ç»„ä»¶
                        showLoading: that.showLoading, // æ˜¯å¦æ˜¾ç¤ºloading
                        loadingText: that.loadingText, // loading文字
                        text: that.val, // ç”Ÿæˆå†…容
                        size: that.cpSize, // äºŒç»´ç å¤§å°
                        background: that.background, // èƒŒæ™¯è‰²
                        foreground: that.foreground, // å‰æ™¯è‰²
                        pdground: that.pdground, // å®šä½è§’点颜色
                        correctLevel: that.lv, // å®¹é”™çº§åˆ«
                        image: that.icon, // äºŒç»´ç å›¾æ ‡
                        imageSize: that.iconSize,// äºŒç»´ç å›¾æ ‡å¤§å°
                        cbResult: function (res) { // ç”ŸæˆäºŒç»´ç çš„回调
                            that._result(res)
                        },
                    });
                }, 1)
            } else {
                uni.showToast({
                    title: '二维码内容不能为空',
                    icon: 'none',
                    duration: 2000
                });
            }
        },
        _clearCode() {
            this._result('')
            qrcode.clear()
        },
        _saveCode() {
            let that = this;
            if (this.result != "") {
                uni.saveImageToPhotosAlbum({
                    filePath: that.result,
                    success: function () {
                        uni.showToast({
                            title: '二维码保存成功',
                            icon: 'success',
                            duration: 2000
                        });
                    }
                });
            }
        },
        _result(res) {
            this.result = res;
            this.$emit('result', res)
        },
        _empty(v) {
            let tp = typeof v,
                rt = false;
            if (tp == "number" && String(v) == "") {
                rt = true
            } else if (tp == "undefined") {
                rt = true
            } else if (tp == "object") {
                if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
            } else if (tp == "string") {
                if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
            } else if (tp == "function") {
                rt = false
            }
            return rt
        }
    },
    watch: {
        size: function (n, o) {
            if (n != o && !this._empty(n)) {
                this.cSize = n
                if (!this._empty(this.val)) {
                    this._makeCode()
                }
            }
        },
        val: function (n, o) {
            if (this.onval) {
                if (n != o && !this._empty(n)) {
                    this._makeCode()
                }
            }
        }
    },
    computed: {
        cpSize() {
            if(this.unit == "upx"){
                return uni.upx2px(this.size)
            }else{
                return this.size
            }
        }
    },
    mounted () {
        if (this.loadMake) {
            if (!this._empty(this.val)) {
                this._makeCode()
            }
        }
    },
}
</script>
<style>
.tki-qrcode {
  position: relative;
}
.tki-qrcode-canvas {
  position: fixed!important;
  top: -99999upx;
  left: -99999upx;
  z-index: -99999;
}
</style>
LA24030_LuLiPackageLine_Pda/main.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
import Vue from 'vue'
import App from './App'
//引入uview
import uView from "uview-ui";
import {baseUrl} from 'utils/request.js'
import createStore from './store'
// import  svg  from '@/styles/iconfont/svg.js';
// Vue.use(svg)
Vue.use(uView);
const store = createStore(Vue);
Vue.config.productionTip = false
Vue.prototype.$myHOST = baseUrl
App.mpType = 'app'
import cuCustom from './colorui/components/cu-custom.vue'
Vue.component('cu-custom',cuCustom)
import LodingModal from './components/Loding.vue'
Vue.component('loding-modal',LodingModal)
import CuModal from './components/CuModal.vue'
Vue.component('cu-modal',CuModal)
import BottomModal from './components/BottomModal.vue'
Vue.component('bottom-modal',BottomModal)
import noclick from './components/noclick.js'
Vue.prototype.$noMultipleClicks = noclick.noMultipleClicks;
const app = new Vue({
    ...App,
    store
})
app.$mount()
LA24030_LuLiPackageLine_Pda/manifest.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,131 @@
{
    "name" : "LuLiMuYe_Package_Pda",
    "appid" : "__UNI__28D87EB",
    "description" : "2024.07.29",
    "versionName" : "1.0.0",
    "versionCode" : "100",
    "transformPx" : false,
    "app-plus" : {
        "usingComponents" : true,
        "nvueStyleCompiler" : "uni-app",
        "compilerVersion" : 3,
        "splashscreen" : {
            "alwaysShowBeforeRender" : true,
            "waiting" : true,
            "autoclose" : true,
            "delay" : 0
        },
        "compatible" : {
            "ignoreVersion" : true //true表示忽略版本检查提示框
        },
        "modules" : {
            "Bluetooth" : {},
            "Camera" : {},
            "Push" : {}
        },
        "distribute" : {
            "android" : {
                "permissions" : [
                    "<uses-feature android:name=\"android.hardware.camera\"/>",
                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
                ],
                "autoSdkPermissions" : true,
                "targetSdkVersion" : "apk的目标版本,默认值为28",
                "abiFilters" : [ "armeabi-v7a", "x86" ]
            },
            "ios" : {
                "dSYMs" : false
            },
            "sdkConfigs" : {
                "ad" : {},
                "push" : {}
            },
            "icons" : {
                "android" : {
                    "hdpi" : "unpackage/res/icons/72x72.png",
                    "xhdpi" : "unpackage/res/icons/96x96.png",
                    "xxhdpi" : "unpackage/res/icons/144x144.png",
                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
                },
                "ios" : {
                    "appstore" : "unpackage/res/icons/1024x1024.png",
                    "ipad" : {
                        "app" : "unpackage/res/icons/76x76.png",
                        "app@2x" : "unpackage/res/icons/152x152.png",
                        "notification" : "unpackage/res/icons/20x20.png",
                        "notification@2x" : "unpackage/res/icons/40x40.png",
                        "proapp@2x" : "unpackage/res/icons/167x167.png",
                        "settings" : "unpackage/res/icons/29x29.png",
                        "settings@2x" : "unpackage/res/icons/58x58.png",
                        "spotlight" : "unpackage/res/icons/40x40.png",
                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
                    },
                    "iphone" : {
                        "app@2x" : "unpackage/res/icons/120x120.png",
                        "app@3x" : "unpackage/res/icons/180x180.png",
                        "notification@2x" : "unpackage/res/icons/40x40.png",
                        "notification@3x" : "unpackage/res/icons/60x60.png",
                        "settings@2x" : "unpackage/res/icons/58x58.png",
                        "settings@3x" : "unpackage/res/icons/87x87.png",
                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
                    }
                }
            }
        },
        "nativePlugins" : {
            "PrintSDK" : {
                "__plugin_info__" : {
                    "name" : "SPD_PrintSDK_Uniapp",
                    "description" : "思必拓打印机插件2.1",
                    "platforms" : "Android",
                    "url" : "",
                    "android_package_name" : "",
                    "ios_bundle_id" : "",
                    "isCloud" : false,
                    "bought" : -1,
                    "pid" : "",
                    "parameters" : {}
                }
            }
        }
    },
    "quickapp" : {},
    "mp-weixin" : {
        "appid" : "",
        "setting" : {
            "urlCheck" : false
        },
        "usingComponents" : true
    },
    "mp-alipay" : {
        "usingComponents" : true
    },
    "mp-baidu" : {
        "usingComponents" : true
    },
    "mp-toutiao" : {
        "usingComponents" : true
    },
    "uniStatistics" : {
        "enable" : false
    },
    "h5" : {
        "router" : {
            "mode" : "hash"
        }
    }
}
LA24030_LuLiPackageLine_Pda/mixins/Blue.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,427 @@
import printerUtil from '@/components/print/printerutil.js'
const PrinterJobs = require('@/components/print/printerjobs.js')
import {
    getDate
} from '@/utils/dateTime.js'
export default {
    data() {
        return {
            list: [],
            deviceId: '',
            serviceId: '',
            characteristics: [],
            characteristicId: '',
            deviceslist: []
        }
    },
    onShow() {
        this.list = []
        this.deviceslist = []
    },
    methods: {
        //初始化蓝牙设备
        openBluetoothAdapter() {
            let _this = this
            uni.openBluetoothAdapter({
                success: (res) => { //已打开
                    uni.getBluetoothAdapterState({ //蓝牙的匹配状态
                        success: (res1) => {
                            console.log(res1, '本机设备的蓝牙已打开')
                            // å¼€å§‹æœç´¢è“ç‰™è®¾å¤‡
                            _this.startBluetoothDeviceDiscovery()
                            uni.setStorageSync('blueShow', true)
                        },
                        fail(error) {
                            uni.showToast({
                                icon: 'none',
                                title: '查看手机蓝牙是否打开err'
                            });
                        }
                    });
                },
                fail: err => { //未打开
                    uni.setStorageSync('blueShow', false)
                    uni.showToast({
                        icon: 'none',
                        title: '查看手机蓝牙是否打开'
                    });
                }
            })
        },
        // å¼€å§‹æœç´¢è“ç‰™è®¾å¤‡
        startBluetoothDeviceDiscovery() {
            uni.startBluetoothDevicesDiscovery({
                success: (res) => {
                    // å‘现外围设备
                    uni.showLoading({
                        title: '加载中',
                        mask: true
                    });
                    this.onBluetoothDeviceFound()
                },
                fail: err => {
                    console.log(err, '错误信息')
                }
            })
        },
        // å‘现外围设备
        onBluetoothDeviceFound() {
            uni.onBluetoothDeviceFound((res) => {
                this.deviceslist.length > 0 ? uni.hideLoading() : ''
                if (this.deviceslist.indexOf(res.devices[0].deviceId) == -1) {
                    this.deviceslist.push(res.devices[0].deviceId)
                    if (res.devices[0].name != "") {
                        uni.hideLoading();
                        this.list.push({
                            name: res.devices[0].name,
                            deviceId: res.devices[0].deviceId
                        })
                    }
                }
            })
        },
        //获取在蓝牙模块生效期间所有已发现的蓝牙设备。包括已经和本机处于连接状态的设备。
        getBluetoothDevices() {
            console.log("获取蓝牙设备");
            uni.getBluetoothDevices({
                success: res => {
                    console.log('获取蓝牙设备成功:');
                    console.log(res.devices);
                }
            });
        },
        //选择设备连接吧deviceId传进来
        createBLEConnection(deviceId) {
            //data里面建立一个deviceId,存储起来
            let _this = this
            uni.showLoading({
                title: '连接蓝牙中...',
                mask: true
            });
            this.stopBluetoothDevicesDiscovery()
            this.deviceId = deviceId,
                //连接蓝牙
                uni.createBLEConnection({
                    // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                    deviceId: deviceId,
                    success(res) {
                        uni.hideLoading();
                        uni.showToast({
                            icon: 'none',
                            title: '蓝牙连接成功'
                        });
                        uni.setStorageSync("deviceId", deviceId) //把已经连接的蓝牙设备信息放入缓存
                        setTimeout(() => {
                            _this.getBLEDeviceServices(deviceId)
                        }, 1000)
                    },
                    fail(res) {
                        uni.showToast({
                            icon: 'none',
                            title: '蓝牙连接失败'
                        });
                    }
                })
        },
        // åœæ­¢æœå¯»è“ç‰™è®¾å¤‡
        stopBluetoothDevicesDiscovery() {
            uni.stopBluetoothDevicesDiscovery({
                success: e => {
                    this.loading = false
                    console.log('停止搜索蓝牙设备:' + e.errMsg);
                },
                fail: e => {
                    console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode);
                }
            });
        },
        //获取蓝牙特征
        getBLEDeviceCharacteristics(deviceId, serviceId) {
            console.log("进入特征");
            setTimeout(() => {
                uni.getBLEDeviceCharacteristics({
                    // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                    deviceId: deviceId,
                    // è¿™é‡Œçš„ serviceId éœ€è¦åœ¨ getBLEDeviceServices æŽ¥å£ä¸­èŽ·å–
                    serviceId: serviceId,
                    success: (res) => {
                        console.log(res, '特征getBLEDeviceCharacteristics')
                        this.characteristics = res.characteristics
                        res.characteristics.forEach((item) => {
                            if (item.uuid.indexOf("FF02") != -1) {
                                this.characteristicId = item.uuid
                                uni.setStorageSync("characteristicId", item
                                    .uuid) //把已经连接的蓝牙设备标识放入缓存
                                uni.setStorageSync("serviceId",
                                    serviceId) //把已经连接的蓝牙设备ID放入缓存
                                //console.log('characteristicId:', item.uuid)
                                //利用传参的形势传给下面的notify,这里的uuid如果都需要用到,就不用做判断了,建议使用setTimeout进行间隔性的调用此方法
                                // this.notifyBLECharacteristicValueChange(item.uuid)
                                setTimeout(() => {
                                    uni.hideLoading();
                                    this.BottomShow = false
                                    this.DrawerModalL = false
                                }, 1000)
                            }
                        })
                    },
                    fail: (res) => {
                        console.log(res)
                    }
                })
            }, 1000)
        },
        // å¯ç”¨ notify åŠŸèƒ½
        notifyBLECharacteristicValueChange(characteristicId) {
            let _this = this
            console.log('deviceId' + _this.deviceId)
            console.log('serviceId' + _this.serviceId)
            console.log('characteristicId' + characteristicId)
            // _this.fanhui()
            uni.notifyBLECharacteristicValueChange({
                state: true, // å¯ç”¨ notify åŠŸèƒ½
                // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                deviceId: this.deviceId,
                // è¿™é‡Œçš„ serviceId éœ€è¦åœ¨ getBLEDeviceServices æŽ¥å£ä¸­èŽ·å–
                serviceId: this.serviceId,
                // è¿™é‡Œçš„ characteristicId éœ€è¦åœ¨ getBLEDeviceCharacteristics æŽ¥å£ä¸­èŽ·å–
                characteristicId: characteristicId,
                success: (res) => {
                    if (this.blueFlag == true) {
                        this.writeBLECharacteristicValue()
                    } else {
                        uni.showLoading({
                            title: '蓝牙服务获取成功,请打印',
                            mask: true,
                        });
                    }
                    setTimeout(() => {
                        uni.hideLoading();
                    }, 1000)
                    // _this.fanhui()
                    this.print = "打印"
                    this.BottomShow = false
                    console.log('notifyBLECharacteristicValueChange success', res.errMsg)
                },
                fail: (res) => {
                    uni.showLoading({
                        title: '蓝牙服务获取成功,请打印',
                        mask: true,
                    });
                    setTimeout(() => {
                        uni.hideLoading();
                    }, 1000)
                    _this.print = "打印"
                    _this.BottomShow = false
                    // _this.fanhui()
                    console.log('notifyBLECharacteristicValueChange fail', res.errMsg)
                }
            })
        },
        //获取蓝牙的所有服务
        getBLEDeviceServices(deviceId) {
            uni.showLoading({
                title: '正在获取蓝牙服务...',
                mask: true,
            });
            setTimeout(() => {
                uni.getBLEDeviceServices({
                    // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                    deviceId: deviceId,
                    success: (res) => {
                        uni.showLoading({
                            title: '获取中,请稍后...',
                            mask: true,
                        });
                        res.services.forEach((item) => {
                            if (item.uuid.indexOf("FF00") != -1) {
                                this.serviceId = item.uuid;
                                //获取特征
                                this.getBLEDeviceCharacteristics(deviceId, item.uuid)
                            }
                        })
                    }
                })
            }, 1000)
        },
        //写入蓝牙
        writeBLECharacteristicValue() {
            this.printflag = false
            let deviceId = uni.getStorageSync('deviceId')
            let serviceId = uni.getStorageSync('serviceId')
            let characteristicId = uni.getStorageSync('characteristicId')
            // if (!uni.getStorageSync("deviceId")) {
            //     uni.showToast({
            //         title: '请连接打印机',
            //         icon: 'error',
            //         duration: 2000
            //     })
            //     return
            // }
            const printerJobs = new PrinterJobs();
            // this.singlist.forEach(item => {
            printerJobs
                .label_set_page(576, 400)
                //边框
                .drawLine(1, 0, 0, 570, 0)
                .drawLine(1, 0, 0, 0, 360)
                .drawLine(1, 570, 0, 570, 360)
                .drawLine(1, 0, 360, 570, 360)
                //内部横线
                // .drawLine(1, 0, 52, 570, 52) //第一行
                // .drawLine(1, 0, 104, 570, 104) //第二行
                // .drawLine(1, 0, 156, 570, 156) //第三行
                // .drawLine(1, 0, 208, 400, 208) //第四行
                // .drawLine(1, 0, 260, 400, 260) //第五行
                // .drawLine(1, 0, 312, 400, 312) //第六行
                // .drawLine(1, 120, 0, 120, 360) // ç¬¬ä¸€æ ¹ç«–线
                // .drawLine(1, 220, 208, 220, 312) // ç¬¬äºŒæ ¹ç«–线
                // .drawLine(1, 300, 208, 300, 312) // ç¬¬ä¸‰æ ¹ç«–线
                // .drawLine(1, 400, 156, 400, 312, ) // ç¬¬å››æ ¹ç«–线
                // 1 åŽŸå§‹ æ˜¯å¦ç²—体\字体大小\是否旋转角度\起始横坐标\起始纵坐标\字符串
                // .drawText(10, 20, "物料大类", 24, 0, 0, false, false)
                // .drawText(130, 20, this.printlist.category, 24, 0, 0, false, false)
                // // 2
                // .drawText(10, 72, "物料名称", 24, 0, 0, false, false)
                // .drawText(130, 72, item.materialName, 24, 0, 0, false, false)
                // // 3
                // .drawText(10, 124, "物料批次", 24, 0, 0, false, false)
                // .drawText(130, 124, item.lotsSn, 24, 0, 0, false, false)
                // // 4
                // .drawText(10, 176, "工单号", 24, 0, 0, false, false)
                // .drawText(130, 176, item.wo, 24, 0, 0, false, false)
                // // 5
                // .drawText(10, 225, "生产线", 24, 0, 0, false, false)
                // .drawText(130, 225, item.productLine, 24, 0, 0, false, false)
                // // 5-1
                // .drawText(230, 225, "工序", 24, 0, 0, false, false)
                // .drawText(310, 225, item.cellNo, 24, 0, 0, false, false)
                // // 6
                // .drawText(10, 280, "物料数量", 24, 0, 0, false, false)
                // .drawText(130, 280, item.materialNum, 24, 0, 0, false, false)
                // // 6-1
                // .drawText(230, 280, "清洗", 24, 0, 0, false, false)
                // .drawText(340, 280, item.cleanAttr, 24, 0, 0, false, false)
                // // 7
                // .drawText(10, 332, "打印时间", 24, 0, 0, false, false)
                // .drawText(130, 332, item.cTime, 24, 0, 0, false, false)
                // .drawText(440, 332, item.user, 24, 0, 0, false, false)
                // // æ¡å½¢ç 
                .drawBarCode(10, 50, this.printlist.wareMaterialCode,1, 0, 1, 50 )
                // .drawText(434, 310, item.containerCode, 1, 0, 0, false, false)
                .label_print(0, 1);
            // })
            let buffer = printerJobs.buffer();
            // console.log('ArrayBuffer', 'length: ' + buffer.byteLength, ' hex: ' + ab2hex(buffer));
            // 1.并行调用多次会存在写失败的可能性
            // 2.建议每次写入不超过20字节
            // åˆ†åŒ…处理,延时调用
            const maxChunk = 15
            const delay = 20;
            for (let i = 0, j = 0, length = buffer.byteLength; i < length; i += maxChunk, j++) {
                let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length);
                // setTimeout(this._writeBLECharacteristicValue, j * delay, subPackage);
                setTimeout(() => {
                    this._writeBLECharacteristicValue(deviceId, serviceId, characteristicId, subPackage)
                }, j * delay);
            }
        },
        _writeBLECharacteristicValue(deviceId, serviceId, characteristicId, buffer) {
            uni.writeBLECharacteristicValue({
                deviceId: deviceId,
                serviceId: serviceId,
                characteristicId: characteristicId,
                value: buffer,
                success(res) {
                    console.log('writeBLECharacteristicValue success', res.errMsg)
                },
                fail(res) {
                    console.log(JSON.stringify(res))
                    console.log(JSON.stringify(buffer))
                }
            })
        },
        //长按事件
        longpress(item, index) {
            let _this = this
            if (uni.getStorageSync('deviceId')) {
                uni.showToast({
                    title: '蓝牙已连接!',
                    icon: 'none',
                    duration: 2000
                })
                return
            }
            uni.showModal({
                title: '提示',
                content: '是否连接蓝牙:' + item.name,
                showCancel: true,
                cancelColor: '#333333',
                success: (res => {
                    if (res.confirm) {
                        // _this.stopBluetoothDevicesDiscovery()
                        uni.setStorageSync('itemblue', item.name)
                        this.itemblue = item.name
                        _this.createBLEConnection(item.deviceId)
                    } else if (res.cancel) {
                        uni.showToast({
                            title: '已取消连接',
                            duration: 2000,
                            icon: 'none'
                        })
                    }
                })
            });
        },
        // ç‚¹å‡»æ–­å¼€è“ç‰™è¿žæŽ¥
        tomy() {
            var _this = this
            uni.closeBluetoothAdapter({
                success(res) {
                    uni.removeStorageSync('deviceId')
                    uni.removeStorageSync("serviceId");
                    uni.removeStorageSync("characteristicId");
                    // _this.openBluetoothAdapter()
                }
            })
        },
        //返回
        fanhui() {
            uni.navigateTo({
                url: './printing'
            })
        },
    }
}
LA24030_LuLiPackageLine_Pda/mixins/blueproduct.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,394 @@
import printerUtil from '@/components/print/printerutil.js'
const PrinterJobs = require('@/components/print/printerjobs.js')
import {
    getDate
} from '@/utils/dateTime.js'
export default {
    data() {
        return {
            list: [],
            deviceId: '',
            serviceId: '',
            characteristics: [],
            characteristicId: '',
            deviceslist: []
        }
    },
    onShow() {
        this.list = []
        this.deviceslist = []
    },
    methods: {
        //初始化蓝牙设备
        openBluetoothAdapter() {
            let _this = this
            uni.openBluetoothAdapter({
                success: (res) => { //已打开
                    uni.getBluetoothAdapterState({ //蓝牙的匹配状态
                        success: (res1) => {
                            console.log(res1, '本机设备的蓝牙已打开')
                            // å¼€å§‹æœç´¢è“ç‰™è®¾å¤‡
                            _this.startBluetoothDeviceDiscovery()
                            uni.setStorageSync('blueShow', true)
                        },
                        fail(error) {
                            uni.showToast({
                                icon: 'none',
                                title: '查看手机蓝牙是否打开err'
                            });
                        }
                    });
                },
                fail: err => { //未打开
                    uni.setStorageSync('blueShow', false)
                    uni.showToast({
                        icon: 'none',
                        title: '查看手机蓝牙是否打开'
                    });
                }
            })
        },
        // å¼€å§‹æœç´¢è“ç‰™è®¾å¤‡
        startBluetoothDeviceDiscovery() {
            uni.startBluetoothDevicesDiscovery({
                success: (res) => {
                    // å‘现外围设备
                    uni.showLoading({
                        title: '加载中',
                        mask: true
                    });
                    this.onBluetoothDeviceFound()
                },
                fail: err => {
                    console.log(err, '错误信息')
                }
            })
        },
        // å‘现外围设备
        onBluetoothDeviceFound() {
            uni.onBluetoothDeviceFound((res) => {
                this.deviceslist.length > 0 ? uni.hideLoading() : ''
                if (this.deviceslist.indexOf(res.devices[0].deviceId) == -1) {
                    this.deviceslist.push(res.devices[0].deviceId)
                    if (res.devices[0].name != "") {
                        uni.hideLoading();
                        this.list.push({
                            name: res.devices[0].name,
                            deviceId: res.devices[0].deviceId
                        })
                    }
                }
            })
        },
        //获取在蓝牙模块生效期间所有已发现的蓝牙设备。包括已经和本机处于连接状态的设备。
        getBluetoothDevices() {
            console.log("获取蓝牙设备");
            uni.getBluetoothDevices({
                success: res => {
                    console.log('获取蓝牙设备成功:');
                    console.log(res.devices);
                }
            });
        },
        //选择设备连接吧deviceId传进来
        createBLEConnection(deviceId) {
            //data里面建立一个deviceId,存储起来
            let _this = this
            uni.showLoading({
                title: '连接蓝牙中...',
                mask: true
            });
            this.stopBluetoothDevicesDiscovery()
            this.deviceId = deviceId,
                //连接蓝牙
                uni.createBLEConnection({
                    // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                    deviceId: deviceId,
                    success(res) {
                        uni.hideLoading();
                        uni.showToast({
                            icon: 'none',
                            title: '蓝牙连接成功'
                        });
                        uni.setStorageSync("deviceId", deviceId) //把已经连接的蓝牙设备信息放入缓存
                        setTimeout(() => {
                            _this.getBLEDeviceServices(deviceId)
                        }, 1000)
                    },
                    fail(res) {
                        uni.showToast({
                            icon: 'none',
                            title: '蓝牙连接失败'
                        });
                    }
                })
        },
        // åœæ­¢æœå¯»è“ç‰™è®¾å¤‡
        stopBluetoothDevicesDiscovery() {
            uni.stopBluetoothDevicesDiscovery({
                success: e => {
                    this.loading = false
                    console.log('停止搜索蓝牙设备:' + e.errMsg);
                },
                fail: e => {
                    console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode);
                }
            });
        },
        //获取蓝牙特征
        getBLEDeviceCharacteristics(deviceId, serviceId) {
            console.log("进入特征");
            setTimeout(() => {
                uni.getBLEDeviceCharacteristics({
                    // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                    deviceId: deviceId,
                    // è¿™é‡Œçš„ serviceId éœ€è¦åœ¨ getBLEDeviceServices æŽ¥å£ä¸­èŽ·å–
                    serviceId: serviceId,
                    success: (res) => {
                        console.log(res, '特征getBLEDeviceCharacteristics')
                        this.characteristics = res.characteristics
                        res.characteristics.forEach((item) => {
                            if (item.uuid.indexOf("FF02") != -1) {
                                this.characteristicId = item.uuid
                                uni.setStorageSync("characteristicId", item
                                    .uuid) //把已经连接的蓝牙设备标识放入缓存
                                uni.setStorageSync("serviceId",
                                    serviceId) //把已经连接的蓝牙设备ID放入缓存
                                //console.log('characteristicId:', item.uuid)
                                //利用传参的形势传给下面的notify,这里的uuid如果都需要用到,就不用做判断了,建议使用setTimeout进行间隔性的调用此方法
                                // this.notifyBLECharacteristicValueChange(item.uuid)
                                setTimeout(() => {
                                    uni.hideLoading();
                                    this.BottomShow = false
                                    this.DrawerModalL = false
                                }, 1000)
                            }
                        })
                    },
                    fail: (res) => {
                        console.log(res)
                    }
                })
            }, 1000)
        },
        // å¯ç”¨ notify åŠŸèƒ½
        notifyBLECharacteristicValueChange(characteristicId) {
            let _this = this
            console.log('deviceId' + _this.deviceId)
            console.log('serviceId' + _this.serviceId)
            console.log('characteristicId' + characteristicId)
            // _this.fanhui()
            uni.notifyBLECharacteristicValueChange({
                state: true, // å¯ç”¨ notify åŠŸèƒ½
                // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                deviceId: this.deviceId,
                // è¿™é‡Œçš„ serviceId éœ€è¦åœ¨ getBLEDeviceServices æŽ¥å£ä¸­èŽ·å–
                serviceId: this.serviceId,
                // è¿™é‡Œçš„ characteristicId éœ€è¦åœ¨ getBLEDeviceCharacteristics æŽ¥å£ä¸­èŽ·å–
                characteristicId: characteristicId,
                success: (res) => {
                    if (this.blueFlag == true) {
                        this.writeBLECharacteristicValue()
                    } else {
                        uni.showLoading({
                            title: '蓝牙服务获取成功,请打印',
                            mask: true,
                        });
                    }
                    setTimeout(() => {
                        uni.hideLoading();
                    }, 1000)
                    // _this.fanhui()
                    this.print = "打印"
                    this.BottomShow = false
                    console.log('notifyBLECharacteristicValueChange success', res.errMsg)
                },
                fail: (res) => {
                    uni.showLoading({
                        title: '蓝牙服务获取成功,请打印',
                        mask: true,
                    });
                    setTimeout(() => {
                        uni.hideLoading();
                    }, 1000)
                    _this.print = "打印"
                    _this.BottomShow = false
                    // _this.fanhui()
                    console.log('notifyBLECharacteristicValueChange fail', res.errMsg)
                }
            })
        },
        //获取蓝牙的所有服务
        getBLEDeviceServices(deviceId) {
            uni.showLoading({
                title: '正在获取蓝牙服务...',
                mask: true,
            });
            setTimeout(() => {
                uni.getBLEDeviceServices({
                    // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                    deviceId: deviceId,
                    success: (res) => {
                        uni.showLoading({
                            title: '获取中,请稍后...',
                            mask: true,
                        });
                        res.services.forEach((item) => {
                            if (item.uuid.indexOf("FF00") != -1) {
                                this.serviceId = item.uuid;
                                //获取特征
                                this.getBLEDeviceCharacteristics(deviceId, item.uuid)
                            }
                        })
                    }
                })
            }, 1000)
        },
        //写入蓝牙
        writeBLECharacteristicValue() {
            this.printflag = false
            let deviceId = uni.getStorageSync('deviceId')
            let serviceId = uni.getStorageSync('serviceId')
            let characteristicId = uni.getStorageSync('characteristicId')
            const printerJobs = new PrinterJobs();
            this.singlist.forEach(item => {
                printerJobs
                    .label_set_page(576, 400)
                    //边框
                    .drawLine(1, 0, 0, 570, 0)
                    .drawLine(1, 0, 0, 0, 360)
                    .drawLine(1, 570, 0, 570, 360)
                    .drawLine(1, 0, 360, 570, 360)
                    //内部横线
                    .drawLine(1, 0, 94, 570, 94) //第一行
                    .drawLine(1, 0, 160, 570, 160) //第二行
                    .drawLine(1, 0, 227, 570, 227) //第三行
                    .drawLine(1, 0, 293, 400, 293) //第四行
                    .drawLine(1, 120, 94, 120, 360) // ç¬¬ä¸€æ ¹ç«–线
                    .drawLine(1, 400, 227, 400, 360) // ç¬¬äºŒæ ¹ç«–线
                    // 1 åŽŸå§‹ æ˜¯å¦ç²—体\字体大小\是否旋转角度\起始横坐标\起始纵坐标\字符串
                    .drawText(170, 20, "重庆青山工业有限责任公司", 26, 0, 1, false, false)
                    .drawText(240, 62, '物料标识签', 26, 0, 1, false, false)
                    // 3
                    .drawText(10, 120, "物料编号", 24, 0, 0, false, false)
                    .drawText(130, 120, item.item_number, 24, 0, 0, false, false)
                    // 4
                    .drawText(10, 185, "物料名称", 24, 0, 0, false, false)
                    .drawText(130, 185, item.item_desc, 24, 0, 0, false, false)
                    // 5
                    .drawText(10, 248, "物料批次", 24, 0, 0, false, false)
                    .drawText(130, 248, item.lot_number, 24, 0, 0, false, false)
                    // 7
                    .drawText(10, 312, "打印时间", 24, 0, 0, false, false)
                    .drawText(130, 312, item.print_date, 24, 0, 0, false, false)
                    // äºŒç»´ç 
                    .drawQrCode(438, 232, item.product_barcode, 0, 4, 1)
                    .drawText(423, 340, item.product_barcode, 1, 0, 0, false, false)
                    .label_print(0, 1);
            })
            let buffer = printerJobs.buffer();
            // console.log('ArrayBuffer', 'length: ' + buffer.byteLength, ' hex: ' + ab2hex(buffer));
            // 1.并行调用多次会存在写失败的可能性
            // 2.建议每次写入不超过20字节
            // åˆ†åŒ…处理,延时调用
            const maxChunk = 13;
            const delay =20;
            for (let i = 0, j = 0, length = buffer.byteLength; i < length; i += maxChunk, j++) {
                let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length);
                // setTimeout(this._writeBLECharacteristicValue, j * delay, subPackage);
                setTimeout(() => {
                        this._writeBLECharacteristicValue(deviceId, serviceId, characteristicId, subPackage)
                    }, j *delay);
            }
        },
        _writeBLECharacteristicValue(deviceId, serviceId, characteristicId, buffer) {
            uni.writeBLECharacteristicValue({
                deviceId: deviceId,
                serviceId: serviceId,
                characteristicId: characteristicId,
                value: buffer,
                success(res) {
                    console.log('writeBLECharacteristicValue success', res.errMsg)
                },
                fail(res) {
                    console.log(JSON.stringify(res))
                    console.log(JSON.stringify(buffer))
                    uni.getStorageSync('failerr','try')
                }
            })
        },
        //长按事件
        longpress(item, index) {
            let _this = this
            if (uni.getStorageSync('deviceId')) {
                uni.showToast({
                    title: '蓝牙已连接!',
                    icon: 'none',
                    duration: 2000
                })
                return
            }
            uni.showModal({
                title: '提示',
                content: '是否连接蓝牙:' + item.name,
                showCancel: true,
                cancelColor: '#333333',
                success: (res => {
                    if (res.confirm) {
                        // _this.stopBluetoothDevicesDiscovery()
                        uni.setStorageSync('itemblue', item.name)
                        this.itemblue = item.name
                        _this.createBLEConnection(item.deviceId)
                    } else if (res.cancel) {
                        uni.showToast({
                            title: '已取消连接',
                            duration: 2000,
                            icon: 'none'
                        })
                    }
                })
            });
        },
        // ç‚¹å‡»æ–­å¼€è“ç‰™è¿žæŽ¥
        tomy() {
            var _this = this
            uni.closeBluetoothAdapter({
                success(res) {
                    uni.removeStorageSync('deviceId')
                    uni.removeStorageSync("serviceId");
                    uni.removeStorageSync("characteristicId");
                    // _this.openBluetoothAdapter()
                }
            })
        },
        //返回
        fanhui() {
            uni.navigateTo({
                url: './printing'
            })
        },
    }
}
LA24030_LuLiPackageLine_Pda/mixins/checkbox.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
// uniapp -原生复选框-解决点击uview复选框卡顿现象
export default {
  data() {
    return {
      arrIds: [],
    };
  },
  methods: {
    // é€‰ä¸­å¤é€‰æ¡†--此处要操作arr组数 å¦åˆ™åˆ‡æ¢åº“位无法记住之前选中的物料
    checkboxChange: function (e) {
      var values = e.detail.value; //存放所有选中的id
      // this.arrIds = values;
      var items = this.singlist;
      for (var i = 0, lenI = items.length; i < lenI; ++i) {
        const item = items[i]
        if(values.includes(item.key)){
          this.$set(item,'checked',true)
          let idx3 = this.arr.findIndex((v) => v.key == item.key);
          if (idx3 == -1) {
            this.arr.push(item);
          }
        }else{
          this.$set(item,'checked',false)
          let idx2 = this.arr.findIndex((v) => v.key == item.key);
          if (idx2 > -1) {
            this.arr.splice(idx2, 1);
          }
        }
      }
    }
  },
};
LA24030_LuLiPackageLine_Pda/mixins/checkboxYueKu.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
// uniapp -原生复选框-解决点击复选框卡顿现象  --- ä¾›PO越库 å…¥åº“越库按钮用途
export default {
  data() {
    return {
      arrIds: [],
    };
  },
  watch: {
    // ç›‘听复选框
    arrIds(newVal, oldVal) {
      console.log("newVal----" + newVal);
      console.log("oldVal----" + oldVal);
      if (newVal.length < oldVal.length) {
        for (var i = 0, lenI = oldVal.length; i < lenI; ++i) {
          const item = oldVal[i];
          if (!newVal.includes(item)) {
            console.log("取消了一个--------" + item);
            // this.handleCart(0, item);
          }
        }
      } else {
        for (var i = 0, lenI = newVal.length; i < lenI; ++i) {
          const item = newVal[i];
          if (!oldVal.includes(item)) {
            console.log("选中了一个--------" + item);
            // this.handleCart(1, item);
          }
        }
      }
    },
  },
  methods: {
    // é€‰ä¸­å¤é€‰æ¡†
    checkboxChange: function (e) {
      var values = e.detail.value; //存放所有选中的id
      this.arrIds = values;
    },
    // æ ¹æ®é€‰ä¸­çš„key,更新提交的列表
    handleCart(type, itemHandle) {
      console.log(itemHandle);
      if (type == 1) {
        //选中
        let idx = this.singlist.findIndex((v) => v.key == itemHandle);
        if (idx > -1) {
          let idx3 = this.arr.findIndex((v) => v.key == itemHandle);
          if (idx3 == -1) {
            this.arr.push(this.singlist[idx]);
          }
        }
      }
      if (type == 0) {
        //取消
        let idx2 = this.arr.findIndex((v) => v.key == itemHandle);
        if (idx2 > -1) {
          this.arr.splice(idx2, 1);
        }
      }
    },
  },
};
LA24030_LuLiPackageLine_Pda/mixins/playSound.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
    export default {
        methods:{
            //语音播报
               playSound() {
                let _this = this
                const innerAudioContext = uni.createInnerAudioContext();
                innerAudioContext.autoplay = true;
                innerAudioContext.src = '../../static/13716.wav';
                innerAudioContext.onError((res) => {
                 //如果音频没有正常播放
                 console.log(res.errCode);
                })
                innerAudioContext.onStop((res) => {
                 _this.playing = false
                 _this.$forceUpdate()
                })
                //震动
                uni.vibrateLong({
                    success: function () {
                        console.log('success');
                    },
                    complete:function(){
                    }
                });
               },
        }
    }
LA24030_LuLiPackageLine_Pda/mixins/printBanma.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,128 @@
// æ–‘马打印 å¸¦è®¾å¤‡ å·¥åº DO的标贴
import {addBanmaRecord,addBanmaRecordArr} from '@/api/print.js'
    export default {
        methods:{
            printBanma(reprintPram,typePrint){
                let reprint = ''
                if(reprintPram){
                    reprint = 'REPRINT'
                }
                if(!this.ermNum || Number(this.ermNum) <=0){
                    uni.showToast({
                        title: '物料:请输入大于0的数量',
                        icon: 'none',
                        duration: 4000
                    });
                    return
                }
                if(!this.contLabel  || Number(this.contLabel) <=0){
                    uni.showToast({
                        title: '打印张数:请输入大于0的数量',
                        icon: 'none',
                        duration: 4000
                    });
                    return
                }
                // æ•°ç»„只有一个对象
                // this.materlist = this.arrPt[0]
                uni.showLoading({
                    mask: true,
                    title: "正在连接..."
                })
                // é’ˆå¯¹æŽ¥å£è¿”回不同的字段名称进行判断
                if(this.materlist.wareMaterialCode == undefined){
                    this.materlist.wareMaterialCode = this.materlist.code || this.materlist.warematerialCode || this.materlist.materialCode ||''
                }
                if(this.materlist.wareMaterialName == undefined){
                    this.materlist.wareMaterialName  = this.materlist.warematerialName ||  this.materlist.name || this.materlist.materialName ||''
                }
                if(this.materlist.barNo==undefined){
                    this.materlist.barNo =     this.materlist.batchNo || this.materlist.itemBatchNo || ''
                }
                // this.materlist.supplier =  this.materlist.basicSupplierInfoCode || this.materlist.supplier || ''
                // this.materlist.supplierName =  this.materlist.basicSupplierInfoName || this.materlist.supplierName || ''
                this.materlist.code = this.materlist.wareMaterialCode
                this.materlist.batchNo = this.materlist.barNo
                this.materlist.Quantity = this.ermNum //数量
                this.materlist.PrintSheetNum = this.contLabel //打印张数
                this.materlist.PurchaseEbelp = this.materlist.ebelp || this.materlist.lineNumber  || '' //行号
                this.materlist.supplierNo =  this.materlist.supplier || this.materlist.supplierNo || ''
                this.materlist.name =  this.materlist.wareMaterialName || ''
                // æ‰“印类型 (1:物料标签 2:发货标签(生产订单) 3:发货标签(DO单))
                if(typePrint==2){ //页面:发货 å‘货标签补打
                    this.materlist.printType = 2;
                    //发货标签 - è®¾å¤‡ å·¥åº DO号
                }else if(typePrint==3){ //页面:DO单分拣
                    this.materlist.printType = 3;
                }else{ //页面: æ”¶è´§ åˆ†æ‹£ æ ‡ç­¾è¡¥æ‰“
                    this.materlist.printType = 1;
                }
                addBanmaRecord(this.materlist).then(res => {
                    uni.hideLoading();
                    if (res.code == 200) {
                        uni.showToast({
                                title: '打印成功',
                                icon: 'success',
                                duration: 4000
                        });
                    }
                })
            },
            // æ‰¹é‡å¢žåŠ ç‰©æ–™æ ‡ç­¾æ‰“å°åŽ†å²è¡¨ - åˆ†æ‹£
            printBanmaArr(reprintPram,typePrint,arrList){
                if(reprintPram){
                    reprint = 'REPRINT'
                }
                // æ•°ç»„只有一个对象
                // this.materlist = this.arrPt[0]
                uni.showLoading({
                    mask: true,
                    title: "正在连接..."
                })
                arrList.forEach(element => {
                    // é’ˆå¯¹æŽ¥å£è¿”回不同的字段名称进行判断
                    if(element.wareMaterialCode == undefined){
                        element.wareMaterialCode = element.code || element.warematerialCode || element.materialCode ||''
                    }
                    if(element.wareMaterialName == undefined){
                        element.wareMaterialName  = element.warematerialName ||  element.name || element.materialName ||''
                    }
                    if(element.barNo==undefined){
                        element.barNo = element.batchNo || element.itemBatchNo || ''
                    }
                    element.code = element.wareMaterialCode
                    element.batchNo = element.barNo
                    // element.Quantity = element.quantity //数量
                    element.PrintSheetNum = 1 //打印张数
                    element.PurchaseEbelp = element.ebelp || element.lineNumber || '' //行号
                    this.materlist.supplierNo =  this.materlist.supplier || this.materlist.supplierNo || ''
                    element.name =  element.wareMaterialName || ''
        // æ‰“印类型 (1:物料标签 2:发货标签(生产订单) 3:发货标签(DO单))
                    if(typePrint==2){ //页面:发货 å‘货标签补打
                        element.printType = 2;
                        //发货标签 - è®¾å¤‡ å·¥åº DO号
                    }else if(typePrint==3){ //页面:DO单分拣
                        element.printType = 3;
                    }else{ //页面: æ”¶è´§ åˆ†æ‹£ æ ‡ç­¾è¡¥æ‰“
                        element.printType = 1;
                    }
                });
                // ä¼ å¤šä¸ª
                addBanmaRecordArr(arrList).then(res => {
                    uni.hideLoading();
                    if (res.code == 200) {
                        uni.showToast({
                                title: '打印成功',
                                icon: 'none',
                                duration: 2000
                        });
                    }
                })
            }
        }
    }
LA24030_LuLiPackageLine_Pda/mixins/printDoLabel.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,154 @@
// å¸¦æœºåºŠå· å·¥åº DO的标贴
import BluePrint from '@/pages/print/bluePrint.js'
import {addPrintRecord} from '@/api/print.js'
    export default {
        methods:{
            printComp(reprintPram){
                // æ•°ç»„只有一个对象
                this.materlist = this.arrPt[0]
                console.log(    this.materlist  )
                uni.showLoading({
                    mask: true,
                    title: "正在连接..."
                })
                // é’ˆå¯¹æŽ¥å£è¿”回不同的字段名称进行判断
                if(this.materlist.wareMaterialCode == undefined){
                    this.materlist.wareMaterialCode = this.materlist.code || this.materlist.warematerialCode || this.materlist.materialCode ||''
                }
                if(this.materlist.wareMaterialName == undefined){
                    this.materlist.wareMaterialName  = this.materlist.warematerialName ||  this.materlist.name || this.materlist.materialName || ''
                }
                if(this.materlist.barNo==undefined){
                    this.materlist.barNo =     this.materlist.batchNo || ''
                }
                //物料名称是否换行
                let name = this.materlist.wareMaterialName || ''
                let name_1 = name.length > 38 ? name.substr(0, 38) : name
                let name_2 = name.length > 38 ? name.substr(38) : ''
                //供应商是否换行
                let desc = this.materlist.supplier || ''
                let desc_1 = desc.length > 38 ? desc.substr(0, 38) : desc
                let desc_2 = desc.length > 38 ? desc.substr(38) : ''
                // this.warehouse.PurchaseNo
                let ptintContext = [
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    /* ä»¥ä¸Šç©ºæ•°æ®ï¼Œä¸ºé˜²æ­¢ä¸¢åŒ…时打印不正常 */
                    {type:'line',x1:3,y1:3,x2:570,y2: 3,width:2}, //上边线
                    {type:'line',x1:3,y1:3,x2:3,y2: 420,width:2},//左边线
                    {type:'line',x1:3,y1:420,x2:570,y2: 420,width:2}, //最下边线
                    {type:'line',x1:560,y1:3,x2:560,y2:420,width:2},  //右边线
                    {type:'text',x:10,y:34,text:`Part:`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'text',x:80,y:24,text:`${this.materlist.wareMaterialCode}`,size:4,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:80,x2:565,y2:80,width:2},
                    {type:'text',x:10,y:90,text:`Descript:${name_1}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'text',x:10,y:115,text:`${name_2}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:150,x2:565,y2:150,width:2},
                    {type:'text',x:10,y:170,text:`Vendor:${desc_1}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'text',x:10,y:175,text:`${desc_2}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:210,x2:565,y2:210,width:2},
                    {type:'text',x:10,y:225,text:`DO:${this.materlist.deliveryNo || ''}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:260,x2:350,y2:260,width:2},
                    {type:'text',x:10,y:275,text:`Qty:${this.materlist.completeQuantity} ${this.materlist.unit == null ? '' : this.materlist.unit}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:310,x2:350,y2:310,width:2},
                    {type:'text',x:10,y:325,text:`process:${this.materlist.process}/${this.materlist.equipment}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:360,x2:350,y2:360,width:2},
                    {type:'text',x:10,y:380,text:`Batch:${this.materlist.batchNo || ''}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:350,y1:210,x2:350,y2:420,width:2},
                    // {type:'qr',x:380,y:220,text:`PARTS NUMBER: ${this.materlist.wareMaterialCode},SAP: ${this.materlist.sap_Location || ''},LOT NO: ${this.materlist.barNo},QUANTITY: ${this.materlist.quantity}`,width:4,level:1},
                    { type: 'qr', x: 380, y: 220, text: `PARTS NUMBER: ${this.materlist.wareMaterialCode},SAP: ${this.materlist.sap_Location || ''},LOT NO: ${this.materlist.batchNo || ''},ORDER NO: ${this.materlist.orderNo || ''},QUANTITY: ${this.materlist.completeQuantity}`, width: 4, level: 1 },
                    // {type:'text',x:405,y:390,text:`${reprint}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    //发货标签不显示时间 ã€Editby shaocx,2023-05-11】
                    { type: 'text', x: 355, y: 390, text: `${this.getCurrentDate().date} ${this.getCurrentDate().time}`, size: 1, rotate: 0, bold: 1, underline: false, reverse: false }
                    // { type: 'text', x: 355, y: 390, text: ``, size: 2, rotate: 0, bold: 1, underline: false, reverse: false }
                ]
                console.log(ptintContext)
                // addPrintRecord(this.addForm).then(res => {
                BluePrint.print(this.$store,ptintContext).then(()=>{
                    this.printHandle()
                }).catch((err)=>{
                    uni.hideLoading();
                    uni.showToast({
                        title:'打印失败',
                        duration: 2000
                    })
                })
            },
            printHandle() {
                let routes = getCurrentPages(); // èŽ·å–å½“å‰æ‰“å¼€è¿‡çš„é¡µé¢è·¯ç”±æ•°ç»„
                let curRoute = routes[routes.length - 1].route //获取当前页面路由
                if (curRoute == 'pages/print/bluetoothConnection') {// è¿žæŽ¥è“ç‰™å¤±è´¥ è·³é¡µé¢
                    return
                }
                this.arrPt.splice(0, 1)
                if (this.arrPt.length == 0) {
                    uni.hideLoading();
                    uni.showToast({
                        title: `打印完成`,
                        duration: 2000
                    })
                    return
                }
                uni.showLoading({
                    mask: true,
                    title: `打印成功:${this.materlist.wareMaterialCode}`
                })
                this.timer = setTimeout(() => {// è®¾ç½®å®šæ—¶å™¨çš„作用:连接蓝牙失败跳页面,js运行有时有延迟,造成读取当前页面路由错误
                    clearTimeout(this.timer)
                    this.printComp()
                    // æ·»åŠ æ‰“å°è®°å½•ï¼šå’Œæ‰“å°åˆ†å¼€ï¼Œäº’ä¸å¹²æ‰°
                    this.addForm.code = this.materlist.wareMaterialCode;
                    this.addForm.name = this.materlist.wareMaterialName;
                    this.addForm.batchNo = this.materlist.batchNo;
                    console.log(this.addForm)
                    //这里不再记录打印记录,因为有了斑马打印 ã€Editby shaocx,2023-05-22】
                    /*
                    addPrintRecord(this.addForm).then(res => {
                        if (res.code == 200) {
                        } else {
                            uni.hideLoading();
                            // uni.showToast({
                            //     icon: 'none',
                            //     title: '打印记录存储失败',
                            //     duration: 2000
                            // })
                        }
                    })
                    //*/
                }, 10000)
            },
            //获取print date print time
            getCurrentDate() {
                let date = new Date();
                let year = date.getFullYear(); //å¹´
                let month = date.getMonth() + 1; //月
                month = month >= 10 ? month : '0' + month;
                let day = date.getDate(); //日
                day = day >= 10 ? day : '0' + day;
                let hour = date.getHours() //时
                hour = hour >= 10 ? hour : '0' + hour;
                let min = date.getMinutes(); //分
                min = min >= 10 ? min : '0' + min;
                let second = date.getSeconds(); //秒
                second = second >= 10 ? second : '0' + second;
                return {
                    date: `${day}.${month}.${year}`,
                    time: `${hour}:${min}:${second}`,
                    formate: `${year}/${month}/${day}`
                }
            },
        }
    }
LA24030_LuLiPackageLine_Pda/mixins/printLabelSingle.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,120 @@
// æ‰“印单张 åˆ†æ‹£ å…¨æ£€ç§»åº“ ç§»åº“ æ‰‹å·¥å‡ºå…¥åº“  å‡ºåº“ è¶Šåº“-非生产订单   å•号长度 1271007265
import BluePrint from '@/pages/print/bluePrint.js'
import {addPrintRecord} from '@/api/print.js'
    export default {
        methods:{
            // å‚æ•°1 æ˜¯å¦é‡å¤æ‰“印 å‚æ•°2 æ‰“印DO标贴还是PO标贴
            printComp(reprintPram,typeOrder){
                let reprint = '';
                let ptintContext =[];
                let str_order = ''
                // æ˜¯å¦é‡å¤æ‰“印
                if(reprintPram){
                    reprint = 'REPRINT'
                }
                // é’ˆå¯¹æŽ¥å£è¿”回不同的字段名称进行判断
                if(this.materlist.wareMaterialCode == undefined){
                    this.materlist.wareMaterialCode = this.materlist.code || this.materlist.warematerialCode || this.materlist.materialCode ||''
                }
                if(this.materlist.wareMaterialName == undefined){
                    this.materlist.wareMaterialName  = this.materlist.warematerialName ||  this.materlist.name ||  this.materlist.materialName || ''
                }
                if(this.materlist.barNo==undefined){
                    this.materlist.barNo =     this.materlist.batchNo || ''
                }
                if(this.materlist.sap_Location==undefined){
                    this.materlist.sap_Location =     this.materlist.saP_StorageLocation || ''
                }
                if(this.materlist.quantityLable== undefined){
                    this.materlist.quantityLable = this.materlist.uncollectedQuantity || this.materlist.quantity ||''
                }
                //PO单 äºŒç»´ç å¸¦ç‰©æ–™ DO:单号
                var ewm = "";
                var ewmX = 390;
                var ewmY = 250;
                var ewmWidth = 6;
                // æ‰“印PO单 è¿˜æ˜¯DO单
                if(typeOrder=='DO'){ //分拣单需要加行号
                    str_order = `NO:${this.materlist.deliveryNo || ''}/${this.materlist.lineNumber || ''}`
                    ewm = `${this.materlist.deliveryNo || ''}`;
                }
                if(typeOrder=='PO'){
                    ewmX = 380;
                    ewmY = 220;
                    ewmWidth = 4;
                    str_order = `PO:${this.materlist.purchaseNo || ''}/${this.materlist.ebelp || this.materlist.lineNumber || ''}`
                    ewm = `PARTS NUMBER: ${this.materlist.wareMaterialCode},SAP: ${this.materlist.sap_Location || ''},LOT NO: ${this.materlist.barNo || ''},QUANTITY: ${this.materlist.quantityLable}`;
                }
                uni.showLoading({
                    mask: true,
                    title: "正在连接..."
                })
                //物料名称是否换行
                let name = this.materlist.wareMaterialName || ''
                let name_1 = name.length > 38 ? name.substr(0, 38) : name
                //供应商是否换行
                var s1 =  ""
                if(this.materlist.supplierName){
                    s1 =  this.materlist.supplierNo + this.materlist.supplierName
                }
                let desc = this.materlist.supplier || s1  || ''
                let desc_1 = desc.length > 38 ? desc.substr(0, 38) : desc
                let desc_2 = desc.length > 38 ? desc.substr(38) : ''
                ptintContext = [
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    /* ä»¥ä¸Šç©ºæ•°æ®ï¼Œä¸ºé˜²æ­¢ä¸¢åŒ…时打印不正常 */
                    {type:'line',x1:3,y1:3,x2:560,y2: 3,width:2}, //上边线
                    {type:'line',x1:3,y1:3,x2:3,y2: 420,width:2},//左边线
                    {type:'line',x1:3,y1:420,x2:560,y2: 420,width:2}, //最下边线
                    {type:'line',x1:560,y1:3,x2:560,y2:420,width:2},  //右边线
                    {type:'text',x:10,y:34,text:`Part:`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'text',x:80,y:24,text:`${this.materlist.wareMaterialCode}`,size:4,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:80,x2:560,y2:80,width:2},
                    {type:'text',x:10,y:90,text:`Descript:${name_1}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:150,x2:560,y2:150,width:2},
                    {type:'text',x:10,y:170,text:`Vendor:${desc_1}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'text',x:10,y:175,text:`${desc_2}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:210,x2:560,y2:210,width:2},
                    {type:'text',x:10,y:225,text:`${str_order}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:260,x2:350,y2:260,width:2},
                    {type:'text',x:10,y:275,text:`Qty:${this.materlist.quantityLable}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:310,x2:350,y2:310,width:2},
                    {type:'text',x:10,y:325,text:`Batch:${this.materlist.barNo}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:360,x2:350,y2:360,width:2},
                    {type:'text',x:10,y:380,text:`Time:${this.getCurrentDate().date} ${this.getCurrentDate().time}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:350,y1:210,x2:350,y2:420,width:2},
                    {type:'qr',x:ewmX,y:ewmY,text:`${ewm}`,width:ewmWidth,level:1},
                    {type:'text',x:405,y:390,text:`${reprint}`,size:2,rotate:0,bold:1,underline:false,reverse:false}
                ]
                console.log(ptintContext)
                // addPrintRecord(this.addForm).then(res => {
                    BluePrint.print(this.$store,ptintContext).then(()=>{
                        let routes = getCurrentPages(); // èŽ·å–å½“å‰æ‰“å¼€è¿‡çš„é¡µé¢è·¯ç”±æ•°ç»„
                        let curRoute = routes[routes.length - 1].route //获取当前页面路由
                        console.log(curRoute)
                        if (curRoute == 'pages/print/bluetoothConnection') {// è¿žæŽ¥è“ç‰™å¤±è´¥ è·³é¡µé¢
                            return
                        }
                        uni.showToast({
                            title:'打印成功',
                            duration:2000
                        })
                        this.addForm.code = this.materlist.wareMaterialCode;
                        this.addForm.name = this.materlist.wareMaterialName;
                        this.addForm.batchNo = this.materlist.batchNo;
                        this.addForm.specificationModel = this.materlist.specificationModel;
                    }).catch((err)=>{
                        // uni.showToast({
                        //     title:'打印失败',
                        //     duration: 2000
                        // })
                    })
            }
        }
    }
LA24030_LuLiPackageLine_Pda/mixins/printPoLabel.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
// å¤šå¼ è¿žç»­æ‰“印
import BluePrint from '@/pages/print/bluePrint.js'
import {addPrintRecord} from '@/api/print.js'
    export default {
        methods:{
            printComp(reprintPram){
                let reprint = ''
                let ptintContext =[];
                // æ˜¯å¦é‡å¤æ‰“印
                if(reprintPram){
                    reprint = 'REPRINT'
                }
                uni.showLoading({
                    mask: true,
                    title: "正在连接..."
                })
                // é’ˆå¯¹æŽ¥å£è¿”回不同的字段名称进行判断
                if(this.materlist.wareMaterialCode == undefined){
                    this.materlist.wareMaterialCode = this.materlist.code || this.materlist.warematerialCode ||''
                }
                if(this.materlist.wareMaterialName == undefined){
                    this.materlist.wareMaterialName  = this.materlist.warematerialName ||  this.materlist.name || ''
                }
                if(this.materlist.barNo==undefined){
                    this.materlist.barNo =     this.materlist.batchNo || this.materlist.itemBatchNo || ''
                }
                //物料名称是否换行
                let name = this.materlist.wareMaterialName || ''
                let name_1 = name.length > 38 ? name.substr(0, 38) : name
                let name_2 = name.length > 38 ? name.substr(38) : ''
                //供应商是否换行
                let desc = this.materlist.supplier || ''
                let desc_1 = desc.length > 38 ? desc.substr(0, 38) : desc
                let desc_2 = desc.length > 38 ? desc.substr(38) : ''
                // this.warehouse.PurchaseNo
                ptintContext = [
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    /* ä»¥ä¸Šç©ºæ•°æ®ï¼Œä¸ºé˜²æ­¢ä¸¢åŒ…时打印不正常 */
                    {type:'line',x1:3,y1:3,x2:560,y2: 3,width:2}, //上边线
                    {type:'line',x1:3,y1:3,x2:3,y2: 420,width:2},//左边线
                    {type:'line',x1:3,y1:420,x2:560,y2: 420,width:2}, //最下边线
                    {type:'line',x1:560,y1:3,x2:560,y2:420,width:2},  //右边线
                    {type:'text',x:10,y:34,text:`Part:`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'text',x:80,y:24,text:`${this.materlist.wareMaterialCode}`,size:4,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:80,x2:560,y2:80,width:2},
                    {type:'text',x:10,y:90,text:`Descript:${name_1}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'text',x:10,y:115,text:`${name_2}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:150,x2:560,y2:150,width:2},
                    {type:'text',x:10,y:170,text:`Vendor:${desc_1}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'text',x:10,y:175,text:`${desc_2}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:210,x2:560,y2:210,width:2},
                    {type:'text',x:10,y:225,text:`PO:${this.materlist.purchaseNo || ''}/${this.materlist.ebelp || ''}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:260,x2:350,y2:260,width:2},
                    {type:'text',x:10,y:275,text:`Qty:${this.ermNum} ${this.materlist.unit == null ? '' : this.materlist.unit}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:310,x2:350,y2:310,width:2},
                    {type:'text',x:10,y:325,text:`Batch:${this.materlist.barNo}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    // {type:'text',x:155,y:323,text:``,size:3,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:360,x2:350,y2:360,width:2},
                    {type:'text',x:10,y:380,text:`Time:${this.getCurrentDate().date} ${this.getCurrentDate().time}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    // {type:'text',x:155,y:378,text:`${this.getCurrentDate().time}`,size:3,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:350,y1:210,x2:350,y2:420,width:2},
                    {type:'qr',x:380,y:220,text:`PARTS NUMBER: ${this.materlist.wareMaterialCode},SAP: ${this.materlist.sap_Location || ''},LOT NO: ${this.materlist.barNo},QUANTITY: ${this.ermNum}`,width:4,level:1},
                    {type:'text',x:405,y:390,text:`${reprint}`,size:2,rotate:0,bold:1,underline:false,reverse:false}
                ]
                console.log(ptintContext)
                // addPrintRecord(this.addForm).then(res => {
                BluePrint.print(this.$store,ptintContext).then(()=>{
                    let routes = getCurrentPages(); // èŽ·å–å½“å‰æ‰“å¼€è¿‡çš„é¡µé¢è·¯ç”±æ•°ç»„
                    let curRoute = routes[routes.length - 1].route //获取当前页面路由
                    if (curRoute == 'pages/print/bluetoothConnection') {// è¿žæŽ¥è“ç‰™å¤±è´¥ è·³é¡µé¢
                        return
                    }
                    this.contLabel--
                    if (this.contLabel <= 0) {
                        uni.hideLoading();
                        uni.showToast({
                            title: `打印完成`,
                            duration: 2000
                        })
                        this.contLabel = 1
                        return
                    }
                    uni.showLoading({
                        mask: true,
                        title: `打印中,剩余:${this.contLabel}`
                    })
                    this.timer = setTimeout(() => { //间隔5秒 å‡å°‘打印丢失
                        clearTimeout(this.timer)
                        this.timer = null
                        this.printComp(reprintPram)
                        // æ·»åŠ æ‰“å°è®°å½•
                        this.addForm.code = this.materlist.wareMaterialCode;
                        this.addForm.name = this.materlist.name;
                        this.addForm.batchNo = this.materlist.barNo ;
                        this.addForm.specificationModel = this.materlist.specificationModel;
                        //这里不再记录打印记录,因为有了斑马打印 ã€Editby shaocx,2023-05-22】
                        /*
                        addPrintRecord(this.addForm).then(res => {
                            console.log(res);
                        })
                        //*/
                    }, 10000)
                }).catch((err)=>{
                    uni.showToast({
                        title:'打印失败',
                        duration: 2000
                    })
                })
            }
        }
    }
LA24030_LuLiPackageLine_Pda/mixins/printShengChanLabel.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
// ç”Ÿäº§åº“取货标签 è¶Šåº“生产订单打印
import BluePrint from '@/pages/print/bluePrint.js'
import {addPrintRecord} from '@/api/print.js'
    export default {
        methods:{
            printShengChanComp(reprintPram){
                // æ•°ç»„只有一个对象
                this.materlist = this.arrPt[0]
                uni.showLoading({
                    mask: true,
                    title: "正在连接..."
                })
                if(this.materlist.code==undefined){
                    this.materlist.code = this.materlist.wareMaterialCode  || ""
                }
                if(this.materlist.name == undefined){
                    this.materlist.name = this.materlist.wareMaterialName  || ""
                }
                //物料名称是否换行
                let name = this.materlist.name || '';
                let name_1 = name.length > 38 ? name.substr(0, 38) : name;
                let ptintContext = [
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    {type:'text',x:0,y:0,text:'',size:2,rotate:0,bold:0,underline:false,reverse:false},
                    /* ä»¥ä¸Šç©ºæ•°æ®ï¼Œä¸ºé˜²æ­¢ä¸¢åŒ…时打印不正常 */
                    {type:'line',x1:3,y1:3,x2:560,y2: 3,width:2}, //上边线
                    {type:'line',x1:3,y1:3,x2:3,y2: 420,width:2},//左边线
                    {type:'line',x1:3,y1:420,x2:560,y2: 420,width:2}, //最下边线
                    {type:'line',x1:560,y1:3,x2:560,y2:420,width:2},  //右边线
                    {type:'text',x:10,y:34,text:`Part:`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'text',x:80,y:24,text:`${this.materlist.code}`,size:4,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:80,x2:560,y2:80,width:2},
                    {type:'text',x:10,y:90,text:`Descript:${name_1}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:150,x2:560,y2:150,width:2},
                    {type:'text',x:10,y:170,text:`Collective Order:${this.materlist.subOrderNo || ''}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:210,x2:560,y2:210,width:2},
                    {type:'text',x:10,y:225,text:`BOM No.:${this.materlist.bomNumber || ''}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:260,x2:350,y2:260,width:2},
                    {type:'text',x:10,y:275,text:`Qty:${this.materlist.quantity} ${this.materlist.unit == null ? '' : this.materlist.unit}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:310,x2:350,y2:310,width:2},
                    {type:'text',x:10,y:325,text:`Batch:${this.materlist.batchNo || ''}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:3,y1:360,x2:350,y2:360,width:2},
                    {type:'text',x:10,y:380,text:`Stage:${this.materlist.process} Machine:${this.materlist.equipment}`,size:2,rotate:0,bold:1,underline:false,reverse:false},
                    {type:'line',x1:350,y1:210,x2:350,y2:420,width:2},
                    { type: 'qr', x: 390, y: 240, text: `${this.materlist.subOrderNo || ''}`, width: 6, level: 1 },
                    { type: 'text', x: 380, y: 388, text: `${this.getCurrentDate().date} ${this.getCurrentDate().time}`, size: 1, rotate: 0, bold: 1, underline: false, reverse: false }
                ]
                console.log(ptintContext)
                 // addPrintRecord(this.addForm).then(res => {
                BluePrint.print(this.$store,ptintContext).then(()=>{
                    this.printHandle()
                }).catch((err)=>{
                    uni.hideLoading();
                    uni.showToast({
                        title:'打印失败',
                        duration: 2000
                    })
                })
            },
            printHandle() {
                let routes = getCurrentPages(); // èŽ·å–å½“å‰æ‰“å¼€è¿‡çš„é¡µé¢è·¯ç”±æ•°ç»„
                let curRoute = routes[routes.length - 1].route //获取当前页面路由
                if (curRoute == 'pages/print/bluetoothConnection') {// è¿žæŽ¥è“ç‰™å¤±è´¥ è·³é¡µé¢
                    return
                }
                this.arrPt.splice(0, 1)
                if (this.arrPt.length == 0) {
                    uni.hideLoading();
                    uni.showToast({
                        title: `打印完成`,
                        duration: 2000
                    })
                    return
                }
                uni.showLoading({
                    mask: true,
                    title: `打印成功:${this.materlist.code}`
                })
                this.timer = setTimeout(() => {// è®¾ç½®å®šæ—¶å™¨çš„作用:连接蓝牙失败跳页面,js运行有时有延迟,造成读取当前页面路由错误
                    this.timer = null
                    clearTimeout(this.timer)
                    uni.hideLoading();
                    this.printShengChanComp()
                }, 10000)
            },
            //获取print date print time
            getCurrentDate() {
                let date = new Date();
                let year = date.getFullYear(); //å¹´
                let month = date.getMonth() + 1; //月
                month = month >= 10 ? month : '0' + month;
                let day = date.getDate(); //日
                day = day >= 10 ? day : '0' + day;
                let hour = date.getHours() //时
                hour = hour >= 10 ? hour : '0' + hour;
                let min = date.getMinutes(); //分
                min = min >= 10 ? min : '0' + min;
                let second = date.getSeconds(); //秒
                second = second >= 10 ? second : '0' + second;
                return {
                    date: `${day}.${month}.${year}`,
                    time: `${hour}:${min}:${second}`,
                    formate: `${year}/${month}/${day}`
                }
            },
        }
    }
LA24030_LuLiPackageLine_Pda/mixins/sortBlue.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,463 @@
import printerUtil from '@/components/print/printerutil.js'
const PrinterJobs = require('@/components/print/printerjobs.js')
import {
    getDate
} from '@/utils/dateTime.js'
export default {
    data() {
        return {
            list: [],
            deviceId: '',
            serviceId: '',
            characteristics: [],
            characteristicId: '',
            deviceslist: []
        }
    },
    onShow() {
        this.list = []
        this.deviceslist = []
    },
    methods: {
        //初始化蓝牙设备
        openBluetoothAdapter() {
            let _this = this
            uni.openBluetoothAdapter({
                success: (res) => { //已打开
                    uni.getBluetoothAdapterState({ //蓝牙的匹配状态
                        success: (res1) => {
                            console.log(res1, '本机设备的蓝牙已打开')
                            // å¼€å§‹æœç´¢è“ç‰™è®¾å¤‡
                            _this.startBluetoothDeviceDiscovery()
                            uni.setStorageSync('blueShow', true)
                        },
                        fail(error) {
                            uni.showToast({
                                icon: 'none',
                                title: '查看手机蓝牙是否打开err'
                            });
                        }
                    });
                },
                fail: err => { //未打开
                    uni.setStorageSync('blueShow', false)
                    uni.showToast({
                        icon: 'none',
                        title: '查看手机蓝牙是否打开'
                    });
                }
            })
        },
        // å¼€å§‹æœç´¢è“ç‰™è®¾å¤‡
        startBluetoothDeviceDiscovery() {
            uni.startBluetoothDevicesDiscovery({
                success: (res) => {
                    // å‘现外围设备
                    uni.showLoading({
                        title: '加载中',
                        mask: true
                    });
                    this.onBluetoothDeviceFound()
                },
                fail: err => {
                    console.log(err, '错误信息')
                }
            })
        },
        // å‘现外围设备
        onBluetoothDeviceFound() {
            uni.onBluetoothDeviceFound((res) => {
                this.deviceslist.length > 0 ? uni.hideLoading() : ''
                if (this.deviceslist.indexOf(res.devices[0].deviceId) == -1) {
                    this.deviceslist.push(res.devices[0].deviceId)
                    if (res.devices[0].name != "") {
                        uni.hideLoading();
                        this.list.push({
                            name: res.devices[0].name,
                            deviceId: res.devices[0].deviceId
                        })
                    }
                }
            })
        },
        //获取在蓝牙模块生效期间所有已发现的蓝牙设备。包括已经和本机处于连接状态的设备。
        getBluetoothDevices() {
            console.log("获取蓝牙设备");
            uni.getBluetoothDevices({
                success: res => {
                    console.log('获取蓝牙设备成功:');
                    console.log(res.devices);
                }
            });
        },
        //选择设备连接吧deviceId传进来
        createBLEConnection(deviceId) {
            //data里面建立一个deviceId,存储起来
            let _this = this
            uni.showLoading({
                title: '连接蓝牙中...',
                mask: true
            });
            this.stopBluetoothDevicesDiscovery()
            this.deviceId = deviceId,
                //连接蓝牙
                uni.createBLEConnection({
                    // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                    deviceId: deviceId,
                    success(res) {
                        uni.hideLoading();
                        uni.showToast({
                            icon: 'none',
                            title: '蓝牙连接成功'
                        });
                        uni.setStorageSync("deviceId", deviceId) //把已经连接的蓝牙设备信息放入缓存
                        setTimeout(() => {
                            _this.getBLEDeviceServices(deviceId)
                        }, 1000)
                    },
                    fail(res) {
                        uni.showToast({
                            icon: 'none',
                            title: '蓝牙连接失败'
                        });
                    }
                })
        },
        // åœæ­¢æœå¯»è“ç‰™è®¾å¤‡
        stopBluetoothDevicesDiscovery() {
            uni.stopBluetoothDevicesDiscovery({
                success: e => {
                    this.loading = false
                    console.log('停止搜索蓝牙设备:' + e.errMsg);
                },
                fail: e => {
                    console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode);
                }
            });
        },
        //获取蓝牙特征
        getBLEDeviceCharacteristics(deviceId, serviceId) {
            console.log("进入特征");
            setTimeout(() => {
                uni.getBLEDeviceCharacteristics({
                    // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                    deviceId: deviceId,
                    // è¿™é‡Œçš„ serviceId éœ€è¦åœ¨ getBLEDeviceServices æŽ¥å£ä¸­èŽ·å–
                    serviceId: serviceId,
                    success: (res) => {
                        console.log(res, '特征getBLEDeviceCharacteristics')
                        this.characteristics = res.characteristics
                        res.characteristics.forEach((item) => {
                            if (item.uuid.indexOf("FF02") != -1) {
                                this.characteristicId = item.uuid
                                uni.setStorageSync("characteristicId", item
                                    .uuid) //把已经连接的蓝牙设备标识放入缓存
                                uni.setStorageSync("serviceId",
                                    serviceId) //把已经连接的蓝牙设备ID放入缓存
                                //console.log('characteristicId:', item.uuid)
                                //利用传参的形势传给下面的notify,这里的uuid如果都需要用到,就不用做判断了,建议使用setTimeout进行间隔性的调用此方法
                                // this.notifyBLECharacteristicValueChange(item.uuid)
                                setTimeout(() => {
                                    uni.hideLoading();
                                    this.BottomShow = false
                                    this.DrawerModalL = false
                                }, 1000)
                            }
                        })
                    },
                    fail: (res) => {
                        console.log(res)
                    }
                })
            }, 1000)
        },
        // å¯ç”¨ notify åŠŸèƒ½
        notifyBLECharacteristicValueChange(characteristicId) {
            let _this = this
            console.log('deviceId' + _this.deviceId)
            console.log('serviceId' + _this.serviceId)
            console.log('characteristicId' + characteristicId)
            // _this.fanhui()
            uni.notifyBLECharacteristicValueChange({
                state: true, // å¯ç”¨ notify åŠŸèƒ½
                // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                deviceId: this.deviceId,
                // è¿™é‡Œçš„ serviceId éœ€è¦åœ¨ getBLEDeviceServices æŽ¥å£ä¸­èŽ·å–
                serviceId: this.serviceId,
                // è¿™é‡Œçš„ characteristicId éœ€è¦åœ¨ getBLEDeviceCharacteristics æŽ¥å£ä¸­èŽ·å–
                characteristicId: characteristicId,
                success: (res) => {
                    if (this.blueFlag == true) {
                        this.writeBLECharacteristicValue()
                    } else {
                        uni.showLoading({
                            title: '蓝牙服务获取成功,请打印',
                            mask: true,
                        });
                    }
                    setTimeout(() => {
                        uni.hideLoading();
                    }, 1000)
                    // _this.fanhui()
                    this.print = "打印"
                    this.BottomShow = false
                    console.log('notifyBLECharacteristicValueChange success', res.errMsg)
                },
                fail: (res) => {
                    uni.showLoading({
                        title: '蓝牙服务获取成功,请打印',
                        mask: true,
                    });
                    setTimeout(() => {
                        uni.hideLoading();
                    }, 1000)
                    _this.print = "打印"
                    _this.BottomShow = false
                    // _this.fanhui()
                    console.log('notifyBLECharacteristicValueChange fail', res.errMsg)
                }
            })
        },
        //获取蓝牙的所有服务
        getBLEDeviceServices(deviceId) {
            uni.showLoading({
                title: '正在获取蓝牙服务...',
                mask: true,
            });
            setTimeout(() => {
                uni.getBLEDeviceServices({
                    // è¿™é‡Œçš„ deviceId éœ€è¦å·²ç»é€šè¿‡ createBLEConnection ä¸Žå¯¹åº”设备建立链接
                    deviceId: deviceId,
                    success: (res) => {
                        uni.showLoading({
                            title: '获取中,请稍后...',
                            mask: true,
                        });
                        res.services.forEach((item) => {
                            if (item.uuid.indexOf("FF00") != -1) {
                                this.serviceId = item.uuid;
                                //获取特征
                                this.getBLEDeviceCharacteristics(deviceId, item.uuid)
                            }
                        })
                    }
                })
            }, 1000)
        },
        //写入蓝牙
        writeBLECharacteristicValue() {
            this.printflag = false
            let deviceId = uni.getStorageSync('deviceId')
            let serviceId = uni.getStorageSync('serviceId')
            let characteristicId = uni.getStorageSync('characteristicId')
            const printerJobs = new PrinterJobs();
            console.log(this.arr)
            this.arr.forEach(item => {
                if(item.business_order_type==null){
                    printerJobs
                        .label_set_page(576, 400)
                        //边框
                        .drawLine(1, 0, 0, 570, 0)
                        .drawLine(1, 0, 0, 0, 360)
                        .drawLine(1, 570, 0, 570, 360)
                        .drawLine(1, 0, 360, 570, 360)
                        //内部横线
                        .drawLine(1, 0, 94, 570, 94) //第一行
                        .drawLine(1, 0, 160, 570, 160) //第二行
                        .drawLine(1, 0, 227, 570, 227) //第三行
                        .drawLine(1, 0, 293, 400, 293) //第四行
                        .drawLine(1, 120, 94, 120, 360) // ç¬¬ä¸€æ ¹ç«–线
                        .drawLine(1, 400, 227, 400, 360) // ç¬¬äºŒæ ¹ç«–线
                        // 1 åŽŸå§‹ æ˜¯å¦ç²—体\字体大小\是否旋转角度\起始横坐标\起始纵坐标\字符串
                        .drawText(170, 20, "重庆青山工业有限责任公司", 26, 0, 1, false, false)
                        .drawText(240, 62, '物料标识签', 26, 0, 1, false, false)
                        // 3
                        .drawText(10, 120, "物料编号", 24, 0, 0, false, false)
                        .drawText(130, 120, item.material_code, 24, 0, 0, false, false)
                        // 4
                        .drawText(10, 185, "物料名称", 24, 0, 0, false, false)
                        .drawText(130, 185, item.material_name, 24, 0, 0, false, false)
                        // 5
                        .drawText(10, 248, "物料批次", 24, 0, 0, false, false)
                        .drawText(130, 248, item.lots_sn, 24, 0, 0, false, false)
                        // 7
                        .drawText(10, 312, "打印时间", 24, 0, 0, false, false)
                        .drawText(130, 312, item.material_actual_num, 24, 0, 0, false, false)
                        // äºŒç»´ç 
                        .drawQrCode(438, 232, item.material_code, 0, 4, 1)
                        .drawText(423, 340, item.material_name, 1, 0, 0, false, false)
                        .label_print(0, 1);
                }else{
                    printerJobs
                        .label_set_page(576, 400)
                        //边框
                        .drawLine(1, 0, 0, 570, 0)
                        .drawLine(1, 0, 0, 0, 360)
                        .drawLine(1, 570, 0, 570, 360)
                        .drawLine(1, 0, 360, 570, 360)
                        //内部横线
                        .drawLine(1, 0, 52, 570, 52) //第一行
                        .drawLine(1, 0, 104, 570, 104) //第二行
                        .drawLine(1, 0, 156, 570, 156) //第三行
                        .drawLine(1, 0, 208, 400, 208) //第四行
                        .drawLine(1, 0, 260, 400, 260) //第五行
                        .drawLine(1, 0, 312, 400, 312) //第六行
                        .drawLine(1, 120, 0, 120, 360) // ç¬¬ä¸€æ ¹ç«–线
                        .drawLine(1, 220, 260, 220, 312) // ç¬¬äºŒæ ¹ç«–线
                        .drawLine(1, 300, 260, 300, 312) // ç¬¬ä¸‰æ ¹ç«–线
                        .drawLine(1, 400, 156, 400, 312,) // ç¬¬å››æ ¹ç«–线
                        // 1 åŽŸå§‹ æ˜¯å¦ç²—体\字体大小\是否旋转角度\起始横坐标\起始纵坐标\字符串
                        .drawText(10, 20, "物料编号", 24, 0, 0, false, false)
                        .drawText(130, 20, item.material_code, 24, 0, 0, false, false)
                        // 2
                        .drawText(10, 72, "物料名称", 24, 0, 0, false, false)
                        .drawText(130, 72, item.material_name, 24, 0, 0, false, false)
                        // 3
                        .drawText(10, 124, "物料批次", 24, 0, 0, false, false)
                        .drawText(130, 124, item.lots_sn, 24, 0, 0, false, false)
                        // 4
                        .drawText(10, 176, "单据号", 24, 0, 0, false, false)
                        .drawText(130, 176, item.business_order_no, 24, 0, 0, false, false)
                        // 5
                        .drawText(10, 225, "单据类型", 24, 0, 0, false, false)
                        .drawText(130, 225, item.business_order_type, 24, 0, 0, false, false)
                        // // 5-1
                        // .drawText(230, 225, "工序", 24, 0, 0, false, false)
                        // .drawText(310, 225, item.cellNo, 24, 0, 0, false, false)
                        // 6
                        .drawText(10, 280, "分拣前", 24, 0, 0, false, false)
                        .drawText(130, 280, item.material_original_num, 24, 0, 0, false, false)
                        // 6-1
                        .drawText(230, 280, "分拣后", 24, 0, 0, false, false)
                        .drawText(340, 280, item.material_actual_num, 24, 0, 0, false, false)
                        // 7
                        .drawText(10, 332, "分拣数量", 24, 0, 0, false, false)
                        .drawText(130, 332, item.cTime, 24, 0, 0, false, false)
                        .drawText(440, 332, item.material_require_num, 24, 0, 0, false, false)
                        // äºŒç»´ç 
                        .drawQrCode(426, 170, item.material_code, 0, 6, 1)
                        .drawText(434, 310, item.material_name, 1, 0, 0, false, false)
                        .label_print(0, 1);
                }
            })
            let buffer = printerJobs.buffer();
            // console.log('ArrayBuffer', 'length: ' + buffer.byteLength, ' hex: ' + ab2hex(buffer));
            // 1.并行调用多次会存在写失败的可能性
            // 2.建议每次写入不超过20字节
            // åˆ†åŒ…处理,延时调用
            const maxChunk = 18;
            const delay =20;
            for (let i = 0, j = 0, length = buffer.byteLength; i < length; i += maxChunk, j++) {
                let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length);
                // setTimeout(this._writeBLECharacteristicValue, j * delay, subPackage);
                setTimeout(() => {
                        this._writeBLECharacteristicValue(deviceId, serviceId, characteristicId, subPackage)
                    }, j *delay);
            }
        },
        _writeBLECharacteristicValue(deviceId, serviceId, characteristicId, buffer) {
            uni.writeBLECharacteristicValue({
                deviceId: deviceId,
                serviceId: serviceId,
                characteristicId: characteristicId,
                value: buffer,
                success(res) {
                    console.log('writeBLECharacteristicValue success', res.errMsg)
                },
                fail(res) {
                    console.log(JSON.stringify(res))
                    console.log(JSON.stringify(buffer))
                    uni.getStorageSync('failerr','try')
                }
            })
        },
        //长按事件
        longpress(item, index) {
            let _this = this
            if (uni.getStorageSync('deviceId')) {
                uni.showToast({
                    title: '蓝牙已连接!',
                    icon: 'none',
                    duration: 2000
                })
                return
            }
            uni.showModal({
                title: '提示',
                content: '是否连接蓝牙:' + item.name,
                showCancel: true,
                cancelColor: '#333333',
                success: (res => {
                    if (res.confirm) {
                        // _this.stopBluetoothDevicesDiscovery()
                        uni.setStorageSync('itemblue', item.name)
                        this.itemblue = item.name
                        _this.createBLEConnection(item.deviceId)
                    } else if (res.cancel) {
                        uni.showToast({
                            title: '已取消连接',
                            duration: 2000,
                            icon: 'none'
                        })
                    }
                })
            });
        },
        // ç‚¹å‡»æ–­å¼€è“ç‰™è¿žæŽ¥
        tomy() {
            var _this = this
            uni.closeBluetoothAdapter({
                success(res) {
                    uni.removeStorageSync('deviceId')
                    uni.removeStorageSync("serviceId");
                    uni.removeStorageSync("characteristicId");
                    // _this.openBluetoothAdapter()
                }
            })
        },
        //返回
        fanhui() {
            uni.navigateTo({
                url: './printing'
            })
        },
    }
}
LA24030_LuLiPackageLine_Pda/mock/callHistory.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
const QryCallMaterial = {
    "code": 0,
    "msg": "执行成功",
    "data": [{
            "time": "12:00", //产线编号
            "station_code": "OP15", //工位编号
            "call_status": "未响应" // å‘¼å«çŠ¶æ€(1.未响应、2.已响应、3.已完成)
        },
        {
            "time": "12:12", //产线编号
            "station_code": "OP001", //工位编号
            "call_status": "已响应" // å‘¼å«çŠ¶æ€(1.未响应、2.已响应、3.已完成)
        }
    ]
}
const substitution = {
    "code": 0,
    "msg": "执行成功",
    "data": [{
            "wo": "wo0817002", //待出库工单号
            "stockOutMaterial": [ //待出库物料
                {
                    "containerInstanceDetailId": "7db4f2c4-f539-586e-b733-39fe64c3b828", //出库物料(即待发去库存中虚拟盛具中的物料)
                    "material_code": "N001", //物料编码
                    "material_name": "测试1", //物料名称
                    "lots_sn": "LOTSN20210817003", //批次条码
                    "wo_require_num": 999, //工单需求数 (工单需求物料数量)
                    "no_online_num": 999, //未上线数
                    "stockOut_num": 25, //当前库存数
                    "edit":false
                }
            ]
        },
        {
            "wo": "wo0817003",
            "stockOutMaterial": [{
                    "containerInstanceDetailId": "fec28091-1478-e691-0252-39fe64c3b829",
                    "material_code": "N002",
                    "material_name": "测试2",
                    "lots_sn": "LOTSN20210817004",
                    "wo_require_num": 999,
                    "no_online_num": 999,
                    "stockOut_num": 14,
                    "edit":false
                },
                {
                    "containerInstanceDetailId": "54cb0507-4003-b5bc-a0f0-39fe64dbb485",
                    "material_code": "N002",
                    "material_name": "测试2",
                    "lots_sn": "LOTSN20210817004",
                    "wo_require_num": 999,
                    "no_online_num": 999,
                    "stockOut_num": 14,
                    "edit":false
                }
            ]
        }
    ]
}
module.exports = {
    QryCallMaterial,
    substitution
}
LA24030_LuLiPackageLine_Pda/mock/theCleaning.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
const QryNoCleanStockOutWO = {
    "code": 0,
    "msg": "执行成功",
    "data": [{
            "wo": "wo0817002", //待出库工单号
            "stockOutMaterial": [ //待出库物料
                {
                    "containerInstanceDetailId": "7db4f2c4-f539-586e-b733-39fe64c3b828", //出库物料(即待发去库存中虚拟盛具中的物料)
                    "material_code": "N001", //物料编码
                    "material_name": "测试1", //物料名称
                    "lots_sn": "LOTSN20210817003", //批次条码
                    "wo_require_num": 999, //工单需求数 (工单需求物料数量)
                    "no_online_num": 999, //未上线数
                    "stockOut_num": 25 //当前库存数
                }
            ]
        },
        {
            "wo": "wo0817003",
            "stockOutMaterial": [{
                    "containerInstanceDetailId": "fec28091-1478-e691-0252-39fe64c3b829",
                    "material_code": "N002",
                    "material_name": "测试2",
                    "lots_sn": "LOTSN20210817004",
                    "wo_require_num": 999,
                    "no_online_num": 999,
                    "stockOut_num": 14
                },
                {
                    "containerInstanceDetailId": "54cb0507-4003-b5bc-a0f0-39fe64dbb485",
                    "material_code": "N002",
                    "material_name": "测试2",
                    "lots_sn": "LOTSN20210817004",
                    "wo_require_num": 999,
                    "no_online_num": 999,
                    "stockOut_num": 14
                }
            ]
        }
    ]
}
const NoCleanStockOut = {
    "code": 0,
    "msg": "出库成功...",
    "data": null
}
module.exports = {
    QryNoCleanStockOutWO,
    NoCleanStockOut
}
LA24030_LuLiPackageLine_Pda/nativeplugins/PrintSDK/android/libDevice_v1.7.8_2022-04-29.aar
Binary files differ
LA24030_LuLiPackageLine_Pda/nativeplugins/PrintSDK/android/libPrinter_v1.3.4_2023-06-26.aar
Binary files differ
LA24030_LuLiPackageLine_Pda/nativeplugins/PrintSDK/android/print-release.aar
Binary files differ
LA24030_LuLiPackageLine_Pda/nativeplugins/PrintSDK/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
{
    "name": "SPD_PrintSDK_Uniapp",
    "id": "PrintSDK",
    "version": "2.1.0",
    "description": "思必拓打印机插件2.1",
    "_dp_type":"nativeplugin",
    "_dp_nativeplugin":{
        "android": {
            "plugins": [
                {
                    "type": "module",
                    "name": "PrintSDK",
                    "class": "com.spd.print.PrintModule"
                }
            ],
            "hooksClass": "com.spd.print.PrintModule_AppProxy",
            "integrateType": "aar",
            "dependencies": [
            ],
            "compileOptions": {
                "sourceCompatibility": "1.8",
                "targetCompatibility": "1.8"
            },
            "abis": [
                "armeabi-v7a"
            ],
            "minSdkVersion": "16",
            "useAndroidX": false,
            "permissions": [
            ],
            "parameters": {
            }
        }
    }
}
LA24030_LuLiPackageLine_Pda/package-lock.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,231 @@
{
  "name": "iWare_RawMaterialWarehouse_Pda",
  "lockfileVersion": 2,
  "requires": true,
  "packages": {
    "": {
      "devDependencies": {
        "qs": "^6.11.2",
        "vuex": "^4.0.2"
      }
    },
    "node_modules/@vue/devtools-api": {
      "version": "6.6.3",
      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz",
      "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==",
      "dev": true
    },
    "node_modules/call-bind": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
      "dev": true,
      "dependencies": {
        "function-bind": "^1.1.1",
        "get-intrinsic": "^1.0.2"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/function-bind": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
      "dev": true
    },
    "node_modules/get-intrinsic": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
      "dev": true,
      "dependencies": {
        "function-bind": "^1.1.1",
        "has": "^1.0.3",
        "has-proto": "^1.0.1",
        "has-symbols": "^1.0.3"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/has": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
      "dev": true,
      "dependencies": {
        "function-bind": "^1.1.1"
      },
      "engines": {
        "node": ">= 0.4.0"
      }
    },
    "node_modules/has-proto": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
      "dev": true,
      "engines": {
        "node": ">= 0.4"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/has-symbols": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
      "dev": true,
      "engines": {
        "node": ">= 0.4"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/object-inspect": {
      "version": "1.12.3",
      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
      "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
      "dev": true,
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/qs": {
      "version": "6.11.2",
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
      "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
      "dev": true,
      "dependencies": {
        "side-channel": "^1.0.4"
      },
      "engines": {
        "node": ">=0.6"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/side-channel": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
      "dev": true,
      "dependencies": {
        "call-bind": "^1.0.0",
        "get-intrinsic": "^1.0.2",
        "object-inspect": "^1.9.0"
      },
      "funding": {
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/vuex": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz",
      "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
      "dev": true,
      "dependencies": {
        "@vue/devtools-api": "^6.0.0-beta.11"
      },
      "peerDependencies": {
        "vue": "^3.2.0"
      }
    }
  },
  "dependencies": {
    "@vue/devtools-api": {
      "version": "6.6.3",
      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz",
      "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==",
      "dev": true
    },
    "call-bind": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
      "dev": true,
      "requires": {
        "function-bind": "^1.1.1",
        "get-intrinsic": "^1.0.2"
      }
    },
    "function-bind": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
      "dev": true
    },
    "get-intrinsic": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
      "dev": true,
      "requires": {
        "function-bind": "^1.1.1",
        "has": "^1.0.3",
        "has-proto": "^1.0.1",
        "has-symbols": "^1.0.3"
      }
    },
    "has": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
      "dev": true,
      "requires": {
        "function-bind": "^1.1.1"
      }
    },
    "has-proto": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
      "dev": true
    },
    "has-symbols": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
      "dev": true
    },
    "object-inspect": {
      "version": "1.12.3",
      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
      "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
      "dev": true
    },
    "qs": {
      "version": "6.11.2",
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
      "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
      "dev": true,
      "requires": {
        "side-channel": "^1.0.4"
      }
    },
    "side-channel": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
      "dev": true,
      "requires": {
        "call-bind": "^1.0.0",
        "get-intrinsic": "^1.0.2",
        "object-inspect": "^1.9.0"
      }
    },
    "vuex": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz",
      "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
      "dev": true,
      "requires": {
        "@vue/devtools-api": "^6.0.0-beta.11"
      }
    }
  }
}
LA24030_LuLiPackageLine_Pda/package.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
{
  "devDependencies": {
    "qs": "^6.11.2",
    "vuex": "^4.0.2"
  }
}
LA24030_LuLiPackageLine_Pda/pages.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,558 @@
{
    "easycom": {
        "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
    },
    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
        {
            "path": "pages/login/login",
            "style": {
                "navigationBarTitleText": "登录页",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/index/index",
            "style": {
                "navigationBarTitleText": "首页",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/print/bluetoothConnection",
            "style": {
                "navigationBarTitleText": "蓝牙连接",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/print/materialInfo",
            "style": {
                "navigationBarTitleText": "无单标签打印",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/print/material",
            "style": {
                "navigationBarTitleText": "物料打印",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/print/deliver",
            "style": {
                "navigationBarTitleText": "发货打印",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/print/gauge",
            "style": {
                "navigationBarTitleText": "工量具标签",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/untie/untie",
            "style": {
                "navigationBarTitleText": "物料解绑",
                "enablePullDownRefresh": false
            }
        },
         {
            "path": "pages/putaway/putaway",
            "style": {
                "navigationBarTitleText": "上架",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/untie/untieForMove",
            "style": {
                "navigationBarTitleText": "移库",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/untie/checkAllMove",
            "style": {
                "navigationBarTitleText": "全检移库",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/untie/localBind",
            "style": {
                "navigationBarTitleText": "库位绑定",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/untie/localUnBind",
            "style": {
                "navigationBarTitleText": "库位解绑",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/crossDock/crossDock",
            "style": {
                "navigationBarTitleText": "越库",
                "enablePullDownRefresh": true,
                "onReachBottomDistance": 20
            }
        },{
            "path": "pages/untie/outbound",
            "style": {
                "navigationBarTitleText": "出库确认",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/artificial/artificial",
            "style": {
                "navigationBarTitleText": "入库",
                "enablePullDownRefresh": false
            }
        },{
            "path": "pages/recommend/recommend",
            "style": {
                "navigationBarTitleText": "推荐库位",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/putIn/putIn",
            "style": {
                "navigationBarTitleText": "入库操作",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/callTray/callTray",
            "style": {
                "navigationBarTitleText": "容器解绑",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/putIn/material/material",
            "style": {
                "navigationBarTitleText": "点到点",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/putIn/three/three",
            "style": {
                "navigationBarTitleText": "立库入库",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/putIn/plane/plane",
            "style": {
                "navigationBarTitleText": "平库入库",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/hander/handerIn",
            "style": {
                "navigationBarTitleText": "手工入库",
                "enablePullDownRefresh": false
            }
        },{
            "path": "pages/hander/handerOut",
            "style": {
                "navigationBarTitleText": "手工出库",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/unpack/unpack",
            "style": {
                "navigationBarTitleText": "出库操作",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/unpack/plane/plane",
            "style": {
                "navigationBarTitleText": "平库出库",
                "enablePullDownRefresh": false
            }
        },
        // {
        //     "path": "pages/unpack/material/material",
        //     "style": {
        //         "navigationBarTitleText": "物料出库",
        //         "enablePullDownRefresh": false
        //     }
        // },
        {
            "path": "pages/takeMaterial/takeMaterial",
            "style": {
                "navigationBarTitleText": "收货管理",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/takeMaterial/order/order",
            "style": {
                "navigationBarTitleText": "收货",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/takeMaterial/orderpiece/orderpiece",
            "style": {
                "navigationBarTitleText": "送货单收货",
                "enablePullDownRefresh": false
            }
        },{
            "path": "pages/takeMaterial/orderpiece/orderpiecePo",
            "style": {
                "navigationBarTitleText": "po收货",
                "enablePullDownRefresh": false
            }
        },{
            "path": "pages/takeMaterial/orderpiece/poYueku",
            "style": {
                "navigationBarTitleText": "po越库",
                "enablePullDownRefresh": false
            }
        },{
            "path": "pages/takeMaterial/orderpiece/doYueku",
            "style": {
                "navigationBarTitleText": "do越库",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/takeMaterial/noOrder/noOrder",
            "style": {
                "navigationBarTitleText": "非订单件收货",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/takeMaterial/former/former",
            "style": {
                "navigationBarTitleText": "旧件收货",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/takeMaterial/return/return",
            "style": {
                "navigationBarTitleText": "退货件收货",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/takeMaterial/give/give",
            "style": {
                "navigationBarTitleText": "归还件收货",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/sort/sort",
            "style": {
                "navigationBarTitleText": "分拣",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/sort/sort2",
            "style": {
                "navigationBarTitleText": "分拣PO",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/check/return",
            "style": {
                "navigationBarTitleText": "容器回库",
                "enablePullDownRefresh": false
            }
        }, {
            "path": "pages/check/out",
            "style": {
                "navigationBarTitleText": "盘点出库",
                "enablePullDownRefresh": true
            }
        }, {
            "path": "pages/check/check/index",
            "style": {
                "navigationBarTitleText": "盘点",
                "enablePullDownRefresh": true,
                "onReachBottomDistance": 50
            }
        }, {
            "path": "pages/check/check/check",
            "style": {
                "navigationBarTitleText": "盘点",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/wareTool/borrow",
            "style": {
                "navigationBarTitleText": "工量具借用",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/wareTool/index",
            "style": {
                "navigationBarTitleText": "工量具归还",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/receive/receive",
            "style": {
                "navigationBarTitleText": "领用单拍照",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/borrow/borrow",
            "style": {
                "navigationBarTitleText": "借用归还",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/scrap/scrap",
            "style": {
                "navigationBarTitleText": "报废",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/scrap/photo",
            "style": {
                "navigationBarTitleText": "报废拍照",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/putIn/empty/empty",
            "style": {
                "navigationBarTitleText": "空托入库",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "pages/sort/return",
            "style": {
                "navigationBarTitleText": "回库",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/old/index",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/old/putIn",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/old/putOut",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        },
        {
            "path": "node_modules/uview-ui/components/u-full-screen/u-full-screen",
            "style": {
                "navigationStyle": "custom", // å–消本页面的导航栏
                "app-plus": {
                    "animationType": "fade-in", // è®¾ç½®fade-in淡入动画,为最合理的动画类型
                    "background": "transparent", // èƒŒæ™¯é€æ˜Ž
                    "backgroundColor": "rgba(0,0,0,0)", // èƒŒæ™¯é€æ˜Ž
                    "popGesture": "none" // å…³é—­IOS屏幕左边滑动关闭当前页面的功能
                }
            }
        }
        ,{
            "path" : "pages/sort/search",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/mark/mark",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/sort/index",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        },{
            "path" : "pages/sort/pickorder",
            "style" :
            {
                "navigationBarTitleText": "容器组盘上架"
            }
        } ,{
            "path" : "pages/sort/kittingSort",
            "style" :
            {
                "navigationBarTitleText": "容器下架",
                "enablePullDownRefresh": true,
                "onReachBottomDistance": 20
            }
        } ,{
            "path" : "pages/sort/squareSort2",
            "style" :
            {
                "navigationBarTitleText": "DO分拣",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/deliver/deliver",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        },{
            "path" : "pages/deliver/deliverDo",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/expressmail/expressmail",
            "style" :
            {
                "navigationBarTitleText": "",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/print/wms",
            "style" :
            {
                "navigationBarTitleText": "生产库标签",
                "enablePullDownRefresh": false
            }
        },
        {
            "path" : "pages/check/square",
            "style" :
            {
                "navigationBarTitleText": "平库盘点",
                "enablePullDownRefresh": true
            }
        },
        {
            "path" : "pages/check/index",
            "style" :
            {
                "navigationBarTitleText": "平库盘点",
                "enablePullDownRefresh": false
            }
        }
        ,{
            "path" : "pages/resume/pickResume",
            "style" :
            {
                "navigationBarTitleText": "取货撤销",
                "enablePullDownRefresh": true,
                "onReachBottomDistance": 20
            }
        }
        ,{
            "path" : "pages/resume/sortResume",
            "style" :
            {
                "navigationBarTitleText": "分拣撤销",
                "enablePullDownRefresh": true,
                "onReachBottomDistance": 20
            }
        }
        ,{
            "path" : "pages/resume/yukuResume",
            "style" :
            {
                "navigationBarTitleText": "越库撤销",
                "enablePullDownRefresh": true,
                "onReachBottomDistance": 20
            }
        }
    ],
    "globalStyle": {
        "navigationBarTextStyle": "black",
        "navigationBarTitleText": "标准化原材料库",
        "navigationBarBackgroundColor": "#F8F8F8",
        "navigationStyle": "custom", //取消uni-app原生头部导航栏 å…¨å±€
        "backgroundColor": "#F8F8F8",
        "pageOrientation":"auto" //启用屏幕旋转
    }
}
LA24030_LuLiPackageLine_Pda/pages/artificial/artificial.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,799 @@
<template>
    <view style="padding-bottom:150px" class="boxTip">
        <cu-custom bgColor="bg-white" :isBack="true">
            <block slot="backText">
            </block>
            <block slot="content">组盘</block>
        </cu-custom>
        <!-- <view class="flex justify-end align-center padding_right30rpx padding_top12rpx">
            <text class="fontSize12rpx"> æ“ä½œäººï¼š{{operator}} </text>
        </view> -->
        <u-form labelPosition="left" label-width="180rpx" :model="warehouse" ref="warehouseRef">
            <u-row class="border_bottom margin_top10rpx padding_left25rpx" style="background-color: #fff;">
                <u-col span="12">
                    <u-form-item label="容器编号:" prop="containerCode" required class="uFormItem">
                        <u-input :focus="curFoucus" v-model.trim="warehouse.containerCode" @confirm="getMaterialDetails(1)"
                            placeholder="请扫码录入" :disabled="kwbhAllowed" style="font-weight: bolder;margin-left: 15rpx;"
                            class="width padding_left25rpx">
                        </u-input>
                    </u-form-item>
                </u-col>
            </u-row>
            <u-row v-if="warehouse.containerCode" class="border_bottom margin_top10rpx padding_left25rpx"
                style="background-color: #fff;">
                <u-col span="12">
                    <u-form-item label="物料跟踪码:" class="uFormItem">
                        <u-input v-model="warehouse.snCode" ref="materialRef" placeholder="请扫码录入"
                            @focus="warehouse.snCode = ''" @confirm="getMaterialDetails"
                            style="font-weight: bolder;margin-left: 15rpx;" class="width padding_left25rpx">
                        </u-input>
                    </u-form-item>
                </u-col>
            </u-row>
            <u-row class="border_bottom margin_top10rpx  background_fff padding_left25rpx">
                <u-col span="12">
                    <u-form-item label="目标库区:" prop="tray" class="uFormItem">
                        <input v-model="warehouse.areaCode" type="select" placeholder="请选择目标库区" @focus="containerFocus"
                            class="width"></input>
                        <u-action-sheet :list="wolist" v-model="modalshow" @click="confirmXl"></u-action-sheet>
                        <!-- <u-select v-model="modalshow" :list="wolist" @confirm="confirm" value-name="id" label-name="name"></u-select> -->
                    </u-form-item>
                </u-col>
            </u-row>
            <u-row class="border_bottom margin_top10rpx padding_left25rpx" style="background-color: #fff;">
                <u-col span="10">
                    <u-form-item label="目标库位:" class="uFormItem">
                        <u-input v-model="warehouse.placeCode" placeholder="请扫码录入"
                            style="font-weight: bolder;margin-left: 15rpx;" class="width padding_left25rpx">
                        </u-input>
                    </u-form-item>
                </u-col>
                <u-col span="2" @tap="containerFocus2">
                    <span class="fontSize15rpx">推荐</span>
                    <u-icon name="arrow-right" size="14" class="fontSize15rpx"></u-icon>
                </u-col>
                <view class="boxList" v-show="modalshow2" @click="modalshow2 = false" @touchmove.stop>
                    <view class="innerWrap">
                        <ul v-for="(item, eindex) in containerList" :key="eindex">
                            <li @click="confirm2(eindex)"> {{ item.text }}</li>
                        </ul>
                    </view>
                </view>
            </u-row>
        </u-form>
        <modal-code :rescode='rescode' :resmessage='resmessage' ref="resmodal" />
        <view style="margin-bottom: 200rpx;" class="margin_top10rpx">
            <view v-for="(item, eindex) in singlist" :key="eindex" class="margin_bottom10rpx">
                <u-swipe-action :show="item.show" :index="eindex" @click="longpress" @open="open" @close='close'
                    :options="options" style="width: 100vw;">
                    <view class="fontSize32rpx background_fff padding10" :class="item.enAbled == 0 ? 'bg_item' : ''">
                        <u-row>
                            <u-col span="12" class="flex">
                                <text class="flex justify-center align-center circkle06">{{ eindex + 1 }}</text>
                                <text class="color_f18202 padding_left10rpx">
                                    {{ item.materialCode }}-{{ item.materialName }}
                                </text>
                                <!-- <u-icon name="plus-circle" v-if="item.enAbled!=1"></u-icon> -->
                            </u-col>
                        </u-row>
                        <u-row>
                            <u-col span="12">
                                <text class="color_80 padding_left25rpx">
                                    è´¨æ£€çŠ¶æ€ï¼š{{ item.qcStatusName }}
                                </text>
                            </u-col>
                        </u-row>
                        <u-row>
                            <u-col span="12">
                                <view class="color_80 padding_left25rpx">
                                    <text style="display: inline-block">批次:{{ item.batch }}</text>
                                </view>
                            </u-col>
                        </u-row>
                        <u-row>
                            <u-col span="12">
                                <text class="color_80 padding_left25rpx">
                                    è·Ÿè¸ªç ï¼š{{ item.snCode }}
                                </text>
                            </u-col>
                        </u-row>
                        <u-row>
                            <u-col span="8">
                                <text class="color_80 padding_left25rpx">
                                </text>
                            </u-col>
                            <u-col span="4">
                                <text class="color_f18202 ">
                                    æ•°é‡ï¼š{{ item.quantity }}
                                </text>
                            </u-col>
                        </u-row>
                        <!-- <u-row>
                            <u-col span="7">
                            </u-col>
                            <u-col span="5" class="flex">
                                <view class="color_80">
                                    æ•°é‡ï¼š
                                </view>
                                <input :class="item.enAbled ? '' : 'border_bottom_f18202 inputGray'"
                                    class="text-left color_f18202 fontSize32rpx inputGray2" v-model="item.quantity"
                                    type="number" :disabled="item.enAbled == 1" @blur="changeNum(item)" @click="clicki(item)"
                                    placeholder="0" />
                            </u-col>
                        </u-row> -->
                    </view>
                </u-swipe-action>
            </view>
        </view>
        <button-modal :issueShow='true' issueTitle="重置" subTitle='组盘' restTiltle='组盘上架' @reset='goWarhouse' @submit='submit'
            @issue="reset" />
    </view>
</template>
<script>
import ButtonModal from '../../components/buttonModal.vue'
import ModalCode from '../../components/ModalCode.vue'
import {
    getOrderNo,
    addGroupDisk,
    onlyUpdateDutyCycle,
    getareaTypesList,
    getContainDetail,
    getContainerRecord,
    getBhbMaterialList,
    PdaBindListForSNCode,
    getRecommendList
} from '../../api/putIn/artificial.js'
import {
    getDate
} from '../../utils/dateTime.js'
import {
    getAttrValue
} from '../../utils/tool.js'
import {
    bindputawayConfirm
} from '../../api/putaway/putaway.js'
export default {
    data() {
        return {
            containerList: [],
            curFoucus: true,
            rescode: 0,
            resmessage: "",
            putCode: '', //容器二维码
            detailshow: false,
            operator: '',
            focu: false, //清空按钮隐显
            focuM: false, //物料隐显按钮
            Datetime: getDate(),
            singlist: [], //物料详情
            wolist: [],
            options: [
                // {
                //     text: '详情',
                //     style: {
                //         backgroundColor: '#fc9f35'
                //     }
                // }
                {
                    text: '删除',
                    style: {
                        backgroundColor: '#fc4b4b'
                    }
                }
            ],
            materlist: {},
            warehouse: {
                containerCode: '',
                materialCode: '',
                storehouseCode: "",
                snCode: "",
                // gridNumber: 1,
                // useNumber: 0,
                // exitNumber: 0,
                // dutyCycle:1
            },
            modalshow: false,
            modalshow2: false,
            gridable: true,
            gridFocus: false,
            detailable: false,
            detailableZb: false,
            batchNo: '', //扫码到的当前物料的批次
            warehouseRules: {
                containerCode: [{
                    required: true,
                    message: '容器编号不能为空',
                    trigger: 'blur'
                }],
                materialCode: [{
                    required: true,
                    message: '物料编号不能为空',
                    trigger: 'blur'
                }]
            },
            orderType: 1,
            warhouseTph: '',
            timerPrint: null,
            kwbhAllowed: false, //是否禁用库位编号
            arrD: [],
            statusTp: {
                'tpStatus': ''
            }
        };
    },
    components: {
        ButtonModal,
        ModalCode
    },
    onLoad(option) {
        if (option.orderType) {
            this.orderType = option.orderType
        }
    },
    onReady() {
        this.$refs.warehouseRef.setRules(this.warehouseRules)
    },
    mounted() {
        this.operator = JSON.parse(uni.getStorageSync('userInfo')).name
        this.getVehicleType()
    },
    computed: {
        containerCode() {
            return this.warehouse.containerCode
        }
    },
    watch: {
        containerCode(val) {
            if (!val) {
                this.detailable = false;
                this.detailableZb = false;
                this.warehouse.exitNumber = 0
            }
        },
        singlist(val) {
            this.warehouse.exitNumber = val.length
        }
    },
    methods: {
        //容器类型聚焦事件
        containerFocus() {
            uni.hideKeyboard()
            this.modalshow = true
        },
        gridBtnClick() {
            this.gridable = !this.gridable
            if (!this.gridable) {
                this.$nextTick(() => {
                    this.gridFocus = true;
                })
            } else {
                this.$nextTick(() => {
                    this.gridFocus = false;
                })
            }
        },
        //容器编号点击
        containerClick() {
            uni.scanCode({
                scanType: ['barCode', 'qrCode'],
                autoDecodeCharset: true,
                success: (res) => {
                    this.warehouse.containerCode = res.result
                    this.containerBlur()
                },
                fail: (err) => {
                    this.rescode = 400
                    this.resmessage = `扫描失败${err}`
                    this.$refs.resmodal.show = true
                }
            })
        },
        //容器失焦事件
        containerBlur() {
            Promise.all([this.getContainerRecord(), this.getContainerData()])
        },
        //获取当前容器下组盘记录
        getContainerRecord() {
            this.kwbhAllowed = false
            //每次查询置空材料列表
            this.singlist = [];
            if (this.warehouse.containerCode == '') {
                return
            }
            getContainerRecord({
                containerCode: this.warehouse.containerCode
            }).then(res => {
                if (res.code == 200) {
                    this.kwbhAllowed = true
                    if (Array.isArray(res.data) && res.data.length > 0) {
                        if (res.data[0].orderNo) {
                            this.putCode = res.data[0].orderNo;
                        }
                        this.warehouse.dutyCycle = res.data[0].dutyCycle; //库存占比 ã€Editby shaocx,2023-05-22】
                        const recordArr = res.data.reduce((curr, item) => {
                            curr.push({
                                code: item.materialCode,
                                batchNo: item.batchNo,
                                quantityNow: item.quantity,
                                quantity: item.quantity,
                                materialName: item.materialName,
                                materialTypeName: item.materialTypeName,
                                specificationModel: item.specificationModel,
                                id: '',
                                unionCode: item.unionCode,
                                replaceMaterialCode: item.replaceMaterialCode,
                                stockFlagStatus: item.stockFlagStatus,
                                show: false,
                                enAbled: 1 //控制数量是否可以输入
                            })
                            return curr
                        }, [])
                        this.singlist.push(...recordArr)
                    }
                } else {
                    this.kwbhAllowed = false
                }
            })
        },
        //获取容器的信息
        getContainerData() {
            getContainDetail(this.warehouse.containerCode).then(res => {
                const result = res.data.rows;
                if (Array.isArray(result) && result.length == 1) {
                    // è™šæ‹Ÿ3个都不显示;料箱:显示栅格;钢托:不显示空间占比
                    if (res.data.rows[0].isVirtual == 0) { //实物
                        if (res.data.rows[0].wareContainerType == '299120688255045' || res.data.rows[0]
                            .wareContainerType == '293486279884869') { // é’¢åˆ¶å®¹å™¨ å¡‘料容器 -显示占比
                            this.detailableZb = true;
                            this.detailable = false;
                        } else { //料箱 - æ˜¾ç¤ºæ …格数
                            this.detailableZb = false;
                            this.detailable = true;
                        }
                    } else {
                        this.detailable = false;
                        this.detailableZb = false;
                    }
                    this.warehouse.gridNumber = res.data.rows[0].gridNumber;
                    this.warehouse.useNumber = res.data.rows[0].useNumber;
                } else {
                    uni.showToast({
                        title: '库位不存在',
                        icon: 'none',
                        duration: 2000
                    });
                    this.kwbhAllowed = false
                }
            })
        },
        //物料编码点击
        materialClick() {
            uni.scanCode({
                scanType: ['barCode', 'qrCode'],
                autoDecodeCharset: true,
                success: (res) => {
                    this.warehouse.materialCode = getAttrValue(res.result, 'PARTSNUMBER')
                    this.batchNo = getAttrValue(res.result, 'LOTNO')
                    this.getMaterialDetails()
                },
                fail: (err) => {
                    this.rescode = 400
                    this.resmessage = `扫描失败${err}`
                    this.$refs.resmodal.show = true
                }
            })
        },
        //物料查询
        getMaterialDetails(pram) {
            if (!this.warehouse.containerCode) {
                uni.showToast({
                    title: '容器编号不能为空',
                    icon: 'none',
                    duration: 2000
                })
                return
            }
            //扫容器编号 åŠ è½½æ‰€æœ‰ç‰©æ–™
            if (pram == 1) {
                this.singlist = [];
                getBhbMaterialList({
                    'containerCode': this.warehouse.containerCode,
                    'SNCode': this.warehouse.snCode
                }).then((res) => {
                    if (res.code == 200) {
                        if (res.result == null) {
                            this.rescode = 400
                            this.resmessage = '查无数据'
                            this.$refs.resmodal.show = true
                            return
                        } else {
                            if (res.result.length == 0) {
                                console.log("空托")
                                this.singlist = [];
                                return
                            } else {
                                console.log("有料")
                                res.result.forEach((item, index) => {
                                    item.notDelete = 1 //已组盘的物料 ä¸è®¸åˆ é™¤ è¦åŽ»è§£ç»‘é¡µé¢è§£ç»‘
                                })
                                this.singlist = res.result;
                            }
                        }
                    } else {
                        this.resmessage = res.message
                        this.rescode = res.code
                        this.$refs.resmodal.show = true
                    }
                })
            } else {
                //物料查询
                PdaBindListForSNCode({
                    'containerCode': this.warehouse.containerCode,
                    'SNCode': this.warehouse.snCode
                }).then((res) => {
                    if (res.code == 200) {
                        if (res.result == null || !res.result.stockQuanOutput) {
                            this.rescode = 400
                            this.resmessage = '查无数据'
                            this.$refs.resmodal.show = true
                            return
                        } else {
                            // æ ¹æ®id åˆ¤æ–­ç‰©æ–™æ˜¯å¦å­˜åœ¨
                            var item = res.result.stockQuanOutput;
                            //debugger
                            let index = this.singlist.findIndex(v => v.snCode == item.snCode);
                            if (index == -1) {
                                if (!res.result.validateResult && res.result.validateFailReason) {
                                    uni.showModal({
                                        title: '提示',
                                        content: res.result.validateFailReason,
                                        showCancel: true,
                                        cancelColor: '#333333',
                                        success: (res => {
                                            if (res.confirm) {
                                                this.singlist.unshift({
                                                    ...item
                                                })
                                            } else if (res.cancel) {
                                            }
                                        })
                                    });
                                } else {
                                    this.singlist.unshift({
                                        ...item
                                    })
                                }
                            }
                        }
                    } else {
                        this.resmessage = res.message
                        this.rescode = res.code
                        this.$refs.resmodal.show = true
                    }
                })
            }
        },
        //删除详情
        longpress(index, eindex) {
            uni.showModal({
                title: '提示',
                content: '是否确认删除?',
                showCancel: true,
                cancelColor: '#333333',
                success: (res => {
                    if (res.confirm) {
                        this.singlist[index].cardNum = true
                        if (eindex == 0) { //删除
                            if(this.singlist[index].notDelete==1){
                                uni.showToast({
                                    title: '已组盘的物料 ä¸è®¸åˆ é™¤ è¦åŽ»è§£ç»‘é¡µé¢è§£ç»‘',
                                    icon: 'none',
                                    duration: 2000
                                });
                                return
                            }
                            this.singlist.splice(index, 1)
                        } else {
                            this.materlist = this.singlist[index]
                            this.detailshow = true
                        }
                    } else if (res.cancel) {
                    }
                })
            });
        },
        //编辑状态样式
        dc(e) {
            e.cardNum = true
            this.$forceUpdate()
        },
        //卡片选中
        clicki(e) {
            e.cardNum = true
            this.$forceUpdate()
        },
        // å¦‚果打开一个的时候,不需要关闭其他,则无需实现本方法
        open(index) {
            // å…ˆå°†æ­£åœ¨è¢«æ“ä½œçš„swipeAction标记为打开状态,否则由于props的特性限制,
            // åŽŸæœ¬ä¸º'false',再次设置为'false'会无效
            this.singlist[index].cardNum = true;
            this.$forceUpdate()
            this.singlist[index].show = true;
            this.singlist.map((val, idx) => {
                if (index != idx) this.singlist[idx].show = false;
            })
        },
        close(index) {
            this.singlist[index].show = false;
            this.singlist[index].cardNum = false;
            this.$forceUpdate()
        },
        //改变组盘数量
        changeNum(val) {
            val.cardNum = false
            if (!val.quantity) {
                uni.showModal({
                    title: '提示',
                    content: '组盘数量不能为空',
                    showCancel: false
                })
            }
            if (val.quantity < 0) {
                uni.showModal({
                    title: '提示',
                    content: '组盘数量必须大于0',
                    showCancel: false
                })
            }
        },
        //全部取消
        reset() {
            this.singlist = [];
            this.warehouse.containerCode = ''
            this.warehouse.snCode = ''
            this.warehouse.areaCode = ''
            this.warehouse.placeCode = ''
            this.$refs.warehouseRef.resetFields();
            this.$forceUpdate()
            this.kwbhAllowed = false
        },
        //重置页面信息
        rest() {
            this.reset()
        },
        //确认
        submit() {
            this.$refs.warehouseRef.setRules(this.warehouseRules)
            this.$refs.warehouseRef.validate(valid => {
                if (valid) {
                    let arrN1 = this.singlist.findIndex((v) => v.quantity == '' || v.quantity <= 0)
                    if (arrN1 > -1) {
                        uni.showToast({
                            title: '物料数量需要大于0',
                            icon: 'none',
                            duration: 2000
                        });
                        return
                    }
                    //物料详情
                    let matatilDetails = this.singlist;
                    let arrSub = matatilDetails.filter((v) => v.enAbled != 1)
                    //请求参数
                    /// æ ‡è®°
                    /// 1:物料组盘
                    /// 2:容器组盘
                    /// 3:物料解绑
                    /// 4:容器解绑
                    let params = {
                        Flag: 1,
                        ContainerCode: this.warehouse.containerCode,
                        orderDetails: arrSub
                    }
                    uni.showModal({
                        title: '提示',
                        content: '是否确认组盘?',
                        showCancel: true,
                        cancelColor: '#333333',
                        success: (res => {
                            if (res.confirm) {
                                addGroupDisk(params).then(res => {
                                    this.warhouseTph = this.warehouse.containerCode;
                                    this.rescode = res.code;
                                    this.resmessage = res.message || '组盘成功!';
                                    this.$refs.resmodal.show = true;
                                    this.rest();
                                })
                            } else if (res.cancel) {
                            }
                        })
                    });
                }
            })
        },
        // ç§Ÿç›˜ä¸Šæž¶
        goWarhouse() {
            //物料详情
            let matatilDetails = this.singlist;
            let arrSub = matatilDetails.filter((v) => v.enAbled != 1)
            bindputawayConfirm({
                flag:1, //
                "ActionType": 3004, //组盘上架
                "ContainerCode": this.warehouse.containerCode,
                "StorehouseCode": this.warehouse.storehouseCode,
                "areaCode": this.warehouse.areaCode || '',
                "placeCode": this.warehouse.placeCode || '',
                "orderDetails": arrSub
            }).then(res => {
                this.rescode = res.code;
                this.resmessage = res.message || '组盘上架成功!';
                this.$refs.resmodal.show = true;
                this.reset();
            })
            // if(this.warehouse.areaCode==''&&this.warehouse.placeCode){
            //     uni.showToast({
            //         title: '请填写目标库区或目标库位!',
            //         icon: 'none',
            //         duration: 2000
            //     })
            //     return;
            // }
            // if (this.warhouseTph == '') {
            //     uni.showToast({
            //         title: '组盘成功后,可入库!',
            //         icon: 'none',
            //         duration: 2000
            //     })
            //     return
            // }
            // uni.navigateTo({
            //     url: '/pages/putIn/three/three?type=入库单&containerCode=' + this.warhouseTph
            // })
        },
        getVehicleType() {
            getareaTypesList().then((res) => {
                // if (res.data.rows.length == 0) {
                //     this.rescode = 400
                //     this.resmessage = '暂无数据'
                //     this.$refs.resmodal.show = true
                //     return
                // }
                var arr = res.result.items;
                arr.map(item => {
                    item.text = item.areaCode;
                    return item;
                })
                this.wolist = arr
            })
        },
        confirmXl(index) {
            this.warehouse.areaCode = this.wolist[index].areaCode;
            // this.warehouse.ContainerTypeCode =  this.wolist[index].id;
        },
        filterMark(stockFlagStatus) {
            let str = ''
            let arr4 = this.arrD.filter(v => v.value == stockFlagStatus)
            if (arr4.length > 0) {
                str = arr4[0].title
            }
            return str
        },
        //------获取推荐
        containerFocus2() {
            // //debugger
            if (!this.warehouse.areaCode) {
                uni.showToast({
                    title: '请选择目标库区!',
                    icon: 'none',
                    duration: 2000
                });
                return
            }
            getRecommendList({
                'containerCode': this.warehouse.containerCode,
                'areaCode': this.warehouse.areaCode
            }).then(res => {
                this.modalshow2 = true;
                this.containerList = res.result.reduce((curr, item) => {
                    curr.push({
                        text: item.placeCode,
                    })
                    return curr;
                }, [])
            })
        },
        //------获取推荐类型选择
        confirm2(index) {
            this.warehouse.placeCode = this.containerList[index].text;
        },
    }
}
</script>
<style lang="scss" scoped>
.bg_item {
    background: #FFEBCD !important;
}
.inputGray2 {
    line-height: 30px;
    border-top: 10rpx solid transparent;
}
.inputGray {
    border-top: 0rpx solid transparent;
}
.boxList {
    transition: all ease 2s;
    position: fixed;
    bottom: 0;
    left: 0;
    top: 0;
    right: 0;
    width: 100%;
    height: 100%;
    z-index: 999;
    background: rgba(0, 0, 0, 0.6);
    .innerWrap {
        max-height: 50%;
        overflow-y: auto;
        background: white;
        position: absolute;
        bottom: 0;
        left: 0;
        width: 100%;
        ul {
            padding: 0;
            margin: 0;
            li {
                padding: 0;
                margin: 0;
                border-bottom: 1px solid #e4e7ed;
                list-style-type: none;
                display: flex;
                flex-direction: row;
                line-height: 1;
                justify-content: center;
                align-items: center;
                font-size: 13px;
                padding: 14px 0;
                flex-direction: column;
            }
        }
    }
}
</style>
LA24030_LuLiPackageLine_Pda/pages/artificial/artificial.vue2
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,407 @@
<template>
    <view>
        <cu-custom bgColor="bg-white" :isBack="true">
            <block slot="backText">
            </block>
            <block slot="content">人工组盘</block>
        </cu-custom>
        <view class="flex justify-end align-center padding_right30rpx padding_top12rpx">
            <text class="fontSize12rpx"> æ“ä½œäººï¼š{{operator}} </text>
        </view>
        <u-form labelPosition="top" :model="warehouse" ref="warehouseRef">
            <u-row class="border_bottom  padding10" style="background-color: #fff;">
                <u-col span="12">
                    <u-form-item  label="容器编号:" prop="containerCode" required style="font-size: 16px;font-weight: bold;padding: 0;">
                        <u-input v-model.trim="warehouse.containerCode" @focus="warehouse.containerCode = ''"  @blur="containerBlur"  placeholder="请扫码录入" style="font-weight: bolder;margin-left: 15rpx;" class="width padding_left25rpx">
                        </u-input>
                    </u-form-item>
                </u-col>
            </u-row>
            <u-row  class="border_bottom margin_top10rpx padding10" style="background-color: #fff;">
                <u-col span="12">
                    <u-form-item label="物料编号:"  style="font-size: 16px;font-weight: bold;padding: 0 0 10rpx;">
                        <u-input v-model="warehouse.materialCode" ref="materialRef" placeholder="请扫码录入" @focus="warehouse.materialCode = ''"  @blur="getMaterialDetails"  style="font-weight: bolder;margin-left: 15rpx;"
                         class="width padding_left25rpx">
                        </u-input>
                    </u-form-item>
                </u-col>
            </u-row>
        </u-form>
        <modal-code :rescode='rescode' :resmessage='resmessage' ref="resmodal" />
        <view style="margin-bottom: 200rpx;" v-show="singlist.length > 0">
            <view v-for="(item, eindex) in singlist" :key="eindex" style="width: 100vw;display: flex;">
                <u-swipe-action :show="item.show" :index="eindex" @click="longpress"
                 @open="open" @close='close' :options="options" style="margin-bottom: 10rpx;width: 100vw;">
                    <view class="title-wrap fontSize32rpx background_fff" :class="parseInt(item.quantity) > 0 ? 'bg_item' : '' " style="width: 100vw;">
                        <u-row>
                            <u-col span="1">
                                <text class="flex justify-center align-center" style="background-color: #f18202;color: #fff;border-radius: 50vh;width: 20px;height: 20px;">
                                    {{eindex+1}}
                                </text>
                            </u-col>
                            <u-col span="10">
                                <text class="color_f18202">
                                    ç‰©æ–™ç¼–号:{{item.code}}
                                </text>
                            </u-col>
                        </u-row>
                        <u-row style="margin-top: 20rpx;">
                            <u-col span="8">
                                <text class="el_batchNo">
                                    æ‰¹æ¬¡ï¼š{{item.batchNo}}
                                </text>
                            </u-col>
                            <u-col span="4">
                                <input class="border_bottom_f18202 width text-left fontSize32rpx padding_left10rpx" v-model="item.quantity"
                                 type="number"   @blur="changeNum(item)" :min="1" placeholder="请输入组盘数量" />
                                <!-- <text class="el_batchNo">
                                    ç»„盘数量:{{item.quantity}}
                                </text> -->
                            </u-col>
                        </u-row>
                    </view>
                </u-swipe-action>
            </view>
        </view>
        <u-popup v-model="detailshow" border-radius="14" @close="detailshow=false" mode="bottom">
            <view class="pop ">
                <h2 class="text_align_center padding_bottom18 padding15">物料信息</h2>
                <view class="line flex justify-between">
                    <text class="text-gray">物料编号</text>
                    <text>{{materlist.code}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">物料名称</text>
                    <text>{{materlist.name}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">物料类型</text>
                    <text>{{materlist.wareMaterialTypeName}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">物料规格</text>
                    <text>{{materlist.specificationModel}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">长(mm)</text>
                    <text>{{materlist.long}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">宽(mm)</text>
                    <text>{{materlist.width}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">高(mm)</text>
                    <text>{{materlist.high}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">重量(kg)</text>
                    <text>{{materlist.weight}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">单位</text>
                    <text>{{materlist.unit}}</text>
                </view>
            </view>
        </u-popup>
        <button-modal :cleaningShow='true' allTitle='全部取消' cleaningTitle='确认组盘' @allsubmit="reset" @submit='submit'/>
    </view>
</template>
<script>
    import ButtonModal from '../../components/buttonModal.vue'
    import ModalCode from '../../components/ModalCode.vue'
    import {getOrderNo,addGroupDisk,getMaterialList, getContainDetail, getContainerRecord} from '../../api/putIn/artificial.js'
    import {getDate} from '../../utils/dateTime.js'
    import {getAttrValue} from '../../utils/tool.js'
    export default {
        data() {
            return {
                rescode: 0,
                resmessage: "",
                putCode: '', //容器二维码
                detailshow: false,
                operator: '',
                focu: false, //清空按钮隐显
                focuM: false, //物料隐显按钮
                Datetime: getDate(),
                singlist: [], //物料详情
                options: [{
                        text: '详情',
                        style: {
                            backgroundColor: '#fc9f35'
                        }
                    },
                    {
                        text: '删除',
                        style: {
                            backgroundColor: '#fc4b4b'
                        }
                    }
                ],
                materlist: {},
                warehouse: {
                    containerCode: '',
                    materialCode: '',
                },
                batchNo: '', //扫码到的当前物料的批次
                warehouseRules: {
                    containerCode: [{
                        required: true,
                        message: '容器编号不能为空',
                        trigger: 'blur'
                    }],
                    // gridNumber: [{required: true,message: '栅格总数不能为空',trigger: 'blur'}],
                    // exitNumber:[{required: true,message: '本次占用数量不能为空',trigger: 'blur'}],
                    materialCode: [{
                        required: true,
                        message: '物料编号不能为空',
                        trigger: 'blur'
                    }]
                }
            };
        },
        components: {
            ButtonModal,
            ModalCode
        },
        onReady() {
            this.$refs.warehouseRef.setRules(this.warehouseRules)
        },
        mounted() {
            this.operator = JSON.parse(uni.getStorageSync('userInfo')).name
            this.getOrderNo()
        },
        computed: {
            containerCode(){
                return this.warehouse.containerCode
            }
        },
        methods: {
            //容器失焦事件
            containerBlur(){
                Promise.all([this.getContainerRecord(), this.getContainerData()])
            },
            //获取当前容器下组盘记录
            getContainerRecord(){
                if(this.warehouse.containerCode.length < 5) {
                    return
                }
                getContainerRecord({ContainerCode: this.warehouse.containerCode}).then(res => {
                    if(Array.isArray(res.data) && res.data.length > 0) {
                        this.putCode = res.data[0].orderNo;
                        const recordArr = res.data.reduce((curr,item)=>{
                            curr.push({
                                code: item.wareMaterialCode,
                                batchNo:item.batchNo,
                                quantity:item.quantity,
                                show: false
                            })
                            return curr
                        },[])
                        this.singlist.push(...recordArr)
                    }
                })
            },
            //获取容器的信息
            getContainerData() {
                if(this.warehouse.containerCode.length < 5) {
                    return
                }
                getContainDetail(this.warehouse.containerCode).then(res => {
                    const result = res.data.rows;
                    if(!Array.isArray(result) || result.length !== 1) {
                        this.rescode = 400
                        this.resmessage = '容器信息查询失败'
                        this.$refs.resmodal.show = true
                    }
                })
            },
            //入库单号
            getOrderNo() {
                getOrderNo().then((res) => {
                    if (res.code == 200) {
                        this.putCode = res.data
                    } else {
                        this.$refs.resmodal.show = true
                    }
                })
            },
            //物料查询
            getMaterialDetails() {
                if(!this.warehouse.materialCode) {
                    uni.showModal({
                        title: '提示',
                        content: '物料编号不能为空',
                        showCancel: false
                    })
                    return
                }
                if(this.warehouse.materialCode.length > 50) {
                    this.batchNo = getAttrValue(this.warehouse.materialCode,'LOTNO')
                    //扫描的物料是否有批次
                    if(!this.batchNo) {
                        this.rescode = 400
                        this.resmessage = '无批次'
                        this.$refs.resmodal.show = true
                        return
                    }
                    this.warehouse.materialCode = getAttrValue(this.warehouse.materialCode,'PARTSNUMBER')
                    if(this.singlist.length > 0) {
                        //判断当次扫描的物料是否已存在同批次
                        let index = this.singlist.findIndex(item => item.code == this.warehouse.materialCode  && item.batchNo == this.batchNo)
                        //置顶
                        if(index > -1) {
                            this.singlist.unshift(...this.singlist.splice(index,1))
                            return
                        }
                    }
                    if(this.warehouse.materialCode.length > 3) {
                        getMaterialList(this.warehouse.materialCode).then((res) => {
                            if (res.code == 200) {
                                if (res.data.rows.length == 0) {
                                    this.rescode = 400
                                    this.resmessage = '无此物料'
                                    this.$refs.resmodal.show = true
                                    return
                                }else {
                                    res.data.rows.map(item => {
                                        item.batchNo = this.batchNo
                                        item.quantity = ''
                                        item.show = false
                                        return item;
                                    })
                                    this.singlist.unshift(...res.data.rows)
                                }
                            } else {
                                this.resmessage = res.message
                                this.rescode = res.code
                                this.$refs.resmodal.show = true
                            }
                        })
                    }
                }
            },
            //删除详情
            longpress(index, eindex) {
                this.singlist[index].cardNum = true
                if (eindex == 1) {
                    this.singlist.splice(index, 1)
                } else {
                    this.materlist = this.singlist[index]
                    this.detailshow = true
                }
            },
            // å¦‚果打开一个的时候,不需要关闭其他,则无需实现本方法
            open(index) {
                // å…ˆå°†æ­£åœ¨è¢«æ“ä½œçš„swipeAction标记为打开状态,否则由于props的特性限制,
                // åŽŸæœ¬ä¸º'false',再次设置为'false'会无效
                this.singlist[index].show = true;
                this.singlist.map((val, idx) => {
                    if (index != idx) this.singlist[idx].show = false;
                })
            },
            close(index) {
                this.singlist[index].show = false;
                this.singlist[index].cardNum = false;
                this.$forceUpdate()
            },
            //改变组盘数量
            changeNum(val) {
                val.cardNum = false
                if(!val.quantity) {
                    uni.showModal({
                        title: '提示',
                        content: '组盘数量不能为空',
                        showCancel: false
                    })
                }
                if(val.quantity <0) {
                    uni.showModal({
                        title: '提示',
                        content: '组盘数量必须大于0',
                        showCancel: false
                    })
                }
            },
            //全部取消
            reset() {
                this.singlist = [];
                this.$refs.warehouseRef.resetFields();
                this.$forceUpdate()
            },
            //重置页面信息
            rest() {
                this.warehouse.containerCode = ''
                this.warehouse.materialCode = ''
                this.singlist.forEach(item => {
                    item.quantity = ''
                })
                this.singlist = []
                this.getOrderNo()
            },
            //确认
            submit() {
                this.$refs.warehouseRef.validate(valid => {
                    if (valid) {
                        //物料详情
                        let matatilDetails = this.singlist.reduce((curr,item) => {
                            curr.push({
                                createdTime: getDate(),
                                updatedTime: getDate(),
                                createdUserId: JSON.parse(uni.getStorageSync('userInfo')).id,
                                createdUserName: JSON.parse(uni.getStorageSync('userInfo')).name,
                                updatedUserId: JSON.parse(uni.getStorageSync('userInfo')).id,
                                updatedUserName: JSON.parse(uni.getStorageSync('userInfo')).name,
                                wareMaterialCode: item.code,
                                batchNo:item.batchNo,
                                price:item.price,
                                completeQuantity: item.quantity,
                                quantity: item.quantity
                            })
                            return curr;
                        },[])
                        //请求参数
                        let params = {
                            createdTime: getDate(),
                            updatedTime: getDate(),
                            createdUserId: JSON.parse(uni.getStorageSync('userInfo')).id,
                            createdUserName: JSON.parse(uni.getStorageSync('userInfo')).name,
                            updatedUserId: JSON.parse(uni.getStorageSync('userInfo')).id,
                            updatedUserName: JSON.parse(uni.getStorageSync('userInfo')).name,
                            orderNo: this.putCode,
                            orderType: 1,
                            wareContainerCode: this.warehouse.containerCode,
                            gridNumber: 1,
                            useNumber: 0,
                            warehousOrderDetails: matatilDetails
                        }
                        addGroupDisk(params).then(res => {
                            this.rescode = res.code
                            this.resmessage = res.message
                            this.$refs.resmodal.show = true
                            this.rest()
                        })
                    }
                })
            }
        }
    }
</script>
<style lang="scss" scoped>
    .el_batchNo {
        padding: 10rpx 0 10rpx 45rpx;
        color: #808080;
    }
    .bg_item {
           background: #FFEBCD !important;
    }
</style>
LA24030_LuLiPackageLine_Pda/pages/artificial/itemsMertial.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,356 @@
<template>
    <view class="overflow">
        <view class="upWp">
            <cu-custom bgColor="bg-white" :isBack="true">
                <block slot="backText">
                </block>
                <block slot="content">空托入库</block>
            </cu-custom>
            <!-- <view class="flex justify-end align-center padding_right30rpx padding_top12rpx">
                æ“ä½œäººï¼š{{operator}}
            </view> -->
            <view class="text-bold width fontSize32rpx" style="padding: 10rpx 10rpx;background-color: #d6d6d6;">
                <view class="flex justify-between align-center">
                    <text class="width23 padding10">入库单号</text>
                    <text>{{warehouse.orderNo}}</text>
                </view>
            </view>
            <u-form labelPosition="top" :model="warehouse" ref="warehouseRef">
                <u-row class="border_bottom margin_top10rpx padding10" style="background-color: #fff;">
                    <u-col span="12">
                        <u-form-item label="容器数量:" prop="warehouse.containerQty" required class="myFormItem">
                            <u-input type="number" v-model="warehouse.containerQty" :focus="focusType" placeholder="请输入容器数量"
                                class="width myInp"  clearable/>
                        </u-form-item>
                    </u-col>
                    <u-col span="12">
                        <u-form-item label="容器编号:" prop="warehouse.wareContain" required class="myFormItem">
                        <!--     <input v-model="warehouse.wareContainerCode" :focus="focusType" placeholder="请选择或扫描容器编号"
                                class="width myInp" > -->
                            <u-input  v-model.trim="warehouse.wareContainerCode" :focus="focusType" placeholder="请选择或扫描容器编号"
                                class="width myInp"  clearable/>
                            <!--     <input v-model="warehouse.wareContainerCode" type="select" @focus="containerFocus"
                                placeholder="请选择容器编号" class="width myInp"> -->
                            <!--     <u-select v-model="modalshow" :list="wolist" @confirm="confirm" value-name="code"
                                label-name="code" ></u-select> -->
                        </u-form-item>
                    </u-col>
                </u-row>
            </u-form>
        </view>
        <view class="wolistWp" v-show="modalshow" :style="{height: mtHeight+'px'}">
            <view :key="index" v-for="(item,index) in wolistRes" @click="confirm(item.code)">
                <text> {{ item.code}}</text>
            </view>
        </view>
        <modal-code ref="resmodal" :rescode='rescode' :resmessage='resmessage' />
        <button-modal :empTytowerShow='true' class="dowmWp" cleaningTitle="查询" garmenTitle='确认入库' @submit='submit' @reset='rest' />
    </view>
</template>
<script>
    import {
        getDate
    } from '../../../utils/dateTime.js'
    import ModalCode from '../../../components/ModalCode.vue'
    import ButtonModal from '../../../components/buttonModal.vue'
    import {
        trayPutStorage,
        getContainerNumList,
        getOrderNumList,
        containerTypeArr,
        getAllEnums
    } from '@/api/container/index.js'
    import calBoxHt from '@/mixins/calBoxHt.js'
    export default {
        mixins:[calBoxHt],
        data() {
            return {
                mtHeight: 'auto',
                focusType: true,
                rescode: 0,
                resmessage: "",
                focu: true,
                Datetime: getDate(),
                containerTypeArr: [],
                warehouse: { //入库请求参数
                    orderNo: "",
                    containerQty: 1, //空托-默认1
                    containerType: "",
                    wareContainerCode: "", //容器编号
                    createdTime: "",
                    updatedTime: "",
                    createdUserId: "",
                    createdUserName: "",
                    orderStatus: 3,
                    orderType: 13, //空托入库
                    warehousOrderDetails: []
                },
                warehouseRules: {
                    ContainerCode: [{
                        required: true,
                        message: '容器编号不能为空',
                        trigger: 'blur'
                    }],
                    // StorehouseCode: [{
                    //     required: true,
                    //     message: '入库口不能为空',
                    //     trigger: 'blur'
                    // }],
                },
                operator: '', //
                wolist: [],
                wolistRes: [111,2222,33333,33333,33333],
                modalshow: false
            };
        },
        components: {
            ModalCode,
            ButtonModal
        },
        onReady() {
            this.$refs.warehouseRef.setRules(this.warehouseRules)
            this.calBoxHt() //动态计算滚动区域的高度
        },
        mounted() {
            this.operator = JSON.parse(uni.getStorageSync('userInfo')).name
            this.getOrderNum()
            this.getContainerNum()
            this.getAllEnums()
        },
        // æ¨¡ç³ŠæŸ¥è¯¢
        watch: {
            'warehouse.wareContainerCode': {
                immediate: true, //在框的值还没变化时执行如下函数显示出所有的情况
                handler(val) {
                    this.modalshow = true
                    this.wolistRes = this.wolist.filter((p) => {
                        return p.code.indexOf(val.trim()) !== -1
                    })
                }
            }
        },
        methods: {
            // èŽ·å–å…¥åº“å•å·
            getOrderNum() {
                getOrderNumList().then((res) => {
                    if (res.code != 200) {
                        this.rescode = res.code
                        this.resmessage = '暂无数据'
                        this.$refs.resmodal.show = true
                        return
                    }
                    this.warehouse.orderNo = res.data
                })
            },
            // èŽ·å–å®¹å™¨ç¼–å·
            getContainerNum(trayNumber) {
                getContainerNumList().then((res) => {
                    if(res.code==200){
                        if (res.data.length == 0) {
                            this.rescode = res.data.code
                            this.resmessage = '暂无数据'
                            this.$refs.resmodal.show = true
                            return
                        }
                        this.wolist = res.data
                        this.wolistRes = res.data
                        // æ•获操作过程中 è¢«ç©ºå‡ºæ¥çš„容器
                        if(trayNumber&&this.warehouse.wareContainerCode!=''){
                            this.wolistRes = this.wolist.filter((p) => {
                                return p.code.indexOf(this.warehouse.wareContainerCode) !== -1
                            })
                        }
                    }
                })
            },
            // ç¡®è®¤
            submit() {
                if (this.warehouse.orderNo == '' || this.warehouse.orderNo == undefined) {
                    this.getOrderNum()
                    this.$u.toast('稍等,重新获取入库单号');
                    return
                }
                if(this.warehouse.containerQty <= 0){
                    this.$u.toast('请输入容器数量');
                    return
                }
                if(this.warehouse.wareContainerCode == ''){
                        this.$u.toast('容器编号未扫描或未选择');
                    return
                }
                this.$refs.warehouseRef.validate(valid => {
                    if (valid) {
                        var jsonSom = {
                            createdUserId: JSON.parse(uni.getStorageSync('userInfo')).id,
                            createdUserName: JSON.parse(uni.getStorageSync('userInfo')).name,
                            createdTime: this.Datetime,
                            updatedTime: this.Datetime,
                            containerQty: this.warehouse.containerQty
                        }
                        this.warehouse = Object.assign(this.warehouse, jsonSom);
                        this.warehouse.containerType =  '';
                        const arr = this.wolist.filter((item) => item.code == this.warehouse.wareContainerCode)
                        if (arr.length > 0) {
                            let nameTray = arr[0].typeName //塑料容器
                            const arr2 = this.containerTypeArr.filter((item) => item.title == nameTray)
                            if (arr2.length <= 0) {
                                this.$u.toast('对应容器类型找不到');
                                return;
                            }
                            this.warehouse.containerType = arr2[0].value || ''; //"299120688255045"
                        }
                        trayPutStorage(this.warehouse).then((res) => {
                            if (res.code === 200) {
                                this.rescode = res.code
                                this.resmessage = res.message
                                this.$refs.warehouseRef.resetFields()
                                this.warehouse = {
                                    orderNo: "",
                                    containerQty: 1, //空托-默认1
                                    containerType: "",
                                    wareContainerCode: "", //容器编号
                                    createdTime: "",
                                    updatedTime: "",
                                    createdUserId: "",
                                    createdUserName: "",
                                    orderStatus: 3,
                                    orderType: 13, //空托入库
                                    warehousOrderDetails: []
                                }
                                this.focusType = true
                                this.getOrderNum()
                                this.getContainerNum()
                                this.$refs.resmodal.show = true
                            }
                        })
                    }
                })
            },
            // èŽ·å–å¸¸ç”¨å˜é‡ åº”存入vuex
            getAllEnums() {
                getAllEnums().then((res) => {
                    if (res.data.length == 0 || res.data.containerType.length == 0) {
                        this.rescode = res.code
                        this.resmessage = '暂无数据'
                        this.$refs.resmodal.show = true
                        return
                    }
                    this.containerTypeArr = res.data.containerType
                })
            },
            //容器 èšç„¦äº‹ä»¶
            containerFocus() {
                // uni.hideKeyboard()
                // this.modalshow = true
            },
            //选择 å®¹å™¨
            confirm(e) {
                if(e==this.warehouse.wareContainerCode){
                    return
                }
                this.warehouse.wareContainerCode = e
                this.modalshow = false
            },
            //出入库口扫描
            wareScane() {
                uni.scanCode({
                    scanType: ['barCode', 'qrCode'],
                    autoDecodeCharset: true,
                    success: (res) => {
                        this.warehouseRules.StorehouseCode = res.result.trim()
                    },
                    fail: (err) => {
                        this.rescode = 400
                        this.resmessage = `扫描失败${JSON.stringify(err)}`
                        this.$refs.resmodal.show = true
                    }
                })
            },
            //容器扫描
            containerScane() {
                uni.scanCode({
                    scanType: ['barCode', 'qrCode'],
                    autoDecodeCharset: true,
                    success: (res) => {
                        this.warehouse.ContainerCode = res.result
                    },
                    fail: (err) => {
                        this.rescode = 400
                        this.resmessage = `扫描失败${JSON.stringify(err)}`
                        this.$refs.resmodal.show = true
                    }
                })
            },
            //重置
            rest() {
                this.getContainerNum(1)
            },
            _empty(v) {
                let tp = typeof v,
                    rt = false;
                if (tp == "number" && String(v) == "") {
                    rt = true
                } else if (tp == "undefined") {
                    rt = true
                } else if (tp == "object") {
                    if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
                } else if (tp == "string") {
                    if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
                } else if (tp == "function") {
                    rt = false
                }
                return rt
            }
        }
    }
</script>
<style lang="scss">
    .myFormItem {
        font-size: 32rpx;
        font-weight: bold;
        padding: 0;
    }
    .myInp {
        font-weight: bolder;
        margin-left: 30rpx;
        margin-top: 16rpx;
    }
    /deep/.u-drawer__scroll-view {
        border-top: 5px solid #d6d6d6;
    }
    .wolistWp{
        z-index: 999;
        // height: 45vh;
        padding-top: 10px;
        padding-bottom: 20px;
        border-top: 1px solid gray;
        // border-bottom: 1px solid gray;
        overflow: auto;
        text-align: left;
        view{
            display: inline-block;
            border-radius: 3px;
            border: 1px solid orange;
                width: 27.3%;
            text-align: center;
            min-width: 80px;
            padding: 5px ;
            margin: 8px 3%;
            color: #f18202;
            text{
            }
        }
    }
</style>
LA24030_LuLiPackageLine_Pda/pages/borrow/borrow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,443 @@
<template>
    <view class="overflow">
        <cu-custom bgColor="bg-white" :isBack="true">
            <block slot="backText">
            </block>
            <block slot="content">领用单拍照留底</block>
        </cu-custom>
        <view class="flex justify-end align-center padding_right30rpx padding_top12rpx">
            <text class="fontSize12rpx"> æ“ä½œäººï¼š{{operator}} </text>
        </view>
        <modal-code ref="resmodal" :rescode='rescode' :resmessage='resmessage' />
        <view class="">
            <u-form labelPosition="top" :model="warehouse" ref="warehouseRef">
                <u-row class="border_bottom margin_top10rpx padding10" style="background-color: #fff;">
                    <u-col span="10">
                        <u-form-item label="领用单号:" prop="warehouseCode" required
                            style="font-size: 16px;font-weight: bold;padding: 0 0 10rpx;">
                            <input v-model="warehouse.warehouseCode" @focus="focu=true" placeholder="请录入或扫码"
                                @blur="getMaterialDetails" class="width padding_left25rpx"
                                style="font-weight: bolder;margin-left: 30rpx;" />
                            <u-icon v-if="warehouse.warehouseCode && focu" @click="warehouse.warehouseCode=''"
                                name="close-circle-fill" color="#848484"></u-icon>
                        </u-form-item>
                    </u-col>
                    <u-col span="2">
                        <u-icon class="iconfont icon-saoma fontSize60rpx"></u-icon>
                    </u-col>
                </u-row>
            </u-form>
            <scroll-view scroll-y="true" style="height: 67vh;">
                <u-swipe-action :show="item.show" :index="eindex" v-for="(item, eindex) in singlist" :key="eindex"
                    @click="longpredel" @open="open" @close='close' :options="options">
                    <view class="item u-border-bottom">
                        <!-- æ­¤å±‚wrap在此为必写的,否则可能会出现标题定位错误 -->
                        <view class="title-wrap ">
                            <view :key="eindex+'singlist'" :class="item.cardNum?'bd-ffe6c9':item.edit?'clickactive':''"
                                class="fontSize30rpx width margin_auto background_fff padding15 border_radius margin_bottom10rpx relative box_sizing transition">
                                <u-row>
                                    <u-col span="12" class="flex">
                                        <view class="flex justify-center align-center"
                                            style="background-color: #f18202;color: #fff;border-radius: 50vh;width: 20px;height: 20px;">
                                            {{eindex+1}}
                                        </view>
                                        <view class="color_f18202 padding_left10rpx">
                                            {{item.wareMaterialCode}} ({{item.wareMaterialName}}) {{item.barNo}}
                                        </view>
                                    </u-col>
                                </u-row>
                                <u-row>
                                    <u-col span="4">
                                        <view class="" style="padding: 10rpx 0 10rpx 45rpx;color: #808080;">
                                            å¤§ç±»ï¼š{{item.wareMaterialTypeName}}
                                        </view>
                                    </u-col>
                                    <u-col span="4">
                                        <view class="" style="padding: 10rpx 0 10rpx 45rpx;color: #808080;">
                                            å°ç±»ï¼š{{item.wareMaterialSubTypeName}}
                                        </view>
                                    </u-col>
                                    <u-col span="4">
                                        <view class="" style="padding: 10rpx 0 10rpx 45rpx;color: #808080;">
                                            æ•°é‡ï¼š{{item.quantity}}
                                        </view>
                                    </u-col>
                                </u-row>
                            </view>
                        </view>
                    </view>
                </u-swipe-action>
            </scroll-view>
            <u-popup v-model="detailshow" border-radius="14" @close="detailshow=false" mode="bottom" v-if="!printflag">
                <!-- <view class="pop "> -->
                <h2 class="text_align_center padding_bottom18 padding15">物料信息</h2>
                <view class="line flex justify-between">
                    <text class="text-gray">物料编号</text>
                    <text>{{materlist.wareMaterialCode}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">物料大类</text>
                    <text>{{materlist.wareMaterialTypeName}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">物料小类</text>
                    <text>{{materlist.wareMaterialSubTypeName}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">物料规格</text>
                    <text>{{materlist.specificationModel}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">长(mm)</text>
                    <text>{{materlist.long}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">宽(mm)</text>
                    <text>{{materlist.width}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">高(mm)</text>
                    <text>{{materlist.high}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">重量(kg)</text>
                    <text>{{materlist.weight}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">条码</text>
                    <text>{{materlist.barCode}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">单位</text>
                    <text>{{materlist.unit}}</text>
                </view>
                <view class="line flex justify-between">
                    <text class="text-gray">数量</text>
                    <text>{{materlist.quantity}}</text>
                </view>
                <!-- </view> -->
                <!--                 <view class="margin_top140rpx">
                    <button-modal :subShow='true' garmenTitle='打印' @submit='init' @reset='rest' />
                </view> -->
            </u-popup>
            <u-popup v-model="detailshow" border-radius="14" @close="detailshow=false" mode="bottom" v-if="printflag">
                <!-- <view class="pop "> -->
                <h2 class="text_align_center">物料标签</h2>
                <view class="border margin" style="margin-bottom: 0;">
                    <h2 class="text_align_center padding_bottom18 padding15 margin_top10rpx margin_bottom10rpx">
                        {{materlist.wareMaterialCode}}
                    </h2>
                    <view class="margin" style="margin-top: 0;">
                        <table border="1" cellpadding='12' width='100%'
                            style='border-collapse:collapse;color: #515151;'>
                            <tr>
                                <th>物料大类</th>
                                <th>{{materlist.materialTypeName}}</th>
                            </tr>
                            <tr>
                                <th>物料小类</th>
                                <th>{{materlist.wareMaterialSubTypeName}}</th>
                            </tr>
                            <tr>
                                <th>物料规格</th>
                                <th>{{materlist.specificationModel}}</th>
                            </tr>
                        </table>
                        <tki-barcode ref="barcode" onval :val="code" :load-make="true" :opations="barOpations" />
                    </view>
                </view>
            </u-popup>
            <!--     <view
                class="width fixed bottom140 margin_auto background_fff padding15 border_radius margin_bottom10rpx relative box_sizing transition">
                <u-upload :action="action" :before-upload="beforeUpload" upload-text="领用单照片" :file-list="fileList1"
                    @on-success="successPic" @on-remove="remove">
                </u-upload>
            </view> -->
            <view
                class="width fixed bottom140 margin_auto background_fff padding15 border_radius margin_bottom10rpx relative box_sizing transition">
                <view class="" style="width: 250rpx;height: 250rpx;border: 1px dashed #aaaaaa;position: relative;">
                    <image :src="image" mode="" @click="imgClick(image)" style="width: 100%;height: 100%;"></image>
                </view>
                <u-icon @click="delimage" name='close-circle-fill' color='red' size='60' v-if="image!==''"
                    style='position: absolute;left:200rpx;top: 20rpx;'></u-icon>
                <view class="" style="color: #aaaaaa;" v-if="image==''">
                    <u-icon name="plus" @click='upload' size='48' style='position: absolute;left: 120rpx;top: 100rpx;'>
                    </u-icon>
                    <text class="fontSize32rpx" style="position: absolute;left: 85rpx;top: 160rpx;">选择图片</text>
                </view>
            </view>
            <button-modal :issueShow='true' issueTitle="打印" subTitle='提交' restTiltle='重置' @reset='reset'
                @submit='submit' />
        </view>
    </view>
</template>
<script>
    import ButtonModal from '@/components/buttonModal.vue'
    import ModalCode from '@/components/ModalCode.vue'
    import tkiBarcode from '@/components/tki-barcode/tki-barcode'
    import {
        pathToBase64
    } from 'image-tools'
    import {
        query,
        updateHead
    } from '@/api/borrow/borrow.js'
    export default {
        data() {
            return {
                detailshow: false,
                rescode: 0,
                resmessage: "",
                current: 0, //滑块默认值
                printNum: "", //打印数量
                focu: false,
                printflag: false, //打印/物料信息,true为物料信息
                fileList: [],
                fileList1: [], //上传图片列表
                lastlist: [],
                overlist: [], //收货列表
                lacklist: [], //缺料列表
                flag: true,
                action: this.$myHOST + '/sysFileInfo/uploadImages',
                singlist: [
                    //     {
                    //     "id": 0,
                    //     "deliverDate": "string",
                    //     "wareMaterialCode": "string",
                    //     "name": "string",
                    //     "describe": "string",
                    //     "category": "string",
                    //     "materialTypeId": "string",
                    //     "materialTypeName": "string",
                    //     "specificationModel": "string",
                    //     "long": "string",
                    //     "width": "string",
                    //     "high": "string",
                    //     "weight": "string",
                    //     "purchaseNo": "string",
                    //     "barCode": "string",
                    //     "surplusQuantity": 11,
                    //     "unit": "string",
                    //     "basicExpressInfoCode": "string",
                    //     "basicExpressInfoName": "string",
                    //     "deliveryQuantity": "string",
                    //     "goodsQuantity": "string",
                    //     "deliveryNo": "string"
                    // },
                ], //物料详情
                base: '',
                image: '',
                lists: [{
                    name: '收货(50)'
                }, {
                    name: '缺料'
                }],
                list: [],
                arr: [],
                materlist: {}, //物料详情数据
                warehouse: {
                    warehouseCode: ''
                },
                warehouseRules: {
                    warehouseCode: [{
                        required: true,
                        message: '领用单号不能为空',
                        trigger: 'blur'
                    }]
                },
                options: [{
                    text: '详情',
                    style: {
                        backgroundColor: '#fc9f35'
                    }
                }],
                operator: '',
                QuantityTotal: '', //送货总数
                uncollectedTotal: '', //收货总数
                lackTotal: '', //缺货总数
                code: '',
                barOpations: {
                    width: 1.8,
                    height: 120,
                    fontSize: 24,
                    fontColor: "#000000",
                    displayValue: true,
                    textAlign: "center",
                    textPosition: "bottom",
                    textMargin: 5,
                    background: "#FFFFFF",
                    margin: 5
                }
            };
        },
        components: {
            ButtonModal,
            ModalCode,
            tkiBarcode
        },
        onReady() {
            this.$refs.warehouseRef.setRules(this.warehouseRules)
        },
        mounted() {
            this.operator = JSON.parse(uni.getStorageSync('userInfo')).name
        },
        methods: {
            init() {
                // this.tomy()
                this.printflag = true
                this.code = this.materlist.wareMaterialCode // ç”Ÿæˆä¸€ç»´ç å’ŒäºŒç»´ç 
            },
            upload() {
                uni.chooseImage({
                    sourceType: ["camera", "album"],
                    sizeType: "original",
                    count: 1,
                    success: (res) => {
                        pathToBase64(res.tempFilePaths[0]).then(base64 => {
                            this.image = res.tempFilePaths[0]
                            this.base=JSON.stringify(base64)
                            uni.uploadFile({
                                url: this.action,
                                filePath: res.tempFilePaths[0],
                                formData: {
                                    'images': JSON.stringify(base64)
                                },
                                success: (res) => {
                                    var str = JSON.parse(res.data)
                                }
                            })
                        })
                    }
                })
            },
            delimage() {
                this.image = ''
                this.$u.toast('移除成功')
            },
            imgClick(url) {
                if(this.image!==''){
                    var imgArr = [];
                    imgArr.push(url)
                    //预览图片
                    uni.previewImage({
                        urls: imgArr,
                        current: imgArr[0]
                    });
                }
            },
            //编辑状态样式
            dc(e) {
                e.cardNum = true
                this.$forceUpdate()
            },
            //物料查询
            getMaterialDetails() {
                this.$refs.warehouseRef.validate(valid => {
                    if (valid) {
                        setTimeout(() => {
                            this.focu = false
                            if (this.warehouse.warehouseCode !== '') {
                                query(this.warehouse.warehouseCode).then((res) => {
                                    if (res.code == 200) {
                                        this.singlist = res.data.rows
                                        if (res.data.rows.length == 0) {
                                            this.resmessage = '暂无数据'
                                            this.rescode = 400
                                            this.$refs.resmodal.show = true
                                        }
                                    } else {
                                        this.resmessage = res.message
                                        this.rescode = res.code
                                        this.$refs.resmodal.show = true
                                    }
                                })
                            }
                        }, 200)
                    }
                })
            },
            //删除详情
            longpredel(index, eindex) {
                this.singlist[index].cardNum = true
                this.printflag = false
                if (eindex == 1) {
                    this.singlist.splice(index, 1)
                } else {
                    this.materlist = this.singlist[index]
                    this.detailshow = true
                }
            },
            //卡片选中
            click(e) {
                e.cardNum = true
                this.$forceUpdate()
            },
            // å¦‚果打开一个的时候,不需要关闭其他,则无需实现本方法
            open(index) {
                // å…ˆå°†æ­£åœ¨è¢«æ“ä½œçš„swipeAction标记为打开状态,否则由于props的特性限制,
                // åŽŸæœ¬ä¸º'false',再次设置为'false'会无效
                this.singlist[index].cardNum = true;
                this.singlist[index].show = true;
                this.singlist.map((val, idx) => {
                    if (index != idx) this.singlist[idx].show = false;
                })
                this.$forceUpdate()
            },
            close(index) {
                this.singlist[index].show = false;
                this.singlist[index].cardNum = false;
                this.$forceUpdate()
            },
            // successPic(data, index, lists, name) {
            //     this.fileList.push(data.data)
            // },
            // //删除图片
            // remove(index, lists, name) {
            //     this.fileList.splice(index, 1)
            // },
            //确认收货
            submit() {
                let params = {
                    id: this.singlist[0].ordersId,
                    // remarks: this.fileList.toString()
                    remarks:this.base
                }
                updateHead(params).then((res) => {
                    this.rescode = res.code
                    this.resmessage = res.message
                    this.$refs.resmodal.show = true
                    if (res.code == 200) {
                        this.reset()
                    }
                })
            },
            //清楚选中
            reset() {
                this.singlist = []
                this.warehouse.warehouseCode = ''
                this.fileList = []
                this.fileList1 = []
            },
            //打印
            onPrint() {
                let _this = this
                if (!uni.getStorageSync("deviceId")) {
                    uni.showToast({
                        title: '请连接打印机',
                        icon: 'error',
                        duration: 2000
                    })
                    return
                }
                this.writeBLECharacteristicValue()
            },
        }
    }
</script>
<style lang="scss">
</style>
LA24030_LuLiPackageLine_Pda/pages/callTray/callTray.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,471 @@
<template>
    <view class="overflow" style="padding-bottom: 150rpx">
        <cu-custom bgColor="bg-white" :isBack="true">
            <block slot="backText">
            </block>
            <block slot="content">容器解绑</block>
        </cu-custom>
        <u-form labelPosition="left" label-width="180rpx" :model="warehouse" ref="warehouseRef">
            <u-row class="border_bottom margin_top10rpx padding_left25rpx" style="background-color: #fff;">
                <u-col span="12">
                    <u-form-item label="容器编号:" prop="containerCode" required class="uFormItem">
                        <u-input v-model.trim="warehouse.containerCode" @confirm="getContainerData(1)"
                            :disabled="kwbhAllowed" placeholder="请录入或扫码" class="width" :focus="curFoucus">
                        </u-input>
                    </u-form-item>
                </u-col>
            </u-row>
            <!-- <u-row class="border_bottom margin_top10rpx padding_left25rpx" style="background-color: #fff;"
                v-if="warehouse.containerCode">
                <u-col span="12">
                    <u-form-item label="容器跟踪码:" class="uFormItem">
                        <u-input v-model="warehouse.snCode" ref="materialRef" placeholder="请扫码录入"
                            @focus="warehouse.snCode = ''" @confirm="getContainerData"
                            style="font-weight: bolder;margin-left: 15rpx;" class="width padding_left25rpx">
                        </u-input>
                    </u-form-item>
                </u-col>
            </u-row> -->
        </u-form>
        <!-- åˆ—表 -->
        <view class="margin_top10rpx">
            <u-swipe-action :show="item.show" :index="eindex" v-for="(item, eindex) in singlist" :key="eindex"
                :options="options" @click="longpress" @open="open" @close="close" class="margin_bottom10rpx">
                <view class="item u-border-bottom">
                    <!-- æ­¤å±‚wrap在此为必写的,否则可能会出现标题定位错误 -->
                    <view class="title-wrap">
                        <!--  -->
                        <view :class="item.checked ? 'bg_item' : ''"
                            class="fontSize32rpx width margin_auto background_fff padding10  relative box_sizing transition">
                            <u-row>
                                <u-col span="12" class="flex align-center">
                                    <u-checkbox v-model="item.checked" size="50rpx"></u-checkbox>
                                    <view class="flex justify-center align-center"
                                        style="background-color: #f18202;color: #fff;border-radius: 50vh;width: 40rpx;height: 40rpx;">
                                        {{ eindex + 1 }}
                                    </view>
                                    <text class="color_f18202 padding_left10rpx">
                                        {{ item.containerCode }}
                                    </text>
                                </u-col>
                            </u-row>
                            <u-row>
                                <u-col span="12">
                                    <text class="color_80 padding_left25rpx">
                                        å®¹å™¨è·Ÿè¸ªç ï¼š{{ item.snCode }}
                                    </text>
                                </u-col>
                            </u-row>
                            <u-row>
                                <u-col span="8">
                                    <text class="color_80 padding_left25rpx">
                                        åº“存状态:{{ item.stockStatusName }}
                                    </text>
                                </u-col>
                                <u-col span="4">
                                    <text class="color_80">
                                         æ•°é‡ï¼š{{ item.quantity }}
                                    </text>
                                </u-col>
                            </u-row>
                        </view>
                    </view>
                </view>
            </u-swipe-action>
        </view>
        <modal-code :rescode='rescode' :resmessage='resmessage' ref="resmodal" />
        <u-popup v-model="detailshow" border-radius="14" @close="detailshow = false" mode="bottom">
            <!-- <view class="pop "> -->
            <h2 class="text_align_center padding_bottom18 padding15">物料信息</h2>
            <view class="line flex justify-between">
                <text class="text-gray">物料编号</text>
                <text>{{ this.materlist.materialCode }}</text>
            </view>
            <view class="line flex justify-between">
                <text class="text-gray">物料名称</text>
                <text>{{ this.materlist.materialName }}</text>
            </view>
            <view class="line flex justify-between">
                <text class="text-gray">物料小类</text>
                <text>{{ this.materlist.materialTypeName }}</text>
            </view>
            <view class="line flex justify-between">
                <text class="text-gray">批次</text>
                <text>{{ this.materlist.batchNo }}</text>
            </view>
            <view class="line flex justify-between">
                <text class="text-gray">物料规格</text>
                <text>{{ this.materlist.specificationModel }}</text>
            </view>
            <view class="line flex justify-between">
                <text class="text-gray">数量</text>
                <text>{{ this.materlist.unBindQuantity }}</text>
            </view>
            <!-- </view> -->
            <view class="margin_top140rpx">
                <button-modal :subShow='true' garmenTitle='打印' @submit='init' @reset='rest' />
            </view>
        </u-popup>
        <button-modal :empTytowerShow='true' cleaningTitle="重置" garmenTitle='容器解绑' @submit='submit' @reset='back' />
    </view>
</template>
<script>
import { getContainerMaterial, unbindOrder } from '@/api/putIn/untie.js'
import BluePrint from '@/pages/print/bluePrint.js'
import ButtonModal from '../../components/buttonModal.vue'
import ModalCode from '../../components/ModalCode.vue'
import { getAttrValue } from '@/utils/tool.js'
import { getContainDetail, onlyUpdateDutyCycle } from '../../api/putIn/artificial.js'
import {
    getPutawayStockQuan
} from '../../api/putaway/putaway.js'
export default {
    data() {
        return {
            operator: '',
            warehouse: {
                containerCode: '',
                materialCode: '',
                dutyCycle: '',
                gridNumber: 1,
                useNumber: 0,
                exitNumber: 0
            },
            singlist: [
                // {}
            ], //详情列表
            ordersId: 0, //当前容器绑定的上架单
            rescode: 0,
            resmessage: '',
            options: [{
                text: '打印',
                style: {
                    backgroundColor: '#fc9f35'
                }
            }
            ],
            detailshow: false,
            materlist: {},
            curFoucus: true,
            timer: null,
            timerSm: null,
            detailableZb: false,
            detailable: false,
            gridFocus: false,
            gridable: true,
            kwbhAllowed: false
        }
    },
    components: {
        ButtonModal,
        ModalCode
    },
    onLoad() {
        this.operator = JSON.parse(uni.getStorageSync('userInfo')).name
    },
    watch: {
        containerCode(val) {
            if (!val) {
                this.detailable = false;
                this.detailableZb = false;
                this.warehouse.exitNumber = 0
            }
        }
    },
    methods: {
        // å¦‚果打开一个的时候,不需要关闭其他,则无需实现本方法
        open(index) {
            // å…ˆå°†æ­£åœ¨è¢«æ“ä½œçš„swipeAction标记为打开状态,否则由于props的特性限制,
            // åŽŸæœ¬ä¸º'false',再次设置为'false'会无效
            this.singlist[index].show = true;
            this.singlist.map((val, idx) => {
                if (index != idx) this.singlist[idx].show = false;
            })
        },
        close(index) {
            this.singlist[index].show = false;
        },
        //物料详情
        longpress(index, eindex) {
            this.materlist = this.singlist[index]
            this.detailshow = true
        },
        //标签重新打印
        init() {
            const arr = ['materialCode', 'unBindQuantity'];
            const arrzw = ['物料编号', '本次解绑数量']
            let isAllow = ''
            Object.keys(this.materlist).forEach(item => {
                if (arr.includes(item)) {
                    if (!this.materlist[item]) {
                        isAllow = arr.indexOf(item)
                        // this.rescode = 400
                        // this.resmessage = `${arrzw[isAllow]}为空,不能继续打印`
                        // this.resmessage = `${item}为空,不能继续打印`
                        // this.$refs.resmodal.show = true
                        return
                    }
                }
            })
            if (isAllow != '') {
                this.detailshow = false
                this.rescode = 400
                this.resmessage = `${arrzw[isAllow]}为空,不能继续打印`
                this.$refs.resmodal.show = true
                return
            }
            if (this.materlist.unBindQuantity <= 0 || this.materlist.unBindQuantity > this.materlist.quantity) {
                this.detailshow = false
                this.rescode = 400
                this.resmessage = `数量不符合规范,不能继续打印`
                this.$refs.resmodal.show = true
                return
            }
            if (!this.materlist.specificationModel) {
                this.materlist.specificationModel = ''
            }
            let ptintContext = [
                { type: 'text', x: 0, y: 0, text: '', size: 2, rotate: 0, bold: 0, underline: false, reverse: false },
                { type: 'text', x: 0, y: 0, text: '', size: 2, rotate: 0, bold: 0, underline: false, reverse: false },
                { type: 'text', x: 0, y: 0, text: '', size: 2, rotate: 0, bold: 0, underline: false, reverse: false },
                /* ä»¥ä¸Šç©ºæ•°æ®ï¼Œä¸ºé˜²æ­¢ä¸¢åŒ…时打印不正常 */
                { type: 'line', x1: 3, y1: 3, x2: 565, y2: 3, width: 2 },
                { type: 'line', x1: 3, y1: 3, x2: 3, y2: 345, width: 2 },
                { type: 'line', x1: 3, y1: 345, x2: 565, y2: 345, width: 2 },
                { type: 'line', x1: 565, y1: 345, x2: 565, y2: 3, width: 2 },
                { type: 'text', x: 80, y: 15, text: '牧野汽车装备(武汉)有限公司', size: 3, rotate: 0, bold: 1, underline: false, reverse: false },
                { type: 'line', x1: 3, y1: 60, x2: 565, y2: 60, width: 2 },
                { type: 'text', x: 10, y: 75, text: `物料编号: ${this.materlist.materialCode}`, size: 2, rotate: 0, bold: 1, underline: false, reverse: false },
                { type: 'line', x1: 3, y1: 110, x2: 380, y2: 110, width: 2 },
                { type: 'text', x: 10, y: 125, text: `物料名称: ${this.materlist.materialTypeName || ''}`, size: 2, rotate: 0, bold: 1, underline: false, reverse: false },
                { type: 'line', x1: 3, y1: 160, x2: 380, y2: 160, width: 2 },
                { type: 'text', x: 10, y: 175, text: `批次: ${this.materlist.batchNo}`, size: 2, rotate: 0, bold: 1, underline: false, reverse: false },
                { type: 'line', x1: 3, y1: 210, x2: 565, y2: 210, width: 2 },
                { type: 'line', x1: 380, y1: 60, x2: 380, y2: 210, width: 2 },
                { type: 'qr', x: 410, y: 72, text: `PARTS NUMBER: ${this.materlist.materialCode},SAP: ${this.materlist.sap_Location || ''},BOXNUM: ${this.materlist.boxNo || ''},LOT NO: ${this.materlist.batchNo},QUANTITY: ${this.materlist.unBindQuantity}`, width: 3, level: 1 },
                { type: 'text', x: 10, y: 225, text: `规格型号: ${this.materlist.specificationModel.length > 32 ? this.materlist.specificationModel.substr(0, 32) : this.materlist.specificationModel}`, size: 2, rotate: 0, bold: 1, underline: false, reverse: false },
                { type: 'line', x1: 3, y1: 260, x2: 565, y2: 260, width: 2 },
                { type: 'text', x: 120, y: 290, text: 'MAKINO J(CHINA) CO.LTD', size: 3, rotate: 0, bold: 1, underline: false, reverse: false },
            ]
            console.log(ptintContext)
            BluePrint.print(this.$store, ptintContext).then(() => {
                // å…³é—­å¼¹æ¡† å¹¶æ¢å¤æ»‘动块
                this.detailshow = false
                this.addForm.code = this.materlist.materlist;
                this.addForm.name = this.materlist.materialName;
                this.addForm.batchNo = this.materlist.batchNo;
                this.addForm.specificationModel = this.materlist.specificationModel;
                addPrintRecord(this.addForm).then(res => {
                    console.log(res);
                })
                uni.showToast({
                    title: '打印成功',
                    duration: 2000
                })
            }).catch((err) => {
                // uni.showToast({
                //     title:'打印失败',
                //     duration: 2000
                // })
            })
        },
        materialBlur() {
            clearTimeout(this.timerSm)
            this.timerSm = null
            if (this.warehouse.materialCode == '') {
                return
            }
            this.timer = setTimeout(() => { //多次触发bug å»¶è¿Ÿbug
                //判断当前物料是否在盘点列表中
                const index = this.singlist.findIndex(item => item.materialCode == this.warehouse.materialCode && item.batchNo == lotNo);
                if (index > -1) {
                    this.singlist[index].checked = 1
                    this.singlist.unshift(...this.singlist.splice(index, 1))
                    return
                } else {
                    clearTimeout(this.timer)
                    this.timer = null
                    this.containerBlur()
                }
            }, 100)
        },
        containerBlur() {
            if (this.warehouse.containerCode == '' || this.warehouse.materialCode == '') {
                return
            }
            getContainerMaterial(this.warehouse).then(res => {
                if (res.data == null || res.data.length == 0) {
                    this.rescode = 400
                    this.resmessage = '暂无数据'
                    this.$refs.resmodal.show = true
                    return;
                }
                this.warehouse.dutyCycle = res.data[0].dutyCycle || 0;
                //给所有的材料一个未选中的状态
                res.data.map(item => {
                    item.checked = true,
                        item.unBindQuantity = ''
                })
                this.singlist.unshift(...res.data)
                this.ordersId = res.data[0].ordersId
            })
        },
        //解绑数量失焦事件
        changeNum(option) {
            //判断是否勾选,如果勾选了,就要对数量校验
            if (!option.checked) {
                return
            }
            if (option.unBindQuantity == '') {
                this.rescode = 400
                this.resmessage = '解绑数量不能为空'
                this.$refs.resmodal.show = true
            }
            if (option.unBindQuantity <= 0) {
                this.rescode = 400
                this.resmessage = '解绑数量必须大于0'
                this.$refs.resmodal.show = true
            }
            if (option.unBindQuantity > option.quantity) {
                this.rescode = 400
                this.resmessage = '解绑数量不能大于库存数量'
                this.$refs.resmodal.show = true
            }
            if (this.detailable) {
                let filterHas = this.singlist.filter(item => item.unBindQuantity == Number(item.quantity));
                if (filterHas.length > 0) {
                    this.warehouse.exitNumber = this.warehouse.useNumber - filterHas.length
                }
            }
        },
        //确认解绑
        submit() {
            const filterArr = this.singlist.filter(item => item.checked);
            if (filterArr.length <= 0) {
                this.rescode = 400
                this.resmessage = '请扫码或选择解绑的容器!'
                this.$refs.resmodal.show = true
                return
            }
            //判断选中的里面是否存在解绑的数量不符合规范的
            // const index = filterArr.findIndex(item => item.unBindQuantity == '' || item.unBindQuantity <= 0 || item.unBindQuantity > item.quantity)
            // if (index > -1) {
            //     this.rescode = 400
            //     this.resmessage = '解绑数量不符合要求'
            //     this.$refs.resmodal.show = true
            //     return
            // }
            const warehousOrderDetails = filterArr.reduce((curr, item) => {
                curr.push({
                    ...item
                })
                return curr;
            }, [])
            //Flag请求参数 æ ‡è®°
            /// 1:物料组盘
            /// 2:容器组盘
            /// 3:物料解绑
            /// 4:容器解绑
            const params = {
                flag: 4,
                containerCode: this.warehouse.containerCode,
                orderDetails: warehousOrderDetails
            }
            uni.showModal({
                title: '解绑',
                content: '是否确认解绑?',
                showCancel: true,
                cancelColor: '#333333',
                success: (res => {
                    if (res.confirm) {
                        unbindOrder(params).then(res => {
                            this.rescode = 200
                            this.$refs.resmodal.show = true;
                            this.resmessage = '解绑成功'
                            this.back();
                        })
                    } else if (res.cancel) {
                    }
                })
            });
        },
        rest() {
        },
        //获取容器的信息
        getContainerData(param) {
            if (this.warehouse.containerCode == '') {
                uni.showToast({
                    title: '请扫容器编号',
                    icon: 'none',
                    duration: 2000
                });
                return
            }
            getPutawayStockQuan({
                'containerCode': this.warehouse.containerCode,
                'SNCode': this.warehouse.snCode
            }).then(res => {
                // //debugger
                if (!res.result) {
                    uni.showToast({
                        title: '数据不存在',
                        icon: 'none',
                        duration: 2000
                    });
                    return
                }
                //debugger
                const result = res.result.details;
                if (Array.isArray(result) && result.length == 0) {
                    uni.showToast({
                        title: '数据不存在',
                        icon: 'none',
                        duration: 2000
                    });
                    return
                }
                this.singlist = result;
            })
        },
        //全部取消
        back() {
            this.ordersId = 0;
            this.singlist = [];
            this.$refs.warehouseRef.resetFields();
            this.warehouse.containerCode = ''
        }
    },
    unmounted() {
        if (this.timer) {
            clearTimeout(this.timer)
            this.timer = null
        }
    },
}
</script>
<style lang="scss">
.content {
    height: 500rpx;
    overflow-y: scroll;
    width: 100%;
    padding: 15rpx;
    box-sizing: border-box;
    .content-item {
        padding: 15rpx;
        background-color: #fff;
        margin-bottom: 15rpx;
        border-radius: 8rpx;
        font-size: 32rpx;
    }
}
.bg_item {
    background: #FFEBCD !important;
}
</style>
在上述文件截断后对比
LA24030_LuLiPackageLine_Pda/pages/callTray/callTray2.vue LA24030_LuLiPackageLine_Pda/pages/check/check/check.vue LA24030_LuLiPackageLine_Pda/pages/check/check/index.vue LA24030_LuLiPackageLine_Pda/pages/check/index.vue LA24030_LuLiPackageLine_Pda/pages/check/index2.vue LA24030_LuLiPackageLine_Pda/pages/check/out.vue LA24030_LuLiPackageLine_Pda/pages/check/return.vue LA24030_LuLiPackageLine_Pda/pages/check/square.vue LA24030_LuLiPackageLine_Pda/pages/crossDock/crossDock.vue LA24030_LuLiPackageLine_Pda/pages/deliver/deliver.vue LA24030_LuLiPackageLine_Pda/pages/deliver/deliverDo.vue LA24030_LuLiPackageLine_Pda/pages/expressmail/expressmail.vue LA24030_LuLiPackageLine_Pda/pages/hander/handerIn.vue LA24030_LuLiPackageLine_Pda/pages/hander/handerOut.vue LA24030_LuLiPackageLine_Pda/pages/index/index copy.vue LA24030_LuLiPackageLine_Pda/pages/index/index.vue LA24030_LuLiPackageLine_Pda/pages/login/login.vue LA24030_LuLiPackageLine_Pda/pages/mark/mark.vue LA24030_LuLiPackageLine_Pda/pages/old/index.vue LA24030_LuLiPackageLine_Pda/pages/old/putIn.vue LA24030_LuLiPackageLine_Pda/pages/old/putOut.vue LA24030_LuLiPackageLine_Pda/pages/print/bluePrint.js LA24030_LuLiPackageLine_Pda/pages/print/bluetoothConnection.vue LA24030_LuLiPackageLine_Pda/pages/print/deliver.vue LA24030_LuLiPackageLine_Pda/pages/print/gauge.vue LA24030_LuLiPackageLine_Pda/pages/print/material.vue LA24030_LuLiPackageLine_Pda/pages/print/materialInfo.vue LA24030_LuLiPackageLine_Pda/pages/print/wms copy.vue LA24030_LuLiPackageLine_Pda/pages/print/wms.vue LA24030_LuLiPackageLine_Pda/pages/putIn/artificial/artificial.vue LA24030_LuLiPackageLine_Pda/pages/putIn/empty/empty.vue LA24030_LuLiPackageLine_Pda/pages/putIn/material/material.vue LA24030_LuLiPackageLine_Pda/pages/putIn/plane/plane.vue LA24030_LuLiPackageLine_Pda/pages/putIn/putIn.vue LA24030_LuLiPackageLine_Pda/pages/putIn/three/three.vue LA24030_LuLiPackageLine_Pda/pages/putIn/untie/untie.vue LA24030_LuLiPackageLine_Pda/pages/putOut/putOut.vue LA24030_LuLiPackageLine_Pda/pages/putaway/putaway.vue LA24030_LuLiPackageLine_Pda/pages/receive/receive.vue LA24030_LuLiPackageLine_Pda/pages/recommend/recommend.vue LA24030_LuLiPackageLine_Pda/pages/resume/pickResume.vue LA24030_LuLiPackageLine_Pda/pages/resume/sortResume.vue LA24030_LuLiPackageLine_Pda/pages/resume/yukuResume.vue LA24030_LuLiPackageLine_Pda/pages/scrap/photo.vue LA24030_LuLiPackageLine_Pda/pages/scrap/scrap.vue LA24030_LuLiPackageLine_Pda/pages/sort/index.vue LA24030_LuLiPackageLine_Pda/pages/sort/kittingSort.vue LA24030_LuLiPackageLine_Pda/pages/sort/pickRecord.vue LA24030_LuLiPackageLine_Pda/pages/sort/pickorder.vue LA24030_LuLiPackageLine_Pda/pages/sort/propComp.vue LA24030_LuLiPackageLine_Pda/pages/sort/return.vue LA24030_LuLiPackageLine_Pda/pages/sort/search.vue LA24030_LuLiPackageLine_Pda/pages/sort/sort.vue LA24030_LuLiPackageLine_Pda/pages/sort/sort2.vue LA24030_LuLiPackageLine_Pda/pages/sort/squareSort2.vue LA24030_LuLiPackageLine_Pda/pages/takeMaterial/former/former.vue LA24030_LuLiPackageLine_Pda/pages/takeMaterial/give/give.vue LA24030_LuLiPackageLine_Pda/pages/takeMaterial/noOrder/noOrder.vue LA24030_LuLiPackageLine_Pda/pages/takeMaterial/order/order.vue LA24030_LuLiPackageLine_Pda/pages/takeMaterial/orderpiece/doYueku.vue LA24030_LuLiPackageLine_Pda/pages/takeMaterial/orderpiece/orderpiece.vue LA24030_LuLiPackageLine_Pda/pages/takeMaterial/orderpiece/orderpiecePo.vue LA24030_LuLiPackageLine_Pda/pages/takeMaterial/orderpiece/poYueku.vue LA24030_LuLiPackageLine_Pda/pages/takeMaterial/return/return.vue LA24030_LuLiPackageLine_Pda/pages/takeMaterial/takeMaterial.vue LA24030_LuLiPackageLine_Pda/pages/unpack/plane/plane.vue LA24030_LuLiPackageLine_Pda/pages/unpack/unpack.vue LA24030_LuLiPackageLine_Pda/pages/untie/checkAllMove.vue LA24030_LuLiPackageLine_Pda/pages/untie/localBind.vue LA24030_LuLiPackageLine_Pda/pages/untie/localUnBind.vue LA24030_LuLiPackageLine_Pda/pages/untie/outbound.vue LA24030_LuLiPackageLine_Pda/pages/untie/untie.vue LA24030_LuLiPackageLine_Pda/pages/untie/untie2.vue LA24030_LuLiPackageLine_Pda/pages/untie/untieForMove.vue LA24030_LuLiPackageLine_Pda/pages/wareTool/borrow.vue LA24030_LuLiPackageLine_Pda/pages/wareTool/index.vue LA24030_LuLiPackageLine_Pda/static/index/1.png LA24030_LuLiPackageLine_Pda/static/index/artificial.png LA24030_LuLiPackageLine_Pda/static/index/borrow.png LA24030_LuLiPackageLine_Pda/static/index/callTray.png LA24030_LuLiPackageLine_Pda/static/index/cancel.png LA24030_LuLiPackageLine_Pda/static/index/free.png LA24030_LuLiPackageLine_Pda/static/index/material.png LA24030_LuLiPackageLine_Pda/static/index/ping.png LA24030_LuLiPackageLine_Pda/static/index/putIn.png LA24030_LuLiPackageLine_Pda/static/index/receive.png LA24030_LuLiPackageLine_Pda/static/index/sort.png LA24030_LuLiPackageLine_Pda/static/index/takeMaterial.png LA24030_LuLiPackageLine_Pda/static/index/tou.png LA24030_LuLiPackageLine_Pda/static/index/untie.png LA24030_LuLiPackageLine_Pda/static/index/ware.png LA24030_LuLiPackageLine_Pda/static/lanya.png LA24030_LuLiPackageLine_Pda/static/logo.jpg LA24030_LuLiPackageLine_Pda/static/modal/error.png LA24030_LuLiPackageLine_Pda/static/modal/iconCk.png LA24030_LuLiPackageLine_Pda/static/modal/success.png LA24030_LuLiPackageLine_Pda/store/index.js LA24030_LuLiPackageLine_Pda/store/modules/print.js LA24030_LuLiPackageLine_Pda/store/modules/system.js LA24030_LuLiPackageLine_Pda/store/modules/user.js LA24030_LuLiPackageLine_Pda/store/node_modules.rar LA24030_LuLiPackageLine_Pda/styles/iconfont/iconfont.css LA24030_LuLiPackageLine_Pda/styles/iconfont/iconfont.js LA24030_LuLiPackageLine_Pda/styles/iconfont/iconfont.json LA24030_LuLiPackageLine_Pda/styles/iconfont/svg.js LA24030_LuLiPackageLine_Pda/styles/index.css LA24030_LuLiPackageLine_Pda/styles/main.css LA24030_LuLiPackageLine_Pda/uni.scss LA24030_LuLiPackageLine_Pda/utils/compress.js LA24030_LuLiPackageLine_Pda/utils/dateTime.js LA24030_LuLiPackageLine_Pda/utils/md5.js LA24030_LuLiPackageLine_Pda/utils/mixin.js LA24030_LuLiPackageLine_Pda/utils/print/Blue.js LA24030_LuLiPackageLine_Pda/utils/print/bluetooth.js LA24030_LuLiPackageLine_Pda/utils/print/bluetoothPrinter/bluetoothPrinter.vue LA24030_LuLiPackageLine_Pda/utils/print/commands.js LA24030_LuLiPackageLine_Pda/utils/print/gbk.js LA24030_LuLiPackageLine_Pda/utils/print/printerjobs.js LA24030_LuLiPackageLine_Pda/utils/print/printerutil.js LA24030_LuLiPackageLine_Pda/utils/print/util.js LA24030_LuLiPackageLine_Pda/utils/print/weapp.qrcode.esm.js LA24030_LuLiPackageLine_Pda/utils/request.js LA24030_LuLiPackageLine_Pda/utils/tool.js LA24030_LuLiPackageLine_Pda/utils/utf8ByteToUnicodeStr.js