feat(shelf): 更新货架界面和菜品分类功能

- 重命名tvFoodType为tvVegTypeName以统一命名规范
- 新增bg_pressed.xml选择器用于按钮按下效果
- 在ChipSelectDialog中添加必选验证和改进布局参数
- 扩展HomeV3Activity传递菜品名称和蔬菜类型信息
- 调整list_item_shelf_v3.xml布局尺寸和权重配置
- 新增tvFoodType显示菜品分类并调整字体间距
- 更新ShelfV3Activity处理菜品分类数据传递和显示
- 修改SlotModel数据结构支持蔬菜类型ID和名称字段
- 优化适配器中菜品分类文本显示逻辑和颜色设置
This commit is contained in:
2026-06-26 16:24:53 +08:00
parent 0e0c2fe47b
commit 5412f0b6b9
10 changed files with 67 additions and 23 deletions
@@ -7,12 +7,15 @@ import android.os.Bundle
import android.view.Gravity import android.view.Gravity
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup
import com.google.android.material.chip.Chip import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
import com.shuwei.intelligent.shelves.R import com.shuwei.intelligent.shelves.R
import com.shuwei.intelligent.shelves.base.BaseDialog import com.shuwei.intelligent.shelves.base.BaseDialog
import com.shuwei.intelligent.shelves.databinding.DialogChipSelectBinding import com.shuwei.intelligent.shelves.databinding.DialogChipSelectBinding
import com.shuwei.intelligent.shelves.utils.ext.dp import com.shuwei.intelligent.shelves.utils.ext.dp
import com.shuwei.intelligent.shelves.utils.ext.hideKeyboard import com.shuwei.intelligent.shelves.utils.ext.hideKeyboard
import com.shuwei.intelligent.shelves.utils.ext.toast
/** /**
* 带ChipGroup选择的弹窗,支持传入选项列表,回调返回选中索引 * 带ChipGroup选择的弹窗,支持传入选项列表,回调返回选中索引
@@ -55,9 +58,11 @@ class ChipSelectDialog(context: Context) : Dialog(context, R.style.DialogTheme)
} }
binding.btnConfirm.setOnClickListener { binding.btnConfirm.setOnClickListener {
if (selectedIndex >= 0) { if (binding.chipGroup.checkedChipId == -1) {
onItemSelected?.invoke(selectedIndex) context.toast("请选择净菜分类")
return@setOnClickListener
} }
onItemSelected?.invoke(selectedIndex)
dismiss() dismiss()
} }
} }
@@ -80,9 +85,9 @@ class ChipSelectDialog(context: Context) : Dialog(context, R.style.DialogTheme)
text = label text = label
isCheckable = true isCheckable = true
isCheckedIconVisible = false isCheckedIconVisible = false
textSize = 20f textSize = 22f
chipStartPadding = 15.dp.toFloat() chipStartPadding = 18.dp.toFloat()
chipEndPadding = 15.dp.toFloat() chipEndPadding = 18.dp.toFloat()
textStartPadding = 8.dp.toFloat() textStartPadding = 8.dp.toFloat()
textEndPadding = 8.dp.toFloat() textEndPadding = 8.dp.toFloat()
chipMinHeight = 50.dp.toFloat() chipMinHeight = 50.dp.toFloat()
@@ -94,7 +99,13 @@ class ChipSelectDialog(context: Context) : Dialog(context, R.style.DialogTheme)
selectedIndex = index selectedIndex = index
} }
} }
binding.chipGroup.addView(chip) val params = ChipGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply {
setMargins(8, 5.dp, 8.dp, 5.dp) // left, top, right, bottom
}
binding.chipGroup.addView(chip, params)
} }
} }
} }
@@ -249,6 +249,8 @@ class HomeV3Activity : BaseActivity() {
it.putExtra(ShelfV3Activity.EXTRA_CABINET_ID, model.cabinetId) it.putExtra(ShelfV3Activity.EXTRA_CABINET_ID, model.cabinetId)
it.putExtra(ShelfV3Activity.EXTRA_SLOT_NO, model.slotNo) it.putExtra(ShelfV3Activity.EXTRA_SLOT_NO, model.slotNo)
it.putExtra(ShelfV3Activity.EXTRA_CANTEEN_ID, canteenId) it.putExtra(ShelfV3Activity.EXTRA_CANTEEN_ID, canteenId)
it.putExtra(ShelfV3Activity.EXTRA_MATER_NAME, model.materName)
it.putExtra(ShelfV3Activity.EXTRA_VEG_TYPE_NAME, model.vegTypeName)
}) { result -> }) { result ->
result?.let { onShelfActivityResult(position, it) } result?.let { onShelfActivityResult(position, it) }
} }
@@ -28,8 +28,6 @@ import com.shuwei.intelligent.shelves.utils.ext.toast
import com.shuwei.intelligent.shelves.utils.ext.visible import com.shuwei.intelligent.shelves.utils.ext.visible
import com.sw.scalefusion.shelf.adapter.PendingInboundAdapter import com.sw.scalefusion.shelf.adapter.PendingInboundAdapter
import com.sw.scalefusion.shelf.model.FoodItem import com.sw.scalefusion.shelf.model.FoodItem
import com.sw.scalefusion.shelf.model.PendingInboundItem
import com.sw.scalefusion.shelf.model.PendingInboundRequest
import com.sw.scalefusion.shelf.model.PutSlotRequest import com.sw.scalefusion.shelf.model.PutSlotRequest
import com.sw.scalefusion.shelf.model.SearchFoodRequest import com.sw.scalefusion.shelf.model.SearchFoodRequest
import com.sw.scalefusion.shelf.model.SlotDetailRequest import com.sw.scalefusion.shelf.model.SlotDetailRequest
@@ -52,6 +50,8 @@ class ShelfV3Activity : BaseActivity() {
const val EXTRA_CABINET_ID = "cabinetId" const val EXTRA_CABINET_ID = "cabinetId"
const val EXTRA_CANTEEN_ID = "canteenId" const val EXTRA_CANTEEN_ID = "canteenId"
const val EXTRA_SLOT_NO = "slotNo" const val EXTRA_SLOT_NO = "slotNo"
const val EXTRA_MATER_NAME = "materName"
const val EXTRA_VEG_TYPE_NAME = "vegTypeName"
const val YYYY_MM_DD__EEEE_HH_MM_SS = "yyyy年MM月dd日 EEEE***HH:mm:ss" const val YYYY_MM_DD__EEEE_HH_MM_SS = "yyyy年MM月dd日 EEEE***HH:mm:ss"
} }
@@ -96,7 +96,7 @@ class ShelfV3Activity : BaseActivity() {
val index = optionList[position].typeSelectedIndex val index = optionList[position].typeSelectedIndex
val typeList = optionList[position].vegTypeList ?: emptyList() val typeList = optionList[position].vegTypeList ?: emptyList()
val selectType = typeList.getOrNull(index)?.vegTypeName ?: "" val selectType = typeList.getOrNull(index)?.vegTypeName ?: ""
binding.tvFoodType.text = selectType binding.tvVegTypeName.text = selectType
KeyboardUtil.hideKeyboard(this@ShelfV3Activity.window.decorView) KeyboardUtil.hideKeyboard(this@ShelfV3Activity.window.decorView)
} }
@@ -104,6 +104,8 @@ class ShelfV3Activity : BaseActivity() {
private var canteenId: Long = 0 private var canteenId: Long = 0
private var cabinetId: String = "" private var cabinetId: String = ""
private var slotNo: String = "" private var slotNo: String = ""
private var materName: String = ""
private var vegTypeName: String = ""
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
@@ -117,9 +119,12 @@ class ShelfV3Activity : BaseActivity() {
canteenId = intent.getLongExtra(EXTRA_CANTEEN_ID, 0) canteenId = intent.getLongExtra(EXTRA_CANTEEN_ID, 0)
cabinetId = intent.getStringExtra(EXTRA_CABINET_ID) ?: "" cabinetId = intent.getStringExtra(EXTRA_CABINET_ID) ?: ""
slotNo = intent.getStringExtra(EXTRA_SLOT_NO) ?: "" slotNo = intent.getStringExtra(EXTRA_SLOT_NO) ?: ""
materName = intent.getStringExtra(EXTRA_MATER_NAME) ?: ""
vegTypeName = intent.getStringExtra(EXTRA_VEG_TYPE_NAME) ?: ""
binding.tvShelfName.text = slotNo binding.tvShelfName.text = slotNo
binding.tvFoodName.text = materName.ifBlank { "-" }
binding.tvVegTypeName.text = vegTypeName
initRecyclerView() initRecyclerView()
initSearchBox() initSearchBox()
initButtons() initButtons()
@@ -142,7 +147,7 @@ class ShelfV3Activity : BaseActivity() {
/** 从 slotDetail 响应更新 UI */ /** 从 slotDetail 响应更新 UI */
private fun updateUI(model: SlotModel) { private fun updateUI(model: SlotModel) {
binding.tvFoodName.text = if (model.materName.isNullOrBlank()) "-" else model.materName binding.tvFoodName.text = if (model.materName.isNullOrBlank()) "-" else model.materName
binding.tvFoodType.text = "" binding.tvVegTypeName.text = model.vegTypeName
val weightG = model.weight ?: 0.0 val weightG = model.weight ?: 0.0
realWeight = (weightG * 1000.0).toInt() realWeight = (weightG * 1000.0).toInt()
binding.tvFoodWeight.text = if (weightG >= 1.0) "%.3f千克".format(weightG) binding.tvFoodWeight.text = if (weightG >= 1.0) "%.3f千克".format(weightG)
@@ -185,7 +190,7 @@ class ShelfV3Activity : BaseActivity() {
binding.btnClearEmpty.setOnClickListener { v -> binding.btnClearEmpty.setOnClickListener { v ->
clearZero() clearZero()
binding.tvFoodName.text = "-" binding.tvFoodName.text = "-"
binding.tvFoodType.text = "" binding.tvVegTypeName.text = ""
Loading.show(this@ShelfV3Activity) Loading.show(this@ShelfV3Activity)
v.postDelayed({ v.postDelayed({
Loading.dismiss() Loading.dismiss()
@@ -211,6 +216,7 @@ class ShelfV3Activity : BaseActivity() {
return@clickWithDebounce return@clickWithDebounce
} }
val model = shelfModel ?: return@clickWithDebounce val model = shelfModel ?: return@clickWithDebounce
val vegType = item.vegTypeList?.getOrNull(item.typeSelectedIndex)
viewModel.put( viewModel.put(
request = PutSlotRequest( request = PutSlotRequest(
cabinetType = cabinetType, cabinetType = cabinetType,
@@ -220,7 +226,7 @@ class ShelfV3Activity : BaseActivity() {
materName = item.materName, materName = item.materName,
weight = shelfModel?.weight ?: 0.0 weight = shelfModel?.weight ?: 0.0
).also { ).also {
it.vegTypeId = item.vegTypeList?.getOrNull(item.typeSelectedIndex)?.vegTypeId it.vegTypeId = vegType?.vegTypeId
}, },
onLoading = { showProgress() }, onLoading = { showProgress() },
onSuccess = onSuccess@{ inboundNo -> onSuccess = onSuccess@{ inboundNo ->
@@ -231,6 +237,8 @@ class ShelfV3Activity : BaseActivity() {
// } // }
val resultModel = item.toSlotModel(model).also { val resultModel = item.toSlotModel(model).also {
// it.inboundNo = inboundNo // it.inboundNo = inboundNo
it.vegTypeId = vegType?.vegTypeId
it.vegTypeName = vegType?.vegTypeName
} }
val result = Intent().apply { val result = Intent().apply {
putExtra(SHELF_MODEL, resultModel) putExtra(SHELF_MODEL, resultModel)
@@ -65,6 +65,7 @@ class ShelfV3Adapter(list: MutableList<SlotModel>) :
setTextColor(getColor(R.color.food_weight_blue)) setTextColor(getColor(R.color.food_weight_blue))
text = "-" text = "-"
} }
binding.tvFoodType.text = ""
return return
} }
@@ -78,6 +79,8 @@ class ShelfV3Adapter(list: MutableList<SlotModel>) :
setTextColor(getColor(R.color.black999)) setTextColor(getColor(R.color.black999))
text = item.storeTime text = item.storeTime
} }
binding.tvFoodType.text = item.vegTypeName
binding.tvFoodType.setTextColor(getColor(R.color.black666))
} }
private fun getColor(@ColorRes id: Int) = ContextCompat.getColor(context, id) private fun getColor(@ColorRes id: Int) = ContextCompat.getColor(context, id)
@@ -15,7 +15,8 @@ data class SlotModel(
val materId: Long? = null, val materId: Long? = null,
val materName: String? = null, val materName: String? = null,
val traceCode: String? = null, val traceCode: String? = null,
val vegTypeId: String? = null, var vegTypeId: Long? = null,
var vegTypeName: String? = null,
//weight单位千克 //weight单位千克
var weight: Double? = 0.0, var weight: Double? = 0.0,
var storeTime: String? = null, var storeTime: String? = null,
+5
View File
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/white" android:state_pressed="false" />
<item android:drawable="@color/gray_edit" android:state_pressed="true" />
</selector>
@@ -75,7 +75,7 @@
tools:text="金针菇" /> tools:text="金针菇" />
<TextView <TextView
android:id="@+id/tvFoodType" android:id="@+id/tvVegTypeName"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="end" android:ellipsize="end"
@@ -8,7 +8,7 @@
app:cardElevation="0dp"> app:cardElevation="0dp">
<LinearLayout <LinearLayout
android:layout_width="600dp" android:layout_width="500dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
@@ -30,7 +30,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="30dp" android:layout_marginHorizontal="30dp"
android:layout_marginVertical="40dp" android:layout_marginVertical="50dp"
app:selectionRequired="false" app:selectionRequired="false"
app:singleSelection="true" /> app:singleSelection="true" />
@@ -52,7 +52,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:background="@color/white" android:background="@drawable/bg_pressed"
android:text="取消" android:text="取消"
android:textColor="@android:color/darker_gray" android:textColor="@android:color/darker_gray"
android:textSize="24sp" /> android:textSize="24sp" />
@@ -67,7 +67,7 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="1" android:layout_weight="1"
android:background="@color/white" android:background="@drawable/bg_pressed"
android:text="确定" android:text="确定"
android:textColor="@color/bg_card_blue" android:textColor="@color/bg_card_blue"
android:textSize="24sp" /> android:textSize="24sp" />
+17 -4
View File
@@ -3,8 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layoutCard" android:id="@+id/layoutCard"
android:layout_width="0dp" android:layout_width="wrap_content"
android:layout_height="0dp" android:layout_height="wrap_content"
android:layout_margin="12dp" android:layout_margin="12dp"
app:cardBackgroundColor="@color/bg_card_blue" app:cardBackgroundColor="@color/bg_card_blue"
app:cardCornerRadius="12dp" app:cardCornerRadius="12dp"
@@ -38,15 +38,28 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:ellipsize="end" android:ellipsize="end"
android:maxLines="1" android:maxLines="1"
android:includeFontPadding="false"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="30sp" android:textSize="30sp"
android:textStyle="bold" android:textStyle="bold"
tools:text="空" /> tools:text="空" />
<TextView
android:id="@+id/tvFoodType"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:ellipsize="end"
android:gravity="center"
android:includeFontPadding="false"
android:maxLines="1"
android:textColor="@color/white"
android:textSize="20sp"
tools:text="切块" />
<Space <Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="0.833" /> android:layout_weight="0.8" />
<TextView <TextView
android:id="@+id/tvFoodWeight" android:id="@+id/tvFoodWeight"
@@ -62,7 +75,7 @@
<Space <Space
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="0.933" /> android:layout_weight="0.9" />
<TextView <TextView
android:id="@+id/tvStoreDate" android:id="@+id/tvStoreDate"
+1
View File
@@ -18,6 +18,7 @@
<color name="food_weight_blue">#C8C8FF</color> <color name="food_weight_blue">#C8C8FF</color>
<color name="food_weight_orange">#FF6400</color> <color name="food_weight_orange">#FF6400</color>
<color name="black999">#999999</color> <color name="black999">#999999</color>
<color name="black666">#666666</color>
<color name="white_f6">#F6F6F6</color> <color name="white_f6">#F6F6F6</color>
<color name="gray_edit">#E6EBF0</color> <color name="gray_edit">#E6EBF0</color>
</resources> </resources>