diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java index fde6927..40a93ae 100644 --- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesWorkOrderService.java @@ -1,5 +1,8 @@ package cn.estsh.i3plus.ext.mes.api.base; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; +import cn.estsh.i3plus.pojo.mes.bean.MesShift; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import cn.estsh.i3plus.pojo.mes.model.MesWorkOrderModel; import cn.estsh.i3plus.pojo.model.wms.WmsProductModel; @@ -34,4 +37,13 @@ public interface IMesWorkOrderService extends IBaseMesService { @ApiOperation("反向冲销") void doReportWorkReversal(WmsProductModel model); + + List getPreDayReportMesProductionRecord(String organizeCode , List mesShiftList, String workCenterCode); + + List getPreDayReportMesProduceSn(String organizeCode , List mesProductionRecordList ); + + public List insertMesWorkOrder(List mesProduceSns,List mesShiftList,String organizeCode, String userName ); + + void doPcnJobProductReport(List mesProduceSns,List mesShiftList,String organizeCode, String userName, MesWorkOrder mesWorkOrder); + } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/MesWhiteListController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/MesWhiteListController.java index 38e5799..be5167d 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/MesWhiteListController.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/MesWhiteListController.java @@ -1,11 +1,22 @@ package cn.estsh.i3plus.ext.mes.apiservice.controller.busi; import cn.estsh.i3plus.ext.mes.api.base.IMesCcscTaskService; +import cn.estsh.i3plus.ext.mes.api.base.IMesConfigService; import cn.estsh.i3plus.ext.mes.api.base.IMesWorkOrderService; import cn.estsh.i3plus.ext.mes.api.busi.IMaximoService; import cn.estsh.i3plus.ext.mes.pojo.model.MaximoParamModel; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; +import cn.estsh.i3plus.pojo.mes.bean.MesShift; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesShiftRepository; import cn.estsh.impp.framework.base.controller.MesBaseController; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; @@ -14,8 +25,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @RestController @@ -31,6 +44,15 @@ public class MesWhiteListController extends MesBaseController { @Autowired private IMesCcscTaskService mesCcscTaskService; + @Autowired + private IMesWorkOrderService workOrderService; + + @Autowired + private MesProductionRecordRepository productionRecordRao; + @Autowired + private MesShiftRepository mesShiftRepository; + @Autowired + private IMesConfigService configService; @PostMapping(value = "/meter/main-data") @ApiOperation(value = "Maximo仪表主数据", notes = "Maximo仪表主数据") public Map doMeterMainData(@RequestBody MaximoParamModel paramModel) { @@ -73,5 +95,49 @@ public class MesWhiteListController extends MesBaseController { } return ResultBean.success().setSuccess(true); } + @GetMapping("/reportWorkByPreDayJob") + @ApiOperation(value = "job测试") + public ResultBean queryReworkTaskByPager(String organizeCode) { + try { + //遍历系统参数指定的产线获取对应班次,找到早班的开始时间, + String workCenterCodes = configService.getCfgValue(organizeCode, "MES_PCN_WORK_CENTER_NO"); + List workCenterCodeList = Arrays.asList(workCenterCodes.split(",")); + String userName = "REPORT_PRE_DAY_JOB"; + for (String workCenterCode : workCenterCodeList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", packBean); + List mesShiftList = mesShiftRepository.findByHqlWhere(packBean); + //1.获取生产加工记录production_record表中,report_status为待汇报状态的工单 + List mesProductionRecordList = workOrderService.getPreDayReportMesProductionRecord(organizeCode,mesShiftList,workCenterCode); + if(CollectionUtils.isEmpty(mesProductionRecordList)){ + continue; + } + //2. 查询 mesProduceSn + List unReportMesProduceSn = workOrderService.getPreDayReportMesProduceSn(organizeCode,mesProductionRecordList); + if(CollectionUtils.isEmpty(unReportMesProduceSn)){ + continue; + } + List mesWorkOrders = workOrderService.insertMesWorkOrder(unReportMesProduceSn, mesShiftList,organizeCode, userName); + if(CollectionUtils.isEmpty(mesWorkOrders)){ + continue; + } + //根据产线+物料产生的工单报工 + for (MesWorkOrder mesWorkOrder : mesWorkOrders) { + List mesProduceSnList = unReportMesProduceSn.stream().filter(w -> w.getPartNo().equalsIgnoreCase(mesWorkOrder.getPartNo())).collect(Collectors.toList()); + workOrderService.doPcnJobProductReport(mesProduceSnList,mesShiftList,organizeCode,userName, mesWorkOrder); + } + for (MesProductionRecord mesProductionRecord : mesProductionRecordList) { + mesProductionRecord.setReportStatus(20); + ConvertBean.serviceModelUpdate(mesProductionRecord, userName); + } + productionRecordRao.saveAll(mesProductionRecordList); + } + return ResultBean.success("查询成功").setResultList(null); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesLoadingListService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesLoadingListService.java index 4913a7f..a892e65 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesLoadingListService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesLoadingListService.java @@ -8,6 +8,7 @@ import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; 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.base.util.StringUtil; import cn.estsh.i3plus.pojo.mes.bean.MesPartShippingGroup; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesLoadingList; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesLoadingListDetail; @@ -135,6 +136,7 @@ public class MesLoadingListService extends BaseMesService implem MesLoadingListDetail detail = new MesLoadingListDetail(); k.setOrderCode(finalBean.getOrderCode()); + k.setLoadingListId(StringUtil.isEmpty(finalBean.getId()) ? 0 : finalBean.getId()); BeanUtils.copyProperties(k, detail, "id"); detail.setStatus(MesExtEnumUtil.LOADING_ORDER_DETAIL_SHIPPING_STATUS.PUBLISHED.getValue()); diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java index e0b09f6..781c681 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java @@ -18,6 +18,7 @@ import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; import cn.estsh.i3plus.pojo.mes.model.MesWorkOrderModel; import cn.estsh.i3plus.pojo.mes.repository.*; +import cn.estsh.i3plus.pojo.mes.repository.shipping.MesWorkOrderToWmsRepository; import cn.estsh.i3plus.pojo.mes.util.DateUtilExt; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.i3plus.pojo.model.wms.WmsProductModel; @@ -32,6 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -83,6 +85,24 @@ public class MesWorkOrderService extends BaseMesService implements @Autowired private MesPartProdGroupRepository mesPartProdGroupRDao; + @Autowired + private MesWorkOrderRepository workOrderRepository; + + @Autowired + private MesProductOffLineRepository mesProductOffLineRDao; + + @Autowired + private MesProduceSnRepository mesProduceSnRao; + @Autowired + private MesProductionRecordRepository productionRecordRao; + @Autowired + private MesWorkOrderLogRepository mesWorkOrderLogRepository; + @Autowired + private MesWorkOrderToWmsRepository mesWorkOrderToWmsRDao; + @Autowired + private MesBomRepository mesBomRDao; + @Autowired + private MesPartRepository mesPartRDao; @Override public MesWorkOrder insert(MesWorkOrder bean) { //获取相同类型 相同标识 生产序号最大值的 @@ -1176,5 +1196,307 @@ public class MesWorkOrderService extends BaseMesService implements ConvertBean.serviceModelInitialize(move, AuthUtil.getSessionUser().getUserName()); return move; } + @Override + public List getPreDayReportMesProductionRecord(String organizeCode,List mesShiftList, String workCenterCode ) { + + //1.获取生产加工记录production_record表中,report_status为待汇报状态的工单 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode,"workCenterCode",ddlPackBean); + DdlPreparedPack.getNumEqualPack( MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_50.getValue(),"reportStatus",ddlPackBean); + //获取前一天的早班到当天早班的区间的所有加工记录,统计个数 + DdlPreparedPack.timeBuilder( + new SimpleDateFormat("yyyy-MM-dd").format(TimeTool.getDateBefore(new Date(),1))+" 08:00:00", + TimeTool.getToday()+" 08:00:00", + "completeDateTime", ddlPackBean, true); + + return productionRecordRao.findByHqlWhere(ddlPackBean); + } + @Override + public List getPreDayReportMesProduceSn(String organizeCode,List mesProductionRecordList ) { + DdlPackBean snPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(mesProductionRecordList.stream().map(MesProductionRecord::getProductSn).collect(Collectors.toList()), + "productSn",snPackBean); + return mesProduceSnRao.findByHqlWhere(snPackBean); + } + @Override + public List insertMesWorkOrder(List mesProduceSns,List mesShiftList, String organizeCode, String userName) { + List mesWorkOrderList=new ArrayList<>(); + Map> snListMap = mesProduceSns.stream().collect(Collectors.groupingBy(sn -> sn.getWorkCenterCode() +"="+ sn.getPartNo())); + for (Map.Entry> stringListEntry : snListMap.entrySet()) { + List value = stringListEntry.getValue(); + MesProduceSn mesProduceSn = value.get(0); + String[] split = stringListEntry.getKey().split("="); + String workCenterCode = split[0]; + String partNo = split[1]; + + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean); + MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean); + if (Objects.isNull(mesWorkCenter)) { + MesException.throwMesBusiException("产线【%s】不存在",workCenterCode); + } + MesWorkOrder item=new MesWorkOrder(); + item.setOrganizeCode(organizeCode); + item.setWorkCenterCode(workCenterCode); + item.setPartNo(partNo); + item.setWorkOrderType(MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()); + item.setOrderFlag(MesExtEnumUtil.ORDER_TYPE_IDENTIFICATION.N.getValue()); + List collect = mesShiftList.stream().filter(s -> s.getShiftCode().equalsIgnoreCase("1")).collect(Collectors.toList()); + MesShift mesShift= collect.get(0); + item.setShiftCode(mesShift.getShiftCode()); + item.setShiftCode(mesShift.getShiftName()); + String today = TimeTool.getToday(); + item.setPlanStartTime(today+" "+mesShift.getStartTime()+":00"); + item.setPlanEndTime(today+" "+mesShift.getEndTime()+":00"); + + //生成工单号 + List orderList=new ArrayList<>(); + GenSerialNoModel genSerialNoModel = new GenSerialNoModel("MES_WORK_CENTER_ORDER_NO"); + genSerialNoModel.setPartNo(workCenterCode); +// orderList = syncFuncService.syncSerialNo(genSerialNoModel,userName, organizeCode, 1).getResultList(); + + String orderNo = workCenterCode+TimeTool.getNowTime(true); + DdlPackBean orderPackBean = DdlPackBean.getDdlPackBean(item.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(orderNo, "workOrderNo", orderPackBean); + if (mesWorkOrderRDao.isExitByHql(orderPackBean)) { + MesException.throwMesBusiException("单号流水码生成重复"); + } + item.setWorkOrderNo(orderNo); + item.setPartName(mesProduceSn.getPartName()); + //生产时间新增取当天 + item.setProduceTime(TimeTool.getToday()); + item.setUnCompleteQty(0d); + item.setQty(value.stream().mapToDouble(MesProduceSn::getQty).sum()); + //校验标识 + //若工单类型为排序 + List saveMesWorkOrderToWms = new ArrayList<>(); + if (item.getWorkOrderType() == MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue()) { + //校验产线类型和工单类型是否匹配 + if (!Objects.equals(mesWorkCenter.getCenterType(), MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue())) { + MesException.throwMesBusiException("产线【%s】类型为【%s】,请选择非排序产线", mesWorkCenter.getWorkCenterCode(), + MesExtEnumUtil.WORK_CENTER_TYPE.valueOfDescription(mesWorkCenter.getCenterType())); + } + + //校验物料生产版本是否存在 + MesProductVersion mesProductVersion = checkMesProductVersion(item); + item.setProductVersion(mesProductVersion.getProductVersion()); + //获取bom信息 + List bomList = findMesBomByPartNoAndBomVersion(item.getPartNo(), item.getOrganizeCode(), mesProductVersion.getAlternativePartList()); + item.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.RELEASE.getValue()); + //发送工单信息给WMS + saveMesWorkOrderToWms.addAll(saveMesWorkOrderToWms(item, bomList)); + } + + item.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + ConvertBean.serviceModelInitialize(item, userName); + MesWorkOrder mesWorkOrder = workOrderRepository.insert(item); + //保存发送WMS数据 + if (CollectionUtils.isNotEmpty(saveMesWorkOrderToWms)) { + mesWorkOrderToWmsRDao.saveAll(saveMesWorkOrderToWms); + } + saveMesWorkOrderLog(mesWorkOrder); + mesWorkOrderList.add(mesWorkOrder); + } + + return mesWorkOrderList; + } + + + public List saveMesWorkOrderToWms(MesWorkOrder mesWorkOrder, List mesBomList) { + List mesWorkOrderToWmsList = new ArrayList<>(); + MesWorkOrderToWms mesWorkOrderToWms = null; + for (MesBom mesBom : mesBomList) { + mesWorkOrderToWms = new MesWorkOrderToWms(); + BeanUtils.copyProperties(mesWorkOrder, mesWorkOrderToWms, "id"); + mesWorkOrderToWms.setUnit(mesBom.getUnit()); + mesWorkOrderToWms.setItemPartNo(mesBom.getItemPartNo()); + mesWorkOrderToWms.setItemPartName(mesBom.getItemPartName()); + mesWorkOrderToWms.setItemUnit(mesBom.getItemUnit()); + mesWorkOrderToWms.setItemQty(MathOperation.mul(mesWorkOrder.getQty(), mesBom.getItemQty())); + ConvertBean.serviceModelInitialize(mesWorkOrderToWms, mesWorkOrderToWms.getCreateUser()); + mesWorkOrderToWmsList.add(mesWorkOrderToWms); + } + return mesWorkOrderToWmsList; + } + + public void doPcnJobProductReport(List mesProduceSns,List mesShiftList,String organizeCode, String userName ,MesWorkOrder mesWorkOrderDb) { + + //查询物料信息 + DdlPackBean ddlPackBeanPart = DdlPackBean.getDdlPackBean(mesWorkOrderDb.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesWorkOrderDb.getPartNo(), "partNo", ddlPackBeanPart); + MesPart mesPart = mesPartRDao.getByProperty(ddlPackBeanPart); + if (null == mesPart) { + MesException.throwMesBusiException("物料【%s】信息不存在", mesWorkOrderDb.getPartNo()); + } + + //查询产线信息 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrderDb.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesWorkOrderDb.getWorkCenterCode(), "workCenterCode", ddlPackBean); + MesWorkCenter mesWorkCenter = mesWorkCenterRDao.getByProperty(ddlPackBean); + if (Objects.isNull(mesWorkCenter)) { + MesException.throwMesBusiException("产线【%s】不存在", mesWorkOrderDb.getWorkCenterCode()); + } + //获取生产版本 + MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb); + //物料+生产版本获取bom信息 + List mesBoms = findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); + //报工类型 + if (MesExtEnumUtil.REPORT_TYPE.REPORT.getValue() == mesWorkOrderDb.getReportType()) { + mesWorkOrderDb.setReportedQty(MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getReportedQty())); + //更新工单状态 + double unCompleteQty = MathOperation.sub(mesWorkOrderDb.getQty(), mesWorkOrderDb.getReportedQty()); + mesWorkOrderDb.setUnCompleteQty(unCompleteQty > 0 ? unCompleteQty : 0); + if (mesWorkOrderDb.getReportedQty() > mesWorkOrderDb.getQty()) { + MesException.throwMesBusiException("工单报工数量【%s】大于工单数量【%s】,不允许报工", + mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty()); + } else if (Objects.equals(mesWorkOrderDb.getReportedQty(), mesWorkOrderDb.getQty())) { + mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); + } else { + mesWorkOrderDb.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()); + } + } else { + //报工调整数量加- + mesWorkOrderDb.setAdjustQty((MathOperation.add(mesWorkOrderDb.getNum(), mesWorkOrderDb.getAdjustQty()))); + //冲销数量大于工单完成数量报错 + if (mesWorkOrderDb.getAdjustQty() > mesWorkOrderDb.getReportedQty()) { + MesException.throwMesBusiException("冲销数量【%s】大于工单完成数量【%s】,不允许冲销", + mesWorkOrderDb.getAdjustQty(), mesWorkOrderDb.getReportedQty()); + } + } + //更新工单 + updateMesWorkOrder(mesWorkOrderDb, userName ); + + //生成条码 todo 有条码 不生成 + + //保存数据 +// List mesProductOffLineList = new ArrayList<>(); +// for (MesBom mesBom : mesBoms) { +// mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, false)); +// } +// mesProductOffLineService.insertBatch(mesProductOffLineList); + + //保存数据 + List mesProductOffLineList = new ArrayList<>(); + MesProductOffLine newMesProductOffLine; + for (MesProduceSn produceSn : mesProduceSns) { + for (MesBom mesBom : mesBoms) { + newMesProductOffLine = new MesProductOffLine(); + newMesProductOffLine.setReportPartNo(mesWorkOrderDb.getPartNo()); + newMesProductOffLine.setReportPartNameRdd(mesWorkOrderDb.getPartName()); + newMesProductOffLine.setItemPartNo(mesBom.getItemPartNo()); + newMesProductOffLine.setItemPartName(mesBom.getItemPartName()); + newMesProductOffLine.setItemQty(mesBom.getItemQty()); + newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint()); + newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint()); + newMesProductOffLine.setQty(1d); + newMesProductOffLine.setReportSn(produceSn.getProductSn()); + newMesProductOffLine.setBomVersion(mesWorkOrderDb.getProductVersion()); + newMesProductOffLine.setSerialNumber(produceSn.getProductSn()); + newMesProductOffLine.setUnit(mesBom.getUnit()); + newMesProductOffLine.setItemUnit(mesBom.getItemUnit()); + newMesProductOffLine.setWorkOrderNo(mesWorkOrderDb.getWorkOrderNo()); + newMesProductOffLine.setWorkCenterCode(mesWorkOrderDb.getWorkCenterCode()); + newMesProductOffLine.setWorkCellCode(mesWorkOrderDb.getWorkCellCode()); + newMesProductOffLine.setReportType(mesWorkOrderDb.getReportType()); + newMesProductOffLine.setSapWorkCenter(mesWorkOrderDb.getErpWorkCenter()); + newMesProductOffLine.setOrganizeCode(organizeCode); + + ConvertBean.serviceModelInitialize(newMesProductOffLine, userName); + mesProductOffLineList.add(newMesProductOffLine); + } + } + mesProductOffLineRDao.saveAll(mesProductOffLineList); + } + private void updateMesWorkOrder(MesWorkOrder mesWorkOrder, String userName ) { + //修改工单,需要重新同步 + mesWorkOrder.setSystemSyncStatus(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + ConvertBean.serviceModelUpdate(mesWorkOrder, userName); + workOrderRepository.update(mesWorkOrder); + //保存记录 + saveMesWorkOrderLog(mesWorkOrder); + } + public void saveMesWorkOrderLog(MesWorkOrder mesWorkOrder) { + MesWorkOrderLog workOrderLog = new MesWorkOrderLog(); + BeanUtils.copyProperties(mesWorkOrder, workOrderLog, "id"); + mesWorkOrderLogRepository.insert(workOrderLog); + } + public List findBomList(String organizeCode, MesPart mesPart, String bomVersion) { + List bomData = new ArrayList<>(); + // 递归展开 BOM + expendBomChild(organizeCode, mesPart.getPartNo(), bomVersion, bomData); + + if (bomData.size() == 0) { + MesException.throwMesBusiException("零件号 %s 没找找到 ERP 同步的原始 BOM 数据,请检查接口是否正常!", mesPart.getPartNo()); + } + + Iterator iterator = bomData.iterator(); + while (iterator.hasNext()) { + MesBom item = iterator.next(); + // 删除虚零件 + if (Objects.equals("X", item.getPartType())) { + iterator.remove(); + } else { + item.setPartNo(mesPart.getPartNo()); + item.setPartName(mesPart.getPartName()); + } + } + + Map summaryBomMap = new HashMap<>(); + + for (MesBom item : bomData) { + String key = String.format("%s:%s", item.getPartNo().toUpperCase().trim(), + item.getItemPartNo().toUpperCase().trim()); + if (!summaryBomMap.containsKey(key)) { + summaryBomMap.put(key, item); + } else { + MesBom tempItem = summaryBomMap.get(key); + // 子零件重复的累加数量 + tempItem.setItemQty(MathOperation.add(tempItem.getItemQty(), item.getItemQty())); + } + } + // 返回汇总数据 + return new ArrayList<>(summaryBomMap.values()); + } + /** + * 递归展开 BOM + * + * @param organizeCode 工厂代码 + * @param partNo 父零件号 + * @param bomData 存放 BOM 数据的集合 + */ + private void expendBomChild(String organizeCode, String partNo, String bomVersion, List bomData) { + List bomDetails = findMesBomByPartNoAndBomVersion(partNo, organizeCode, bomVersion); + + for (MesBom item : bomDetails) { + MesBom newItem = new MesBom(); + BeanUtils.copyProperties(item, newItem); + // 处理父零件用量不为 1 的情况 + if (newItem.getQty() != 1.0 && newItem.getQty() > 0.0) { + Double rateQty = MathOperation.div(newItem.getItemQty(), newItem.getQty(), 8); + newItem.setQty(1.0); + newItem.setItemQty(rateQty); + } + // 加入到 BOM 清单中 + bomData.add(newItem); + // 如果有子阶,继续递归 + if (Objects.equals("X", item.getPartType())) { + expendBomChild(organizeCode, newItem.getItemPartNo(), null, bomData); + } + } + } + public List findMesBomByPartNoAndBomVersion(String partNo, String organizeCode, String bomVersion) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(bomVersion, "bomVersion", ddlPackBean); + DdlPreparedPack.getStringSmallerPack(TimeTool.getNowTime(true), "effStartTime", ddlPackBean); + DdlPreparedPack.getOrderBy("effStartTime", CommonEnumUtil.ASC_OR_DESC.DESC.getValue(), ddlPackBean); + List mesBoms = mesBomRDao.findByHqlWhere(ddlPackBean); + if (org.springframework.util.CollectionUtils.isEmpty(mesBoms)) { + MesException.throwMesBusiException("物料【%s】生产版本【%s】对应bom信息不存在", partNo, bomVersion); + } + MesBom next = mesBoms.iterator().next(); + //如果存在多个bomCode取最新的一个 + return mesBoms.stream().collect(Collectors.groupingBy(MesBom::getBomCode)).get(next.getBomCode()); + } }