From 76628d01516c441801e86a69767f08bb21c85205 Mon Sep 17 00:00:00 2001 From: administrator Date: Fri, 14 Jun 2024 16:13:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0BTO=E7=BC=BA=E5=A4=B1?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serviceimpl/base/MesBtoJobServiceImpl.java | 2 +- .../base/roundness/MesTimeRoundnessService.java | 243 +++++++++++++-------- .../webservice/WebServiceServerIns.java | 3 +- 3 files changed, 156 insertions(+), 92 deletions(-) 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 3345d33..c88c451 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 @@ -38,7 +38,7 @@ public class MesBtoJobServiceImpl implements IMesBtoJobService { //1. 根据 organizeCode 和 groupCodeList 查询零件生产组 List mesPartProdGroups = mesPartProdGroupService.findMesPartProdGroups(organizeCode, groupCodeList); for (MesPartProdGroup prodGroup : mesPartProdGroups) { - //2. 根据生产组的infoPointId 获取 过点信息TM_BAS_INFO_POINT + //2. 根据生产组的infoPointCode 获取 过点信息MES_CUSTOMER_MESSAGE_POINT MesCustomerMessagePoint messagePoint = mesCustomerMessagePointService.getPointByCode(prodGroup.getCustInfoPoint(),organizeCode); if (messagePoint == null){ log.info("客户的信息点{}不存在",prodGroup.getCustInfoPoint()); 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 eafe60f..615928c 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 @@ -2,16 +2,17 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.roundness; import cn.estsh.i3plus.ext.mes.api.base.strategy.IRoundnessStrategy; import cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base.MesCustSoftInfoServiceImpl; +import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant; +import cn.estsh.i3plus.mes.api.iservice.busi.ISyncFuncService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesCustSortInfo; -import cn.estsh.i3plus.pojo.mes.repository.IMesProdGroupPartBtoCountRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesPartSapRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesProductVersionRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderRepository; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import org.slf4j.Logger; @@ -20,7 +21,9 @@ import org.springframework.beans.factory.annotation.Autowired; 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; @@ -52,98 +55,158 @@ public class MesTimeRoundnessService implements IRoundnessStrategy { @Autowired private MesCustSoftInfoServiceImpl custSoftInfoService; + @Autowired + private ISyncFuncService syncFuncService; + + @Autowired + private MesWorkCenterRepository mesWorkCenterRao; + + @Autowired + private MesShiftRepository mesShiftRao; + @Override public void execute(MesPartProdGroup partProdGroup, List sortInfoList, List details) { DateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); Long createSeq = Long.parseLong(dateFormat.format(new Date())); - //遍历零件生产组零件,过滤出 - for (MesPartProdGroupDetail detail : details) { - //根据detail.id 获取 - MesProdGroupPartBtoCount btoCountInfo = getByGroupPartId(detail.getId(), detail.getOrganizeCode()); - //历史累计差异 - double btoCount = btoCountInfo.getCurrentQty(); - //获取圆整数量 - double roundQty = detail.getRoundQty(); - List sortInfos = sortInfoList.stream().filter(info -> info.getCustPartNo().equals(detail.getCustPartNo())).collect(Collectors.toList()); - if (sortInfos.isEmpty()) { - continue; - } - //本次排序需要的数量 - Double qty = sortInfoList.stream().map(MesCustSortInfo::getQty).reduce(Double::sum).get() * detail.getProductPartQty(); - qty -= btoCount; - //倍数 - int multiple; - //如果上次累计的差异值大于当前排序信息累计值,则不需要生成加工单 - if (qty <= 0) { - multiple = 0; - } else { - //看看多少倍,乘以圆整数量就是需求数,QTY就是多累积数 - multiple = (int) Math.round(Math.ceil(Math.ceil(qty / roundQty))); - } + try { + //遍历零件生产组零件,过滤出 + for (MesPartProdGroupDetail detail : details) { + //根据detail.id 获取 + MesProdGroupPartBtoCount btoCountInfo = getByGroupPartId(detail.getId(), detail.getOrganizeCode()); + //历史累计差异 + double btoCount = btoCountInfo.getCurrentQty(); + //获取圆整数量 + double roundQty = detail.getRoundQty(); + List sortInfos = sortInfoList.stream().filter(info -> info.getCustPartNo().equals(detail.getCustPartNo())).collect(Collectors.toList()); + if (sortInfos.isEmpty()) { + continue; + } + //本次排序需要的数量 + double qty = sortInfos.stream().map(MesCustSortInfo::getQty).reduce(Double::sum).get() * detail.getProductPartQty(); + qty -= btoCount; + //倍数 + int multiple; + //如果上次累计的差异值大于当前排序信息累计值,则不需要生成加工单 + if (qty <= 0) { + multiple = 0; + } else { + //看看多少倍,乘以圆整数量就是需求数,QTY就是多累积数 + multiple = (int) Math.round(Math.ceil(Math.ceil(qty / roundQty))); + } + + //获取生产零件信息 + MesPartSap mesPartSap = getMesPart(detail.getProductPartNo(), detail.getOrganizeCode()); + if (mesPartSap.getId() == null) { + log.info("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo()); + throw ImppExceptionBuilder.newInstance().setErrorDetail("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo()).build(); + } + MesWorkOrder mesWorkOrder = new MesWorkOrder(); + //工单号生成规则 【工厂号+yyyyMMdd+5位流水】 + GenSerialNoModel genSerialNoModel = new GenSerialNoModel(MesCommonConstant.MES_WORK_ORDER_NO); + List resultList = syncFuncService.syncSerialNo(genSerialNoModel,"JOB", detail.getOrganizeCode(), 1).getResultList(); + mesWorkOrder.setWorkOrderNo(resultList.get(0)); + mesWorkOrder.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.BTO.getValue()); + mesWorkOrder.setWorkOrderSeq(createSeq.toString()); + mesWorkOrder.setProduceSeq(createSeq); + mesWorkOrder.setCustPartNo(sortInfos.get(0).getCustPartNo()); + //标识 -空 + //状态 --- 根据零件发运组看是自动发布 + if (partProdGroup.getIsAutoRelease() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()){ + mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); + }{ + mesWorkOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.CREATE.getValue()); + } + //车型大类-空 + mesWorkOrder.setOrganizeCode(detail.getOrganizeCode()); + //erpWorkCenter 需要根据产线查询 组织模型 + DdlPackBean workCenterPackBean = DdlPackBean.getDdlPackBean(detail.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(detail.getWorkCenterCode(),"workCenterCode",workCenterPackBean); + List centerList = mesWorkCenterRao.findByHqlWhere(workCenterPackBean); + if (!centerList.isEmpty()){ + mesWorkOrder.setErpWorkCenter(centerList.get(0).getErpWorkCenter()); + } + //产线 + mesWorkOrder.setWorkCenterCode(detail.getWorkCenterCode()); + //工位 + mesWorkOrder.setWorkCellCode(detail.getWorkCellCode()); + //生产日期,计划时间 + List sortInfosSorted = sortInfos.stream().sorted(Comparator.comparing(MesCustSortInfo::getMatchTime)).collect(Collectors.toList()); + + // 10. 根据工厂,产线,planStartTime 获取班次名称 + String matchTime = sortInfosSorted.get(0).getMatchTime(); + // 计划开始时间 工单创建时间(获取到的时间) + mesWorkOrder.setPlanStartTime(matchTime); + //计划结束时间 工单创建时间(获取到的时间) + mesWorkOrder.setPlanEndTime(matchTime); + // 生产时间 工单获取计划开始时间日期 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Date parse = format.parse(matchTime); + String productTime = format.format(parse); + mesWorkOrder.setProductTime(productTime); + // 11. 是否将生成日期减一天 + // 班次 根据产线+计划时间匹配班次 + DdlPackBean shiftPackBean = DdlPackBean.getDdlPackBean(detail.getOrganizeCode()); + 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); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + int hours = calendar.get(Calendar.HOUR_OF_DAY); + int minutes = calendar.get(Calendar.MINUTE); + int shiftTime = Integer.parseInt(hours+""+minutes); + for (MesShift shift : shiftList) { + 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()); + break; + } + } + // 12.零件相关 + mesWorkOrder.setPartNo(mesPartSap.getPartNo()); + mesWorkOrder.setPartName(mesPartSap.getPartName()); + // 13.生产版本 organizeCode + partNo + MesProductVersion prodVersion = getProdVersion(detail.getOrganizeCode(), mesPartSap.getPartNo()); + if (prodVersion == null) { + log.info("请配置工厂:{},partNo:{}的生产版本", detail.organizeCode, mesPartSap.getPartNo()); + } + String productVersion = prodVersion.getProductVersion(); + mesWorkOrder.setProductVersion(productVersion); + // 14.bomCode partNo + 生产版本+ organizeCode + // 数量 + double realQty = roundQty * multiple; + 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()); + // } + mesWorkOrder.setPartProdGroupCode(partProdGroup.getPartProdGroupCode()); + + //bto + btoCountInfo.setGroupPartId(detail.getId()); + btoCountInfo.setOrganizeCode(detail.getOrganizeCode()); + btoCountInfo.setRoundnessQty(roundQty); + btoCountInfo.setCurrentQty(realQty-qty); + ConvertBean.saveOrUpdate(btoCountInfo,"edi"); + btoCountRao.save(btoCountInfo); + + // 保存工单 + ConvertBean.saveOrUpdate(mesWorkOrder, "edi"); + mesWorkOrderRao.insert(mesWorkOrder); + //更新 custSortInfo 状态已解析 + for (MesCustSortInfo sortInfo : sortInfos) { + sortInfo.setServiceFlag(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + custSoftInfoService.updateCustSortInfo(sortInfo); + } - //获取生产零件信息 - MesPartSap mesPartSap = getMesPart(detail.getProductPartNo(), detail.getOrganizeCode()); - if (mesPartSap.getId() == null) { - log.info("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo()); - throw ImppExceptionBuilder.newInstance().setErrorDetail("零件生成组零件:{}找不到对应的零件信息", detail.getProductPartNo()).build(); - } - MesWorkOrder mesWorkOrder = new MesWorkOrder(); - mesWorkOrder.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.BTO.getValue()); - mesWorkOrder.setWorkOrderSeq(createSeq.toString()); - mesWorkOrder.setProduceSeq(createSeq); - mesWorkOrder.setOrganizeCode(detail.getOrganizeCode()); - //产线 - mesWorkOrder.setWorkCenterCode(detail.getWorkCenterCode()); - //工位 - mesWorkOrder.setWorkCellCode(detail.getWorkCellCode()); - //生产日期,计划时间 - List sortInfosSorted = sortInfos.stream().sorted(Comparator.comparing(MesCustSortInfo::getMatchTime)).collect(Collectors.toList()); -// workorderinfo.ProductDate = custsortinfopartlist.Min(d => d.MatchTime.GetValueOrDefault()).ToString("yyyy-MM-dd"); -// workorderinfo.PlanStartTime = custsortinfopartlist.Min(d => d.MatchTime.GetValueOrDefault()); -// workorderinfo.PlanEndTime = custsortinfopartlist.Max(d => d.MatchTime.GetValueOrDefault()); - // 10. 根据工厂,产线,planStartTime 获取班次名称 - String matchTime = sortInfosSorted.get(0).getMatchTime(); - // 11. 是否将生成日期减一天 - // 12.零件相关 - mesWorkOrder.setPartNo(mesPartSap.getPartNo()); - mesWorkOrder.setPartName(mesPartSap.getPartName()); - // 13.生产版本 organizeCode + partNo - MesProductVersion prodVersion = getProdVersion(detail.getOrganizeCode(), mesPartSap.getPartNo()); - if (prodVersion == null) { - log.info("请配置工厂:{},partNo:{}的生产版本", detail.organizeCode, mesPartSap.getPartNo()); } - String productVersion = prodVersion.getProductVersion(); - mesWorkOrder.setProductVersion(productVersion); - // 14.bomCode partNo + 生产版本+ organizeCode - // 数量 - double realQty = roundQty * multiple; - 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()); -// } - mesWorkOrder.setPartProdGroupCode(partProdGroup.getPartProdGroupCode()); - - //bto - btoCountInfo.setGroupPartId(detail.getId()); - btoCountInfo.setOrganizeCode(detail.getOrganizeCode()); - btoCountInfo.setRoundnessQty(roundQty); - btoCountInfo.setCurrentQty(realQty-qty); - ConvertBean.saveOrUpdate(btoCountInfo,"edi"); - btoCountRao.save(btoCountInfo); - - // 保存工单 - ConvertBean.saveOrUpdate(mesWorkOrder, "edi"); - mesWorkOrderRao.insert(mesWorkOrder); - //更新 custSortInfo 状态已解析 - for (MesCustSortInfo sortInfo : sortInfos) { - sortInfo.setServiceFlag(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); - custSoftInfoService.updateCustSortInfo(sortInfo); - } - + } catch (ParseException e) { + throw new RuntimeException(e); } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/webservice/WebServiceServerIns.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/webservice/WebServiceServerIns.java index 74dc7e9..6e150e8 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/webservice/WebServiceServerIns.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/webservice/WebServiceServerIns.java @@ -23,8 +23,9 @@ public class WebServiceServerIns { maximoParamModel.setAssetNum(meterInfo.getASSETNUM()); maximoParamModel.setBaseMeasureUnitId(meterInfo.getBASEMEASUREUNITID()); maximoParamModel.setMeterName(meterInfo.getMETERNAME()); + maximoParamModel.setSiteId(meterInfo.getSITEID()); MaximoServiceImpl bean = (MaximoServiceImpl) SpringContextsUtil.getBean("maximoServiceImpl"); - return bean.doAssetMainData(maximoParamModel); + return bean.doMeterMainData(maximoParamModel); } }