sunhao 1 month ago
parent d9aa629dc5
commit 25af8e08ec

@ -22,6 +22,7 @@
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>

@ -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<GCalGrp> gltGCalGrp = new CopyOnWriteArrayList<>();
//计算结果数据
private static List<GGrpCalRslt> 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<intRollMinLen)
{
return;
}
GGCR.setCal_Wid(intWid);
GGCR.setCal_Thk(intThk);
GGCR.setCal_Len(intMaxLen);
GGCR.setLtInfoGPreOrder(e.getLtInfoGPreOrder()) ;
gltGGrpCalRslt.add(GGCR);
});
//分组计算
gltGGrpCalRslt.parallelStream().forEach(p->{
// 测试数据
// 生成 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<Long> 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));
}
//根据实际订单再计算
});
}

@ -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<GPreOrder> LtInfoGPreOrder;

Loading…
Cancel
Save