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 d88e4a4..d2328fc 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
@@ -129,6 +129,7 @@ public class SubController {
private static List plistPmSlabSpecBtDO;
//板坯信息表
private static List plistPmPdSlabInfoDO; //TODO 需要添加此表信息的查询
+
//TODO 需要添加 QD_TO_PO_ORDER 的查询记录
private static Date now;
//组板履历表
@@ -143,6 +144,28 @@ public class SubController {
//endregion
+ //region ***配置项参数***
+
+ //不可自动组板订单信息
+ private static List plistpmIrsubableContDO=new ArrayList<>();
+
+ //不可自动组板板坯信息
+ private static List plistpmIrsubableSlabDO=new ArrayList<>();
+
+ //自动替代配置参数
+ private static List plistpmAutoSubSettingDO=new ArrayList<>();
+
+ //钢种信息配置
+ private static List plistpmRetainStDO=new ArrayList<>();
+
+ //仓库信息配置
+ private static List plistpmRetainStackDO=new ArrayList<>();
+
+ //自动替代日志
+ private static List plistpmSubLogDO=new ArrayList<>();
+
+ //endregion
+
@ApiOperation("求解处理")
@PostMapping("Solver")
public JsonData Solver() {
@@ -185,6 +208,7 @@ public class SubController {
//循环板坯
plistSlab.forEach(p -> {
logger.info("*************板坯开始{}************* ", p.getSlabNo());
+ logger.info("***板坯信息:{} 厚宽长:{}*{}*{} ",p.getSlabNo(), p.getSlabActThk(),p.getSlabActWid(),p.getSlabActLen());
try {
gltGCalGrp = new ArrayList<>();
//二次分组
@@ -193,11 +217,30 @@ public class SubController {
logger.info("***二次分组数量*** " + gltGCalGrp.size());
if (gltGCalGrp.size() > 0) {
+
+ //板坯长度和宽度调换
+ if (p.getSlabActLen().compareTo(p.getSlabActWid()) <= 0) {
+ // 当 p.getSlabActLen() 小于或等于 p.getSlabActWid() 时执行的代码
+ p.setRemLen(p.getSlabActWid());
+ p.setRemWid(p.getSlabActLen());
+ } else {
+ p.setRemLen(p.getSlabActLen());
+ p.setRemWid(p.getSlabActWid());
+ }
+
gltGGrpCalRslt = new ArrayList<>();
- gltSelGGrpCalRslt= new ArrayList<>();
+ gltSelGGrpCalRslt = new ArrayList<>();
SetGroupCalRslt(p);
+ //存储数据,组板结果
+ plistpmSubHisDO.forEach(e->{
+ subService.InsertPmSubHisDO(e);
+ });
+
+ plistpmSubOrdDO.forEach(e->{
+ subService.InsertPmSubOrdDO(e);
+ });
logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size());
}
@@ -205,6 +248,7 @@ public class SubController {
// now = new Date();
// SetSaveDate(p);
// }
+
} catch (Exception e) {
logger.error("板坯报错:" + p.getSlabNo(), e);
}
@@ -231,7 +275,7 @@ public class SubController {
//region ***多线程获取基础数据***
// 创建线程池
- ExecutorService executorService = Executors.newFixedThreadPool(24);
+ ExecutorService executorService = Executors.newFixedThreadPool(29);
//初始化方案
Loader.loadNativeLibraries();
@@ -270,7 +314,7 @@ public class SubController {
//5生产合同产品属性表
tasks.add(() -> {
// plistPmProContProdAttrDO = subService.getPmProCountProdAttr();
- Thread.sleep(10000); // 休眠10秒钟
+ Thread.sleep(1000); // 休眠1秒钟
// logger.info("******5生产合同产品属性表数据获取完毕*******");
return null;
});
@@ -404,7 +448,36 @@ public class SubController {
//24连铸板坯生产规格基准表
tasks.add(() -> {
plistPmSlabSpecBtDO = subService.getPmSlabSpecBt();
-// logger.info("******23连铸板坯生产规格基准表数据获取完毕*******");
+ return null;
+ });
+
+ //25不可自动组板订单信息
+ tasks.add(() -> {
+ plistpmIrsubableContDO = subService.getPmIrsubableCont();
+ return null;
+ });
+
+ //26不可自动组板板坯信息
+ tasks.add(() -> {
+ plistpmIrsubableSlabDO = subService.getPmIrsubableSlab();
+ return null;
+ });
+
+ //27自动组板配置信息
+ tasks.add(() -> {
+ plistpmAutoSubSettingDO = subService.getPmAutoSubSetting();
+ return null;
+ });
+
+ //28钢种配置信息
+ tasks.add(() -> {
+ plistpmRetainStDO = subService.getPmRetainSt();
+ return null;
+ });
+
+ //29仓库配置信息
+ tasks.add(() -> {
+ plistpmRetainStackDO = subService.getPmRetainStack();
return null;
});
@@ -438,6 +511,35 @@ public class SubController {
logger.info("21:炉次待委托表:" + plistQeTqPonoWaitTestDO.size());
logger.info("22:坯料低倍委托实绩表:" + plistQeTqSlabMacroResultDO.size());
logger.info("23:连铸板坯生产规格基准表:" + plistPmSlabSpecBtDO.size());
+ logger.info("24:不可自动组板订单信息:" + plistpmIrsubableContDO.size());
+ logger.info("25:不可自动组板板坯信息:" + plistpmIrsubableSlabDO.size());
+ logger.info("26:钢种配置信息:" + plistpmRetainStDO.size());
+ logger.info("27:仓库配置信息:" + plistpmRetainStackDO.size());
+ logger.info("28:自动组板配置信息:" + plistpmAutoSubSettingDO.size());
+
+ logger.info("获取基础数据完成");
+ if (plistpmAutoSubSettingDO.size()>0)
+ {
+ logger.info("配置信息-》 是否启动 :{}", plistpmAutoSubSettingDO.get(0).getIsStartFlag());
+ logger.info("配置信息-》 启动时间范围 :{}~{}", plistpmAutoSubSettingDO.get(0).getStartTime(), plistpmAutoSubSettingDO.get(0).getEndTime());
+ logger.info("配置信息-》 优先模式 :{}", plistpmAutoSubSettingDO.get(0).getPriMode());
+ logger.info("配置信息-》 最低成材率 :{}", plistpmAutoSubSettingDO.get(0).getStockRate());
+ logger.info("配置信息-》 最大剩余长度 :{}", plistpmAutoSubSettingDO.get(0).getResidueLen());
+ logger.info("配置信息-》 板坯长度范围 :{}~{}", plistpmAutoSubSettingDO.get(0).getMatLenMin(), plistpmAutoSubSettingDO.get(0).getMatLenMax());
+ logger.info("配置信息-》 板坯宽度范围 :{}~{}", plistpmAutoSubSettingDO.get(0).getMatWidthMin(), plistpmAutoSubSettingDO.get(0).getMatWidthMax());
+ logger.info("配置信息-》 板坯厚度范围 :{}~{}", plistpmAutoSubSettingDO.get(0).getMatThickMin(), plistpmAutoSubSettingDO.get(0).getMatThickMax());
+ logger.info("配置信息-》 订单宽度范围 :{}~{}", plistpmAutoSubSettingDO.get(0).getOrderWidthMin(), plistpmAutoSubSettingDO.get(0).getOrderWidthMax());
+ logger.info("配置信息-》 订单厚度范围 :{}~{}", plistpmAutoSubSettingDO.get(0).getOrderThickMin(), plistpmAutoSubSettingDO.get(0).getOrderThickMax());
+ logger.info("配置信息-》 订单交货期范围 :{}~{}", plistpmAutoSubSettingDO.get(0).getDelivyDateFrom(), plistpmAutoSubSettingDO.get(0).getDelivyDateTo());
+ logger.info("配置信息-》 可用仓库 :{}", plistpmAutoSubSettingDO.get(0).getUseableDstock());
+ logger.info("配置信息-》 优先模式 :{}", plistpmAutoSubSettingDO.get(0).getPriMode());
+ logger.info("配置信息-》 超投条件 :{}", plistpmAutoSubSettingDO.get(0).getOvershootCondition());
+ logger.info("配置信息-》 库存最低成材率 :{}", plistpmAutoSubSettingDO.get(0).getStockRate());
+ logger.info("配置信息-》 库存时间 :{}", plistpmAutoSubSettingDO.get(0).getStockDay());
+ logger.info("配置信息-》 交货期最低成材率:{}", plistpmAutoSubSettingDO.get(0).getDeliveryRate());
+ logger.info("配置信息-》 交货期偏移量 :{}", plistpmAutoSubSettingDO.get(0).getDeliveryOffsetDay());
+ }
+
// 关闭线程池
executorService.shutdown();
@@ -1218,11 +1320,24 @@ public class SubController {
*/
public void SetGroupCalRslt(SlabInfoDO SInfo) {
+ //剩余长度小于加热炉最小长度
+ if (SInfo.getRemLen().compareTo(BigDecimal.valueOf(2200))<0){
+ return;
+ }
+
+ //剩余宽度小于加热炉最小宽度
+ if (SInfo.getRemWid().compareTo(BigDecimal.valueOf(1200))<0){
+ return;
+ }
+
//轧机最大长度
int intRollMaxLen = plistPmPdConstBtDO.stream().filter(p -> p.getRollLineNo().equals("30")).findFirst().orElse(null).getHpmMaxPLen().intValue();
//轧机最小长度
int intRollMinLen = plistPmPdConstBtDO.stream().filter(p -> p.getRollLineNo().equals("30")).findFirst().orElse(null).getHpmMinPLen().intValue();
+ //初始化分组数据
+ gltGGrpCalRslt=new ArrayList<>();
+
//gltGCalGrp.parallelStream().forEach(e->{
gltGCalGrp.parallelStream().forEach(e -> {
//实例化计算结果数组
@@ -1234,13 +1349,13 @@ public class SubController {
//轧制最大厚度
BigDecimal intThk = e.getThk();
//板坯长度
- int intSlabLen = SInfo.getSlabActLen().intValue();
+ int intSlabLen = SInfo.getRemLen().intValue();
//判断可轧制最大长度 TODO:厚度计算Decimal取整计算,会有误差,后续判断误差值修正计算
- if ((SInfo.getSlabActLen().multiply(SInfo.getSlabActThk()).multiply(SInfo.getSlabActWid()).divide(intThk.multiply(BigDecimal.valueOf(intWid)), RoundingMode.HALF_UP)).compareTo(BigDecimal.valueOf(intRollMaxLen)) > 0) {
+ if ((SInfo.getRemLen().multiply(SInfo.getSlabActThk()).multiply(SInfo.getRemWid()).divide(intThk.multiply(BigDecimal.valueOf(intWid)), RoundingMode.HALF_UP)).compareTo(BigDecimal.valueOf(intRollMaxLen)) > 0) {
intMaxLen = intRollMaxLen;
} else {
- intMaxLen = (SInfo.getSlabActLen().multiply(SInfo.getSlabActThk()).multiply(SInfo.getSlabActWid()).divide(intThk.multiply(BigDecimal.valueOf(intWid)), RoundingMode.HALF_UP)).intValue();
+ intMaxLen = (SInfo.getRemLen().multiply(SInfo.getSlabActThk()).multiply(SInfo.getRemWid()).divide(intThk.multiply(BigDecimal.valueOf(intWid)), RoundingMode.HALF_UP)).intValue();
}
//不能小于可轧制的最小长度
if (intMaxLen < intRollMinLen) {
@@ -1311,7 +1426,7 @@ public class SubController {
//TODO:轧制方向,轧制模式 没有其他值暂不考虑,之后数据完善后需要考虑
PmPlateCutLenBtDO PPCLB = plistPmPlateCutLenBtDO.stream().
filter(f -> f.getMscLineNo().equals("1030")
- && f.getBrrNeed().equals((p.getCal_Wid() > SInfo.getSlabActWid().intValue()) ? "1" : "0")
+ && f.getBrrNeed().equals((p.getCal_Wid() > SInfo.getRemWid().intValue()) ? "1" : "0")
&& f.getPlateThickFrom().compareTo(p.getCal_Thk()) <= 0
&& f.getPlateThickTo().compareTo(p.getCal_Thk()) >= 0
&& f.getSlabThickFrom().compareTo(SInfo.getSlabActThk()) <= 0
@@ -1375,7 +1490,7 @@ public class SubController {
.max();
//宽展比 保留2位小数
- BigDecimal decWidRate = BigDecimal.valueOf(maxWidth.orElse(0)).divide(SInfo.getSlabActWid(), 2, RoundingMode.HALF_UP);
+ BigDecimal decWidRate = BigDecimal.valueOf(maxWidth.orElse(0)).divide(SInfo.getRemWid(), 2, RoundingMode.HALF_UP);
//最大厚度公差最小值
Optional maxTolThkMin = p.getLtActInfoGPreOrder().stream()
@@ -1429,7 +1544,7 @@ public class SubController {
PmPlateCutLenBtDO PPCLB_Act = plistPmPlateCutLenBtDO.stream().
filter(f -> f.getMscLineNo().equals("1030")
- && f.getBrrNeed().equals((p.getCal_Wid() > SInfo.getSlabActWid().intValue()) ? "1" : "0")
+ && f.getBrrNeed().equals((p.getCal_Wid() > SInfo.getRemWid().intValue()) ? "1" : "0")
&& f.getPlateThickFrom().compareTo(p.getCal_Thk()) <= 0
&& f.getPlateThickTo().compareTo(p.getCal_Thk()) >= 0
&& f.getSlabThickFrom().compareTo(SInfo.getSlabActThk()) <= 0
@@ -1452,12 +1567,12 @@ public class SubController {
//板坯厚度
p.setVirtualSlab_Thk(SInfo.getSlabActThk());
//板坯宽度
- p.setVirtualSlab_Wid(SInfo.getSlabActWid().intValue());
+ p.setVirtualSlab_Wid(SInfo.getRemWid().intValue());
//板坯长度
BigDecimal virtualSlabLen = p.getCal_Thk()
.multiply(BigDecimal.valueOf(p.getCal_Wid()))
.multiply(BigDecimal.valueOf(p.getCal_Len()))
- .divide(SInfo.getSlabActThk().multiply(SInfo.getSlabActWid()), 0, RoundingMode.CEILING);
+ .divide(SInfo.getSlabActThk().multiply(SInfo.getRemWid()), 0, RoundingMode.CEILING);
p.setVirtualSlab_Len(virtualSlabLen.intValue());
//板坯重量
p.setVirtualSlab_Wgt(p.getVirtualSlab_Thk().multiply(BigDecimal.valueOf(p.getVirtualSlab_Len())).multiply(BigDecimal.valueOf(p.getVirtualSlab_Wid()) ).multiply(BigDecimal.valueOf(7.85)).divide(BigDecimal.valueOf(1000000000), 2, RoundingMode.HALF_UP));
@@ -1468,7 +1583,7 @@ public class SubController {
.multiply(BigDecimal.valueOf(p.getEff_Len()));
BigDecimal slabVolume = SInfo.getSlabActThk()
- .multiply(SInfo.getSlabActWid())
+ .multiply(SInfo.getRemWid())
.multiply(BigDecimal.valueOf(p.getVirtualSlab_Len()));
BigDecimal yieldRate = rolledVolume.divide(slabVolume, 2, RoundingMode.HALF_UP); // 保留4位小数
@@ -1477,7 +1592,10 @@ public class SubController {
p.setRate(yieldRate);
});
-
+ //判断结果数据是否存在
+ if (gltGGrpCalRslt.size() == 0) {
+ return;
+ }
//判断结算结果长度和成材率是否可用
gltGGrpCalRslt.parallelStream().forEach(p -> {
@@ -1487,12 +1605,12 @@ public class SubController {
return;
}
-
//成材率大于90%
if (p.getRate().compareTo(BigDecimal.valueOf(0.9)) <= 0) {
p.setIntUseFlg(0);
return;
}
+
int minWid = Math.min(p.getVirtualSlab_Wid(), p.getVirtualSlab_Len());
int maxLen = Math.max(p.getVirtualSlab_Wid(), p.getVirtualSlab_Len());
// 板坯厚度起止SLAB_THICK_FROM/TO包含余坯实际厚度;
@@ -1506,6 +1624,7 @@ public class SubController {
&& e.getRollLineNo().equals(SInfo.getMscLineNo().substring(SInfo.getMscLineNo().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
@@ -1514,6 +1633,7 @@ public class SubController {
&& e.getRollLineNo().equals(SInfo.getMscLineNo().substring(SInfo.getMscLineNo().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
@@ -1550,6 +1670,9 @@ public class SubController {
//选择最优结果
ChosBestRsl(SInfo);
+ //递归
+ SetGroupCalRslt(SInfo);
+
//递归
////小于最小入炉尺寸
//if (SInfo.getRemLen().intValue() <2200)
@@ -1668,19 +1791,33 @@ public class SubController {
}
);
- }
-
- plistpmSubHisDO.forEach(p->{
-
- subService.InsertPmSubHisDO(p);
-
- });
- plistpmSubOrdDO.forEach(p->{
+ //判断长宽大小
+ BigDecimal decLen =BigDecimal.valueOf(SInfo.getRemLen().intValue()-maxRate.getVirtualSlab_Len());
+ BigDecimal DecWid =SInfo.getRemWid();
+ if (decLen.compareTo(DecWid) <= 0) {
+ // 当 p.getSlabActLen() 小于或等于 p.getSlabActWid() 时执行的代码
+ SInfo.setRemLen(DecWid);
+ SInfo.setRemWid(decLen);
+ }else{
+ SInfo.setRemLen(decLen);
+ SInfo.setRemWid(DecWid);
+ }
- subService.InsertPmSubOrdDO(p);
+ }
- });
+ //存储数据,组板结果
+ // plistpmSubHisDO.forEach(p->{
+ //
+ // subService.InsertPmSubHisDO(p);
+ //
+ // });
+ //
+ // plistpmSubOrdDO.forEach(p->{
+ //
+ // subService.InsertPmSubOrdDO(p);
+ //
+ // });
}
diff --git a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/mapper/SubMapper.java b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/mapper/SubMapper.java
index c7d149a..3541da3 100644
--- a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/mapper/SubMapper.java
+++ b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/mapper/SubMapper.java
@@ -86,4 +86,14 @@ public interface SubMapper extends BaseMapper
*
* @author SunH
- * @since 2024-12-18
+ * @since 2025-02-10
*/
@Data
@EqualsAndHashCode(callSuper = false)
@@ -25,6 +27,7 @@ public class PmAutoSubSettingDO implements Serializable {
/**
* 主键ID
*/
+ @TableId(value = "ID", type = IdType.AUTO)
private BigDecimal id;
/**
@@ -103,7 +106,7 @@ public class PmAutoSubSettingDO implements Serializable {
private String isUseSt;
/**
- * 订货长度
+ * 可用仓库
*/
private String useableDstock;
@@ -197,5 +200,15 @@ public class PmAutoSubSettingDO implements Serializable {
private String attribute5;
+ /**
+ * 触发周期
+ */
+ private BigDecimal triggerCycle;
+
+ /**
+ * 超投条件
+ */
+ private String overshootCondition;
+
}
diff --git a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/service/SubService.java b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/service/SubService.java
index cba7fba..c8dc386 100644
--- a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/service/SubService.java
+++ b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/service/SubService.java
@@ -83,4 +83,14 @@ public interface SubService {
void InsertPmSubHisDO(PmSubHisDO p);
void InsertPmSubOrdDO(PmSubOrdDO p);
+
+ List getPmIrsubableCont();
+
+ List getPmIrsubableSlab();
+
+ List getPmAutoSubSetting();
+
+ List getPmRetainSt();
+
+ List getPmRetainStack();
}
diff --git a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/service/impl/SubServiceImpl.java b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/service/impl/SubServiceImpl.java
index b30530c..5bdd86c 100644
--- a/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/service/impl/SubServiceImpl.java
+++ b/1024shop-manager/1024shop-manager/src/main/java/net/xdclass/shopmanager/service/impl/SubServiceImpl.java
@@ -208,5 +208,30 @@ public class SubServiceImpl implements SubService {
subMapper.InsertPmSubOrdDO(p);
}
+ @Override
+ public List getPmIrsubableCont() {
+ return subMapper.getPmIrsubableCont();
+ }
+
+ @Override
+ public List getPmIrsubableSlab() {
+ return subMapper.getPmIrsubableSlab();
+ }
+
+ @Override
+ public List getPmAutoSubSetting() {
+ return subMapper.getPmAutoSubSetting();
+ }
+
+ @Override
+ public List getPmRetainSt() {
+ return subMapper.getPmRetainSt();
+ }
+
+ @Override
+ public List getPmRetainStack() {
+ return subMapper.getPmRetainStack();
+ }
+
}
diff --git a/1024shop-manager/1024shop-manager/src/main/resources/mapper/SubMapper.xml b/1024shop-manager/1024shop-manager/src/main/resources/mapper/SubMapper.xml
index 7a5c93e..fe12bf7 100644
--- a/1024shop-manager/1024shop-manager/src/main/resources/mapper/SubMapper.xml
+++ b/1024shop-manager/1024shop-manager/src/main/resources/mapper/SubMapper.xml
@@ -2,35 +2,36 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+