厨配秤: 统一采样数据结构及接口

- 将提交构成接口改为提交采样,废弃制作模式,调整请求参数结构
- 修改采样历史接口为已提交采样列表,调整接口路径和请求参数
- 更新数据模型,替换旧的审核状态为实验状态,新增实验编号字段
- 修改列表适配器显示逻辑,展示实验状态及熟重信息,调整颜色映射
- 调整相关网络请求及回调函数,删除无用参数,简化调用
- 更新UI页面文本,适配新版采样列表数据格式与提示信息
- 删除相关无用的旧状态定义及属性,保持代码整洁
This commit is contained in:
mazengfei
2026-09-11 15:34:06 +08:00
parent 6d3c5490a4
commit 9e4b2bd009
9 changed files with 65 additions and 97 deletions
@@ -9,6 +9,7 @@ import com.chad.library.adapter4.viewholder.QuickViewHolder
import com.shuwei.dish.match.R
import com.shuwei.dish.match.databinding.ListItemFoodListBinding
import com.shuwei.dish.match.model.FoodRecord
import com.shuwei.dish.match.model.SampleStatus
import com.shuwei.dish.match.utils.ext.gone
import com.shuwei.dish.match.utils.ext.visible
import java.text.DecimalFormat
@@ -88,12 +89,12 @@ class FoodListAdapter(
// 非烹饪中,采样模式
tvDishName.setTextColor(ContextCompat.getColor(holder.itemView.context, R.color.dish_green))
clBlock.setBackgroundResource(R.drawable.shape_white_fb_15_corners)
// 新采样历史sample/history):展示审核状态 + 熟重(g)
val auditName = item.auditStatusName
if (!auditName.isNullOrBlank()) {
// 已提交采样列表sample-list):展示实验状态 + 熟重(g)
val statusName = item.statusName
if (!statusName.isNullOrBlank()) {
tvDishCount.text = "熟重:${formatGram(foodWeight)}"
tvShowState.text = auditName
tvShowState.setTextColor(auditStatusColor(holder, item.auditStatus))
tvShowState.text = statusName
tvShowState.setTextColor(statusColor(holder, item.status))
return@run
}
val realTotalWeight = if (totalWeight > 0.0) totalWeight else foodWeight
@@ -110,12 +111,12 @@ class FoodListAdapter(
return "${gramDf.format(weight)}g"
}
/** 审核状态着色:1=待审核(灰) / 2=已通过(绿) / 3=已驳回(红) */
private fun auditStatusColor(holder: VH, status: Int?): Int {
/** 实验状态着色:1=实验中(灰) / 2=已评测(绿) / 9=已转化(绿) */
private fun statusColor(holder: VH, status: Int?): Int {
val context = holder.itemView.context
return when (status) {
2 -> ContextCompat.getColor(context, R.color.dish_green)
3 -> ContextCompat.getColor(context, R.color.red_ff4444)
SampleStatus.EVALUATED, SampleStatus.CONVERTED ->
ContextCompat.getColor(context, R.color.dish_green)
else -> ContextCompat.getColor(context, R.color.black999)
}
}
@@ -16,13 +16,11 @@ data class FoodRecord(
//true-原始数据,false-非原始数据
var isOriginalData: Boolean = true,
var sort: Int = 0,
// ===== 采样历史sample/history)扩展字段,制作模式不涉及 =====
/** 菜品编号 */
var foodCode: String? = null,
/** 审核状态: 1=待审核 / 2=已通过 / 3=已驳回 */
var auditStatus: Int? = null,
/** 审核状态中文 */
var auditStatusName: String? = null,
/** 审核记录id */
var auditRecordId: String? = null
// ===== 已提交采样列表sample-list)扩展字段,制作模式不涉及 =====
/** 实验编号(innovNo */
var innovNo: String? = null,
/** 实验状态: 1=实验中 / 2=已评测 / 9=已转化 */
var status: Int? = null,
/** 实验状态中文 */
var statusName: String? = null
) : Serializable
@@ -6,22 +6,14 @@ package com.shuwei.dish.match.model
* 序列化规则: Long 字段服务端返回字符串;请求体字段按后端约定(id 类字段用 String 与现有代码一致)
*/
/** 提交构成接口 cookMode 取值(与本地 cookMode 0=制作/1=采样 不同,注意映射 */
object ConstituteCookMode {
/** 制作模式(基于已有菜品,foodId 必填) */
const val MAKE = 1
/** 采样模式(从零建菜,foodName 必填) */
const val SAMPLE = 2
}
/** 采样菜品审核状态 */
object SampleAuditStatus {
/** 待审核 */
const val PENDING = 1
/** 已通过 */
const val APPROVED = 2
/** 已驳回 */
const val REJECTED = 3
/** 采样实验状态(味养创新 nut_innovation.status */
object SampleStatus {
/** 实验中 */
const val EXPERIMENTING = 1
/** 已评测 */
const val EVALUATED = 2
/** 已转化 */
const val CONVERTED = 9
}
// ==================== 一、食材模糊搜索 ====================
@@ -126,10 +118,10 @@ data class FoodCompositionResponse(
val ingredients: List<FoodCompositionIngredient> = emptyList()
)
// ==================== 四、提交构成 ====================
// ==================== 四、提交采样 ====================
/**
* 提交构成 — 单个食材构成条目
* 提交采样 — 单个食材构成条目
* 对应接口: POST /neglect/ratio-scale/constitute/save
*/
data class ConstituteSaveItem(
@@ -142,62 +134,50 @@ data class ConstituteSaveItem(
)
/**
* 提交构成请求,cookMode 区分采样/制作
* 提交采样请求(落库味养创新实验,status=1 实验中)
* 对应接口: POST /neglect/ratio-scale/constitute/save
* 制作模式已废弃本接口,统一为提交采样,不再传 cookMode/foodId
*/
data class ConstituteSaveRequest(
/** 1=制作模式 / 2=采样模式 */
val cookMode: Int = ConstituteCookMode.SAMPLE,
/** 制作模式必填 — 已有菜品id */
val foodId: String? = null,
/** 采样模式必填 — 菜品名称 */
/** 菜品名称 */
val foodName: String? = null,
/** 熟重(g),必须 > 0 */
val foodWeight: Double = 0.0,
/** 餐次: 1=早餐/2=午餐/3=晚餐/4=加餐,选填 */
val mealType: Int? = null,
/** 食材构成列表,至少 1 条 */
val items: List<ConstituteSaveItem> = emptyList()
)
// ==================== 五、采样历史 ====================
// ==================== 五、已提交采样列表 ====================
/**
* 采样历史查询请求参数
* 对应接口: POST /neglect/ratio-scale/sample/history
* 已提交采样列表查询请求参数
* 对应接口: POST /neglect/ratio-scale/sample-list
* 数据源: nut_innovationsource=2 配比秤采样),按提交时间倒序,不分日期
*/
data class SampleHistoryRequest(
/** 页码 */
val pageNum: Int = 1,
/** 每页条数 */
val pageSize: Int = 10,
/** 菜品名称模糊搜索 */
val keyword: String? = null,
/** 审核状态筛选: 1=待审核 / 2=已通过 / 3=已驳回,不传查全部 */
val auditStatus: Int? = null,
/** 采样日期 yyyy-MM-dd,不传默认当天 */
val sampleDate: String? = null
val pageSize: Int = 10
)
/**
* 采样历史结果条目
* 注意: foodId / auditRecordId 为 Long 类型,服务端序列化为 String
* 已提交采样列表结果条目
* 注意: innovId 为 Long 类型,服务端序列化为 String
*/
data class SampleHistoryItem(
/** 菜品idLong → String */
val foodId: String = "",
/** 菜品编号 */
val foodCode: String = "",
/** 品名称 */
/** 味养创新实验idLong → String */
val innovId: String = "",
/** 实验编号 */
val innovNo: String = "",
/** 品名称 */
val foodName: String = "",
/** 熟重(g) */
val foodWeight: Double = 0.0,
/** 审核状态: 1=待审核 / 2=已通过 / 3=已驳回 */
val auditStatus: Int = 0,
/** 审核状态中文 */
val auditStatusName: String = "",
/** 审核记录idLong → String */
val auditRecordId: String = "",
/** 状态: 1=实验中 / 2=已评测 / 9=已转化 */
val status: Int = 0,
/** 状态中文 */
val statusName: String = "",
/** 提交时间 */
val createTime: String = ""
)
@@ -159,7 +159,7 @@ interface ApiService {
): ApiResponse<FoodCompositionResponse?>
/**
* 提交构成(cookMode 区分采样/制作
* 提交采样(落库味养创新实验,制作模式已废弃本接口
*/
@POST
suspend fun constituteSave(
@@ -168,11 +168,11 @@ interface ApiService {
): ApiResponse<Any?>
/**
* 采样历史(本食堂,默认当天
* 已提交采样列表(本食堂 source=2,按提交时间倒序,不分日期
*/
@POST
suspend fun sampleHistory(
@Url url: String = "${GlobalData.appBaseUrl}/nutrition/neglect/ratio-scale/sample/history",
@Url url: String = "${GlobalData.appBaseUrl}/nutrition/neglect/ratio-scale/sample-list",
@Body request: SampleHistoryRequest
): ApiResponse<MutableList<SampleHistoryItem>?>
@@ -378,7 +378,7 @@ class NetViewModel(
}
/**
* 提交构成(回调版本,cookMode 区分采样/制作
* 提交采样(回调版本,落库味养创新实验,制作模式已废弃本接口
*/
fun constituteSave(
request: ConstituteSaveRequest,
@@ -392,17 +392,13 @@ class NetViewModel(
}
/**
* 采样历史(回调版本
* @param keyword 菜品名称模糊搜索,为 null 时不传该字段
* @param auditStatus 审核状态筛选,为 null 时不传该字段
* @param sampleDate 采样日期 yyyy-MM-dd,为 null 时不传该字段
* 已提交采样列表(回调版本,本食堂 source=2,不分日期
* @param pageNum 页码,默认第 1 页
* @param pageSize 每页条数,默认 10
*/
fun sampleHistory(
pageNum: Int = 1,
pageSize: Int = 10,
keyword: String? = null,
auditStatus: Int? = null,
sampleDate: String? = null,
onLoading: () -> Unit = {},
onResult: (UiState<MutableList<SampleHistoryItem>?>) -> Unit
) {
@@ -411,10 +407,7 @@ class NetViewModel(
onResult(repository.sampleHistory(
SampleHistoryRequest(
pageNum = pageNum,
pageSize = pageSize,
keyword = keyword,
auditStatus = auditStatus,
sampleDate = sampleDate
pageSize = pageSize
)
))
}
@@ -88,11 +88,11 @@ class RemoteRepository {
suspend fun getFoodComposition(foodId: String): UiState<FoodCompositionResponse?> =
safeApiCall { apiService.getFoodComposition(foodId = foodId) }
/** 提交构成(cookMode 区分采样/制作 */
/** 提交采样(落库味养创新实验,制作模式已废弃本接口 */
suspend fun constituteSave(request: ConstituteSaveRequest): UiState<Any?> =
safeApiCall { apiService.constituteSave(request = request) }
/** 采样历史(本食堂,默认当天 */
/** 已提交采样列表(本食堂 source=2,按提交时间倒序,不分日期 */
suspend fun sampleHistory(request: SampleHistoryRequest): UiState<MutableList<SampleHistoryItem>?> =
safeApiCall { apiService.sampleHistory(request = request) }
@@ -153,7 +153,6 @@ class FoodSearchActivity : BaseActivity() {
private fun FoodSearchItem.toFoodRecord(): FoodRecord = FoodRecord(
foodId = foodId,
foodName = foodName,
foodCode = foodCode,
cookMode = 1
)
@@ -281,16 +281,15 @@ class SamplingModeActivity : BaseActivity() {
}
}
/** 采样历史条目 → FoodRecord 映射,供 FoodListAdapter(SAMPLING_MODE) 展示 */
/** 已提交采样列表条目 → FoodRecord 映射,供 FoodListAdapter(SAMPLING_MODE) 展示 */
private fun SampleHistoryItem.toFoodRecord(): FoodRecord = FoodRecord(
foodId = foodId,
foodId = innovId,
foodName = foodName,
foodWeight = foodWeight,
cookMode = 1,
foodCode = foodCode,
auditStatus = auditStatus,
auditStatusName = auditStatusName,
auditRecordId = auditRecordId
innovNo = innovNo,
status = status,
statusName = statusName
)
private fun finishRefresh() {
@@ -313,7 +312,7 @@ class SamplingModeActivity : BaseActivity() {
)
}
emptyViewBinding!!.tvContent.text = "暂无数据"
emptyViewBinding!!.tvSubContent.text = "今日暂无采样数据,点击下方按钮新增采样"
emptyViewBinding!!.tvSubContent.text = "暂无采样数据,点击下方按钮新增采样"
// 方案B:沿用 adapter stateView,使用 FrameLayout.LayoutParams + minimumHeight 避免空态贴顶
emptyViewBinding!!.root.layoutParams = FrameLayout.LayoutParams(
@@ -21,7 +21,6 @@ import com.shuwei.dish.match.dialog.CommonDialog
import com.shuwei.dish.match.dialog.GoodsPreviewDialog
import com.shuwei.dish.match.db.entity.CookFoodEntity
import com.shuwei.dish.match.db.entity.CookFoodGoodsEntity
import com.shuwei.dish.match.model.ConstituteCookMode
import com.shuwei.dish.match.model.ConstituteSaveItem
import com.shuwei.dish.match.model.ConstituteSaveRequest
import com.shuwei.dish.match.model.CookCompleteItem
@@ -459,7 +458,7 @@ class SubmitFoodActivity : BaseActivity() {
return@launch
}
// 采样模式 → 调新配比秤提交构成接口(cookMode=2,从零建菜,进入待审核
// 采样模式 → 调新配比秤提交采样接口(落库味养创新实验,状态=实验中
if (food?.cookMode == 1) {
submitConstitute()
return@launch
@@ -547,8 +546,8 @@ class SubmitFoodActivity : BaseActivity() {
}
/**
* 采样提交:从 goodsList 提取全部构成(主材/辅材/调料),组装 ConstituteSaveRequest 提交
* cookMode=2(采样)熟重 foodWeight 单位为 gisMain 直接取 materialType(1主/2辅/3调)
* 提交采样:从 goodsList 提取全部构成(主材/辅材/调料),组装 ConstituteSaveRequest 提交
* 落库味养创新实验;熟重 foodWeight 单位为 gisMain 直接取 materialType(1主/2辅/3调)
*/
private fun submitConstitute() {
val allGoods = goodsList ?: run {
@@ -591,7 +590,6 @@ class SubmitFoodActivity : BaseActivity() {
}
val request = ConstituteSaveRequest(
cookMode = ConstituteCookMode.SAMPLE,
foodName = foodName,
foodWeight = foodWeight,
items = items