2025-02-17

main
sunhao 7 days ago
parent 7e353dd8a9
commit 86b61dad99

@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -166,6 +167,9 @@ public class SubController {
//自动替代日志 //自动替代日志
private static List<PmSubLogDO> plistpmSubLogDO=new ArrayList<>(); private static List<PmSubLogDO> plistpmSubLogDO=new ArrayList<>();
//记录已被使用的订单号
private static List<GPreOrder> plistOrdHis=new ArrayList<>();
//endregion //endregion
@ApiOperation("求解处理") @ApiOperation("求解处理")
@ -207,10 +211,44 @@ public class SubController {
logger.info("***初次分组数量*** " + gltGrpOrderFir.size()); logger.info("***初次分组数量*** " + gltGrpOrderFir.size());
//被使用的订单数据实例化
plistOrdHis=new ArrayList<>();
//循环板坯 //循环板坯
plistSlab.forEach(p -> { plistSlab.forEach(p -> {
logger.info("*************板坯开始{}************* ", p.getSlabNo()); logger.info("*************板坯开始{}************* ", p.getSlabNo());
logger.info("***板坯信息:{} 厚宽长:{}*{}*{} ", p.getSlabNo(), p.getSlabActThk(), p.getSlabActWid(), p.getSlabActLen()); logger.info("***板坯信息:{} 厚宽长:{}*{}*{} ", p.getSlabNo(), p.getSlabActThk(), p.getSlabActWid(), p.getSlabActLen());
// 判断板坯的长度是否在plistpmAutoSubSettingDO配置的范围内
if (p.getSlabActLen().compareTo(plistpmAutoSubSettingDO.get(0).getMatLenMin()) < 0 && p.getSlabActLen().compareTo(plistpmAutoSubSettingDO.get(0).getMatLenMax()) > 0) {
logger.info("***板坯信息被排除:{} 长度不在范围内 ", p.getSlabNo() );
return;
}
// 判断板坯的宽度是否在plistpmAutoSubSettingDO配置的范围内
if (p.getSlabActWid().compareTo(plistpmAutoSubSettingDO.get(0).getMatWidthMin()) < 0 && p.getSlabActWid().compareTo(plistpmAutoSubSettingDO.get(0).getMatWidthMax()) > 0) {
logger.info("***板坯信息被排除:{} 宽度不在范围内 ", p.getSlabNo() );
return;
}
// 判断板坯的厚度是否在plistpmAutoSubSettingDO配置的范围内
if (p.getSlabActThk().compareTo(plistpmAutoSubSettingDO.get(0).getMatThickMin()) < 0 && p.getSlabActThk().compareTo(plistpmAutoSubSettingDO.get(0).getMatThickMax()) > 0) {
logger.info("***板坯信息被排除:{} 厚度不在范围内 ", p.getSlabNo() );
return;
}
//判断plistpmIrsubableSlabDO是否包含P.SlabNO范围内
if (plistpmIrsubableSlabDO.stream().anyMatch(x -> x.getSlabNo().equals(p.getSlabNo()))) {
logger.info("***板坯信息被排除:{} 不可组板 ", p.getSlabNo() );
return;
}
//判断plistpmRetainStDO是否包含P的钢种判断这个板坯的钢种是否可组板
if (plistpmRetainStDO.stream().anyMatch(x -> x.getStNo().equals(p.getStNo()))) {
logger.info("***板坯信息被排除:{} 不可组板 ", p.getSlabNo() );
return;
}
try { try {
gltGCalGrp = new ArrayList<>(); gltGCalGrp = new ArrayList<>();
//二次分组 //二次分组
@ -235,14 +273,9 @@ public class SubController {
gltSelGGrpCalRslt = new ArrayList<>(); gltSelGGrpCalRslt = new ArrayList<>();
SetGroupCalRslt(p); SetGroupCalRslt(p);
//存储数据,组板结果
plistpmSubHisDO.forEach(e->{
subService.InsertPmSubHisDO(e);
});
plistpmSubOrdDO.forEach(e->{ //存储数据,组板结果
subService.InsertPmSubOrdDO(e); SaveHisData(p);
});
logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size()); logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size());
} }
@ -264,6 +297,34 @@ public class SubController {
return JsonData.buildSuccess(); 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);
});
});
}
/** /**
* -线 * -线
* *
@ -568,9 +629,13 @@ public class SubController {
* *
*/ */
public void SetPreData() { public void SetPreData() {
//实例化订单列表
gltOrder =new ArrayList<>();
//实例化订单分组
gltGrpOrderFir=new ArrayList<>();
//订单数据处理 //订单数据处理
SetOrderLackData(); SetOrderLackData();
//订单根据尺寸初次分组 //订单根据尺寸初次分组
SetGroupOrderFir(); SetGroupOrderFir();
@ -1242,17 +1307,39 @@ public class SubController {
//TODO:箭头函数订单多线程处理数据,升序,降序,重组。 //TODO:箭头函数订单多线程处理数据,升序,降序,重组。
//使用 Stream.parallel() 来并行执行 for 循环 OrderNo 升序 PdLackQty 降序 //使用 Stream.parallel() 来并行执行 for 循环 OrderNo 升序 PdLackQty 降序
plistOrder.parallelStream() // plistOrder.sorted(Comparator.comparing(PmProContDO::getOrderNo)
.sorted(Comparator.comparing(PmProContDO::getOrderNo) // .thenComparing(Comparator.comparing(PmProContDO::getPdLackQty).reversed()))
.thenComparing(Comparator.comparing(PmProContDO::getPdLackQty).reversed())) plistOrder.parallelStream().forEach(i -> {
.forEach(i -> {
PmProContProdAttrDO ppcpa = new PmProContProdAttrDO(); PmProContProdAttrDO ppcpa = new PmProContProdAttrDO();
PmContMscTechDO pcmt = new PmContMscTechDO(); PmContMscTechDO pcmt = new PmContMscTechDO();
try { 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) { 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())); 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) { 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())); pcmt = plistPmContMscTechDO.stream().filter(p -> p.getOrderNo().equals(i.getOrderNo())).findFirst().orElseThrow(() -> new NoSuchElementException("No PmContMscTechDO found with name Charlie " + i.getOrderNo()));
@ -1417,6 +1504,12 @@ public class SubController {
if (ltOrder.stream().filter(f -> f.equals(e.getOrderNo())).count() == intOrdCount) { if (ltOrder.stream().filter(f -> f.equals(e.getOrderNo())).count() == intOrdCount) {
return; return;
} }
//被使用过的订单ID排除在外
if (plistOrdHis.stream().filter(f -> f.getIDValue()==e.getIDValue()).count()>0) {
return;
}
ltOrder.add(e.getOrderNo());//添加订单号 ltOrder.add(e.getOrderNo());//添加订单号
ltValues.add(e.getIDValue());//价值 ltValues.add(e.getIDValue());//价值
ltweights.add(e.getLen());//长度 ltweights.add(e.getLen());//长度
@ -1723,6 +1816,7 @@ public class SubController {
// 生成虚拟板坯号 // 生成虚拟板坯号
String virtualSlabNo = generateVirtualSlabNo(SInfo.getPono()); String virtualSlabNo = generateVirtualSlabNo(SInfo.getPono());
pmSubHisDO.setVirtualSlabNo(virtualSlabNo); // 虚拟板坯号 pmSubHisDO.setVirtualSlabNo(virtualSlabNo); // 虚拟板坯号
pmSubHisDO.setRelKey(virtualSlabNo); // 关系号
// 手动为每个字段赋值 // 手动为每个字段赋值
pmSubHisDO.setSlabThick(maxRate.getVirtualSlab_Thk()); // 厚度 pmSubHisDO.setSlabThick(maxRate.getVirtualSlab_Thk()); // 厚度
@ -1772,6 +1866,7 @@ public class SubController {
// 生成虚拟板坯号 // 生成虚拟板坯号
pmSubOrdDO.setVirtualSlabNo(virtualSlabNo); // 虚拟板坯号 pmSubOrdDO.setVirtualSlabNo(virtualSlabNo); // 虚拟板坯号
pmSubOrdDO.setSlabNo(SInfo.getSlabNo()); // 板坯号
// 手动为每个字段赋值 // 手动为每个字段赋值
pmSubOrdDO.setOrderNo(gPreOrder.getOrderNo()); // 合同号 pmSubOrdDO.setOrderNo(gPreOrder.getOrderNo()); // 合同号
@ -1805,6 +1900,9 @@ public class SubController {
// 将 PmSubOrdDO 对象添加到列表中 // 将 PmSubOrdDO 对象添加到列表中
plistpmSubOrdDO.add(pmSubOrdDO); plistpmSubOrdDO.add(pmSubOrdDO);
//记录被使用的订单数据
plistOrdHis.add(gPreOrder);
} }
); );
@ -1839,11 +1937,22 @@ public class SubController {
// 生成虚拟板坯号的方法 // 生成虚拟板坯号的方法
private String generateVirtualSlabNo(String pono) { private String generateVirtualSlabNo(String pono) {
AtomicInteger counter = counterMap.computeIfAbsent(pono, k -> new AtomicInteger(0)); //AtomicInteger counter = counterMap.computeIfAbsent(pono, k -> new AtomicInteger(0));
int currentCounter = counter.incrementAndGet(); //int currentCounter = counter.incrementAndGet();
return pono + "S9" + String.format("%03d", currentCounter); //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) { public void SetSaveDate(SlabInfoDO SInfo) {
SetPmPdSlab(SInfo);//组板板坯表 命令板坯表 命令大板表 SetPmPdSlab(SInfo);//组板板坯表 命令板坯表 命令大板表

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

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

@ -79,7 +79,7 @@ public class MyBatisPlusGenerator {
.setDriverName("oracle.jdbc.OracleDriver") .setDriverName("oracle.jdbc.OracleDriver")
.setUrl("jdbc:oracle:thin:@172.18.15.50:1521/momdev") .setUrl("jdbc:oracle:thin:@172.18.15.50:1521/momdev")
.setUsername("xisc_qd") .setUsername("xisc_pm")
.setPassword("HZERO1234"); .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("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 两个方式,直接写,或者使用命令行输入 //TODO TODO TODO TODO 两个方式,直接写,或者使用命令行输入

Loading…
Cancel
Save