|
@@ -0,0 +1,178 @@
|
|
|
|
|
+<template>
|
|
|
|
|
+ <z-paging ref="paging" bgColor="#fff" safe-area-inset-bottom scroll-with-animation>
|
|
|
|
|
+ <template #top>
|
|
|
|
|
+ <ut-navbar :title="stepsObject[currentStep].title" :fixed="false" border :breadcrumb="false"></ut-navbar>
|
|
|
|
|
+ <view class="pd-24">
|
|
|
|
|
+ <ut-steps-title :stepsObject="stepsObject"></ut-steps-title>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view class="pd-5 bg-#f7f7f7"></view>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ <view>
|
|
|
|
|
+ <view v-show="currentStep === 'connect'">
|
|
|
|
|
+ <!-- 业务组件链接打印机 -->
|
|
|
|
|
+ <connect-printer :info="stepsObject[currentStep]" @next="nextSteps" @prev="prevSteps" prevStepValue="confirm" nextStepValue="print"></connect-printer>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ <view v-show="currentStep === 'print'">
|
|
|
|
|
+ <!-- 业务组件打印 -->
|
|
|
|
|
+ <!-- 打印写入打印机 -->
|
|
|
|
|
+ <print-wrapper :info="stepsObject[currentStep]" @test="printTest" @prev="prevSteps" prevStepValue="connect"></print-wrapper>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </view>
|
|
|
|
|
+ </z-paging>
|
|
|
|
|
+</template>
|
|
|
|
|
+
|
|
|
|
|
+<script setup lang="ts">
|
|
|
|
|
+import ConnectPrinter from './models/connect-printer.vue';
|
|
|
|
|
+import { tem30x30, tem60x40, tem60x60 } from '../models/print-tem';
|
|
|
|
|
+import PrintWrapper from './models/print-wrapper.vue';
|
|
|
|
|
+import { writeBLECharacteristicSend } from '@/utils/blue-device-services';
|
|
|
|
|
+import jpPrinter from '../models/tspl';
|
|
|
|
|
+const stepsObject = reactive<any>({
|
|
|
|
|
+ check: {
|
|
|
|
|
+ title: '核对信息',
|
|
|
|
|
+ value: 'check',
|
|
|
|
|
+ status: 'completed', // 为开始、进行中、已完成 三种状态分别值为 'not-started'、'in-progress'、'completed'
|
|
|
|
|
+ sort: 0,
|
|
|
|
|
+ },
|
|
|
|
|
+ confirm: {
|
|
|
|
|
+ title: '确认数量',
|
|
|
|
|
+ value: 'confirm',
|
|
|
|
|
+ status: 'completed', // 为开始、进行中、已完成 三种状态分别值为 'not-started'、'in-progress'、'completed'
|
|
|
|
|
+ sort: 1,
|
|
|
|
|
+ },
|
|
|
|
|
+ connect: {
|
|
|
|
|
+ title: '连接打印机',
|
|
|
|
|
+ value: 'connect',
|
|
|
|
|
+ status: 'in-progress', // 为开始、进行中、已完成 三种状态分别值为 'not-started'、'in-progress'、'completed'
|
|
|
|
|
+ sort: 2,
|
|
|
|
|
+ },
|
|
|
|
|
+ print: {
|
|
|
|
|
+ title: '打印',
|
|
|
|
|
+ value: 'print',
|
|
|
|
|
+ status: 'not-started', // 为开始、进行中、已完成 三种状态分别值为 'not-started'、'in-progress'、'completed'
|
|
|
|
|
+ sort: 3,
|
|
|
|
|
+ },
|
|
|
|
|
+});
|
|
|
|
|
+// 打印模式
|
|
|
|
|
+const mode = ref('self'); // 自行打印, 区间打印 值分别为 self, range
|
|
|
|
|
+const currentStep = ref('connect');
|
|
|
|
|
+const paging = ref(null);
|
|
|
|
|
+const isPrinting = ref(false);
|
|
|
|
|
+onLoad((options: any) => {});
|
|
|
|
|
+const nextSteps = (data: any) => {
|
|
|
|
|
+ if (!data.info || !data?.info?.value) return;
|
|
|
|
|
+ stepsObject[data?.info?.value] = {
|
|
|
|
|
+ ...data.info,
|
|
|
|
|
+ };
|
|
|
|
|
+ stepsObject[data?.nextStepValue].status = 'in-progress';
|
|
|
|
|
+ currentStep.value = data?.nextStepValue;
|
|
|
|
|
+};
|
|
|
|
|
+const prevSteps = (data: any) => {
|
|
|
|
|
+ currentStep.value = data?.prevStepValue;
|
|
|
|
|
+};
|
|
|
|
|
+const testList = reactive([
|
|
|
|
|
+ {
|
|
|
|
|
+ pm: '三七',
|
|
|
|
|
+ zl: '20g',
|
|
|
|
|
+ scrq: '2012.09.18',
|
|
|
|
|
+ zzph: 87391273912,
|
|
|
|
|
+ cj: '云南省文山市县中药材有限公司',
|
|
|
|
|
+ zsm: 'QX0000005600000318',
|
|
|
|
|
+ qr: 'https://t.zycpzs.cn/?c=QCCS412507030000101ND'
|
|
|
|
|
+ },
|
|
|
|
|
+]);
|
|
|
|
|
+const printTest = (data: any) => {
|
|
|
|
|
+ // 检查是否正在打印
|
|
|
|
|
+ if (isPrinting.value) {
|
|
|
|
|
+ uni.showToast({ icon: 'none', title: '当前打印任务未完成,请稍后' });
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ // 测试数据
|
|
|
|
|
+ prepareSend(testList, data.printSpec);
|
|
|
|
|
+};
|
|
|
|
|
+// 打印写入
|
|
|
|
|
+const prepareSend = (list: any[], spec: string = '30x30') => {
|
|
|
|
|
+ if (spec == '30x30') {
|
|
|
|
|
+ // 判断idx是否是奇数
|
|
|
|
|
+ writeSend30x30(list);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (spec == '60x40') {
|
|
|
|
|
+ // 40x40
|
|
|
|
|
+ writeSendCommand(list, '60x40', 0)
|
|
|
|
|
+ }
|
|
|
|
|
+ if (spec == '60x60') {
|
|
|
|
|
+ // 30x30
|
|
|
|
|
+ writeSendCommand(list, '60x60', 0)
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+const writeSend30x30 = (list: any[]) => {
|
|
|
|
|
+ // arr两个两个一组,偶数组没有是空
|
|
|
|
|
+ const arr = list.reduce((acc: any, cur: any, idx: number) => {
|
|
|
|
|
+ if (idx % 2 == 0) {
|
|
|
|
|
+ acc.push([cur]);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ acc[acc.length - 1].push(cur);
|
|
|
|
|
+ }
|
|
|
|
|
+ return acc;
|
|
|
|
|
+ }, []);
|
|
|
|
|
+ writeSendCommand(arr, '30x30', 0)
|
|
|
|
|
+};
|
|
|
|
|
+// writeSend
|
|
|
|
|
+const writeSendCommand = async (list: any[], spec: string = '30x30', idx = 0) => {
|
|
|
|
|
+ // 首次调用时设置打印状态为进行中
|
|
|
|
|
+ if (idx === 0) {
|
|
|
|
|
+ isPrinting.value = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ let command = new jpPrinter();
|
|
|
|
|
+ if (spec == '30x30') {
|
|
|
|
|
+ // 判断idx是否是奇数
|
|
|
|
|
+ command.setSize(60, 30);
|
|
|
|
|
+ command.setGap(10);
|
|
|
|
|
+ command.setCls();
|
|
|
|
|
+ command.setDirection(1);
|
|
|
|
|
+ command = tem30x30(command, list[idx]);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (spec == '60x40') {
|
|
|
|
|
+ // 判断idx是否是奇数
|
|
|
|
|
+ command.setSize(60, 40);
|
|
|
|
|
+ command.setGap(10);
|
|
|
|
|
+ command.setCls();
|
|
|
|
|
+ command.setDirection(1);
|
|
|
|
|
+ command = tem60x40(command, list[idx]);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (spec == '60x60') {
|
|
|
|
|
+ // 判断idx是否是奇数
|
|
|
|
|
+ command.setSize(60, 30);
|
|
|
|
|
+ command.setGap(10);
|
|
|
|
|
+ command.setCls();
|
|
|
|
|
+ command.setDirection(1);
|
|
|
|
|
+ command = tem60x60(command, list[idx]);
|
|
|
|
|
+ }
|
|
|
|
|
+ command.setPagePrint()
|
|
|
|
|
+ const device = stepsObject['connect']?.device;
|
|
|
|
|
+ if (!device) {
|
|
|
|
|
+ uni.showToast({ icon: 'none', title: '未连接设备' });
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ console.log(command.getData());
|
|
|
|
|
+
|
|
|
|
|
+ await writeBLECharacteristicSend({
|
|
|
|
|
+ deviceId: device.deviceId,
|
|
|
|
|
+ serviceId: device.serviceId,
|
|
|
|
|
+ characteristicId: device.characteristicId,
|
|
|
|
|
+ uint8Array: command.getData(),
|
|
|
|
|
+ });
|
|
|
|
|
+ if (list.length - 1 > idx) {
|
|
|
|
|
+ writeSendCommand(list, spec, idx + 1)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 打印完成,重置状态
|
|
|
|
|
+ isPrinting.value = false;
|
|
|
|
|
+ uni.showToast({
|
|
|
|
|
+ icon: 'none',
|
|
|
|
|
+ title: '打印完成'
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+// 如果是 30x30
|
|
|
|
|
+</script>
|
|
|
|
|
+<style lang="scss" scoped></style>
|