@ -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 ) ; //组板板坯表 命令板坯表 命令大板表