feat(scanner): 多厂商PDA扫码器兼容方案及扫码功能重构

- 采用策略模式及配置表驱动方式支持多品牌扫码器广播注册
- 实现扫码广播的统一注册和注销管理,支持并发多个扫码广播接收器
- 重构扫码处理逻辑,统一处理扫码结果,支持条码和二维码识别
- 移除原有单一品牌扫码注册,整合商米、新大陆等扫码头支持
- 调整扫码相关页面代码,集成scanMixin,实现扫码广播注册和注销自动化
- 优化扫码结果处理,支持删除模式及整缸扫描状态区分
- 修正多处界面文本格式与代码风格,提高代码一致性和可维护性
- 升级manifest版本号至1.1.3,标记此功能更新
This commit is contained in:
郭鸿轩 2026-01-04 13:57:28 +08:00
parent 9e4be6db92
commit 9272ed0e23
6 changed files with 1262 additions and 1580 deletions

View File

@ -1,143 +1,175 @@
// common/scanMixin.js
// 多厂商PDA扫码器兼容方案 - 策略模式 + 配置表驱动
export default {
data() {
return {
scanReceiver: null,
isPageActive: false
scanReceivers: [], // 支持多个接收器
isPageActive: false,
registeredBrands: [] // 已注册的品牌
}
},
methods: {
// 注册扫码广播(兼容多种设备)
// 扫码器配置表 - 方便扩展新厂商
getScannerConfigs() {
return [
{
brand: 'newland', // 东集
name: '东集',
action: 'com.android.server.scannerservice.broadcast',
dataKey: 'scannerdata',
needSetup: true,
setupAction: 'com.android.scanner.service_settings',
setupParams: {
action_barcode_broadcast: 'com.android.server.scannerservice.broadcast',
key_barcode_broadcast: 'scannerdata',
endchar: 'ENTER'
}
},
{
brand: 'sunmi', // 商米
name: '商米',
action: 'com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED',
dataKey: 'data',
needSetup: false
},
// {
// brand: 'honeywell', // 霍尼韦尔
// name: '霍尼韦尔',
// action: 'com.honeywell.decode.intent.action.EDIT_DATA',
// dataKey: 'data',
// needSetup: false
// },
// {
// brand: 'zebra', // 斑马
// name: '斑马',
// action: 'com.symbol.datawedge.api.RESULT_ACTION',
// dataKey: 'com.symbol.datawedge.data_string',
// needSetup: false
// },
// {
// brand: 'idata', // 盈达聚力
// name: '盈达聚力',
// action: 'android.intent.action.SCANRESULT',
// dataKey: 'value',
// needSetup: false
// },
// {
// brand: 'urovo', // 优博讯
// name: '优博讯',
// action: 'android.intent.ACTION_DECODE_DATA',
// dataKey: 'barcode_string',
// needSetup: false
// }
];
},
// 注册所有扫码广播(推荐方式:同时注册所有厂商)
registerScanBroadcast(scanCallback) {
// #ifdef APP-PLUS
const configs = this.getScannerConfigs();
configs.forEach(config => {
try {
// 先尝试注册商米扫码头
this.registerSunmiBroadcast(scanCallback)
.then(() => {
console.log('商米扫码头注册成功');
})
.catch((error) => {
console.log('商米扫码头注册失败,尝试新大陆扫码头:', error);
// 如果商米扫码头注册失败,尝试新大陆扫码头
this.registerNewlandBroadcast(scanCallback);
});
this.registerSingleBroadcast(config, scanCallback);
this.registeredBrands.push(config.brand);
console.log(`${config.name}扫码广播注册成功`);
} catch (error) {
console.error("注册扫码广播失败:", error);
console.log(`${config.name}扫码广播注册失败:`, error);
}
});
if (this.registeredBrands.length > 0) {
console.log('扫码广播注册完成,已注册厂商:', this.registeredBrands.join(', '));
return true;
}
console.error('所有扫码广播注册均失败');
return false;
// #endif
},
// 注册指定厂商的扫码广播
registerScanBroadcastByBrand(brand, scanCallback) {
// #ifdef APP-PLUS
const configs = this.getScannerConfigs();
const config = configs.find(c => c.brand === brand);
if (!config) {
console.error(`未找到厂商配置: ${brand}`);
return false;
}
try {
this.registerSingleBroadcast(config, scanCallback);
this.registeredBrands.push(config.brand);
console.log(`${config.name}扫码广播注册成功`);
return true;
} catch (error) {
console.error(`${config.name}扫码广播注册失败:`, error);
return false;
}
// #endif
},
// 注册商米扫码头广播接收器
registerSunmiBroadcast(scanCallback) {
return new Promise((resolve, reject) => {
try {
// 单个广播注册的核心方法
registerSingleBroadcast(config, scanCallback) {
const main = plus.android.runtimeMainActivity();
const IntentFilter = plus.android.importClass("android.content.IntentFilter");
const filter = new IntentFilter();
filter.addAction("com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED");
const self = this;
const receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
{
onReceive: (context, intent) => {
console.log('商米扫码广播接收isPageActive:', self.isPageActive);
// 只有当页面活动时才处理广播
if (!self.isPageActive) return;
// 如果需要预配置(如东集)
if (config.needSetup && config.setupAction) {
try {
// 导入 Intent 类以使用其方法
const Intent = plus.android.importClass("android.content.Intent");
const Intent = plus.android.importClass('android.content.Intent');
const setupIntent = new Intent(config.setupAction);
const scanResult = intent.getStringExtra("data");
const sourceBytes = intent.getByteArrayExtra("source_byte");
console.log('商米扫码结果:', scanResult, sourceBytes);
if (scanResult) {
self.handleScanResult(scanResult, scanCallback);
}
} catch (error) {
console.error('处理商米广播数据时出错:', error);
}
}
}
);
// 注册广播接收器
main.registerReceiver(receiver, filter);
this.scanReceiver = receiver;
console.log('商米扫码广播接收器注册成功');
resolve();
} catch (error) {
console.error('注册商米广播接收器失败:', error);
reject(error);
}
Object.keys(config.setupParams || {}).forEach(key => {
setupIntent.putExtra(key, config.setupParams[key]);
});
},
// 注册新大陆扫码头广播接收器
registerNewlandBroadcast(scanCallback) {
try {
const main = plus.android.runtimeMainActivity();
// 先配置扫码枪广播设置
try {
const Intent = plus.android.importClass("android.content.Intent");
const intent = new Intent("com.android.scanner.service_settings");
intent.putExtra(
"action_barcode_broadcast",
"com.android.server.scannerservice.broadcast"
);
intent.putExtra("key_barcode_broadcast", "scannerdata");
main.sendBroadcast(intent);
console.log('新大陆扫码枪广播配置完成');
main.sendBroadcast(setupIntent);
console.log(`${config.name}扫码配置完成`);
} catch (error) {
console.error("配置新大陆扫码枪广播失败:", error);
console.error(`${config.name}扫码配置失败:`, error);
}
}
// 注册广播接收器
const IntentFilter = plus.android.importClass(
"android.content.IntentFilter"
);
const IntentFilter = plus.android.importClass('android.content.IntentFilter');
const filter = new IntentFilter();
filter.addAction("com.android.server.scannerservice.broadcast");
console.log("添加新大陆广播action完成");
filter.addAction(config.action);
const self = this;
const receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
'io.dcloud.feature.internal.reflect.BroadcastReceiver',
{
onReceive: (context, intent) => {
console.log('新大陆扫码广播接收isPageActive:', self.isPageActive);
// 只有当页面活动时才处理广播
console.log(`${config.name}扫码广播接收isPageActive:`, self.isPageActive);
if (!self.isPageActive) return;
try {
// 导入 Intent 类以使用其方法
const Intent = plus.android.importClass("android.content.Intent");
plus.android.importClass('android.content.Intent');
const scanResult = intent.getStringExtra(config.dataKey);
console.log(`${config.name}扫码结果:`, scanResult);
const scanResult = intent.getStringExtra("scannerdata");
console.log("新大陆扫码结果:", scanResult);
if (scanResult) {
self.handleScanResult(scanResult, scanCallback);
}
} catch (error) {
console.error("处理新大陆广播数据时出错:", error);
console.error(`处理${config.name}广播数据出错:`, error);
}
}
},
}
);
// 注册广播接收器
main.registerReceiver(receiver, filter);
this.scanReceiver = receiver;
console.log("新大陆扫码广播注册成功,等待扫码...");
} catch (error) {
console.error("注册新大陆扫码广播失败:", error);
throw error;
}
// 保存接收器引用,用于后续注销
this.scanReceivers.push({
brand: config.brand,
receiver: receiver
});
},
// 处理扫码结果的统一方法
@ -156,18 +188,30 @@ export default {
}
},
// 取消扫码广播监听
// 取消所有扫码广播监听
unregisterScanBroadcast() {
if (this.scanReceiver) {
// #ifdef APP-PLUS
if (this.scanReceivers.length === 0) return;
try {
const main = plus.android.runtimeMainActivity();
main.unregisterReceiver(this.scanReceiver);
this.scanReceiver = null;
console.log("扫码广播注销成功");
this.scanReceivers.forEach(item => {
try {
main.unregisterReceiver(item.receiver);
console.log(`${item.brand}扫码广播注销成功`);
} catch (err) {
console.error("注销扫码广播失败:", err);
console.error(`${item.brand}扫码广播注销失败:`, err);
}
});
this.scanReceivers = [];
this.registeredBrands = [];
console.log('所有扫码广播注销完成');
} catch (err) {
console.error('注销扫码广播失败:', err);
}
// #endif
},
// 通用的商品扫描处理方法

View File

@ -2,8 +2,8 @@
"name" : "浩拓技术",
"appid" : "__UNI__F79F300",
"description" : "浩拓纺织平台",
"versionName" : "1.1.2",
"versionCode" : 112,
"versionName" : "1.1.3",
"versionCode" : 103,
"transformPx" : false,
"app-plus" : {
"optimization" : {

View File

@ -6,31 +6,17 @@
<text class="title" style="width: 200px">日期{{ BillDate }}</text>
</u-form-item>
<u-form-item>
<text class="title" style="width: 200px"
>客户名称{{ CustomerName }}</text
>
<text class="title" style="width: 200px"
> {{ SaleUserName }}</text
>
<text class="title" style="width: 200px">客户名称{{ CustomerName }}</text>
<text class="title" style="width: 200px"> {{ SaleUserName }}</text>
</u-form-item>
<u-form-item>
<text class="title" style="width: 200px"
>仓库名称{{ StoreName }}{{ ToStoreName }}</text
>
<text class="title" style="width: 200px">仓库名称{{ StoreName }}{{ ToStoreName }}</text>
</u-form-item>
<u-form-item>
<text class="title" style="width: 200px"
>备注内容{{ BillRemark }}</text
>
<text class="title" style="width: 200px">备注内容{{ BillRemark }}</text>
</u-form-item>
<u-form-item label-width="130" label="条码资料:">
<input
type="text"
v-model="QRBarCode"
maxlength="-1"
style="width: 170px"
@confirm="SalePickBillDetailScan"
/>
<input type="text" v-model="QRBarCode" maxlength="-1" style="width: 170px" @confirm="SalePickBillDetailScan" />
<checkbox-group @change="handleAllCrockNoChange">
<checkbox :checked="AllCrockNoScanStatus">整缸</checkbox>
</checkbox-group>
@ -41,58 +27,38 @@
</u-form>
<u-form ref="uForm">
<u-form-item>
<text class="title" style="width: 400px"
>成品名称{{ FabricGoodsNo }}{{ FabricGoodsName }}</text
>
<text class="title" style="width: 400px">成品名称{{ FabricGoodsNo }}{{ FabricGoodsName }}</text>
</u-form-item>
<u-form-item>
<text class="title" style="width: 400px"
>色号颜色{{ GoodsCodeNo }}{{ GoodsCodeName }}</text
>
<text class="title" style="width: 400px">色号颜色{{ GoodsCodeNo }}{{ GoodsCodeName }}</text>
</u-form-item>
<u-form-item>
<text class="title" style="width: 200px">成品缸号{{ CrockNo }}</text>
<text class="title" style="width: 200px"
>成品卷号{{ GoodsBillNo }}</text
>
<text class="title" style="width: 200px">成品卷号{{ GoodsBillNo }}</text>
</u-form-item>
<u-form-item>
<text class="title">{{ BillDataMessage }}</text>
</u-form-item>
<u-form-item>
<text class="title" style="width: 130px"
>配布条数{{ BillSumRoll }}</text
>
<text class="title" style="width: 130px">配布条数{{ BillSumRoll }}</text>
<text class="title" style="width: 130px">数量{{ BillSumQty }}</text>
<text class="title" style="width: 120px">米数{{ BillSumMQty }}</text>
</u-form-item>
<u-form-item>
<text class="title" style="width: 130px"
>已配条数{{ BillScanRoll }}</text
>
<text class="title" style="width: 130px">已配条数{{ BillScanRoll }}</text>
<text class="title" style="width: 130px">数量{{ BillScanQty }}</text>
<text class="title" style="width: 120px">米数{{ BillScanMQty }}</text>
</u-form-item>
<view class="submitView">
<u-button
type="primary"
class="submitBtn"
:ripple="true"
:loading="submitLoading"
ripple-bg-color="#909399"
@click="submitBtnFun"
>
<u-button type="primary" class="submitBtn" :ripple="true" :loading="submitLoading" ripple-bg-color="#909399"
@click="submitBtnFun">
{{ pageType ? "保存" : "提交" }}
</u-button>
</view>
</u-form>
<view class="u-demo-area">
<u-toast ref="uToast"></u-toast>
<wyb-table
ref="table"
:headers="headersMaster"
:contents="GoodsDetailList"
/>
<wyb-table ref="table" :headers="headersMaster" :contents="GoodsDetailList" />
</view>
</view>
</template>
@ -105,8 +71,10 @@ import util, {
playErrorAudio,
} from "../../common/util";
import wybTable from "@/components/wyb-table/wyb-table.vue";
import scanMixin from "@/common/scanMixin.js";
let that = "";
export default {
mixins: [scanMixin],
data() {
return {
SaleBillNo: "", //
@ -192,8 +160,7 @@ export default {
],
scanningInput: "", //
lastKeyTime: 0, //
scanReceiver: null,
isPageActive: false, //
// scanReceiver isPageActive scanMixin
};
},
@ -214,14 +181,13 @@ export default {
},
onUnload() {
// #ifdef APP-PLUS
this.isPageActive = false;
// #ifdef APP-PLUS
this.unregisterScanBroadcast();
// #endif
},
onHide() {
//
this.isPageActive = false;
// #ifdef APP-PLUS
this.unregisterScanBroadcast();
@ -229,10 +195,15 @@ export default {
},
onShow() {
//
this.isPageActive = true;
// #ifdef APP-PLUS
this.registerScanBroadcast();
this.registerScanBroadcast((scanResult) => {
console.log("配布单详情-扫码结果:", scanResult);
this.QRBarCode = scanResult;
this.$nextTick(() => {
this.handleScans();
});
});
// #endif
},
@ -412,160 +383,6 @@ export default {
});
},
// 广
registerScanBroadcast() {
try {
//
this.registerSunmiBroadcast()
.then(() => {
console.log('商米扫码头注册成功');
})
.catch((error) => {
console.log('商米扫码头注册失败,尝试新大陆扫码头:', error);
//
this.registerNewlandBroadcast();
});
} catch (error) {
console.error("注册扫码广播失败:", error);
}
},
// 广
registerSunmiBroadcast() {
return new Promise((resolve, reject) => {
try {
const main = plus.android.runtimeMainActivity();
const IntentFilter = plus.android.importClass("android.content.IntentFilter");
const filter = new IntentFilter();
filter.addAction("com.sunmi.scanner.ACTION_DATA_CODE_RECEIVED");
const receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
{
onReceive: (context, intent) => {
console.log('商米扫码广播接收isPageActive:', this.isPageActive);
// 广
if (!this.isPageActive) return;
try {
const scanResult = intent.getStringExtra("data");
const sourceBytes = intent.getByteArrayExtra("source_byte");
console.log('商米扫码结果:', scanResult, sourceBytes);
if (scanResult) {
this.handleScanResult(scanResult);
}
} catch (error) {
console.error('处理商米广播数据时出错:', error);
}
}
}
);
// 广
main.registerReceiver(receiver, filter);
this.scanReceiver = receiver;
console.log('商米扫码广播接收器注册成功');
resolve();
} catch (error) {
console.error('注册商米广播接收器失败:', error);
reject(error);
}
});
},
// 广
registerNewlandBroadcast() {
try {
const main = plus.android.runtimeMainActivity();
// 广
try {
const Intent = plus.android.importClass("android.content.Intent");
const intent = new Intent("com.android.scanner.service_settings");
intent.putExtra(
"action_barcode_broadcast",
"com.android.server.scannerservice.broadcast"
);
intent.putExtra("key_barcode_broadcast", "scannerdata");
main.sendBroadcast(intent);
console.log('新大陆扫码枪广播配置完成');
} catch (error) {
console.error("配置新大陆扫码枪广播失败:", error);
}
// 广
const IntentFilter = plus.android.importClass(
"android.content.IntentFilter"
);
const filter = new IntentFilter();
filter.addAction("com.android.server.scannerservice.broadcast");
console.log("添加新大陆广播action完成");
const receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
{
onReceive: (context, intent) => {
console.log('新大陆扫码广播接收isPageActive:', this.isPageActive);
// 广
if (!this.isPageActive) return;
try {
const scanResult = intent.getStringExtra("scannerdata");
console.log("新大陆扫码结果:", scanResult);
if (scanResult) {
this.handleScanResult(scanResult);
}
} catch (error) {
console.error("处理新大陆广播数据时出错:", error);
}
},
}
);
// 广
main.registerReceiver(receiver, filter);
this.scanReceiver = receiver;
console.log("新大陆扫码广播注册成功,等待扫码...");
} catch (error) {
console.error("注册新大陆扫码广播失败:", error);
throw error;
}
},
//
handleScanResult(scanResult) {
try {
//
let cleanCode = scanResult.replace(/\s+/g, '').replace(/[\r\n]/g, '');
console.log("配布单详情-扫码结果:", cleanCode);
this.QRBarCode = cleanCode;
this.$nextTick(() => {
this.handleScans();
});
} catch (error) {
console.error("处理扫码结果时出错:", error);
}
},
// 广
unregisterScanBroadcast() {
if (this.scanReceiver) {
try {
const main = plus.android.runtimeMainActivity();
main.unregisterReceiver(this.scanReceiver);
this.scanReceiver = null;
console.log("扫码广播注销成功");
} catch (error) {
console.error("注销扫码广播失败:", error);
}
}
},
SalePickBillDetailScan() {
//
this.handleScans();

View File

@ -147,27 +147,35 @@
},
onShow() {
// mixin onShow
if (this.$options.mixins && this.$options.mixins[0] && this.$options.mixins[0].onShow) {
this.$options.mixins[0].onShow.call(this);
}
//
this.isPageActive = true;
// #ifdef APP-PLUS
this.registerScanBroadcast((scanResult) => {
console.log("扫码结果:", scanResult);
//
if(!this.QRBarCode){
console.log("请先扫描资料!", scanResult);
//
this.QRBarCode = scanResult;
this.$nextTick(() => {
this.GoodsCheckBillDetailScan();
});
return;
}
});
// #endif
},
onHide() {
this.isPageActive = false;
// #ifdef APP-PLUS
this.unregisterScanBroadcast();
// #endif
},
onUnload() {
this.isPageActive = false;
// #ifdef APP-PLUS
this.unregisterScanBroadcast();
// #endif
},
methods: {
//
showError(message) {

View File

@ -7,41 +7,24 @@
<u-icon class="ml26" name="arrow-right" size="40" color="#888888"></u-icon>
</view>
</view>
<u-form-item label-width="150" label="调出仓位:"
:class="{'input-highlight': shouldHighlightFrom}"
>
<input type="text"
v-model="FromStoreStationNo"
maxlength="-1"
style="width:100px;"
<u-form-item label-width="150" label="调出仓位:" :class="{ 'input-highlight': shouldHighlightFrom }">
<input type="text" v-model="FromStoreStationNo" maxlength="-1" style="width:100px;"
@confirm="GetFromStoreStationName" />
<text style="width:100px;">{{ FromStoreStationName }}</text>
<checkbox-group @change="AllCrockNoCheckChange">
<checkbox ref="checkBoxRef" :checked="AllCrockNoScanStatus">整缸</checkbox>
</checkbox-group>
</u-form-item>
<u-form-item label-width="150" label="调至仓位:"
:class="{'input-highlight': shouldHighlightTo}"
>
<input type="text"
v-model="ToStoreStationNo"
maxlength="-1"
style="width:100px;"
<u-form-item label-width="150" label="调至仓位:" :class="{ 'input-highlight': shouldHighlightTo }">
<input type="text" v-model="ToStoreStationNo" maxlength="-1" style="width:100px;"
@confirm="GetToStoreStationName" />
<text style="width:100px;">{{ ToStoreStationName }}</text>
<checkbox-group @change="AllStoreStationChange">
<checkbox ref="checkBoxRef" :checked="AllStoreStationScanStatus">整架</checkbox>
</checkbox-group>
</u-form-item>
<u-form-item label-width="150" label="条码资料:"
:class="{'input-highlight': shouldHighlightQR}"
>
<input type="text"
v-model="QRBarCode"
maxlength="-1"
style="width:150px;"
<u-form-item label-width="150" label="条码资料:" :class="{ 'input-highlight': shouldHighlightQR }">
<input type="text" v-model="QRBarCode" maxlength="-1" style="width:150px;"
@confirm="GoodsStoreStationMoveScan" />
</u-form-item>
<u-form-item>
@ -90,7 +73,9 @@
playErrorAudio
} from '../../common/util';
import wybTable from '@/components/wyb-table/wyb-table.vue';
import scanMixin from '@/common/scanMixin.js';
export default {
mixins: [scanMixin],
data() {
return {
borderColor: '#e4e7ed',
@ -130,6 +115,7 @@
StoreNameDataList: [],
GoodsDetailList: [],
BillDataMessage: '',
// scanReceiver isPageActive scanMixin
headersMaster: [{
label: '成品编号',
key: 'product_code'
@ -151,9 +137,7 @@
}, {
label: '数量',
key: 'weight'
}],
scanReceiver: null,
isPageActive: false, //
}]
}
},
onLoad(e) {
@ -167,30 +151,11 @@
this.StoreName = getApp().globalData.StoreName;
};
// #ifdef APP-PLUS
this.isPageActive = true;
this.registerScanBroadcast();
// #endif
/* uni.$on('bjdKehuBindFun', that.bjdKehuBindFun)
uni.$on('chanpinBindFun', that.chanpinBindFun)
uni.$on('bjdLxrBindFun', that.bjdLxrBindFun)
uni.$on('shangjiBindFun', that.shangjiBindFun) */
},
onUnload() {
// #ifdef APP-PLUS
this.isPageActive = false;
// this.unregisterBroadcast();
// 使 scanMixin 广
this.registerScanBroadcast(this.handleScanCode);
// #endif
},
onHide() {
//
this.isPageActive = false;
},
onShow() {
//
this.isPageActive = true;
},
// onUnload, onHide, onShow scanMixin
/* onBackPress() {
uni.$off('bjdKehuBindFun', that.bjdKehuBindFun)
uni.$off('chanpinBindFun', that.chanpinBindFun)
@ -216,6 +181,36 @@
util.playErrorAudio();
},
// -
handleScanCode(scanResult) {
console.log("扫码结果:", scanResult);
if (!this.StoreName) {
this.showError("请先选择仓库名称");
return;
}
if (!this.FromStoreStationNo) {
this.FromStoreStationNo = scanResult;
this.$nextTick(() => {
this.GetFromStoreStationName();
});
return;
} else if (!this.ToStoreStationNo) {
this.ToStoreStationNo = scanResult;
this.$nextTick(() => {
this.GetToStoreStationName();
});
return;
} else {
this.QRBarCode = scanResult;
this.$nextTick(() => {
this.GoodsStoreStationMoveScan();
});
return;
}
},
AllCrockNoCheckChange: function () {
this.AllCrockNoScanStatus = !this.AllCrockNoScanStatus;
this.AllStoreStationScanStatus = false;
@ -257,102 +252,8 @@
/* that.selectType = str; */
},
// 广
registerScanBroadcast() {
try {
const main = plus.android.runtimeMainActivity();
// registerScanBroadcast unregisterScanBroadcast scanMixin
// 广
try {
const Intent = plus.android.importClass("android.content.Intent");
const intent = new Intent("com.android.scanner.service_settings");
intent.putExtra(
"action_barcode_broadcast",
"com.android.server.scannerservice.broadcast"
);
intent.putExtra("key_barcode_broadcast", "scannerdata");
main.sendBroadcast(intent);
} catch (error) {
console.error("配置扫码枪广播失败:", error);
}
// 广
const IntentFilter = plus.android.importClass(
"android.content.IntentFilter"
);
const filter = new IntentFilter();
filter.addAction("com.android.server.scannerservice.broadcast");
console.log("添加广播action完成");
const receiver = plus.android.implements(
"io.dcloud.feature.internal.reflect.BroadcastReceiver",
{
onReceive: (context, intent) => {
// 广
if (!this.isPageActive) return;
try {
console.log("Newland intent:", intent);
const scanResult = intent.getStringExtra("scannerdata");
console.log("配布单详情-扫码结果:", scanResult);
if(!this.StoreName){
this.showError("请先选择仓库名称");
return
}
if (scanResult) {
if(!this.FromStoreStationNo){
this.FromStoreStationNo = scanResult
this.$nextTick(() => {
this.GetFromStoreStationName();
});
return
}else if(!this.ToStoreStationNo){
this.ToStoreStationNo = scanResult;
this.$nextTick(() => {
this.GetToStoreStationName();
});
return
}else if(!this.QRBarCode) {
this.QRBarCode = scanResult;
this.$nextTick(() => {
this.GoodsStoreStationMoveScan();
});
return
}
}
} catch (error) {
this.showError("处理扫码数据时出错");
console.error("处理广播数据时出错:", error, error.stack);
}
},
}
);
// 广
main.registerReceiver(receiver, filter);
this.scanReceiver = receiver;
console.log("扫码广播注册成功,等待扫码...");
} catch (error) {
console.error("注册扫码广播失败:", error);
console.error("错误详情:", error.message);
console.error("错误堆栈:", error.stack);
}
},
// 广
unregisterScanBroadcast() {
if (this.scanReceiver) {
try {
const main = plus.android.runtimeMainActivity();
main.unregisterReceiver(this.scanReceiver);
this.scanReceiver = null;
console.log("扫码广播注销成功");
} catch (error) {
console.error("注销扫码广播失败:", error);
}
}
},
//
showError(message) {
this.playError();
@ -600,13 +501,16 @@
.first {
box-sizing: border-box;
}
.wrap {
width: 100vw;
overflow-x: hidden;
}
.input-highlight {
border: 1px solid #ff0000 !important;
}
page {
background-color: #F8F8F8;
padding-bottom: 260rpx;

View File

@ -3,12 +3,7 @@
<common-navbar title="工作台" :showBack="false">
<template #right>
<view class="scan_box">
<u-icon
name="scan"
color="#333333"
size="46"
@click="handleScan"
></u-icon>
<u-icon name="scan" color="#333333" size="46" @click="handleScan"></u-icon>
</view>
</template>
</common-navbar>
@ -21,10 +16,7 @@
</view>
<view class="grid-text">成品配布</view>
</u-grid-item>
<u-grid-item
:index="1"
@click="navTo('/pages/storegoods/QRBarCodeReview')"
>
<u-grid-item :index="1" @click="navTo('/pages/storegoods/QRBarCodeReview')">
<view class="home-icon icon-color02">
<i class="iconfont icon-mall-bag"></i>
</view>
@ -35,44 +27,31 @@
<view class="workbench-title">成品管理</view>
<view class="toolbar">
<u-grid class="grid" :col="4" :border="false">
<u-grid-item
:index="0"
@click="navTo('/pages/storegoods/dyeworksDyeback')"
>
<u-grid-item :index="0" @click="navTo('/pages/storegoods/dyeworksDyeback')">
<view class="home-icon icon-color04">
<i class="iconfont icon-finance"></i>
</view>
<view class="grid-text">染整进仓</view>
</u-grid-item>
<u-grid-item
:index="1"
@click="navTo('/pages/storegoods/storeGoodsBusinessIn')"
>
<u-grid-item :index="1" @click="navTo('/pages/storegoods/storeGoodsBusinessIn')">
<view class="home-icon icon-color03">
<i class="iconfont icon-mall-bag"></i>
</view>
<view class="grid-text">成品进仓</view>
</u-grid-item>
<u-grid-item
:index="2"
@click="navTo('/pages/storegoods/storeGoodsBusinessOut')"
>
<u-grid-item :index="2" @click="navTo('/pages/storegoods/storeGoodsBusinessOut')">
<view class="home-icon icon-color12">
<i class="iconfont icon-baoxiaodan"></i>
</view>
<view class="grid-text">成品出仓</view>
</u-grid-item>
<u-grid-item
@click="navTo('/pages/storegoods/storeGoodsBusinessCheck')"
>
<u-grid-item @click="navTo('/pages/storegoods/storeGoodsBusinessCheck')">
<view class="home-icon icon-color04">
<i class="iconfont icon-shenpi"></i>
</view>
<view class="grid-text">成品盘点</view>
</u-grid-item>
<u-grid-item
@click="navTo('/pages/storegoods/storeGoodsBusinessStationMoveOnly')"
>
<u-grid-item @click="navTo('/pages/storegoods/storeGoodsBusinessStationMoveOnly')">
<view class="home-icon icon-color04">
<i class="iconfont icon-shenpi"></i>
</view>
@ -151,6 +130,7 @@
</template>
<script>
import CommonNavbar from "@/components/common-navbar/index";
import scanMixin from '@/common/scanMixin.js';
/**
* Copyright (c) 2013-Now http://aidex.vip All rights reserved.
*/
@ -158,6 +138,7 @@ export default {
components: {
CommonNavbar,
},
mixins: [scanMixin],
data() {
return {
show: false,
@ -168,34 +149,17 @@ export default {
//{image: '/static/aidex/banner/banner03.png'}
],
todoCount: 3,
scanReceiver: null,
isPageActive: false,
// scanReceiver isPageActive scanMixin
};
},
onLoad() {
// #ifdef APP-PLUS
this.isPageActive = true;
this.registerScanBroadcast();
// 使 scanMixin 广
this.registerScanBroadcast(this.handleScanCode);
// #endif
},
onUnload() {
// #ifdef APP-PLUS
this.isPageActive = false;
this.unregisterBroadcast();
// #endif
},
onHide() {
//
this.isPageActive = false;
},
onShow() {
//
this.isPageActive = true;
},
// onUnload, onHide, onShow scanMixin
computed: {
contentStyle() {
@ -206,6 +170,15 @@ export default {
},
},
methods: {
// -
handleScanCode(scanResult) {
console.log('工作台-扫码结果:', scanResult);
const cleanResult = scanResult.trim().replace(/[\r\n]/g, '');
uni.navigateTo({
url: '/pages/saleship/salepickscandetail?order_no=' + cleanResult
});
},
navTo(url) {
uni.navigateTo({
url: url,
@ -217,7 +190,7 @@ export default {
itemClick(index) {
console.log(index);
},
//
//
handleScan() {
// uni.navigateTo({
// url: '/pages/saleship/salepickscandetail?order_no=FPD-PB-202412270196'
@ -275,99 +248,32 @@ export default {
});
}
},
// 广
registerScanBroadcast() {
try {
console.log('开始注册扫码广播');
const main = plus.android.runtimeMainActivity();
// 广
try {
const Intent = plus.android.importClass('android.content.Intent');
const intent = new Intent('com.android.scanner.service_settings');
intent.putExtra('action_barcode_broadcast', 'com.android.server.scannerservice.broadcast');
intent.putExtra('key_barcode_broadcast', 'scannerdata');
main.sendBroadcast(intent);
console.log('扫码枪广播配置已发送');
} catch (error) {
console.error('配置扫码枪广播失败:', error);
}
// 广
const IntentFilter = plus.android.importClass('android.content.IntentFilter');
const filter = new IntentFilter();
filter.addAction('com.android.server.scannerservice.broadcast');
const receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
onReceive: (context, intent) => {
// 广
if (!this.isPageActive) return;
try {
console.log("Workbench intent:", intent);
const scanResult = intent.getStringExtra('scannerdata');
console.log('工作台-扫码结果:', scanResult);
if (scanResult) {
this.$nextTick(() => {
const cleanResult = scanResult.trim().replace(/[\r\n]/g, '');
uni.navigateTo({
url: '/pages/saleship/salepickscandetail?order_no=' + cleanResult
});
});
}
} catch (error) {
console.error('处理广播数据时出错:', error, error.stack);
}
}
});
// 广
main.registerReceiver(receiver, filter);
this.scanReceiver = receiver;
console.log('扫码广播注册成功,等待扫码...');
} catch (error) {
console.error('注册扫码广播失败:', error);
console.error('错误详情:', error.message);
console.error('错误堆栈:', error.stack);
}
},
// 广
unregisterBroadcast() {
if (this.scanReceiver) {
try {
const main = plus.android.runtimeMainActivity();
main.unregisterReceiver(this.scanReceiver);
this.scanReceiver = null;
console.log('扫码广播注销成功');
} catch (error) {
console.error('注销扫码广播失败:', error);
}
}
},
// registerScanBroadcast unregisterScanBroadcast scanMixin
},
};
</script>
<style lang="scss">
@import "index.scss";
.scan_box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.scan_text {
font-size: 12px;
color: #2979ff;
}
}
.banner-box {
padding: 0 2%;
width: 96%;
height: 170rpx;
margin: 30rpx 0 30rpx;
}
.u-swiper-wrap {
padding: 0 10px;
}
@ -378,6 +284,7 @@ export default {
display: inline-block;
margin: 0 1.5%;
}
.banner-pic image {
width: 100%;
height: 170rpx;
@ -394,12 +301,14 @@ export default {
position: relative;
top: -3px;
}
.workbench-title {
font-size: 32rpx;
font-weight: bold;
color: #333333;
padding: 15px 30rpx;
}
.home-icon i.icon-tongzhi {
font-size: 22px;
}