|
|
|
@ -23,10 +23,7 @@ import org.springframework.stereotype.Service;
|
|
|
|
|
import java.text.DateFormat;
|
|
|
|
|
import java.text.ParseException;
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.Calendar;
|
|
|
|
|
import java.util.Comparator;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -64,11 +61,21 @@ public class MesTimeRoundnessService implements IRoundnessStrategy {
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesShiftRepository mesShiftRao;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private MesPartProdGroupWindowTimeRepository windowTimeRao;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void execute(MesPartProdGroup partProdGroup, List<MesCustSortInfo> sortInfoList, List<MesPartProdGroupDetail> details) {
|
|
|
|
|
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
|
|
|
Long createSeq = Long.parseLong(dateFormat.format(new Date()));
|
|
|
|
|
try {
|
|
|
|
|
try { //4. 如果没有订单需要更新窗口时间 TM_BAS_PRODUCT_GROUP_WINDOW_TIME
|
|
|
|
|
MesPartProdGroupWindowTime time = getWindowTimeByProductGroup(partProdGroup.id, partProdGroup.getOrganizeCode());
|
|
|
|
|
if (Objects.isNull(time)) {
|
|
|
|
|
log.info("当前零件生产组:{}没有维护时间窗口", partProdGroup.getPartProdGroupName());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
|
|
|
|
|
Long createSeq = Long.parseLong(dateFormat.format(new Date()));
|
|
|
|
|
|
|
|
|
|
//遍历零件生产组零件,过滤出
|
|
|
|
|
for (MesPartProdGroupDetail detail : details) {
|
|
|
|
|
//根据detail.id 获取
|
|
|
|
@ -97,15 +104,15 @@ public class MesTimeRoundnessService implements IRoundnessStrategy {
|
|
|
|
|
//获取生产零件信息
|
|
|
|
|
MesPartSap mesPartSap = getMesPart(detail.getProductPartNo(), detail.getOrganizeCode());
|
|
|
|
|
if (mesPartSap.getId() == null) {
|
|
|
|
|
log.info("零件生生产组:{},生产零件:{}找不到对应的零件信息",partProdGroup.getPartProdGroupName(), detail.getProductPartNo());
|
|
|
|
|
log.info("零件生生产组:{},生产零件:{}找不到对应的零件信息", partProdGroup.getPartProdGroupName(), detail.getProductPartNo());
|
|
|
|
|
continue;
|
|
|
|
|
// throw ImppExceptionBuilder.newInstance().setErrorDetail("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo()).build();
|
|
|
|
|
// throw ImppExceptionBuilder.newInstance().setErrorDetail("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo()).build();
|
|
|
|
|
}
|
|
|
|
|
MesWorkOrder mesWorkOrder = new MesWorkOrder();
|
|
|
|
|
//工单号生成规则 【工厂号+yyyyMMdd+5位流水】
|
|
|
|
|
GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_CENTER_ORDER_NO);
|
|
|
|
|
genSerialNoModel.setPartNo(detail.getWorkCenterCode());
|
|
|
|
|
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, "JOB", detail.getOrganizeCode(), 1).getResultList();
|
|
|
|
|
List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel, "edi", detail.getOrganizeCode(), 1).getResultList();
|
|
|
|
|
// GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO);
|
|
|
|
|
// List<String> resultList = syncFuncService.syncSerialNo(genSerialNoModel,"JOB", detail.getOrganizeCode(), 1).getResultList();
|
|
|
|
|
mesWorkOrder.setWorkOrderNo(resultList.get(0));
|
|
|
|
@ -115,18 +122,18 @@ public class MesTimeRoundnessService implements IRoundnessStrategy {
|
|
|
|
|
mesWorkOrder.setCustPartNo(sortInfos.get(0).getCustPartNo());
|
|
|
|
|
//标识 -空
|
|
|
|
|
//状态 --- 根据零件发运组看是自动发布
|
|
|
|
|
if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()){
|
|
|
|
|
if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
|
|
|
|
|
mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
}else {
|
|
|
|
|
} else {
|
|
|
|
|
mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
|
|
|
|
|
}
|
|
|
|
|
//车型大类-空
|
|
|
|
|
mesWorkOrder.setOrganizeCode(detail.getOrganizeCode());
|
|
|
|
|
//erpWorkCenter 需要根据产线查询 组织模型
|
|
|
|
|
DdlPackBean workCenterPackBean = DdlPackBean.getDdlPackBean(detail.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(detail.getWorkCenterCode(),"workCenterCode",workCenterPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(detail.getWorkCenterCode(), "workCenterCode", workCenterPackBean);
|
|
|
|
|
List<MesWorkCenter> centerList = mesWorkCenterRao.findByHqlWhere(workCenterPackBean);
|
|
|
|
|
if (!centerList.isEmpty()){
|
|
|
|
|
if (!centerList.isEmpty()) {
|
|
|
|
|
mesWorkOrder.setErpWorkCenter(centerList.get(0).getErpWorkCenter());
|
|
|
|
|
}
|
|
|
|
|
//产线
|
|
|
|
@ -150,7 +157,7 @@ public class MesTimeRoundnessService implements IRoundnessStrategy {
|
|
|
|
|
// 11. 是否将生成日期减一天
|
|
|
|
|
// 班次 根据产线+计划时间匹配班次
|
|
|
|
|
DdlPackBean shiftPackBean = DdlPackBean.getDdlPackBean(detail.getOrganizeCode());
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(detail.getWorkCenterCode(),"workCenterCode",shiftPackBean);
|
|
|
|
|
DdlPreparedPack.getStringEqualPack(detail.getWorkCenterCode(), "workCenterCode", shiftPackBean);
|
|
|
|
|
List<MesShift> shiftList = mesShiftRao.findByHqlWhere(shiftPackBean);
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
Date date = sdf.parse(matchTime);
|
|
|
|
@ -158,10 +165,10 @@ public class MesTimeRoundnessService implements IRoundnessStrategy {
|
|
|
|
|
calendar.setTime(date);
|
|
|
|
|
int hours = calendar.get(Calendar.HOUR_OF_DAY);
|
|
|
|
|
int minutes = calendar.get(Calendar.MINUTE);
|
|
|
|
|
int shiftTime = Integer.parseInt(hours+""+minutes);
|
|
|
|
|
int shiftTime = Integer.parseInt(hours + "" + minutes);
|
|
|
|
|
for (MesShift shift : shiftList) {
|
|
|
|
|
int startTime = Integer.parseInt(shift.getStartTime() );
|
|
|
|
|
int endTime = Integer.parseInt(shift.getEndTime() );
|
|
|
|
|
int startTime = Integer.parseInt(shift.getStartTime());
|
|
|
|
|
int endTime = Integer.parseInt(shift.getEndTime());
|
|
|
|
|
if (shiftTime >= startTime && shiftTime <= endTime) {
|
|
|
|
|
mesWorkOrder.setShiftName(shift.getShiftName());
|
|
|
|
|
mesWorkOrder.setShiftCode(shift.getShiftCode());
|
|
|
|
@ -184,19 +191,19 @@ public class MesTimeRoundnessService implements IRoundnessStrategy {
|
|
|
|
|
mesWorkOrder.setQty(realQty);
|
|
|
|
|
mesWorkOrder.setUnCompleteQty(realQty);
|
|
|
|
|
mesWorkOrder.setUnit(mesPartSap.getUnit());
|
|
|
|
|
// if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
|
|
|
|
|
// mesWorkOrder.setStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
// } else {
|
|
|
|
|
// mesWorkOrder.setStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
|
|
|
|
|
// }
|
|
|
|
|
if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) {
|
|
|
|
|
mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue());
|
|
|
|
|
} else {
|
|
|
|
|
mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue());
|
|
|
|
|
}
|
|
|
|
|
mesWorkOrder.setPartProdGroupCode(partProdGroup.getPartProdGroupCode());
|
|
|
|
|
|
|
|
|
|
//bto
|
|
|
|
|
btoCountInfo.setGroupPartId(detail.getId());
|
|
|
|
|
btoCountInfo.setOrganizeCode(detail.getOrganizeCode());
|
|
|
|
|
btoCountInfo.setRoundnessQty(roundQty);
|
|
|
|
|
btoCountInfo.setCurrentQty(realQty-qty);
|
|
|
|
|
ConvertBean.saveOrUpdate(btoCountInfo,"edi");
|
|
|
|
|
btoCountInfo.setCurrentQty(realQty - qty);
|
|
|
|
|
ConvertBean.saveOrUpdate(btoCountInfo, "edi");
|
|
|
|
|
btoCountRao.save(btoCountInfo);
|
|
|
|
|
|
|
|
|
|
// 保存工单
|
|
|
|
@ -209,13 +216,53 @@ public class MesTimeRoundnessService implements IRoundnessStrategy {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
ConvertBean.saveOrUpdate(time, "JOB");
|
|
|
|
|
time.setLastRunTime(TimeTool.getNowTime(true));
|
|
|
|
|
windowTimeRao.update(time);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("创建工单报错:{}", Arrays.toString(e.getStackTrace()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private MesPartProdGroupWindowTime getWindowTimeByProductGroup(Long partProdGroupId, String organizeCode) throws ParseException {
|
|
|
|
|
DdlPackBean windowTimPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(partProdGroupId, "pid", windowTimPackBean);
|
|
|
|
|
List<MesPartProdGroupWindowTime> windowTimeList = windowTimeRao.findByHqlWhere(windowTimPackBean);
|
|
|
|
|
if (windowTimeList.isEmpty()) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
//获取当前时间的HH mm
|
|
|
|
|
Date now = new Date();
|
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
|
calendar.setTime(now);
|
|
|
|
|
String hour = calendar.get(Calendar.HOUR_OF_DAY) + ""; // 获取小时(24小时制)
|
|
|
|
|
String minute = calendar.get(Calendar.MINUTE) + "";
|
|
|
|
|
String nowTime = hour + minute;
|
|
|
|
|
//遍历窗口时间获取最新的窗口时间
|
|
|
|
|
String nowTimeStr = String.format("%04d", Integer.parseInt(nowTime));
|
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
List<MesPartProdGroupWindowTime> sortedTime = windowTimeList.stream().sorted(Comparator.comparing(MesPartProdGroupWindowTime::getWindowTime)).collect(Collectors.toList());
|
|
|
|
|
for (MesPartProdGroupWindowTime time : sortedTime) {
|
|
|
|
|
if (nowTimeStr.compareTo(time.getWindowTime()) < 0) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
calendar.set(Calendar.HOUR, Integer.parseInt(time.getWindowTime().substring(0, 2)));
|
|
|
|
|
calendar.set(Calendar.MINUTE, Integer.parseInt(time.getWindowTime().substring(2, 4)));
|
|
|
|
|
Date dateCreateOrder = calendar.getTime();
|
|
|
|
|
if (Objects.isNull(time.getLastRunTime())){
|
|
|
|
|
return time;
|
|
|
|
|
}
|
|
|
|
|
Date lastRunTime = sdf.parse(time.getLastRunTime());
|
|
|
|
|
if (dateCreateOrder.compareTo(lastRunTime) < 0) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
return time;
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MesProdGroupPartBtoCount getByGroupPartId(Long groupPartId, String organizeCode) {
|
|
|
|
|
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
|
|
|
|
|
DdlPreparedPack.getNumEqualPack(groupPartId, "groupPartId", ddlPackBean);
|
|
|
|
|