feat(model): 更新货柜初始化结果和净菜包选项数据结构

- 在 CabinetInitResult 中添加 horizontalRows 和 verticalCount 字段
- 为 CleanPackageOption 和 MealPackageOption 添加 orderNo、foodId、needCount、needQtyKg 等字段
- 修改 CleanPackageOption 的 itemType 为 1,MealPackageOption 的 itemType 为 2
- 在 ShelfModelV2 中添加 cleanOrderNo 字段用于关联净菜订单号
- 更新 SyncItem 数据结构,添加 cleanOrderNo 字段
- 移除 HomeV2Activity 中的测试代码和硬编码逻辑
- 修改格口编号显示格式,补零显示两位数
- 调整定时任务执行频率,缩短同步间隔时间
This commit is contained in:
2026-05-28 17:39:04 +08:00
parent 4408acfca4
commit d6ba6cf527
9 changed files with 74 additions and 55 deletions
@@ -301,6 +301,7 @@ class HomeV2Activity : BaseActivity() {
it.itemType = model.itemType it.itemType = model.itemType
it.itemName = model.itemName it.itemName = model.itemName
it.traceCode = model.traceCode it.traceCode = model.traceCode
it.cleanOrderNo = model.cleanOrderNo
it.spec = model.spec it.spec = model.spec
it.foodId = model.foodId it.foodId = model.foodId
it.storeTime = model.storeTime it.storeTime = model.storeTime
@@ -350,7 +351,7 @@ class HomeV2Activity : BaseActivity() {
it.tvEmptyContent.setTextColor(Color.WHITE) it.tvEmptyContent.setTextColor(Color.WHITE)
} }
loadTestData() // loadTestData()
} }
@SuppressLint("NotifyDataSetChanged") @SuppressLint("NotifyDataSetChanged")
@@ -384,7 +385,8 @@ class HomeV2Activity : BaseActivity() {
*/ */
private fun saveGoodsTask() { private fun saveGoodsTask() {
saveTaskJob = saveTaskJob =
taskExecutor.startIntervalTaskWithInitialDelay(1 * 60 * 1000L, 5 * 60 * 1000L) { // taskExecutor.startIntervalTaskWithInitialDelay(1 * 60 * 1000L, 5 * 60 * 1000L) {
taskExecutor.startIntervalTaskWithInitialDelay(10 * 1000L, 5 * 1000L) {
syncShelfGoodsToServer() syncShelfGoodsToServer()
} }
} }
@@ -425,10 +427,11 @@ class HomeV2Activity : BaseActivity() {
return return
} }
viewModelV2.syncCabinetData(SyncBody().apply { viewModelV2.syncCabinetData(SyncBody().apply {
cabinetId = list[0].cabinetId // cabinetId = list[0].cabinetId
cabinetId = App.deviceId
temperature = null temperature = null
humidity = null humidity = null
goodsList = cabinetInitResult!!.containerGoodsList goodsList = list
}) })
} }
} }
@@ -29,7 +29,7 @@ class ShelfV2Adapter(list: MutableList<ShelfModelV2>) :
val binding = holder.binding val binding = holder.binding
// 格口编号 // 格口编号
binding.tvShelfName.text = item.slotNo binding.tvShelfName.text = item.slotNo?.padStart(2,'0')
// 临期预警(slotStatus=2)显示过期图标 // 临期预警(slotStatus=2)显示过期图标
if (item.slotStatus.toInt() == 2) binding.ivStaleFood.visible() if (item.slotStatus.toInt() == 2) binding.ivStaleFood.visible()
@@ -8,5 +8,7 @@ data class CabinetInitResult(
val canteenName: String = "", val canteenName: String = "",
val deviceName: String = "", val deviceName: String = "",
val area: String = "", val area: String = "",
val horizontalRows:Int = 0,
val verticalCount:Int = 0,
val containerGoodsList: List<ShelfModelV2>? = null, val containerGoodsList: List<ShelfModelV2>? = null,
) )
@@ -1,6 +1,7 @@
package com.shuwei.intelligent.shelves.model package com.shuwei.intelligent.shelves.model
import com.shuwei.intelligent.shelves.utils.DateTimeUtil import com.shuwei.intelligent.shelves.utils.DateTimeUtil
import java.math.BigDecimal
import java.util.Date import java.util.Date
/** /**
@@ -8,20 +9,27 @@ import java.util.Date
*/ */
data class CleanPackageOption( data class CleanPackageOption(
val id: Long = 0, val id: Long = 0,
val batchNo: String = "",
val itemName: String = "", val itemName: String = "",
/** 净菜订单号,sync 时作为 cleanOrderNo 回传 */
val orderNo: String = "",
val packageSpec: String? = null, val packageSpec: String? = null,
val traceCode: String? = null, /** 关联菜品 id */
val spec: String? = null, val foodId: Long? = null,
/** 需求份数 */
val needCount: Int? = null,
/** 需求计量(kg */
val needQtyKg: BigDecimal? = null,
/** 保质期至,格式 yyyy-MM-dd */
val expiryDate: String? = null, val expiryDate: String? = null,
var isSelected: Boolean = false var isSelected: Boolean = false
) { ) {
/** 将净菜包选项转换为格口记录 */ /** 将净菜包选项转换为格口记录 */
fun toShelfModelV2(model: ShelfModelV2? = null) = (model ?: ShelfModelV2()).also { fun toShelfModelV2(model: ShelfModelV2? = null) = (model ?: ShelfModelV2()).also {
it.itemType = 2 it.itemType = 1
it.itemName = itemName it.itemName = itemName
it.traceCode = traceCode it.cleanOrderNo = orderNo
it.spec = packageSpec it.spec = packageSpec
it.foodId = foodId
it.storeTime = DateTimeUtil.formatDateTime(dateTime = Date()) it.storeTime = DateTimeUtil.formatDateTime(dateTime = Date())
} }
} }
@@ -1,6 +1,7 @@
package com.shuwei.intelligent.shelves.model package com.shuwei.intelligent.shelves.model
import com.shuwei.intelligent.shelves.utils.DateTimeUtil import com.shuwei.intelligent.shelves.utils.DateTimeUtil
import java.math.BigDecimal
import java.util.Date import java.util.Date
/** /**
@@ -8,21 +9,25 @@ import java.util.Date
*/ */
data class MealPackageOption( data class MealPackageOption(
val id: Long = 0, val id: Long = 0,
val batchNo: String = "",
val itemName: String = "", val itemName: String = "",
/** 净菜订单号,sync 时作为 cleanOrderNo 回传 */
val orderNo: String = "",
val packageSpec: String? = null, val packageSpec: String? = null,
val traceCode: String? = null,
//格式 `yyyy-MM-dd`(包装完成后有值)
val expiryDate: String? = null,
/** 关联菜品 id */ /** 关联菜品 id */
val foodId: Long? = null, val foodId: Long? = null,
/** 需求份数 */
val needCount: Int? = null,
/** 需求计量(kg */
val needQtyKg: BigDecimal? = null,
/** 保质期至,格式 yyyy-MM-dd(包装完成后有值) */
val expiryDate: String? = null,
var isSelected: Boolean = false var isSelected: Boolean = false
) { ) {
/** 将餐品净菜包选项转换为格口记录 */ /** 将餐品净菜包选项转换为格口记录 */
fun toShelfModelV2(model: ShelfModelV2? = null) = (model ?: ShelfModelV2()).also { fun toShelfModelV2(model: ShelfModelV2? = null) = (model ?: ShelfModelV2()).also {
it.itemType = 1 it.itemType = 2
it.itemName = itemName it.itemName = itemName
it.traceCode = traceCode it.cleanOrderNo = orderNo
it.spec = packageSpec it.spec = packageSpec
it.foodId = foodId it.foodId = foodId
it.storeTime = DateTimeUtil.formatDateTime(dateTime = Date()) it.storeTime = DateTimeUtil.formatDateTime(dateTime = Date())
@@ -19,6 +19,8 @@ data class ShelfModelV2(
var area: String = "", var area: String = "",
/** 溯源码 */ /** 溯源码 */
var traceCode: String? = "", var traceCode: String? = "",
/** 关联净菜订单号 */
var cleanOrderNo: String? = "",
/** 物料名称 */ /** 物料名称 */
var itemName: String? = "", var itemName: String? = "",
/** 订单量 kgitemType=1 */ /** 订单量 kgitemType=1 */
@@ -1,34 +1,35 @@
//package com.shuwei.intelligent.shelves.model package com.shuwei.intelligent.shelves.model
//
//import java.math.BigDecimal import java.math.BigDecimal
//
///** /**
// * 全量同步单格口数据,对应接口 4.3 goodsList 元素 * 全量同步单格口数据,对应接口 4.3 goodsList 元素
// */ */
//data class SyncItem( data class SyncItem(
// val slotNo: String, val slotNo: String,
// /** 类型:1-食材净菜 / 2-餐品净菜包 */ /** 类型:1-食材净菜 / 2-餐品净菜包 */
// val itemType: Short? = null, val itemType: Short? = null,
// val itemName: String? = null, val itemName: String? = null,
// val traceCode: String? = null, /** 关联净菜订单号(从下拉选项 orderNo 取值回传) */
// /** 绑定菜品 iditemType=2 */ val cleanOrderNo: String? = null,
// val foodId: Long? = null, /** 绑定菜品 iditemType=2 */
// /** 订单量 kgitemType=1 */ val foodId: Long? = null,
// val orderQty: BigDecimal? = null, /** 订单量 kgitemType=1 */
// /** 实收量 kgitemType=1,与 totalWeightG 二选一) */ val orderQty: BigDecimal? = null,
// val actualQty: BigDecimal? = null, /** 实收量 kgitemType=1,与 totalWeightG 二选一) */
// /** 总重量 gitemType=2,后端自动换算为 kg 存储) */ val actualQty: BigDecimal? = null,
// val totalWeightG: BigDecimal? = null, /** 总重量 gitemType=2,后端自动换算为 kg 存储) */
// /** 规格:1-标准份 / 2-大份 / 3-小份(itemType=2 */ val totalWeightG: BigDecimal? = null,
// val spec: Int? = null, /** 规格:1-标准份 / 2-大份 / 3-小份(itemType=2 */
// val pkgCount: Int? = null, val spec: Int? = null,
// /** 验收结果:1-合格 / 2-轻微差异 / 3-不合格 / 4-待验 */ val pkgCount: Int? = null,
// val checkResult: Short? = null, /** 验收结果:1-合格 / 2-轻微差异 / 3-不合格 / 4-待验 */
// /** 格口状态:1-存放中 / 2-临期预警 / 3-温度超标 / 4-空置 / 5-异常 */ val checkResult: Short? = null,
// val slotStatus: Short? = null, /** 格口状态:1-存放中 / 2-临期预警 / 3-温度超标 / 4-空置 / 5-异常 */
// /** 剩余保质期(小时) */ val slotStatus: Short? = null,
// val shelfLifeRemain: Int? = null, /** 剩余保质期(小时) */
// /** 存入时间,仅新增时生效,不传则取当前时间 */ val shelfLifeRemain: Int? = null,
// val storeTime: String? = null, /** 存入时间,仅新增时生效,不传则取当前时间 */
// val remark: String? = null, val storeTime: String? = null,
//) val remark: String? = null,
)
@@ -144,7 +144,9 @@ object ProtocolConstants {
//原410货柜 //原410货柜
"7a991439-3a12-3ef7-809b-c0258b839473", "7a991439-3a12-3ef7-809b-c0258b839473",
//原1楼餐厅货柜 //原1楼餐厅货柜
"4787e213-90ab-3e32-88e0-ac271a937751" "4787e213-90ab-3e32-88e0-ac271a937751",
// TODO: 测试设备----------
"2987f0c5-5754-33e9-b00a-251db5e2e55f"
) )
/** /**
@@ -47,10 +47,6 @@ object GridLayoutTool {
fun initListSortV2(source: List<ShelfModelV2>): List<ShelfModelV2> { fun initListSortV2(source: List<ShelfModelV2>): List<ShelfModelV2> {
val map = source.associateBy { it.slotNo?.toIntOrNull()?:0 } val map = source.associateBy { it.slotNo?.toIntOrNull()?:0 }
// TODO: 测试 ------------
if ("2987f0c5-5754-33e9-b00a-251db5e2e55f" == App.deviceId) {
return ProtocolConstants.device2ColumnsOrder.mapNotNull { map[it] }
}
return if (device3Columns.contains(App.deviceId)) { return if (device3Columns.contains(App.deviceId)) {
// 按全局定义的显示顺序取对应数据,找不到则跳过 // 按全局定义的显示顺序取对应数据,找不到则跳过
ProtocolConstants.device3ColumnsOrder.mapNotNull { map[it] } ProtocolConstants.device3ColumnsOrder.mapNotNull { map[it] }