#
Junjie
9 天以前 dc3f9cc91759823ce59486f19b138be4b296a0f1
src/test/java/com/zy/ai/service/AutoTuneApplyServiceImplTest.java
@@ -10,12 +10,10 @@
import com.zy.asrs.entity.BasCrnp;
import com.zy.asrs.entity.BasDualCrnp;
import com.zy.asrs.entity.BasStation;
import com.zy.asrs.entity.StationFlowCapacity;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.BasCrnpService;
import com.zy.asrs.service.BasDualCrnpService;
import com.zy.asrs.service.BasStationService;
import com.zy.asrs.service.StationFlowCapacityService;
import com.zy.asrs.service.WrkMastService;
import com.zy.common.utils.RedisUtil;
import com.zy.core.enums.RedisKeyType;
@@ -79,8 +77,6 @@
    @Mock
    private BasDualCrnpService basDualCrnpService;
    @Mock
    private StationFlowCapacityService stationFlowCapacityService;
    @Mock
    private WrkMastService wrkMastService;
    @Mock
    private RedisUtil redisUtil;
@@ -96,7 +92,6 @@
        ReflectionTestUtils.setField(service, "basStationService", basStationService);
        ReflectionTestUtils.setField(service, "basCrnpService", basCrnpService);
        ReflectionTestUtils.setField(service, "basDualCrnpService", basDualCrnpService);
        ReflectionTestUtils.setField(service, "stationFlowCapacityService", stationFlowCapacityService);
        ReflectionTestUtils.setField(service, "wrkMastService", wrkMastService);
        ReflectionTestUtils.setField(service, "transactionManager", transactionManager);
        ReflectionTestUtils.setField(service, "redisUtil", redisUtil);
@@ -168,41 +163,78 @@
    }
    @Test
    void rejectCrnOutBatchRunningLimitRangeAndStepCases() {
    void crnOutBatchRunningLimitAllowsStepThreeAndRejectsRangeAndStepCases() {
        when(configService.getOne(any(Wrapper.class))).thenReturn(config("crnOutBatchRunningLimit", "10"));
        service.apply(request(true,
                command("sys_config", null, "crnOutBatchRunningLimit", "13"),
                command("sys_config", null, "crnOutBatchRunningLimit", "14"),
                command("sys_config", null, "crnOutBatchRunningLimit", "21")
        ));
        List<AiAutoTuneChange> changes = savedChanges();
        assertEquals("rejected", changes.get(0).getResultStatus());
        assertTrue(changes.get(0).getRejectReason().contains("步长不能超过 2"));
        assertEquals("dry_run", changes.get(0).getResultStatus());
        assertEquals("13", changes.get(0).getRequestedValue());
        assertEquals("rejected", changes.get(1).getResultStatus());
        assertTrue(changes.get(1).getRejectReason().contains("1~20"));
        assertTrue(changes.get(1).getRejectReason().contains("步长不能超过 3"));
        assertEquals("rejected", changes.get(2).getResultStatus());
        assertTrue(changes.get(2).getRejectReason().contains("1~20"));
    }
    @Test
    void rejectMaxInTaskRangeAndStepCases() {
    void maxInTaskAllowsStepThreeAndRejectsRangeAndStepCases() {
        when(basCrnpService.getById(1)).thenReturn(crn(1, 1, 5));
        service.apply(request(true,
                command("crn", "1", "maxInTask", "7"),
                command("crn", "1", "maxInTask", "8"),
                command("crn", "1", "maxInTask", "9"),
                command("crn", "1", "maxInTask", "11")
        ));
        List<AiAutoTuneChange> changes = savedChanges();
        assertEquals("rejected", changes.get(0).getResultStatus());
        assertTrue(changes.get(0).getRejectReason().contains("步长不能超过 1"));
        assertEquals("dry_run", changes.get(0).getResultStatus());
        assertEquals("8", changes.get(0).getRequestedValue());
        assertEquals("rejected", changes.get(1).getResultStatus());
        assertTrue(changes.get(1).getRejectReason().contains("0~10"));
        assertTrue(changes.get(1).getRejectReason().contains("步长不能超过 3"));
        assertEquals("rejected", changes.get(2).getResultStatus());
        assertTrue(changes.get(2).getRejectReason().contains("0~10"));
    }
    @Test
    void maxOutTaskAllowsStepThreeAndRejectsStepFour() {
        when(basCrnpService.getById(1)).thenReturn(crn(1, 1, 1));
        service.apply(request(true,
                command("crn", "1", "maxOutTask", "4"),
                command("crn", "1", "maxOutTask", "5")
        ));
        List<AiAutoTuneChange> changes = savedChanges();
        assertEquals("dry_run", changes.get(0).getResultStatus());
        assertEquals("4", changes.get(0).getRequestedValue());
        assertEquals("rejected", changes.get(1).getResultStatus());
        assertTrue(changes.get(1).getRejectReason().contains("步长不能超过 3"));
    }
    @Test
    void dualCrnMaxOutTaskAllowsStepThreeAndRejectsStepFour() {
        when(basDualCrnpService.getById(2)).thenReturn(dualCrn(2, 1, 1));
        service.apply(request(true,
                command("dual_crn", "2", "maxOutTask", "4"),
                command("dual_crn", "2", "maxOutTask", "5")
        ));
        List<AiAutoTuneChange> changes = savedChanges();
        assertEquals("dry_run", changes.get(0).getResultStatus());
        assertEquals("4", changes.get(0).getRequestedValue());
        assertEquals("rejected", changes.get(1).getResultStatus());
        assertTrue(changes.get(1).getRejectReason().contains("步长不能超过 3"));
    }
    @Test
    void rejectStationOutTaskLimitAboveDirectionalBufferCapacity() {
        when(basStationService.getById(101)).thenReturn(station(101, 1));
        when(stationFlowCapacityService.getOne(any(Wrapper.class))).thenReturn(capacity(101, "OUT", 2));
        when(basStationService.getById(101)).thenReturn(station(101, 1, 2));
        service.apply(request(true, command("station", "101", "outTaskLimit", "3")));
@@ -220,7 +252,6 @@
        List<AiAutoTuneChange> changes = savedChanges();
        assertEquals("rejected", changes.get(0).getResultStatus());
        assertTrue(changes.get(0).getRejectReason().contains("需要人工先初始化为有限值"));
        verify(stationFlowCapacityService, never()).getOne(any(Wrapper.class));
    }
    @Test
@@ -232,13 +263,11 @@
        List<AiAutoTuneChange> changes = savedChanges();
        assertEquals("rejected", changes.get(0).getResultStatus());
        assertTrue(changes.get(0).getRejectReason().contains("需要人工先初始化为有限值"));
        verify(stationFlowCapacityService, never()).getOne(any(Wrapper.class));
    }
    @Test
    void allowStationOutTaskLimitZeroToOneAsFiniteStep() {
        when(basStationService.getById(101)).thenReturn(station(101, 0));
        when(stationFlowCapacityService.getOne(any(Wrapper.class))).thenReturn(capacity(101, "OUT", 1));
        when(basStationService.getById(101)).thenReturn(station(101, 0, 1));
        AutoTuneApplyResult result = service.apply(request(true, command("station", "101", "outTaskLimit", "1")));
@@ -247,6 +276,17 @@
        assertEquals("dry_run", changes.get(0).getResultStatus());
        assertEquals("0", changes.get(0).getOldValue());
        assertEquals("1", changes.get(0).getRequestedValue());
    }
    @Test
    void rejectStationOutTaskLimitWithoutOutBufferCapacity() {
        when(basStationService.getById(101)).thenReturn(station(101, 0));
        service.apply(request(true, command("station", "101", "outTaskLimit", "1")));
        List<AiAutoTuneChange> changes = savedChanges();
        assertEquals("rejected", changes.get(0).getResultStatus());
        assertTrue(changes.get(0).getRejectReason().contains("缺少 outBufferCapacity"));
    }
    @Test
@@ -267,8 +307,7 @@
    @Test
    void realMixedValidAndInvalidBatchRejectsAndDoesNotWriteTargets() {
        when(configService.getOne(any(Wrapper.class))).thenReturn(config("conveyorStationTaskLimit", "10"));
        when(basStationService.getById(101)).thenReturn(station(101, 1));
        when(stationFlowCapacityService.getOne(any(Wrapper.class))).thenReturn(capacity(101, "OUT", 2));
        when(basStationService.getById(101)).thenReturn(station(101, 1, 2));
        AutoTuneApplyResult result = service.apply(request(false,
                command("sys_config", null, "conveyorStationTaskLimit", "15"),
@@ -376,8 +415,7 @@
    @Test
    void applyMixedBatchSuccessfully() {
        when(configService.getOne(any(Wrapper.class))).thenReturn(config("conveyorStationTaskLimit", "10"));
        when(basStationService.getById(101)).thenReturn(station(101, 1));
        when(stationFlowCapacityService.getOne(any(Wrapper.class))).thenReturn(capacity(101, "OUT", 2));
        when(basStationService.getById(101)).thenReturn(station(101, 1, 2));
        when(basCrnpService.getById(1)).thenReturn(crn(1, 1, 1));
        when(basDualCrnpService.getById(2)).thenReturn(dualCrn(2, 1, 1));
@@ -789,9 +827,14 @@
    }
    private BasStation station(Integer stationId, Integer outTaskLimit) {
        return station(stationId, outTaskLimit, null);
    }
    private BasStation station(Integer stationId, Integer outTaskLimit, Integer outBufferCapacity) {
        BasStation station = new BasStation();
        station.setStationId(stationId);
        station.setOutTaskLimit(outTaskLimit);
        station.setOutBufferCapacity(outBufferCapacity);
        return station;
    }
@@ -809,14 +852,6 @@
        dualCrnp.setMaxOutTask(maxOutTask);
        dualCrnp.setMaxInTask(maxInTask);
        return dualCrnp;
    }
    private StationFlowCapacity capacity(Integer stationId, String directionCode, Integer bufferCapacity) {
        StationFlowCapacity capacity = new StationFlowCapacity();
        capacity.setStationId(stationId);
        capacity.setDirectionCode(directionCode);
        capacity.setBufferCapacity(bufferCapacity);
        return capacity;
    }
    private AiAutoTuneChange successChange(Long jobId,