qq_41295110
2025-07-15 792e1db8c2f15a69469be591d604a270597865d0
添加打印功能
1个文件已修改
370 ■■■■■ 已修改文件
pages/shouliaotongzhi/table_son.vue 370 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/shouliaotongzhi/table_son.vue
@@ -51,13 +51,13 @@
            </view>
            <view class="buttons">
                <button class="btn-b" size="mini" type="default" @tap="getList()">条码生成</button>
                <button class="btn-c" size="mini" type="default" @tap="search">打印</button>
                <button class="btn-c" size="mini" type="default" @tap="searchLabelPrinter()">搜索打印机</button>
            </view>
        </view>
        
        <view style="width: 100%;height: 16rpx;background-color: #e5e5e5;"></view>
        
        <view class="list" v-for="(item,index) in listData" :key="index" @tap="toSon(item)">
        <view class="list" v-for="(item,index) in listData" :key="index">
            <uni-card :title="item.物料代码" :extra="'No. ' + Number(index+1)" style="margin: 10px;">
                <view class="card-detail">
                    <view class="detail">
@@ -73,17 +73,62 @@
                        <text>条码编号:</text>{{item.条码编号}}
                    </view>
                </view>
                <view class="detail" style="text-align: right;"  @tap.stop="labelPrint(item)"><text style="color: orange;">点击打印条码</text></view>
            </uni-card>
        </view>
        
        <view class="over" v-if="listData.length == 0">暂无数据</view>
        <view class="over" v-if="listData.length != 0">已到底</view>
        <!-- 打印机选择列表 -->
        <view v-if="maskShow" class="uni-mask" @tap="maskShow = false">
            <scroll-view class="uni-scroll_box" scroll-y>
                <view class="uni-list-box" v-for="(device, index) in discoveredDevices" :key="index" @tap="connectBT(device)">
                    <view class="uni-list_name">名称:{{ device.name }}</view>
                    <view class="uni-list_item">{{ connectedDeviceId === device.address?'已连接':'未连接' }}</view>
                </view>
            </scroll-view>
        </view>
    </view>
</template>
<script>
    import { getUserInfo } from "@/utils/auth.js";
    import bluetoothTool from '@/plugins/BluetoothTool.js'
    import permission from '@/plugins/permission.js'
    import {
        InputImage
    } from '@psdk/frame-imageb';
    import {
        ConnectedDevice,
        Lifecycle,
        Raw,
        FakeConnectedDevice,
        WriteOptions,
    } from '@psdk/frame-father';
    import {
        CBar,
        CBox,
        CForm,
        CImage,
        CLine,
        CCodeRotation,
        CCodeType,
        CPage,
        CText,
        CFont,
        CBold,
        CRotation,
        CInverse,
        CMag,
        CQRCode,
        CCorrectLevel,
        CSN,
        CStatus,
    } from "@psdk/cpcl";
    import {
        EImage
    } from "@psdk/esc";
    export default {
        data() {
            return {
@@ -107,6 +152,11 @@
                },
                sWhere:'',
                listData:[],
                printItem:'',
                maskShow:false,
                discoveredDevices: [], // 查询到的设备
                connectedDeviceId: ""
            }
        },
        onLoad(e) {
@@ -114,6 +164,31 @@
            this.linterid = e.linterid
            this.HEntryID = e.hsubid
            this.getData()
            //#ifdef APP-PLUS
            // 蓝牙
            bluetoothTool.init({
                listenBTStatusCallback: (state) => {
                    if (state == 'STATE_ON') {
                        console.log(state);
                    }
                },
                discoveryDeviceCallback: this.onDevice,
                discoveryFinishedCallback: function() {
                    console.log("搜索完成");
                },
                readDataCallback: function(dataByteArr) {
                    /* if(that.receiveDataArr.length >= 200) {
                        that.receiveDataArr = [];
                    }
                    that.receiveDataArr.push.apply(that.receiveDataArr, dataByteArr); */
                    console.log("读取完成" + dataByteArr);
                },
                connExceptionCallback: function(e) {
                    console.log(e);
                }
            });
            //#endif
        },
        methods: {
            getData(){
@@ -123,6 +198,7 @@
                    success: (res) => {
                        if(res.data.count == 1){
                            var data = res.data.data
                            console.log(data)
                            this.baseInfo = {
                                HMainID:data[0].linterid,
                                HSubID:data[0].HEntryID,
@@ -132,6 +208,8 @@
                                HMaterName:data[0].物料名称,
                                HMaterModel:data[0].规格型号,
                                HQty:data[0].数量,
                                HSupID:data[0].HSupID,
                                SHdate:data[0].审核日期,
                            }
                        }else{
                            uni.showToast({
@@ -183,6 +261,7 @@
                    success: (res) => {
                        if(res.data.count == 1){
                            this.listData = res.data.data
                            console.log(this.listData)
                        }else{
                            uni.showToast({
                                title:res.data.Message,
@@ -198,7 +277,235 @@
                        })
                    },
                });    
            }
            },
            async checkPermission() { // 授权
                try {
                    let checkResult = await permission.androidPermissionCheck("bluetooth");
                    console.log("检测信息:", checkResult);
                    if (checkResult.code == 1) {
                        let result = checkResult.data;
                        if (result == 1) {
                            console.log("授权成功!");
                        }
                        if (result == 0) {
                            console.log("授权已拒绝!");
                        }
                        if (result == -1) {
                            console.log("您已永久拒绝权限,请在应用设置中手动打开!");
                        }
                    }
                } catch (err) {
                    console.log("授权失败:", err);
                }
            },
            async searchLabelPrinter() {
                // 查找打印机
                var that = this
                // 使用openBluetoothAdapter 接口,免去主动申请权限的麻烦
                uni.openBluetoothAdapter({
                    success: async (res) => {
                        await this.checkPermission();
                        console.log('start discovery devices');
                        this.discoveredDevices = [];
                        console.log(res)
                        bluetoothTool.discoveryNewDevice();
                        this.maskShow = true
                    },
                    fail: async (e) => {
                        console.error(e)
                        switch (e.code) {
                            case "10009":
                                this.showToast("此设备不支持设备搜索功能!");
                                break;
                            default:
                                console.error(e);
                        }
                    }
                })
            },
            onDevice(device) {
                console.log("监听寻找到新设备的事件---------------")
                console.log(device)
                if (typeof device === 'undefined') return;
                if (typeof device.name === 'undefined') return;
                console.log(device.name);
                if (device.name === '') return;
                if (device.name === null) return;
                if (device.name.toUpperCase().endsWith('_BLE') ||
                    device.name.toUpperCase().endsWith('-LE') ||
                    device.name.toUpperCase().endsWith('-BLE')) return;
                const isDuplicate = this.discoveredDevices.find(item => item.address === device.address);
                if (isDuplicate) return;
                this.discoveredDevices.push(device);
            },
            connectBT(device) {
                const vm = this;
                uni.showLoading({
                    title: '连接中'
                });
                bluetoothTool.connDevice(device.address, (result) => {
                    console.log(result)
                    uni.hideLoading()
                    if (result) {
                        //     // console.log(result);
                        bluetoothTool.cancelDiscovery();
                        // console.log(vm.$printer)
                        vm.$printer.init(new FakeConnectedDevice());
                        vm.connectedDeviceId = device.address;
                        uni.showToast({
                            icon: 'none',
                            title: '连接成功'
                        })
                        this.maskShow = false
                    } else {
                        uni.showToast({
                            icon: 'none',
                            title: '连接失败'
                        })
                    }
                });
            },
            stopSearchBT() {
                console.log("停止搜寻附近的蓝牙外围设备---------------")
                bluetoothTool.cancelDiscovery();
            },
            closeBluetooth() {
                console.log("停止蓝牙连接")
                const vm = this;
                if (vm.connectedDeviceId != '') {
                    bluetoothTool.closeBtSocket();
                    vm.connectedDeviceId = "";
                }
            },
            labelPrint(item) {
                // 打印
                this.printItem = item
                // 检查蓝牙连接
                let btStatus = bluetoothTool.getBluetoothStatus()
                if(btStatus != true) {
                    this.showToast("蓝牙连接异常!")
                    return
                }
                // 检查是否连接设备
                let pairedDevices = bluetoothTool.getPairedDevices()
                if(pairedDevices.length < 1) {
                    this.showToast("无设备连接!")
                    return
                }
                // 检查表单项是否有空值
                for (var key in this.hform) {
                    if (this.hform[key] == "") {
                        // todo 提示表单项不能为空
                        this.showToast("表单不能有空值!")
                        return
                    }
                }
                this.printWrite()
            },
            showToast(msg, status = "none") {
                uni.showToast({
                    title: msg,
                    icon: status,
                    duration: 2000
                });
            },
            ///转成安卓有符号的
            uint8ArrayToSignedArray(uint8Array) {
                let signedArray = new Array(uint8Array.length);
                for (let i = 0; i < uint8Array.length; i++) {
                    if (uint8Array[i] >= 128) {
                        signedArray[i] = uint8Array[i] - 256;
                    } else {
                        signedArray[i] = uint8Array[i];
                    }
                }
                return signedArray;
            },
            async printWrite(type = "cpcl") {
                const vm = this;
                console.log("开始打印------------------")
                switch (type) {
                    case "cpcl":
                        await vm.writeCpclModel();
                        break;
                }
            },
            async writeCpclModel() {
                const vm = this;
                try {
                    const cpcl = await vm.$printer.cpcl().clear()
                        .page(new CPage({
                            width: 608,
                            height: 300
                        }))
                        .qrcode(new CQRCode({
                            x: 450,
                            y: 30,
                            width: 5,
                            content: vm.printItem.条码编号,
                            codeRotation: CCodeRotation.ROTATION_0,
                            level: CCorrectLevel.L
                        }))
                        .text(new CText({
                            x: 24,
                            y: 40,
                            content: vm.baseInfo.SHdate?"审核日期: " + vm.baseInfo.SHdate : "审核日期: ",
                            font: CFont.TSS24
                        }))
                        .text(new CText({
                            x: 24,
                            y: 80,
                            content: "物料编码: " + vm.printItem.物料代码,
                            font: CFont.TSS24
                        }))
                        .text(new CText({
                            x: 24,
                            y: 120,
                            content: "物料名称: " + vm.printItem.物料名称,
                            font: CFont.TSS24
                        }))
                        .text(new CText({
                            x: 24,
                            y: 160,
                            content: "规格型号: " + vm.printItem.规格型号,
                            font: CFont.TSS24
                        }))
                        .text(new CText({
                            x: 24,
                            y: 200,
                            content: "物料数量: " + vm.baseInfo.HQty,
                            font: CFont.TSS24
                        }))
                        .text(new CText({
                            x: 24,
                            y: 240,
                            content: "条码数量: " + vm.printItem.数量,
                            font: CFont.TSS24
                        }))
                        .form(new CForm()) //标签纸需要加定位指令
                        .print();
                    console.log(cpcl.command().string());
                    var binary = cpcl.command().binary();
                    await this.sendMessage(Array.from(this.uint8ArrayToSignedArray(binary)));
                } catch (e) {
                    console.error(e);
                    uni.showToast({
                        title: '失败',
                    });
                }
            },
            async sendMessage(cmd) {
                console.log(cmd);
                const result = bluetoothTool.sendByteData(cmd);
                uni.showToast({
                    icon: 'none',
                    title: result ? '发送成功!' : '发送失败...'
                })
            },
        }
    }
</script>
@@ -295,5 +602,60 @@
            }
        }
    }
    .uni-mask {
        position: fixed;
        top: 0;
        left: 0;
        bottom: 0;
        z-index: 9999;
        display: flex;
        align-items: center;
        width: 100%;
        background: rgba(0, 0, 0, 0.6);
        padding: 0 30rpx;
        box-sizing: border-box;
    }
    .uni-scroll_box {
        height: 60%;
        background: #fff;
        border-radius: 20rpx;
    }
    .uni-list-box {
        margin: 0 20rpx;
        padding: 15rpx 0;
        border-bottom: 1px #f5f5f5 solid;
        box-sizing: border-box;
    }
    .uni-list:last-child {
        border: none;
    }
    .uni-list_name {
        font-size: 30rpx;
        color: #333;
    }
    .uni-list_item {
        font-size: 24rpx;
        color: #555;
        line-height: 1.5;
    }
    .operation-zone {
        display: flex;
        justify-content: space-around;
        margin-top: 10rpx;
        .op1 {
            border: 1px solid #41a863;
            color: #41a863;
        }
        .op4 {
            border: 1px solid #da0000;
            color: #da0000;
        }
    }
</style>