结果数据优化

main
sunhao 1 month ago
parent 760276982a
commit 922db3e1bf

@ -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 truefalse
*/
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;
}
/*
}
/**
*
*
*
* */
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) {
//轧机最大长度
@ -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();
//切尾
@ -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<BigDecimal> 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());
});

@ -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;
//切头长度

Loading…
Cancel
Save