| | |
| | | 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; |
| | |
| | | @Mock |
| | | private BasDualCrnpService basDualCrnpService; |
| | | @Mock |
| | | private StationFlowCapacityService stationFlowCapacityService; |
| | | @Mock |
| | | private WrkMastService wrkMastService; |
| | | @Mock |
| | | private RedisUtil redisUtil; |
| | |
| | | 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); |
| | |
| | | } |
| | | |
| | | @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"))); |
| | | |
| | |
| | | List<AiAutoTuneChange> changes = savedChanges(); |
| | | assertEquals("rejected", changes.get(0).getResultStatus()); |
| | | assertTrue(changes.get(0).getRejectReason().contains("需要人工先初始化为有限值")); |
| | | verify(stationFlowCapacityService, never()).getOne(any(Wrapper.class)); |
| | | } |
| | | |
| | | @Test |
| | |
| | | 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"))); |
| | | |
| | |
| | | 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 |
| | |
| | | @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"), |
| | |
| | | @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)); |
| | | |
| | |
| | | } |
| | | |
| | | 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; |
| | | } |
| | | |
| | |
| | | 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, |