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

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