2025-02-17

main
sunhao 6 days ago
parent db3d3124c6
commit de859d312a

@ -156,25 +156,25 @@ public class SubController {
//region ***配置项参数*** //region ***配置项参数***
//不可自动组板订单信息 //不可自动组板订单信息
private static List<PmIrsubableContDO> plistpmIrsubableContDO=new ArrayList<>(); private static List<PmIrsubableContDO> plistpmIrsubableContDO = new ArrayList<>();
//不可自动组板板坯信息 //不可自动组板板坯信息
private static List<PmIrsubableSlabDO> plistpmIrsubableSlabDO=new ArrayList<>(); private static List<PmIrsubableSlabDO> plistpmIrsubableSlabDO = new ArrayList<>();
//自动替代配置参数 //自动替代配置参数
private static List<PmAutoSubSettingDO> plistpmAutoSubSettingDO=new ArrayList<>(); private static List<PmAutoSubSettingDO> plistpmAutoSubSettingDO = new ArrayList<>();
//钢种信息配置 //钢种信息配置
private static List<PmRetainStDO> plistpmRetainStDO=new ArrayList<>(); private static List<PmRetainStDO> plistpmRetainStDO = new ArrayList<>();
//仓库信息配置 //仓库信息配置
private static List<PmRetainStackDO> plistpmRetainStackDO=new ArrayList<>(); private static List<PmRetainStackDO> plistpmRetainStackDO = new ArrayList<>();
//自动替代日志 //自动替代日志
private static List<PmSubLogDO> plistpmSubLogDO=new ArrayList<>(); private static List<PmSubLogDO> plistpmSubLogDO = new ArrayList<>();
//记录已被使用的订单号 //记录已被使用的订单号
private static List<GPreOrder> plistOrdHis=new ArrayList<>(); private static List<GPreOrder> plistOrdHis = new ArrayList<>();
//endregion //endregion
@ -197,7 +197,7 @@ public class SubController {
System.out.println(ltInt.get(i)); System.out.println(ltInt.get(i));
} }
JsonData xx= new JsonData(); JsonData xx = new JsonData();
xx.setCode(0); xx.setCode(0);
xx.setData(ltInt); xx.setData(ltInt);
xx.setMsg("成功"); xx.setMsg("成功");
@ -229,7 +229,7 @@ public class SubController {
logger.info("***初次分组数量*** " + gltGrpOrderFir.size()); logger.info("***初次分组数量*** " + gltGrpOrderFir.size());
//被使用的订单数据实例化 //被使用的订单数据实例化
plistOrdHis=new ArrayList<>(); plistOrdHis = new ArrayList<>();
//循环板坯 //循环板坯
plistSlab.forEach(p -> { plistSlab.forEach(p -> {
@ -238,31 +238,31 @@ public class SubController {
// 判断板坯的长度是否在plistpmAutoSubSettingDO配置的范围内 // 判断板坯的长度是否在plistpmAutoSubSettingDO配置的范围内
if (p.getSlabActLen().compareTo(plistpmAutoSubSettingDO.get(0).getMatLenMin()) < 0 && p.getSlabActLen().compareTo(plistpmAutoSubSettingDO.get(0).getMatLenMax()) > 0) { if (p.getSlabActLen().compareTo(plistpmAutoSubSettingDO.get(0).getMatLenMin()) < 0 && p.getSlabActLen().compareTo(plistpmAutoSubSettingDO.get(0).getMatLenMax()) > 0) {
logger.info("***板坯信息被排除:{} 长度不在范围内 ", p.getSlabNo() ); logger.info("***板坯信息被排除:{} 长度不在范围内 ", p.getSlabNo());
return; return;
} }
// 判断板坯的宽度是否在plistpmAutoSubSettingDO配置的范围内 // 判断板坯的宽度是否在plistpmAutoSubSettingDO配置的范围内
if (p.getSlabActWid().compareTo(plistpmAutoSubSettingDO.get(0).getMatWidthMin()) < 0 && p.getSlabActWid().compareTo(plistpmAutoSubSettingDO.get(0).getMatWidthMax()) > 0) { if (p.getSlabActWid().compareTo(plistpmAutoSubSettingDO.get(0).getMatWidthMin()) < 0 && p.getSlabActWid().compareTo(plistpmAutoSubSettingDO.get(0).getMatWidthMax()) > 0) {
logger.info("***板坯信息被排除:{} 宽度不在范围内 ", p.getSlabNo() ); logger.info("***板坯信息被排除:{} 宽度不在范围内 ", p.getSlabNo());
return; return;
} }
// 判断板坯的厚度是否在plistpmAutoSubSettingDO配置的范围内 // 判断板坯的厚度是否在plistpmAutoSubSettingDO配置的范围内
if (p.getSlabActThk().compareTo(plistpmAutoSubSettingDO.get(0).getMatThickMin()) < 0 && p.getSlabActThk().compareTo(plistpmAutoSubSettingDO.get(0).getMatThickMax()) > 0) { if (p.getSlabActThk().compareTo(plistpmAutoSubSettingDO.get(0).getMatThickMin()) < 0 && p.getSlabActThk().compareTo(plistpmAutoSubSettingDO.get(0).getMatThickMax()) > 0) {
logger.info("***板坯信息被排除:{} 厚度不在范围内 ", p.getSlabNo() ); logger.info("***板坯信息被排除:{} 厚度不在范围内 ", p.getSlabNo());
return; return;
} }
//判断plistpmIrsubableSlabDO是否包含P.SlabNO范围内 //判断plistpmIrsubableSlabDO是否包含P.SlabNO范围内
if (plistpmIrsubableSlabDO.stream().anyMatch(x -> x.getSlabNo().equals(p.getSlabNo()))) { if (plistpmIrsubableSlabDO.stream().anyMatch(x -> x.getSlabNo().equals(p.getSlabNo()))) {
logger.info("***板坯信息被排除:{} 不可组板 ", p.getSlabNo() ); logger.info("***板坯信息被排除:{} 不可组板 ", p.getSlabNo());
return; return;
} }
//判断plistpmRetainStDO是否包含P的钢种判断这个板坯的钢种是否可组板 //判断plistpmRetainStDO是否包含P的钢种判断这个板坯的钢种是否可组板
if (plistpmRetainStDO.stream().anyMatch(x -> x.getStNo().equals(p.getStNo()))) { if (plistpmRetainStDO.stream().anyMatch(x -> x.getStNo().equals(p.getStNo()))) {
logger.info("***板坯信息被排除:{} 不可组板 ", p.getSlabNo() ); logger.info("***板坯信息被排除:{} 不可组板 ", p.getSlabNo());
return; return;
} }
@ -291,19 +291,20 @@ public class SubController {
SetGroupCalRslt(p); SetGroupCalRslt(p);
//存储数据,组板结果
SaveHisData(p);
logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size()); logger.info("结果数据板坯号:{};数量:{}", p.getSlabNo(), gltGGrpCalRslt.size());
} }
if (gltSelGGrpCalRslt.size() > 0) { if (gltSelGGrpCalRslt.size() > 0) {
now = new Date(); now = new Date();
//数据整理
SetSaveDate(p); SetSaveDate(p);
//开启事务 //开启事务
TransactionStatus transactionStatus = transactionService.begin(); TransactionStatus transactionStatus = transactionService.begin();
try { try {
//存储数据,组板结果
SaveHisData(p);
//保存数据
SaveData(); SaveData();
// bOffTaskLineService.saveOffTask(bPlanHeadAndLineVos); //bOffTaskLineService.saveOffTask(bPlanHeadAndLineVos);
transactionService.commit(transactionStatus); transactionService.commit(transactionStatus);
} catch (Exception e) { } catch (Exception e) {
logger.error("保存事务回滚:" + p.getSlabNo(), e); logger.error("保存事务回滚:" + p.getSlabNo(), e);
@ -330,12 +331,13 @@ public class SubController {
//存储数据,组板结果 //存储数据,组板结果
plistpmSubHisDO.forEach(e -> { plistpmSubHisDO.forEach(e -> {
String strMaxSeq = subService.GetMaxSeq(SInfo.getPono());
//TODO:未获取轧制命令最大序号 //TODO:未获取轧制命令最大序号
int intSeq = 1;//Integer.parseInt(subService.GetMaxSeq().substring(subService.GetMaxSeq().length() - 4)); int intSeq = Integer.parseInt(strMaxSeq.substring(strMaxSeq.length() - 3));
String virtualSlabNo = generateVirtualSlabNoSave(e.getVirtualSlabNo(), intSeq); String virtualSlabNo = generateVirtualSlabNoSave(e.getVirtualSlabNo(), intSeq);
String strGuid = e.getVirtualSlabNo(); String strGuid = e.getRelKey();
//获取虚拟板坯号 //获取虚拟板坯号
e.setVirtualSlabNo(virtualSlabNo); e.setVirtualSlabNo(virtualSlabNo);
@ -343,7 +345,7 @@ public class SubController {
subService.InsertPmSubHisDO(e); subService.InsertPmSubHisDO(e);
//删选plistpmSubOrdDO中虚拟板坯号等于strGuid的信息 //删选plistpmSubOrdDO中虚拟板坯号等于strGuid的信息
plistpmSubOrdDO.stream() plistpmSubOrdDO.stream()
.filter(f -> !f.getVirtualSlabNo().equals(strGuid)) .filter(f -> !f.getRelKey().equals(strGuid))
.collect(Collectors.toList()).forEach(m -> { .collect(Collectors.toList()).forEach(m -> {
m.setVirtualSlabNo(virtualSlabNo); m.setVirtualSlabNo(virtualSlabNo);
subService.InsertPmSubOrdDO(m); subService.InsertPmSubOrdDO(m);
@ -623,8 +625,7 @@ public class SubController {
logger.info("30:订单合约信息信息:" + plistQdToPoOrderDO.size()); logger.info("30:订单合约信息信息:" + plistQdToPoOrderDO.size());
logger.info("获取基础数据完成"); logger.info("获取基础数据完成");
if (plistpmAutoSubSettingDO.size()>0) if (plistpmAutoSubSettingDO.size() > 0) {
{
logger.info("配置信息-》 是否启动 {}", plistpmAutoSubSettingDO.get(0).getIsStartFlag()); logger.info("配置信息-》 是否启动 {}", plistpmAutoSubSettingDO.get(0).getIsStartFlag());
logger.info("配置信息-》 启动时间范围 {}~{}", plistpmAutoSubSettingDO.get(0).getStartTime(), plistpmAutoSubSettingDO.get(0).getEndTime()); logger.info("配置信息-》 启动时间范围 {}~{}", plistpmAutoSubSettingDO.get(0).getStartTime(), plistpmAutoSubSettingDO.get(0).getEndTime());
logger.info("配置信息-》 优先模式 {}", plistpmAutoSubSettingDO.get(0).getPriMode()); logger.info("配置信息-》 优先模式 {}", plistpmAutoSubSettingDO.get(0).getPriMode());
@ -659,9 +660,9 @@ public class SubController {
public void SetPreData() { public void SetPreData() {
//实例化订单列表 //实例化订单列表
gltOrder =new ArrayList<>(); gltOrder = new ArrayList<>();
//实例化订单分组 //实例化订单分组
gltGrpOrderFir=new ArrayList<>(); gltGrpOrderFir = new ArrayList<>();
//订单数据处理 //订单数据处理
SetOrderLackData(); SetOrderLackData();
@ -1362,10 +1363,9 @@ public class SubController {
&& finalPpcpa.getOrderWidth().intValue() <= p.getOrderWidthMax().intValue() && finalPpcpa.getOrderWidth().intValue() <= p.getOrderWidthMax().intValue()
&& p.getOrderThickMin().intValue() <= finalPpcpa.getOrderThick().intValue() && p.getOrderThickMin().intValue() <= finalPpcpa.getOrderThick().intValue()
&& finalPpcpa.getOrderThick().intValue() <= p.getOrderThickMax().intValue() && finalPpcpa.getOrderThick().intValue() <= p.getOrderThickMax().intValue()
&& p.getDelivyDateFrom().compareTo(finalPpcpa.getDelivyDate())<= 0 && p.getDelivyDateFrom().compareTo(finalPpcpa.getDelivyDate()) <= 0
&& finalPpcpa.getDelivyDate().compareTo(p.getDelivyDateTo())<=0).count()<=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()));
logger.info("订单:{} 不可自动组板,尺寸厚度{},宽度{},交货期{} 不在范围内", i.getOrderNo(),finalPpcpa.getOrderThick(), finalPpcpa.getOrderWidth(),new SimpleDateFormat("yyyy-MM-dd").format(finalPpcpa.getDelivyDate()));
return; return;
} }
@ -1504,7 +1504,7 @@ public class SubController {
GGCR.setCal_Len(intMaxLen); GGCR.setCal_Len(intMaxLen);
GGCR.setLtInfoGPreOrder(e.getLtInfoGPreOrder()); GGCR.setLtInfoGPreOrder(e.getLtInfoGPreOrder());
gltGGrpCalRslt.add(GGCR); gltGGrpCalRslt.add(GGCR);
}catch (Exception ex){ } catch (Exception ex) {
logger.info("***计算结果异常:" + ex.getMessage()); logger.info("***计算结果异常:" + ex.getMessage());
} }
}); });
@ -1539,7 +1539,7 @@ public class SubController {
} }
//被使用过的订单ID排除在外 //被使用过的订单ID排除在外
if (plistOrdHis.stream().filter(f -> f.getIDValue()==e.getIDValue()).count()>0) { if (plistOrdHis.stream().filter(f -> f.getIDValue() == e.getIDValue()).count() > 0) {
return; return;
} }
@ -1807,7 +1807,7 @@ public class SubController {
//数据可用 //数据可用
p.setIntUseFlg(1); p.setIntUseFlg(1);
} catch (Exception e){ } catch (Exception e) {
log.error("new2", e); log.error("new2", e);
return; return;
} }
@ -1909,6 +1909,7 @@ public class SubController {
// 生成虚拟板坯号 // 生成虚拟板坯号
pmSubOrdDO.setVirtualSlabNo(virtualSlabNo); // 虚拟板坯号 pmSubOrdDO.setVirtualSlabNo(virtualSlabNo); // 虚拟板坯号
pmSubOrdDO.setRelKey(virtualSlabNo); // 关系号
pmSubOrdDO.setSlabNo(SInfo.getSlabNo()); // 板坯号 pmSubOrdDO.setSlabNo(SInfo.getSlabNo()); // 板坯号
// 手动为每个字段赋值 // 手动为每个字段赋值
@ -1988,14 +1989,13 @@ public class SubController {
} }
// 生成虚拟板坯号的方法保存 // 生成虚拟板坯号的方法保存
private String generateVirtualSlabNoSave(String pono ,int i) { private String generateVirtualSlabNoSave(String pono, int i) {
return pono + "S9" + String.format("%03d", i+1); return pono + "S9" + String.format("%03d", i + 1);
} }
//设置保存数据 //设置保存数据
public void SetSaveDate(SlabInfoDO SInfo) { public void SetSaveDate(SlabInfoDO SInfo) {
SetPmPdSlab(SInfo);//组板板坯表 命令板坯表 命令大板表 SetPmPdSlab(SInfo);//组板板坯表 命令板坯表 命令大板表
@ -2054,20 +2054,20 @@ public class SubController {
String erpUtSpec2 = ""; String erpUtSpec2 = "";
String erpUtSpec3 = ""; String erpUtSpec3 = "";
if (resultQdToPoOrderDO.isPresent()) { if (resultQdToPoOrderDO.isPresent()) {
erpUtSpec1 = nvl(resultQdToPoOrderDO.get().getErpUtSpec1(),""); erpUtSpec1 = nvl(resultQdToPoOrderDO.get().getErpUtSpec1(), "");
erpUtSpec2 = nvl(resultQdToPoOrderDO.get().getErpUtSpec2(),""); erpUtSpec2 = nvl(resultQdToPoOrderDO.get().getErpUtSpec2(), "");
erpUtSpec3 = nvl(resultQdToPoOrderDO.get().getErpUtSpec3(),""); erpUtSpec3 = nvl(resultQdToPoOrderDO.get().getErpUtSpec3(), "");
if(!erpUtSpec1.isEmpty()){ if (!erpUtSpec1.isEmpty()) {
if (!ultDetectMethodCodeBuilder.toString().contains(erpUtSpec1)) { if (!ultDetectMethodCodeBuilder.toString().contains(erpUtSpec1)) {
ultDetectMethodCodeBuilder.append(erpUtSpec1).append("-"); ultDetectMethodCodeBuilder.append(erpUtSpec1).append("-");
} }
} }
if(!erpUtSpec2.isEmpty()){ if (!erpUtSpec2.isEmpty()) {
if (!ultDetectMethodCodeBuilder.toString().contains(erpUtSpec2)) { if (!ultDetectMethodCodeBuilder.toString().contains(erpUtSpec2)) {
ultDetectMethodCodeBuilder.append(erpUtSpec2).append("-"); ultDetectMethodCodeBuilder.append(erpUtSpec2).append("-");
} }
} }
if(!erpUtSpec3.isEmpty()){ if (!erpUtSpec3.isEmpty()) {
if (!ultDetectMethodCodeBuilder.toString().contains(erpUtSpec3)) { if (!ultDetectMethodCodeBuilder.toString().contains(erpUtSpec3)) {
ultDetectMethodCodeBuilder.append(erpUtSpec3).append("-"); ultDetectMethodCodeBuilder.append(erpUtSpec3).append("-");
} }
@ -2165,7 +2165,7 @@ public class SubController {
Long slabPdQty = plistPmPdSlabInfoDO.stream() Long slabPdQty = plistPmPdSlabInfoDO.stream()
.filter(item -> item != null && ggcr != null && ggcr.getSlabNo() != null && ggcr.getSlabNo().equals(item.getSlabNo())) .filter(item -> item != null && ggcr != null && ggcr.getSlabNo() != null && ggcr.getSlabNo().equals(item.getSlabNo()))
.count(); .count();
if(slabPdQty > 0){ if (slabPdQty > 0) {
Optional<PmPdSlabInfoDO> resultPmPdSlabInfoDO = plistPmPdSlabInfoDO.stream() Optional<PmPdSlabInfoDO> resultPmPdSlabInfoDO = plistPmPdSlabInfoDO.stream()
.filter(item -> ggcr.getSlabNo().equals(item.getSlabNo())) .filter(item -> ggcr.getSlabNo().equals(item.getSlabNo()))
.findFirst(); .findFirst();
@ -2396,7 +2396,7 @@ public class SubController {
Long slabPdQty = plistPmPdSlabInfoDO.stream() Long slabPdQty = plistPmPdSlabInfoDO.stream()
.filter(item -> item != null && pmPdSlabDO != null && pmPdSlabDO.getSlabNo() != null && pmPdSlabDO.getSlabNo().equals(item.getSlabNo())) .filter(item -> item != null && pmPdSlabDO != null && pmPdSlabDO.getSlabNo() != null && pmPdSlabDO.getSlabNo().equals(item.getSlabNo()))
.count(); .count();
if(slabPdQty>0){ if (slabPdQty > 0) {
Optional<PmPdSlabInfoDO> resultPmPdSlabInfoDO = plistPmPdSlabInfoDO.stream() Optional<PmPdSlabInfoDO> resultPmPdSlabInfoDO = plistPmPdSlabInfoDO.stream()
.filter(item -> pmPdSlabDO.getSlabNo().equals(item.getSlabNo())) .filter(item -> pmPdSlabDO.getSlabNo().equals(item.getSlabNo()))
.findFirst(); .findFirst();
@ -2611,19 +2611,19 @@ public class SubController {
pmCmdContDO.setHeadCut(pmPdSlabDOItem.get().getHeadCut().intValue()); pmCmdContDO.setHeadCut(pmPdSlabDOItem.get().getHeadCut().intValue());
pmCmdContDO.setTailCut(pmPdSlabDOItem.get().getTailCut().intValue()); pmCmdContDO.setTailCut(pmPdSlabDOItem.get().getTailCut().intValue());
pmCmdContDO.setCutModeCode(pmContMscTechDOItem.get().getAdModeCode()); pmCmdContDO.setCutModeCode(pmContMscTechDOItem.get().getAdModeCode());
if(pmContMscTechDOItem.get().getGFlag() != null){ if (pmContMscTechDOItem.get().getGFlag() != null) {
pmCmdContDO.setGFlag(String.valueOf(pmContMscTechDOItem.get().getGFlag())); pmCmdContDO.setGFlag(String.valueOf(pmContMscTechDOItem.get().getGFlag()));
} }
if(pmContMscTechDOItem.get().getCsFlag() != null){ if (pmContMscTechDOItem.get().getCsFlag() != null) {
pmCmdContDO.setCsFlag(String.valueOf(pmContMscTechDOItem.get().getCsFlag())); pmCmdContDO.setCsFlag(String.valueOf(pmContMscTechDOItem.get().getCsFlag()));
} }
if(pmContMscTechDOItem.get().getDssFlag() != null){ if (pmContMscTechDOItem.get().getDssFlag() != null) {
pmCmdContDO.setDssFlag(String.valueOf(pmContMscTechDOItem.get().getDssFlag())); pmCmdContDO.setDssFlag(String.valueOf(pmContMscTechDOItem.get().getDssFlag()));
} }
if(pmContMscTechDOItem.get().getDsFlag() != null){ if (pmContMscTechDOItem.get().getDsFlag() != null) {
pmCmdContDO.setDsFlag(String.valueOf(pmContMscTechDOItem.get().getDsFlag())); pmCmdContDO.setDsFlag(String.valueOf(pmContMscTechDOItem.get().getDsFlag()));
} }
if(pmContMscTechDOItem.get().getSsFlag() != null){ if (pmContMscTechDOItem.get().getSsFlag() != null) {
pmCmdContDO.setSsFlag(String.valueOf(pmContMscTechDOItem.get().getSsFlag())); pmCmdContDO.setSsFlag(String.valueOf(pmContMscTechDOItem.get().getSsFlag()));
} }
pmCmdContDO.setHeatTreatMode(pmContMscTechDOItem.get().getHeatTreatMode()); pmCmdContDO.setHeatTreatMode(pmContMscTechDOItem.get().getHeatTreatMode());

@ -141,4 +141,6 @@ public interface SubMapper extends BaseMapper<Map> {
BigDecimal getMaxPmCmdContId(); BigDecimal getMaxPmCmdContId();
void insertPmCmdCont(PmCmdContDO pmCmdContDO); void insertPmCmdCont(PmCmdContDO pmCmdContDO);
String GetMaxSeq(String pono);
} }

@ -119,4 +119,6 @@ public interface SubService {
void batchInsertPmCmdSmallPlt(List<PmCmdSmallPltDO> pmCmdSmallPltDOList); void batchInsertPmCmdSmallPlt(List<PmCmdSmallPltDO> pmCmdSmallPltDOList);
void batchInsertPmCmdCont(List<PmCmdContDO> pmCmdContDOList); void batchInsertPmCmdCont(List<PmCmdContDO> pmCmdContDOList);
String GetMaxSeq(String pono);
} }

@ -355,5 +355,10 @@ public class SubServiceImpl implements SubService {
} }
} }
@Override
public String GetMaxSeq(String pono) {
return subMapper.GetMaxSeq(pono);
}
} }

@ -277,6 +277,12 @@
</select> </select>
<select id="GetMaxSeq" resultType="java.lang.String" parameterType="java.lang.String">
SELECT NVL(MAX(VIRTUAL_SLAB_NO), 0)
FROM PM_PD_SLAB
WHERE PONO=#{pono}
</select>
<insert id="InsertPmSubOrdDO" parameterType="net.xdclass.shopmanager.model.PmSubOrdDO" keyProperty="id"> <insert id="InsertPmSubOrdDO" parameterType="net.xdclass.shopmanager.model.PmSubOrdDO" keyProperty="id">
INSERT INTO PM_SUB_ORD (ORDER_NO, VIRTUAL_SLAB_NO, SG_SIGN, ST_NO, ORDER_THICK, ORDER_WIDTH, INSERT INTO PM_SUB_ORD (ORDER_NO, VIRTUAL_SLAB_NO, SG_SIGN, ST_NO, ORDER_THICK, ORDER_WIDTH,
LEN_AIM, POS_X, POS_Y, DELIVY_DATE, AXIS_ORD, LACK_NUM, OVER_NUM, LEN_AIM, POS_X, POS_Y, DELIVY_DATE, AXIS_ORD, LACK_NUM, OVER_NUM,

Loading…
Cancel
Save