结果数据优化

main
sunhao 1 month ago
parent 760276982a
commit 922db3e1bf

@ -174,10 +174,10 @@ public class SubController {
SetGroupCalRslt(p); SetGroupCalRslt(p);
logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size()); logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size());
} }
if (gltGGrpCalRslt.size() > 0) { // if (gltGGrpCalRslt.size() > 0) {
now = new Date(); // now = new Date();
SetSaveDate(p); // SetSaveDate(p);
} // }
} catch (Exception e) { } catch (Exception e) {
logger.error("An error occurred", e); logger.error("An error occurred", e);
} }
@ -191,7 +191,7 @@ public class SubController {
return JsonData.buildSuccess(); return JsonData.buildSuccess();
} }
/* /**
* -线 * -线
* *
* *
@ -411,7 +411,7 @@ public class SubController {
} }
/* /**
* *
* */ * */
public void SetPreData() { public void SetPreData() {
@ -423,7 +423,7 @@ public class SubController {
} }
/* /**
* *
* */ * */
public void SetGrpDataBySlab(SlabInfoDO SInfo) { public void SetGrpDataBySlab(SlabInfoDO SInfo) {
@ -442,6 +442,7 @@ public class SubController {
GCG.setLtInfoGPreOrder(new ArrayList<>()); GCG.setLtInfoGPreOrder(new ArrayList<>());
e.getLtInfoGPreOrder().parallelStream().forEach(f -> { e.getLtInfoGPreOrder().parallelStream().forEach(f -> {
//化学成分 chemical composition //化学成分 chemical composition
if (!ChkChemical(SInfo, f)) { if (!ChkChemical(SInfo, f)) {
return; return;
@ -523,7 +524,7 @@ public class SubController {
//region 验证方法 //region 验证方法
/* /**
* *
* */ * */
public boolean ChkChemical(SlabInfoDO SInfo, GPreOrder GrpOrd) { public boolean ChkChemical(SlabInfoDO SInfo, GPreOrder GrpOrd) {
@ -576,7 +577,7 @@ public class SubController {
return true; return true;
} }
/* /**
* *
* */ * */
public boolean ChkLowPower(SlabInfoDO SInfo, GPreOrder GrpOrd) { public boolean ChkLowPower(SlabInfoDO SInfo, GPreOrder GrpOrd) {
@ -986,50 +987,96 @@ public class SubController {
return true; 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;
}
return true;
} }
/* /**
* *
*
*
* */ * */
public boolean ChkWid(SlabInfoDO SInfo, GGrpOrderFir GrpOrd) { public boolean ChkWid(SlabInfoDO SInfo, GPreOrder GrpOrd) {
return true; return true;
} }
//endregion //endregion
// 同步方法用于更新gltOrder数组中的元素 /**
*
* 线gltOrder线访
*
* @param prPmProContDO
* @param ppcpa
* @param pcmt
*/
public static synchronized void SetAllOrder(PmProContDO prPmProContDO, PmProContProdAttrDO ppcpa, PmContMscTechDO pcmt) { public static synchronized void SetAllOrder(PmProContDO prPmProContDO, PmProContProdAttrDO ppcpa, PmContMscTechDO pcmt) {
// 获取缺乏的数量
BigDecimal lackNum = prPmProContDO.getPdLackQty(); BigDecimal lackNum = prPmProContDO.getPdLackQty();
// 如果缺乏数量大于0则根据缺乏数量创建相应数量的订单对象
if (lackNum.intValue() > 0) { if (lackNum.intValue() > 0) {
for (int i = 0; i < lackNum.intValue(); i++) { for (int i = 0; i < lackNum.intValue(); i++) {
// 创建一个新的GPreOrder对象
GPreOrder GPO = new GPreOrder(); GPreOrder GPO = new GPreOrder();
// 设置订单号,自增确保唯一性
GPO.setIDValue(intOrdNum++); GPO.setIDValue(intOrdNum++);
GPO.setThk(ppcpa.getOrderThick());//厚度 // 设置厚度
GPO.setWid(ppcpa.getOrderWidth().intValue());//宽度 GPO.setThk(ppcpa.getOrderThick());
GPO.setWidthAddv(ppcpa.getWidthAddv().intValue());//宽度余量 // 设置宽度
GPO.setLen(ppcpa.getOrderLen());//长度 GPO.setWid(ppcpa.getOrderWidth().intValue());
GPO.setThickTolMin(ppcpa.getThickTolMin());//厚度公差下限 // 设置宽度余量
GPO.setWidthAddv(ppcpa.getWidthAddv().intValue());
// 设置长度
GPO.setLen(ppcpa.getOrderLen());
// 设置厚度公差下限
GPO.setThickTolMin(ppcpa.getThickTolMin());
// 设置订单号
GPO.setOrderNo(prPmProContDO.getOrderNo()); GPO.setOrderNo(prPmProContDO.getOrderNo());
GPO.setInfoPmProContDo(prPmProContDO);//订单信息 // 关联订单信息对象
GPO.setInfoPmProContProdAttrDO(ppcpa);//订单要求信息 GPO.setInfoPmProContDo(prPmProContDO);
GPO.setInfoPmContMscTechDO(pcmt);//订单产线信息 // 关联订单产品属性对象
GPO.setInfoPmProContProdAttrDO(ppcpa);
// 关联订单次要技术信息对象
GPO.setInfoPmContMscTechDO(pcmt);
// 将创建的订单对象添加到全局订单列表中
gltOrder.add(GPO); gltOrder.add(GPO);
} }
} }
} }
/* /**
* *
* */ * */
public void SetOrderLackData() { public void SetOrderLackData() {
@ -1072,30 +1119,35 @@ public class SubController {
System.out.println("订单欠量数:" + gltOrder.size()); System.out.println("订单欠量数:" + gltOrder.size());
} }
/* /**
* *
* */ *
* gltGrpOrderFir
*/
public void SetGroupOrderFir() { public void SetGroupOrderFir() {
//region 多线程 数据流处理订单分组 //region 多线程 数据流处理订单分组
gltOrder.parallelStream().forEach(p -> { gltOrder.parallelStream().forEach(p -> {
// 检查当前订单是否与已有的分组匹配
if (gltGrpOrderFir.stream().anyMatch(e -> e.getWid().equals(p.getInfoPmProContProdAttrDO().getOrderWidth()) && if (gltGrpOrderFir.stream().anyMatch(e -> e.getWid().equals(p.getInfoPmProContProdAttrDO().getOrderWidth()) &&
e.getThk().equals(p.getInfoPmProContProdAttrDO().getOrderThick()) && e.getThk().equals(p.getInfoPmProContProdAttrDO().getOrderThick()) &&
e.getSG_STD().equals(p.getInfoPmProContProdAttrDO().getSgStd()))) { e.getSG_STD().equals(p.getInfoPmProContProdAttrDO().getSgStd()))) {
// 如果匹配成功,将订单添加到相应的分组中
GGrpOrderFir GGOF = gltGrpOrderFir.stream().filter(e -> e.getWid().equals(p.getInfoPmProContProdAttrDO().getOrderWidth()) GGrpOrderFir GGOF = gltGrpOrderFir.stream().filter(e -> e.getWid().equals(p.getInfoPmProContProdAttrDO().getOrderWidth())
&& e.getThk().equals(p.getInfoPmProContProdAttrDO().getOrderThick()) && e.getThk().equals(p.getInfoPmProContProdAttrDO().getOrderThick())
&& e.getSG_STD().equals(p.getInfoPmProContProdAttrDO().getSgStd()) && e.getSG_STD().equals(p.getInfoPmProContProdAttrDO().getSgStd())
).findFirst().orElse(null); ).findFirst().orElse(null);
if (GGOF.getLtInfoGPreOrder() == null) { if (GGOF.getLtInfoGPreOrder() == null) {
GGOF.setLtInfoGPreOrder(new ArrayList<>()); // Ensure the list is initialized GGOF.setLtInfoGPreOrder(new ArrayList<>()); // 确保列表已初始化
} }
GGOF.getLtInfoGPreOrder().add(p); GGOF.getLtInfoGPreOrder().add(p);
} else { } else {
// 如果没有匹配的分组,创建一个新的分组并添加该订单
GGrpOrderFir GGOF = new GGrpOrderFir(); GGrpOrderFir GGOF = new GGrpOrderFir();
GGOF.setIDValue(intGrpNum++); GGOF.setIDValue(intGrpNum++);
GGOF.setWid(p.getInfoPmProContProdAttrDO().getOrderWidth()); GGOF.setWid(p.getInfoPmProContProdAttrDO().getOrderWidth());
@ -1103,7 +1155,7 @@ public class SubController {
//GGOF.setLen(p.getInfoPmProContProdAttrDO().getOrderLen()); //GGOF.setLen(p.getInfoPmProContProdAttrDO().getOrderLen());
GGOF.setSG_STD(p.getInfoPmProContProdAttrDO().getSgStd()); GGOF.setSG_STD(p.getInfoPmProContProdAttrDO().getSgStd());
GGOF.setLtInfoGPreOrder(new ArrayList<>()); // Initialize the list GGOF.setLtInfoGPreOrder(new ArrayList<>()); // 初始化列表
GGOF.getLtInfoGPreOrder().add(p); GGOF.getLtInfoGPreOrder().add(p);
gltGrpOrderFir.add(GGOF); gltGrpOrderFir.add(GGOF);
} }
@ -1112,49 +1164,17 @@ public class SubController {
//endregion //endregion
//region 单线程 调试用 // 输出初始分组数量
// if (gltOrder.size() > 0) { logger.info("***初始分组数量:" + gltGrpOrderFir.size());
// 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());
} }
/**
*
*
*
* @param SInfo SlabInfoDO
*/
public void SetGroupCalRslt(SlabInfoDO SInfo) { public void SetGroupCalRslt(SlabInfoDO SInfo) {
//轧机最大长度 //轧机最大长度
@ -1198,7 +1218,7 @@ public class SubController {
return; return;
} }
//分组计算 //分组计算
// gltGGrpCalRslt.parallelStream().forEach(p -> { //gltGGrpCalRslt.parallelStream().forEach(p -> {
gltGGrpCalRslt.parallelStream().forEach(p -> { gltGGrpCalRslt.parallelStream().forEach(p -> {
// 测试数据 // 测试数据
//处理数据多处理 //处理数据多处理
@ -1206,7 +1226,7 @@ public class SubController {
List<Integer> ltweights = new ArrayList<>(); List<Integer> ltweights = new ArrayList<>();
List<String> ltOrder = new ArrayList<>(); List<String> ltOrder = new ArrayList<>();
// logger.info( "订单总数量:" + p.getLtInfoGPreOrder().size()); //logger.info( "订单总数量:" + p.getLtInfoGPreOrder().size());
if (p == null) { if (p == null) {
return; return;
} }
@ -1254,9 +1274,14 @@ public class SubController {
&& f.getCombinePlateWidthFrom().compareTo(BigDecimal.valueOf(p.getCal_Wid())) <= 0 && f.getCombinePlateWidthFrom().compareTo(BigDecimal.valueOf(p.getCal_Wid())) <= 0
&& f.getCombinePlateWidthTo().compareTo(BigDecimal.valueOf(p.getCal_Wid())) >= 0 && f.getCombinePlateWidthTo().compareTo(BigDecimal.valueOf(p.getCal_Wid())) >= 0
).findFirst().orElse(null); ).findFirst().orElse(null);
if (PPCLB == null) { if (PPCLB == null) {
return; return;
} }
//切缝长度
int intPlateCutWidth = PPCLB.getPlateCutWidth().intValue();
//切头 //切头
int intHead = PPCLB.getHeadCut().intValue(); int intHead = PPCLB.getHeadCut().intValue();
//切尾 //切尾
@ -1269,12 +1294,12 @@ public class SubController {
//初始化方案 //初始化方案
Loader.loadNativeLibraries(); Loader.loadNativeLibraries();
// logger.info("values Size:{}", p.getLtInfoGPreOrder().size()); //logger.info("values Size:{}", p.getLtInfoGPreOrder().size());
// for (int i = 0; i < ltweights.size(); i++) { //for (int i = 0; i < ltweights.size(); i++) {
// //
// logger.info("weights:{}", ltweights.get(i)); // logger.info("weights:{}", ltweights.get(i));
// //
// } //}
// 调用 solve 方法来解决问题 // 调用 solve 方法来解决问题
ArrayList<Long> ltInt = solve(values, weights, capacities); ArrayList<Long> 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<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());
}); });
@ -1537,9 +1674,9 @@ public class SubController {
} }
//组板合同总量表 //组板合同总量表
public void SetPmPdContSum(){ public void SetPmPdContSum() {
for(int i = 0; i < gltGGrpCalRslt.size(); i++){ for (int i = 0; i < gltGGrpCalRslt.size(); i++) {
GGrpCalRslt ggcr=gltGGrpCalRslt.get(i); GGrpCalRslt ggcr = gltGGrpCalRslt.get(i);
List<String> orderNoList = ggcr.getLtActInfoGPreOrder().stream() List<String> orderNoList = ggcr.getLtActInfoGPreOrder().stream()
.map(GPreOrder::getOrderNo).distinct().collect(Collectors.toList()); //合同号去重 .map(GPreOrder::getOrderNo).distinct().collect(Collectors.toList()); //合同号去重
for (int j = 0; j < orderNoList.size(); j++) { for (int j = 0; j < orderNoList.size(); j++) {

@ -34,7 +34,7 @@ public class GGrpCalRslt {
//宽度 //宽度
private int Wid; private int Wid;
//厚度 //厚度
private int Thk; private BigDecimal Thk;
//长度 //长度
private int Len; private int Len;
//宽度余量 //宽度余量
@ -48,7 +48,7 @@ public class GGrpCalRslt {
//增益 //增益
private int Ben_Add; private int Ben_Add;
//成材率 //成材率
private int Rate; private BigDecimal Rate;
//切边 //切边
private int Trimming; private int Trimming;
//切头长度 //切头长度

Loading…
Cancel
Save