|
@@ -1,20 +1,22 @@
|
|
|
package com.imcs.admin.common.wmspolicy.impl;
|
|
|
|
|
|
+import com.imcs.admin.common.BeanCopyUtil;
|
|
|
import com.imcs.admin.common.ListUtils;
|
|
|
import com.imcs.admin.common.Result;
|
|
|
import com.imcs.admin.common.constants.Constants;
|
|
|
import com.imcs.admin.common.wmspolicy.ImportOrExportPolicy;
|
|
|
import com.imcs.admin.entity.ImportOrExportPolicyPo;
|
|
|
+import com.imcs.admin.entity.WStoragelocationWarning;
|
|
|
import com.imcs.admin.entity.assemble.*;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.beans.BeansException;
|
|
|
import org.springframework.context.ApplicationContext;
|
|
|
import org.springframework.context.ApplicationContextAware;
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.atomic.AtomicReference;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Component
|
|
@@ -196,13 +198,164 @@ public class ImportOrExportPolicyContext implements ApplicationContextAware {
|
|
|
}
|
|
|
|
|
|
|
|
|
-//
|
|
|
-// public static TestStrategy getStrategy(String code){
|
|
|
-// TestStrategy testStrategy = testServiceMap.get(code);
|
|
|
-// if (Objects.isNull(testStrategy)) {
|
|
|
-// // 如果通过自定义编码没能找到具体实现类, 去执行默认的实现类代码
|
|
|
-// return testServiceMap.get("default");
|
|
|
-// } else
|
|
|
-// return testStrategy;
|
|
|
-// }
|
|
|
+ /**
|
|
|
+ * 合并出库策略
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Result MergeMaterielPolicy(List<MergeMaterielGroup> mergeMaterielGroups, WStoragelocationWarning storagelocationWarning){
|
|
|
+ HashMap<String , MergeMaterielGroup> materielHashMap = new HashMap();
|
|
|
+ for (MergeMaterielGroup mergeMaterielGroup : mergeMaterielGroups) {
|
|
|
+ materielHashMap.put(mergeMaterielGroup.getPalletCode()+"\n"+ mergeMaterielGroup.getMaterialCode(), mergeMaterielGroup);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, List<MergeMaterielGroup>> collect = mergeMaterielGroups.stream().collect(Collectors.groupingBy(MergeMaterielGroup::getPalletCode));
|
|
|
+
|
|
|
+ List<MergeMaterielGroup> materielGroups = ListUtils.newArrayList();
|
|
|
+
|
|
|
+ collect.forEach((s, items) -> {
|
|
|
+
|
|
|
+ // 总重
|
|
|
+ Double allUpWeight = items.stream()
|
|
|
+ .map(item -> (item.getAmount() == null ? 0 : item.getAmount()) * (item.getMaterialWeight() == null ? 1 : item.getMaterialWeight()))
|
|
|
+ .reduce(0.0, Double::sum);
|
|
|
+
|
|
|
+ // 总数量
|
|
|
+ Integer amount = items.stream()
|
|
|
+ .map(item -> item.getAmount())
|
|
|
+ .reduce(0, Integer::sum);
|
|
|
+
|
|
|
+ MergeMaterielGroup materielGroup = BeanCopyUtil.copyPropertiesSet(items.get(0), MergeMaterielGroup::new);
|
|
|
+ materielGroup.setAllUpWeight(allUpWeight);
|
|
|
+ materielGroup.setAmount(amount);
|
|
|
+
|
|
|
+ materielGroups.add(materielGroup);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 根据需求计算出需要腾出的箱子数
|
|
|
+ Integer warningNumber = storagelocationWarning.getWarningNumber();
|
|
|
+
|
|
|
+ // 升序排序
|
|
|
+ List<MergeMaterielGroup> collect1 = materielGroups.stream().sorted(Comparator.comparingDouble(MergeMaterielGroup::getAllUpWeight))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 降序排序
|
|
|
+ List<MergeMaterielGroup> collect2 = materielGroups.stream().sorted(Comparator.comparingDouble(MergeMaterielGroup::getAllUpWeight).reversed())
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ HashMap<String, MergeMaterielGroup> newHashMap= new HashMap<>();
|
|
|
+ HashMap<String, MergeMaterielGroup> useHashMap= new HashMap<>();
|
|
|
+
|
|
|
+ // 求第一个,满足的数据
|
|
|
+ for (MergeMaterielGroup materielGroup : collect1) {
|
|
|
+ if(newHashMap!=null && newHashMap.size() >= warningNumber){
|
|
|
+ log.info("以满足需求");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(useHashMap !=null && useHashMap.get(materielGroup.getPalletCode()) != null){
|
|
|
+ log.info("主数据已被使用,跳过进行下一个");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 需要对这里面的集合进行合并到其他料箱中
|
|
|
+ List<MergeMaterielGroup> tempMaterielGroups = collect.get(materielGroup.getPalletCode());
|
|
|
+
|
|
|
+ for (MergeMaterielGroup needToMergeMateriel : tempMaterielGroups) {
|
|
|
+ // 倒叙循环物料集合, 优先合并到物料最终的料箱中
|
|
|
+ for (MergeMaterielGroup mergeMaterielGroup : collect2) {
|
|
|
+ // 判断此需要合并的物料在此料箱中是否存在
|
|
|
+ MergeMaterielGroup materialIsExist= materielHashMap.get(mergeMaterielGroup.getPalletCode() + "\n" + needToMergeMateriel.getMaterialCode());
|
|
|
+ if(materialIsExist == null){
|
|
|
+ log.info("此物料箱不存在此物料,物料编码{},被合并物料{},合并物料{}",needToMergeMateriel.getMaterialCode(), needToMergeMateriel.getPalletCode(), mergeMaterielGroup.getPalletCode());
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if(materielGroup.getPalletCode().equals( materialIsExist.getPalletCode())){
|
|
|
+ log.info("相同料箱不做处理");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if(newHashMap !=null && newHashMap.get(materialIsExist.getPalletCode()) != null){
|
|
|
+ log.info("包含主数据,放弃查找下一个");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ double combinedAllUpWeight = mergeMaterielGroup.getAllUpWeight() + (needToMergeMateriel.getAmount() * (needToMergeMateriel.getMaterialWeight() == null? 1: needToMergeMateriel.getMaterialWeight() ));
|
|
|
+ if(materialIsExist.getPalletMaxLoad() !=null && combinedAllUpWeight> Double.valueOf(materialIsExist.getPalletMaxLoad())){
|
|
|
+ log.info("料箱剩余容器不满足要求");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 合并临时主数据参数
|
|
|
+ // 此料箱下:合并后的总数量
|
|
|
+ int consolidatedQuantity = needToMergeMateriel.getAmount() + mergeMaterielGroup.getAmount();
|
|
|
+ mergeMaterielGroup.setAmount(consolidatedQuantity);
|
|
|
+ mergeMaterielGroup.setAllUpWeight(combinedAllUpWeight);
|
|
|
+
|
|
|
+ // 设置合并后的参数
|
|
|
+ // 此物料下:合并后的总数量
|
|
|
+ Integer consolidatedAmount = materialIsExist.getAmount() + needToMergeMateriel.getAmount();
|
|
|
+ // 此物料下:合并后的总数量
|
|
|
+ Double allUpWeight = consolidatedAmount * (materialIsExist.getMaterialWeight() == null ? 1 : materialIsExist.getMaterialWeight());
|
|
|
+
|
|
|
+ materialIsExist.setConsolidatedAmount(consolidatedAmount);
|
|
|
+ materialIsExist.setAllUpWeight(allUpWeight);
|
|
|
+
|
|
|
+ MergeMaterielGroup newMaterielGroup = newHashMap.get(needToMergeMateriel.getPalletCode());
|
|
|
+ if(newMaterielGroup == null){
|
|
|
+ newMaterielGroup = BeanCopyUtil.copyPropertiesSet(needToMergeMateriel, MergeMaterielGroup::new);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(ListUtils.isEmpty(newMaterielGroup.getChildren())){
|
|
|
+ newMaterielGroup.setChildren(ListUtils.newArrayList());
|
|
|
+ }
|
|
|
+ newMaterielGroup.getChildren().add(materialIsExist);
|
|
|
+
|
|
|
+ newHashMap.put(newMaterielGroup.getPalletCode(), newMaterielGroup);
|
|
|
+
|
|
|
+ // 使用的数据物料编号填充到map 保证 不会下次使用到
|
|
|
+ useHashMap.put(needToMergeMateriel.getPalletCode(), needToMergeMateriel);
|
|
|
+ useHashMap.put(materialIsExist.getPalletCode(), materialIsExist);
|
|
|
+
|
|
|
+ break ;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ List<MergeMaterielGroup> newMaterielGroups = ListUtils.newArrayList();
|
|
|
+ /**
|
|
|
+ * 转换成集合返回
|
|
|
+ */
|
|
|
+
|
|
|
+ AtomicReference<Long> tempId = new AtomicReference<>(1l);
|
|
|
+ newHashMap.forEach((s, temp) -> {
|
|
|
+ MergeMaterielGroup newMaterielGroup = BeanCopyUtil.copyPropertiesSet(temp, MergeMaterielGroup::new);
|
|
|
+ newMaterielGroup.setId(tempId.getAndSet(tempId.get() + 1));
|
|
|
+ newMaterielGroup.setMaterialCode(null);
|
|
|
+ newMaterielGroup.setMaterialName(null);
|
|
|
+
|
|
|
+ if(ListUtils.isEmpty(newMaterielGroup.getChildren())){
|
|
|
+ newMaterielGroup.setChildren(ListUtils.newArrayList());
|
|
|
+ }else {
|
|
|
+ newMaterielGroup.setChildren(null);
|
|
|
+ newMaterielGroup.setChildren(ListUtils.newArrayList());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<MergeMaterielGroup> children = temp.getChildren();
|
|
|
+ if(ListUtils.isNotEmpty(children)){
|
|
|
+ for (MergeMaterielGroup child : children) {
|
|
|
+ MergeMaterielGroup materielGroup = BeanCopyUtil.copyPropertiesSet(child, MergeMaterielGroup::new);
|
|
|
+ materielGroup.setId(tempId.getAndSet(tempId.get() + 1));
|
|
|
+ newMaterielGroup.getChildren().add(materielGroup);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ newMaterielGroups.add(newMaterielGroup);
|
|
|
+ });
|
|
|
+
|
|
|
+ if(ListUtils.isEmpty(newMaterielGroups)){
|
|
|
+ return Result.error("不满足合并要求");
|
|
|
+ }
|
|
|
+
|
|
|
+ return Result.success(newMaterielGroups);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|