2025-02-17

main
sunhao 6 days ago
parent 7e353dd8a9
commit 86b61dad99

@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
@ -166,6 +167,9 @@ public class SubController {
//自动替代日志
private static List<PmSubLogDO> plistpmSubLogDO=new ArrayList<>();
//记录已被使用的订单号
private static List<GPreOrder> plistOrdHis=new ArrayList<>();
//endregion
@ApiOperation("求解处理")
@ -207,55 +211,84 @@ public class SubController {
logger.info("***初次分组数量*** " + gltGrpOrderFir.size());
//被使用的订单数据实例化
plistOrdHis=new ArrayList<>();
//循环板坯
plistSlab.forEach(p -> {
logger.info("*************板坯开始{}************* ", p.getSlabNo());
logger.info("***板坯信息:{} 厚宽长:{}*{}*{} ",p.getSlabNo(), p.getSlabActThk(),p.getSlabActWid(),p.getSlabActLen());
try {
gltGCalGrp = new ArrayList<>();
//二次分组
SetGrpDataBySlab(p);
logger.info("*************板坯开始{}************* ", p.getSlabNo());
logger.info("***板坯信息:{} 厚宽长:{}*{}*{} ", p.getSlabNo(), p.getSlabActThk(), p.getSlabActWid(), p.getSlabActLen());
logger.info("***二次分组数量*** " + gltGCalGrp.size());
// 判断板坯的长度是否在plistpmAutoSubSettingDO配置的范围内
if (p.getSlabActLen().compareTo(plistpmAutoSubSettingDO.get(0).getMatLenMin()) < 0 && p.getSlabActLen().compareTo(plistpmAutoSubSettingDO.get(0).getMatLenMax()) > 0) {
logger.info("***板坯信息被排除:{} 长度不在范围内 ", p.getSlabNo() );
return;
}
if (gltGCalGrp.size() > 0) {
// 判断板坯的宽度是否在plistpmAutoSubSettingDO配置的范围内
if (p.getSlabActWid().compareTo(plistpmAutoSubSettingDO.get(0).getMatWidthMin()) < 0 && p.getSlabActWid().compareTo(plistpmAutoSubSettingDO.get(0).getMatWidthMax()) > 0) {
logger.info("***板坯信息被排除:{} 宽度不在范围内 ", p.getSlabNo() );
return;
}
//板坯长度和宽度调换
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());
}
// 判断板坯的厚度是否在plistpmAutoSubSettingDO配置的范围内
if (p.getSlabActThk().compareTo(plistpmAutoSubSettingDO.get(0).getMatThickMin()) < 0 && p.getSlabActThk().compareTo(plistpmAutoSubSettingDO.get(0).getMatThickMax()) > 0) {
logger.info("***板坯信息被排除:{} 厚度不在范围内 ", p.getSlabNo() );
return;
}
gltGGrpCalRslt = new ArrayList<>();
//判断plistpmIrsubableSlabDO是否包含P.SlabNO范围内
if (plistpmIrsubableSlabDO.stream().anyMatch(x -> x.getSlabNo().equals(p.getSlabNo()))) {
logger.info("***板坯信息被排除:{} 不可组板 ", p.getSlabNo() );
return;
}
gltSelGGrpCalRslt = new ArrayList<>();
//判断plistpmRetainStDO是否包含P的钢种判断这个板坯的钢种是否可组板
if (plistpmRetainStDO.stream().anyMatch(x -> x.getStNo().equals(p.getStNo()))) {
logger.info("***板坯信息被排除:{} 不可组板 ", p.getSlabNo() );
return;
}
SetGroupCalRslt(p);
//存储数据,组板结果
plistpmSubHisDO.forEach(e->{
subService.InsertPmSubHisDO(e);
});
try {
gltGCalGrp = new ArrayList<>();
//二次分组
SetGrpDataBySlab(p);
plistpmSubOrdDO.forEach(e->{
subService.InsertPmSubOrdDO(e);
});
logger.info("***二次分组数量*** " + gltGCalGrp.size());
logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size());
}
// if (gltGGrpCalRslt.size() > 0) {
// now = new Date();
// SetSaveDate(p);
// }
if (gltGCalGrp.size() > 0) {
} catch (Exception e) {
logger.error("板坯报错:" + p.getSlabNo(), e);
//板坯长度和宽度调换
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());
}
logger.info("*************板坯结束{}************* ", p.getSlabNo());
logger.info("");
gltGGrpCalRslt = new ArrayList<>();
gltSelGGrpCalRslt = new ArrayList<>();
SetGroupCalRslt(p);
//存储数据,组板结果
SaveHisData(p);
logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size());
}
// if (gltGGrpCalRslt.size() > 0) {
// now = new Date();
// SetSaveDate(p);
// }
} catch (Exception e) {
logger.error("板坯报错:" + p.getSlabNo(), e);
}
logger.info("*************板坯结束{}************* ", p.getSlabNo());
logger.info("");
}
);
logger.info("*****处理结束*****");
@ -264,6 +297,34 @@ public class SubController {
return JsonData.buildSuccess();
}
public void SaveHisData(SlabInfoDO SInfo) {
//存储数据,组板结果
plistpmSubHisDO.forEach(e -> {
//TODO:未获取轧制命令最大序号
int intSeq = 1;//Integer.parseInt(subService.GetMaxSeq().substring(subService.GetMaxSeq().length() - 4));
String virtualSlabNo = generateVirtualSlabNoSave(e.getVirtualSlabNo(), intSeq);
String strGuid = e.getVirtualSlabNo();
//获取虚拟板坯号
e.setVirtualSlabNo(virtualSlabNo);
subService.InsertPmSubHisDO(e);
//删选plistpmSubOrdDO中虚拟板坯号等于strGuid的信息
plistpmSubOrdDO.stream()
.filter(f -> !f.getVirtualSlabNo().equals(strGuid))
.collect(Collectors.toList()).forEach(m -> {
m.setVirtualSlabNo(virtualSlabNo);
subService.InsertPmSubOrdDO(m);
});
});
}
/**
* -线
*
@ -288,28 +349,28 @@ public class SubController {
//1板坯数据
tasks.add(() -> {
plistSlab = subService.getSlabInfo();
// logger.info("******1板坯数据获取完毕*******");
//logger.info("******1板坯数据获取完毕*******");
return null;
});
//2订单数据
tasks.add(() -> {
plistOrder = subService.getOrderInfo();
// logger.info("******2订单数据获取完毕*******");
//logger.info("******2订单数据获取完毕*******");
return null;
});
//3生产合同产品属性表
tasks.add(() -> {
plistPmProContProdAttrDO = subService.getPmProCountProdAttr();
// logger.info("******3生产合同产品属性表数据获取完毕*******");
//logger.info("******3生产合同产品属性表数据获取完毕*******");
return null;
});
//4合同产线工艺参数表
tasks.add(() -> {
plistPmContMscTechDO = subService.getPmContMscTech();
// logger.info("******4合同产线工艺参数表数据获取完毕*******");
//logger.info("******4合同产线工艺参数表数据获取完毕*******");
return null;
});
@ -317,133 +378,133 @@ public class SubController {
tasks.add(() -> {
// plistPmProContProdAttrDO = subService.getPmProCountProdAttr();
Thread.sleep(1000); // 休眠1秒钟
// logger.info("******5生产合同产品属性表数据获取完毕*******");
//logger.info("******5生产合同产品属性表数据获取完毕*******");
return null;
});
//6组板设计规则集
tasks.add(() -> {
plistPmPdRuleSetDO = subService.getPmPdRuleSet();
// logger.info("******6组板设计规则集数据获取完毕*******");
//logger.info("******6组板设计规则集数据获取完毕*******");
return null;
});
//7组板设计规则集
tasks.add(() -> {
plistPmPdRuleItemDO = subService.getPmPdRuleItem();
// logger.info("******7组板设计规则集数据获取完毕*******");
//logger.info("******7组板设计规则集数据获取完毕*******");
return null;
});
//8最小轧制厚度公差范围基准表
tasks.add(() -> {
plistPmMinThickTolBtDO = subService.getPmMinThickTolBt();
// logger.info("******8最小轧制厚度公差范围基准表数据获取完毕*******");
//logger.info("******8最小轧制厚度公差范围基准表数据获取完毕*******");
return null;
});
//9钢板轧制规格对应收得率基准表
tasks.add(() -> {
plistPmPlateSpecYieldBtDO = subService.getPmPlateSpecYieldBt();
// logger.info("******9钢板轧制规格对应收得率基准表数据获取完毕*******");
//logger.info("******9钢板轧制规格对应收得率基准表数据获取完毕*******");
return null;
});
//10强度级别对照基准表
tasks.add(() -> {
plistPmStCodeBtDO = subService.getPmStCodeBt();
// logger.info("******10强度级别对照基准表数据获取完毕*******");
//logger.info("******10强度级别对照基准表数据获取完毕*******");
return null;
});
//11粗切位置决定基准表
tasks.add(() -> {
plistPmCutPlaceBtDO = subService.getPmCutPlaceBt();
// logger.info("******11粗切位置决定基准表数据获取完毕*******");
//logger.info("******11粗切位置决定基准表数据获取完毕*******");
return null;
});
//12组板常数基准表
tasks.add(() -> {
plistPmPdConstBtDO = subService.getPmPdConstBt();
// logger.info("******12组板常数基准表数据获取完毕*******");
//logger.info("******12组板常数基准表数据获取完毕*******");
return null;
});
//13钢板切缝切头尾范围基准表
tasks.add(() -> {
plistPmPlateCutLenBtDO = subService.getPmPlateCutLenBt();
// logger.info("******13钢板切缝切头尾范围基准表数据获取完毕*******");
//logger.info("******13钢板切缝切头尾范围基准表数据获取完毕*******");
return null;
});
//14组板临时收得率基准表
tasks.add(() -> {
plistPmPdTmpYieldBtDO = subService.getPmPdTmpYieldBt();
// logger.info("******14组板临时收得率基准表数据获取完毕*******");
//logger.info("******14组板临时收得率基准表数据获取完毕*******");
return null;
});
//15钢板切边量基准表
tasks.add(() -> {
plistPmPlateTrimBtDO = subService.getPmPlateTrimBt();
// logger.info("******15钢板切边量基准表数据获取完毕*******");
//logger.info("******15钢板切边量基准表数据获取完毕*******");
return null;
});
//16余材组板内部钢种以优充次对照表
tasks.add(() -> {
plistPmSlabReplBtDO = subService.getPmSlabReplBt();
// logger.info("******16余材组板内部钢种以优充次对照表数据获取完毕*******");
//logger.info("******16余材组板内部钢种以优充次对照表数据获取完毕*******");
return null;
});
//17热处理炉基准规格表
tasks.add(() -> {
plistPmHeatTreatFurnaceBtDO = subService.getPmHeatTreatFurnaceBt();
// logger.info("******17热处理炉基准规格表数据获取完毕*******");
//logger.info("******17热处理炉基准规格表数据获取完毕*******");
return null;
});
//18特殊钢种余量增加表
tasks.add(() -> {
plistPmSpeStAddvBtDO = subService.getPmSpeStAddvBt();
// logger.info("******18特殊钢种余量增加表数据获取完毕*******");
//logger.info("******18特殊钢种余量增加表数据获取完毕*******");
return null;
});
//19合同处理成分结果数据
tasks.add(() -> {
plistQdToLineupResultCheDO = subService.getQdToLineupResultChe();
// logger.info("******19合同处理成分结果数据获取完毕*******");
//logger.info("******19合同处理成分结果数据获取完毕*******");
return null;
});
//20合同处理坯料性能要求
tasks.add(() -> {
plistQdToLineupResultSlabphyDO = subService.getQdToLineupResultSlabphy();
// logger.info("******20合同处理坯料性能要求数据获取完毕*******");
//logger.info("******20合同处理坯料性能要求数据获取完毕*******");
return null;
});
//21炉次工序成分代表实绩表
tasks.add(() -> {
plistQeTqHeatcheStandResultDO = subService.getQeTqHeatcheStandResult();
// logger.info("******21炉次工序成分代表实绩表数据获取完毕*******");
//logger.info("******21炉次工序成分代表实绩表数据获取完毕*******");
return null;
});
//22炉次待委托表
tasks.add(() -> {
plistQeTqPonoWaitTestDO = subService.getQeTqPonoWaitTest();
// logger.info("******22炉次待委托表数据获取完毕*******");
//logger.info("******22炉次待委托表数据获取完毕*******");
return null;
});
//23坯料低倍委托实绩表
tasks.add(() -> {
plistQeTqSlabMacroResultDO = subService.getQeTqSlabMacroResult();
// logger.info("******23坯料低倍委托实绩表数据获取完毕*******");
//logger.info("******23坯料低倍委托实绩表数据获取完毕*******");
return null;
});
@ -568,9 +629,13 @@ public class SubController {
*
*/
public void SetPreData() {
//实例化订单列表
gltOrder =new ArrayList<>();
//实例化订单分组
gltGrpOrderFir=new ArrayList<>();
//订单数据处理
SetOrderLackData();
//订单根据尺寸初次分组
SetGroupOrderFir();
@ -1242,26 +1307,48 @@ public class SubController {
//TODO:箭头函数订单多线程处理数据,升序,降序,重组。
//使用 Stream.parallel() 来并行执行 for 循环 OrderNo 升序 PdLackQty 降序
plistOrder.parallelStream()
.sorted(Comparator.comparing(PmProContDO::getOrderNo)
.thenComparing(Comparator.comparing(PmProContDO::getPdLackQty).reversed()))
.forEach(i -> {
// plistOrder.sorted(Comparator.comparing(PmProContDO::getOrderNo)
// .thenComparing(Comparator.comparing(PmProContDO::getPdLackQty).reversed()))
plistOrder.parallelStream().forEach(i -> {
PmProContProdAttrDO ppcpa = new PmProContProdAttrDO();
PmContMscTechDO pcmt = new PmContMscTechDO();
try {
//判断是否在不可组板订单范围内 plistpmIrsubableContDO 中存在就返回return
if (plistpmIrsubableContDO.stream().filter(p -> p.getOrderNo().equals(i.getOrderNo())).count() > 0) {
logger.info("订单:{} 不可自动组板", i.getOrderNo());
return;
}
if (plistPmProContProdAttrDO.stream().filter(p -> p.getOrderNo().equals(i.getOrderNo())).count() > 0) {
ppcpa = plistPmProContProdAttrDO.stream().filter(p -> p.getOrderNo().equals(i.getOrderNo())).findFirst().orElseThrow(() -> new NoSuchElementException("No PmProContProdAttrDO found with name Charlie " + i.getOrderNo()));
//判断尺寸是否存在 宽度不在 plistpmAutoSubSettingDO的订单宽度范围内或者厚度不在plistpmAutoSubSettingDO的订单厚度范围内就return或者交货期不在plistpmAutoSubSettingDO的订单交货期范围内就return
PmProContProdAttrDO finalPpcpa = ppcpa;
if (plistpmAutoSubSettingDO.stream().filter(p ->
p.getOrderWidthMin().intValue() <= finalPpcpa.getOrderWidth().intValue()
&& finalPpcpa.getOrderWidth().intValue() <= p.getOrderWidthMax().intValue()
&& p.getOrderThickMin().intValue() <= finalPpcpa.getOrderThick().intValue()
&& finalPpcpa.getOrderThick().intValue() <= p.getOrderThickMax().intValue()
&& p.getDelivyDateFrom().compareTo(finalPpcpa.getDelivyDate())<= 0
&& finalPpcpa.getDelivyDate().compareTo(p.getDelivyDateTo())<=0).count()<=0)
{
logger.info("订单:{} 不可自动组板,尺寸厚度{},宽度{},交货期{} 不在范围内", i.getOrderNo(),finalPpcpa.getOrderThick(), finalPpcpa.getOrderWidth(),new SimpleDateFormat("yyyy-MM-dd").format(finalPpcpa.getDelivyDate()));
return;
}
if (plistPmContMscTechDO.stream().filter(p -> p.getOrderNo().equals(i.getOrderNo()) && p.getMscLineNo().equals("1030")).count() > 0) {
// 可能抛出异常的代码
pcmt = plistPmContMscTechDO.stream().filter(p -> p.getOrderNo().equals(i.getOrderNo())).findFirst().orElseThrow(() -> new NoSuchElementException("No PmContMscTechDO found with name Charlie " + i.getOrderNo()));
SetAllOrder(i, ppcpa, pcmt);
} else {
// logger.info("缺少产线信息:" + i.getOrderNo());
//logger.info("缺少产线信息:" + i.getOrderNo());
}
} else {
// logger.info("缺少属性信息:" + i.getOrderNo());
//logger.info("缺少属性信息:" + i.getOrderNo());
}
} catch (NullPointerException ex1) {
@ -1417,6 +1504,12 @@ public class SubController {
if (ltOrder.stream().filter(f -> f.equals(e.getOrderNo())).count() == intOrdCount) {
return;
}
//被使用过的订单ID排除在外
if (plistOrdHis.stream().filter(f -> f.getIDValue()==e.getIDValue()).count()>0) {
return;
}
ltOrder.add(e.getOrderNo());//添加订单号
ltValues.add(e.getIDValue());//价值
ltweights.add(e.getLen());//长度
@ -1723,6 +1816,7 @@ public class SubController {
// 生成虚拟板坯号
String virtualSlabNo = generateVirtualSlabNo(SInfo.getPono());
pmSubHisDO.setVirtualSlabNo(virtualSlabNo); // 虚拟板坯号
pmSubHisDO.setRelKey(virtualSlabNo); // 关系号
// 手动为每个字段赋值
pmSubHisDO.setSlabThick(maxRate.getVirtualSlab_Thk()); // 厚度
@ -1772,6 +1866,7 @@ public class SubController {
// 生成虚拟板坯号
pmSubOrdDO.setVirtualSlabNo(virtualSlabNo); // 虚拟板坯号
pmSubOrdDO.setSlabNo(SInfo.getSlabNo()); // 板坯号
// 手动为每个字段赋值
pmSubOrdDO.setOrderNo(gPreOrder.getOrderNo()); // 合同号
@ -1805,6 +1900,9 @@ public class SubController {
// 将 PmSubOrdDO 对象添加到列表中
plistpmSubOrdDO.add(pmSubOrdDO);
//记录被使用的订单数据
plistOrdHis.add(gPreOrder);
}
);
@ -1839,11 +1937,22 @@ public class SubController {
// 生成虚拟板坯号的方法
private String generateVirtualSlabNo(String pono) {
AtomicInteger counter = counterMap.computeIfAbsent(pono, k -> new AtomicInteger(0));
int currentCounter = counter.incrementAndGet();
return pono + "S9" + String.format("%03d", currentCounter);
//AtomicInteger counter = counterMap.computeIfAbsent(pono, k -> new AtomicInteger(0));
//int currentCounter = counter.incrementAndGet();
//return pono + "S9" + String.format("%03d", currentCounter);
UUID guid = UUID.randomUUID();
return guid.toString();
}
// 生成虚拟板坯号的方法保存
private String generateVirtualSlabNoSave(String pono ,int i) {
return pono + "S9" + String.format("%03d", i+1);
}
//设置保存数据
public void SetSaveDate(SlabInfoDO SInfo) {
SetPmPdSlab(SInfo);//组板板坯表 命令板坯表 命令大板表

@ -13,7 +13,7 @@ import lombok.EqualsAndHashCode;
* </p>
*
* @author SunH
* @since 2025-01-23
* @since 2025-02-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ -25,7 +25,7 @@ public class PmSubHisDO implements Serializable {
/**
* ID
*/
private Long id;
private BigDecimal id;
/**
*
@ -182,5 +182,10 @@ public class PmSubHisDO implements Serializable {
*/
private BigDecimal needSlabWt;
/**
*
*/
private String relKey;
}

@ -2,7 +2,9 @@ package net.xdclass.shopmanager.model;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -13,7 +15,7 @@ import lombok.EqualsAndHashCode;
* </p>
*
* @author SunH
* @since 2025-01-23
* @since 2025-02-12
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ -25,7 +27,8 @@ public class PmSubOrdDO implements Serializable {
/**
* ID
*/
private Long id;
@TableId(value = "ID", type = IdType.AUTO)
private BigDecimal id;
/**
*
@ -131,5 +134,15 @@ public class PmSubOrdDO implements Serializable {
*/
private String orderSeqNo;
/**
*
*/
private String relKey;
/**
*
*/
private String slabNo;
}

@ -79,7 +79,7 @@ public class MyBatisPlusGenerator {
.setDriverName("oracle.jdbc.OracleDriver")
.setUrl("jdbc:oracle:thin:@172.18.15.50:1521/momdev")
.setUsername("xisc_qd")
.setUsername("xisc_pm")
.setPassword("HZERO1234");
@ -96,7 +96,8 @@ public class MyBatisPlusGenerator {
// .setInclude("QE_TQ_HEATCHE_STAND_RESULT","QE_TQ_PONO_WAIT_TEST","QE_TQ_SLAB_MACRO_RESULT")
.setInclude("QD_TO_PO_ORDER")
// .setInclude("QD_TO_PO_ORDER")
.setInclude("PM_SUB_HIS","PM_SUB_ORD")
// 生成的表, 支持多表一起生成,以数组形式填写
//TODO TODO TODO TODO 两个方式,直接写,或者使用命令行输入

Loading…
Cancel
Save