|
@@ -18,7 +18,6 @@ import com.ruoyi.ams.order.domain.WmsDocOrderHeader;
|
|
|
import com.ruoyi.ams.order.mapper.WmsDocOrderHeaderMapper;
|
|
|
import com.ruoyi.ams.order.service.IWmsDocOrderDetailsService;
|
|
|
import com.ruoyi.ams.order.service.IWmsDocOrderHeaderService;
|
|
|
-import com.ruoyi.ams.xuankuang.domain.dto.PartitionLocationDTO;
|
|
|
import com.ruoyi.ams.xuankuang.domain.form.OutTaskForm;
|
|
|
import com.ruoyi.ams.xuankuang.domain.vo.WcsResponseVo;
|
|
|
import com.ruoyi.base.constant.Constant;
|
|
@@ -117,6 +116,7 @@ public class WmsDocOrderSubService {
|
|
|
//重新筛选库存
|
|
|
// baseLocationLotattVOS1 = filterInv(baseLocationLotattVOS, orderNo);
|
|
|
|
|
|
+ if(1==1) throw new RuntimeException("test");
|
|
|
boolean con = true;
|
|
|
//机械手应拆袋数
|
|
|
int allocateQuantities = 0;
|
|
@@ -140,16 +140,14 @@ public class WmsDocOrderSubService {
|
|
|
String sku = baseLocationLotatt.getSku();
|
|
|
String taskNo = IdWorker.getIdStr();
|
|
|
if (sku.equals("C4H9O2PSSNH4")) {
|
|
|
- // 生成四向车出库任务
|
|
|
- wcsTaskSubService.addWcsOutTask(taskNo, locationFrom, Constant.DRUM_CONNECTORS.toString(), orderNo, palletNo, wcsNo);
|
|
|
- //修改出库出库存的traceId
|
|
|
- invLotLocIdService.operateTraceIdByLocationId(locationId, taskNo);
|
|
|
+ // 生成桶装料出库任务
|
|
|
+ addWcsOutTask(taskNo, locationFrom, Constant.DRUM_CONNECTORS.toString(), orderNo, palletNo, wcsNo, "桶装料出库任务");
|
|
|
} else {
|
|
|
// 生成四向车出库任务
|
|
|
- wcsTaskSubService.addWcsOutTask(taskNo, locationFrom, Constant.LOC_SORTATION_CACHE.toString(), orderNo, palletNo, wcsNo);
|
|
|
- //修改出库出库存的traceId
|
|
|
- invLotLocIdService.operateTraceIdByLocationId(locationId, taskNo);
|
|
|
+ addWcsOutTask(taskNo, locationFrom, Constant.LOC_SORTATION_CACHE.toString(), orderNo, palletNo, wcsNo, "袋装料出库任务");
|
|
|
}
|
|
|
+ //修改出库出库存的traceId
|
|
|
+ invLotLocIdService.operateTraceIdByLocationId(locationId, taskNo);
|
|
|
//调用出库任务下发接口
|
|
|
OutTaskForm outTaskForm = new OutTaskForm();
|
|
|
outTaskForm.setTaskNo(taskNo);
|
|
@@ -199,6 +197,13 @@ public class WmsDocOrderSubService {
|
|
|
return AjaxResult.success("", filteredLocationLotattList);
|
|
|
}
|
|
|
|
|
|
+ private AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo,
|
|
|
+ String orderNo, String palletNo, String wcsNo, String remark) {
|
|
|
+ return wcsTaskSubService.addWcsOutTask(taskNo, locationFrom, locationTo
|
|
|
+ , orderNo, palletNo, wcsNo, 10L, remark);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
public Boolean getOrderRule() {
|
|
|
String warehouseAttrConfig = sysConfigService.selectConfigByKey(SceneConstants.WAREHOUSE_ATTRIBUTE_SCENE_CONFIG);
|
|
|
if (StringUtils.isBlank(warehouseAttrConfig)) throw new BaseException("warehouseAttrConfig is blank");
|
|
@@ -213,11 +218,12 @@ public class WmsDocOrderSubService {
|
|
|
|
|
|
List<String> locationIdList = baseLocationLotattList.stream()
|
|
|
.filter(ObjectUtil::isNotNull).map(item -> NumberUtil.toStr(item.getId())).collect(Collectors.toList());
|
|
|
- List<BaseLocationLotattDTO> baseLocationAllList = Lists.newArrayList(baseLocationLotattList);
|
|
|
+
|
|
|
List<InvLotLocId> sourceInvLotLocIdList = invLotLocIdService.selectInvLotLocIdList(locationIdList);
|
|
|
BigDecimal quantity = docOrderDetail.getQtyOrdered();
|
|
|
//从最老的库存开始,计算库存所在的列是否符合要求
|
|
|
List<Long> selectedLocationIdList = Lists.newArrayList();
|
|
|
+ ArrayList<BaseLocationLotattDTO> copyLocationLotattList = Lists.newArrayList(baseLocationLotattList);
|
|
|
for (InvLotLocId invLotLocId : sourceInvLotLocIdList){
|
|
|
BaseLocationInfo locationInfo = baseLocationLotattList.stream()
|
|
|
.filter(item -> StringUtils.equals(NumberUtil.toStr(item.getId()), invLotLocId.getLocationId())).findFirst().orElse(null);
|
|
@@ -232,60 +238,84 @@ public class WmsDocOrderSubService {
|
|
|
Integer lastWayNo = CollectionUtil.getLast(wayRowNoList);
|
|
|
String partitionRowKey = getPartitionRowKey(firstWayNo, lastWayNo, locationInfo.getRowNo());
|
|
|
List<Long> partitionLocationIdList = partitionRowNoListMapper.get(partitionRowKey);
|
|
|
- if (CollectionUtil.isEmpty(partitionLocationIdList)) continue;
|
|
|
- int locationIndex = partitionLocationIdList.indexOf(locationInfo.getId());
|
|
|
|
|
|
- List<Long> partitionLocationRightSubList = !StringUtils.equals(partitionRowKey, Constants.LAST) ?
|
|
|
- ListUtil.reverse(ListUtil.sub(partitionLocationIdList, locationIndex, partitionLocationIdList.size())) : Lists.newArrayList();
|
|
|
- List<Long> partitionLocationLeftSubList = !StringUtils.equals(partitionRowKey, Constants.FIRST)
|
|
|
- ? ListUtil.sub(partitionLocationIdList, Constants.START_VALUE, locationIndex + 1) : Lists.newArrayList();
|
|
|
- List<Long> partitionLocationSubList = CollectionUtil.isNotEmpty(partitionLocationRightSubList) ? partitionLocationRightSubList : partitionLocationLeftSubList;
|
|
|
- PartitionLocationDTO partitionLocationDTO = buildPartitionLocationDTO(locationInfo.getId(), quantity, baseLocationLotattList,
|
|
|
- sourceInvLotLocIdList, partitionLocationSubList);
|
|
|
- if (ObjectUtil.isNull(partitionLocationDTO)) continue;
|
|
|
- BigDecimal qtyCount = partitionLocationDTO.getQtyCount();
|
|
|
- List<Long> resultLocationIdList = partitionLocationDTO.getResultLocationIdList();
|
|
|
+ int locationIndex = partitionLocationIdList.indexOf(locationInfo.getId());
|
|
|
+ if(StringUtils.equals(partitionRowKey, Constants.FIRST)) {
|
|
|
+ List<Long> firstRightSubList = ListUtil.sub(partitionLocationIdList, locationIndex, partitionLocationIdList.size());
|
|
|
+ List<Long> resultLocationIdList = checkLocationIdList(locationInfo.getId(), sourceInvLotLocIdList, firstRightSubList,
|
|
|
+ baseLocationLotattList, quantity);
|
|
|
+ if(CollectionUtil.isEmpty(resultLocationIdList)) continue;
|
|
|
+ BigDecimal firstRightCount = sourceInvLotLocIdList.stream()
|
|
|
+ .filter(item -> CollectionUtil.contains(resultLocationIdList, Long.parseLong(item.getLocationId()))
|
|
|
+ && ObjectUtil.isNotNull(item.getQty()))
|
|
|
+ .map(item -> item.getQty()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ quantity = NumberUtil.sub(quantity, firstRightCount);
|
|
|
+ baseLocationLotattList = baseLocationLotattList.stream()
|
|
|
+ .filter(item -> !CollectionUtil.contains(resultLocationIdList, item.getId())).collect(Collectors.toList());
|
|
|
+ selectedLocationIdList.addAll(resultLocationIdList);
|
|
|
+ if(CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
|
|
|
+ }
|
|
|
|
|
|
if(StringUtils.equals(partitionRowKey, Constants.MIDDLE)){
|
|
|
- PartitionLocationDTO partitionLocationLeftDTO = buildPartitionLocationDTO(locationInfo.getId(), quantity, baseLocationLotattList,
|
|
|
- sourceInvLotLocIdList, partitionLocationLeftSubList);
|
|
|
- if (ObjectUtil.isNull(partitionLocationLeftDTO)) continue;
|
|
|
- qtyCount = CompareUtil.compare(partitionLocationLeftDTO.getQtyCount(), qtyCount) < 0
|
|
|
- ? partitionLocationLeftDTO.getQtyCount() : qtyCount;
|
|
|
- resultLocationIdList = CompareUtil.compare(partitionLocationLeftDTO.getQtyCount(), qtyCount) < 0
|
|
|
- ? partitionLocationLeftDTO.getResultLocationIdList() : resultLocationIdList;
|
|
|
+ List<Long> middleLeftSubList = ListUtil.reverse(ListUtil.sub(partitionLocationIdList, Constants.START_VALUE, locationIndex + 1));
|
|
|
+ List<Long> middleLeftLocationIdList = checkLocationIdList(locationInfo.getId(), sourceInvLotLocIdList, middleLeftSubList,
|
|
|
+ baseLocationLotattList, quantity);
|
|
|
+ List<Long> middleRightSubList = ListUtil.sub(partitionLocationIdList, locationIndex, partitionLocationIdList.size());
|
|
|
+ List<Long> middleRightLocationIdList = checkLocationIdList(locationInfo.getId(), sourceInvLotLocIdList, middleRightSubList,
|
|
|
+ baseLocationLotattList, quantity);
|
|
|
+ if(CollectionUtil.isEmpty(middleLeftLocationIdList)
|
|
|
+ && CollectionUtil.isEmpty(middleRightLocationIdList)) continue;
|
|
|
+
|
|
|
+ BigDecimal middleLeftCount = sourceInvLotLocIdList.stream()
|
|
|
+ .filter(item -> CollectionUtil.contains(middleLeftLocationIdList, Long.parseLong(item.getLocationId()))
|
|
|
+ && ObjectUtil.isNotNull(item.getQty()))
|
|
|
+ .map(item -> item.getQty()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ BigDecimal middleRightCount = sourceInvLotLocIdList.stream()
|
|
|
+ .filter(item -> CollectionUtil.contains(middleRightLocationIdList, Long.parseLong(item.getLocationId()))
|
|
|
+ && ObjectUtil.isNotNull(item.getQty()))
|
|
|
+ .map(item -> item.getQty()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ BigDecimal singleRowInvCount = CompareUtil.compare(middleLeftCount, middleRightCount) < 0
|
|
|
+ && CompareUtil.compare(middleLeftCount, BigDecimal.ZERO) > 0 ? middleLeftCount : middleRightCount;
|
|
|
+ quantity = NumberUtil.sub(quantity, singleRowInvCount);
|
|
|
+
|
|
|
+ List<Long> finalList = CompareUtil.compare(middleLeftCount, middleRightCount) < 0
|
|
|
+ && CompareUtil.compare(middleLeftCount, BigDecimal.ZERO) > 0
|
|
|
+ ? middleLeftLocationIdList : middleRightLocationIdList;
|
|
|
+
|
|
|
+ baseLocationLotattList = baseLocationLotattList.stream()
|
|
|
+ .filter(item -> !CollectionUtil.contains(finalList, item.getId())).collect(Collectors.toList());
|
|
|
+ selectedLocationIdList.addAll(finalList);
|
|
|
+ if(CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
|
|
|
}
|
|
|
- List<Long> partitionLocationList = resultLocationIdList;
|
|
|
- quantity = NumberUtil.sub(quantity, qtyCount);
|
|
|
- selectedLocationIdList.addAll(resultLocationIdList);
|
|
|
- baseLocationLotattList = baseLocationLotattList.stream()
|
|
|
- .filter(item -> !CollectionUtil.contains(partitionLocationList, item.getId())).collect(Collectors.toList());
|
|
|
- if (CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
|
|
|
- }
|
|
|
|
|
|
- return baseLocationAllList.stream().filter(item -> CollectionUtil.contains(selectedLocationIdList, item.getId())).collect(Collectors.toList());
|
|
|
+ if(StringUtils.equals(partitionRowKey, Constants.LAST)) {
|
|
|
+ List<Long> lastLeftSubList = ListUtil.reverse(ListUtil.sub(partitionLocationIdList, Constants.START_VALUE, locationIndex + 1));
|
|
|
+ List<Long> lastLeftLocationIdList = checkLocationIdList(locationInfo.getId(), sourceInvLotLocIdList, lastLeftSubList,
|
|
|
+ baseLocationLotattList, quantity);
|
|
|
+ if(CollectionUtil.isEmpty(lastLeftLocationIdList)) continue;
|
|
|
+ BigDecimal lastLeftCount = sourceInvLotLocIdList.stream()
|
|
|
+ .filter(item -> CollectionUtil.contains(lastLeftLocationIdList, Long.parseLong(item.getLocationId()))
|
|
|
+ && ObjectUtil.isNotNull(item.getQty()))
|
|
|
+ .map(item -> item.getQty()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+
|
|
|
+ quantity = NumberUtil.sub(quantity, lastLeftCount);
|
|
|
+ baseLocationLotattList = baseLocationLotattList.stream()
|
|
|
+ .filter(item -> !CollectionUtil.contains(lastLeftLocationIdList, item.getId())).collect(Collectors.toList());
|
|
|
+ selectedLocationIdList.addAll(lastLeftLocationIdList);
|
|
|
+ if(CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ log.info("current selectedLocationIdList info is {}", JSONObject.toJSONString(selectedLocationIdList));
|
|
|
+ return copyLocationLotattList.stream().filter(item -> CollectionUtil.contains(selectedLocationIdList, item.getId())).collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
- private PartitionLocationDTO buildPartitionLocationDTO(Long locationId, BigDecimal quantity, List<BaseLocationLotattDTO> baseLocationLotattList, List<InvLotLocId> sourceInvLotLocIdList, List<Long> partitionLocationSubList){
|
|
|
- List<Long> checkLocationIdList = checkLocationIdList(locationId, sourceInvLotLocIdList, partitionLocationSubList,
|
|
|
- baseLocationLotattList, quantity);
|
|
|
- if(CollectionUtil.isEmpty(checkLocationIdList)) return null;
|
|
|
- BigDecimal qtyCount = sourceInvLotLocIdList.stream()
|
|
|
- .filter(item -> CollectionUtil.contains(checkLocationIdList, Long.parseLong(item.getLocationId()))
|
|
|
- && ObjectUtil.isNotNull(item.getQty()))
|
|
|
- .map(item -> item.getQty()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- PartitionLocationDTO partitionLocationDTO = new PartitionLocationDTO();
|
|
|
- partitionLocationDTO.setResultLocationIdList(checkLocationIdList);
|
|
|
- partitionLocationDTO.setQtyCount(qtyCount);
|
|
|
- return partitionLocationDTO;
|
|
|
- }
|
|
|
|
|
|
|
|
|
private List<Long> checkLocationIdList(Long locationId, List<InvLotLocId> sourceInvLotLocIdList, List<Long> subList,
|
|
|
List<BaseLocationLotattDTO> baseLocationLotattList, BigDecimal quantity) {
|
|
|
//要过滤掉已经推荐的库存
|
|
|
List<Long> locationIdList = baseLocationLotattList.stream().map(item -> item.getId()).collect(Collectors.toList());
|
|
|
- //证明这一列只有这一个
|
|
|
+ //证明这一列只有这一个 or 证明外侧都是空的
|
|
|
List<Long> filteredList = subList.stream()
|
|
|
.filter(item -> !ObjectUtil.equal(item, locationId)
|
|
|
&& CollectionUtil.contains(locationIdList, item)).collect(Collectors.toList());
|
|
@@ -298,12 +328,6 @@ public class WmsDocOrderSubService {
|
|
|
&& StringUtils.equals(item.getIsEmpty(), Constants.YES)).collect(Collectors.toList());
|
|
|
if(CollectionUtil.isNotEmpty(asnTaskCheckList)) return Lists.newArrayList();
|
|
|
|
|
|
- //证明外侧都是空的
|
|
|
- List<BaseLocationLotattDTO> locationLotattList = baseLocationLotattList.stream()
|
|
|
- .filter(item -> CollectionUtil.contains(filteredList, item.getId())
|
|
|
- && CollectionUtil.contains(locationIdList, item.getId())).collect(Collectors.toList());
|
|
|
- if(CollectionUtil.isEmpty(locationLotattList)) return Lists.newArrayList(locationId);
|
|
|
-
|
|
|
//要过滤掉已经推荐的库存
|
|
|
List<InvLotLocId> invLocIdList = sourceInvLotLocIdList.stream()
|
|
|
.filter(item -> CollectionUtil.contains(locationIdList, Long.parseLong(item.getLocationId())))
|