|
@@ -3,11 +3,13 @@ package com.ruoyi.ams.xuankuang.service;
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
import cn.hutool.core.collection.ListUtil;
|
|
|
import cn.hutool.core.comparator.CompareUtil;
|
|
|
+import cn.hutool.core.map.MapUtil;
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
import com.google.common.collect.Lists;
|
|
|
+import com.google.common.collect.Maps;
|
|
|
import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
|
|
|
import com.ruoyi.ams.asn.service.IWmsDocAsnHeaderService;
|
|
|
import com.ruoyi.ams.config.domain.dto.LotattDTO;
|
|
@@ -105,7 +107,7 @@ public class WmsDocOrderSubService {
|
|
|
//筛选库存 由于选矿项目出库单头只对应一个
|
|
|
Boolean orderRule = getOrderRule();
|
|
|
List<BaseLocationLotattDTO> filteredLocationLotattList = orderRule
|
|
|
- ? selectInventoriesByLocation(baseLocationLotattList, list.get(0)) : filterInv(baseLocationLotattList, orderNo);
|
|
|
+ ? selectInventoriesByLocation(baseLocationLotattList, list.get(0)) : filterInv(baseLocationLotattList, orderNo);
|
|
|
// 匹配库存(撇开先进先出)
|
|
|
// baseLocationLotattVOS = addConfirmAllocationAuto(orderNo);
|
|
|
|
|
@@ -246,17 +248,11 @@ public class WmsDocOrderSubService {
|
|
|
int locationIndex = partitionLocationIdList.indexOf(locationInfo.getId());
|
|
|
if(StringUtils.equals(partitionRowKey, Constants.FIRST)) {
|
|
|
List<Long> firstRightSubList = ListUtil.reverse(ListUtil.sub(partitionLocationIdList, locationIndex, partitionLocationIdList.size()));
|
|
|
- List<Long> resultLocationIdList = checkLocationIdList(locationInfo.getId(), sourceInvLotLocIdList, firstRightSubList,
|
|
|
+ Map<String, Object> allocateLocationInfo = allocateLocationIdList(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);
|
|
|
+ baseLocationLotattList = (List<BaseLocationLotattDTO>) allocateLocationInfo.get("baseLocationLotattList");
|
|
|
+ quantity = (BigDecimal) allocateLocationInfo.get("quantity");
|
|
|
+ CollectionUtil.addAll(selectedLocationIdList, (List<Long>) allocateLocationInfo.get("resultLocationIdList"));
|
|
|
if(CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
|
|
|
}
|
|
|
|
|
@@ -292,24 +288,18 @@ public class WmsDocOrderSubService {
|
|
|
|
|
|
baseLocationLotattList = baseLocationLotattList.stream()
|
|
|
.filter(item -> !CollectionUtil.contains(finalLeftLocationIdList, item.getId())).collect(Collectors.toList());
|
|
|
- selectedLocationIdList.addAll(finalLeftLocationIdList);
|
|
|
+ CollectionUtil.addAll(selectedLocationIdList, finalLeftLocationIdList);
|
|
|
+
|
|
|
if(CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
|
|
|
}
|
|
|
|
|
|
if(StringUtils.equals(partitionRowKey, Constants.LAST)) {
|
|
|
List<Long> lastLeftSubList = ListUtil.sub(partitionLocationIdList, Constants.START_VALUE, locationIndex + 1);
|
|
|
- List<Long> lastLeftLocationIdList = checkLocationIdList(locationInfo.getId(), sourceInvLotLocIdList, lastLeftSubList,
|
|
|
+ Map<String, Object> allocateLocationInfo = allocateLocationIdList(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);
|
|
|
+ baseLocationLotattList = (List<BaseLocationLotattDTO>) allocateLocationInfo.get("baseLocationLotattList");
|
|
|
+ quantity = (BigDecimal) allocateLocationInfo.get("quantity");
|
|
|
+ CollectionUtil.addAll(selectedLocationIdList, (List<Long>) allocateLocationInfo.get("resultLocationIdList"));
|
|
|
if(CompareUtil.compare(quantity, BigDecimal.ZERO) <= 0) break;
|
|
|
}
|
|
|
}
|
|
@@ -320,6 +310,23 @@ public class WmsDocOrderSubService {
|
|
|
).filter(item -> ObjectUtil.isNotNull(item)).collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
+ private Map<String, Object> allocateLocationIdList(Long locationId, List<InvLotLocId> sourceInvLotLocIdList, List<Long> subList, List<BaseLocationLotattDTO> baseLocationLotattList, BigDecimal quantity) {
|
|
|
+
|
|
|
+ List<Long> resultLocationIdList = checkLocationIdListOnBeside(locationId, sourceInvLotLocIdList, subList,
|
|
|
+ baseLocationLotattList, quantity);
|
|
|
+ if(CollectionUtil.isEmpty(resultLocationIdList)) return Maps.newHashMap();
|
|
|
+ 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());
|
|
|
+ return MapUtil.builder(new HashMap<String, Object>()).put("resultLocationIdList", resultLocationIdList)
|
|
|
+ .put("quantity", quantity).put("baseLocationLotattList", baseLocationLotattList).map();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private BigDecimal compareCount(BigDecimal middleLeftCount, BigDecimal middleRightCount) {
|
|
|
if(CompareUtil.compare(middleLeftCount, middleRightCount) < 0
|
|
|
&& CompareUtil.compare(middleLeftCount, BigDecimal.ZERO) > 0){
|
|
@@ -341,9 +348,44 @@ public class WmsDocOrderSubService {
|
|
|
}
|
|
|
|
|
|
|
|
|
+ private List<Long> checkLocationIdListOnBeside(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());
|
|
|
+ if(CollectionUtil.isEmpty(filteredList)) return Lists.newArrayList(locationId);
|
|
|
+
|
|
|
+ //查有没有入库任务,存在入库任务,此列不能出库
|
|
|
+ List<BaseLocationInfo> locationInfoList = baseLocationInfoService.selectLocationInfoList(filteredList);
|
|
|
+ List<BaseLocationInfo> asnTaskCheckList = locationInfoList.stream()
|
|
|
+ .filter(item -> StringUtils.equals(item.getStockStatus(), Constant.STOCK_STATUS.STOCK10.getValue())
|
|
|
+ && StringUtils.equals(item.getIsEmpty(), Constants.YES)).collect(Collectors.toList());
|
|
|
+ if(CollectionUtil.isNotEmpty(asnTaskCheckList)) return Lists.newArrayList();
|
|
|
+
|
|
|
+ //目前还未被推荐的总库存
|
|
|
+ List<InvLotLocId> filterdInvLocIdList = sourceInvLotLocIdList.stream()
|
|
|
+ .filter(item -> CollectionUtil.contains(locationIdList, Long.parseLong(item.getLocationId()))).collect(Collectors.toList());
|
|
|
+ //当前列的库存
|
|
|
+ List<InvLotLocId> currentRowInvList = filterdInvLocIdList.stream()
|
|
|
+ .filter(item -> CollectionUtil.contains(subList, Long.parseLong(item.getLocationId()))).collect(Collectors.toList());
|
|
|
+ BigDecimal currentRowInvCount = currentRowInvList.stream().filter(item -> ObjectUtil.isNotNull(item.getQty()))
|
|
|
+ .map(item -> item.getQty()).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
|
|
|
+ List<InvLotLocId> exceptCurrentInvIdList = filterdInvLocIdList.stream()
|
|
|
+ .filter(item -> !StringUtils.equals(item.getLocationId(), NumberUtil.toStr(locationId))).collect(Collectors.toList());
|
|
|
+ BigDecimal exceptCurrentLocationInvCount = exceptCurrentInvIdList.stream().filter(item -> ObjectUtil.isNotNull(item.getQty()))
|
|
|
+ .map(item -> item.getQty()).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
|
|
|
+ List<Long> invIdList = currentRowInvList.stream().map(item -> Long.parseLong(item.getLocationId())).collect(Collectors.toList());
|
|
|
+
|
|
|
+ return CompareUtil.compare(currentRowInvCount, quantity) < 0
|
|
|
+ || CompareUtil.compare(exceptCurrentLocationInvCount, quantity) < 0
|
|
|
+ ? subList.stream().filter(item -> CollectionUtil.contains(invIdList, item)).collect(Collectors.toList())
|
|
|
+ : Lists.newArrayList();
|
|
|
+ }
|
|
|
+
|
|
|
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()
|
|
@@ -358,7 +400,7 @@ public class WmsDocOrderSubService {
|
|
|
&& StringUtils.equals(item.getIsEmpty(), Constants.YES)).collect(Collectors.toList());
|
|
|
if(CollectionUtil.isNotEmpty(asnTaskCheckList)) return Lists.newArrayList();
|
|
|
|
|
|
- //要过滤掉已经推荐的库存
|
|
|
+ //比较数量,决定最终是否可以推荐
|
|
|
List<InvLotLocId> invLocIdList = sourceInvLotLocIdList.stream()
|
|
|
.filter(item -> CollectionUtil.contains(locationIdList, Long.parseLong(item.getLocationId())))
|
|
|
.filter(item -> CollectionUtil.contains(subList, Long.parseLong(item.getLocationId()))).collect(Collectors.toList());
|