package com.vincent.rsf.server.manager.utils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.common.SpringUtils; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.manager.entity.*; import com.vincent.rsf.server.manager.service.*; import com.vincent.rsf.server.system.entity.TaskPathTemplateMerge; import com.vincent.rsf.server.system.service.TaskPathTemplateMergeService; import lombok.extern.slf4j.Slf4j; import routeR.calculationR.RouteWmsStepFlow; import java.util.ArrayList; import java.util.List; import java.util.Objects; @Slf4j public class WarehouseLocationRetrievalUtil { private BasStationService basStationService; private WarehouseAreasService warehouseAreasService; public WarehouseLocationRetrievalUtil() { basStationService = SpringUtils.getBean(BasStationService.class); warehouseAreasService = SpringUtils.getBean(WarehouseAreasService.class); } //判断目标是否是库区 public boolean retrieveMissionmMergeReservoirAreaIsItAvailable(String missionArea) { boolean matches = missionArea.matches("\\d+"); if (!matches) { return false; } WarehouseAreas warehouseAreas = warehouseAreasService.getById(Long.parseLong(missionArea)); if (Cools.isEmpty(warehouseAreas)){ return false; } return true; } //判断目标是否是站点 public BasStation retrieveMissionmMergeSizeIsItAvailable(String missionSize) { BasStation basStation = basStationService.getOne(new LambdaQueryWrapper().eq(BasStation::getStationName, missionSize).last("limit 1")); if (Cools.isEmpty(basStation)){ basStation = basStationService.getOne(new LambdaQueryWrapper() .apply("station_alias != '[]'") // 不是空数组 .apply("JSON_CONTAINS(station_alias, '\"{0}\"') = 1", missionSize) .eq(BasStation::getDeleted, 0) // 通常需要加上未删除条件 .last("LIMIT 1")); } if (Cools.isEmpty(basStation)){ return null; } return basStation; } //根据条码获取规则 public BasContainer getContainerByBarcode(String barcode) { if (Cools.isEmpty(barcode)) { throw new CoolException("容器码不能为空"); } BasContainerService basContainerService = SpringUtils.getBean(BasContainerService.class); List containers = basContainerService.list(new LambdaQueryWrapper<>()); for (BasContainer container : containers) { String codeType = container.getCodeType(); // 获取正则表达式 if (barcode.matches(codeType)) { // 判断条码是否符合这个正则 return container; } } throw new CoolException("容器码:"+barcode+"异常==>未找到匹配的规则"); } //根据物料ID获取物料 public Matnr getMatnrByMatnrId(Long matnrId) { if (Cools.isEmpty(matnrId)) { throw new CoolException("物料ID不能为空"); } MatnrService matnrService = SpringUtils.getBean(MatnrService.class); Matnr matnr = matnrService.selectMatnrById(matnrId); if (matnr == null) { throw new CoolException("物料ID:"+matnrId+"异常==>未找到对应物料"); } return matnr; } //判断物料是否可用此仓库 public boolean retrieveMatnrIsItAvailable(String areaId, Long matnrId) { return retrieveMatnrIsItAvailable(Long.parseLong(areaId),matnrId); } public boolean retrieveMatnrIsItAvailable(Long areaId, Long matnrId) { Matnr matnrByMatnrId = getMatnrByMatnrId(matnrId); if (matnrByMatnrId.getWarehouseRestrictionCode() == null || matnrByMatnrId.getWarehouseRestrictionCode().equals("") || matnrByMatnrId.getWarehouseRestrictionCode().equals("all")) { return true; } //判断是否兼容 String warehouseRestrictionCode = matnrByMatnrId.getWarehouseRestrictionCode(); //根据code获取 MatnrRestrictionWarehouseService matnrRestrictionWarehouseService = SpringUtils.getBean(MatnrRestrictionWarehouseService.class); MatnrRestrictionWarehouse serviceOne = matnrRestrictionWarehouseService.getOne(new LambdaQueryWrapper().eq(MatnrRestrictionWarehouse::getMatnrRestrictionCode, warehouseRestrictionCode).last("limit 1")); if (Objects.isNull(serviceOne)) { return false; } //查询area是否在 return serviceOne.getProductionLineCode().contains(areaId.intValue()); } // 根据库区、容器检索符合条件移库库区 public List getOutWarehouseAreasByReservoirAreaAndContainer(Long sourceCode, String barcode,Integer type) { return getOutWarehouseAreasByReservoirAreaAndContainer(sourceCode,barcode,type.toString()); } public List getOutWarehouseAreasByReservoirAreaAndContainer(Long sourceCode, String barcode,String type) { List outboundSite = new ArrayList<>(); List outboundSiteByReservoirAreaAndContainer = getOutWarehouseAreasByReservoirAreaAndContainer(sourceCode, barcode); for (String areaId : outboundSiteByReservoirAreaAndContainer) { WarehouseAreas warehouseAreas = warehouseAreasService.getById(Long.parseLong(areaId)); if (!Cools.isEmpty(warehouseAreas)){ outboundSite.add(areaId); } } return outboundSite; } // 根据库区、容器检索符合条件出库站点 private List getOutWarehouseAreasByReservoirAreaAndContainer(Long sourceCode, String barcode) { return getTargetTypeByReservoirAreaAndContainer(String.valueOf(sourceCode), barcode,1,false); } // 根据库区、容器检索符合条件出库站点 public List getOutboundSiteByReservoirAreaAndContainer(Long sourceCode, String barcode,Integer type) { return getOutboundSiteByReservoirAreaAndContainer(sourceCode,barcode,type.toString()); } public List getOutboundSiteByReservoirAreaAndContainer(Long sourceCode, String barcode,String type) { List outboundSite = new ArrayList<>(); List outboundSiteByReservoirAreaAndContainer = getOutboundSiteByReservoirAreaAndContainer(sourceCode, barcode); for (String site : outboundSiteByReservoirAreaAndContainer) { BasStation basStation = basStationService.getOne(new LambdaQueryWrapper() .eq(BasStation::getStationName, site).last("limit 1")); if (!Cools.isEmpty(basStation)){ BasStationTypeService basStationTypeService = SpringUtils.getBean(BasStationTypeService.class); BasStationType one = basStationTypeService.getOne(new LambdaQueryWrapper().eq(BasStationType::getStationTypeCode, basStation.getContainerType()).last("limit 1")); if (!Cools.isEmpty(one)) { if (one.getTaskType().contains(type)){ outboundSite.add(site); } } } } return outboundSite; } // 根据库区、容器检索符合条件出库站点 private List getOutboundSiteByReservoirAreaAndContainer(Long sourceCode, String barcode) { return getTargetTypeByReservoirAreaAndContainer(String.valueOf(sourceCode), barcode,1,true); } // 根据库区、容器检索符合条件站点或库区 private List getTargetTypeByReservoirAreaAndContainer(String code, String barcode,int type,boolean isInOrOut) { List obtainOutboundStations = new ArrayList<>(); BasContainer containerByBarcode = getContainerByBarcode(barcode); if (containerByBarcode == null) { log.error("容器码:"+barcode+"异常==>未找到匹配的规则"); return obtainOutboundStations; } Long containerType = containerByBarcode.getContainerType(); TaskPathTemplateMergeService taskPathTemplateMergeService = SpringUtils.getBean(TaskPathTemplateMergeService.class); if (isInOrOut) {//根据起点检索终点 List taskPathTemplateMergeList = taskPathTemplateMergeService.list(new LambdaQueryWrapper() .eq(TaskPathTemplateMerge::getSourceType, code) .eq(TaskPathTemplateMerge::getContainerType, containerType) ); if (taskPathTemplateMergeList.isEmpty()) { return obtainOutboundStations; } for (TaskPathTemplateMerge taskPathTemplateMerge : taskPathTemplateMergeList) { switch (type){ case 1://站点 if (retrieveBarcodeIsItAvailableBySite(containerByBarcode,taskPathTemplateMerge.getTargetType())){ obtainOutboundStations.add(taskPathTemplateMerge.getTargetType()); } break; case 2://库区 if (retrieveMissionmMergeReservoirAreaIsItAvailable(taskPathTemplateMerge.getTargetType())){ obtainOutboundStations.add(taskPathTemplateMerge.getTargetType()); } break; } } } else {//根据终点检索起点 List taskPathTemplateMergeList = taskPathTemplateMergeService.list(new LambdaQueryWrapper() .eq(TaskPathTemplateMerge::getTargetType, code) .eq(TaskPathTemplateMerge::getContainerType, containerType) ); if (taskPathTemplateMergeList.isEmpty()) { return obtainOutboundStations; } for (TaskPathTemplateMerge taskPathTemplateMerge : taskPathTemplateMergeList) { switch (type){ case 1://站点 if (retrieveBarcodeIsItAvailableBySite(containerByBarcode,taskPathTemplateMerge.getSourceType())){ obtainOutboundStations.add(taskPathTemplateMerge.getSourceType()); } break; case 2://库区 if (retrieveMissionmMergeReservoirAreaIsItAvailable(taskPathTemplateMerge.getSourceType())){ obtainOutboundStations.add(taskPathTemplateMerge.getSourceType()); } break; } } } return obtainOutboundStations; } // 根据站点检索容器是否可行至此站点 public boolean retrieveBarcodeIsItAvailableBySite(BasContainer containerByBarcode,BasStation basStation) { if (basStation.getContainerType().contains(containerByBarcode.getContainerType())) { return true; } return false; } // 根据站点检索容器是否可行至此站点 public boolean retrieveBarcodeIsItAvailableBySite(String barcode,BasStation basStation) { BasContainer containerByBarcode = getContainerByBarcode(barcode); if (basStation.getContainerType().contains(containerByBarcode.getContainerType())) { return true; } return false; } // 根据站点检索容器是否可行至此站点 public boolean retrieveBarcodeIsItAvailableBySite(BasContainer containerByBarcode,String siteCode) { BasStation basStation = retrieveMissionmMergeSizeIsItAvailable(siteCode); if (Cools.isEmpty(basStation)){ return false; } if (basStation.getContainerType().contains(containerByBarcode.getContainerType())) { return true; } return false; } // 根据站点检索容器是否可行至此站点 public boolean retrieveBarcodeIsItAvailableBySite(String barcode,String siteCode) { BasStation basStation = retrieveMissionmMergeSizeIsItAvailable(siteCode); if (Cools.isEmpty(basStation)){ return false; } BasContainer containerByBarcode = getContainerByBarcode(barcode); if (basStation.getContainerType().contains(containerByBarcode.getContainerType())) { return true; } return false; } // 根据站点检索库区是否可入至此站点 public boolean retrieveWarehouseAreasIsItAvailableInBySite(String warehouseCode,BasStation basStation) { // TODO: 实现逻辑 return false; } // 根据站点检索库区是否可入至此站点 public boolean retrieveWarehouseAreasIsItAvailableInBySite(String warehouseCode,String siteCode) { // TODO: 实现逻辑 return false; } // 根据站点检索库区是否可出至此站点 public boolean retrieveWarehouseAreasIsItAvailableOutBySite(String warehouseCode,BasStation basStation) { // TODO: 实现逻辑 return false; } // 根据站点检索库区是否可出至此站点 public boolean retrieveWarehouseAreasIsItAvailableOutBySite(String warehouseCode,String siteCode) { // TODO: 实现逻辑 return false; } // 根据站点检索符合条件库区 public List getWarehouseAreasBySite(String siteCode) { // TODO: 实现逻辑 return null; } // 根据站点检索符合条件容器 public List getContainersBySite(String siteCode) { // TODO: 实现逻辑 return null; } // 根据站点检索符合条件任务类型 public List getTaskTypesBySite(String siteCode) { // TODO: 实现逻辑 return null; } // 根据物料检索符合条件库区 public List getWarehouseAreasByMaterial(String materialCode) { // TODO: 实现逻辑 return null; } // 根据物料检索符合条件容器 public List getContainersByMaterial(String materialCode) { // TODO: 实现逻辑 return null; } // 根据物料检索符合条件站点 public List getSitesByMaterial(String materialCode) { // TODO: 实现逻辑 return null; } // 根据库区检索符合条件站点 public List getSitesByWarehouseArea(String warehouseAreaCode) { // TODO: 实现逻辑 return null; } // 根据站点\物料检索符合条件容器 public List getContainersBySiteAndMaterial(String siteCode, String materialCode) { // TODO: 实现逻辑 return null; } // 根据站点\物料检索符合条件库区 public List getWarehouseAreasBySiteAndMaterial(String siteCode, String materialCode) { // TODO: 实现逻辑 return null; } // 根据站点\物料检索符合条件路径 public List getPathsBySiteAndMaterial(String siteCode, String materialCode) { // TODO: 实现逻辑 return null; } // 根据站点\物料检索符合条件任务类型 public List getTaskTypesBySiteAndMaterial(String siteCode, String materialCode) { // TODO: 实现逻辑 return null; } // 根据站点\物料\容器检索符合条件库区 public List getWarehouseAreasBySiteMaterialContainer(String siteCode, String materialCode, String containerType) { // TODO: 实现逻辑 return null; } // 根据站点\物料\容器检索符合条件任务类型 public List getTaskTypesBySiteMaterialContainer(String siteCode, String materialCode, String containerType) { // TODO: 实现逻辑 return null; } // 根据站点\容器检索符合条件容器 public List getContainersBySiteAndContainerType(String siteCode, String containerType) { // TODO: 实现逻辑 return null; } // 根据站点\容器检索符合条件库区 public List getWarehouseAreasBySiteAndContainer(String siteCode, String containerType) { // TODO: 实现逻辑 return null; } // 根据站点\容器检索符合条件路径 public List getPathsBySiteAndContainer(String siteCode, String containerType) { // TODO: 实现逻辑 return null; } // 根据站点\容器检索符合条件任务类型 public List getTaskTypesBySiteAndContainer(String siteCode, String containerType) { // TODO: 实现逻辑 return null; } // 出库校验:根据源库区\目标站点\容器判断是否存在路径 public boolean queryPathIsItAvailableOutArea(Long sourceCode, String targetCode, String barcode,Integer type) { return queryPathIsItAvailableOutArea(sourceCode.toString(),targetCode,barcode,type.toString()); } public boolean queryPathIsItAvailableOutArea(String sourceCode, String targetCode, String barcode,Integer type) { return queryPathIsItAvailableOutArea(sourceCode,targetCode,barcode,type.toString()); } public boolean queryPathIsItAvailableOutArea(String sourceCode, String targetCode, String barcode,String type) { if (queryPathIsItAvailable(sourceCode, targetCode, barcode)){ BasStation basStation = basStationService.getOne(new LambdaQueryWrapper() .eq(BasStation::getStationName, targetCode).last("limit 1")); if (!Cools.isEmpty(basStation)){ if (type.equals("in")){ if (basStation.getInAble()==1){ return true; } } else if (type.equals("out")){ if (basStation.getOutAble()==1){ return true; } } BasStationTypeService basStationTypeService = SpringUtils.getBean(BasStationTypeService.class); BasStationType one = basStationTypeService.getOne(new LambdaQueryWrapper().eq(BasStationType::getStationTypeCode, basStation.getContainerType()).last("limit 1")); if (!Cools.isEmpty(one)) { if (one.getTaskType().contains(type)){ return true; } log.error("目标站点:" + targetCode+" 不支持作业此任务类型:"+type); } log.error("目标站点:" + targetCode+" 不支持作业此任务类型:"+type); } log.error("queryPathIsItAvailableInArea: error"); } return false; } // 出库校验:根据源站点\目标库区\容器判断是否存在路径 public boolean queryPathIsItAvailableInArea(String sourceCode, Long targetCode, String barcode,String type) { return queryPathIsItAvailableInArea(sourceCode,targetCode.toString(),barcode,type); } public boolean queryPathIsItAvailableInArea(String sourceCode, Long targetCode, String barcode,Integer type) { return queryPathIsItAvailableInArea(sourceCode,targetCode.toString(),barcode,type.toString()); } public boolean queryPathIsItAvailableInArea(String sourceCode, String targetCode, String barcode,Integer type) { return queryPathIsItAvailableInArea(sourceCode,targetCode,barcode,type.toString()); } public boolean queryPathIsItAvailableInArea(String sourceCode, String targetCode, String barcode,String type) { if (queryPathIsItAvailable(sourceCode, targetCode, barcode)){ BasStation basStation = basStationService.getOne(new LambdaQueryWrapper() .eq(BasStation::getStationName, sourceCode).last("limit 1")); if (!Cools.isEmpty(basStation)){ if (type.equals("in")){ if (basStation.getInAble()==1){ return true; } } else if (type.equals("out")){ if (basStation.getOutAble()==1){ return true; } } BasStationTypeService basStationTypeService = SpringUtils.getBean(BasStationTypeService.class); BasStationType one = basStationTypeService.getOne(new LambdaQueryWrapper().eq(BasStationType::getStationTypeCode, basStation.getContainerType()).last("limit 1")); if (!Cools.isEmpty(one)) { if (one.getTaskType().contains(type)){ return true; } log.error("当前站点:" + sourceCode+" 不支持作业此任务类型:"+type); } log.error("当前站点:" + sourceCode+" 不支持作业此任务类型:"+type); } log.error("queryPathIsItAvailableInArea: error"); } return false; } // 校验:根据起点\目标点\容器判断是否存在路径 private boolean queryPathIsItAvailable(String sourceCode, String targetCode, String barcode) { BasContainer containerByBarcode = getContainerByBarcode(barcode); if (containerByBarcode == null) { return false; } if (retrieveMissionmMergeReservoirAreaIsItAvailable(sourceCode)){ BasStation basStation = retrieveMissionmMergeSizeIsItAvailable(targetCode); if (!Cools.isEmpty(basStation)){ return queryPathIsItAvailable(sourceCode, targetCode, containerByBarcode); } else { if (retrieveMissionmMergeReservoirAreaIsItAvailable(targetCode)){ return queryPathIsItAvailable(sourceCode, targetCode, containerByBarcode); } log.error("路径校验:根据起点:"+sourceCode+"、目标点:"+targetCode+"、容器规则:" +containerByBarcode.getCodeType()+ "判断是否存在路径==>终点类型未知!!!"); } } else if (retrieveMissionmMergeReservoirAreaIsItAvailable(targetCode)){ BasStation basStation = retrieveMissionmMergeSizeIsItAvailable(sourceCode); if (!Cools.isEmpty(basStation)){ return queryPathIsItAvailable(sourceCode, targetCode, containerByBarcode); } log.error("路径校验:根据起点:"+sourceCode+"、目标点:"+targetCode+"、容器规则:" +containerByBarcode.getCodeType()+ "判断是否存在路径==>起点类型未知!!!"); } else { BasStation basStationS = retrieveMissionmMergeSizeIsItAvailable(sourceCode); BasStation basStationT = retrieveMissionmMergeSizeIsItAvailable(targetCode); if (!Cools.isEmpty(basStationS) && !Cools.isEmpty(basStationT)){ return queryPathIsItAvailable(sourceCode, targetCode, containerByBarcode); } log.error("路径校验:根据起点:"+sourceCode+"、目标点:"+targetCode+"、容器规则:" +containerByBarcode.getCodeType()+ "判断是否存在路径==>起点与终点类型未知!!!"); } return false; } // 校验:根据起点\目标点\容器判断是否存在路径 private boolean queryPathIsItAvailable(String sourceCode, String targetCode, BasContainer containerByBarcode) { try{ TaskPathTemplateMergeService taskPathTemplateMergeService = SpringUtils.getBean(TaskPathTemplateMergeService.class); List taskPathTemplateMergeList = taskPathTemplateMergeService.list(new LambdaQueryWrapper() .eq(TaskPathTemplateMerge::getSourceType, sourceCode) .eq(TaskPathTemplateMerge::getTargetType, targetCode) .apply("container_type != '[]'") // 不是空数组 .apply("JSON_CONTAINS(container_type, {0}) = 1", containerByBarcode.getContainerType().toString()) ); if (Objects.isNull(taskPathTemplateMergeList) || taskPathTemplateMergeList.isEmpty()) { List list = taskPathTemplateMergeService.list(new LambdaQueryWrapper() .eq(TaskPathTemplateMerge::getStepSize, 1) .apply("container_type != '[]'") // 不是空数组 .apply("JSON_CONTAINS(container_type, {0}) = 1", containerByBarcode.getContainerType().toString()) ); if (!Cools.isEmpty(list)) { List stationList = new ArrayList<>(); list.forEach(taskPathTemplate -> { stationList.add(taskPathTemplate.route()); }); List longs = RouteWmsStepFlow.routeGet(stationList, targetCode, sourceCode); if (longs != null && !longs.isEmpty()) { return true; } } log.error("路径校验:根据起点:"+sourceCode+"、目标点:"+targetCode+"、容器规则:" +containerByBarcode.getCodeType()+ "判断是否存在路径==>未找到路径!!!"); } else { return true; } } catch (Exception e) { log.error("路径校验:根据起点:"+sourceCode+"、目标点:"+targetCode+"、容器规则:" +containerByBarcode.getCodeType()+ "判断是否存在路径==>异常:"+e.getMessage()); } return false; } }