From 25af8e08ec86498a7b1768b0fddcf97ef8fab551 Mon Sep 17 00:00:00 2001 From: sunhao <479527147@qq.com> Date: Mon, 13 Jan 2025 08:54:57 +0800 Subject: [PATCH] 1 --- 1024shop-manager/1024shop-manager/pom.xml | 1 + .../shopmanager/controller/SubController.java | 184 ++++++++++++++---- .../xdclass/shopmanager/model/GCalGrp.java | 21 +- 3 files changed, 160 insertions(+), 46 deletions(-) diff --git a/1024shop-manager/1024shop-manager/pom.xml b/1024shop-manager/1024shop-manager/pom.xml index 789fe59..e7b6864 100644 --- a/1024shop-manager/1024shop-manager/pom.xml +++ b/1024shop-manager/1024shop-manager/pom.xml @@ -22,6 +22,7 @@ org.springframework.boot spring-boot-starter-web + 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 4d61552..fcf5f6a 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 @@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; @@ -43,6 +44,9 @@ public class SubController { //二次计算分组 private static List gltGCalGrp = new CopyOnWriteArrayList<>(); + //计算结果数据 + private static List gltGGrpCalRslt = new CopyOnWriteArrayList<>(); + private static int intOrdNum = 0; private static int intGrpNum = 0; @@ -139,6 +143,8 @@ public class SubController { if (gltGCalGrp.size()>0){ + SetGroupCalRslt(p); + } logger.info("***二次分组数量*** " + gltGCalGrp.size()); @@ -987,7 +993,7 @@ public class SubController { GGOF.setIDValue(intGrpNum++); GGOF.setWid(p.getInfoPmProContProdAttrDO().getOrderWidth()); GGOF.setThk(p.getInfoPmProContProdAttrDO().getOrderThick()); -// GGOF.setLen(p.getInfoPmProContProdAttrDO().getOrderLen()); + //GGOF.setLen(p.getInfoPmProContProdAttrDO().getOrderLen()); GGOF.setSG_STD(p.getInfoPmProContProdAttrDO().getSgStd()); GGOF.setLtInfoGPreOrder(new ArrayList<>()); // Initialize the list @@ -999,51 +1005,151 @@ 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 + //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()); } - public void SetGroupCalRslt(){ + public void SetGroupCalRslt(SlabInfoDO SInfo){ + + //轧机最大长度 + int intRollMaxLen = plistPmPdConstBtDO.stream().filter(p->p.getRollLineNo()=="30").findFirst().orElse(null).getHpmMaxPLen().intValue(); + //轧机最小长度 + int intRollMinLen = plistPmPdConstBtDO.stream().filter(p->p.getRollLineNo()=="30").findFirst().orElse(null).getHpmMinPLen().intValue(); + + gltGCalGrp.parallelStream().forEach(e->{ + //实例化计算结果数组 + GGrpCalRslt GGCR=new GGrpCalRslt(); + //可轧制最大长度 + int intMaxLen =0; + //轧制最大宽度 + int intWid= e.getWid(); + //轧制最大厚度 + BigDecimal intThk = e.getThk(); + //板坯长度 + int intSlabLen =SInfo.getSlabActLen().intValue(); + + //判断可轧制最大长度 TODO:厚度计算Decimal取整计算,会有误差,后续判断误差值修正计算 + if ((BigDecimal.valueOf(intSlabLen).divide(intThk.multiply(BigDecimal.valueOf(intWid)), RoundingMode.HALF_UP)).compareTo(BigDecimal.valueOf(intRollMaxLen))>0 ){ + intMaxLen=intRollMaxLen; + }else { + intMaxLen=(BigDecimal.valueOf(intSlabLen).divide(intThk.multiply(BigDecimal.valueOf(intWid)), RoundingMode.HALF_UP)).intValue(); + } + //不能小于可轧制的最小长度 + if (intMaxLen{ + + // 测试数据 + // 生成 values 和 weights 数组 + long[] values = new long[p.getLtInfoGPreOrder().size()]; + long[][] weights = new long[0][p.getLtInfoGPreOrder().size()]; + + for (int i = 0; i < p.getLtInfoGPreOrder().size(); i++) { + values[i] = p.getLtInfoGPreOrder().get(i).getIDValue(); // 从订单中获取 value + weights[0][i] = (long)p.getLtInfoGPreOrder().get(i).getInfoPmProContProdAttrDO().getOrderLen()+5; // 从订单中获取 weights + } + + //是否展宽 + //String brnNeed=""; + //if (p.getCal_Wid()>SInfo.getSlabActWid().intValue()){ + // brnNeed="1";//展宽 + //}else { + // brnNeed="0";//不展宽 + //} + + //TODO:轧制方向,轧制模式 没有其他值暂不考虑,之后数据完善后需要考虑 + PmPlateCutLenBtDO PPCLB = plistPmPlateCutLenBtDO.stream(). + filter(f -> f.getMscLineNo() == "1030" + && f.getBrrNeed() ==((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.getSlabThickFrom().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); + //切头 + int intHead = PPCLB.getHeadCut().intValue(); + //切尾 + int intTail=PPCLB.getTailCut().intValue(); + //去掉切头尾长度 + int intCap =p.getCal_Len()-intHead-intTail; + + long[] capacities = {intCap}; + + //初始化方案 + Loader.loadNativeLibraries(); + + // 调用 solve 方法来解决问题 + ArrayList ltInt = solve(values, weights, capacities); + + //循环返回的订单插入到实际数组中 + for (int i = 0; i < ltInt.size(); i++) { + + //实例化实际订单号 + p.setLtActInfoGPreOrder(new ArrayList<>()); + int indexi=i; + p.getLtActInfoGPreOrder().add(p.getLtInfoGPreOrder().stream().filter(m-> m.getIDValue()== ltInt.get(indexi)).collect(Collectors.toList()).get(0)); + + } + + //根据实际订单再计算 + + + + }); } diff --git a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/model/GCalGrp.java b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/model/GCalGrp.java index d97be99..c21becb 100644 --- a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/model/GCalGrp.java +++ b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/model/GCalGrp.java @@ -13,28 +13,35 @@ public class GCalGrp { //合同号 private int IDValue; //宽度 - private BigDecimal Wid; + private int Wid; //厚度 private BigDecimal Thk; //长度 - private Integer Len; + private int Len; //标准 private String SG_STD; - + //宽度余量 + private int Wid_Add; //最大轧制长度 + private int Max_Roll_Len; //实际最大轧制长度 + private int Roll_Len; //有效长度 + private int Eff_Len; //增益 + private int Ben_Add; //成材率 + private int Rate; //切边 - //轧制厚 - //轧制宽 - //轧制长 + private int Trimming; //切头长度 + private int Head_Len; //切尾长度 + private int Tail_Len; //取样长度 + private int Smp_Len; //补长 - + private int Rep_Len; //全部合同信息 private List LtInfoGPreOrder;