diff --git a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesDowntimeRecordService.java b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesDowntimeRecordService.java index ee1daaa..4dd4dd8 100644 --- a/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesDowntimeRecordService.java +++ b/modules/i3plus-ext-mes-api/src/main/java/cn/estsh/i3plus/ext/mes/api/base/IMesDowntimeRecordService.java @@ -1,8 +1,11 @@ package cn.estsh.i3plus.ext.mes.api.base; +import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.mes.bean.MesDowntimeRecord; import cn.estsh.i3plus.pojo.mes.bean.MesEquipment; +import cn.estsh.i3plus.pojo.mes.model.report.MesDowntimeRecordResModel; import java.util.List; @@ -20,4 +23,6 @@ public interface IMesDowntimeRecordService extends IBaseMesService mesEquipmentList); + + ListPager queryRecordList(MesDowntimeRecord downtimeRecord, Pager pager); } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/TestController.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/TestController.java index 1dd91c9..52024b2 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/TestController.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/controller/busi/TestController.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.apiservice.controller.busi; import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesAccountJob; +import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesDowntimeRecordJob; import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesGenerateAccountJob; import cn.estsh.i3plus.ext.mes.apiservice.schedulejob.MesWorkOrderUpdateQtyJob; import io.swagger.annotations.ApiOperation; @@ -23,6 +24,9 @@ public class TestController { @Autowired private MesGenerateAccountJob mesGenerateAccountJob; + @Autowired + private MesDowntimeRecordJob mesDowntimeRecordJob; + @GetMapping("/reportOrder") @ApiOperation(value = "报工") public void reportOrder() { @@ -40,4 +44,11 @@ public class TestController { public void generateMesAccount() { mesGenerateAccountJob.executeMesJob(null, null); } + + + @GetMapping("/mesDowntimeRecordJob") + @ApiOperation(value = "downtime") + public void mesDowntimeRecordJob() { + mesDowntimeRecordJob.executeMesJob(null, null); + } } 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 e71a2bb..ff543c0 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 @@ -1,13 +1,17 @@ package cn.estsh.i3plus.ext.mes.apiservice.controller.report; +import cn.estsh.i3plus.ext.mes.api.base.IMesDowntimeRecordService; import cn.estsh.i3plus.ext.mes.api.base.IMesProductionRecordService; import cn.estsh.i3plus.ext.mes.api.busi.report.IMesYfReportService; 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.MesDowntimeRecord; import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; import cn.estsh.i3plus.pojo.mes.model.MesProductionRecordModel; +import cn.estsh.i3plus.pojo.mes.model.report.MesDowntimeRecordResModel; import cn.estsh.i3plus.pojo.mes.model.report.MesProductAccountModel; import cn.estsh.i3plus.pojo.mes.model.report.MesProductAccountResModel; import cn.estsh.impp.framework.base.controller.MesBaseController; @@ -44,6 +48,9 @@ public class MesBusiReportController extends MesBaseController { @Autowired private IMesProductionRecordService mesProductionRecordService; + @Autowired + private IMesDowntimeRecordService mesDowntimeRecordService; + @ApiOperation(value = "查询追溯报表", notes = "查询追溯报表") @GetMapping("/traceability/find") public ResultBean findTraceabilityReport(MesProduceSn mesProduceSn) { @@ -125,4 +132,20 @@ public class MesBusiReportController extends MesBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + + @ApiOperation(value = "设备停机记录报表", notes = "设备停机记录报表") + @GetMapping("/equipment/downtime/record") + public ResultBean downtimeRecord(MesDowntimeRecord mesDowntimeRecord, Pager pager) { + try { + + ListPager recordList = mesDowntimeRecordService.queryRecordList(mesDowntimeRecord, pager); + + return ResultBean.success("查询成功").setListPager(recordList); + } catch (ImppBusiException e) { + return ResultBean.fail(e); + } catch (Exception e) { + e.printStackTrace(); + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } } diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesDowntimeRecordJob.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesDowntimeRecordJob.java index b502188..813e71d 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesDowntimeRecordJob.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/schedulejob/MesDowntimeRecordJob.java @@ -21,6 +21,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.List; @@ -34,6 +35,7 @@ import java.util.List; **/ @DisallowConcurrentExecution @ApiOperation("MES设备生产停机记录") +@Service public class MesDowntimeRecordJob extends BaseMesScheduleJob { public static final Logger LOGGER = LoggerFactory.getLogger(MesDowntimeRecordJob.class); @@ -60,9 +62,9 @@ public class MesDowntimeRecordJob extends BaseMesScheduleJob { public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) { try { String jobParam = this.getJobParam(); - + //String jobParam = "CK01"; if (StringUtils.isBlank(jobParam)) { - throw new IllegalArgumentException("job参数为空,请检查参数"); + jobParam = "CK01"; } String[] organizeCodeList = jobParam.split(","); LOGGER.info("MES设备生产停机记录 -----start"); diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesDowntimeRecordServiceImpl.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesDowntimeRecordServiceImpl.java index 6d209d0..1cee1fc 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesDowntimeRecordServiceImpl.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesDowntimeRecordServiceImpl.java @@ -2,31 +2,37 @@ package cn.estsh.i3plus.ext.mes.apiservice.serviceimpl.base; import cn.estsh.i3plus.ext.mes.api.base.IMesConfigService; import cn.estsh.i3plus.ext.mes.api.base.IMesDowntimeRecordService; +import cn.estsh.i3plus.ext.mes.apiservice.utils.BeanUtil; import cn.estsh.i3plus.ext.mes.pojo.util.MesExtConstWords; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.i3plus.platform.common.tool.TimeTool; import cn.estsh.i3plus.platform.common.util.MesConstWords; import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.common.Pager; 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.*; -import cn.estsh.i3plus.pojo.mes.repository.MesDowntimeRecordRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesWcEquipmentRepository; +import cn.estsh.i3plus.pojo.mes.model.report.MesDowntimeRecordResModel; +import cn.estsh.i3plus.pojo.mes.repository.*; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ValidatorBean; +import cn.hutool.core.stream.CollectorUtil; +import com.codepoetics.protonpack.collectors.CollectorUtils; +import com.xxl.job.core.util.DateUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.map.HashedMap; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.stream.Collectors; /** @@ -46,10 +52,26 @@ public class MesDowntimeRecordServiceImpl extends BaseMesService mesDowntimeRecordDaoList = mesDowntimeRecordRDao.findByHqlTopWhere(ddlPackBeanDowntime, 1); + if (CollectionUtils.isEmpty(mesDowntimeRecordDaoList)) { MesWcEquipment wcEquipmentDbList = wcEquipmentRepository.getByProperty( - new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID,""}, + new String[]{MesConstWords.ORGANIZE_CODE, MesConstWords.IS_DELETED, MesConstWords.IS_VALID,"equipmentCode"}, new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), mesEquipment.getEquipmentCode()}); //新增设备停机记录 @@ -134,6 +158,8 @@ public class MesDowntimeRecordServiceImpl extends BaseMesService queryRecordList(MesDowntimeRecord downtimeRecord, Pager pager) { + ListPager pagerList = new ListPager(); + List list = new ArrayList<>(); + + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + if (!StringUtils.isEmpty(downtimeRecord.getEquipmentCode())) { + DdlPreparedPack.getStringEqualPack(downtimeRecord.getEquipmentCode(), "equipmentCode", ddlPackBean); + } + if (!StringUtils.isEmpty(downtimeRecord.getWorkCenterCode())) { + DdlPreparedPack.getStringEqualPack(downtimeRecord.getWorkCenterCode(), "workCenterCode", ddlPackBean); + } + if (!StringUtils.isEmpty(downtimeRecord.getWorkCellCode())) { + DdlPreparedPack.getStringEqualPack(downtimeRecord.getWorkCellCode(), "workCellCode", ddlPackBean); + } + DdlPreparedPack.getStringEqualPack(downtimeRecord.getReasonTypeCode(),"reasonTypeCode", ddlPackBean); + if (!StringUtils.isEmpty(downtimeRecord.getCreateDatetime())) { + DdlPreparedPack.getStringBiggerPack(downtimeRecord.getCreateDatetime(), "createDatetime", ddlPackBean); + } + if (!StringUtils.isEmpty(downtimeRecord.getModifyDatetime())) { + DdlPreparedPack.getStringBiggerPack(downtimeRecord.getModifyDatetime(), "modifyDatetime", ddlPackBean); + } + + List recordList = mesDowntimeRecordRDao.findByHqlWherePage(ddlPackBean, pager); + if (!CollectionUtils.isEmpty(recordList)) { + List reasonCodeList = recordList.stream().map(MesDowntimeRecord::getReasonCode).distinct().collect(Collectors.toList()); + List reasonTypeCodeList = recordList.stream().map(MesDowntimeRecord::getReasonTypeCode).distinct().collect(Collectors.toList()); + List equipmentInfoList = recordList.stream().map(MesDowntimeRecord::getEquipmentCode).distinct().collect(Collectors.toList()); + List workCellList = recordList.stream().map(MesDowntimeRecord::getWorkCellCode).distinct().collect(Collectors.toList()); + List workCenterList = recordList.stream().map(MesDowntimeRecord::getWorkCenterCode).distinct().collect(Collectors.toList()); + + + Map> reasonMap = getReason(reasonCodeList); + Map equipmentMap = getEquipment(equipmentInfoList); + Map workCenterMap = getWorkCenter(workCenterList); + Map workCellMap = getWorkCell(workCellList); + Map> reasonTypeMap = getReasonType(reasonTypeCodeList); + + + recordList.stream().forEach(record -> { + MesDowntimeRecordResModel mesDowntimeRecordResModel = new MesDowntimeRecordResModel(); + BeanUtils.copyProperties(record, mesDowntimeRecordResModel); + if (!StringUtils.isEmpty(record.getReasonCode())) { + if (reasonMap.get(record.getReasonCode()) != null) { + mesDowntimeRecordResModel.setReasonName(reasonMap.get(record.getReasonCode()).get(0).getReasonName()); + } + } + if (!StringUtils.isEmpty(record.getReasonTypeCode())) { + if (reasonTypeMap.get(record.getReasonTypeCode()) != null) { + mesDowntimeRecordResModel.setReasonTypeName(reasonTypeMap.get(record.getReasonTypeCode()).get(0).getReasonTypeName()); + } + } + if (!StringUtils.isEmpty(record.getEquipmentCode())) { + mesDowntimeRecordResModel.setEquipmentName(equipmentMap.get(record.getEquipmentCode()).getEquipmentName()); + } + if (!StringUtils.isEmpty(record.getWorkCenterCode())) { + mesDowntimeRecordResModel.setWorkCenterName(workCenterMap.get(record.getWorkCenterCode()).getWorkCenterName()); + } + if (!StringUtils.isEmpty(record.getWorkCellCode())) { + mesDowntimeRecordResModel.setWorkCellName(workCellMap.get(record.getWorkCellCode()).getWorkCellName()); + } + // 如果停机结束时间还在,则需要补充动态停机时间,否则需要有停机时间 + if (StringUtils.isEmpty(mesDowntimeRecordResModel.getModifyDatetime())) { + Date startTime = DateUtil.parseDateTime(mesDowntimeRecordResModel.getCreateDatetime()); + Date currentTime = new Date(); + Long time = (currentTime.getTime() - startTime.getTime())/1000; + mesDowntimeRecordResModel.setCurrentDownTime(time.intValue()); + } else { + Date startTime = DateUtil.parseDateTime(mesDowntimeRecordResModel.getCreateDatetime()); + Date endTime = DateUtil.parseDateTime(mesDowntimeRecordResModel.getModifyDatetime()); + Long time = (endTime.getTime() - startTime.getTime())/1000; + mesDowntimeRecordResModel.setDownTime(time.intValue()); + } + list.add(mesDowntimeRecordResModel); + }); + } + + pagerList.setObjectList(list); + pagerList.setObjectPager(pager); + return pagerList; + } + + private Map> getReason(List reasonCodeList) { + Map> reasonMap = new HashedMap(); + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getInPackList(reasonCodeList, "reasonCode", ddlPackBean); + + List downtimeReasons = downtimeReasonRepository.findByHqlWhere(ddlPackBean); + if (!CollectionUtils.isEmpty(downtimeReasons)) { + reasonMap = downtimeReasons.stream().distinct().collect(Collectors.groupingBy(MesDowntimeReason::getReasonCode)); + } + return reasonMap; + + } + + private Map> getReasonType(List reasonTypeCodeList) { + Map> reasonMap = new HashedMap(); + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getInPackList(reasonTypeCodeList, "reasonTypeCode", ddlPackBean); + + List downtimeReasonTypes = downtimeReasonTypeRepository.findByHqlWhere(ddlPackBean); + if (!CollectionUtils.isEmpty(downtimeReasonTypes)) { + reasonMap = downtimeReasonTypes.stream().collect(Collectors.groupingBy(MesDowntimeReasonType::getReasonTypeCode)); + } + return reasonMap; + + } + + private Map getEquipment(List equipmentList) { + Map equipmentMap = new HashedMap(); + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getInPackList(equipmentList, "equipmentCode", ddlPackBean); + + List equipments = equipmentRepository.findByHqlWhere(ddlPackBean); + if (!CollectionUtils.isEmpty(equipments)) { + equipmentMap = equipments.stream().collect(Collectors.toMap(MesEquipment::getEquipmentCode, m -> m)); + } + return equipmentMap; + + } + + private Map getWorkCenter(List workCenterList) { + Map workCenterMap = new HashedMap(); + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getInPackList(workCenterList, "workCenterCode", ddlPackBean); + + List workCenters = workCenterRepository.findByHqlWhere(ddlPackBean); + if (!CollectionUtils.isEmpty(workCenters)) { + workCenterMap = workCenters.stream().collect(Collectors.toMap(MesWorkCenter::getWorkCenterCode, m -> m)); + } + return workCenterMap; + } + + private Map getWorkCell(List equipmentList) { + Map workCellMap = new HashedMap(); + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getInPackList(equipmentList, "workCellCode", ddlPackBean); + List workCells = workCellRepository.findByHqlWhere(ddlPackBean); + if (!CollectionUtils.isEmpty(workCells)) { + workCellMap = workCells.stream().collect(Collectors.toMap(MesWorkCell::getWorkCellCode, m -> m)); } + return workCellMap; } /** diff --git a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesPartTransferDetailService.java b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesPartTransferDetailService.java index 5e6e50c..457af13 100644 --- a/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesPartTransferDetailService.java +++ b/modules/i3plus-ext-mes-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/apiservice/serviceimpl/base/MesPartTransferDetailService.java @@ -30,7 +30,7 @@ public class MesPartTransferDetailService extends BaseMesService