feat(scanlistener): 添加PDA扫码模块支持广播和键盘输入

添加qs-scanlistener模块,支持通过广播和键盘输入方式获取扫码结果
更新manifest.json添加abiFilters配置
重构easycode.vue使用新的扫码模块替代原生扫码
This commit is contained in:
砂糖
2025-12-25 15:48:21 +08:00
parent fb5dea4dbe
commit 3650d87a34
9 changed files with 639 additions and 147 deletions

View File

@@ -105,6 +105,9 @@
</view>
</view>
</uni-popup>
<!-- <klp-scaner></klp-scaner> -->
<qs-scanlistener ref='pda'></qs-scanlistener>
</view>
</template>
@@ -124,7 +127,6 @@
import {
addPendingAction
} from '@/api/wms/pendingAction.js'
// 导入获取库区详情的接口(需确保接口存在,若接口名不同请调整)
import {
getActualWarehouse
} from '@/api/wms/actualWarehouse.js'
@@ -137,7 +139,8 @@
coilDetail: {},
form: {},
targetWarehouse: null, // 存储选中的目标库区信息
bomDialogShow: false // BOM参数弹窗控制原有功能补充
bomDialogShow: false, // BOM参数弹窗控制原有功能补充
mode: 'pda' // pda或camera
}
},
computed: {
@@ -165,6 +168,28 @@
})
},
scan(mode = 'pda') {
return new Promise((resolve, reject) => {
if (mode == 'camera') {
uni.scanCode({
success(res) {
console.log('扫码成功')
resolve(res.result)
},
fail() {
reject()
}
})
} else if (mode == 'pda') {
this.$refs.pda.open().then(code => {
resolve(code);
}).catch(() => {
reject()
})
}
})
},
async handlePack() {
const content = await this.getQRCodeContent()
let coilId = content.current_coil_id && content.current_coil_id !== 'null' ? content
@@ -181,35 +206,32 @@
})
},
handleSee() {
uni.scanCode({
success(scanRes) {
// 查询真实库区在此处的钢卷
listMaterialCoil({
actualWarehouseId: scanRes.result,
dataType: 1
}).then(res => {
if (res.total == 0) {
uni.showToast({
title: '该库区未发现钢卷',
icon: 'none'
});
return;
}
if (res.rows.length == 1) {
const coilId = res.rows[0].coilId;
uni.navigateTo({
url: '/pages/easycode/editby?coilId=' + coilId
})
} else {
uni.showToast({
title: '数据异常',
icon: 'none'
})
}
})
}
async handleSee() {
const actualWarehouseId = await this.scan()
// 查询真实库区在此处的钢卷
const res = await listMaterialCoil({
actualWarehouseId,
dataType: 1
})
if (res.total == 0) {
uni.showToast({
title: '该库区未发现钢卷',
icon: 'none'
});
return;
}
if (res.rows.length == 1) {
const coilId = res.rows[0].coilId;
uni.navigateTo({
url: '/pages/easycode/editby?coilId=' + coilId
})
} else {
uni.showToast({
title: '数据异常',
icon: 'none'
})
}
},
// 扫码并创建待操作(原有方法不变)
@@ -279,65 +301,55 @@
// 通用扫码获取二维码内容(原有方法不变)
async getQRCodeContent() {
return new Promise((resolve, reject) => {
uni.scanCode({
success: async (res) => {
console.log('=== 开始扫码流程 ===');
console.log('扫码结果:', res.result);
uni.showLoading({
title: '处理中...'
});
this.scan().then(async res => {
uni.showLoading({
title: '处理中...'
});
try {
const qrcodeId = res;
// 1. 通过二维码ID获取二维码详情
console.log('1. 获取二维码详情ID:', qrcodeId);
const qrcodeRes = await getGenerateRecord(qrcodeId);
console.log('二维码响应:', qrcodeRes);
try {
const qrcodeId = res.result;
// 1. 通过二维码ID获取二维码详情
console.log('1. 获取二维码详情ID:', qrcodeId);
const qrcodeRes = await getGenerateRecord(qrcodeId);
console.log('二维码响应:', qrcodeRes);
if (qrcodeRes.code !== 200) {
throw new Error('未找到二维码记录');
}
// 2. 解析二维码的content获取coil_id
const qrcodeRecord = qrcodeRes.data;
console.log('2. 二维码记录:', qrcodeRecord);
// 检查二维码状态0=失效1=有效)
if (qrcodeRecord.status === 0) {
uni.hideLoading();
uni.showModal({
title: '提示',
content: '该二维码已失效,无法创建待操作任务',
showCancel: false
});
return;
}
uni.hideLoading();
const content = JSON.parse(qrcodeRecord.content);
console.log('解析后的内容:', content);
resolve(content)
} catch (err) {
console.error('=== 扫码处理失败 ===');
console.error('错误信息:', err);
console.error('错误堆栈:', err.stack);
uni.hideLoading();
uni.showToast({
title: err.message || '处理失败',
icon: 'none',
duration: 3000
});
reject()
if (qrcodeRes.code !== 200) {
throw new Error('未找到二维码记录');
}
},
fail: (err) => {
// 2. 解析二维码的content获取coil_id
const qrcodeRecord = qrcodeRes.data;
console.log('2. 二维码记录:', qrcodeRecord);
// 检查二维码状态0=失效1=有效)
if (qrcodeRecord.status === 0) {
uni.hideLoading();
uni.showModal({
title: '提示',
content: '该二维码已失效,无法创建待操作任务',
showCancel: false
});
return;
}
uni.hideLoading();
const content = JSON.parse(qrcodeRecord.content);
console.log('解析后的内容:', content);
resolve(content)
} catch (err) {
console.error('=== 扫码处理失败 ===');
console.error('错误信息:', err);
console.error('错误堆栈:', err.stack);
uni.hideLoading();
uni.showToast({
title: '扫码失败,请重试',
icon: 'none'
title: err.message || '处理失败',
icon: 'none',
duration: 3000
});
reject();
reject()
}
});
}).catch(() => {
reject()
})
})
},
@@ -416,7 +428,7 @@
} catch (error) {
console.error('发货失败:', error);
uni.showToast({
title: error.message || '发货失败',
title: error?.message || '发货失败',
icon: 'none'
});
}
@@ -475,7 +487,7 @@
} catch (error) {
uni.hideLoading();
uni.showToast({
title: error.message || '打开移库失败',
title: error?.message || '打开移库失败',
icon: 'none',
duration: 2000
});
@@ -489,17 +501,10 @@
title: '扫码中...'
});
// 扫描库区二维码
const scanRes = await new Promise((resolve, reject) => {
uni.scanCode({
success: resolve,
fail: (err) => {
reject(new Error('扫码取消或失败'));
}
});
});
const scanRes = await this.scan()
uni.hideLoading();
const warehouseQrCode = scanRes.result;
const warehouseQrCode = scanRes;
if (!warehouseQrCode) {
throw new Error('未识别到库区信息');
}
@@ -539,7 +544,7 @@
} catch (error) {
uni.hideLoading();
uni.showToast({
title: error.message || '扫描库区失败',
title: error?.message || '扫描库区失败',
icon: 'none',
duration: 2500
});
@@ -630,7 +635,7 @@
uni.hideLoading();
console.error('移库失败详情:', error);
uni.showToast({
title: error.message || '移库失败,请重试',
title: error?.message || '移库失败,请重试',
icon: 'none',
duration: 3000
});