package com.zy.asrs.task;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.zy.asrs.entity.BasStation;
|
import com.zy.asrs.entity.BasCrnp;
|
import com.zy.asrs.entity.WrkMast;
|
import com.zy.asrs.service.BasStationService;
|
import com.zy.asrs.service.BasCrnpService;
|
import com.zy.asrs.service.WrkAnalysisService;
|
import com.zy.asrs.service.WrkMastService;
|
import com.zy.common.entity.FindCrnNoResult;
|
import com.zy.common.service.CommonService;
|
import com.zy.core.cache.SlaveConnection;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.enums.StationCommandType;
|
import com.zy.core.enums.WrkStsType;
|
import com.zy.core.move.StationMoveCoordinator;
|
import com.zy.core.move.StationMoveSession;
|
import com.zy.core.model.CommandResponse;
|
import com.zy.core.model.command.StationCommand;
|
import com.zy.core.model.protocol.StationProtocol;
|
import com.zy.core.thread.StationThread;
|
import com.zy.core.utils.CrnOperateProcessUtils;
|
import com.zy.core.utils.StationOperateProcessUtils;
|
import org.junit.jupiter.api.Test;
|
|
import java.util.ArrayList;
|
import java.util.Collections;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.when;
|
|
class WrkAnalysisStationArrivalScannerTest {
|
|
@Test
|
void scanInboundStationArrival_completesTaskWhenRecentArrivalWasObserved() {
|
WrkMastService wrkMastService = mock(WrkMastService.class);
|
BasStationService basStationService = mock(BasStationService.class);
|
WrkAnalysisService wrkAnalysisService = mock(WrkAnalysisService.class);
|
StationOperateProcessUtils stationOperateProcessUtils = mock(StationOperateProcessUtils.class);
|
StationMoveCoordinator stationMoveCoordinator = mock(StationMoveCoordinator.class);
|
CommonService commonService = mock(CommonService.class);
|
BasCrnpService basCrnpService = mock(BasCrnpService.class);
|
CrnOperateProcessUtils crnOperateProcessUtils = mock(CrnOperateProcessUtils.class);
|
|
WrkAnalysisStationArrivalScanner scanner = new WrkAnalysisStationArrivalScanner(
|
wrkMastService,
|
basStationService,
|
wrkAnalysisService,
|
stationOperateProcessUtils,
|
stationMoveCoordinator,
|
commonService,
|
basCrnpService,
|
crnOperateProcessUtils
|
);
|
|
WrkMast wrkMast = new WrkMast();
|
wrkMast.setWrkNo(1001);
|
wrkMast.setIoType(1);
|
wrkMast.setWrkSts(WrkStsType.INBOUND_STATION_RUN.sts);
|
wrkMast.setStaNo(12);
|
|
BasStation basStation = new BasStation();
|
basStation.setStationId(12);
|
basStation.setDeviceNo(3);
|
|
when(wrkMastService.list(any(QueryWrapper.class))).thenReturn(List.of(wrkMast));
|
when(basStationService.getOne(any())).thenReturn(basStation);
|
when(wrkAnalysisService.completeInboundStationRun(any(WrkMast.class), any(Date.class))).thenReturn(true);
|
|
ArrivalAwareStationThread stationThread = new ArrivalAwareStationThread(true);
|
StationProtocol stationProtocol = new StationProtocol();
|
stationProtocol.setStationId(12);
|
stationProtocol.setTaskNo(0);
|
stationProtocol.setLoading(false);
|
stationThread.putStatus(stationProtocol);
|
|
SlaveConnection.put(SlaveType.Devp, 3, stationThread);
|
try {
|
scanner.scanInboundStationArrival();
|
} finally {
|
SlaveConnection.remove(SlaveType.Devp, 3);
|
}
|
|
verify(wrkAnalysisService).completeInboundStationRun(any(WrkMast.class), any(Date.class));
|
}
|
|
@Test
|
void scanInboundStationArrival_dispatchesCrnMoveWhenOnlyFinalInletStationRemains() {
|
WrkMastService wrkMastService = mock(WrkMastService.class);
|
BasStationService basStationService = mock(BasStationService.class);
|
WrkAnalysisService wrkAnalysisService = mock(WrkAnalysisService.class);
|
StationOperateProcessUtils stationOperateProcessUtils = mock(StationOperateProcessUtils.class);
|
StationMoveCoordinator stationMoveCoordinator = mock(StationMoveCoordinator.class);
|
CommonService commonService = mock(CommonService.class);
|
BasCrnpService basCrnpService = mock(BasCrnpService.class);
|
CrnOperateProcessUtils crnOperateProcessUtils = mock(CrnOperateProcessUtils.class);
|
|
WrkAnalysisStationArrivalScanner scanner = new WrkAnalysisStationArrivalScanner(
|
wrkMastService,
|
basStationService,
|
wrkAnalysisService,
|
stationOperateProcessUtils,
|
stationMoveCoordinator,
|
commonService,
|
basCrnpService,
|
crnOperateProcessUtils
|
);
|
|
WrkMast wrkMast = new WrkMast();
|
wrkMast.setWrkNo(1002);
|
wrkMast.setIoType(1);
|
wrkMast.setWrkSts(WrkStsType.INBOUND_STATION_RUN.sts);
|
wrkMast.setStaNo(12);
|
wrkMast.setLocNo("5-6-7");
|
|
BasStation basStation = new BasStation();
|
basStation.setStationId(12);
|
basStation.setDeviceNo(3);
|
|
StationMoveSession session = new StationMoveSession();
|
session.setStatus(StationMoveSession.STATUS_RUNNING);
|
session.setCurrentStationId(11);
|
session.setFullPathStationIds(new ArrayList<>(List.of(10, 11, 12)));
|
|
FindCrnNoResult findCrnNoResult = new FindCrnNoResult();
|
findCrnNoResult.setCrnNo(1);
|
findCrnNoResult.setCrnType(SlaveType.Crn);
|
|
BasCrnp basCrnp = new BasCrnp();
|
basCrnp.setCrnNo(1);
|
basCrnp.setInStationList("[{\"stationId\":12,\"deviceRow\":2,\"deviceBay\":1,\"deviceLev\":1}]");
|
|
when(wrkMastService.list(any(QueryWrapper.class))).thenReturn(List.of(wrkMast));
|
when(basStationService.getOne(any())).thenReturn(basStation);
|
when(stationMoveCoordinator.loadSession(1002)).thenReturn(session);
|
when(commonService.findCrnNoByLocNo("5-6-7")).thenReturn(findCrnNoResult);
|
when(basCrnpService.getOne(any())).thenReturn(basCrnp);
|
when(crnOperateProcessUtils.dispatchCrnMove(1, "2-1-1")).thenReturn(true);
|
|
ArrivalAwareStationThread stationThread = new ArrivalAwareStationThread(false);
|
StationProtocol stationProtocol = new StationProtocol();
|
stationProtocol.setStationId(12);
|
stationProtocol.setTaskNo(0);
|
stationProtocol.setLoading(false);
|
stationThread.putStatus(stationProtocol);
|
|
SlaveConnection.put(SlaveType.Devp, 3, stationThread);
|
try {
|
scanner.scanInboundStationArrival();
|
} finally {
|
SlaveConnection.remove(SlaveType.Devp, 3);
|
}
|
|
verify(crnOperateProcessUtils).dispatchCrnMove(1, "2-1-1");
|
verify(wrkAnalysisService, never()).completeInboundStationRun(any(WrkMast.class), any(Date.class));
|
}
|
|
@Test
|
void scanInboundStationArrival_skipsCrnMoveWhenTargetInletHasLoadTaskAndInEnable() {
|
WrkMastService wrkMastService = mock(WrkMastService.class);
|
BasStationService basStationService = mock(BasStationService.class);
|
WrkAnalysisService wrkAnalysisService = mock(WrkAnalysisService.class);
|
StationOperateProcessUtils stationOperateProcessUtils = mock(StationOperateProcessUtils.class);
|
StationMoveCoordinator stationMoveCoordinator = mock(StationMoveCoordinator.class);
|
CommonService commonService = mock(CommonService.class);
|
BasCrnpService basCrnpService = mock(BasCrnpService.class);
|
CrnOperateProcessUtils crnOperateProcessUtils = mock(CrnOperateProcessUtils.class);
|
|
WrkAnalysisStationArrivalScanner scanner = new WrkAnalysisStationArrivalScanner(
|
wrkMastService,
|
basStationService,
|
wrkAnalysisService,
|
stationOperateProcessUtils,
|
stationMoveCoordinator,
|
commonService,
|
basCrnpService,
|
crnOperateProcessUtils
|
);
|
|
WrkMast wrkMast = new WrkMast();
|
wrkMast.setWrkNo(1003);
|
wrkMast.setIoType(1);
|
wrkMast.setWrkSts(WrkStsType.INBOUND_STATION_RUN.sts);
|
wrkMast.setStaNo(12);
|
wrkMast.setLocNo("5-6-7");
|
|
BasStation basStation = new BasStation();
|
basStation.setStationId(12);
|
basStation.setDeviceNo(3);
|
|
StationMoveSession session = new StationMoveSession();
|
session.setStatus(StationMoveSession.STATUS_RUNNING);
|
session.setCurrentStationId(11);
|
session.setFullPathStationIds(new ArrayList<>(List.of(10, 11, 12)));
|
|
when(wrkMastService.list(any(QueryWrapper.class))).thenReturn(List.of(wrkMast));
|
when(basStationService.getOne(any())).thenReturn(basStation);
|
when(stationMoveCoordinator.loadSession(1003)).thenReturn(session);
|
|
ArrivalAwareStationThread stationThread = new ArrivalAwareStationThread(false);
|
StationProtocol stationProtocol = new StationProtocol();
|
stationProtocol.setStationId(12);
|
stationProtocol.setTaskNo(9999);
|
stationProtocol.setLoading(true);
|
stationProtocol.setInEnable(true);
|
stationThread.putStatus(stationProtocol);
|
|
SlaveConnection.put(SlaveType.Devp, 3, stationThread);
|
try {
|
scanner.scanInboundStationArrival();
|
} finally {
|
SlaveConnection.remove(SlaveType.Devp, 3);
|
}
|
|
verify(crnOperateProcessUtils, never()).dispatchCrnMove(any(), any());
|
verify(commonService, never()).findCrnNoByLocNo(any());
|
verify(wrkAnalysisService, never()).completeInboundStationRun(any(WrkMast.class), any(Date.class));
|
}
|
|
@Test
|
void scanInboundStationArrival_dispatchesCrnMoveWhenTargetInletOnlyHasLoad() {
|
WrkMastService wrkMastService = mock(WrkMastService.class);
|
BasStationService basStationService = mock(BasStationService.class);
|
WrkAnalysisService wrkAnalysisService = mock(WrkAnalysisService.class);
|
StationOperateProcessUtils stationOperateProcessUtils = mock(StationOperateProcessUtils.class);
|
StationMoveCoordinator stationMoveCoordinator = mock(StationMoveCoordinator.class);
|
CommonService commonService = mock(CommonService.class);
|
BasCrnpService basCrnpService = mock(BasCrnpService.class);
|
CrnOperateProcessUtils crnOperateProcessUtils = mock(CrnOperateProcessUtils.class);
|
|
WrkAnalysisStationArrivalScanner scanner = new WrkAnalysisStationArrivalScanner(
|
wrkMastService,
|
basStationService,
|
wrkAnalysisService,
|
stationOperateProcessUtils,
|
stationMoveCoordinator,
|
commonService,
|
basCrnpService,
|
crnOperateProcessUtils
|
);
|
|
WrkMast wrkMast = new WrkMast();
|
wrkMast.setWrkNo(1004);
|
wrkMast.setIoType(1);
|
wrkMast.setWrkSts(WrkStsType.INBOUND_STATION_RUN.sts);
|
wrkMast.setStaNo(12);
|
wrkMast.setLocNo("5-6-7");
|
|
BasStation basStation = new BasStation();
|
basStation.setStationId(12);
|
basStation.setDeviceNo(3);
|
|
StationMoveSession session = new StationMoveSession();
|
session.setStatus(StationMoveSession.STATUS_RUNNING);
|
session.setCurrentStationId(11);
|
session.setFullPathStationIds(new ArrayList<>(List.of(10, 11, 12)));
|
|
FindCrnNoResult findCrnNoResult = new FindCrnNoResult();
|
findCrnNoResult.setCrnNo(1);
|
findCrnNoResult.setCrnType(SlaveType.Crn);
|
|
BasCrnp basCrnp = new BasCrnp();
|
basCrnp.setCrnNo(1);
|
basCrnp.setInStationList("[{\"stationId\":12,\"deviceRow\":2,\"deviceBay\":1,\"deviceLev\":1}]");
|
|
when(wrkMastService.list(any(QueryWrapper.class))).thenReturn(List.of(wrkMast));
|
when(basStationService.getOne(any())).thenReturn(basStation);
|
when(stationMoveCoordinator.loadSession(1004)).thenReturn(session);
|
when(commonService.findCrnNoByLocNo("5-6-7")).thenReturn(findCrnNoResult);
|
when(basCrnpService.getOne(any())).thenReturn(basCrnp);
|
when(crnOperateProcessUtils.dispatchCrnMove(1, "2-1-1")).thenReturn(true);
|
|
ArrivalAwareStationThread stationThread = new ArrivalAwareStationThread(false);
|
StationProtocol stationProtocol = new StationProtocol();
|
stationProtocol.setStationId(12);
|
stationProtocol.setTaskNo(0);
|
stationProtocol.setLoading(true);
|
stationProtocol.setInEnable(false);
|
stationThread.putStatus(stationProtocol);
|
|
SlaveConnection.put(SlaveType.Devp, 3, stationThread);
|
try {
|
scanner.scanInboundStationArrival();
|
} finally {
|
SlaveConnection.remove(SlaveType.Devp, 3);
|
}
|
|
verify(crnOperateProcessUtils).dispatchCrnMove(1, "2-1-1");
|
verify(wrkAnalysisService, never()).completeInboundStationRun(any(WrkMast.class), any(Date.class));
|
}
|
|
private static class ArrivalAwareStationThread implements StationThread {
|
|
private final boolean recentArrival;
|
private final Map<Integer, StationProtocol> statusMap = new HashMap<>();
|
|
private ArrivalAwareStationThread(boolean recentArrival) {
|
this.recentArrival = recentArrival;
|
}
|
|
private void putStatus(StationProtocol stationProtocol) {
|
statusMap.put(stationProtocol.getStationId(), stationProtocol);
|
}
|
|
@Override
|
public List<StationProtocol> getStatus() {
|
return Collections.emptyList();
|
}
|
|
@Override
|
public Map<Integer, StationProtocol> getStatusMap() {
|
return statusMap;
|
}
|
|
public boolean hasRecentArrival(Integer stationId, Integer taskNo) {
|
return recentArrival;
|
}
|
|
@Override
|
public StationCommand getCommand(StationCommandType commandType, Integer taskNo, Integer stationId, Integer targetStationId, Integer palletSize) {
|
return null;
|
}
|
|
@Override
|
public boolean clearPath(Integer taskNo) {
|
return false;
|
}
|
|
@Override
|
public CommandResponse sendCommand(StationCommand command) {
|
return null;
|
}
|
|
@Override
|
public CommandResponse sendOriginCommand(String address, short[] data) {
|
return null;
|
}
|
|
@Override
|
public byte[] readOriginCommand(String address, int length) {
|
return new byte[0];
|
}
|
|
@Override
|
public void run() {
|
}
|
|
@Override
|
public boolean connect() {
|
return true;
|
}
|
|
@Override
|
public void close() {
|
}
|
}
|
}
|