diff --git a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/controller/SubController.java b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/controller/SubController.java index b8dd83c..4c4acc1 100644 --- a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/controller/SubController.java +++ b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/controller/SubController.java @@ -174,10 +174,10 @@ public class SubController { SetGroupCalRslt(p); logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size()); } - if (gltGGrpCalRslt.size() > 0) { - now = new Date(); - SetSaveDate(p); - } + // if (gltGGrpCalRslt.size() > 0) { + // now = new Date(); + // SetSaveDate(p); + // } } catch (Exception e) { logger.error("An error occurred", e); } @@ -191,7 +191,7 @@ public class SubController { return JsonData.buildSuccess(); } - /* + /** * 获取数据-多线程 * 板坯数据 * 订单数据 @@ -411,7 +411,7 @@ public class SubController { } - /* + /** * 数据预处理 * */ public void SetPreData() { @@ -423,7 +423,7 @@ public class SubController { } - /* + /** * 二次分组根据板坯性能删选分组 * */ public void SetGrpDataBySlab(SlabInfoDO SInfo) { @@ -442,6 +442,7 @@ public class SubController { GCG.setLtInfoGPreOrder(new ArrayList<>()); e.getLtInfoGPreOrder().parallelStream().forEach(f -> { + //化学成分 chemical composition if (!ChkChemical(SInfo, f)) { return; @@ -523,7 +524,7 @@ public class SubController { //region 验证方法 - /* + /** * 化学成分判断 * */ public boolean ChkChemical(SlabInfoDO SInfo, GPreOrder GrpOrd) { @@ -576,7 +577,7 @@ public class SubController { return true; } - /* + /** * 低倍检测 * */ public boolean ChkLowPower(SlabInfoDO SInfo, GPreOrder GrpOrd) { @@ -986,50 +987,96 @@ public class SubController { return true; } - /* + /** * 压缩比判断 - * */ - public boolean ChkCompress(SlabInfoDO SInfo, GGrpOrderFir GrpOrd) { + * + * 本方法用于检查给定的板坯信息和订单信息之间的压缩比是否满足要求 + * 压缩比是通过比较订单的厚度和板坯的实际厚度计算得出的 + * + * @param SInfo 板坯信息对象,包含板坯的实际厚度等信息 + * @param GrpOrd 订单信息对象,包含订单的厚度和压缩比下限等信息 + * @return 如果压缩比满足要求,则返回true;否则返回false + */ + public boolean ChkCompress(SlabInfoDO SInfo, GPreOrder GrpOrd) { + try + { + //判断GGrpOrderFir的压缩比下限 + BigDecimal decCompressRate = new BigDecimal(0); + + //SInfo的厚度除以GrpOrd的厚度等于压缩比decCompressRate + decCompressRate = GrpOrd.getThk().divide(SInfo.getSlabActThk(), 2, BigDecimal.ROUND_HALF_UP); + + //压下比大于产线要求的下限值 + if (decCompressRate.compareTo(GrpOrd.getInfoPmContMscTechDO().getCompressMin()) < 0) { + return false; + } else { + return true; + } + } catch (Exception e) { + logger.error("压缩比验证出错", e); + return false; + } - return true; } - /* + /** * 宽展比判断 + * + * * */ - public boolean ChkWid(SlabInfoDO SInfo, GGrpOrderFir GrpOrd) { + public boolean ChkWid(SlabInfoDO SInfo, GPreOrder GrpOrd) { + return true; } //endregion - // 同步方法,用于更新gltOrder数组中的元素 + /** + * 根据缺乏数量创建相应数量的订单对象,并设置其属性 + * 此方法是同步的,以确保在多线程环境中对gltOrder的线程安全访问 + * + * @param prPmProContDO 主合同信息对象,包含订单的基本信息和缺乏数量 + * @param ppcpa 订单产品属性对象,包含订单产品的详细属性 + * @param pcmt 订单次要技术信息对象,包含订单的次要技术要求 + */ public static synchronized void SetAllOrder(PmProContDO prPmProContDO, PmProContProdAttrDO ppcpa, PmContMscTechDO pcmt) { + // 获取缺乏的数量 BigDecimal lackNum = prPmProContDO.getPdLackQty(); + // 如果缺乏数量大于0,则根据缺乏数量创建相应数量的订单对象 if (lackNum.intValue() > 0) { for (int i = 0; i < lackNum.intValue(); i++) { + // 创建一个新的GPreOrder对象 GPreOrder GPO = new GPreOrder(); + // 设置订单号,自增确保唯一性 GPO.setIDValue(intOrdNum++); - GPO.setThk(ppcpa.getOrderThick());//厚度 - GPO.setWid(ppcpa.getOrderWidth().intValue());//宽度 - GPO.setWidthAddv(ppcpa.getWidthAddv().intValue());//宽度余量 - GPO.setLen(ppcpa.getOrderLen());//长度 - GPO.setThickTolMin(ppcpa.getThickTolMin());//厚度公差下限 + // 设置厚度 + GPO.setThk(ppcpa.getOrderThick()); + // 设置宽度 + GPO.setWid(ppcpa.getOrderWidth().intValue()); + // 设置宽度余量 + GPO.setWidthAddv(ppcpa.getWidthAddv().intValue()); + // 设置长度 + GPO.setLen(ppcpa.getOrderLen()); + // 设置厚度公差下限 + GPO.setThickTolMin(ppcpa.getThickTolMin()); + // 设置订单号 GPO.setOrderNo(prPmProContDO.getOrderNo()); - GPO.setInfoPmProContDo(prPmProContDO);//订单信息 - GPO.setInfoPmProContProdAttrDO(ppcpa);//订单要求信息 - GPO.setInfoPmContMscTechDO(pcmt);//订单产线信息 - + // 关联订单信息对象 + GPO.setInfoPmProContDo(prPmProContDO); + // 关联订单产品属性对象 + GPO.setInfoPmProContProdAttrDO(ppcpa); + // 关联订单次要技术信息对象 + GPO.setInfoPmContMscTechDO(pcmt); + + // 将创建的订单对象添加到全局订单列表中 gltOrder.add(GPO); } - } - } - /* + /** * 订单数据欠量处理 * */ public void SetOrderLackData() { @@ -1072,30 +1119,35 @@ public class SubController { System.out.println("订单欠量数:" + gltOrder.size()); } - /* - * 订单根据尺寸钢种初次分组 - * */ + /** + * 根据尺寸和钢种对订单进行初次分组 + * 该方法通过并行流处理订单列表,根据订单的宽度、厚度和钢种标准进行分组 + * 分组结果存储在gltGrpOrderFir列表中,每个分组内的订单共享相同的尺寸和钢种特性 + */ public void SetGroupOrderFir() { //region 多线程 数据流处理订单分组 gltOrder.parallelStream().forEach(p -> { + // 检查当前订单是否与已有的分组匹配 if (gltGrpOrderFir.stream().anyMatch(e -> e.getWid().equals(p.getInfoPmProContProdAttrDO().getOrderWidth()) && e.getThk().equals(p.getInfoPmProContProdAttrDO().getOrderThick()) && e.getSG_STD().equals(p.getInfoPmProContProdAttrDO().getSgStd()))) { + // 如果匹配成功,将订单添加到相应的分组中 GGrpOrderFir GGOF = gltGrpOrderFir.stream().filter(e -> e.getWid().equals(p.getInfoPmProContProdAttrDO().getOrderWidth()) && e.getThk().equals(p.getInfoPmProContProdAttrDO().getOrderThick()) && e.getSG_STD().equals(p.getInfoPmProContProdAttrDO().getSgStd()) ).findFirst().orElse(null); if (GGOF.getLtInfoGPreOrder() == null) { - GGOF.setLtInfoGPreOrder(new ArrayList<>()); // Ensure the list is initialized + GGOF.setLtInfoGPreOrder(new ArrayList<>()); // 确保列表已初始化 } GGOF.getLtInfoGPreOrder().add(p); } else { + // 如果没有匹配的分组,创建一个新的分组并添加该订单 GGrpOrderFir GGOF = new GGrpOrderFir(); GGOF.setIDValue(intGrpNum++); GGOF.setWid(p.getInfoPmProContProdAttrDO().getOrderWidth()); @@ -1103,7 +1155,7 @@ public class SubController { //GGOF.setLen(p.getInfoPmProContProdAttrDO().getOrderLen()); GGOF.setSG_STD(p.getInfoPmProContProdAttrDO().getSgStd()); - GGOF.setLtInfoGPreOrder(new ArrayList<>()); // Initialize the list + GGOF.setLtInfoGPreOrder(new ArrayList<>()); // 初始化列表 GGOF.getLtInfoGPreOrder().add(p); gltGrpOrderFir.add(GGOF); } @@ -1112,49 +1164,17 @@ public class SubController { //endregion - //region 单线程 调试用 - // if (gltOrder.size() > 0) { - // for (GPreOrder p : gltOrder) { - // boolean found = false; - // - // // Iterate over gltGrpOrderFir to find a matching GGrpOrderFir - // for (GGrpOrderFir e : gltGrpOrderFir) { - // if (e.getWid().equals(p.getInfoPmProContProdAttrDO().getOrderWidth()) && - // e.getThk().equals(p.getInfoPmProContProdAttrDO().getOrderThick()) && - // e.getLen().equals(p.getInfoPmProContProdAttrDO().getOrderLen()) && - // e.getSG_STD().equals(p.getInfoPmProContProdAttrDO().getSgStd())) { - // if (e.getLtInfoGPreOrder() == null) { - // e.setLtInfoGPreOrder(new ArrayList<>()); // Ensure the list is initialized - // } - // // If a match is found, add the order to LtInfoGPreOrder - // e.getLtInfoGPreOrder().add(p); - // found = true; - // break; // Exit loop once a match is found - // } - // } - // - // // If no match was found, create a new GGrpOrderFir and add the order - // if (!found) { - // GGrpOrderFir GGOF = new GGrpOrderFir(); - // GGOF.setIDValue(intGrpNum++); - // GGOF.setWid(p.getInfoPmProContProdAttrDO().getOrderWidth()); - // GGOF.setThk(p.getInfoPmProContProdAttrDO().getOrderThick()); - // GGOF.setLen(p.getInfoPmProContProdAttrDO().getOrderLen()); - // GGOF.setSG_STD(p.getInfoPmProContProdAttrDO().getSgStd()); - // - // GGOF.setLtInfoGPreOrder(new ArrayList<>()); // Initialize the list - // GGOF.getLtInfoGPreOrder().add(p); - // gltGrpOrderFir.add(GGOF); - // } - // } - // } - //endregion - - System.out.println("初始分组数量:" + gltGrpOrderFir.size()); + // 输出初始分组数量 + logger.info("***初始分组数量:" + gltGrpOrderFir.size()); } - + /** + * 设置组计算结果 + * 根据提供的板坯信息和生产配置,计算出每个组的最大可轧制长度,并筛选出可行的订单组合 + * + * @param SInfo 包含板坯实际长度、宽度、厚度等信息的SlabInfoDO对象 + */ public void SetGroupCalRslt(SlabInfoDO SInfo) { //轧机最大长度 @@ -1198,7 +1218,7 @@ public class SubController { return; } //分组计算 -// gltGGrpCalRslt.parallelStream().forEach(p -> { + //gltGGrpCalRslt.parallelStream().forEach(p -> { gltGGrpCalRslt.parallelStream().forEach(p -> { // 测试数据 //处理数据多处理 @@ -1206,7 +1226,7 @@ public class SubController { List ltweights = new ArrayList<>(); List ltOrder = new ArrayList<>(); -// logger.info( "订单总数量:" + p.getLtInfoGPreOrder().size()); + //logger.info( "订单总数量:" + p.getLtInfoGPreOrder().size()); if (p == null) { return; } @@ -1254,9 +1274,14 @@ public class SubController { && f.getCombinePlateWidthFrom().compareTo(BigDecimal.valueOf(p.getCal_Wid())) <= 0 && f.getCombinePlateWidthTo().compareTo(BigDecimal.valueOf(p.getCal_Wid())) >= 0 ).findFirst().orElse(null); + if (PPCLB == null) { return; } + + //切缝长度 + int intPlateCutWidth = PPCLB.getPlateCutWidth().intValue(); + //切头 int intHead = PPCLB.getHeadCut().intValue(); //切尾 @@ -1269,12 +1294,12 @@ public class SubController { //初始化方案 Loader.loadNativeLibraries(); -// logger.info("values Size:{}", p.getLtInfoGPreOrder().size()); -// for (int i = 0; i < ltweights.size(); i++) { -// -// logger.info("weights:{}", ltweights.get(i)); -// -// } + //logger.info("values Size:{}", p.getLtInfoGPreOrder().size()); + //for (int i = 0; i < ltweights.size(); i++) { + // + // logger.info("weights:{}", ltweights.get(i)); + // + //} // 调用 solve 方法来解决问题 ArrayList ltInt = solve(values, weights, capacities); @@ -1288,8 +1313,120 @@ public class SubController { } //根据实际订单再计算 - p.setHead_Len(intHead); - p.setTail_Len(intTail); + // + + if (p.getLtActInfoGPreOrder().size()==0) + { + return; + } + + //最大宽度 + OptionalInt maxWidth = p.getLtActInfoGPreOrder().stream() + .mapToInt(GPreOrder::getWid) + .max(); + //最大宽度余量 + OptionalInt maxAddWidth = p.getLtActInfoGPreOrder().stream() + .mapToInt(GPreOrder::getWidthAddv) + .max(); + + //宽展比 保留2位小数 + BigDecimal decWidRate = BigDecimal.valueOf(maxWidth.orElse(0)).divide(SInfo.getSlabActWid(), 2, RoundingMode.HALF_UP); + + //最大厚度公差最小值 + Optional maxTolThkMin = p.getLtActInfoGPreOrder().stream() + .map(GPreOrder::getThickTolMin) + .reduce(BigDecimal::max); + + //轧制厚度 厚度+厚度公差下限最大值 + BigDecimal decThk = p.getThk().add(maxTolThkMin.orElse(BigDecimal.ZERO)); + + //轧制宽度 最大宽度+宽度余量 + int intWid = maxWidth.orElse(0) + maxAddWidth.orElse(0); + + //切边 + int intTrimWid = 0; + //切边量 + if (plistPmPlateTrimBtDO.stream().anyMatch(f -> f.getMscLineNo().equals("1030") + && f.getPlateThickFrom().compareTo(decThk) <= 0 + && f.getPlateThickTo().compareTo(decThk) >= 0 + && f.getCombinePlateWidthFrom().compareTo(BigDecimal.valueOf(maxWidth.orElse(0) + maxAddWidth.orElse(0))) <= 0 + && f.getCombinePlateWidthTo().compareTo(BigDecimal.valueOf(maxWidth.orElse(0) + maxAddWidth.orElse(0))) >= 0 + && f.getWidenFrom().compareTo(decWidRate) <= 0 + && f.getWidenTo().compareTo(decWidRate) >= 0 + )) { + intTrimWid = plistPmPlateTrimBtDO.stream().filter(f -> f.getMscLineNo().equals("1030") + && f.getPlateThickFrom().compareTo(decThk) <= 0 + && f.getPlateThickTo().compareTo(decThk) >= 0 + && f.getCombinePlateWidthFrom().compareTo(BigDecimal.valueOf(maxWidth.orElse(0) + maxAddWidth.orElse(0))) <= 0 + && f.getCombinePlateWidthTo().compareTo(BigDecimal.valueOf(maxWidth.orElse(0) + maxAddWidth.orElse(0))) >= 0 + && f.getWidenFrom().compareTo(decWidRate) <= 0 + && f.getWidenTo().compareTo(decWidRate) >= 0 + ).collect(Collectors.toList()).get(0).getTrimWidth().intValue(); + } + //轧制宽度= 最大宽度 + 最大宽度余量 + 切边量 + intWid = intWid + intTrimWid; + + //厚度 获取p.getLtActInfoGPreOrder()中厚度公差最小值+厚度 + p.setCal_Thk(decThk); + //宽度 获取p.getLtActInfoGPreOrder() 中宽度的最大值 + p.setCal_Wid(intWid); + //宽度余量 获取p.getLtActInfoGPreOrder() 中宽度的最大值 + p.setWid_Add(maxAddWidth.orElse(0)); + //切边余量 + p.setTrimming(intTrimWid); + //订单合计长度+切缝 TODO:取样长度是否加入计算,后续再优化 + int intSumOrderLen = p.getLtActInfoGPreOrder().stream().mapToInt(GPreOrder::getLen).sum(); + int intSumPlateCutWid =p.getLtActInfoGPreOrder().size()*intPlateCutWidth; + p.setEff_Len(intSumOrderLen+intSumPlateCutWid); + + PmPlateCutLenBtDO PPCLB_Act = plistPmPlateCutLenBtDO.stream(). + filter(f -> f.getMscLineNo().equals("1030") + && f.getBrrNeed().equals((p.getCal_Wid() > SInfo.getSlabActWid().intValue()) ? "1" : "0") + && f.getPlateThickFrom().compareTo(p.getCal_Thk()) <= 0 + && f.getPlateThickTo().compareTo(p.getCal_Thk()) >= 0 + && f.getSlabThickFrom().compareTo(SInfo.getSlabActThk()) <= 0 + && f.getSlabThickTo().compareTo(SInfo.getSlabActThk()) >= 0 + && f.getCombinePlateWidthFrom().compareTo(BigDecimal.valueOf(p.getCal_Wid())) <= 0 + && f.getCombinePlateWidthTo().compareTo(BigDecimal.valueOf(p.getCal_Wid())) >= 0 + ).findFirst().orElse(null); + + if (PPCLB_Act == null) { + return; + } + + //切头 + p.setHead_Len(PPCLB_Act.getHeadCut().intValue()); + //切尾 + p.setTail_Len(PPCLB_Act.getTailCut().intValue()); + //轧制长度 + p.setCal_Len( p.getEff_Len() + PPCLB_Act.getHeadCut().intValue() + PPCLB_Act.getTailCut().intValue()); + + //成材率 + // 成材率计算 + BigDecimal rolledVolume = p.getCal_Thk() + .multiply(BigDecimal.valueOf(p.getCal_Wid())) + .multiply(BigDecimal.valueOf(p.getCal_Len())); + + BigDecimal slabVolume = SInfo.getSlabActThk() + .multiply(SInfo.getSlabActWid()) + .multiply(BigDecimal.valueOf(p.getVirtualSlab_Len())); + + BigDecimal yieldRate = rolledVolume.divide(slabVolume, 4, RoundingMode.HALF_UP); // 保留4位小数 + + // 设置成材率到 p 对象中 + p.setRate(yieldRate); + //板坯厚度 + p.setVirtualSlab_Thk(SInfo.getSlabActThk()); + //板坯宽度 + p.setVirtualSlab_Wid(SInfo.getSlabActWid().intValue()); + //板坯长度 + BigDecimal virtualSlabLen = p.getCal_Thk() + .multiply(BigDecimal.valueOf(p.getCal_Wid())) + .multiply(BigDecimal.valueOf(p.getCal_Len())) + .divide(SInfo.getSlabActThk().multiply(SInfo.getSlabActWid()), RoundingMode.CEILING); + p.setVirtualSlab_Len(virtualSlabLen.intValue()); + + }); @@ -1537,9 +1674,9 @@ public class SubController { } //组板合同总量表 - public void SetPmPdContSum(){ - for(int i = 0; i < gltGGrpCalRslt.size(); i++){ - GGrpCalRslt ggcr=gltGGrpCalRslt.get(i); + public void SetPmPdContSum() { + for (int i = 0; i < gltGGrpCalRslt.size(); i++) { + GGrpCalRslt ggcr = gltGGrpCalRslt.get(i); List orderNoList = ggcr.getLtActInfoGPreOrder().stream() .map(GPreOrder::getOrderNo).distinct().collect(Collectors.toList()); //合同号去重 for (int j = 0; j < orderNoList.size(); j++) { diff --git a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/model/GGrpCalRslt.java b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/model/GGrpCalRslt.java index d83b53e..c6c31c7 100644 --- a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/model/GGrpCalRslt.java +++ b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/model/GGrpCalRslt.java @@ -34,7 +34,7 @@ public class GGrpCalRslt { //宽度 private int Wid; //厚度 - private int Thk; + private BigDecimal Thk; //长度 private int Len; //宽度余量 @@ -48,7 +48,7 @@ public class GGrpCalRslt { //增益 private int Ben_Add; //成材率 - private int Rate; + private BigDecimal Rate; //切边 private int Trimming; //切头长度