refactor(activity): 重构 MasterScaleActivity 多类型秤布局,新增 Scale22GridActivity

- MasterScaleActivity 使用 BaseMultiItemAdapter 支持4种 viewType(scale1/2/18/22)
- 内嵌 adapter 改用 BaseQuickAdapter + 自定义 VH,替换原 RecyclerView.Adapter
- 新增 Scale22GridActivity,使用 FlexboxLayoutManager 实现22格混合网格布局
- 新增 list_type_scale1/2/18/22.xml 及 list_item_scale22_row.xml 布局文件
- 删除废弃的 list_item_scale_data.xml
- 新增 flexbox 依赖,注册 Scale22GridActivity
This commit is contained in:
2026-04-15 16:44:33 +08:00
parent 5ac35a9cab
commit b775b20ff1
16 changed files with 732 additions and 288 deletions
@@ -0,0 +1,17 @@
package com.shuwei.dish.match.scale
/**
* 主设备向子设备发送的控制指令
* @param cmd 指令类型,如 "tare"(清零)
* @param deviceId 目标设备 ID,子设备收到后校验是否匹配自身
* @param address 目标秤地址
*/
data class ScaleCommand(
val cmd: String,
val deviceId: String,
val address: Int
) {
companion object {
const val CMD_TARE = "tare"
}
}
@@ -134,6 +134,22 @@ object ScaleServiceManager {
}
}
/**
* 向指定设备的指定秤发送清零指令
* - 本机秤:直接调用 WeightUtil.tareTwo
* - 子设备秤:通过 WebSocket 发送指令
* @param deviceId 目标设备 ID
* @param address 目标秤地址
*/
fun sendTare(deviceId: String, address: Int) {
if (deviceId == GlobalData.deviceId) {
com.shuwei.dish.match.utils.WeightUtil.tareTwo(address)
} else {
val cmd = ScaleCommand(ScaleCommand.CMD_TARE, deviceId, address)
wsClient?.sendCommand(deviceId, cmd)
}
}
/**
* 停止所有秤服务,在 Application.onTerminate() 或退出时调用
*/
@@ -120,6 +120,17 @@ class ScaleWebSocketClient {
reconnectDelays[deviceId] = minOf(delay * 2, RECONNECT_MAX_MS)
}
/**
* 向指定子设备发送控制指令
* @param deviceId 目标子设备 ID
* @param command 指令对象
* @return true=发送成功,false=设备未连接
*/
fun sendCommand(deviceId: String, command: ScaleCommand): Boolean {
val ws = connections[deviceId] ?: return false
return ws.send(gson.toJson(command))
}
/**
* 断开指定子设备连接(不再重连)
* @param deviceId 子设备 ID
@@ -126,7 +126,19 @@ class ScaleWebSocketServer(private val deviceId: String, private val context: Co
}
override fun onMessage(conn: WebSocket, message: String) {
// 服务端无需处理来自主设备的消息
try {
val cmd = gson.fromJson(message, ScaleCommand::class.java)
// 校验指令目标设备是否为本机
if (cmd.deviceId != deviceId) return
when (cmd.cmd) {
ScaleCommand.CMD_TARE -> {
Log.d(TAG, "收到清零指令, address=${cmd.address}")
com.shuwei.dish.match.utils.WeightUtil.tareTwo(cmd.address)
}
}
} catch (e: Exception) {
Log.w(TAG, "解析指令失败: ${e.message}")
}
}
override fun onError(conn: WebSocket?, ex: Exception) {