|
@@ -1,5 +1,6 @@
|
|
|
package com.ruoyi.ams.business;
|
|
|
|
|
|
+import com.ruoyi.ams.business.domain.FilterLockInvLocationDTO;
|
|
|
import com.ruoyi.ams.common.Constant;
|
|
|
import com.ruoyi.ams.config.domain.AsnSoStrategy;
|
|
|
import com.ruoyi.ams.config.domain.dto.*;
|
|
@@ -59,138 +60,129 @@ public class BusinessServiceImpl implements IBusinessService {
|
|
|
public AjaxResult agvCall(FlowConfigHeaderVO flowConfigHeaderVO, List<AgvCallDTO> agvCallDTOList) {
|
|
|
//唯一操作标识,用于redis标记。报错时根据该id进行删除
|
|
|
Long token = SnowflakeIdWorker.generateId();
|
|
|
- //查询全局配置策略
|
|
|
- AsnSoStrategy asnSoStrategy = asnSoStrategyMapper.selectAsnSoStrategy();
|
|
|
+ try {
|
|
|
+ //查询全局配置策略
|
|
|
+ AsnSoStrategy asnSoStrategy = asnSoStrategyMapper.selectAsnSoStrategy();
|
|
|
|
|
|
- for (AgvCallDTO agvCallDTO : agvCallDTOList) {
|
|
|
- //如果是入库把起始库位相同的数据整合到一起生成库存记录
|
|
|
- BaseLocationInfo locationFrom = null;
|
|
|
- BaseLocationInfo locationTo = null;
|
|
|
- List<WcsTask> wcsTaskList = new ArrayList<>();
|
|
|
- String paramLocationFrom = agvCallDTO.getLocationFrom();
|
|
|
- String paramLocationTo = agvCallDTO.getLocationTo();
|
|
|
- List<String> zoneIdList = new ArrayList<>();
|
|
|
- if (StringUtils.isEmpty(paramLocationFrom)) {
|
|
|
- paramLocationFrom = flowConfigHeaderVO.getLocationFrom();
|
|
|
- }
|
|
|
- if (StringUtils.isEmpty(paramLocationTo)) {
|
|
|
- paramLocationTo = flowConfigHeaderVO.getLocationTo();
|
|
|
- }
|
|
|
- if (!StringUtils.isEmpty(flowConfigHeaderVO.getLocationFrom())) {
|
|
|
- zoneIdList = Arrays.stream(flowConfigHeaderVO.getLocationFrom().split(",")).collect(Collectors.toList());
|
|
|
- }
|
|
|
+ for (AgvCallDTO agvCallDTO : agvCallDTOList) {
|
|
|
+ //如果是入库把起始库位相同的数据整合到一起生成库存记录
|
|
|
+ BaseLocationInfo locationFrom = null;
|
|
|
+ BaseLocationInfo locationTo = null;
|
|
|
+ List<WcsTask> wcsTaskList = new ArrayList<>();
|
|
|
+ String paramLocationFrom = agvCallDTO.getLocationFrom();
|
|
|
+ String paramLocationTo = agvCallDTO.getLocationTo();
|
|
|
+ List<String> zoneIdList = new ArrayList<>();
|
|
|
+ if (StringUtils.isEmpty(paramLocationFrom)) {
|
|
|
+ paramLocationFrom = flowConfigHeaderVO.getLocationFrom();
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(paramLocationTo)) {
|
|
|
+ paramLocationTo = flowConfigHeaderVO.getLocationTo();
|
|
|
+ }
|
|
|
+ if (!StringUtils.isEmpty(flowConfigHeaderVO.getLocationFrom())) {
|
|
|
+ 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());
|
|
|
+ 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);
|
|
|
- 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.initInv(locationFrom.getId().toString(), call.getSku(), Constant.CUSTOMER_ID, call.getQty(), call.getLotattDTO());
|
|
|
- }
|
|
|
- wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, token));
|
|
|
- } else if (flowConfigHeaderVO.getFlowType().equals("SO")) {
|
|
|
- for (AgvCallItemDTO agvCall : agvCallDTO.getAgvCallItemDTOList()) {
|
|
|
- //判断总库存是否足够
|
|
|
- Double totalQty = agvCall.getQty();
|
|
|
- int trySize = 100;
|
|
|
- Double qty = invLotLocIdService.queryInvBySku(agvCall.getSku(), agvCall.getLotattDTO(), zoneIdList);
|
|
|
- if (qty == null || qty < agvCall.getQty()) {
|
|
|
- throw new ServiceException("所需库存不够");
|
|
|
+ if (flowConfigHeaderVO.getFlowType().equals("ASN")) {
|
|
|
+ AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
|
|
|
+ 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.initInv(locationFrom.getId().toString(), call.getSku(), Constant.CUSTOMER_ID, call.getQty(), call.getLotattDTO());
|
|
|
}
|
|
|
- //TODO 改成新分配方法
|
|
|
- while (trySize > 0) {
|
|
|
- BaseLocationInfo soLocationFrom;
|
|
|
- if (locationFromList != null && locationFromList.size() > 0) {
|
|
|
- List<Long> locationList = new ArrayList<>();
|
|
|
- for (BaseLocationInfo b : locationFromList) {
|
|
|
- locationList.add(b.getId());
|
|
|
- }
|
|
|
- List<BaseLocationLotattVO> locationLotattVOList = baseLocationInfoMapper.selectSortedLocationLotattListByLocationIdList(locationList, 1L, agvCall.getLotattDTO().getAttr(), agvCall.getSku());
|
|
|
- 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());
|
|
|
- soLocationFrom = locationAllocationStrategy.filterLockInv(locationLotattVOList, outWarehouseDTO, asnSoStrategy, token);
|
|
|
- } else {
|
|
|
- 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());
|
|
|
- soLocationFrom = outInvAllocation(outWarehouseDTO, token);
|
|
|
- }
|
|
|
- if (soLocationFrom == null) {
|
|
|
- throw new ServiceException("没有可分配的库存", token);
|
|
|
- }
|
|
|
- locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, agvCall, token);
|
|
|
- wcsTaskList.addAll(this.genTask(soLocationFrom, locationTo, flowConfigHeaderVO, token));
|
|
|
- Double current = invLotLocIdMapper.queryInvBySkuLocationId(agvCall.getSku(), soLocationFrom.getId(), agvCall.getLotattDTO());
|
|
|
- if (current != null) {
|
|
|
- totalQty -= current;
|
|
|
- if (totalQty <= 0) {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- trySize--;
|
|
|
+ wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, token));
|
|
|
+ } else if (flowConfigHeaderVO.getFlowType().equals("SO")) {
|
|
|
+ List<Long> locationList = new ArrayList<>();
|
|
|
+ for (BaseLocationInfo b : locationFromList) {
|
|
|
+ locationList.add(b.getId());
|
|
|
}
|
|
|
- }
|
|
|
- } else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
|
|
|
- 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("所需库存不够");
|
|
|
+ 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);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- 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, token));
|
|
|
+ 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, token));
|
|
|
+ }
|
|
|
+ } else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
|
|
|
+ for (AgvCallItemDTO agvCall : agvCallDTO.getAgvCallItemDTOList()) {
|
|
|
+ Double totalQty = agvCall.getQty();
|
|
|
+ int trySize = 100;
|
|
|
if (agvCall.getQty() != null) {
|
|
|
- Double current = invLotLocIdMapper.queryInvBySkuLocationId(agvCall.getSku(), mvLocationFrom.getId(), agvCall.getLotattDTO());
|
|
|
- if (current != null) {
|
|
|
- totalQty -= current;
|
|
|
- if (totalQty <= 0) {
|
|
|
- break;
|
|
|
+ Double qty = invLotLocIdService.queryInvBySku(agvCall.getSku(), agvCall.getLotattDTO(), zoneIdList);
|
|
|
+ if (qty == null || qty < agvCall.getQty()) {
|
|
|
+ throw new ServiceException("所需库存不够", 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, 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--;
|
|
|
}
|
|
|
- trySize--;
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
// for (WcsTask wcsTask : wcsTaskList) {
|
|
|
// this.addTask(wcsTask);
|
|
|
// }
|
|
|
+ }
|
|
|
+ return AjaxResult.success("任务下发成功");
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new ServiceException(e.getMessage(), token);
|
|
|
}
|
|
|
- return AjaxResult.success("任务下发成功");
|
|
|
}
|
|
|
|
|
|
@Transactional
|