feat: observe inbound allocation without changing legacy
This commit is contained in:
@@ -6,6 +6,8 @@ import cn.hutool.core.date.DateUtil;
|
|||||||
import cn.hutool.core.util.ObjUtil;
|
import cn.hutool.core.util.ObjUtil;
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
|
import com.ruoyi.algorithm.shadow.InboundShadowObservation;
|
||||||
|
import com.ruoyi.algorithm.shadow.ShadowObservationGateway;
|
||||||
import com.ruoyi.api.domain.*;
|
import com.ruoyi.api.domain.*;
|
||||||
import com.ruoyi.api.service.IToErpService;
|
import com.ruoyi.api.service.IToErpService;
|
||||||
import com.ruoyi.api.service.IToWmsService;
|
import com.ruoyi.api.service.IToWmsService;
|
||||||
@@ -90,6 +92,8 @@ public class ToWmsServiceImpl implements IToWmsService {
|
|||||||
private IBasStockService stockService;
|
private IBasStockService stockService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private MydoJobMapper mydoJobMapper;
|
private MydoJobMapper mydoJobMapper;
|
||||||
|
@Autowired
|
||||||
|
private ShadowObservationGateway shadowObservationGateway;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -412,11 +416,22 @@ public class ToWmsServiceImpl implements IToWmsService {
|
|||||||
|
|
||||||
map.put("v_tray_code", inJob.getTrayCode());
|
map.put("v_tray_code", inJob.getTrayCode());
|
||||||
map.put("v_code", deviceCode);
|
map.put("v_code", deviceCode);
|
||||||
|
InboundShadowObservation shadowObservation = InboundShadowObservation.empty();
|
||||||
|
try {
|
||||||
|
shadowObservation = shadowObservationGateway.planInbound(taskNo, inJob.getTrayCode());
|
||||||
|
} catch (RuntimeException exception) {
|
||||||
|
log.warn("Inbound shadow observation failed open for task {}: {}",
|
||||||
|
taskNo, exception.getMessage());
|
||||||
|
}
|
||||||
mydoJobMapper.allotInJobSpace(map);
|
mydoJobMapper.allotInJobSpace(map);
|
||||||
if (!"10".equals(map.get("v_result").toString())) {
|
String legacyResultCode = map.get("v_result").toString();
|
||||||
|
if (!"10".equals(legacyResultCode)) {
|
||||||
|
compareInboundShadow(shadowObservation, legacyResultCode, null);
|
||||||
return AjaxResult.error(map.get("v_resultmsg").toString());
|
return AjaxResult.error(map.get("v_resultmsg").toString());
|
||||||
}else{
|
}else{
|
||||||
MydoJob inJob2 = mydoJobMapper.selectInJobByTaskNo(taskNo);
|
MydoJob inJob2 = mydoJobMapper.selectInJobByTaskNo(taskNo);
|
||||||
|
compareInboundShadow(shadowObservation, legacyResultCode,
|
||||||
|
inJob2 == null ? null : inJob2.getCargoSpaceId());
|
||||||
return AjaxResult.success(inJob2);
|
return AjaxResult.success(inJob2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -425,5 +440,15 @@ public class ToWmsServiceImpl implements IToWmsService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void compareInboundShadow(InboundShadowObservation observation,
|
||||||
|
String legacyResultCode, String legacySpaceId) {
|
||||||
|
try {
|
||||||
|
shadowObservationGateway.compareInbound(observation, legacyResultCode, legacySpaceId);
|
||||||
|
} catch (RuntimeException exception) {
|
||||||
|
log.warn("Inbound shadow comparison failed open for request {}: {}",
|
||||||
|
observation == null ? null : observation.requestId(), exception.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,95 @@
|
|||||||
|
package com.ruoyi.api.service.impl;
|
||||||
|
|
||||||
|
import com.ruoyi.algorithm.shadow.InboundShadowObservation;
|
||||||
|
import com.ruoyi.algorithm.shadow.ShadowObservationGateway;
|
||||||
|
import com.ruoyi.api.domain.RequestEnter;
|
||||||
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
|
import com.ruoyi.job.mydojob.domain.MydoJob;
|
||||||
|
import com.ruoyi.job.mydojob.mapper.MydoJobMapper;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.mockito.InOrder;
|
||||||
|
import org.mockito.InjectMocks;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.Mockito.doAnswer;
|
||||||
|
import static org.mockito.Mockito.inOrder;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
@ExtendWith(MockitoExtension.class)
|
||||||
|
class ToWmsServiceImplShadowTest {
|
||||||
|
@Mock
|
||||||
|
private MydoJobMapper mydoJobMapper;
|
||||||
|
@Mock
|
||||||
|
private ShadowObservationGateway shadowObservationGateway;
|
||||||
|
@InjectMocks
|
||||||
|
private ToWmsServiceImpl service;
|
||||||
|
|
||||||
|
private RequestEnter request;
|
||||||
|
private MydoJob beforeLegacy;
|
||||||
|
private MydoJob legacyResult;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void setUp() {
|
||||||
|
request = new RequestEnter();
|
||||||
|
request.setTaskNo("TASK-1");
|
||||||
|
request.setDeviceCode("ENTRY-1");
|
||||||
|
beforeLegacy = inboundJob("TRAY-1", null);
|
||||||
|
legacyResult = inboundJob("TRAY-1", "SPACE-LEGACY");
|
||||||
|
when(mydoJobMapper.selectInJobByTaskNo("TASK-1")).thenReturn(beforeLegacy, legacyResult);
|
||||||
|
doAnswer(invocation -> {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
HashMap<String, Object> parameters = invocation.getArgument(0);
|
||||||
|
parameters.put("v_result", "10");
|
||||||
|
parameters.put("v_resultmsg", "ok");
|
||||||
|
return null;
|
||||||
|
}).when(mydoJobMapper).allotInJobSpace(any());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void observesBeforeLegacyAndReturnsTheReloadedLegacyJob() {
|
||||||
|
InboundShadowObservation observation = new InboundShadowObservation(
|
||||||
|
true, "W01", "JOB-1", "READY", "SPACE-SHADOW", "proposal");
|
||||||
|
when(shadowObservationGateway.planInbound("TASK-1", "TRAY-1")).thenReturn(observation);
|
||||||
|
|
||||||
|
AjaxResult result = service.requestEnterByTaskNo(request);
|
||||||
|
|
||||||
|
assertThat(result.get(AjaxResult.DATA_TAG)).isSameAs(legacyResult);
|
||||||
|
InOrder order = inOrder(mydoJobMapper, shadowObservationGateway);
|
||||||
|
order.verify(mydoJobMapper).selectInJobByTaskNo("TASK-1");
|
||||||
|
order.verify(shadowObservationGateway).planInbound("TASK-1", "TRAY-1");
|
||||||
|
order.verify(mydoJobMapper).allotInJobSpace(any());
|
||||||
|
order.verify(mydoJobMapper).selectInJobByTaskNo("TASK-1");
|
||||||
|
order.verify(shadowObservationGateway)
|
||||||
|
.compareInbound(observation, "10", "SPACE-LEGACY");
|
||||||
|
verify(mydoJobMapper, times(1)).allotInJobSpace(any());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shadowExceptionCannotSkipOrReplaceLegacyAllocation() {
|
||||||
|
when(shadowObservationGateway.planInbound("TASK-1", "TRAY-1"))
|
||||||
|
.thenThrow(new IllegalStateException("shadow unavailable"));
|
||||||
|
|
||||||
|
AjaxResult result = service.requestEnterByTaskNo(request);
|
||||||
|
|
||||||
|
assertThat(result.get(AjaxResult.DATA_TAG)).isSameAs(legacyResult);
|
||||||
|
verify(shadowObservationGateway).planInbound("TASK-1", "TRAY-1");
|
||||||
|
verify(mydoJobMapper, times(1)).allotInJobSpace(any());
|
||||||
|
}
|
||||||
|
|
||||||
|
private MydoJob inboundJob(String trayNo, String cargoSpaceId) {
|
||||||
|
MydoJob job = new MydoJob();
|
||||||
|
job.setInOrOut("10");
|
||||||
|
job.setTrayCode(trayNo);
|
||||||
|
job.setCargoSpaceId(cargoSpaceId);
|
||||||
|
return job;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user