Преглед на файлове

搜索与商品列表端点规格改为关联表来源(补漏)

/searchfor 与 /getfoodlist 两处无条件读 pos_food.food_sku,一并改为
loadFoodSpecsMap+buildFoodSkuArray,至此 PosFoodController 全部规格
读取统一为 food_spec_relation 唯一源(FR-038)。
qmj преди 4 дни
родител
ревизия
3591d1eb39
променени са 2 файла, в които са добавени 9 реда и са изтрити 2 реда
  1. 8 2
      ruoyi-admin/src/main/java/com/ruoyi/app/mendian/PosFoodController.java
  2. 1 0
      specs/008-promotion-coupon/tasks.md

+ 8 - 2
ruoyi-admin/src/main/java/com/ruoyi/app/mendian/PosFoodController.java

@@ -317,6 +317,9 @@ public class PosFoodController extends BaseController {
 //        query.like("name",keyword);
         query.apply("BINARY name LIKE CONCAT('%', {0}, '%')", keyword);
         List<PosFood> folist = posFoodService.list(query);
+        // 2026-10-19 统一口径:规格唯一来源 food_spec_relation(与菜单/详情一致)
+        Map<Long, List<FoodSpecs>> __specMap = loadFoodSpecsMap(
+                folist.stream().map(PosFood::getId).collect(Collectors.toList()));
         QueryWrapper<PosStore> wrapper = new QueryWrapper<>();
         wrapper.eq("off_shelf", "0")
 //                .and(i->i.like("pos_name", keyword).or().like("brief_introduction",keyword));
@@ -335,7 +338,7 @@ public class PosFoodController extends BaseController {
                 org.put("introduce", folist.get(i).getIntroduce());
                 org.put("recommend", folist.get(i).getRecommend());
                 org.put("stackingUp", folist.get(i).getStackingUp());
-                org.put("foodSku", JSONArray.parseArray(folist.get(i).getFoodSku()));
+                org.put("foodSku", buildFoodSkuArray(__specMap.getOrDefault(folist.get(i).getId(), new ArrayList<>())));
                 all.add(org);
             }
         }
@@ -550,6 +553,9 @@ public class PosFoodController extends BaseController {
         }
         IPage<PosFood> list = posFoodService.page(food, queryWrapper);
         List<PosFood> foodlist = list.getRecords();
+        // 2026-10-19 统一口径:规格唯一来源 food_spec_relation(与菜单/详情一致)
+        Map<Long, List<FoodSpecs>> __specMap = loadFoodSpecsMap(
+                foodlist.stream().map(PosFood::getId).collect(Collectors.toList()));
         JSONArray all = new JSONArray();
         for (int i = 0; i < foodlist.size(); i++) {
             PosStore store = posStoreService.getById(foodlist.get(i).getMdid());
@@ -564,7 +570,7 @@ public class PosFoodController extends BaseController {
                 org.put("introduce", foodlist.get(i).getIntroduce());
                 org.put("recommend", foodlist.get(i).getRecommend());
                 org.put("stackingUp", foodlist.get(i).getStackingUp());
-                org.put("foodSku", JSONArray.parseArray(foodlist.get(i).getFoodSku()));
+                org.put("foodSku", buildFoodSkuArray(__specMap.getOrDefault(foodlist.get(i).getId(), new ArrayList<>())));
                 all.add(org);
             }
         }

+ 1 - 0
specs/008-promotion-coupon/tasks.md

@@ -442,6 +442,7 @@
 
 - [x] 修正报价 to_examine 反写('1'=审核通过可售,与菜单 eq 口径一致)并补待审核拒绝用例;036 报价服务存在同款反写,属并行会话暂停代码,恢复时另修。
 - [x] 统一规格唯一源 food_spec_relation:PosFoodController 去掉三处“关联为空回退读 food_sku”;报价 resolveSpecSurcharge 公共化;订单 buildServerFoodJson 加价同源调用。
+- [x] 联调复查补漏:/searchfor 与 /getfoodlist 两处无条件读 food_sku 的端点一并改为 loadFoodSpecsMap 关联源(2026-10-19 追加)。
 - [x] 回填脚本 updatesql/backfill_food_spec_relation.py(幂等:缺组/缺值按 JSON 建,缺关联补建);测试库已执行(9078/9115 等 18 条关联入表);**生产执行前不得部署去回退版本**。
 - [x] invalidProduct/invalidSpec 六语言文案带商品ID(商品[9115]无效或不属于该门店)。
 - [x] 定向测试与相关回归通过;提交并同步 test-202609v2。