<template>
    <view class="print-index">
        <navigator class="device-box row bothSide verCenter" url="/pages/tag/deviceList">
            <view class="row verCenter">
                <text class="iconfont icon-juxing7"></text>
                <text class="t1">连接设备</text>
            </view>
            <view class="row verCenter">
                <template v-if="device_name != ''">
                    <text class="t2 active">{{ device_name }}</text>
                </template>
                <template v-else>
                    <text class="t2">未连接</text>
                </template>
                <text class="iconfont icon-sanjiaoxing2"></text>
            </view>
        </navigator>
        <view class="print-form">
            <view class="box row verCenter">
                <view class="label">打印类型</view>
                <view class="tab row verCenter">
                    <view class="tab-pane row rowCenter verCenter" v-for="(item, index) in items_print_type" :key="index" :class="{ curr: index_print_type == index }" @click="change(index, 'print_type')">{{ item }}</view>
                </view>
            </view>
            <view class="box row verCenter">
                <view class="row verCenter" style="flex:0 0 93%">
                    <view class="label">入仓号</view>
                    <input type="text" v-model="form.erp_order_sn" placeholder-style="font-size:24rpx;color:#404547;" class="uni-input" placeholder="请输入入仓号" />
                </view>
                <text class="scan iconfont icon-juxing6" @click="scanChange()"></text>
            </view>
            <view class="box row verCenter">
                <view class="label">{{ text }}</view>
                <input type="number" v-model="form.label_num" placeholder-style="font-size:24rpx;color:#404547;" class="uni-input" placeholder="请输入" />
            </view>
            <view class="box row verCenter">
                <view class="label">批次</view>
                <view class="pick-box row">
                    <picker @change="bindPickerChangeBatch" :value="form.batch" :range="batchArr" class="picker">
                        <view class="uni-input">{{ batchArr[form.batch] }}</view>
                    </picker>
                </view>
            </view>
            <view class="box row verCenter" v-if="index_print_type == 0">
                <view class="label">卡板数</view>
                <view class="pick-box row">
                    <picker @change="bindPickerChange" :value="numberIndex" :range="numberArr" class="picker">
                        <view class="uni-input">{{ numberArr[numberIndex] }}</view>
                    </picker>
                </view>
            </view>
            <template v-for="(item, index) in numberList" v-if="flag && index_print_type == 0">
                <view class="box row verCenter">
                    <view class="label">第{{ index + 1 }}卡板数量</view>
                    <input type="number" placeholder-style="font-size:24rpx;color:#404547;" class="uni-input" placeholder="请输入数量" @input="onInput($event, index)" />
                </view>
            </template>
        </view>
        <view class="btn row rowCenter verCenter" @click="submit()">提交打印</view>
    </view>
</template>

<script>
import { API } from '@/util/api.js';
import { getPlatform } from '@/util/util.js';
const ToBase64 = require('../../util/base64gb2312.js');

export default {
    data() {
        return {
            print_number: 0,
            serviceId: '',
            deviceId: '',
            device_name: '',
            characteristics: '',
            text: '标签数量',
            index: -1,
            index_erp_order_sn_pre: -1,
            index_print_type: 1,
            items_erp_order_sn_pre: ['A单号', 'B单号', 'D单号'],
            items_print_type: ['卡板', '散箱'],
            traySelectOption: [],
            sendData64: '',
            printLabelData: [],
            print_text: '总箱数',
            platform: '',
            wstyptll_id: '',
            batchArr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
            flag: false,
            numberList: [],
            numberArr: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
            numberIndex: 0,
            form: {
                batch: 0, //批次
                print_type: 2, //打印类型
                erp_order_sn: '', //入仓号
                label_num: '1', //总箱数
                number: 1,
                numbers: []
            }
        };
    },
    onLoad(option) {
        this.platform = getPlatform();

        //停止搜索,节省系统资源
        uni.stopBluetoothDevicesDiscovery({
            success: res => {
                console.log('停止搜索', JSON.stringify(res.errMsg));
            }
        });

        try {
            uni.removeStorageSync('device');
        } catch (e) {
            // error
        }
    },
    onShow() {
        //获取已连接蓝牙设备信息
        const deviceData = uni.getStorageSync('device') || '';
        if (deviceData) {
            this.deviceId = deviceData.deviceId;
            this.serviceId = deviceData.serviceId;
            this.characteristics = deviceData.characteristics;
            this.device_name = deviceData.name;
        } else {
            this.deviceId = '';
            this.device_name = '';
        }
    },
    methods: {
        scanChange() {
            uni.scanCode({
                success: res => {
                    if (res.errMsg == 'scanCode:ok') {
                        this.form.erp_order_sn = res.result;
                    }
                },
                fail: function(res) {
                    uni.showToast({
                        title: '扫码失败',
                        icon: 'error'
                    });
                }
            });
        },
        /**
         * 卡板数监听
         */
        bindPickerChange(e) {
            this.numberIndex = Number(e.detail.value);
            this.form.number = Number(e.target.value) + 1;

            if (this.form.number > 1) {
                this.flag = true;
                this.numberList = [];
                this.form.numbers = [];
                for (var i = 0; i < this.form.number; i++) {
                    if (i < this.form.number - 1) {
                        this.numberList.push(i);
                        this.form.numbers.push({
                            value: ''
                        });
                    }
                }
            } else {
                this.flag = false;
                this.numberList = [];
                this.form.numbers = [];
            }
        },
        /**
         * 批次监听
         */
        bindPickerChangeBatch(e) {
            this.form.batch = e.target.value;
        },
        /**
         * 卡板数量list监听
         */
        onInput(e, index) {
            this.form.numbers[index].value = e.detail.value;
        },
        submit() {
            if (!this.device_name) {
                uni.showModal({
                    title: '提示',
                    content: '请连接蓝牙设备',
                    showCancel: false,
                    confirmText: '关闭',
                    success: function(res) {
                        if (res.confirm) {
                            uni.navigateTo({
                                url: '/pages/tag/deviceList'
                            });
                        } else if (res.cancel) {
                            console.log('用户点击取消');
                        }
                    }
                });
                return false;
            }
            if (!this.form.erp_order_sn) {
                uni.showModal({
                    title: '提示',
                    content: '请输入入仓号',
                    showCancel: false
                });
                return false;
            }

            if (!this.form.label_num) {
                uni.showModal({
                    title: '提示',
                    content: '请输入' + this.text,
                    showCancel: false
                });
                return false;
            }

            if (!/(^[0-9]*$)/.test(this.form.label_num)) {
                uni.showModal({
                    title: '提示',
                    content: this.text + '为纯数字',
                    showCancel: false
                });
                return false;
            }

            if (this.index_print_type == 0 && this.form.number > 1) {
                let label_num = this.form.label_num * 1; //总箱数
                let num = 0;

                if (this.form.numbers.length > 0) {
                    for (let i = 0; i < this.form.numbers.length; i++) {
                        num += this.form.numbers[i].value * 1;
                    }
                }

                if (label_num != num) {
                    uni.showModal({
                        title: '提示',
                        content: '卡板数量总和必须等于总箱数',
                        showCancel: false
                    });
                    return false;
                }
            }

            let params = Object.assign(this.form, {
                is_add: 0
            });
            this.request(API.checkRepeatPrintLabel, 'POST', params, true).then(res => {
                if (res.err_code === 0) {
                    this.printLabelChange();
                } else {
                    uni.showModal({
                        title: '提示',
                        content: res.err_msg,
                        confirmText: '继续打印',
                        success: res => {
                            if (res.confirm) {
                                this.printLabelChange();
                            } else if (res.cancel) {
                                console.log('用户点击取消');
                            }
                        }
                    });
                }
            });
        },
        printLabelChange() {
            this.request(API.printLabel, 'POST', this.form, true).then(res => {
                if (res.err_code === 0) {
                    this.printLabelData = res.data;
                    this.wstyptll_id = res.data[0].wstyptll_id;
                    this.sendDataChange(); //发送数据
                } else {
                    uni.showModal({
                        title: '提示',
                        content: res.err_msg,
                        confirmText: '关闭'
                    });
                }
            });
        },
        /**
         * 向蓝牙发送数据
         */
        sendDataChange() {
            try {
                uni.showLoading({
                    title: '打印中...'
                });
                console.log('第' + this.print_number + '次开始打印start...');
                let data = [];
                if (this.printLabelData.length > 0) {
                    data.push('! 60 200 200 300 1\r\n');
                    data.push('SETMAG 3 4\r\n');
                    data.push('T 7 0 10 20 ' + this.printLabelData[this.print_number].erp_order_sn + '\r\n');
                    data.push('SETMAG 0 0\r\n');
                    if (this.form.print_type == 1) {
                        data.push('T 5 0 10 120  总箱数:' + this.printLabelData[this.print_number].label_num + '箱\r\n');
                    } else {
                        data.push('T 5 0 10 120  箱号:' + this.printLabelData[this.print_number].label_sort + '/' + this.printLabelData[this.print_number].label_num + '\r\n');
                    }
                    data.push('T 8 0 10 180 时间:' + this.printLabelData[this.print_number].create_time_cn + '\r\n');
                    data.push('T 8 0 10 220 仓库代码:' + this.printLabelData[this.print_number].warehouse_code + '\r\n');
                    data.push('T 8 0 10 260 流水号:' + this.printLabelData[this.print_number].wstyptll_id_sn + '\r\n');
                    data.push('SETMAG 4 1' + '\r\n');
                    data.push('T 8 0 350 30 ' + this.printLabelData[this.print_number].batch + '\r\n');
                    data.push('SETMAG 0 0' + '\r\n');
                    data.push('B QR 260 120 M 2 U 8\r\n');
                    data.push('MA,' + this.printLabelData[this.print_number]['box_code'] + '|\r\n');
                    data.push('ENDQR\r\n');
                    data.push('FORM\r\n');
                    data.push('PRINT\r\n');
                }
                console.log(data.join(''));
                this.cutCommand(data.join(''));
            } catch (e) {
                uni.hideLoading();
                uni.showModal({
                    title: '提示',
                    content: '数据异常,请重试',
                    showCancel: false,
                    confirmText: '关闭'
                });
            }
        },
        /**
         * 分批传输数据
         */
        cutCommand: function(data) {
            var packageLength = 10; //安卓不超过10个字节传输
            var sendData64 = [];
            if (this.platform == 'ios') {
                packageLength = 30;
            }
            console.log('package长度:' + packageLength);
            for (let i = 0; i < Math.ceil(data.length / packageLength); i++) {
                sendData64[i] = uni.base64ToArrayBuffer(ToBase64.encode64gb2312(data.substr(i * packageLength, packageLength)));
            }
            this.sendData64 = sendData64;
            console.log(sendData64);
            this.writeBLECharacteristicValue(1);
        },
        /**
         * 写入二进制数据
         */
        writeBLECharacteristicValue(times) {
            var sendData64 = this.sendData64;
            if (sendData64.length >= times) {
                uni.writeBLECharacteristicValue({
                    deviceId: this.deviceId,
                    serviceId: this.serviceId,
                    characteristicId: this.characteristics,
                    value: sendData64[times - 1],
                    success: res => {
                        this.writeBLECharacteristicValue(++times);
                    },
                    fail: res => {
                        uni.hideLoading();
                        uni.showModal({
                            title: '提示',
                            content: '打印失败,请重新进入打印页面',
                            showCancel: false,
                            confirmText: '关闭',
                            success: res => {
                                if (res.confirm) {
                                    this.characteristics = ''; //连接蓝牙信息清空
                                    this.deviceId = ''; //连接蓝牙信息清空
                                    this.device_name = ''; //连接蓝牙信息清空

                                    this.print_number = 0; //打印计数归零
                                    this.printLabelData = []; //打印数据清空
                                    this.sendData64 = ''; //发送蓝牙数据清空

                                    this.delErpOrderSnCodeManage(); //及时作废
                                } else if (res.cancel) {
                                    console.log('用户点击取消');
                                }
                            }
                        });
                    }
                });
            } else {
                this.print_number++;
                console.log('第' + this.print_number + '次传输完成end');
                if (this.print_number < this.printLabelData.length) {
                    this.sendDataChange();
                } else {
                    uni.hideLoading();
                    //重置
                    this.print_number = 0; //打印计数归零
                    this.printLabelData = []; //打印数据清空
                    this.sendData64 = ''; //发送蓝牙数据清空
                    uni.showModal({
                        title: '提示',
                        content: '打印成功,请查看标签打印机',
                        showCancel: false,
                        confirmText: '关闭',
                        success: function(res) {
                            if (res.confirm) {
                                console.log('用户点击确定');
                            } else if (res.cancel) {
                                console.log('用户点击取消');
                            }
                        }
                    });
                }
            }
        },
        delErpOrderSnCodeManage() {
            this.request(API.delWstyptllIdErpOrderSnCodeManage, 'POST', { wstyptll_id: this.wstyptll_id }, false).then(res => {
                if (res.err_code === 0) {
                } else {
                    uni.showModal({
                        title: '提示',
                        content: res.err_msg,
                        showCancel: false,
                        confirmText: '关闭'
                    });
                }
            });
        },
        change(index, type) {
            if (type == 'print_type') {
                //打印类型
                this.index_print_type = index;
                if (index == 0) {
                    this.form.print_type = 1;
                    this.text = '总箱数';
                    this.print_text = '总箱数';
                    this.numberIndex = 0;
                } else if (index == 1) {
                    this.form.print_type = 2;
                    this.text = '标签数量';
                    this.print_text = '箱号';

                    //置空卡板
                    this.flag = false;
                    this.form.number = '';
                    this.form.numbers = [];
                }
            }
        }
    }
};
</script>

<style scoped lang="scss">
@import '../../assets/css/tag/print.scss';
</style>