|
@@ -148,18 +148,58 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
}
|
|
|
|
|
|
if (flowConfigHeaderVO.getFlowType().equals("ASN")) {
|
|
|
- // 判断队列中是否有未完成的出库任务
|
|
|
- BaseLocationInfo baseLocInfo = baseLocationInfoMapper.selectBaseLocationInfoById(Long.parseLong(paramLocationFrom));
|
|
|
- boolean isFinish = checkWcsSameColumnNotFinish(baseLocInfo.getColNo(), baseLocInfo.getColIndex(), baseLocInfo.getZoneId(),"ASN");
|
|
|
- if (!isFinish){
|
|
|
- throw new ServiceException("当前列有未完成的出库任务");
|
|
|
- }
|
|
|
|
|
|
List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId(), null);
|
|
|
- //
|
|
|
List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), null);
|
|
|
- locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "ASN", asnSoStrategy, token);
|
|
|
- locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "ASN", asnSoStrategy, token);
|
|
|
+
|
|
|
+ // ASN类型的且要到仓储区的任务进行判断入库条件
|
|
|
+ if (flowConfigHeaderVO.getId().equals(Long.valueOf("9")) || flowConfigHeaderVO.getId().equals(Long.valueOf("10"))
|
|
|
+ || flowConfigHeaderVO.getId().equals(Long.valueOf("12"))
|
|
|
+ || flowConfigHeaderVO.getId().equals(Long.valueOf("13"))){
|
|
|
+ // 查询同班组的库存
|
|
|
+ List<AgvCallItemDTO> agvCallItemDTOList = agvCallDTO.getAgvCallItemDTOList();
|
|
|
+ if (agvCallItemDTOList != null && agvCallItemDTOList.size() >= 0){
|
|
|
+ String team = agvCallItemDTOList.get(0).getLotattDTO().getLotatt09();
|
|
|
+ List<BaseLocationInfo> locationInfos = new ArrayList();
|
|
|
+ String currentColNo = null;// 当前列
|
|
|
+ Long currentZoneId = null; // 当前库区
|
|
|
+ for(BaseLocationInfo baseLocationInfo : locationToList){
|
|
|
+ if (baseLocationInfo.getColNo().equals(currentColNo) && baseLocationInfo.getZoneId().equals(currentZoneId)){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 标记当前列分配
|
|
|
+ Boolean columnAvailable = true;
|
|
|
+ // 查询当前库位的库存包含批次属性
|
|
|
+ List<InvLotLocIdLotattVO> invLotLocIdLotattVOS = invLotLocIdService.selectInvLocIdLotattByLocationId(baseLocationInfo.getId());
|
|
|
+ for (InvLotLocIdLotattVO invLotLocIdLotattVO : invLotLocIdLotattVOS){
|
|
|
+ // 库存当前某列有不同班组
|
|
|
+ if (Objects.nonNull(invLotLocIdLotattVO) && !invLotLocIdLotattVO.getLotatt09().equals(team)){
|
|
|
+ // 标记当前列不分配
|
|
|
+ columnAvailable = false;
|
|
|
+ currentColNo = baseLocationInfo.getColNo();
|
|
|
+ currentZoneId = baseLocationInfo.getZoneId();
|
|
|
+ log.info("==========当前库位有不同班组批次{}{}",baseLocationInfo,invLotLocIdLotattVO.getLotatt09());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (columnAvailable){ // 当前列同班组或者为空
|
|
|
+ // 判断当前库位同列是否有不同类型任务
|
|
|
+ List<BaseLocationInfo> blsList = baseLocationInfoService.selectWcsSameColumnAndTeamNotFinish(baseLocationInfo.getColNo(),
|
|
|
+ team, baseLocationInfo.getZoneId(), Constant.WAREHOUSE_ID, "ASN");
|
|
|
+ // 当前列有不同类型未完成任务 继续遍历下一库位
|
|
|
+ if (blsList != null && blsList.size() > 0){
|
|
|
+ log.info("==========当前库位同列有未完成的出库任务,库位编号{}列{}",baseLocationInfo.getId(),baseLocationInfo.getColNo());
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ locationInfos.add(baseLocationInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ locationToList = locationInfos;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "ASN", asnSoStrategy, token, flowConfigHeaderVO.getId());
|
|
|
+ locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "ASN", asnSoStrategy, token, flowConfigHeaderVO.getId());
|
|
|
// 初始化库存
|
|
|
if (agvCallDTO.getAgvCallItemDTOList().size() > 0) {
|
|
|
iInvLotAttService.deleteInvLotAttBylocationId(locationFrom.getId());
|
|
@@ -170,13 +210,6 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
|
|
|
} else if (flowConfigHeaderVO.getFlowType().equals("SO")) {
|
|
|
|
|
|
- // 判断同列中是否有未完成的入库任务
|
|
|
- BaseLocationInfo baseLocInfo = baseLocationInfoMapper.selectBaseLocationInfoById(Long.parseLong(paramLocationFrom));
|
|
|
- boolean isFinish = checkWcsSameColumnNotFinish(baseLocInfo.getColNo(), baseLocInfo.getColIndex(), baseLocInfo.getZoneId(),"SO");
|
|
|
- if (!isFinish){
|
|
|
- throw new ServiceException("当前列有未完成的入库任务");
|
|
|
- }
|
|
|
-
|
|
|
List<BaseLocationInfo> locationFromListEnd = new ArrayList<>();
|
|
|
boolean isLocation = baseLocationInfoService.checkIsLocation(paramLocationFrom, Constant.WAREHOUSE_ID);
|
|
|
if (isLocation) {
|
|
@@ -192,15 +225,21 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
locationFromListEnd = locationFromList;
|
|
|
}
|
|
|
List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), null);
|
|
|
- locationFrom = this.zoneLocationAllocation(locationFromListEnd, "locationFrom", "SO", asnSoStrategy, token);
|
|
|
- locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, token);
|
|
|
+
|
|
|
+ // 如果是从仓储区出库的任务 检查同列未完成任务类型是否相同
|
|
|
+ if (flowConfigHeaderVO.getId().equals(Long.valueOf("14")) || flowConfigHeaderVO.getId().equals(Long.valueOf("15"))){
|
|
|
+ Assert.isTrue(checkWcsSameColumnNotFinish(locationFromListEnd, "SO"),"同列有未完成的入库任务");
|
|
|
+ }
|
|
|
+
|
|
|
+ locationFrom = this.zoneLocationAllocation(locationFromListEnd, "locationFrom", "SO", asnSoStrategy, token, flowConfigHeaderVO.getId());
|
|
|
+ locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, token, flowConfigHeaderVO.getId());
|
|
|
wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
|
|
|
|
|
|
} else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
|
|
|
List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId(), null);
|
|
|
List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), null);
|
|
|
- locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "MV", asnSoStrategy, token);
|
|
|
- locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "MV", asnSoStrategy, token);
|
|
|
+ locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "MV", asnSoStrategy, token, flowConfigHeaderVO.getId());
|
|
|
+ locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "MV", asnSoStrategy, token, flowConfigHeaderVO.getId());
|
|
|
// 初始化库存
|
|
|
if (agvCallDTO.getAgvCallItemDTOList().size() > 0) {
|
|
|
iInvLotAttService.deleteInvLotAttBylocationId(locationFrom.getId());
|
|
@@ -220,28 +259,45 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
|
|
|
/**
|
|
|
* 检查同列的未完成任务类型是否与当前任务类型一致
|
|
|
- * @param colNo
|
|
|
- * @param colIndex
|
|
|
- * @param zoneId
|
|
|
- * @param type 任务类型
|
|
|
+ * @param baseLocationInfoList
|
|
|
+ * @param type
|
|
|
* @return
|
|
|
*/
|
|
|
- public boolean checkWcsSameColumnNotFinish(String colNo, Long colIndex, Long zoneId,String type){
|
|
|
+ public Boolean checkWcsSameColumnNotFinish(List<BaseLocationInfo> baseLocationInfoList,String type){
|
|
|
log.info("检查同列的未完成任务类型是否与当前任务类型一致============");
|
|
|
- // 查询任务状态不为2(完成),6(卸货完成),7(取消)的同列任务
|
|
|
- List<WcsTask> wcsTaskList = wcsTaskService.selectWcsSameColumnNotFinish(colNo, colIndex, zoneId,Constant.WAREHOUSE_ID);
|
|
|
- if (wcsTaskList != null && wcsTaskList.size()>0){
|
|
|
- for(WcsTask wcsTask : wcsTaskList){
|
|
|
- FlowConfigHeaderVO flowConfigHeaderVO = flowConfigHeaderService.selectFlowConfigHeaderById(Long.valueOf(wcsTask.getExt7()));
|
|
|
- if (Objects.nonNull(flowConfigHeaderVO) && !flowConfigHeaderVO.getFlowType().equals(type)){
|
|
|
- log.info("同列的未完成任务类型与当前任务类型不同{}====",wcsTask);
|
|
|
- return false;
|
|
|
- }
|
|
|
+ for(BaseLocationInfo locationInfo: baseLocationInfoList){
|
|
|
+ // 查询任务状态不为2(完成),6(卸货完成),7(取消)的同列任务
|
|
|
+ List<BaseLocationInfo> blsList = baseLocationInfoService.selectWcsSameColumnNotFinish(locationInfo.getColNo(),
|
|
|
+ locationInfo.getColIndex(), locationInfo.getZoneId(), Constant.WAREHOUSE_ID, type);
|
|
|
+ // 如果同列有不同类型的未完成任务
|
|
|
+ if (blsList != null && blsList.size() > 0){
|
|
|
+ return false;
|
|
|
}
|
|
|
}
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 检查同列的未完成任务类型及班组是否与当前任务类型一致
|
|
|
+ * @param baseLocationInfoList
|
|
|
+ * @param type
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public List<BaseLocationInfo> checkWcsSameColumnAndTeamNotFinish(List<BaseLocationInfo> baseLocationInfoList,String type,String team){
|
|
|
+ log.info("检查同列的未完成任务类型及班组是否与当前任务类型一致============");
|
|
|
+ List<BaseLocationInfo> resultList = new ArrayList<>();
|
|
|
+ for(BaseLocationInfo locationInfo: baseLocationInfoList){
|
|
|
+ // 查询任务状态不为2(完成),6(卸货完成),7(取消)的同列任务
|
|
|
+ List<BaseLocationInfo> blsList = baseLocationInfoService.selectWcsSameColumnAndTeamNotFinish(locationInfo.getColNo(),
|
|
|
+ team, locationInfo.getZoneId(), Constant.WAREHOUSE_ID, type);
|
|
|
+ // 如果同列有不同类型的未完成任务
|
|
|
+ if (blsList != null && blsList.size() > 0){
|
|
|
+ resultList.addAll(blsList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return resultList;
|
|
|
+ }
|
|
|
+
|
|
|
@Transactional
|
|
|
@Override
|
|
|
public BaseLocationInfo inLocationAllocation(InWarehouseDTO inWarehouseDTO, Long token) {
|
|
@@ -335,7 +391,7 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
|
|
|
@Override
|
|
|
public BaseLocationInfo zoneLocationAllocation(List<BaseLocationInfo> locationInfoList, String locationType
|
|
|
- , String type, AsnSoStrategy asnSoStrategy, Long token) {
|
|
|
+ , String type, AsnSoStrategy asnSoStrategy, Long token, Long flowId) {
|
|
|
BaseLocationInfo locationInfo = null;
|
|
|
String fromMsg = "";
|
|
|
String toMsg = "";
|
|
@@ -354,8 +410,8 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
}
|
|
|
if (locationType.equals("locationFrom")) {
|
|
|
|
|
|
- // 如果是出库 调用无需判断阻挡的方法
|
|
|
- if (type.equals("SO")){
|
|
|
+ // 如果是从仓储区出库 调用无需判断阻挡的方法
|
|
|
+ if (type.equals("SO") && (flowId.equals(Long.valueOf("14")) || flowId.equals(Long.valueOf("15")))){
|
|
|
locationInfo = checkTheSameColumnLocationSO(locationInfoList, token);
|
|
|
}else {
|
|
|
locationInfo = checkTheSameColumnLocation(locationInfoList, token, false);
|
|
@@ -372,8 +428,12 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
throw new ServiceException(fromMsg, token);
|
|
|
}
|
|
|
} else {
|
|
|
-
|
|
|
- locationInfo = checkTheSameColumnLocation(locationInfoList, token, true);
|
|
|
+ // 是到仓储区的入库任务
|
|
|
+ if (type.equals("ASN") && !flowId.equals(Long.valueOf("8")) && !flowId.equals(Long.valueOf("11"))){
|
|
|
+ locationInfo = checkTheSameColumnLocationASN(locationInfoList, token, true);
|
|
|
+ }else {
|
|
|
+ locationInfo = checkTheSameColumnLocation(locationInfoList, token, true);
|
|
|
+ }
|
|
|
if (locationInfo == null) {
|
|
|
if (type.equals("ASN")) { // 入库
|
|
|
toMsg = "目标点没有可以分配的库位";
|
|
@@ -388,6 +448,36 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
return locationInfo;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 入库判断目标点位
|
|
|
+ * @param locationInfoList
|
|
|
+ * @param token
|
|
|
+ * @param isReleaseGoods
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private BaseLocationInfo checkTheSameColumnLocationASN(List<BaseLocationInfo> locationInfoList, Long token, boolean isReleaseGoods) {
|
|
|
+ BaseLocationInfo basLocation = null;
|
|
|
+ //筛选2次 第2次去除同列占用和阻挡条件 todo 先筛选一次吧
|
|
|
+ for (int i = 0; i < 1 && basLocation == null; i++) {
|
|
|
+ for (BaseLocationInfo location : locationInfoList) {
|
|
|
+ // 目标点位必须空闲、空且没有被锁住
|
|
|
+ if (!location.getStockStatus().equals(Constant.STOCK_STATUS.STOCK00.getValue())
|
|
|
+ || !location.getIsEmpty().equals(Constant.IS_YES.Y.name())
|
|
|
+ || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + location.getId())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + location.getId()
|
|
|
+ , location.getId().toString()
|
|
|
+ , token)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ basLocation = location;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return basLocation;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 校验同列任务任务状态和阻挡
|
|
|
*
|
|
@@ -725,40 +815,60 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
//转发任务
|
|
|
if (StringUtils.isNotEmpty(wcsTask.getTaskType())
|
|
|
&& wcsTask.getTaskType().equals(Constant.TASK_TYPE.FORWARD.getValue())) {
|
|
|
- log.info("进入转发任务{}=={}========", wcsTask.getTaskType(),wcsTask.getExt7());
|
|
|
+ log.info("进入转发任务{}=={}========", wcsTask.getTaskType(), wcsTask.getExt7());
|
|
|
// 判断如果是出库任务
|
|
|
if (StringUtils.isNotEmpty(wcsTask.getExt7())
|
|
|
&& (wcsTask.getExt7().equals(String.valueOf(Constant.FLOW_CONFIG_ID.FOURTEEN.getValue()))
|
|
|
- || wcsTask.getExt7().equals(String.valueOf(Constant.FLOW_CONFIG_ID.FIFTEEN.getValue())))){
|
|
|
+ || wcsTask.getExt7().equals(String.valueOf(Constant.FLOW_CONFIG_ID.FIFTEEN.getValue())))) {
|
|
|
log.info("出库任务下发AMS调用AGV{}", JSON.toJSONString(wcsTask));
|
|
|
// 根据起始地查询库位信息
|
|
|
BaseLocationInfo baseLocationInfo = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(wcsTask.getLocationFrom(), Constant.WAREHOUSE_ID);
|
|
|
- //同列是否有任务
|
|
|
+ //同列外方是否有任务
|
|
|
List<BaseLocationInfo> occupyByLocs = baseLocationInfoMapper.queryByListOccupyByLoc(baseLocationInfo);
|
|
|
if (occupyByLocs.size() > 0) {
|
|
|
- log.info("同列有任务=========={}",occupyByLocs);
|
|
|
+ log.info("同列外面有任务=========={}", occupyByLocs);
|
|
|
continue;
|
|
|
}
|
|
|
//同列前方是否有阻挡
|
|
|
List<BaseLocationInfo> inStockByLocs = baseLocationInfoMapper.queryByListInStockByLoc(baseLocationInfo);
|
|
|
if (inStockByLocs.size() > 0) {
|
|
|
- log.info("同列有阻挡=========={}",inStockByLocs);
|
|
|
+ log.info("同列有阻挡=========={}", inStockByLocs);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ } else if (StringUtils.isNotEmpty(wcsTask.getExt7()) // 判断如果是入库任务
|
|
|
+ && (wcsTask.getExt7().equals(String.valueOf(Constant.FLOW_CONFIG_ID.NINE.getValue()))
|
|
|
+ || wcsTask.getExt7().equals(String.valueOf(Constant.FLOW_CONFIG_ID.TEN.getValue()))
|
|
|
+ || wcsTask.getExt7().equals(String.valueOf(Constant.FLOW_CONFIG_ID.TWELVE.getValue()))
|
|
|
+ || wcsTask.getExt7().equals(String.valueOf(Constant.FLOW_CONFIG_ID.THIRTEEN.getValue())))) {
|
|
|
+ log.info("入库任务下发AMS调用AGV{}", JSON.toJSONString(wcsTask));
|
|
|
+ // 根据起始地查询库位信息
|
|
|
+ BaseLocationInfo baseLocationInfo = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(wcsTask.getLocationFrom(), Constant.WAREHOUSE_ID);
|
|
|
+ //同列里面是否有任务
|
|
|
+ List<BaseLocationInfo> occupyByLocs = baseLocationInfoMapper.queryByListOccupyByLocOR(baseLocationInfo);
|
|
|
+ if (occupyByLocs.size() > 0) {
|
|
|
+ log.info("同列里面有任务=========={}", occupyByLocs);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //同列前方是否有阻挡
|
|
|
+ List<BaseLocationInfo> inStockByLocs = baseLocationInfoMapper.queryByListInStockByLoc(baseLocationInfo);
|
|
|
+ if (inStockByLocs.size() > 0) {
|
|
|
+ log.info("同列有阻挡=========={}", inStockByLocs);
|
|
|
continue;
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- sendTask(wcsTask);
|
|
|
- wcsTask.setState(10L);
|
|
|
- wcsTaskService.updateWcsTask(wcsTask);
|
|
|
- break;
|
|
|
- }
|
|
|
+ sendTask(wcsTask);
|
|
|
+ wcsTask.setState(10L);
|
|
|
+ wcsTaskService.updateWcsTask(wcsTask);
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
- try {
|
|
|
- //任务下发判断
|
|
|
- businessService.taskDispatchStack(wcsTask);
|
|
|
- Thread.sleep(500);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
+ try {
|
|
|
+ //任务下发判断
|
|
|
+ businessService.taskDispatchStack(wcsTask);
|
|
|
+ Thread.sleep(500);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|