From e04184acca8fc0f3c777036582a10bdd03207366 Mon Sep 17 00:00:00 2001 From: jun Date: Wed, 26 Jun 2024 18:58:55 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E5=BC=80=E6=A8=A1=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1job?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/busi/IMesProdMouldStatisticsService.java | 13 ++ .../apiservice/dao/IMesProdMouldStatisticsDao.java | 24 ++++ .../daoimpl/MesProdMouldStatisticsDaoImpl.java | 68 ++++++++++ .../schedulejob/MesProdMouldStatisticsJob.java | 51 +++++++ .../busi/MesProdMouldStatisticsServiceImpl.java | 148 +++++++++++++++++++++ 5 files changed, 304 insertions(+) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdMouldStatisticsService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/dao/IMesProdMouldStatisticsDao.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesProdMouldStatisticsDaoImpl.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProdMouldStatisticsJob.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdMouldStatisticsService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdMouldStatisticsService.java new file mode 100644 index 0000000..1e8c256 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProdMouldStatisticsService.java @@ -0,0 +1,13 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +/** + * @Description : 生产开模统计 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/26 16:32 + * @Modify: + **/ +public interface IMesProdMouldStatisticsService { + + void doSumMesProdMouldStatistics(String organizeCode, Integer pageSize, String userName); +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/dao/IMesProdMouldStatisticsDao.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/dao/IMesProdMouldStatisticsDao.java new file mode 100644 index 0000000..b18ef47 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/dao/IMesProdMouldStatisticsDao.java @@ -0,0 +1,24 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.dao; + +import cn.estsh.i3plus.pojo.mes.bean.MesProdMouldRecord; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +/** + * @Description : 生产开模统计 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/26 15:46 + * @Modify: + **/ +public interface IMesProdMouldStatisticsDao { + + @ApiOperation("查询未统计的开模记录数据") + List findUndStatisticsMesProdMouldRecord(String organizeCode, Integer pageSize); + + + @ApiOperation("更新加工记录表") + int updateMesProductionRecord(List idList, String organizeCode, boolean updateSyncStatus,String userName); + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesProdMouldStatisticsDaoImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesProdMouldStatisticsDaoImpl.java new file mode 100644 index 0000000..443f126 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/daoimpl/MesProdMouldStatisticsDaoImpl.java @@ -0,0 +1,68 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.daoimpl; + +import cn.estsh.i3plus.ext.mes.pcn.apiservice.dao.IMesProdMouldStatisticsDao; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesProdMouldRecord; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import java.util.List; +import java.util.Objects; + +/** + * @Description : 生产开模统计 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/26 15:46 + * @Modify: + **/ +@Service +public class MesProdMouldStatisticsDaoImpl implements IMesProdMouldStatisticsDao { + + @Autowired + private EntityManager entityManager; + + @Override + public List findUndStatisticsMesProdMouldRecord(String organizeCode, Integer pageSize) { + StringBuilder sql = new StringBuilder(); + sql.append(" select pmr from MesMouldMappingCfg mmc left join MesProdMouldRecord pmr on mmc.equipmentCode = pmr.equipmentCode"); + sql.append(" where mmc.organizeCode = :organizeCode and mmc.isDeleted = :isDeleted and mmc.isValid = :isValid "); + sql.append(" and pmr.organizeCode = :organizeCode and pmr.isDeleted = :isDeleted and pmr.isValid = :isValid "); + sql.append(" and (pmr.assetNum is null or pmr.assetNum = '') order by pmr.createDatetime asc"); + Query query = entityManager.createQuery(sql.toString(), MesProdMouldRecord.class); + query.setParameter("organizeCode", organizeCode); + query.setParameter("isValid", CommonEnumUtil.VALID); + query.setParameter("isDeleted", CommonEnumUtil.FALSE); + if (!Objects.isNull(pageSize)) { + query.setFirstResult(MesPcnExtConstWords.ZERO).setMaxResults(pageSize); + } + return query.getResultList(); + } + + @Override + public int updateMesProductionRecord(List idList, String organizeCode, boolean updateSyncStatus, String userName) { + StringBuilder sql = new StringBuilder(); + sql.append(" update MesProductionRecord set moduleStatisticsStatus = :moduleStatisticsStatus,modifyUser = :modifyUser"); + if (updateSyncStatus) { + sql.append(",systemSyncStatus = :systemSyncStatus,modifyDatetime = :modifyDatetime"); + } + sql.append(" where organizeCode = :organizeCode and isDeleted = :isDeleted and isValid = :isValid "); + sql.append(" and id in (:idList) "); + Query query = entityManager.createQuery(sql.toString()); + query.setParameter("organizeCode", organizeCode); + query.setParameter("isValid", CommonEnumUtil.VALID); + query.setParameter("isDeleted", CommonEnumUtil.FALSE); + query.setParameter("ids", idList); + query.setParameter("moduleStatisticsStatus", CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + query.setParameter("modifyUser", userName); + if (updateSyncStatus) { + query.setParameter("systemSyncStatus", CommonEnumUtil.FALSE); + query.setParameter("modifyDatetime", TimeTool.getNowTime(true)); + } + return query.executeUpdate(); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProdMouldStatisticsJob.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProdMouldStatisticsJob.java new file mode 100644 index 0000000..95de35d --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/MesProdMouldStatisticsJob.java @@ -0,0 +1,51 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.schedulejob; + + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProdMouldStatisticsService; +import cn.estsh.i3plus.platform.common.tool.JsonUtilTool; +import cn.estsh.i3plus.pojo.model.wms.WmsJobParamModel; +import cn.estsh.impp.framework.boot.init.ApplicationProperties; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; + +/** + * @Description : 生产开模统计job + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/26 18:22 + * @Modify: + **/ +@Slf4j +@DisallowConcurrentExecution +@Component +@ApiOperation("生产开模统计job") +public class MesProdMouldStatisticsJob extends BaseMesScheduleJob { + + @Autowired + private IMesProdMouldStatisticsService mesProdMouldStatisticsService; + + public MesProdMouldStatisticsJob() { + super(MesProdMouldStatisticsJob.class, "生产开模统计job"); + } + + @Override + public void executeMesJob(JobExecutionContext context, ApplicationProperties applicationProperties) { + List wmsJobParamModelList = JsonUtilTool.toList(this.getJobParam(), WmsJobParamModel.class); + if (!CollectionUtils.isEmpty(wmsJobParamModelList)) { + for (WmsJobParamModel wmsJobParamModel : wmsJobParamModelList) { + long startTime = System.currentTimeMillis(); + mesProdMouldStatisticsService.doSumMesProdMouldStatistics(wmsJobParamModel.getOrganizeCode(), wmsJobParamModel.getPageSize(), "job"); + long endTime = System.currentTimeMillis(); + log.info("工厂{}生产开模统计job --- END --- 耗时: {} ms", wmsJobParamModel.getOrganizeCode(), endTime - startTime); + } + } + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java new file mode 100644 index 0000000..633a66d --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdMouldStatisticsServiceImpl.java @@ -0,0 +1,148 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProdMouldStatisticsService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.dao.IMesProdMouldStatisticsDao; +import cn.estsh.i3plus.mes.pcn.util.DateUtil; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesMouldMappingCfg; +import cn.estsh.i3plus.pojo.mes.bean.MesProdMouldRecord; +import cn.estsh.i3plus.pojo.mes.bean.MesProdMouldStatistics; +import cn.estsh.i3plus.pojo.mes.bean.MesProductionRecord; +import cn.estsh.i3plus.pojo.mes.repository.IMesMouldMappingCfgRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesProdMouldRecordRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesProdMouldStatisticsRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesProductionRecordRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @Description : 生产开模统计 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/26 16:32 + * @Modify: + **/ +@Service +@Slf4j +public class MesProdMouldStatisticsServiceImpl implements IMesProdMouldStatisticsService { + + @Autowired + private IMesProdMouldStatisticsDao mesProdMouldStatisticsDao; + + @Autowired + private IMesMouldMappingCfgRepository mesMouldMappingCfgRDao; + + @Autowired + private MesProductionRecordRepository mesProductionRecordRDao; + + @Autowired + private MesProdMouldRecordRepository mesProdMouldRecordRDao; + + @Autowired + private MesProdMouldStatisticsRepository mesProdMouldStatisticsRDao; + + @Override + public void doSumMesProdMouldStatistics(String organizeCode, Integer pageSize, String userName) { + //查询未统计的开模记录数据 + List undStatisticsMesProdMouldRecordList = mesProdMouldStatisticsDao.findUndStatisticsMesProdMouldRecord(organizeCode, pageSize); + if (CollectionUtils.isEmpty(undStatisticsMesProdMouldRecordList)) { + return; + } + Map> undStatisticsMesProdMouldRecordMap = undStatisticsMesProdMouldRecordList.stream().collect(Collectors.groupingBy(MesProdMouldRecord::getEquipmentCode)); + //查询加工记录表 + Map> productionRecordMap = getProductionRecordMap(organizeCode, undStatisticsMesProdMouldRecordList.stream().map(MesProdMouldRecord::getId).collect(Collectors.toList())); + //数据处理 + List mesProductionRecordList = new ArrayList<>(); + for (MesMouldMappingCfg mesMouldMappingCfg : getMesMouldMappingCfgs(organizeCode, new ArrayList<>(undStatisticsMesProdMouldRecordMap.keySet()))) { + List mesProdMouldRecords = undStatisticsMesProdMouldRecordMap.get(mesMouldMappingCfg.getEquipmentCode()); + //更新开模记录数据 + mesProdMouldRecords.forEach(mesProdMouldRecord -> { + if (!Objects.isNull(productionRecordMap) && productionRecordMap.containsKey(mesProdMouldRecord.getId())) { + mesProductionRecordList.addAll(productionRecordMap.get(mesProdMouldRecord.getId())); + } + mesProdMouldRecord.setAssetNum(mesMouldMappingCfg.getAssetNum()); + mesProdMouldRecord.setMeterName(mesMouldMappingCfg.getMeterName()); + mesProdMouldRecord.setSystemSyncStatus(CommonEnumUtil.FALSE); + ConvertBean.serviceModelUpdate(mesProdMouldRecord, userName); + }); + mesProdMouldRecordRDao.saveAll(mesProdMouldRecords); + //生产开模统计 + saveMesProdMouldStatistics(organizeCode, userName, mesMouldMappingCfg, mesProdMouldRecords); + } + //更新加工记录表状态 + if (!CollectionUtils.isEmpty(mesProductionRecordList)) { + List noUpdateSyncStatusId = mesProductionRecordList.stream().filter(t -> MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue() == t.getReportStatus()).map(MesProductionRecord::getId).collect(Collectors.toList()); + List updateSyncStatusId = mesProductionRecordList.stream().filter(t -> MesExtEnumUtil.REPORT_STATUS.REPORT_STATUS_10.getValue() != t.getReportStatus()).map(MesProductionRecord::getId).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(noUpdateSyncStatusId)) { + mesProdMouldStatisticsDao.updateMesProductionRecord(noUpdateSyncStatusId, organizeCode, false, userName); + } + if (!CollectionUtils.isEmpty(updateSyncStatusId)) { + mesProdMouldStatisticsDao.updateMesProductionRecord(updateSyncStatusId, organizeCode, true, userName); + } + } + } + + private void saveMesProdMouldStatistics(String organizeCode, String userName, MesMouldMappingCfg mesMouldMappingCfg, List mesProdMouldRecords) { + Map> mesProdMouldRecordMap = mesProdMouldRecords.stream().collect(Collectors.groupingBy(t -> TimeTool.parseStringFormat(t.getCreateDatetime(), null, DateUtil.SHORT_FORMAT))); + Map mouldStatisticsMap = getMesProdMouldStatistics(organizeCode, mesMouldMappingCfg.getAssetNum(), mesMouldMappingCfg.getMeterName()); + for (Map.Entry> mesProdMouldRecordEntry : mesProdMouldRecordMap.entrySet()) { + if (Objects.isNull(mouldStatisticsMap) || !mouldStatisticsMap.containsKey(mesProdMouldRecordEntry.getKey())) { + MesProdMouldStatistics mesProdMouldStatistic = new MesProdMouldStatistics(); + mesProdMouldStatistic.setWorkDate(mesProdMouldRecordEntry.getKey()); + mesProdMouldStatistic.setAssetNum(mesMouldMappingCfg.getAssetNum()); + mesProdMouldStatistic.setMeterName(mesMouldMappingCfg.getMeterName()); + mesProdMouldStatistic.setQty(mesProdMouldRecordEntry.getValue().size()); + mesProdMouldStatistic.setOrganizeCode(organizeCode); + ConvertBean.serviceModelInitialize(mesProdMouldStatistic, userName); + mesProdMouldStatisticsRDao.insert(mesProdMouldStatistic); + } else { + MesProdMouldStatistics prodMouldStatistics = mouldStatisticsMap.get(mesProdMouldRecordEntry.getKey()); + prodMouldStatistics.setQty(prodMouldStatistics.getQty() + mesProdMouldRecordEntry.getValue().size()); + prodMouldStatistics.setSystemSyncStatus(CommonEnumUtil.FALSE); + ConvertBean.serviceModelUpdate(prodMouldStatistics, userName); + mesProdMouldStatisticsRDao.update(prodMouldStatistics); + } + } + } + + private Map getMesProdMouldStatistics(String organizeCode, String assetNum, String meterName) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(assetNum, "assetNum", packBean); + DdlPreparedPack.getStringEqualPack(meterName, "meterName", packBean); + List mesProdMouldStatistics = mesProdMouldStatisticsRDao.findByHqlWhere(packBean); + if (!CollectionUtils.isEmpty(mesProdMouldStatistics)) { + return mesProdMouldStatistics.stream().collect(Collectors.toMap(MesProdMouldStatistics::getWorkDate, t -> t)); + } + return null; + } + + private List getMesMouldMappingCfgs(String organizeCode, List equipmentCodeList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(equipmentCodeList, "equipmentCode", packBean); + List mesMouldMappingCfgs = mesMouldMappingCfgRDao.findByHqlWhere(packBean); + return mesMouldMappingCfgs; + } + + private Map> getProductionRecordMap(String organizeCode, List idList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getInPackList(idList, "mouldRecordId", packBean); + List productionRecordList = mesProductionRecordRDao.findByHqlWhere(packBean); + if (!CollectionUtils.isEmpty(productionRecordList)) { + return productionRecordList.stream().collect(Collectors.groupingBy(MesProductionRecord::getMouldRecordId)); + } + return null; + } +}