diff --git a/app/src/main/java/com/shuwei/dish/match/model/SettingItem.kt b/app/src/main/java/com/shuwei/dish/match/model/SettingItem.kt index ec1d23e..71c1207 100644 --- a/app/src/main/java/com/shuwei/dish/match/model/SettingItem.kt +++ b/app/src/main/java/com/shuwei/dish/match/model/SettingItem.kt @@ -25,7 +25,7 @@ data class SettingItem( CLEAN_PACKAGE("净菜包"), MEAL_PACKAGE("餐品净菜包"), GROUP_TASK("组配任务"), - MEAL_PACKAGE_TEST("餐品净菜包-测试"), +// MEAL_PACKAGE_TEST("餐品净菜包-测试"), DB_INSPECT("数据库查看"), SCALE_OBSERVE("秤数据监控"), ENV_SWITCH("切换环境"), diff --git a/app/src/main/java/com/shuwei/dish/match/net/NetViewModelV2.kt b/app/src/main/java/com/shuwei/dish/match/net/NetViewModelV2.kt index fc7d88c..afde41f 100644 --- a/app/src/main/java/com/shuwei/dish/match/net/NetViewModelV2.kt +++ b/app/src/main/java/com/shuwei/dish/match/net/NetViewModelV2.kt @@ -211,6 +211,23 @@ class NetViewModelV2( private val _addCleanPackageState = MutableStateFlow>(UiState.Idle) val addCleanPackageState: StateFlow> = _addCleanPackageState.asStateFlow() + fun addCleanPackage(param: Map, callback: (Boolean, String) -> Unit) { + viewModelScope.launch { + val uiState = repository.addCleanPackage(param) + when (uiState) { + is UiState.Success -> { + callback(true, "") + } + + is UiState.Error -> { + callback(false, uiState.msg) + } + + is UiState.Loading -> {} + is UiState.Idle -> {} + } + } + } fun addCleanPackage(param: Map) { viewModelScope.launch { _addCleanPackageState.value = UiState.Loading diff --git a/app/src/main/java/com/shuwei/dish/match/ui/CleanPackActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/CleanPackActivity.kt index dbaf860..57df2cf 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/CleanPackActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/CleanPackActivity.kt @@ -1,7 +1,6 @@ package com.shuwei.dish.match.ui import android.os.Bundle -import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import com.shuwei.dish.match.adapter.FormFieldAdapter import com.shuwei.dish.match.base.BaseActivity @@ -13,12 +12,15 @@ import com.shuwei.dish.match.model.FormField import com.shuwei.dish.match.model.NutFoodOptionVO import com.shuwei.dish.match.net.NetViewModelV2 import com.shuwei.dish.match.net.UiState +import com.shuwei.dish.match.utils.AddressUtil +import com.shuwei.dish.match.utils.SpTool +import com.shuwei.dish.match.utils.WeightUtil +import com.shuwei.dish.match.utils.ext.clickWithDebounce import com.shuwei.dish.match.utils.ext.gone +import com.shuwei.dish.match.utils.ext.roundedOneDecimalPlace import com.shuwei.dish.match.utils.ext.toast import com.shuwei.dish.match.utils.ext.visible import kotlinx.coroutines.Job -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch /** * 净菜包装表单页面,根据类型显示不同的表单字段 @@ -26,6 +28,8 @@ import kotlinx.coroutines.launch class CleanPackActivity : BaseActivity() { companion object { + private const val TAG = "CleanPackActivity" + /** 单品净菜包装 */ const val TYPE_CLEAN = 1 @@ -47,7 +51,8 @@ class CleanPackActivity : BaseActivity() { private var packageMethodField: FormField? = null private var deviceField: FormField? = null private var foodOptionsField: FormField? = null - private var packagingSpecField: FormField? = null + + // private var packagingSpecField: FormField? = null private var ingredientsField: FormField? = null private var traceCodeJob: Job? = null @@ -86,13 +91,15 @@ class CleanPackActivity : BaseActivity() { } }) + addWeightListener() + // 初始化 RecyclerView // val flexboxLayoutManager = FlexboxLayoutManager(this).apply { // flexDirection = FlexDirection.ROW // flexWrap = FlexWrap.WRAP // alignItems = AlignItems.STRETCH // } - val layoutManager = GridLayoutManager(this, 1).apply {} + val layoutManager = GridLayoutManager(this, 2) binding.rvForm.layoutManager = layoutManager binding.rvForm.adapter = formAdapter @@ -111,6 +118,16 @@ class CleanPackActivity : BaseActivity() { TYPE_MEAL -> submitMealPackage() } } + + binding.ivClearWeight.clickWithDebounce { + initialWeight = 0.0 + SpTool.configWeight = 0 + WeightUtil.tareTwo(1) + } + + binding.flSearchBar.clickWithDebounce { + + } } /** @@ -120,35 +137,36 @@ class CleanPackActivity : BaseActivity() { private fun initCleanPackFields() { fields.clear() - // 溯源码 - traceCodeField = FormField( - label = "溯源码", - type = FieldType.TEXT, - apiKey = "traceCode", - required = true - ) - fields.add(traceCodeField!!) +// // 溯源码 +// traceCodeField = FormField( +// label = "溯源码", +// type = FieldType.TEXT, +// apiKey = "traceCode", +// required = true +// ) +// fields.add(traceCodeField!!) // 净菜名称 - cleanNameField = FormField( - label = "净菜名称", - type = FieldType.TEXT, - apiKey = "cleanName", - required = true - ) - fields.add(cleanNameField!!) - +// cleanNameField = FormField( +// label = "净菜名称", +// type = FieldType.DROPDOWN, +//// apiKey = "cleanName", +// extraApiKeys = mapOf("cleanName" to "value", "traceCode" to "type"), +// required = true +// ) +// fields.add(cleanNameField!!) // 包装方式(下拉) packageMethodField = FormField( label = "包装方式", type = FieldType.DROPDOWN, - extraApiKeys = mapOf("packageMethodId" to "id", "packageMethod" to "value"), +// extraApiKeys = mapOf("packageMethodId" to "id", "packageMethod" to "value"), + extraApiKeys = mapOf("packageMethod" to "type"), required = true ) fields.add(packageMethodField!!) fields.add( - FormField(label = "包装规格", type = FieldType.TEXT, apiKey = "spec", required = true) + FormField(label = "包装规格", type = FieldType.TEXT, apiKey = "spec", required = false) ) fields.add( @@ -210,7 +228,7 @@ class CleanPackActivity : BaseActivity() { formAdapter.submitList(fields.filter { !it.hidden }) // 监听溯源码输入,自动填充净菜名称 - setupTraceCodeQuery() +// setupTraceCodeQuery() // 加载下拉选项 // loadDictItems("sup_package_method", packageMethodField!!) loadDictItemsWithCallback("sup_package_method", packageMethodField!!) @@ -233,18 +251,19 @@ class CleanPackActivity : BaseActivity() { fields.add(foodOptionsField!!) // 包装规格(下拉) - packagingSpecField = FormField( - label = "包装规格", type = FieldType.DROPDOWN, - extraApiKeys = mapOf("spec" to "value"), - required = true - ) - fields.add(packagingSpecField!!) +// packagingSpecField = FormField( +// label = "包装规格", type = FieldType.DROPDOWN, +// extraApiKeys = mapOf("spec" to "value"), +// required = true +// ) +// fields.add(packagingSpecField!!) // 包装方式(下拉) packageMethodField = FormField( label = "包装方式", type = FieldType.DROPDOWN, - extraApiKeys = mapOf("packageMethodId" to "id", "packageMethod" to "value"), +// extraApiKeys = mapOf("packageMethodId" to "id", "packageMethod" to "value"), + extraApiKeys = mapOf("packageMethod" to "type"), required = true ) fields.add(packageMethodField!!) @@ -399,7 +418,7 @@ class CleanPackActivity : BaseActivity() { // 加载下拉选项 loadFoodOptionsWithKeyword() loadDictItemsWithCallback("sup_package_method", packageMethodField!!) - loadDictItemsWithCallback("sup_package_spec", packagingSpecField!!) +// loadDictItemsWithCallback("sup_package_spec", packagingSpecField!!) loadDeviceOptionsWithCallback(deviceField) } @@ -407,48 +426,49 @@ class CleanPackActivity : BaseActivity() { * 监听溯源码字段变化,输入后 800ms 无变化则触发查询 */ private fun setupTraceCodeQuery() { - val field = traceCodeField ?: return - val cleanField = cleanNameField ?: return - - traceCodeJob = lifecycleScope.launch { - var lastValue = "" - while (true) { - val current = field.value.trim() - if (current != lastValue && current.isNotBlank()) { - lastValue = current - viewModelV2.getIngredientByTrace(current) - } - delay(800) - } - } - - lifecycleScope.launch { - viewModelV2.ingredientByTraceState.collect { state -> - when (state) { - is UiState.Success -> { - val data = state.data - if (!data.isNullOrEmpty()) { - val info = data[0] - cleanField.value = info.materName ?: "" - // 通知 adapter 刷新净菜名称字段(索引为 1) - val idx = fields.indexOf(cleanField) - if (idx >= 0) formAdapter.notifyItemChanged(idx) - } - } - - is UiState.Error -> { - toast(state.msg) - } - - else -> {} - } - } - } +// val field = traceCodeField ?: return +// val cleanField = cleanNameField ?: return +// +// traceCodeJob = lifecycleScope.launch { +// var lastValue = "" +// while (true) { +// val current = field.value.trim() +// if (current != lastValue && current.isNotBlank()) { +// lastValue = current +// viewModelV2.getIngredientByTrace(current) +// } +// delay(800) +// } +// } +// +// lifecycleScope.launch { +// viewModelV2.ingredientByTraceState.collect { state -> +// when (state) { +// is UiState.Success -> { +// val data = state.data +// if (!data.isNullOrEmpty()) { +// val info = data[0] +// cleanField.value = info.materName ?: "" +// // 通知 adapter 刷新净菜名称字段(索引为 1) +// val idx = fields.indexOf(cleanField) +// if (idx >= 0) formAdapter.notifyItemChanged(idx) +// } +// } +// +// is UiState.Error -> { +// toast(state.msg) +// } +// +// else -> {} +// } +// } +// } } override fun onDestroy() { super.onDestroy() traceCodeJob?.cancel() + WeightUtil.removeWeightListener(TAG) } /** @@ -524,7 +544,7 @@ class CleanPackActivity : BaseActivity() { /** * 加载设备下拉(回调版本),用于餐品净菜包装 */ - private fun loadDeviceOptionsWithCallback(deviceField: FormField?=null) { + private fun loadDeviceOptionsWithCallback(deviceField: FormField? = null) { val field = deviceField ?: return viewModelV2.getDeviceOptionsWithCallback( onLoading = {}, @@ -613,9 +633,19 @@ class CleanPackActivity : BaseActivity() { */ private fun submitCleanPackage() { val params = collectSubmitValues() - viewModelV2.addCleanPackage(params) - toast("提交成功") - finish() + if (currentWeight <= 0.0) { + toast("未识别到重量") + return + } + params["weightPerUnit"] = currentWeight.toString() + viewModelV2.addCleanPackage(params) { state, msg -> + if (state.not()) { + toast("提交失败:$msg") + return@addCleanPackage + } + toast("提交成功") + finish() + } } /** @@ -623,9 +653,36 @@ class CleanPackActivity : BaseActivity() { */ private fun submitMealPackage() { val params = collectSubmitValues() - viewModelV2.addMealPackage(params) - toast("提交成功") - finish() + viewModelV2.addMealPackage(params) { state, msg -> + if (state.not()) { + toast("提交失败:$msg") + return@addMealPackage + } + toast("提交成功") + finish() + } + } + + private var initialWeight = SpTool.configWeight.toDouble() + private var currentWeight = 0.0 + + private fun addWeightListener() { + WeightUtil.addWeightListener( + weightKey = TAG, + getWeight = { address, state, weight -> + if (address == AddressUtil.ONE && state == WeightUtil.STATE_STABLE) { + runOnUiThread { + currentWeight = weight - initialWeight + binding.tvShowWeight.run { + if (tag != currentWeight) { + val weightText = "${currentWeight.roundedOneDecimalPlace()}g" + text = weightText + tag = currentWeight + } + } + } + } + }) } } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/HomeV2Activity.kt b/app/src/main/java/com/shuwei/dish/match/ui/HomeV2Activity.kt index fa50503..ef22c1d 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/HomeV2Activity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/HomeV2Activity.kt @@ -19,6 +19,10 @@ class HomeV2Activity : BaseActivity() { binding = ActivityHomeV2Binding.inflate(layoutInflater) setContentView(binding.root) + binding.tvTitle.setOnClickListener { + startActivity {} + } + binding.btnCleanPack.setOnClickListener { startActivity { putExtra(CleanPackActivity.EXTRA_TYPE, CleanPackActivity.TYPE_CLEAN) @@ -26,9 +30,11 @@ class HomeV2Activity : BaseActivity() { } binding.btnMealPack.setOnClickListener { - startActivity { - putExtra(CleanPackActivity.EXTRA_TYPE, CleanPackActivity.TYPE_MEAL) - } + startActivity {} + } + + binding.btnTask.setOnClickListener { + startActivity {} } } } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt index 43eeab7..20694f4 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/InitActivity.kt @@ -95,20 +95,20 @@ class InitActivity : BaseActivity() { // return@launch // } // 主设备:走原有路由逻辑 - when (SpTool.cookMode) { - 0 -> { - startActivity() - } - - 1 -> { - goSampling() - } - - else -> { - startActivity() - } - } -// startActivity() +// when (SpTool.cookMode) { +// 0 -> { +// startActivity() +// } +// +// 1 -> { +// goSampling() +// } +// +// else -> { +// startActivity() +// } +// } + startActivity() // 延迟到下一帧 finish,避免与 LaunchActivityItem 事务竞态导致 // "Activity client record must not be null" 偶发崩溃 window.decorView.post { finish() } diff --git a/app/src/main/java/com/shuwei/dish/match/ui/PackActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/PackActivity.kt index 523f401..c544828 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/PackActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/PackActivity.kt @@ -201,6 +201,7 @@ class PackActivity : BaseActivity() { binding.ivClearWeight.clickWithDebounce { initialWeight = 0.0 + SpTool.configWeight = 0 WeightUtil.tareTwo(1) } @@ -504,7 +505,8 @@ class PackActivity : BaseActivity() { packageMethodField = FormField( label = "包装方式", type = FieldType.DROPDOWN, - extraApiKeys = mapOf("packageMethodId" to "id", "packageMethod" to "value"), +// extraApiKeys = mapOf("packageMethodId" to "id", "packageMethod" to "value"), + extraApiKeys = mapOf("packageMethod" to "type"), required = true ) fields.add(packageMethodField!!) diff --git a/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt index d77e652..bfb62f2 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/SettingActivity.kt @@ -122,14 +122,14 @@ class SettingActivity : BaseActivity() { startActivity { } } ), - SettingItem( - type = SettingItem.Type.MEAL_PACKAGE_TEST, - onClick = { - startActivity { - putExtra(CleanPackActivity.EXTRA_TYPE, CleanPackActivity.TYPE_MEAL) - } - } - ), +// SettingItem( +// type = SettingItem.Type.MEAL_PACKAGE_TEST, +// onClick = { +// startActivity { +// putExtra(CleanPackActivity.EXTRA_TYPE, CleanPackActivity.TYPE_MEAL) +// } +// } +// ), SettingItem( type = SettingItem.Type.DB_INSPECT, isHidden = true, diff --git a/app/src/main/java/com/shuwei/dish/match/ui/TaskDetailActivity.kt b/app/src/main/java/com/shuwei/dish/match/ui/TaskDetailActivity.kt index 58ec38e..ea850e3 100644 --- a/app/src/main/java/com/shuwei/dish/match/ui/TaskDetailActivity.kt +++ b/app/src/main/java/com/shuwei/dish/match/ui/TaskDetailActivity.kt @@ -189,6 +189,7 @@ class TaskDetailActivity : BaseActivity() { } binding.ivClearWeight.clickWithDebounce { initialWeight = 0.0 + SpTool.configWeight = 0 WeightUtil.tareTwo(1) } } diff --git a/app/src/main/res/drawable/bg_gradient_red_btn.xml b/app/src/main/res/drawable/bg_gradient_red_btn.xml new file mode 100644 index 0000000..184e57c --- /dev/null +++ b/app/src/main/res/drawable/bg_gradient_red_btn.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/layout/activity_clean_pack.xml b/app/src/main/res/layout/activity_clean_pack.xml index d5b321c..1c5f932 100644 --- a/app/src/main/res/layout/activity_clean_pack.xml +++ b/app/src/main/res/layout/activity_clean_pack.xml @@ -5,16 +5,128 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - tools:background="@color/white" + tools:background="@drawable/bg_other_page" tools:ignore="HardcodedText"> - + + + + + + + + + + + + + + + + + + + + + + + + + + android:layout_weight="1" /> - - + + diff --git a/app/src/main/res/layout/activity_task_detail.xml b/app/src/main/res/layout/activity_task_detail.xml index 664337c..04eed98 100644 --- a/app/src/main/res/layout/activity_task_detail.xml +++ b/app/src/main/res/layout/activity_task_detail.xml @@ -103,55 +103,6 @@ android:background="@drawable/shape_white_30_corners" android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:visibility="gone"> + android:visibility="visible">