Browse Source

排除列表中的下架商品

为指定商品列表和门店商品卡片增加下架状态过滤,并补充查询条件回归测试。
qmj 1 day ago
parent
commit
f3df396f01

+ 1 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/mendian/PosFoodController.java

@@ -165,6 +165,7 @@ public class PosFoodController extends BaseController {
         if("0".equals(user.getUserType())){
             queryWrapper.eq("to_examine", "1");
         }
+        queryWrapper.ne("stacking_up", "1");
         if (stackingUp != null && !"".equals(stackingUp)) {
             queryWrapper.eq("stacking_up", stackingUp);
         }

+ 71 - 0
ruoyi-admin/src/test/java/com/ruoyi/app/mendian/PosFoodControllerShelfFilterTest.java

@@ -0,0 +1,71 @@
+package com.ruoyi.app.mendian;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.common.utils.MessageUtils;
+import com.ruoyi.system.domain.InfoUser;
+import com.ruoyi.system.domain.PosFood;
+import com.ruoyi.system.service.IInfoUserService;
+import com.ruoyi.system.service.IPosFoodService;
+import com.ruoyi.system.utils.JwtUtil;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockedStatic;
+import org.mockito.MockitoAnnotations;
+
+import java.util.Collections;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+class PosFoodControllerShelfFilterTest {
+
+    @Mock
+    private IPosFoodService posFoodService;
+
+    @Mock
+    private IInfoUserService infoUserService;
+
+    @InjectMocks
+    private PosFoodController controller;
+
+    private AutoCloseable mocks;
+    private MockedStatic<MessageUtils> messages;
+
+    @BeforeEach
+    void setUp() {
+        mocks = MockitoAnnotations.openMocks(this);
+        messages = org.mockito.Mockito.mockStatic(MessageUtils.class);
+        messages.when(() -> MessageUtils.message(anyString()))
+                .thenAnswer(invocation -> invocation.getArgument(0));
+    }
+
+    @AfterEach
+    void tearDown() throws Exception {
+        messages.close();
+        mocks.close();
+    }
+
+    @Test
+    void getidlistExcludesOffShelfFoodsWhenNoShelfFilterIsProvided() {
+        InfoUser user = new InfoUser();
+        user.setUserType("0");
+        when(infoUserService.getById("101")).thenReturn(user);
+        when(posFoodService.list(any(QueryWrapper.class))).thenReturn(Collections.emptyList());
+
+        controller.getidlist(JwtUtil.token("101", "customer"), 9, "", null, null);
+
+        @SuppressWarnings("unchecked")
+        ArgumentCaptor<QueryWrapper<PosFood>> queryCaptor = ArgumentCaptor.forClass(QueryWrapper.class);
+        verify(posFoodService).list(queryCaptor.capture());
+        QueryWrapper<PosFood> query = queryCaptor.getValue();
+        assertTrue(query.getSqlSegment().contains("stacking_up <>"));
+        assertTrue(query.getParamNameValuePairs().containsValue("1"));
+    }
+}

+ 2 - 1
ruoyi-system/src/main/java/com/ruoyi/system/mapper/PosFoodMapper.java

@@ -87,8 +87,9 @@ public interface PosFoodMapper  extends BaseMapper<PosFood>
             "  #{storeId}" +
             "</foreach>" +
             "AND f.to_examine = '1' " +
+            "AND f.stacking_up &lt;&gt; '1' " +
             "AND f.language = #{language} " +
-            "AND (SELECT COUNT(*) FROM pos_food f2 WHERE f2.mdid = f.mdid AND f2.id &gt; f.id AND f2.to_examine = '1' AND f2.language = #{language}) &lt; #{limitPerStore} " +
+            "AND (SELECT COUNT(*) FROM pos_food f2 WHERE f2.mdid = f.mdid AND f2.id &gt; f.id AND f2.to_examine = '1' AND f2.stacking_up &lt;&gt; '1' AND f2.language = #{language}) &lt; #{limitPerStore} " +
             "ORDER BY f.mdid, f.id DESC" +
             "</script>")
     List<PosFood> selectFoodsByStoreIdsWithLimit(@Param("storeIds") List<Long> storeIds,

+ 34 - 0
ruoyi-system/src/test/java/com/ruoyi/system/mapper/PosFoodMapperSqlTest.java

@@ -0,0 +1,34 @@
+package com.ruoyi.system.mapper;
+
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.session.Configuration;
+import org.junit.jupiter.api.Test;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class PosFoodMapperSqlTest {
+
+    @Test
+    void storeCardFoodsExcludeOffShelfFoodsWithoutReducingAvailableLimit() {
+        Configuration configuration = new Configuration();
+        configuration.addMapper(PosFoodMapper.class);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("storeIds", List.of(10L));
+        parameters.put("language", "3");
+        parameters.put("limitPerStore", 6);
+
+        BoundSql boundSql = configuration
+                .getMappedStatement("com.ruoyi.system.mapper.PosFoodMapper.selectFoodsByStoreIdsWithLimit")
+                .getBoundSql(parameters);
+        String sql = boundSql.getSql().replaceAll("\\s+", " ").toUpperCase(Locale.ROOT);
+
+        assertTrue(sql.contains("F.STACKING_UP <> '1'"));
+        assertTrue(sql.contains("F2.STACKING_UP <> '1'"));
+    }
+}