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/api/service/impl/WcsApiServiceImplTest.java |  265 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 265 insertions(+), 0 deletions(-)

diff --git a/src/test/java/com/zy/api/service/impl/WcsApiServiceImplTest.java b/src/test/java/com/zy/api/service/impl/WcsApiServiceImplTest.java
index 4954f9d..29a4cb5 100644
--- a/src/test/java/com/zy/api/service/impl/WcsApiServiceImplTest.java
+++ b/src/test/java/com/zy/api/service/impl/WcsApiServiceImplTest.java
@@ -1,18 +1,38 @@
 package com.zy.api.service.impl;
 
+import com.zy.api.controller.params.ReassignLocParams;
 import com.zy.api.controller.params.ReceviceTaskParams;
+import com.zy.asrs.entity.BasDevp;
+import com.zy.asrs.entity.LocMast;
+import com.zy.asrs.entity.WrkDetl;
 import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.BasDevpService;
+import com.zy.asrs.service.LocMastService;
 import com.zy.asrs.service.WorkService;
+import com.zy.asrs.service.WrkDetlService;
 import com.zy.asrs.service.WrkMastService;
+import com.zy.common.model.LocTypeDto;
+import com.zy.common.model.StartupDto;
+import com.zy.common.service.CommonService;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.springframework.test.util.ReflectionTestUtils;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -25,6 +45,18 @@
     @Mock
     private WorkService workService;
 
+    @Mock
+    private WrkDetlService wrkDetlService;
+
+    @Mock
+    private LocMastService locMastService;
+
+    @Mock
+    private BasDevpService basDevpService;
+
+    @Mock
+    private CommonService commonService;
+
     private WcsApiServiceImpl service;
 
     @BeforeEach
@@ -32,6 +64,10 @@
         service = new WcsApiServiceImpl();
         ReflectionTestUtils.setField(service, "wrkMastService", wrkMastService);
         ReflectionTestUtils.setField(service, "workService", workService);
+        ReflectionTestUtils.setField(service, "wrkDetlService", wrkDetlService);
+        ReflectionTestUtils.setField(service, "locMastService", locMastService);
+        ReflectionTestUtils.setField(service, "basDevpService", basDevpService);
+        ReflectionTestUtils.setField(service, "commonService", commonService);
     }
 
     @Test
@@ -64,6 +100,174 @@
         verify(wrkMastService).updateById(mast);
     }
 
+    @Test
+    @SuppressWarnings("unchecked")
+    void buildReassignCrnSearchOrder_currentThree_shouldSearchSmallerThenWrapDescending() {
+        List<Integer> result = ReflectionTestUtils.invokeMethod(
+                service, "buildReassignCrnSearchOrder", Arrays.asList(1, 2, 3, 4, 5, 6), 3);
+
+        assertEquals(Arrays.asList(2, 1, 6, 5, 4), result);
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    void buildReassignCrnSearchOrder_currentOne_shouldWrapFromMax() {
+        List<Integer> result = ReflectionTestUtils.invokeMethod(
+                service, "buildReassignCrnSearchOrder", Arrays.asList(1, 2, 3, 4, 5, 6), 1);
+
+        assertEquals(Arrays.asList(6, 5, 4, 3, 2), result);
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    void buildReassignCrnSearchOrder_currentSix_shouldSearchDescending() {
+        List<Integer> result = ReflectionTestUtils.invokeMethod(
+                service, "buildReassignCrnSearchOrder", Arrays.asList(1, 2, 3, 4, 5, 6), 6);
+
+        assertEquals(Arrays.asList(5, 4, 3, 2, 1), result);
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    void buildReassignCrnSearchOrder_nonContinuousPool_shouldKeepDescendingCircularOrder() {
+        List<Integer> result = ReflectionTestUtils.invokeMethod(
+                service, "buildReassignCrnSearchOrder", Arrays.asList(1, 3, 6), 3);
+
+        assertEquals(Arrays.asList(1, 6), result);
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    void buildReassignCrnSearchOrder_singleCurrentCrane_shouldReturnEmpty() {
+        List<Integer> result = ReflectionTestUtils.invokeMethod(
+                service, "buildReassignCrnSearchOrder", Collections.singletonList(3), 3);
+
+        assertEquals(Collections.emptyList(), result);
+    }
+
+    @Test
+    @SuppressWarnings("unchecked")
+    void buildReassignCrnSearchOrder_currentNotInPool_shouldStartFromLargestSmallerCrane() {
+        List<Integer> result = ReflectionTestUtils.invokeMethod(
+                service, "buildReassignCrnSearchOrder", Arrays.asList(1, 4, 6), 3);
+
+        assertEquals(Arrays.asList(1, 6, 4), result);
+    }
+
+    @Test
+    void reassignInboundLoc_currentCraneInFirstPool_shouldUseFirstPoolDescendingOrder() {
+        WrkMast mast = inboundMast(3, "0100101");
+        LocMast currentLoc = loc("0100101", 3, "S");
+        LocMast targetLoc = loc("0200101", 2, "O");
+        StartupDto startupDto = startup("0200101", 2);
+        prepareSuccessfulReassign(mast, currentLoc, targetLoc, station("1,2,3,4,5,6", "7,8"));
+        when(commonService.findRun2InboundLocByCandidateCrnNos(eq(1001), eq(1), anyList(), any(LocTypeDto.class), isNull()))
+                .thenReturn(startupDto);
+
+        service.reassignInboundLoc(reassignParams());
+
+        ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
+        verify(commonService).findRun2InboundLocByCandidateCrnNos(eq(1001), eq(1), captor.capture(), any(LocTypeDto.class), isNull());
+        assertEquals(Arrays.asList(2, 1, 6, 5, 4), captor.getValue());
+    }
+
+    @Test
+    void reassignInboundLoc_currentCraneInSecondPool_shouldUseSecondPoolBeforeFirstPool() {
+        WrkMast mast = inboundMast(5, "0100101");
+        LocMast currentLoc = loc("0100101", 5, "S");
+        LocMast targetLoc = loc("0200101", 4, "O");
+        StartupDto startupDto = startup("0200101", 4);
+        prepareSuccessfulReassign(mast, currentLoc, targetLoc, station("1,2,3", "4,5,6"));
+        when(commonService.findRun2InboundLocByCandidateCrnNos(eq(1001), eq(1), anyList(), any(LocTypeDto.class), isNull()))
+                .thenReturn(startupDto);
+
+        service.reassignInboundLoc(reassignParams());
+
+        ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
+        verify(commonService).findRun2InboundLocByCandidateCrnNos(eq(1001), eq(1), captor.capture(), any(LocTypeDto.class), isNull());
+        assertEquals(Arrays.asList(4, 6), captor.getValue());
+    }
+
+    @Test
+    void reassignInboundLoc_firstPoolNoLocation_shouldFallbackToSecondPool() {
+        WrkMast mast = inboundMast(3, "0100101");
+        LocMast currentLoc = loc("0100101", 3, "S");
+        LocMast targetLoc = loc("0200101", 6, "O");
+        StartupDto startupDto = startup("0200101", 6);
+        prepareSuccessfulReassign(mast, currentLoc, targetLoc, station("1,2,3", "4,5,6"));
+        when(commonService.findRun2InboundLocByCandidateCrnNos(eq(1001), eq(1), anyList(), any(LocTypeDto.class), isNull()))
+                .thenReturn(null)
+                .thenReturn(startupDto);
+
+        service.reassignInboundLoc(reassignParams());
+
+        ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
+        verify(commonService, org.mockito.Mockito.times(2))
+                .findRun2InboundLocByCandidateCrnNos(eq(1001), eq(1), captor.capture(), any(LocTypeDto.class), isNull());
+        assertEquals(Arrays.asList(2, 1), captor.getAllValues().get(0));
+        assertEquals(Arrays.asList(6, 5, 4), captor.getAllValues().get(1));
+    }
+
+    @Test
+    void reassignInboundLoc_emptyPalletDetail_shouldSearchOnlyLevelEight() {
+        WrkMast mast = inboundMast(3, "0100101");
+        LocMast currentLoc = loc("0100101", 3, "S");
+        currentLoc.setLocType1((short) 2);
+        currentLoc.setLocType2((short) 0);
+        currentLoc.setLocType3(null);
+        LocMast targetLoc = loc("0200108", 2, "O");
+        targetLoc.setLev1(8);
+        targetLoc.setLocType1((short) 3);
+        targetLoc.setLocType2((short) 0);
+        StartupDto startupDto = startup("0200108", 2);
+        prepareSuccessfulReassign(mast, currentLoc, targetLoc, station("1,2,3,4,5,6", ""));
+        when(wrkDetlService.selectByWrkNo(7597)).thenReturn(Collections.singletonList(wrkDetl("emptyPallet")));
+        when(commonService.findRun2InboundLocByCandidateCrnNos(eq(1001), eq(1), anyList(), any(LocTypeDto.class), eq(8)))
+                .thenReturn(startupDto);
+
+        service.reassignInboundLoc(reassignParams());
+
+        ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
+        ArgumentCaptor<LocTypeDto> locTypeCaptor = ArgumentCaptor.forClass(LocTypeDto.class);
+        verify(commonService).findRun2InboundLocByCandidateCrnNos(eq(1001), eq(1), captor.capture(), locTypeCaptor.capture(), eq(8));
+        assertEquals(Arrays.asList(2, 1, 6, 5, 4), captor.getValue());
+        assertEquals(Short.valueOf((short) 3), locTypeCaptor.getValue().getLocType1());
+        assertEquals(Short.valueOf((short) 0), locTypeCaptor.getValue().getLocType2());
+    }
+
+    @Test
+    void reassignInboundLoc_emptyMasterFlagWithoutEmptyPalletDetail_shouldNotForceLevelEight() {
+        WrkMast mast = inboundMast(3, "0100101");
+        mast.setIoType(10);
+        mast.setEmptyMk("Y");
+        LocMast currentLoc = loc("0100101", 3, "S");
+        LocMast targetLoc = loc("0200101", 2, "O");
+        StartupDto startupDto = startup("0200101", 2);
+        prepareSuccessfulReassign(mast, currentLoc, targetLoc, station("1,2,3,4,5,6", ""));
+        when(wrkDetlService.selectByWrkNo(7597)).thenReturn(Collections.singletonList(wrkDetl("MAT-001")));
+        when(commonService.findRun2InboundLocByCandidateCrnNos(eq(1001), eq(10), anyList(), any(LocTypeDto.class), isNull()))
+                .thenReturn(startupDto);
+
+        service.reassignInboundLoc(reassignParams());
+
+        verify(commonService).findRun2InboundLocByCandidateCrnNos(eq(1001), eq(10), anyList(), any(LocTypeDto.class), isNull());
+    }
+
+    @Test
+    void reassignInboundLoc_currentCraneNotInAnyPool_shouldNotSearchLocation() {
+        WrkMast mast = inboundMast(3, "0100101");
+        LocMast currentLoc = loc("0100101", 3, "S");
+        when(wrkMastService.selectOne(any())).thenReturn(mast);
+        when(locMastService.selectById("0100101")).thenReturn(currentLoc);
+        when(basDevpService.selectById(1001)).thenReturn(station("1,2", "4,5"));
+
+        Object result = service.reassignInboundLoc(reassignParams());
+
+        assertNotNull(result);
+        verify(commonService, never())
+                .findRun2InboundLocByCandidateCrnNos(any(), any(), anyList(), any(LocTypeDto.class), any());
+    }
+
     private static WrkMast outboundMast(Long wrkSts) {
         WrkMast mast = new WrkMast();
         mast.setWrkNo(7597);
@@ -71,4 +275,65 @@
         mast.setWrkSts(wrkSts);
         return mast;
     }
+
+    private static WrkMast inboundMast(Integer crnNo, String locNo) {
+        WrkMast mast = new WrkMast();
+        mast.setWrkNo(7597);
+        mast.setIoType(1);
+        mast.setWrkSts(2L);
+        mast.setCrnNo(crnNo);
+        mast.setLocNo(locNo);
+        mast.setSourceStaNo(1001);
+        mast.setBarcode("BC-001");
+        return mast;
+    }
+
+    private static LocMast loc(String locNo, Integer crnNo, String locSts) {
+        LocMast locMast = new LocMast();
+        locMast.setLocNo(locNo);
+        locMast.setCrnNo(crnNo);
+        locMast.setLocSts(locSts);
+        locMast.setLocType1((short) 1);
+        locMast.setLocType2((short) 2);
+        locMast.setLocType3((short) 1);
+        return locMast;
+    }
+
+    private static BasDevp station(String firstCrnCsv, String secondCrnCsv) {
+        BasDevp station = new BasDevp();
+        station.setDevNo(1001);
+        station.setInFirstCrnCsv(firstCrnCsv);
+        station.setInSecondCrnCsv(secondCrnCsv);
+        return station;
+    }
+
+    private static StartupDto startup(String locNo, Integer crnNo) {
+        StartupDto startupDto = new StartupDto();
+        startupDto.setLocNo(locNo);
+        startupDto.setCrnNo(crnNo);
+        startupDto.setStaNo(2001);
+        return startupDto;
+    }
+
+    private static WrkDetl wrkDetl(String matnr) {
+        WrkDetl wrkDetl = new WrkDetl();
+        wrkDetl.setWrkNo(7597);
+        wrkDetl.setMatnr(matnr);
+        return wrkDetl;
+    }
+
+    private static ReassignLocParams reassignParams() {
+        ReassignLocParams params = new ReassignLocParams();
+        params.setTaskNo("7597");
+        return params;
+    }
+
+    private void prepareSuccessfulReassign(WrkMast mast, LocMast currentLoc, LocMast targetLoc, BasDevp station) {
+        when(wrkMastService.selectOne(any())).thenReturn(mast);
+        when(locMastService.selectById(currentLoc.getLocNo())).thenReturn(currentLoc);
+        when(locMastService.selectById(targetLoc.getLocNo())).thenReturn(targetLoc);
+        when(locMastService.updateById(any(LocMast.class))).thenReturn(true);
+        when(wrkMastService.updateById(mast)).thenReturn(true);
+        when(basDevpService.selectById(mast.getSourceStaNo())).thenReturn(station);
+    }
 }

--
Gitblit v1.9.1