diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesBtoJobServiceImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesBtoJobServiceImpl.java index e814a7f..e0ef486 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesBtoJobServiceImpl.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesBtoJobServiceImpl.java @@ -44,21 +44,13 @@ public class MesBtoJobServiceImpl implements IMesBtoJobService { log.info("客户的信息点{}不存在",prodGroup.getCustInfoPoint()); continue; } - //3. 根据零件生产组中reuseSoftInfo 获取排序信息 - // Integer isReuseSortInfo = prodGroup.getIsReuseSortInfo(); + List details = mesPartProdGroupService.findDetailByCode(prodGroup.getPartProdGroupCode(), organizeCode); List custPartNoList = details.stream().map(MesPartProdGroupDetail::getCustPartNo).collect(Collectors.toList()); List sortInfoList = mesCustSoftInfoService.queryCustSortInfoList(prodGroup.getCustCode(), prodGroup.getCustOrganizeCode(), prodGroup.getCustInfoPoint(), organizeCode, custPartNoList); - //4. 如果没有订单需要更新窗口时间 TM_BAS_PRODUCT_GROUP_WINDOW_TIME - //5. 根据零件生产组中是否有assyCode(总成类型),去校验 客户排序信息中,是否包含了零件发运组的零件 - // custsortinfolist.where(c=> partproductgroupinfo.AssCode.contains(c.AssCode)) == 0 直接返回 - -// List countInfo = sortInfoList.stream().filter(item -> item.getAssyCode().equals(prodGroup.getPartType())).collect(Collectors.toList()); -// if (countInfo.isEmpty()){ -// continue; -// } if (sortInfoList.isEmpty()){ + log.info("当前零件生产组:{}没有排序信息",prodGroup.getPartProdGroupName()); continue; } //6. 根据零件生产组的RoundnessType 去做策略,现在只做 窗口时间 策略; 入参 diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/roundness/MesTimeRoundnessService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/roundness/MesTimeRoundnessService.java index 7e6fdbf..631ef23 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/roundness/MesTimeRoundnessService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/roundness/MesTimeRoundnessService.java @@ -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 sortInfoList, List 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 resultList = syncFuncService.syncSerialNo(genSerialNoModel, "JOB", detail.getOrganizeCode(), 1).getResultList(); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel, "edi", detail.getOrganizeCode(), 1).getResultList(); // GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO); // List 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 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 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 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 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);