|
|
|
@ -119,11 +119,18 @@ public class SubController {
|
|
|
|
|
private static List<QeTqPonoWaitTestDO> plistQeTqPonoWaitTestDO;
|
|
|
|
|
//坯料低倍委托实绩表
|
|
|
|
|
private static List<QeTqSlabMacroResultDO> plistQeTqSlabMacroResultDO;
|
|
|
|
|
//连铸板坯生产规格基准表
|
|
|
|
|
private static List<PmSlabSpecBtDO> plistPmSlabSpecBtDO;
|
|
|
|
|
//板坯信息表
|
|
|
|
|
private static List<PmPdSlabInfoDO> plistPmPdSlabInfoDO; //TODO 需要添加此表信息的查询
|
|
|
|
|
//TODO 需要添加 QD_TO_PO_ORDER 的查询记录
|
|
|
|
|
private static Date now;
|
|
|
|
|
|
|
|
|
|
// //加热炉板坯最小长度
|
|
|
|
|
// private static int gintSlabMinLen;
|
|
|
|
|
// //加热炉板坯最大长度
|
|
|
|
|
// private static int gintSlabMaxLen;
|
|
|
|
|
|
|
|
|
|
//endregion
|
|
|
|
|
|
|
|
|
|
@ApiOperation("求解处理")
|
|
|
|
@ -172,6 +179,8 @@ public class SubController {
|
|
|
|
|
if (gltGCalGrp.size() > 0) {
|
|
|
|
|
gltGGrpCalRslt = new ArrayList<>();
|
|
|
|
|
SetGroupCalRslt(p);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size());
|
|
|
|
|
}
|
|
|
|
|
// if (gltGGrpCalRslt.size() > 0) {
|
|
|
|
@ -179,7 +188,7 @@ public class SubController {
|
|
|
|
|
// SetSaveDate(p);
|
|
|
|
|
// }
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
logger.error("An error occurred", e);
|
|
|
|
|
logger.error("板坯报错:" + p.getSlabNo(), e);
|
|
|
|
|
}
|
|
|
|
|
logger.info("*************板坯结束{}************* ", p.getSlabNo());
|
|
|
|
|
logger.info("");
|
|
|
|
@ -196,7 +205,7 @@ public class SubController {
|
|
|
|
|
* 板坯数据
|
|
|
|
|
* 订单数据
|
|
|
|
|
* 配置信息
|
|
|
|
|
* */
|
|
|
|
|
*/
|
|
|
|
|
public void GetDataInfo(Optional<SubParams> args) {
|
|
|
|
|
|
|
|
|
|
logger.info("*****开始获取数据******");
|
|
|
|
@ -204,7 +213,7 @@ public class SubController {
|
|
|
|
|
//region ***多线程获取基础数据***
|
|
|
|
|
|
|
|
|
|
// 创建线程池
|
|
|
|
|
ExecutorService executorService = Executors.newFixedThreadPool(23);
|
|
|
|
|
ExecutorService executorService = Executors.newFixedThreadPool(24);
|
|
|
|
|
|
|
|
|
|
//初始化方案
|
|
|
|
|
Loader.loadNativeLibraries();
|
|
|
|
@ -374,6 +383,13 @@ public class SubController {
|
|
|
|
|
return null;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
//24连铸板坯生产规格基准表
|
|
|
|
|
tasks.add(() -> {
|
|
|
|
|
plistPmSlabSpecBtDO = subService.getPmSlabSpecBt();
|
|
|
|
|
// logger.info("******23连铸板坯生产规格基准表数据获取完毕*******");
|
|
|
|
|
return null;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 执行所有任务
|
|
|
|
|
try {
|
|
|
|
|
executorService.invokeAll(tasks);
|
|
|
|
@ -403,6 +419,7 @@ public class SubController {
|
|
|
|
|
logger.info("20:炉次工序成分代表实绩表:" + plistQeTqHeatcheStandResultDO.size());
|
|
|
|
|
logger.info("21:炉次待委托表:" + plistQeTqPonoWaitTestDO.size());
|
|
|
|
|
logger.info("22:坯料低倍委托实绩表:" + plistQeTqSlabMacroResultDO.size());
|
|
|
|
|
logger.info("23:连铸板坯生产规格基准表:" + plistPmSlabSpecBtDO.size());
|
|
|
|
|
|
|
|
|
|
// 关闭线程池
|
|
|
|
|
executorService.shutdown();
|
|
|
|
@ -413,7 +430,7 @@ public class SubController {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 数据预处理
|
|
|
|
|
* */
|
|
|
|
|
*/
|
|
|
|
|
public void SetPreData() {
|
|
|
|
|
//订单数据处理
|
|
|
|
|
SetOrderLackData();
|
|
|
|
@ -425,7 +442,7 @@ public class SubController {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 二次分组根据板坯性能删选分组
|
|
|
|
|
* */
|
|
|
|
|
*/
|
|
|
|
|
public void SetGrpDataBySlab(SlabInfoDO SInfo) {
|
|
|
|
|
|
|
|
|
|
gltGrpOrderFir.parallelStream().forEach(e -> {
|
|
|
|
@ -442,14 +459,21 @@ public class SubController {
|
|
|
|
|
GCG.setLtInfoGPreOrder(new ArrayList<>());
|
|
|
|
|
e.getLtInfoGPreOrder().parallelStream().forEach(f -> {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//化学成分 chemical composition
|
|
|
|
|
if (!ChkChemical(SInfo, f)) {
|
|
|
|
|
return;
|
|
|
|
|
try {
|
|
|
|
|
//化学成分 chemical composition
|
|
|
|
|
if (!ChkChemical(SInfo, f)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e1) {
|
|
|
|
|
log.error("化学成分", e1);
|
|
|
|
|
}
|
|
|
|
|
//低倍检测 low-power check
|
|
|
|
|
if (!ChkLowPower(SInfo, f)) {
|
|
|
|
|
return;
|
|
|
|
|
try {
|
|
|
|
|
//低倍检测 low-power check
|
|
|
|
|
if (!ChkLowPower(SInfo, f)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e1) {
|
|
|
|
|
log.error("低倍检测", e1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//GCG.setLtInfoGPreOrder(new ArrayList<>());
|
|
|
|
@ -526,7 +550,7 @@ public class SubController {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 化学成分判断
|
|
|
|
|
* */
|
|
|
|
|
*/
|
|
|
|
|
public boolean ChkChemical(SlabInfoDO SInfo, GPreOrder GrpOrd) {
|
|
|
|
|
|
|
|
|
|
// - 炉次工序成分代表实绩表QE_TQ_HEATCHE_STAND_RESULT => 制造命令号PONO
|
|
|
|
@ -579,7 +603,7 @@ public class SubController {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 低倍检测
|
|
|
|
|
* */
|
|
|
|
|
*/
|
|
|
|
|
public boolean ChkLowPower(SlabInfoDO SInfo, GPreOrder GrpOrd) {
|
|
|
|
|
|
|
|
|
|
// - 委托 QE_TQ_PONO_WAIT_TEST => 制造命令号PONO
|
|
|
|
@ -989,41 +1013,38 @@ public class SubController {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 压缩比判断
|
|
|
|
|
*
|
|
|
|
|
* <p>
|
|
|
|
|
* 本方法用于检查给定的板坯信息和订单信息之间的压缩比是否满足要求
|
|
|
|
|
* 压缩比是通过比较订单的厚度和板坯的实际厚度计算得出的
|
|
|
|
|
*
|
|
|
|
|
* @param SInfo 板坯信息对象,包含板坯的实际厚度等信息
|
|
|
|
|
* @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;
|
|
|
|
|
}
|
|
|
|
|
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, GPreOrder GrpOrd) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1037,8 +1058,8 @@ public class SubController {
|
|
|
|
|
* 此方法是同步的,以确保在多线程环境中对gltOrder的线程安全访问
|
|
|
|
|
*
|
|
|
|
|
* @param prPmProContDO 主合同信息对象,包含订单的基本信息和缺乏数量
|
|
|
|
|
* @param ppcpa 订单产品属性对象,包含订单产品的详细属性
|
|
|
|
|
* @param pcmt 订单次要技术信息对象,包含订单的次要技术要求
|
|
|
|
|
* @param ppcpa 订单产品属性对象,包含订单产品的详细属性
|
|
|
|
|
* @param pcmt 订单次要技术信息对象,包含订单的次要技术要求
|
|
|
|
|
*/
|
|
|
|
|
public static synchronized void SetAllOrder(PmProContDO prPmProContDO, PmProContProdAttrDO ppcpa, PmContMscTechDO pcmt) {
|
|
|
|
|
|
|
|
|
@ -1078,7 +1099,7 @@ public class SubController {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 订单数据欠量处理
|
|
|
|
|
* */
|
|
|
|
|
*/
|
|
|
|
|
public void SetOrderLackData() {
|
|
|
|
|
|
|
|
|
|
//TODO:箭头函数订单多线程处理数据,升序,降序,重组。
|
|
|
|
@ -1205,9 +1226,13 @@ public class SubController {
|
|
|
|
|
if (intMaxLen < intRollMinLen) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//轧制宽度
|
|
|
|
|
GGCR.setCal_Wid(intWid);
|
|
|
|
|
//轧制厚度
|
|
|
|
|
GGCR.setCal_Thk(intThk);
|
|
|
|
|
//订单厚度
|
|
|
|
|
GGCR.setThk(e.getLtInfoGPreOrder().get(0).getThk());
|
|
|
|
|
//最大长度
|
|
|
|
|
GGCR.setCal_Len(intMaxLen);
|
|
|
|
|
GGCR.setLtInfoGPreOrder(e.getLtInfoGPreOrder());
|
|
|
|
|
|
|
|
|
@ -1286,6 +1311,7 @@ public class SubController {
|
|
|
|
|
int intHead = PPCLB.getHeadCut().intValue();
|
|
|
|
|
//切尾
|
|
|
|
|
int intTail = PPCLB.getTailCut().intValue();
|
|
|
|
|
|
|
|
|
|
//去掉切头尾长度
|
|
|
|
|
int intCap = p.getCal_Len() - intHead - intTail;
|
|
|
|
|
|
|
|
|
@ -1315,8 +1341,7 @@ public class SubController {
|
|
|
|
|
//根据实际订单再计算
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
if (p.getLtActInfoGPreOrder().size()==0)
|
|
|
|
|
{
|
|
|
|
|
if (p.getLtActInfoGPreOrder().size() == 0) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1375,9 +1400,9 @@ public class SubController {
|
|
|
|
|
//切边余量
|
|
|
|
|
p.setTrimming(intTrimWid);
|
|
|
|
|
//订单合计长度+切缝 TODO:取样长度是否加入计算,后续再优化
|
|
|
|
|
int intSumOrderLen = p.getLtActInfoGPreOrder().stream().mapToInt(GPreOrder::getLen).sum();
|
|
|
|
|
int intSumPlateCutWid =p.getLtActInfoGPreOrder().size()*intPlateCutWidth;
|
|
|
|
|
p.setEff_Len(intSumOrderLen+intSumPlateCutWid);
|
|
|
|
|
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")
|
|
|
|
@ -1399,22 +1424,8 @@ public class SubController {
|
|
|
|
|
//切尾
|
|
|
|
|
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.setCal_Len(p.getEff_Len() + PPCLB_Act.getHeadCut().intValue() + PPCLB_Act.getTailCut().intValue());
|
|
|
|
|
|
|
|
|
|
// 设置成材率到 p 对象中
|
|
|
|
|
p.setRate(yieldRate);
|
|
|
|
|
//板坯厚度
|
|
|
|
|
p.setVirtualSlab_Thk(SInfo.getSlabActThk());
|
|
|
|
|
//板坯宽度
|
|
|
|
@ -1423,13 +1434,99 @@ public class SubController {
|
|
|
|
|
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);
|
|
|
|
|
.divide(SInfo.getSlabActThk().multiply(SInfo.getSlabActWid()), 0, RoundingMode.CEILING);
|
|
|
|
|
p.setVirtualSlab_Len(virtualSlabLen.intValue());
|
|
|
|
|
|
|
|
|
|
//成材率计算
|
|
|
|
|
BigDecimal rolledVolume = p.getCal_Thk()
|
|
|
|
|
.multiply(BigDecimal.valueOf(p.getCal_Wid()))
|
|
|
|
|
.multiply(BigDecimal.valueOf(p.getEff_Len()));
|
|
|
|
|
|
|
|
|
|
BigDecimal slabVolume = SInfo.getSlabActThk()
|
|
|
|
|
.multiply(SInfo.getSlabActWid())
|
|
|
|
|
.multiply(BigDecimal.valueOf(p.getVirtualSlab_Len()));
|
|
|
|
|
|
|
|
|
|
BigDecimal yieldRate = rolledVolume.divide(slabVolume, 2, RoundingMode.HALF_UP); // 保留4位小数
|
|
|
|
|
|
|
|
|
|
// 设置成材率到 p 对象中
|
|
|
|
|
p.setRate(yieldRate);
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//判断结算结果长度和成材率是否可用
|
|
|
|
|
gltGGrpCalRslt.parallelStream().forEach(p -> {
|
|
|
|
|
|
|
|
|
|
//没有成材率
|
|
|
|
|
if (p.getRate() == null) {
|
|
|
|
|
p.setIntUseFlg(1);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
p.setIntUseFlg(0);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//成材率大于90%
|
|
|
|
|
if (p.getRate().compareTo(BigDecimal.valueOf(0.9)) >= 0) {
|
|
|
|
|
p.setIntUseFlg(1);
|
|
|
|
|
} else {
|
|
|
|
|
p.setIntUseFlg(0);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
int minWid = Math.min(p.getVirtualSlab_Wid(), p.getVirtualSlab_Len());
|
|
|
|
|
int maxLen = Math.min(p.getVirtualSlab_Wid(), p.getVirtualSlab_Len());
|
|
|
|
|
// 板坯厚度起止SLAB_THICK_FROM/TO包含余坯实际厚度;
|
|
|
|
|
// 板坯宽度起止SLAB_WIDTH_FROM/TO包含余坯实际宽度;
|
|
|
|
|
// 加热炉类型为‘C’,轧制产线号等于产线号后两位,连铸机类型等于1;
|
|
|
|
|
if (plistPmSlabSpecBtDO.stream().filter(e -> e.getSlabThickFrom().compareTo(p.getVirtualSlab_Thk()) <= 0
|
|
|
|
|
&& e.getSlabThickTo().compareTo(p.getVirtualSlab_Thk()) >= 0
|
|
|
|
|
&& e.getSlabWidthFrom().compareTo(BigDecimal.valueOf(minWid)) <= 0
|
|
|
|
|
&& e.getSlabWidthTo().compareTo(BigDecimal.valueOf(minWid)) >= 0
|
|
|
|
|
&& e.getFurType().equals("C")
|
|
|
|
|
&& e.getRollLineNo().equals(SInfo.getRollerLineNo().substring(SInfo.getRollerLineNo().length() - 2))
|
|
|
|
|
&& e.getCcType().equals("1")
|
|
|
|
|
).count() > 0) {
|
|
|
|
|
int intSlanLenMin = plistPmSlabSpecBtDO.stream().filter(e -> e.getSlabThickFrom().compareTo(p.getVirtualSlab_Thk()) <= 0
|
|
|
|
|
&& e.getSlabThickTo().compareTo(p.getVirtualSlab_Thk()) >= 0
|
|
|
|
|
&& e.getSlabWidthFrom().compareTo(BigDecimal.valueOf(minWid)) <= 0
|
|
|
|
|
&& e.getSlabWidthTo().compareTo(BigDecimal.valueOf(minWid)) >= 0
|
|
|
|
|
&& e.getFurType().equals("C")
|
|
|
|
|
&& e.getRollLineNo().equals(SInfo.getRollerLineNo().substring(SInfo.getRollerLineNo().length() - 2))
|
|
|
|
|
&& e.getCcType().equals("1")
|
|
|
|
|
).findFirst().orElse(null).getSlabMinLen().intValue();
|
|
|
|
|
int intSlanLenMax = plistPmSlabSpecBtDO.stream().filter(e -> e.getSlabThickFrom().compareTo(p.getVirtualSlab_Thk()) <= 0
|
|
|
|
|
&& e.getSlabThickTo().compareTo(p.getVirtualSlab_Thk()) >= 0
|
|
|
|
|
&& e.getSlabWidthFrom().compareTo(BigDecimal.valueOf(minWid)) <= 0
|
|
|
|
|
&& e.getSlabWidthTo().compareTo(BigDecimal.valueOf(minWid)) >= 0
|
|
|
|
|
&& e.getFurType().equals("C")
|
|
|
|
|
&& e.getRollLineNo().equals(SInfo.getRollerLineNo().substring(SInfo.getRollerLineNo().length() - 2))
|
|
|
|
|
&& e.getCcType().equals("1")
|
|
|
|
|
).findFirst().orElse(null).getSlabMaxLen().intValue();
|
|
|
|
|
|
|
|
|
|
//不能小于最小值
|
|
|
|
|
if (maxLen <= intSlanLenMin) {
|
|
|
|
|
p.setIntUseFlg(0);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//不能大于最大值
|
|
|
|
|
if (maxLen >= intSlanLenMax) {
|
|
|
|
|
p.setIntUseFlg(0);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//数据可用
|
|
|
|
|
p.setIntUseFlg(1);
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
//数据不可用
|
|
|
|
|
p.setIntUseFlg(0);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//设置保存数据
|
|
|
|
|