diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/report/IMesYfReportService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/report/IMesYfReportService.java index ae548a6..8a55bd7 100644 --- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/report/IMesYfReportService.java +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/busi/report/IMesYfReportService.java @@ -5,6 +5,7 @@ import cn.estsh.i3plus.ext.mes.pojo.model.report.MesDeviceDataQueryReportResultM import cn.estsh.i3plus.ext.mes.pojo.model.report.MesProdRuleReportConditionModel; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.mes.bean.MesCokpitKanbanData; import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; import cn.estsh.i3plus.pojo.mes.model.report.MesTraceabilityReportModel; @@ -48,4 +49,7 @@ public interface IMesYfReportService { @ApiOperation("产品加工记录") ListPager queryMesProductionRecord(MesProductionRecord mesProductionRecord, Pager pager); + + @ApiOperation("看板数据") + ListPager queryMesCokpitKanbanData(MesCokpitKanbanData kanbanData, Pager pager); } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesBusiReportController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesBusiReportController.java index ff543c0..1449d7f 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesBusiReportController.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/report/MesBusiReportController.java @@ -7,6 +7,7 @@ import cn.estsh.i3plus.ext.mes.apiservice.config.AuthUtilExt; import cn.estsh.i3plus.ext.mes.pojo.constant.MesCommonConstant; import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.mes.bean.MesCokpitKanbanData; import cn.estsh.i3plus.pojo.mes.bean.MesDowntimeRecord; import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; @@ -25,6 +26,7 @@ import org.apache.commons.collections.CollectionUtils; import org.drools.core.rule.Collect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -148,4 +150,19 @@ public class MesBusiReportController extends MesBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + + @ApiOperation(value = "看板数据", notes = "看板数据") + @PostMapping("/mesCokpitKanbanData/query") + public ResultBean queryMesCokpitKanbanData(MesCokpitKanbanData kanbanData, Pager pager) { + try { + ValidatorBean.beginValid(kanbanData) + .notNull("organizeCode", kanbanData.getOrganizeCode()); + return ResultBean.success("查询成功").setListPager(mesYfReportService.queryMesCokpitKanbanData(kanbanData,pager)); + } catch (ImppBusiException e) { + return ResultBean.fail(e); + } 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/MesWorkOrderService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesWorkOrderService.java index 61c366a..5b8440f 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 @@ -16,6 +16,7 @@ import cn.estsh.i3plus.platform.common.tool.MathOperation; import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.PagerHelper; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; @@ -145,6 +146,9 @@ public class MesWorkOrderService extends BaseMesService implements @Autowired private IMesPrintedSnLogRepository printedSnLogRepository; + @Autowired + private SnowflakeIdMaker snowflakeIdMaker; + @Override public MesWorkOrder insert(MesWorkOrder bean) { //校验产线与工位的关系 @@ -912,7 +916,7 @@ public class MesWorkOrderService extends BaseMesService implements //查询产线信息 MesWorkCenter mesWorkCenter = getMesWorkCenter(mesWorkOrderDb.getOrganizeCode(),mesWorkOrderDb.getWorkCenterCode()); //获取生产版本 - MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb); + MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb.getPartNo(),mesWorkOrderDb.getOrganizeCode(),mesWorkOrderDb.getProductVersion()); //物料+生产版本获取bom信息 List mesBoms = mesBomService.findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); //报工类型 @@ -1012,7 +1016,7 @@ public class MesWorkOrderService extends BaseMesService implements } } //获取生产版本 - MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder); + MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrder.getPartNo(),mesWorkOrder.getOrganizeCode(),mesWorkOrder.getProductVersion()); //物料+生产版本获取bom信息 List mesBoms = mesBomService.findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); //生成条码 @@ -1022,6 +1026,7 @@ public class MesWorkOrderService extends BaseMesService implements List mesMoveList = new ArrayList<>(); boolean isReport = false; boolean isMove = false; + String nowTime = TimeTool.getNowTime(true); //排序工单 if (MesExtEnumUtil.ORDER_TYPE.SORT.getValue() == mesWorkOrder.getWorkOrderType()) { //报工类型 @@ -1038,7 +1043,7 @@ public class MesWorkOrderService extends BaseMesService implements isReport = true; isMove = true; } else if (MesExtEnumUtil.MES_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == mesProdRuleSortCfg.getReportType()) { - customerSupplyMove(mesWorkOrderNew, mesProductVersion, mesBoms, sn, mesProductOffLineList, mesMoveList); + customerSupplyMove(mesWorkOrderNew, mesProductVersion, mesBoms, sn, mesProductOffLineList, mesMoveList,nowTime,true); } else { log.info("工单{}排序加工规则报工类型未维护", mesWorkOrder.getWorkOrderNo()); return; @@ -1049,7 +1054,6 @@ public class MesWorkOrderService extends BaseMesService implements MesPartSap mesPartSap = mesPartSapService.getMesPartSapByPartNo(mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode()); //成品汇报 if (isReport) { - String nowTime = TimeTool.getNowTime(true); for (MesBom mesBom : mesBoms) { mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom, false,nowTime,mesBoms.size())); } @@ -1064,11 +1068,11 @@ public class MesWorkOrderService extends BaseMesService implements } else if (MesExtEnumUtil.ORDER_TYPE.UN_SORT.getValue() == mesWorkOrder.getWorkOrderType()) { MesProdRuleNosortCfg mesProdRuleNoSortCfg = mesProdRuleNosortCfgService.findMesProdRuleNosortCfgByWorkCenterCode(mesWorkOrder.getWorkCenterCode(), mesWorkOrder.getPartNo(), mesWorkOrder.getOrganizeCode()); if (MesExtEnumUtil.NOSORT_REPORT_TYPE.REPORT.getValue() == mesProdRuleNoSortCfg.getReportType()) { - String nowTime = TimeTool.getNowTime(true); for (MesBom mesBom : mesBoms) { mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrderNew, mesProductVersion, sn, mesBom, false,nowTime,mesBoms.size())); } - + }else if(MesExtEnumUtil.NOSORT_REPORT_TYPE.CUSTOMER_SUPPLY_MOVE.getValue() == mesProdRuleNoSortCfg.getReportType()) { + customerSupplyMove(mesWorkOrderNew, mesProductVersion, mesBoms, sn, mesProductOffLineList, mesMoveList,nowTime,false); } } else { log.info("工单{}排序规则不属于排序工单和非排序工单", mesWorkOrder.getWorkOrderNo()); @@ -1346,7 +1350,7 @@ public class MesWorkOrderService extends BaseMesService implements if (CollectionUtils.isEmpty(oldProductOffLineList)) { MesException.throwMesBusiException("条码【%s】未查询到报工数据", model.getSn()); } - oldProductOffLineList = mesProductOffLineService.findMesProductOffLineByRecordId(oldProductOffLineList.iterator().next().getProductionRecordId(), model.getOrganizeCode()); + //oldProductOffLineList = mesProductOffLineService.findMesProductOffLineByRecordId(oldProductOffLineList.iterator().next().getProductionRecordId(), model.getOrganizeCode()); oldProductOffLineList.forEach(item -> { item.setReportType(MesExtEnumUtil.REPORT_TYPE.CBR.getValue()); item.setOrderNo(model.getShipOrderNo()); @@ -1430,10 +1434,11 @@ public class MesWorkOrderService extends BaseMesService implements return mesProductVersion; } - private void customerSupplyMove(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List mesBoms, String sn, List mesProductOffLineList, List mesMoveList) { + private void customerSupplyMove(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, List mesBoms, String sn, List mesProductOffLineList, List mesMoveList,String nowTime,boolean isSort) { boolean isItemMove; boolean isItemReport; MesMoveRule moveRule; + MesPart itemPart; //查询零件生产组的移库规则 List moveRules = mesMoveRuleService.findMesMoveRuleByPartProdGroupCode(mesWorkOrder.getPartProdGroupCode(), mesWorkOrder.getOrganizeCode()); Map> mesMoveRuleMap = moveRules.stream().filter(t -> Objects.nonNull(t.getSrcType())).collect(Collectors.groupingBy(MesMoveRule::getSrcType)); @@ -1446,8 +1451,9 @@ public class MesWorkOrderService extends BaseMesService implements isItemReport = false; isItemMove = false; moveRule = null; + itemPart = null; if (itemPartMap.containsKey(mesBom.getItemPartNo())) { - MesPart itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next(); + itemPart = itemPartMap.get(mesBom.getItemPartNo()).iterator().next(); if (!StringUtil.isEmpty(itemPart.getEsd()) && mesMoveRuleMap.containsKey(itemPart.getEsd())) { moveRule = mesMoveRuleMap.get(itemPart.getEsd()).iterator().next(); if (MesExtEnumUtil.MOVE_TYPE_REPORT_TYPE.REPORT_MOVE.getValue() == moveRule.getReportType()) { @@ -1461,9 +1467,20 @@ public class MesWorkOrderService extends BaseMesService implements } } //汇报 - if (isItemReport) { - String nowTime = TimeTool.getNowTime(true); - mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, true,nowTime,mesBoms.size())); + if (isItemReport && isSort) { + mesProductOffLineList.add(creatMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, true, nowTime, mesBoms.size())); + } else if (isItemReport) { + String reportSn = String.valueOf(snowflakeIdMaker.nextId()); + MesProductVersion itemVersion = getMesProductVersion(mesBom.getItemPartNo(), mesWorkOrder.getOrganizeCode(), mesProductVersion.getProductVersion()); + List bomList = mesBomService.findBomList(mesWorkOrder.getOrganizeCode(), itemPart, itemVersion.getAlternativePartList()); + //bom下的子节汇报 + if (!CollectionUtils.isEmpty(bomList)) { + for (MesBom bom : bomList) { + mesProductOffLineList.add(getMesProductOffLine(mesWorkOrder, itemVersion, reportSn, bom, mesBom.getItemQty(), true, nowTime)); + } + } else { + mesProductOffLineList.add(getMesProductOffLine(mesWorkOrder, itemVersion, reportSn, mesBom, mesBom.getQty(), true, nowTime)); + } } //移库 if (isItemMove) { @@ -1476,6 +1493,13 @@ public class MesWorkOrderService extends BaseMesService implements mesMoveList.add(move); } } + + //bom下的子节汇报,总成也需要汇报 + if (!isSort && !CollectionUtils.isEmpty(mesProductOffLineList)) { + for (MesBom mesBom : mesBoms) { + mesProductOffLineList.add(getMesProductOffLine(mesWorkOrder, mesProductVersion, sn, mesBom, mesBom.getQty(), false, nowTime)); + } + } } private Map> getPartSapMap(MesWorkOrder mesWorkOrder, List itemPartNoList) { @@ -1507,18 +1531,53 @@ public class MesWorkOrderService extends BaseMesService implements } - private MesProductVersion getMesProductVersion(MesWorkOrder mesWorkOrder) { - DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesWorkOrder.getOrganizeCode()); - DdlPreparedPack.getStringEqualPack(mesWorkOrder.getPartNo(), "partNo", ddlPackBean); - //DdlPreparedPack.getStringEqualPack(mesWorkOrder.getErpWorkCenter(), "workCenterCode", ddlPackBean); - DdlPreparedPack.getStringEqualPack(mesWorkOrder.getProductVersion(), "productVersion", ddlPackBean); + private MesProductVersion getMesProductVersion(String partNo,String organizeCode,String productVersion) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(partNo, "partNo", ddlPackBean); + DdlPreparedPack.getStringEqualPack(productVersion, "productVersion", ddlPackBean); MesProductVersion mesProductVersion = mesProductVersionRDao.getByProperty(ddlPackBean); if (null == mesProductVersion) { - MesException.throwMesBusiException("物料【%s】生产版本【%s】信息不存在", mesWorkOrder.getPartNo(),mesWorkOrder.getProductVersion()); + MesException.throwMesBusiException("物料【%s】生产版本【%s】信息不存在", partNo,productVersion); } return mesProductVersion; } + private MesProductOffLine getMesProductOffLine(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, + String sn, MesBom mesBom,Double itemQty, boolean isItemReport,String nowTime) { + MesProductOffLine newMesProductOffLine = new MesProductOffLine(); + BeanUtils.copyProperties(mesBom, newMesProductOffLine, "id"); + newMesProductOffLine.setReportPartNo(mesBom.getPartNo()); + newMesProductOffLine.setReportPartNameRdd(mesBom.getPartName()); + newMesProductOffLine.setAlort(mesProductVersion.getReceiveInventoryPoint()); + newMesProductOffLine.setStgeLoc(mesProductVersion.getShipInventoryPoint()); + newMesProductOffLine.setQty(MathOperation.mul(mesWorkOrder.getNum(),itemQty)); + newMesProductOffLine.setItemQty(MathOperation.mul(newMesProductOffLine.getQty(), mesBom.getItemQty())); + if (isItemReport && mesBom.getPartNo().equals(mesWorkOrder.getPartNo())) { + newMesProductOffLine.setReportPartNo(mesBom.getItemPartNo()); + newMesProductOffLine.setReportPartNameRdd(mesBom.getItemPartName()); + newMesProductOffLine.setItemPartNo(""); + newMesProductOffLine.setItemPartName(""); + newMesProductOffLine.setItemUnit(""); + newMesProductOffLine.setItemQty(0d); + } + newMesProductOffLine.setReportSn(sn); + newMesProductOffLine.setSerialNumber(sn); + newMesProductOffLine.setBomVersion(mesWorkOrder.getProductVersion()); + newMesProductOffLine.setUnit(mesBom.getUnit()); + newMesProductOffLine.setBomCode(mesBom.getBomCode()); + newMesProductOffLine.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); + newMesProductOffLine.setWorkOrderType(mesWorkOrder.getWorkOrderType()); + newMesProductOffLine.setWorkCenterCode(mesWorkOrder.getWorkCenterCode()); + newMesProductOffLine.setWorkCellCode(mesWorkOrder.getWorkCellCode()); + newMesProductOffLine.setReportType(mesWorkOrder.getReportType()); + newMesProductOffLine.setSapWorkCenter(mesProductVersion.getWorkCenterCode()); + newMesProductOffLine.setOrganizeCode(mesWorkOrder.getOrganizeCode()); + newMesProductOffLine.setDescription(nowTime); + newMesProductOffLine.setProductionRecordId(mesWorkOrder.getId().toString()); + ConvertBean.serviceModelInitialize(newMesProductOffLine, mesWorkOrder.getModifyUser()); + return newMesProductOffLine; + } + private MesProductOffLine creatMesProductOffLine(MesWorkOrder mesWorkOrder, MesProductVersion mesProductVersion, String sn, MesBom mesBom, boolean isItemReport,String nowTime,Integer bomTotalSize) { @@ -1747,7 +1806,7 @@ public class MesWorkOrderService extends BaseMesService implements MesException.throwMesBusiException("产线【%s】不存在", mesWorkOrderDb.getWorkCenterCode()); } //获取生产版本 - MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb); + MesProductVersion mesProductVersion = getMesProductVersion(mesWorkOrderDb.getPartNo(),mesWorkOrderDb.getOrganizeCode(),mesWorkOrderDb.getProductVersion()); //物料+生产版本获取bom信息 List mesBoms = findBomList(mesPart.getOrganizeCode(), mesPart, mesProductVersion.getAlternativePartList()); diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/report/MesYfReportServiceImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/report/MesYfReportServiceImpl.java index b323582..78b8547 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/report/MesYfReportServiceImpl.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/report/MesYfReportServiceImpl.java @@ -97,6 +97,10 @@ public class MesYfReportServiceImpl implements IMesYfReportService { @Autowired private MesProductionRecordRepository mesProductionRecordRepository; + + @Autowired + private MesCokpitKanbanDataRepository mesCokpitKanbanDataRepository; + @Override public ListPager queryMesDeviceDataByPager(MesDeviceDataQueryReportConditionModel queryReportModel, Pager pager) { ListPager mesDeviceDataQueryReportResultModelListPager = @@ -251,6 +255,19 @@ public class MesYfReportServiceImpl implements IMesYfReportService { return new ListPager<>(mesProductionRecordRepository.findByHqlWherePage(packBean, pager), pager); } + @Override + public ListPager queryMesCokpitKanbanData(MesCokpitKanbanData kanbanData, Pager pager) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(kanbanData.getOrganizeCode()); + DdlPreparedPack.getStringLikerPack(kanbanData.getWorkCenterCode(),"workCenterCode",packBean); + DdlPreparedPack.getStringEqualPack("GHHCS","dataLocation",packBean); + DdlPreparedPack.getStringBiggerPack(kanbanData.getDataTimeStart(), "dataTime", packBean); + DdlPreparedPack.getStringSmallerPack(kanbanData.getDataTimeEnd(), "dataTime", packBean); + pager = PagerHelper.getPager(pager, mesCokpitKanbanDataRepository.findByHqlWhereCount(packBean)); + DdlPreparedPack.getOrderBy(kanbanData.getOrderByParam(),kanbanData.getAscOrDesc(),packBean); + List mesCokpitKanbanDataList = mesCokpitKanbanDataRepository.findByHqlWherePage(packBean, pager); + return new ListPager<>(mesCokpitKanbanDataList,pager); + } + private DdlPackBean getDdlPackBeanMesProductionRecord(MesProductionRecord mesProductionRecord) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(mesProductionRecord.getOrganizeCode()); DdlPreparedPack.getStringLikerPack(mesProductionRecord.getProductSn(), "productSn", packBean);