修复重量单位

This commit is contained in:
2026-07-09 11:06:20 +08:00
parent c3bd7960d0
commit 23aed5f512
3 changed files with 78 additions and 75 deletions
+2 -2
View File
@@ -2,8 +2,8 @@
"name" : "危废数据终端",
"appid" : "__UNI__F18DD0A",
"description" : "",
"versionName" : "1.0.6",
"versionCode" : 106,
"versionName" : "1.0.8",
"versionCode" : 108,
"transformPx" : false,
/* 5+App */
"app-plus" : {
+67 -61
View File
@@ -124,6 +124,20 @@ export default {
this.form.productionDate = getDateTime()
this.initData()
},
onShow() {
// 页面显示时静默连接蓝牙秤(未配置或失败不弹窗)
this.connectScaleSilently()
},
mounted() {
// 注册蓝牙秤实时监听回调
scaleService.onWeightChange(this.handleWeightChange)
scaleService.onConnectionChange(this.handleConnectionChange)
},
beforeDestroy() {
// 注销蓝牙秤监听回调
scaleService.offWeightChange(this.handleWeightChange)
scaleService.offConnectionChange(this.handleConnectionChange)
},
onUnload() {
// 退出页面时断开蓝牙打印机和称重设备连接
this.handleDisconnect()
@@ -187,14 +201,14 @@ export default {
this.form.handlerName = handler.name
},
/**
* 获取重量
* 蓝牙秤获取当前重量并填入表单
* 获取重量(实时监听模式)
* 蓝牙秤连接后会自动推送重量数据,无需发送读取指令。
*
* 流程:
* 1. 检查是否已配置称重设备 → 未配置则引导去设置页
* 2. 检查蓝牙秤连接状态 → 连接则自动连接
* 3. 发送 'R' 命令读取重量(5秒超时)
* 4. 解析返回数据填入 form.weight
* 2. 检查蓝牙秤连接状态 → 连接则提示实时称重中
* 3. 未连接则调用 autoConnect() 建立连接
* 4. 连接成功后设备通过 notify 主动推送数据,handleWeightChange 自动填入表单
*/
async getWeight() {
if (!this.scaleDeviceId || !this.scaleServiceId || !this.scaleCharacteristicId) {
@@ -210,62 +224,56 @@ export default {
return;
}
uni.showToast({ title: '正在获取重量...', icon: 'none' });
// 已连接状态:无需重复连接,重量通过 notify 实时推送
if (scaleService.isConnected && this.scaleConnected) {
uni.showToast({ title: '已开启实时称重', icon: 'none' });
return;
}
uni.showToast({ title: '正在连接称重设备...', icon: 'none' });
try {
if (!scaleService.isConnected || !this.scaleConnected) {
await scaleService.autoConnect();
this.scaleConnected = true;
}
// ============================================================
// Step 3: 发送读取命令 'R' (0x52),等待设备返回数据
// readWeight() 内部流程:
// - 向 WriteCharacteristic 写入 0x52
// - 启动 5 秒超时定时器
// - 等待 NotifyCharacteristic 收到设备响应
// - 调用 _parseCustom() 解析返回数据
//
// 【调试】如果解析失败(value=null),会显示原始HEX/ASCII数据,
// 你可以根据实际数据修改 _parseCustom() 中的协议解析逻辑
// ============================================================
const result = await scaleService.readWeight();
if (result.value !== null && !isNaN(result.value)) {
// 解析成功:将重量值填入表单
this.form.weight = String(result.value);
uni.showToast({ title: `重量: ${result.value} ${result.unit}`, icon: 'success' });
} else {
// 解析失败:显示原始数据便于调试
console.warn('【蓝牙秤】原始返回数据:', result);
uni.showModal({
title: '无法解析重量',
content: `原始数据:\nHEX: ${result.rawHex || '-'}\nASCII: ${result.rawAscii || '-'}\n\n请检查设备协议格式`,
showCancel: false
});
}
const success = await scaleService.autoConnect();
this.scaleConnected = success;
uni.showToast({ title: success ? '已连接,实时称重中' : '连接失败', icon: success ? 'success' : 'none' });
} catch (error) {
console.error('【蓝牙秤】获取重量失败:', error);
// 提取错误信息(兼容 Error 对象和 uni-app 错误对象)
const errMsg = error.message || error.errMsg || JSON.stringify(error);
// 根据错误类型给出不同提示
let toastMsg = '获取重量失败';
if (errMsg.includes('未配置')) {
toastMsg = '请先配置称重设备';
} else if (errMsg.includes('未连接') || errMsg.includes('连接失败') || errMsg.includes('already connect')) {
toastMsg = '蓝牙连接失败,请检查设备是否开机';
} else if (errMsg.includes('超时') || errMsg.includes('time out')) {
toastMsg = '连接超时,请检查蓝牙设备';
} else if (errMsg.includes('invalid data')) {
toastMsg = '数据格式错误';
console.error('【蓝牙秤】连接失败:', error);
this.scaleConnected = false;
uni.showToast({ title: '连接失败', icon: 'none' });
}
},
uni.showToast({ title: toastMsg, icon: 'none', duration: 2000 });
/**
* 静默连接蓝牙秤(未配置或失败不弹窗)
* 在 onShow 时调用,用于页面切回时自动恢复连接
*/
async connectScaleSilently() {
if (!this.scaleDeviceId || !this.scaleServiceId || !this.scaleCharacteristicId) return;
if (scaleService.isConnected && this.scaleConnected) return;
try {
const success = await scaleService.autoConnect();
this.scaleConnected = success;
} catch (e) {
console.warn('【蓝牙秤】静默连接失败:', e);
}
},
/**
* 蓝牙秤实时重量回调
* 设备通过 notify 主动推送数据时触发,自动填入表单
*/
handleWeightChange(weight) {
if (weight && weight.value !== null && !isNaN(weight.value)) {
this.form.weight = String(weight.value);
}
},
/**
* 蓝牙秤连接状态变更回调
*/
handleConnectionChange(connected) {
this.scaleConnected = connected;
},
/**
* 危废类型选择变更
* @param {Object} e - picker change 事件对象
@@ -321,15 +329,15 @@ export default {
tid: this.form.hwTypeId,
time: getDateTime()
}
if (this.hwInfo.unit == '吨') {
submitData.weight = submitData.weight / 1000
}
console.log('提交数据:', submitData)
// uni.showLoading({ title: '提交中...' })
api.hwGenerate({ ...submitData }).then(res => {
console.log('hwGenerate res', res)
// "flow_no": "019e5ceb-fc23-70a1-b0e4-06ed6bc7d951",
// "digital_id": "12510100580027911690003949202605250008",
// "label_qrcode": "https://www.cswm.org.cn/qr/?code=7G6MOYELnFHZfF1Y0F8e6h4LCHuJYm7dR2hXRJkeKK7UoS8KYXm5UyRKUnh430z2O&type=WFBQ",
// "produce_ledger_no": "CS20260525000008"
if (res.code == 1000) {
uni.showToast({ title: '登记成功', icon: 'success' })
@@ -356,8 +364,6 @@ export default {
this.currentPrintData = printData
this.doPrint()
}
}).finally(() => {
// uni.hideLoading()
})
},
+4 -7
View File
@@ -99,13 +99,10 @@ export default {
// 断开打印机连接
async disconnectPrinter({ commit, dispatch }) {
try {
const config = {
connected: false,
deviceId: '',
deviceName: '',
lastUpdated: new Date().toISOString()
};
await dispatch('savePrinterConfig', config);
commit('SET_PRINTER_CONFIG', {
connected: false // ✅ 只更新连接状态
});
await dispatch('savePrinterConfig');
return true;
} catch (error) {
console.error('断开打印机失败:', error);