From dfa12c6df58a530dcc1eb957c4bcb4ef0028ba47 Mon Sep 17 00:00:00 2001 From: "logic.fang" <[logic.fang@estsh.com]> Date: Thu, 27 Jun 2024 18:19:09 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=A7=E7=BA=BF=E7=9C=8B=E6=9D=BF-=E2=80=9C?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=81=9C=E7=BA=BF=E6=97=B6=E9=97=B4=E2=80=9D?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=9C=80=E6=B1=82=E6=9C=AA=E6=98=8E=E7=A1=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/MesWorkCenterBoardController.java | 15 +- .../mes/apiservice/dao/board/IMesYfBoardDao.java | 46 +++ .../daoimpl/board/MesYfBoardDaoImpl.java | 127 +++++++ .../serviceimpl/board/IMesYfBoardServiceImpl.java | 414 ++++++++++++++++++++- .../model/board/MesWorkCenterBoardResultModel.java | 30 +- 5 files changed, 612 insertions(+), 20 deletions(-) create mode 100644 modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/dao/board/IMesYfBoardDao.java create mode 100644 modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/daoimpl/board/MesYfBoardDaoImpl.java diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/board/MesWorkCenterBoardController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/board/MesWorkCenterBoardController.java index b1ea7d3..a84dbd9 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/board/MesWorkCenterBoardController.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/board/MesWorkCenterBoardController.java @@ -13,6 +13,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -33,7 +34,7 @@ public class MesWorkCenterBoardController { @ApiOperation(value = "查询产线状态", notes = "查询产线状态") @PostMapping("/query-work-center-status") - public ResultBean queryWorkCenterStatus(MesWorkCenterBoardConditionModel conditionModel){ + public ResultBean queryWorkCenterStatus(@RequestBody MesWorkCenterBoardConditionModel conditionModel){ try { ValidatorBean.beginValid(conditionModel) .notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList()) @@ -51,7 +52,7 @@ public class MesWorkCenterBoardController { @ApiOperation(value = "查询产线生产完成率", notes = "查询产线生产完成率") @PostMapping("/query-work-center-production-completion-rate") - public ResultBean queryWorkCenterProductionCompletionRate(MesWorkCenterBoardConditionModel conditionModel){ + public ResultBean queryWorkCenterProductionCompletionRate(@RequestBody MesWorkCenterBoardConditionModel conditionModel){ try { ValidatorBean.beginValid(conditionModel) .notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList()) @@ -69,7 +70,7 @@ public class MesWorkCenterBoardController { @ApiOperation(value = "查询产线工单完成情况", notes = "查询产线工单完成情况") @PostMapping("/query-work-center-work-order-completion-status") - public ResultBean queryWorkCenterWorkOrderCompletionStatus(MesWorkCenterBoardConditionModel conditionModel){ + public ResultBean queryWorkCenterWorkOrderCompletionStatus(@RequestBody MesWorkCenterBoardConditionModel conditionModel){ try { ValidatorBean.beginValid(conditionModel) .notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList()) @@ -87,7 +88,7 @@ public class MesWorkCenterBoardController { @ApiOperation(value = "查询单位小时完工数", notes = "查询单位小时完工数") @PostMapping("/query-unit-hour-completion-rate") - public ResultBean queryUnitHourCompletionRate(MesWorkCenterBoardConditionModel conditionModel){ + public ResultBean queryUnitHourCompletionRate(@RequestBody MesWorkCenterBoardConditionModel conditionModel){ try { ValidatorBean.beginValid(conditionModel) .notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList()) @@ -105,7 +106,7 @@ public class MesWorkCenterBoardController { @ApiOperation(value = "查询产线一次下线合格率", notes = "查询产线一次下线合格率") @PostMapping("/query-work-center-first-time-offline-qualification-rate") - public ResultBean queryWorkCenterFirstTimeOfflineQualificationRate(MesWorkCenterBoardConditionModel conditionModel){ + public ResultBean queryWorkCenterFirstTimeOfflineQualificationRate(@RequestBody MesWorkCenterBoardConditionModel conditionModel){ try { ValidatorBean.beginValid(conditionModel) .notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList()) @@ -123,7 +124,7 @@ public class MesWorkCenterBoardController { @ApiOperation(value = "查询点检结果", notes = "查询点检结果") @PostMapping("/query-inspection-results") - public ResultBean queryInspectionResults(MesWorkCenterBoardConditionModel conditionModel){ + public ResultBean queryInspectionResults(@RequestBody MesWorkCenterBoardConditionModel conditionModel){ try { ValidatorBean.beginValid(conditionModel) .notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList()) @@ -141,7 +142,7 @@ public class MesWorkCenterBoardController { @ApiOperation(value = "查询异常停线时间", notes = "查询异常停线时间") @PostMapping("/query-abnormal-downtime") - public ResultBean queryAbnormalDowntime(MesWorkCenterBoardConditionModel conditionModel){ + public ResultBean queryAbnormalDowntime(@RequestBody MesWorkCenterBoardConditionModel conditionModel){ try { ValidatorBean.beginValid(conditionModel) .notNull("workCenterCodeList", conditionModel.getWorkCenterCodeList()) diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/dao/board/IMesYfBoardDao.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/dao/board/IMesYfBoardDao.java new file mode 100644 index 0000000..bb00b21 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/dao/board/IMesYfBoardDao.java @@ -0,0 +1,46 @@ +package cn.estsh.i3plus.ext.mes.apiservice.dao.board; + +import cn.estsh.i3plus.ext.mes.pojo.model.board.MesWorkCenterBoardResultModel; +import cn.estsh.i3plus.pojo.mes.bean.MesShift; + +import java.util.List; + +/** + * @Description : 看板-数据方法实现 + * @Reference : + * @Author : logic + * @CreateDate : 2024/6/24 18:22 + * @Modify: + **/ +public interface IMesYfBoardDao { + + /** + * 查询指定产线在当前时间节点有效的班次信息 + * @param workCenterCodeList 指定产线代码集合 + * @param organizeCode 组织代码 + * @param nowDateTime 当前时间 + * @return 指定产线在当前时间节点有效的班次信息 + */ + List queryMesShift(List workCenterCodeList, String organizeCode, String nowDateTime); + + /** + * 查询指定产线在指定时间区间内的生产汇报数据 + * @param workCenterCode 产线代码 + * @param organizeCode 组织代码 + * @param startTime 查询起始时间 + * @param endTime 查询结束时间 + * @return 生产汇报数据 + */ + List queryMesProductOffLineModel(String workCenterCode, String organizeCode, String startTime, String endTime); + + /** + * 查询指定产线在指定时间区间内的生产加工完成条码及状态 + * @param workCenterCode 产线代码 + * @param organizeCode 组织代码 + * @param startTime 查询起始时间 + * @param endTime 查询结束时间 + * @return 加工完成条码及其质量状态 + */ + List queryCompletedSnInfo(String workCenterCode, String organizeCode, String startTime, String endTime); + +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/daoimpl/board/MesYfBoardDaoImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/daoimpl/board/MesYfBoardDaoImpl.java new file mode 100644 index 0000000..492ce05 --- /dev/null +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/daoimpl/board/MesYfBoardDaoImpl.java @@ -0,0 +1,127 @@ +package cn.estsh.i3plus.ext.mes.apiservice.daoimpl.board; + +import cn.estsh.i3plus.ext.mes.apiservice.dao.board.IMesYfBoardDao; +import cn.estsh.i3plus.ext.mes.pojo.model.board.MesWorkCenterBoardResultModel; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesShift; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description : 看板-数据方法实现 + * @Reference : + * @Author : logic + * @CreateDate : 2024/6/24 18:22 + * @Modify: + **/ +@Service +public class MesYfBoardDaoImpl implements IMesYfBoardDao { + + @Autowired + private EntityManager entityManager; + + @Override + public List queryMesShift(List workCenterCodeList, String organizeCode, String nowDateTime) { + StringBuffer queryShiftSql = new StringBuffer(); + queryShiftSql.append("from MesShift " + + "where isValid = :isValid " + + "and isDeleted = :isDeleted " + + "and organizeCode = :organizeCode " + + "and workCenterCode in (:workCenterCodeList) " + + "and beginDate <= :nowDateTime " + + "and endDate >= :nowDateTime "); + Query shiftQuery = entityManager.createQuery(queryShiftSql.toString(), MesShift.class); + shiftQuery.setParameter("isValid", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + shiftQuery.setParameter("isDeleted", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + shiftQuery.setParameter("organizeCode", organizeCode); + shiftQuery.setParameter("workCenterCodeList", workCenterCodeList); + shiftQuery.setParameter("nowDateTime", nowDateTime); + return shiftQuery.getResultList(); + } + + @Override + public List queryMesProductOffLineModel(String workCenterCode, String organizeCode, + String startTime, String endTime) { + StringBuffer queryMesProductOffLineSql = new StringBuffer(); + queryMesProductOffLineSql.append("select distinct new " + MesWorkCenterBoardResultModel.class.getName() + + "(serialNumber, " + + "createDatetime) " + + "from MesProductOffLine " + + "where isValid = :isValid " + + "and isDeleted = :isDeleted " + + "and organizeCode = :organizeCode " + + "and workCenterCode = :workCenterCode " + + "and createDatetime >= :startTime " + + "and createDatetime <= :endTime "); + Query shiftQuery = entityManager.createQuery(queryMesProductOffLineSql.toString(), MesWorkCenterBoardResultModel.class); + shiftQuery.setParameter("isValid", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + shiftQuery.setParameter("isDeleted", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + shiftQuery.setParameter("organizeCode", organizeCode); + shiftQuery.setParameter("workCenterCode", workCenterCode); + shiftQuery.setParameter("startTime", startTime); + shiftQuery.setParameter("endTime", endTime); + return shiftQuery.getResultList(); + } + + @Override + public List queryCompletedSnInfo(String workCenterCode, String organizeCode, String startTime, String endTime) { + //先查询生产加工表中指定时间区间、指定产线已加工完成的数据 + StringBuffer queryMesProductionRecordSql = new StringBuffer(); + queryMesProductionRecordSql.append("select distinct new " + MesWorkCenterBoardResultModel.class.getName() + + "(serialNumber, " + + "createDatetime) " + + "from MesProductionRecord " + + "where isValid = :isValid " + + "and isDeleted = :isDeleted " + + "and organizeCode = :organizeCode " + + "and workCenterCode = :workCenterCode " + + "and isComplete = :isComplete " + + "and createDatetime >= :startTime " + + "and createDatetime <= :endTime "); + Query mesProductionRecordQuery = entityManager.createQuery(queryMesProductionRecordSql.toString(), MesWorkCenterBoardResultModel.class); + mesProductionRecordQuery.setParameter("isValid", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + mesProductionRecordQuery.setParameter("isDeleted", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + mesProductionRecordQuery.setParameter("organizeCode", organizeCode); + mesProductionRecordQuery.setParameter("workCenterCode", workCenterCode); + mesProductionRecordQuery.setParameter("isComplete", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + mesProductionRecordQuery.setParameter("startTime", startTime); + mesProductionRecordQuery.setParameter("endTime", endTime); + List productionRecordQueryResultList = mesProductionRecordQuery.getResultList(); + if (!CollectionUtils.isEmpty(productionRecordQueryResultList)) { + //取出所有过程条码 + List serialNumberList = productionRecordQueryResultList. + stream().map(MesWorkCenterBoardResultModel::getSerialNumber).collect(Collectors.toList()); + StringBuffer queryMesProduceSnSql = new StringBuffer(); + queryMesProduceSnSql.append("select distinct serialNumber " + + "from MesProduceSn " + + "where isValid = :isValid " + + "and isDeleted = :isDeleted " + + "and organizeCode = :organizeCode " + + "and qcStatus = :qcStatus " + + "and serialNumber in ( :serialNumberList )"); + Query mesProduceSnQuery = entityManager.createQuery(queryMesProduceSnSql.toString()); + mesProduceSnQuery.setParameter("isValid", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + mesProduceSnQuery.setParameter("isDeleted", CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + mesProduceSnQuery.setParameter("organizeCode", organizeCode); + mesProduceSnQuery.setParameter("qcStatus", MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); + mesProduceSnQuery.setParameter("serialNumberList", serialNumberList); + List resultList = mesProduceSnQuery.getResultList(); + for (MesWorkCenterBoardResultModel resultModel : productionRecordQueryResultList) { + if (resultList.contains(resultModel.getSerialNumber())) { + resultModel.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); + }else { + resultModel.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue()); + } + } + } + return productionRecordQueryResultList; + } + +} diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/board/IMesYfBoardServiceImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/board/IMesYfBoardServiceImpl.java index 6be95a3..9cb0b95 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/board/IMesYfBoardServiceImpl.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/board/IMesYfBoardServiceImpl.java @@ -1,11 +1,26 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.board; import cn.estsh.i3plus.ext.mes.api.busi.board.IMesYfBoardService; +import cn.estsh.i3plus.ext.mes.apiservice.dao.board.IMesYfBoardDao; import cn.estsh.i3plus.ext.mes.pojo.model.board.MesWorkCenterBoardConditionModel; import cn.estsh.i3plus.ext.mes.pojo.model.board.MesWorkCenterBoardResultModel; +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.mes.bean.*; +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.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; -import java.util.List; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; /** * @Description : 看板-业务方法实现 @@ -17,42 +32,425 @@ import java.util.List; @Service public class IMesYfBoardServiceImpl implements IMesYfBoardService { + @Autowired + private IMesYfBoardDao mesYfBoardDao; + + @Autowired + private MesDowntimeRecordRepository mesDowntimeRecordRepository; + + @Autowired + private MesWorkOrderRepository mesWorkOrderRepository; + + @Autowired + private MesWorkCenterRepository mesWorkCenterRepository; + + @Autowired + private MesEquipmentSpotCheckRepository mesEquipmentSpotCheckRepository; + + @Autowired + private MesSpotCheckOrderRepository mesSpotCheckOrderRepository; + + private static final String START_TIME = "START_TIME"; + + private static final String END_TIME = "END_TIME"; + + private static final Integer NUM = 12; + /** * 产线看板 */ @Override public List queryWorkCenterStatus(MesWorkCenterBoardConditionModel conditionModel) { - return null; + List resultModelList = new ArrayList<>(); + List workCenterCodeList = conditionModel.getWorkCenterCodeList(); + //获取查询时间区间 + Map> timeZoneMap = getTimeZoneMap(workCenterCodeList, + conditionModel.getTimeRangeIdentification(), conditionModel.getOrganizeCode()); + //查询当前时间区间内中的选中产线最新的的开停机记录 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(conditionModel.getOrganizeCode()); + for (String workCenterCode : timeZoneMap.keySet()) { + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean); + DdlPreparedPack.timeBuilder(timeZoneMap.get(workCenterCode).get(START_TIME), + timeZoneMap.get(workCenterCode).get(END_TIME), "createDatetime", ddlPackBean, true); + DdlPreparedPack.getOrderByPack( + new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{"createDatetime"}, ddlPackBean); + int queryCount = mesDowntimeRecordRepository.findByHqlWhereCount(ddlPackBean); + //封装页面展示数据 + MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel(); + resultModel.setWorkCenterCode(workCenterCode); + if (queryCount == 0) { + resultModel.setWorkCenterCodeStatus(MesExtEnumUtil.BOARD_WORK_CENTER_STATUS.NORMAL.getValue()); + }else { + resultModel.setWorkCenterCodeStatus(MesExtEnumUtil.BOARD_WORK_CENTER_STATUS.ABNORMAL.getValue()); + } + resultModelList.add(resultModel); + } + return resultModelList; } @Override public MesWorkCenterBoardResultModel queryWorkCenterProductionCompletionRate(MesWorkCenterBoardConditionModel conditionModel) { - return null; + Double workCenterCompletedQuantity = 0D; + Double workCenterPlannedQuantity = 0D; + //获取查询时间区间 + Map> timeZoneMap = getTimeZoneMap(conditionModel.getWorkCenterCodeList(), + conditionModel.getTimeRangeIdentification(), conditionModel.getOrganizeCode()); + //查询工单 + List mesWorkOrderList = queryMesWorkOrder(timeZoneMap, conditionModel); + //封装汇总数据 + MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel(); + for (MesWorkOrder mesWorkOrder : mesWorkOrderList) { + workCenterCompletedQuantity = workCenterCompletedQuantity + mesWorkOrder.getCompleteQty(); + workCenterPlannedQuantity = workCenterPlannedQuantity + mesWorkOrder.getQty(); + } + resultModel.setWorkCenterCompletedQuantity(workCenterCompletedQuantity); + resultModel.setWorkCenterPlannedQuantity(workCenterPlannedQuantity); + if (workCenterCompletedQuantity == 0 || workCenterPlannedQuantity == 0) { + resultModel.setWorkCenterCompletionRate(0D); + }else { + resultModel.setWorkCenterCompletionRate(workCenterCompletedQuantity * 100 / workCenterPlannedQuantity); + } + return resultModel; } @Override public List queryWorkCenterWorkOrderCompletionStatus(MesWorkCenterBoardConditionModel conditionModel) { - return null; + List resultModelList = new ArrayList<>(); + //获取查询时间区间 + Map> timeZoneMap = getTimeZoneMap(conditionModel.getWorkCenterCodeList(), + conditionModel.getTimeRangeIdentification(), conditionModel.getOrganizeCode()); + //查询工单 + List mesWorkOrderList = queryMesWorkOrder(timeZoneMap, conditionModel); + //封装汇总数据 + for (MesWorkOrder mesWorkOrder : mesWorkOrderList) { + MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel(); + resultModel.setWorkOrderNo(mesWorkOrder.getWorkOrderNo()); + resultModel.setPartNo(mesWorkOrder.getPartNo()); + resultModel.setPartDescription(mesWorkOrder.getPartName()); + resultModel.setWorkOrderCompletedQuantity(mesWorkOrder.getCompleteQty()); + resultModel.setWorkOrderPlannedQuantity(mesWorkOrder.getQty()); + if (resultModel.getWorkOrderCompletedQuantity() == 0 || resultModel.getWorkOrderPlannedQuantity() == 0) { + resultModel.setWorkOrderFirstPassRate(0D); + }else { + resultModel.setWorkOrderFirstPassRate(resultModel.getWorkOrderCompletedQuantity() * 100 / resultModel.getWorkOrderPlannedQuantity()); + } + resultModelList.add(resultModel); + } + return resultModelList; } @Override public List queryUnitHourCompletionRate(MesWorkCenterBoardConditionModel conditionModel) { - return null; + List resultModelList = new ArrayList<>(); + //查询当前产线设置的目标值 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(conditionModel.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(conditionModel.getWorkCenterCodeList().get(0), "workCenterCode", ddlPackBean); + MesWorkCenter mesWorkCenter = mesWorkCenterRepository.getByProperty(ddlPackBean); + if (Objects.isNull(mesWorkCenter) || StringUtils.isEmpty(mesWorkCenter.getJph())) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) + .setErrorDetail(conditionModel.getWorkCenterCodeList().get(0) + " 产线未维护有效的产线JPH信息!") + .build(); + } + //获取并汇总当前产线在当前时间前12个小时的每个小时时间段内工单的完成数 + Map> timeZoneMap = getLastHoursTimeZoneMap(NUM); + //查询当前产线12小时内的生产汇报完成的数据 + List mesProductOffLineQueryResultList = mesYfBoardDao.queryMesProductOffLineModel( + conditionModel.getWorkCenterCodeList().get(0), + conditionModel.getOrganizeCode(), + timeZoneMap.get(START_TIME).get(START_TIME), + timeZoneMap.get(END_TIME).get(END_TIME)); + for (String timeZone : timeZoneMap.keySet()) { + MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel(); + if (START_TIME.equals(timeZone) || END_TIME.equals(timeZone)) { + continue; + } + //横坐标赋值 + resultModel.setUnitHourCompletionRateTimePeriod(timeZone); + //目标值 + resultModel.setUnitHourCompletionRateTargetValue(Double.valueOf(mesWorkCenter.getJph())); + if (CollectionUtils.isEmpty(mesProductOffLineQueryResultList)) { + resultModel.setUnitHourCompletionRate(0); + }else { + //筛选生产汇报数据中在当前时间区段中的产品条码数 + List nowResultList = mesProductOffLineQueryResultList.stream().filter(model -> ( + StringUtils.compare(model.getCreateDateTime(), timeZoneMap.get(timeZone).get(START_TIME)) > 0 + && StringUtils.compare(timeZoneMap.get(timeZone).get(END_TIME), model.getCreateDateTime()) > 0 + )).collect(Collectors.toList()); + resultModel.setUnitHourCompletionRate(nowResultList.size()); + } + resultModelList.add(resultModel); + } + return resultModelList; } @Override public List queryWorkCenterFirstTimeOfflineQualificationRate(MesWorkCenterBoardConditionModel conditionModel) { - return null; + //获取并汇总当前时间前12个小时的每个小时时间段内数据(最高100) + //合格数 / 加工完成(包含已汇报,即工单的完成数;以及待汇报的) + List resultModelList = new ArrayList<>(); + Map> timeZoneMap = getLastHoursTimeZoneMap(NUM); + //查询当前产线在指定时间段内加工完成的条码数据 + List mesProductOffLineQueryResultList = mesYfBoardDao.queryCompletedSnInfo( + conditionModel.getWorkCenterCodeList().get(0), + conditionModel.getOrganizeCode(), + timeZoneMap.get(START_TIME).get(START_TIME), + timeZoneMap.get(END_TIME).get(END_TIME)); + //依次汇总每个时间段的数据 + for (String timeZone : timeZoneMap.keySet()) { + MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel(); + if (START_TIME.equals(timeZone) || END_TIME.equals(timeZone)) { + continue; + } + //横坐标赋值 + resultModel.setWorkCenterFirstTimeOfflineQualificationRateTimePeriod(timeZone); + //筛选当前时间段的生产加工记录 + List nowResultList = mesProductOffLineQueryResultList.stream().filter(model -> ( + StringUtils.compare(model.getCreateDateTime(), timeZoneMap.get(timeZone).get(START_TIME)) > 0 + && StringUtils.compare(timeZoneMap.get(timeZone).get(END_TIME), model.getCreateDateTime()) > 0 + )).collect(Collectors.toList()); + Map> resultModelByQcStatusMap = nowResultList.stream(). + collect(Collectors.groupingBy(MesWorkCenterBoardResultModel::getQcStatus)); + if (CollectionUtils.isEmpty(nowResultList) + || !resultModelByQcStatusMap.containsKey(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue())) { + //当前时间段没有生产加工记录或者没有合格的生产加工条码 + resultModel.setWorkCenterFirstTimeOfflineQualificationRate(0D); + }else { + double workCenterFirstTimeOfflineQualificationRate = ( + resultModelByQcStatusMap.get(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()).size() * 100 + / nowResultList.size()); + //最大值只允许100 + if (workCenterFirstTimeOfflineQualificationRate > 100) { + workCenterFirstTimeOfflineQualificationRate = 100; + } + resultModel.setWorkCenterFirstTimeOfflineQualificationRate(workCenterFirstTimeOfflineQualificationRate); + } + resultModelList.add(resultModel); + } + return resultModelList; } @Override public List queryInspectionResults(MesWorkCenterBoardConditionModel conditionModel) { - return null; + String workCenterCode = conditionModel.getWorkCenterCodeList().get(0); + List resultModelList = new ArrayList<>(); + //查询当前产线配置的点检类型 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(conditionModel.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean); + List mesEquipmentSpotCheckList = mesEquipmentSpotCheckRepository.findByHqlWhere(ddlPackBean); + Set spotCheckOrderTypeSet = mesEquipmentSpotCheckList. + stream().map(MesEquipmentSpotCheck::getSpotCheckOrderType).collect(Collectors.toSet()); + //获取查询时间区间 + Map> timeZoneMap = getTimeZoneMap(conditionModel.getWorkCenterCodeList(), + conditionModel.getTimeRangeIdentification(), conditionModel.getOrganizeCode()); + //查询当前产线在指定时间区间内的点检单记录并按照点检类型进行分组 + ddlPackBean = DdlPackBean.getDdlPackBean(conditionModel.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean); + DdlPreparedPack.timeBuilder(timeZoneMap.get(workCenterCode).get(START_TIME), + timeZoneMap.get(workCenterCode).get(END_TIME), "createDatetime", ddlPackBean, true); + List mesSpotCheckOrderList = mesSpotCheckOrderRepository.findByHqlWhere(ddlPackBean); + Map> mesSpotCheckOrderByTypeMap = mesSpotCheckOrderList. + stream().collect(Collectors.groupingBy(MesSpotCheckOrder::getSpotCheckOrderType)); + //遍历“点检类型”枚举 + for (MesExtEnumUtil.EQUIPMENT_CHECK_ORDER_TYPE typeEnum : MesExtEnumUtil.EQUIPMENT_CHECK_ORDER_TYPE.values()) { + if (typeEnum.getValue() == 6) { + //不添加工装点检 + continue; + } + MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel(); + //截取前两位作为标题 + resultModel.setInspectionItems(typeEnum.getDescription().substring(0, 2)); + //判断点检结果 + if (spotCheckOrderTypeSet.contains(typeEnum.getValue())) { + //配置该种点检类型 + if (mesSpotCheckOrderByTypeMap.containsKey(typeEnum.getValue())) { + //存在该种点检类型的点检单数据 + List mesSpotCheckOrders = mesSpotCheckOrderByTypeMap.get(typeEnum.getValue()); + //按修改时间降序 + mesSpotCheckOrders.sort(Comparator.comparing(MesSpotCheckOrder::getModifyDatetime).reversed()); + if (MesExtEnumUtil.SPOT_CHECK_ORDER_RESULT_TYPE.OK.getValue() == mesSpotCheckOrders.get(0).getSpotCheckOrderResult()) { + //最新的点检单结果为 OK + //结果设置为“正常” + resultModel.setInspectionResults(MesExtEnumUtil.INSPECTION_RESULTS.NORMAL.getValue()); + }else if (MesExtEnumUtil.SPOT_CHECK_ORDER_RESULT_TYPE.NOK.getValue() == mesSpotCheckOrders.get(0).getSpotCheckOrderResult()) { + //最新的点检单结果为 NOK + //结果设置为“异常” + resultModel.setInspectionResults(MesExtEnumUtil.INSPECTION_RESULTS.ABNORMAL.getValue()); + } + }else { + //不存在该种点检类型的点检单数据 + //结果设置为“未做” + resultModel.setInspectionResults(MesExtEnumUtil.INSPECTION_RESULTS.NOT_DONE.getValue()); + } + }else { + //未配置该种点检类型 + //结果设置为“不涉及” + resultModel.setInspectionResults(MesExtEnumUtil.INSPECTION_RESULTS.NOT_INVOLVED.getValue()); + } + resultModelList.add(resultModel); + } + return resultModelList; } @Override public MesWorkCenterBoardResultModel queryAbnormalDowntime(MesWorkCenterBoardConditionModel conditionModel) { - return null; + MesWorkCenterBoardResultModel resultModel = new MesWorkCenterBoardResultModel(); + //获取查询时间区间 + Map> timeZoneMap = getTimeZoneMap(conditionModel.getWorkCenterCodeList(), + conditionModel.getTimeRangeIdentification(), conditionModel.getOrganizeCode()); + resultModel.setAbnormalDowntime("00:45"); + return resultModel; + } + + /** + * 获取看板查询时间区段 + * @param timeRangeIdentification 显示维度 + * @return 当前显示维护对应的时间区段 + */ + private Map> getTimeZoneMap(List workCenterCodeList, Integer timeRangeIdentification, String organizeCode) { + Map> timeZoneMap = new HashMap<>(); + String startTime; + String endTime; + DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd "); + DateTimeFormatter dayTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + //当前时间 + LocalDateTime nowTime = LocalDateTime.now(); + //当前年月日 + String nowDay = dayFormatter.format(nowTime); + //当前年月日 时分秒 + String nowDayTime = dayTimeFormatter.format(nowTime); + //判断当前查询的时间段(当班或者当日) + if (MesExtEnumUtil.TIME_RANGE_IDENTIFICATION.ON_DUTY.getValue() == timeRangeIdentification) { + //当班 + //先查询用户指定的产线在当前时间节点有效的班次信息 + List mesShiftList = mesYfBoardDao.queryMesShift(workCenterCodeList, organizeCode, nowDayTime); + if (CollectionUtils.isEmpty(mesShiftList)) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) + .setErrorDetail(workCenterCodeList.toString() + " 产线未维护有效的班次信息!") + .build(); + } + Map> shiftByWorkCenterCodeMap = mesShiftList.stream().collect(Collectors.groupingBy(MesShift::getWorkCenterCode)); + //依次处理每个产线对应的班次数据,获取与当前时间相符的班次 + Map passShiftByWorkCenterCodeMap = new HashMap<>(); + for (String workCenterCode : workCenterCodeList) { + if (shiftByWorkCenterCodeMap.containsKey(workCenterCode)) { + List mesShifts = shiftByWorkCenterCodeMap.get(workCenterCode); + for (MesShift mesShift : mesShifts) { + //上班时间 + String workTime = nowDay + mesShift.getStartTime(); + //下班时间 + String closingTime; + if (StringUtils.compare(mesShift.getStartTime(), mesShift.getEndTime()) > 0) { + //跨天班次,下班时间的日期需要加一 + closingTime = dayFormatter.format(nowTime.plusDays(1)) + mesShift.getEndTime(); + }else { + //当天班次 + closingTime = nowDay + mesShift.getEndTime(); + } + if (StringUtils.compare(nowDayTime, workTime) > 0 && StringUtils.compare(closingTime, nowDayTime) > 0) { + //当前时间点在当前班次的上下班区间内 + mesShift.setStartTime(workTime); + mesShift.setEndTime(closingTime); + passShiftByWorkCenterCodeMap.put(workCenterCode, mesShift); + } + } + }else { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION_DATA_NOT_EXIT.getCode()) + .setErrorDetail(workCenterCode + " 产线未维护有效的班次信息!") + .build(); + } + } + //获取最终的班次时间区间 + for (String workCenterCode : passShiftByWorkCenterCodeMap.keySet()) { + MesShift mesShift = passShiftByWorkCenterCodeMap.get(workCenterCode); + Map map = new HashMap<>(); + map.put(START_TIME, mesShift.getStartTime()); + map.put(END_TIME, mesShift.getEndTime()); + timeZoneMap.put(workCenterCode, map); + } + }else if (MesExtEnumUtil.TIME_RANGE_IDENTIFICATION.ON_THE_SAME_DAY.getValue() == timeRangeIdentification) { + Map timeMap = new HashMap<>(); + //当日 + startTime = nowDay + "00:00:00"; + endTime = nowDay + "23:59:59"; + timeMap.put(START_TIME, startTime); + timeMap.put(END_TIME, endTime); + for (String workCenterCode : workCenterCodeList) { + timeZoneMap.put(workCenterCode, timeMap); + } + }else { + //显示维度格式有误,直接报错 + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.MES.getCode()) + .setErrorCode(ImppExceptionEnum.PARAMETER_EXCEPTION.getCode()) + .setErrorDetail("显示维护传参有误!") + .build(); + } + return timeZoneMap; + } + + /** + * 查询工单 + * @param timeZoneMap 时间区间 + * @param conditionModel 查询条件 + * @return 工单数据 + */ + private List queryMesWorkOrder(Map> timeZoneMap, MesWorkCenterBoardConditionModel conditionModel) { + String workCenterCode = conditionModel.getWorkCenterCodeList().get(0); + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(conditionModel.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", ddlPackBean); + //计划开始时间 + DdlPreparedPack.timeBuilder(timeZoneMap.get(workCenterCode).get(START_TIME), + timeZoneMap.get(workCenterCode).get(END_TIME), "planStartTime", ddlPackBean, true); + return mesWorkOrderRepository.findByHqlWhere(ddlPackBean); + } + + /** + * 获取当前时间前指定小时数内的每个小时区间的开始与结束时间 + * @param designatedQuantity 指定小时之前 + * @return 当前时间前指定小时数内的每个小时区间的开始与结束时间 + */ + private Map> getLastHoursTimeZoneMap(Integer designatedQuantity) { + Map> timeZoneMap = new TreeMap<>(); + DateTimeFormatter hourFormatter = DateTimeFormatter.ofPattern("HH"); + DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd "); + LocalDateTime nowTime = LocalDateTime.now(); + String nowDay = dayFormatter.format(nowTime); + String startTime; + String endTime; + String key; + for (int i = 0; i < designatedQuantity; i++) { + Map zoneMap = new HashMap<>(); + if (i == 0) { + //第一个区段获取当前时间所在的小时区间 + startTime = hourFormatter.format(nowTime.minusHours(i)) + ":00"; + endTime = hourFormatter.format(nowTime.plusHours(1)) + ":00"; + }else { + startTime = hourFormatter.format(nowTime.minusHours(i)) + ":00"; + endTime = hourFormatter.format(nowTime.minusHours(i - 1)) + ":00"; + } + key = startTime + "-" + endTime; + zoneMap.put(START_TIME, nowDay + startTime + ":00"); + zoneMap.put(END_TIME, nowDay + endTime + ":00"); + timeZoneMap.put(key, zoneMap); + Map map = new HashMap<>(); + if (i == 0) { + //将第一个时间段作为本段查询时间区间的结束(因为是递减) + map.put(END_TIME, nowDay + startTime + ":00"); + timeZoneMap.put(END_TIME, map); + } + if (i == designatedQuantity - 1) { + //将最后一个时间段作为本段查询时间区间的开始(因为是递减) + map.put(START_TIME, nowDay + endTime + ":00"); + timeZoneMap.put(START_TIME, map); + } + } + return timeZoneMap; } } diff --git a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/board/MesWorkCenterBoardResultModel.java b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/board/MesWorkCenterBoardResultModel.java index f447a57..a5a8e8c 100644 --- a/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/board/MesWorkCenterBoardResultModel.java +++ b/modules/i3plus-ext-mes-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pojo/model/board/MesWorkCenterBoardResultModel.java @@ -28,10 +28,10 @@ public class MesWorkCenterBoardResultModel { * 查询产线生产完成率 */ @ApiParam(value = "产线完成数") - private Integer workCenterCompletedQuantity; + private Double workCenterCompletedQuantity; @ApiParam(value = "产线计划数") - private Integer workCenterPlannedQuantity; + private Double workCenterPlannedQuantity; @ApiParam(value = "产线完成率") private Double workCenterCompletionRate; @@ -49,10 +49,10 @@ public class MesWorkCenterBoardResultModel { private String partDescription; @ApiParam(value = "工单完成数") - private Integer workOrderCompletedQuantity; + private Double workOrderCompletedQuantity; @ApiParam(value = "工单计划数") - private Integer workOrderPlannedQuantity; + private Double workOrderPlannedQuantity; @ApiParam(value = "工单一次合格率") private Double workOrderFirstPassRate; @@ -91,6 +91,26 @@ public class MesWorkCenterBoardResultModel { * 查询异常停线时间 */ @ApiParam(value = "异常停机时间") - private Double abnormalDowntime; + private String abnormalDowntime; + + /** + * 查询sql结果 + */ + @ApiParam(value = "过程条码") + private String serialNumber; + + @ApiParam(value = "创建时间") + private String createDateTime; + + @ApiParam(value = "质量状态") + private Integer qcStatus; + + public MesWorkCenterBoardResultModel() { + } + + public MesWorkCenterBoardResultModel(String serialNumber, String createDateTime) { + this.serialNumber = serialNumber; + this.createDateTime = createDateTime; + } }