|
@@ -1,5 +1,6 @@
|
|
|
package com.ruoyi.ams.business;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
import com.ruoyi.ams.agv.ndc.common.ByteUtil;
|
|
|
import com.ruoyi.ams.agv.ndc.common.CRC16Util;
|
|
|
import com.ruoyi.ams.agv.ndc.domain.AmsTask;
|
|
@@ -88,7 +89,7 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public AjaxResult agvCall(AgvCallItem agvCallItem,Long flowId) {
|
|
|
+ public AjaxResult agvCall(AgvCallItem agvCallItem, Long flowId) {
|
|
|
//查询所属流程
|
|
|
FlowConfigHeaderVO flowConfigHeaderVO = flowConfigHeaderService.selectFlowConfigHeaderById(flowId);
|
|
|
|
|
@@ -134,125 +135,40 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
zoneIdList = Arrays.stream(flowConfigHeaderVO.getLocationFrom().split(",")).collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
- List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId());
|
|
|
- List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId());
|
|
|
-
|
|
|
if (flowConfigHeaderVO.getFlowType().equals("ASN")) {
|
|
|
AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
|
|
|
+ List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId(), null);
|
|
|
+ List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), "shift_no + 0,shift_index");
|
|
|
locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "ASN", asnSoStrategy, agvCall, token);
|
|
|
locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "ASN", asnSoStrategy, agvCall, token);
|
|
|
//2.初始化库存
|
|
|
- for (AgvCallItemDTO call : agvCallDTO.getAgvCallItemDTOList()) {
|
|
|
- invLotLocIdService.deleteInvLotLocIdById(locationFrom.getId());
|
|
|
- invLotLocIdService.initInv(locationFrom.getId().toString(), call.getSku(), Constant.CUSTOMER_ID, call.getQty(), call.getLotattDTO(), BigDecimal.ZERO);
|
|
|
- }
|
|
|
+// for (AgvCallItemDTO call : agvCallDTO.getAgvCallItemDTOList()) {
|
|
|
+// invLotLocIdService.deleteInvLotLocIdById(locationFrom.getId());
|
|
|
+// invLotLocIdService.initInv(locationFrom.getId().toString(), call.getSku(), Constant.CUSTOMER_ID, call.getQty(), call.getLotattDTO(), BigDecimal.ZERO);
|
|
|
+// }
|
|
|
wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
|
|
|
- } else if (flowConfigHeaderVO.getFlowType().equals("SO")) {
|
|
|
- List<Long> locationList = new ArrayList<>();
|
|
|
- for (BaseLocationInfo b : locationFromList) {
|
|
|
- locationList.add(b.getId());
|
|
|
- }
|
|
|
- List<OutWarehouseDTO> warehouseDTOS = new ArrayList<>();
|
|
|
- for (AgvCallItemDTO agvCall : agvCallDTO.getAgvCallItemDTOList()) {
|
|
|
- if (agvCall.getQty() != null) {
|
|
|
- Double qty = invLotLocIdService.queryInvBySku(agvCall.getSku(), agvCall.getLotattDTO(), zoneIdList);
|
|
|
- if (qty == null || qty < agvCall.getQty()) {
|
|
|
- throw new ServiceException(String.format("%s所需库存不够", agvCall.getSku()), token);
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
|
|
|
- outWarehouseDTO.setSku(agvCall.getSku());
|
|
|
- outWarehouseDTO.setQty(agvCall.getQty());
|
|
|
- outWarehouseDTO.setWeight(agvCall.getWeight());
|
|
|
- outWarehouseDTO.setSupplier(agvCall.getSupplier());
|
|
|
- outWarehouseDTO.setLotattDTO(agvCall.getLotattDTO());
|
|
|
- outWarehouseDTO.setWarehouseId(agvCallDTO.getWarehouseId());
|
|
|
- outWarehouseDTO.setAgvCallItemDTO(agvCall);
|
|
|
- warehouseDTOS.add(outWarehouseDTO);
|
|
|
- }
|
|
|
- List<FilterLockInvLocationDTO> locationFromResultList = locationAllocationStrategy.filterLockInv(locationList, warehouseDTOS, asnSoStrategy, token);
|
|
|
- for (FilterLockInvLocationDTO b : locationFromResultList) {
|
|
|
- InWarehouseDTO inWarehouseDTO = new InWarehouseDTO();
|
|
|
- inWarehouseDTO.setWarehouseId(b.getOutWarehouseDTO().getAgvCallItemDTO().getWarehouseId());
|
|
|
- inWarehouseDTO.setSku(b.getOutWarehouseDTO().getAgvCallItemDTO().getSku());
|
|
|
- inWarehouseDTO.setLocationTo(b.getOutWarehouseDTO().getAgvCallItemDTO().getLocationTo());
|
|
|
- inWarehouseDTO.setLocationFrom(b.getOutWarehouseDTO().getAgvCallItemDTO().getLocationFrom());
|
|
|
- inWarehouseDTO.setQty(b.getOutWarehouseDTO().getAgvCallItemDTO().getQty());
|
|
|
- inWarehouseDTO.setSupplier(b.getOutWarehouseDTO().getAgvCallItemDTO().getSupplier());
|
|
|
- inWarehouseDTO.setWeight(b.getOutWarehouseDTO().getAgvCallItemDTO().getWeight());
|
|
|
- inWarehouseDTO.setLotattDTO(b.getOutWarehouseDTO().getAgvCallItemDTO().getLotattDTO());
|
|
|
- locationTo = locationAllocationStrategy.filterLockLocation(locationToList, token);
|
|
|
- wcsTaskList.addAll(this.genTask(b.getLocationInfo(), locationTo, flowConfigHeaderVO, agvCallDTO, token));
|
|
|
- }
|
|
|
- } else if (flowConfigHeaderVO.getFlowType().equals("MVCALL")) {
|
|
|
- for (AgvCallItemDTO agvCall : agvCallDTO.getAgvCallItemDTOList()) {
|
|
|
- Double totalQty = agvCall.getQty();
|
|
|
- int trySize = 100;
|
|
|
- if (agvCall.getQty() != null) {
|
|
|
- Double qty = invLotLocIdService.queryInvBySku(agvCall.getSku(), agvCall.getLotattDTO(), zoneIdList);
|
|
|
- if (qty == null || qty < agvCall.getQty()) {
|
|
|
- throw new ServiceException("所需库存不够", token);
|
|
|
- }
|
|
|
- }
|
|
|
+ } else if (flowConfigHeaderVO.getFlowType().equals("SO")) {
|
|
|
+ AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
|
|
|
+ List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), null);
|
|
|
+ HashMap<String, String> hashMap = JSON.parseObject(JSON.toJSONString(agvCall.getLotattDTO()), HashMap.class);
|
|
|
+ List<BaseLocationInfo> locationFromList = baseLocationInfoMapper.selectSortedLocationLotattListByZoneIdListOrderBy(zoneIdList
|
|
|
+ , agvCall.getWarehouseId(), hashMap, agvCall.getSku(), "inv.create_time");
|
|
|
+ locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "SO", asnSoStrategy, agvCall, token);
|
|
|
+ locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, agvCall, token);
|
|
|
+ wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
|
|
|
|
|
|
- while (trySize > 0) {
|
|
|
- OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
|
|
|
- outWarehouseDTO.setSku(agvCall.getSku());
|
|
|
- outWarehouseDTO.setQty(agvCall.getQty());
|
|
|
- outWarehouseDTO.setWeight(agvCall.getWeight());
|
|
|
- outWarehouseDTO.setSupplier(agvCall.getSupplier());
|
|
|
- outWarehouseDTO.setLotattDTO(agvCall.getLotattDTO());
|
|
|
- outWarehouseDTO.setWarehouseId(agvCall.getWarehouseId());
|
|
|
- BaseLocationInfo mvLocationFrom = outInvAllocation(outWarehouseDTO, token);
|
|
|
- //locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "MV", asnSoStrategy, agvCall, token);
|
|
|
- locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "MV", asnSoStrategy, agvCall, token);
|
|
|
- if (mvLocationFrom == null) {
|
|
|
- break;
|
|
|
- }
|
|
|
- if (locationTo == null) {
|
|
|
- break;
|
|
|
- }
|
|
|
- wcsTaskList.addAll(this.genTask(mvLocationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
|
|
|
- if (agvCall.getQty() != null) {
|
|
|
- Double current = invLotLocIdMapper.queryInvBySkuLocationId(agvCall.getSku(), mvLocationFrom.getId(), agvCall.getLotattDTO());
|
|
|
- if (current != null) {
|
|
|
- totalQty -= current;
|
|
|
- if (totalQty <= 0) {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- trySize--;
|
|
|
- }
|
|
|
- }
|
|
|
- } else if (flowConfigHeaderVO.getFlowType().equals("RECEIPT")) {
|
|
|
- //绑定收货库位库存到起始库位
|
|
|
- String palletNo = agvCallDTO.getPalletNo();
|
|
|
- WmsBoxInfo wmsBoxInfo = new WmsBoxInfo();
|
|
|
- wmsBoxInfo.setBoxNo(palletNo);
|
|
|
- wmsBoxInfo = wmsBoxInfoService.selectWmsBoxInfoByModel(wmsBoxInfo);
|
|
|
- if (wmsBoxInfo == null) {
|
|
|
- throw new ServiceException("托盘不存在");
|
|
|
- }
|
|
|
- wmsBoxInfo.setLocationId(Long.parseLong(agvCallDTO.getLocationFrom()));
|
|
|
- int result = wmsBoxInfoService.updateWmsBoxInfo(wmsBoxInfo);
|
|
|
- if (result <= 0) {
|
|
|
- throw new ServiceException("托盘绑定更新失败");
|
|
|
- }
|
|
|
- //锁定库位
|
|
|
- if (!redisCache.lockCacheObject(locationFrom.getId().toString(), "", token)) {
|
|
|
- throw new ServiceException("库位锁定失败");
|
|
|
- }
|
|
|
- if (!redisCache.lockCacheObject(locationTo.getId().toString(), "", token)) {
|
|
|
- throw new ServiceException("库位锁定失败");
|
|
|
- }
|
|
|
- //生成任务
|
|
|
- this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token);
|
|
|
} else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
|
|
|
AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
|
|
|
+ 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, agvCall, token);
|
|
|
locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "MV", asnSoStrategy, agvCall, token);
|
|
|
+ //2.初始化库存
|
|
|
+ for (AgvCallItemDTO call : agvCallDTO.getAgvCallItemDTOList()) {
|
|
|
+ invLotLocIdService.deleteInvLotLocIdById(locationFrom.getId());
|
|
|
+ invLotLocIdService.initInv(locationFrom.getId().toString(), call.getSku(), Constant.CUSTOMER_ID, call.getQty(), call.getLotattDTO(), BigDecimal.ZERO);
|
|
|
+ }
|
|
|
wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
|
|
|
}
|
|
|
}
|
|
@@ -336,7 +252,7 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
return locationAllocationStrategy.filterLockLocation(locationInfoList, inWarehouseDTO, asnSoStrategy, token);
|
|
|
} else {
|
|
|
// 指定区域的
|
|
|
- List<BaseLocationInfo> locationInfoList = baseLocationInfoService.selectSortedLocatinListByZoneId(Long.parseLong(inWarehouseDTO.getLocationZoneTo()), inWarehouseDTO.getWarehouseId());
|
|
|
+ List<BaseLocationInfo> locationInfoList = baseLocationInfoService.selectSortedLocatinListByZoneId(Long.parseLong(inWarehouseDTO.getLocationZoneTo()), inWarehouseDTO.getWarehouseId(), null);
|
|
|
return locationAllocationStrategy.filterLockLocation(locationInfoList, token);
|
|
|
}
|
|
|
}
|
|
@@ -389,35 +305,45 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
throw new ServiceException("入库起始库位没有可以分配的空库位", token);
|
|
|
}
|
|
|
} else {
|
|
|
- if (locationInfoList != null && locationInfoList.size() > 0) {
|
|
|
- locationInfo = locationAllocationStrategy.filterLockLocation(locationInfoList, token);
|
|
|
- } else {
|
|
|
- InWarehouseDTO inWarehouseDTO = new InWarehouseDTO();
|
|
|
- inWarehouseDTO.setWarehouseId(agvCallDTO.getWarehouseId());
|
|
|
- inWarehouseDTO.setSku(agvCallDTO.getSku());
|
|
|
- inWarehouseDTO.setLocationTo(agvCallDTO.getLocationTo());
|
|
|
- inWarehouseDTO.setLocationFrom(agvCallDTO.getLocationFrom());
|
|
|
- inWarehouseDTO.setQty(agvCallDTO.getQty());
|
|
|
- inWarehouseDTO.setSupplier(agvCallDTO.getSupplier());
|
|
|
- inWarehouseDTO.setWeight(agvCallDTO.getWeight());
|
|
|
- inWarehouseDTO.setLotattDTO(agvCallDTO.getLotattDTO());
|
|
|
- locationInfo = inLocationAllocation(inWarehouseDTO, token);
|
|
|
+ for (BaseLocationInfo b : locationInfoList) {
|
|
|
+ if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("Y") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ locationInfo = b;
|
|
|
+ break;
|
|
|
}
|
|
|
if (locationInfo == null) {
|
|
|
- throw new ServiceException("目标库位没有可以分配的库位", token);
|
|
|
+ throw new ServiceException("没有可以分配的库位", token);
|
|
|
}
|
|
|
- return locationInfo;
|
|
|
}
|
|
|
} else if (type.equals("SO")) {
|
|
|
//起始库位
|
|
|
if (locationType.equals("locationFrom")) {
|
|
|
+ for (BaseLocationInfo b : locationInfoList) {
|
|
|
+ if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("N") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ locationInfo = b;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (locationInfo == null) {
|
|
|
+ throw new ServiceException("没有可以分配的库位", token);
|
|
|
+ }
|
|
|
|
|
|
} else { //目标库位
|
|
|
for (BaseLocationInfo b : locationInfoList) {
|
|
|
if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("Y") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
|
|
|
continue;
|
|
|
}
|
|
|
- redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token);
|
|
|
+ if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
locationInfo = b;
|
|
|
break;
|
|
|
}
|
|
@@ -429,10 +355,12 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
if (locationType.equals("locationFrom")) {
|
|
|
|
|
|
for (BaseLocationInfo b : locationInfoList) {
|
|
|
- if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("N") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
|
|
|
+ if (!b.getStockStatus().equals("00") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
|
|
|
continue;
|
|
|
}
|
|
|
- redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token);
|
|
|
locationInfo = b;
|
|
|
break;
|
|
|
}
|
|
@@ -452,7 +380,9 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
if (!b.getStockStatus().equals("00") || !b.getIsEmpty().equals("Y") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
|
|
|
continue;
|
|
|
}
|
|
|
- redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token);
|
|
|
+ if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
locationInfo = b;
|
|
|
break;
|
|
|
}
|
|
@@ -472,7 +402,7 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<BaseLocationInfo> convertLocation(String locationNoOrZoneId, Long warehouseId) {
|
|
|
+ public List<BaseLocationInfo> convertLocation(String locationNoOrZoneId, Long warehouseId, String orderBy) {
|
|
|
List<BaseLocationInfo> locationInfoList = new ArrayList<>();
|
|
|
if (!StringUtils.isEmpty(locationNoOrZoneId)) {
|
|
|
String[] arr = locationNoOrZoneId.split(",");
|
|
@@ -482,7 +412,7 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
BaseLocationInfo info = baseLocationInfoService.selectBaseLocationInfoByIdOrNo(obj, warehouseId);
|
|
|
locationInfoList.add(info);
|
|
|
} else {
|
|
|
- List<BaseLocationInfo> infoList = baseLocationInfoService.selectSortedLocatinListByZoneId(Long.parseLong(obj), warehouseId);
|
|
|
+ List<BaseLocationInfo> infoList = baseLocationInfoService.selectSortedLocatinListByZoneId(Long.parseLong(obj), warehouseId, orderBy);
|
|
|
locationInfoList.addAll(infoList);
|
|
|
}
|
|
|
}
|
|
@@ -728,7 +658,19 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
@Transactional
|
|
|
@Override
|
|
|
public void autoSendTranSit() {
|
|
|
-
|
|
|
+ List<BaseLocationInfo> baseLocationInfos = baseLocationInfoService.selectSortedLocatinListByZoneId(Constant.ZONE_TYPE.TRANSIT.getValue()
|
|
|
+ , Constant.WAREHOUSE_ID, null);
|
|
|
+ for (BaseLocationInfo baseLocationInfo : baseLocationInfos) {
|
|
|
+ // 判断是否有货并且空闲
|
|
|
+ if (baseLocationInfo.getStockStatus().equals(Constant.STOCK_STATUS.STOCK00.getValue())
|
|
|
+ && baseLocationInfo.getIsEmpty().equals(Constant.IS_YES.N)) {
|
|
|
+ if (baseLocationInfo.getUserdefine1().equals("ASN")) {
|
|
|
+ businessService.agvCall(null, Constant.TRAN_STO_FLOW_ID);
|
|
|
+ } else if (baseLocationInfo.getUserdefine1().equals("SO")) {
|
|
|
+ businessService.agvCall(null, Constant.TRAN_OUT_FLOW_ID);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Transactional
|