From 611118f04720931e31f87ae5d395318c4085db5e Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期一, 27 四月 2026 23:40:38 +0800
Subject: [PATCH] 1.双伸空托盘入库规则完善 2.完善双伸只找一边的问题 3.完善重新分配库位问题

---
 src/test/java/com/zy/common/service/CommonServiceDoubleExtensionSameGoodsTest.java |  143 +++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 136 insertions(+), 7 deletions(-)

diff --git a/src/test/java/com/zy/common/service/CommonServiceDoubleExtensionSameGoodsTest.java b/src/test/java/com/zy/common/service/CommonServiceDoubleExtensionSameGoodsTest.java
index 8feda4e..d4ed597 100644
--- a/src/test/java/com/zy/common/service/CommonServiceDoubleExtensionSameGoodsTest.java
+++ b/src/test/java/com/zy/common/service/CommonServiceDoubleExtensionSameGoodsTest.java
@@ -19,7 +19,9 @@
 
 import java.lang.reflect.Constructor;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.LinkedHashMap;
+import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
@@ -80,25 +82,135 @@
     }
 
     @Test
-    void doubleExtension_shouldFallBackWhenSameStandby1DeepLocHasNoEmptyShallowPartner() {
+    void doubleExtension_shouldReturnShallowLocWhenDeepLocContainsEmptyPallet() {
         RowLastno rowLastno = buildRowLastno();
         CrnDepthRuleProfile profile = buildDoubleExtensionProfile();
         when(basCrnDepthRuleService.resolveProfile(rowLastno, 1, 2)).thenReturn(profile);
 
+        LocMast deepLoc = buildLoc("D-002", 1, 1, 1, "F", 1);
+        LocMast shallowLoc = buildLoc("S-002", 2, 1, 1, "O", 1);
+        LocDetl deepDetl = buildDetl("D-002", "PO-002");
+        deepDetl.setMatnr("emptyPallet");
+
+        when(locMastService.selectList(any())).thenReturn(Arrays.asList(deepLoc));
+        when(locDetlService.selectList(any())).thenReturn(Arrays.asList(deepDetl));
+        when(locMastService.selectOne(any())).thenReturn(shallowLoc);
+
+        FindLocNoAttributeVo attributeVo = buildAttributeVo("PO-002");
+        attributeVo.setMatnr("emptyPallet");
+
+        LocMast result = ReflectionTestUtils.invokeMethod(commonService, "findConfiguredEmptyLocForCrn",
+                rowLastno, buildRowLastnoType(), 1, 2, null, attributeVo, false);
+
+        assertEquals("S-002", result.getLocNo());
+        assertEquals(Integer.valueOf(2), result.getRow1());
+        assertEquals("O", result.getLocSts());
+    }
+
+    @Test
+    void orderDoubleExtensionShallowRows_shouldPreferLessLoadedPair() {
+        RowLastno rowLastno = buildRowLastno();
+        CrnDepthRuleProfile profile = buildDoubleExtensionTwoPairProfile();
+        when(locMastService.selectCount(any())).thenReturn(2, 2, 0, 0);
+
+        @SuppressWarnings("unchecked")
+        List<Integer> orderedRows = ReflectionTestUtils.invokeMethod(commonService, "orderDoubleExtensionShallowRows",
+                rowLastno, buildRowLastnoType(), 1, profile);
+
+        assertEquals(Arrays.asList(3, 2), orderedRows);
+    }
+
+    @Test
+    void orderDoubleExtensionShallowRows_shouldRotateEqualLoadPairByCurrentRow() {
+        RowLastno rowLastno = buildRowLastno();
+        CrnDepthRuleProfile profile = buildDoubleExtensionTwoPairProfile();
+        when(locMastService.selectCount(any())).thenReturn(1, 1, 1, 1);
+
+        @SuppressWarnings("unchecked")
+        List<Integer> orderedRows = ReflectionTestUtils.invokeMethod(commonService, "orderDoubleExtensionShallowRows",
+                rowLastno, buildRowLastnoType(), 1, profile);
+
+        assertEquals(Arrays.asList(3, 2), orderedRows);
+    }
+
+    @Test
+    void doubleExtension_shouldSwitchPairAfterReservationLoadIncreases() {
+        RowLastno rowLastno = buildRowLastno();
+        CrnDepthRuleProfile profile = buildDoubleExtensionTwoPairProfile();
+        when(basCrnDepthRuleService.resolveProfile(rowLastno, 1, 2)).thenReturn(profile);
+
+        when(locMastService.selectCount(any())).thenReturn(
+                1, 1, 1, 1,
+                1, 1, 1, 2);
+        LocMast firstPairShallowLoc = buildLoc("S-003", 3, 1, 1, "O", 1);
+        LocMast firstPairDeepLoc = buildLoc("D-004", 4, 1, 1, "O", 1);
+        LocMast secondPairShallowLoc = buildLoc("S-002", 2, 1, 1, "O", 1);
+        LocMast secondPairDeepLoc = buildLoc("D-001", 1, 1, 1, "O", 1);
+        when(locMastService.selectList(any())).thenReturn(
+                Arrays.asList(firstPairShallowLoc),
+                Arrays.asList(secondPairShallowLoc));
+        when(locMastService.selectOne(any())).thenReturn(firstPairDeepLoc, secondPairDeepLoc);
+
+        FindLocNoAttributeVo attributeVo = new FindLocNoAttributeVo();
+        LocMast firstResult = ReflectionTestUtils.invokeMethod(commonService, "findConfiguredEmptyLocForCrn",
+                rowLastno, buildRowLastnoType(), 1, 2, null, attributeVo, false);
+        LocMast secondResult = ReflectionTestUtils.invokeMethod(commonService, "findConfiguredEmptyLocForCrn",
+                rowLastno, buildRowLastnoType(), 1, 2, null, attributeVo, false);
+
+        assertEquals("D-004", firstResult.getLocNo());
+        assertEquals(Integer.valueOf(4), firstResult.getRow1());
+        assertEquals("D-001", secondResult.getLocNo());
+        assertEquals(Integer.valueOf(1), secondResult.getRow1());
+    }
+
+    @Test
+    void doubleExtension_shouldUseLessLoadedPairFirstWhenBothSidesAreOpen() {
+        RowLastno rowLastno = buildRowLastno();
+        CrnDepthRuleProfile profile = buildDoubleExtensionTwoPairProfile();
+        when(basCrnDepthRuleService.resolveProfile(rowLastno, 1, 2)).thenReturn(profile);
+
+        when(locMastService.selectCount(any())).thenReturn(2, 2, 0, 0);
+        LocMast openShallowLoc = buildLoc("S-003", 3, 1, 1, "O", 1);
+        LocMast openDeepLoc = buildLoc("D-004", 4, 1, 1, "O", 1);
+        when(locMastService.selectList(any())).thenReturn(
+                Collections.<LocMast>emptyList(),
+                Collections.<LocMast>emptyList(),
+                Arrays.asList(openShallowLoc));
+        when(locMastService.selectOne(any())).thenReturn(openDeepLoc);
+
+        FindLocNoAttributeVo attributeVo = buildAttributeVo("PO-003");
+
+        LocMast result = ReflectionTestUtils.invokeMethod(commonService, "findConfiguredEmptyLocForCrn",
+                rowLastno, buildRowLastnoType(), 1, 2, null, attributeVo, false);
+
+        assertEquals("D-004", result.getLocNo());
+        assertEquals(Integer.valueOf(4), result.getRow1());
+        assertEquals("O", result.getLocSts());
+    }
+
+    @Test
+    void doubleExtension_shouldFallBackWhenSameStandby1DeepLocHasNoEmptyShallowPartner() {
+        RowLastno rowLastno = buildRowLastno();
+        CrnDepthRuleProfile profile = buildDoubleExtensionTwoPairProfile();
+        when(basCrnDepthRuleService.resolveProfile(rowLastno, 1, 2)).thenReturn(profile);
+
         LocMast sameGoodsDeepLoc = buildLoc("D-001", 1, 1, 1, "F", 1);
-        LocMast genericShallowLoc = buildLoc("S-002", 2, 2, 1, "O", 1);
-        LocMast genericDeepFallbackLoc = buildLoc("D-002", 1, 2, 1, "F", 1);
+        LocMast genericShallowLoc = buildLoc("S-003", 3, 1, 1, "O", 1);
+        LocMast genericDeepFallbackLoc = buildLoc("D-004", 4, 1, 1, "O", 1);
         LocDetl deepDetl = buildDetl("D-001", "PO-001");
 
-        when(locMastService.selectList(any())).thenReturn(Arrays.asList(sameGoodsDeepLoc), Arrays.asList(genericShallowLoc));
+        when(locMastService.selectList(any())).thenReturn(
+                Collections.<LocMast>emptyList(),
+                Arrays.asList(sameGoodsDeepLoc),
+                Arrays.asList(genericShallowLoc));
         when(locDetlService.selectList(any())).thenReturn(Arrays.asList(deepDetl));
-        when(locMastService.selectOne(any())).thenReturn(null, null, genericDeepFallbackLoc);
+        when(locMastService.selectOne(any())).thenReturn(null, genericDeepFallbackLoc);
 
         LocMast result = ReflectionTestUtils.invokeMethod(commonService, "findConfiguredEmptyLocForCrn",
                 rowLastno, buildRowLastnoType(), 1, 2, null, buildAttributeVo("PO-001"), false);
 
-        assertEquals("S-002", result.getLocNo());
-        assertEquals(Integer.valueOf(2), result.getRow1());
+        assertEquals("D-004", result.getLocNo());
+        assertEquals(Integer.valueOf(4), result.getRow1());
         assertEquals("O", result.getLocSts());
     }
 
@@ -152,6 +264,23 @@
         return profile;
     }
 
+    private CrnDepthRuleProfile buildDoubleExtensionTwoPairProfile() {
+        CrnDepthRuleProfile profile = new CrnDepthRuleProfile();
+        profile.setLayoutType(2);
+        profile.setSearchRows(Arrays.asList(2, 3, 1, 4));
+        profile.setShallowRows(Arrays.asList(2, 3));
+        profile.setDeepRows(Arrays.asList(1, 4));
+        LinkedHashMap<Integer, Integer> shallowToDeep = new LinkedHashMap<Integer, Integer>();
+        shallowToDeep.put(2, 1);
+        shallowToDeep.put(3, 4);
+        LinkedHashMap<Integer, Integer> deepToShallow = new LinkedHashMap<Integer, Integer>();
+        deepToShallow.put(1, 2);
+        deepToShallow.put(4, 3);
+        profile.setShallowToDeepRow(shallowToDeep);
+        profile.setDeepToShallowRow(deepToShallow);
+        return profile;
+    }
+
     private CrnDepthRuleProfile buildSingleExtensionProfile() {
         CrnDepthRuleProfile profile = new CrnDepthRuleProfile();
         profile.setLayoutType(1);

--
Gitblit v1.9.1