From 23855599412c4d61b38d78f0f3abd3430a48b5b1 Mon Sep 17 00:00:00 2001 From: zhangherong <571457620@qq.com> Date: 星期三, 25 六月 2025 11:51:38 +0800 Subject: [PATCH] Merge branch 'mdc_hyjs_master' --- lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java | 249 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 249 insertions(+), 0 deletions(-) diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java new file mode 100644 index 0000000..aed617f --- /dev/null +++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOeeInfoServiceImpl.java @@ -0,0 +1,249 @@ +package org.jeecg.modules.mdc.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.modules.mdc.entity.MdcEquipment; +import org.jeecg.modules.mdc.entity.MdcOeeInfo; +import org.jeecg.modules.mdc.mapper.MdcOeeInfoMapper; +import org.jeecg.modules.mdc.service.*; +import org.jeecg.modules.mdc.util.DateUtils; +import org.jeecg.modules.mdc.vo.MdcOeeComputeVo; +import org.jeecg.modules.mdc.vo.MdcOeeInfoVo; +import org.jeecgframework.poi.excel.def.NormalExcelConstants; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.servlet.ModelAndView; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @Description: OEE琛� + * @Author: lius + * @Date: 2024-12-12 + */ +@Service +public class MdcOeeInfoServiceImpl extends ServiceImpl<MdcOeeInfoMapper, MdcOeeInfo> implements IMdcOeeInfoService { + + @Resource + private IMdcEquipmentService mdcEquipmentService; + + @Resource + private IMdcDowntimeService mdcDowntimeService; + + @Resource + private IMdcPartProcessInfoService mdcPartProcessInfoService; + + @Resource + private IMdcEquipmentStatisticalInfoService mdcEquipmentStatisticalInfoService; + + /** + * 鍒嗛〉鍒楄〃 + * + * @param userId + * @param page + * @param mdcOeeInfoVo + * @param req + * @return + */ + @Override + public IPage<MdcOeeInfo> pageList(String userId, Page<MdcOeeInfo> page, MdcOeeInfoVo mdcOeeInfoVo, HttpServletRequest req) { + List<String> equipmentIds = new ArrayList<>(); + if (StringUtils.isNotEmpty(mdcOeeInfoVo.getParentId()) && StringUtils.isEmpty(mdcOeeInfoVo.getEquipmentId())) { + if ("2".equals(mdcOeeInfoVo.getTypeTree())) { + //閮ㄩ棬灞傜骇 + equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, mdcOeeInfoVo.getParentId()); + } else { + //浜х嚎灞傜骇 + equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, mdcOeeInfoVo.getParentId()); + } + } else if (StringUtils.isNotEmpty(mdcOeeInfoVo.getEquipmentId())) { + //鍗曞彴璁惧淇℃伅 + mdcOeeInfoVo.setEquipmentIdList(Collections.singletonList(mdcOeeInfoVo.getEquipmentId())); + } else { + //鏌ヨ鐢ㄦ埛鎷ユ湁鐨勬墍鏈夎澶囦俊鎭� + if ("2".equals(mdcOeeInfoVo.getTypeTree())) { + //閮ㄩ棬灞傜骇 + equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); + } else { + //浜х嚎灞傜骇 + equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); + } + } + + if (mdcOeeInfoVo.getEquipmentIdList() == null || mdcOeeInfoVo.getEquipmentIdList().isEmpty()) { + mdcOeeInfoVo.setEquipmentIdList(equipmentIds); + } + + if (mdcOeeInfoVo.getEquipmentIdList() == null || mdcOeeInfoVo.getEquipmentIdList().isEmpty()) { + return null; + } + return this.baseMapper.pageList(page, mdcOeeInfoVo); + } + + /** + * 瀵煎嚭 + * + * @param userId + * @param mdcOeeInfoVo + * @return + */ + @Override + public ModelAndView exportXls(String userId, MdcOeeInfoVo mdcOeeInfoVo) { + LambdaQueryWrapper<MdcOeeInfo> queryWrapper = new LambdaQueryWrapper<>(); + List<String> equipmentIds = new ArrayList<>(); + if (StringUtils.isNotEmpty(mdcOeeInfoVo.getParentId()) && StringUtils.isEmpty(mdcOeeInfoVo.getEquipmentId())) { + if ("2".equals(mdcOeeInfoVo.getTypeTree())) { + //閮ㄩ棬灞傜骇 + equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, mdcOeeInfoVo.getParentId()); + } else { + //浜х嚎灞傜骇 + equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, mdcOeeInfoVo.getParentId()); + } + } else if (StringUtils.isNotEmpty(mdcOeeInfoVo.getEquipmentId())) { + //鍗曞彴璁惧淇℃伅 + mdcOeeInfoVo.setEquipmentIdList(Collections.singletonList(mdcOeeInfoVo.getEquipmentId())); + } else { + //鏌ヨ鐢ㄦ埛鎷ユ湁鐨勬墍鏈夎澶囦俊鎭� + if ("2".equals(mdcOeeInfoVo.getTypeTree())) { + //閮ㄩ棬灞傜骇 + equipmentIds = mdcEquipmentService.getEquipmentIdsByDepart(userId, null); + } else { + //浜х嚎灞傜骇 + equipmentIds = mdcEquipmentService.getEquipmentIdsProduction(userId, null); + } + } + + if (mdcOeeInfoVo.getEquipmentIdList() == null || mdcOeeInfoVo.getEquipmentIdList().isEmpty()) { + mdcOeeInfoVo.setEquipmentIdList(equipmentIds); + } + + if (mdcOeeInfoVo.getEquipmentIdList() == null || mdcOeeInfoVo.getEquipmentIdList().isEmpty()) { + return null; + } else { + queryWrapper.in(MdcOeeInfo::getEquipmentId, mdcOeeInfoVo.getEquipmentIdList()); + } + if (StringUtils.isNotEmpty(mdcOeeInfoVo.getEquipmentId())) { + queryWrapper.eq(MdcOeeInfo::getEquipmentId, mdcOeeInfoVo.getEquipmentId()); + } + if (StringUtils.isNotEmpty(mdcOeeInfoVo.getStartTime()) && StringUtils.isNotEmpty(mdcOeeInfoVo.getEndTime())) { + queryWrapper.between(MdcOeeInfo::getTheDate, mdcOeeInfoVo.getStartTime(), mdcOeeInfoVo.getEndTime()); + } + queryWrapper.orderByDesc(MdcOeeInfo::getTheDate).orderByDesc(MdcOeeInfo::getEquipmentId); + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + List<MdcOeeInfo> mdcOeeInfos = this.baseMapper.selectList(queryWrapper); + // 瀵煎嚭鏂囦欢鍚嶇О + mv.addObject(NormalExcelConstants.FILE_NAME, "OEE鏁版嵁鍒楄〃"); + mv.addObject(NormalExcelConstants.CLASS, MdcOeeInfo.class); + LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("OEE鏁版嵁鍒楄〃鏁版嵁", "瀵煎嚭浜�:" + user.getRealname(), "OEE鏁版嵁")); + //update-end---author:wangshuai ---date:20211227 for锛歔JTC-116]瀵煎嚭浜哄啓姝讳簡------------ + mv.addObject(NormalExcelConstants.DATA_LIST, mdcOeeInfos); + return mv; + } + + /** + * 璁$畻OEE + * + * @param mdcOeeComputeVo + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void computeOee(MdcOeeComputeVo mdcOeeComputeVo) { + List<MdcOeeInfo> result = new ArrayList<>(); + String startDate = mdcOeeComputeVo.getStartTime(); + String endDate = mdcOeeComputeVo.getEndTime(); + List<String> dateList = DateUtils.getDatesStringList(DateUtils.getShortDate(startDate), DateUtils.getShortDate(endDate)); + if (!dateList.isEmpty()) { + //鑾峰彇璁惧鍒楄〃 + List<MdcEquipment> equipmentList = mdcEquipmentService.list(); + + for (String validDate : dateList) { + try { + this.remove(new LambdaQueryWrapper<MdcOeeInfo>().eq(MdcOeeInfo::getTheDate, validDate)); + } catch (Exception e) { + log.error("鍙傛暟鏍煎紡涓嶅", e); + } + for (MdcEquipment mdcEquipment : equipmentList) { + String equipmentId = mdcEquipment.getEquipmentId(); + MdcOeeInfo mdcOeeInfo = new MdcOeeInfo(); + // 璁惧缂栧彿 + mdcOeeInfo.setEquipmentId(equipmentId); + // 璁$畻鏃ユ湡 + mdcOeeInfo.setTheDate(validDate); + // 宸ヤ綔鏃ュ巻鏃堕棿(min) --- 鎸夋瘡澶�24灏忔椂绠� + mdcOeeInfo.setCalendarLong(1440); + // 璁″垝鍋滄満鏃堕棿(min) --- 鎸夌淮鎶ゆ暟鎹粺璁″綋澶╂�绘椂闀� + Integer planCloseLong = mdcDowntimeService.findPlanTimeDuration(equipmentId, validDate, CommonConstant.CLOSE_TYPE_0); + mdcOeeInfo.setPlanCloseLong(planCloseLong); + // 璐熻嵎鏃堕棿(min) --- 鏃ュ巻宸ヤ綔鏃堕棿-璁″垝鍋滄満鏃堕棿 + Integer loadLong = mdcOeeInfo.getCalendarLong() - planCloseLong; + mdcOeeInfo.setLoadLong(loadLong); + // 闈炶鍒掑仠鏈烘椂闂�(min) --- 鎸夌淮鎶ゆ暟鎹粺璁″綋澶╂�绘椂闀� + Integer noPlanCloseLong = mdcDowntimeService.findPlanTimeDuration(equipmentId, validDate, CommonConstant.CLOSE_TYPE_1); + mdcOeeInfo.setNoplanCloseLong(noPlanCloseLong); + // 寮�鍔ㄦ椂闂�(min) --- 璐熻嵎鏃堕棿-闈炶鍒掑仠鏈烘椂闂� + int actuateLong = loadLong - noPlanCloseLong; + mdcOeeInfo.setActuateLong(actuateLong); + // 鏃堕棿寮�鍔ㄧ巼 --- 寮�鍔ㄦ椂闂�/璐熻嵎鏃堕棿 + BigDecimal timeActuationRate = new BigDecimal(actuateLong).divide(new BigDecimal(loadLong), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + mdcOeeInfo.setTimeActuationRate(timeActuationRate); + // 鏈夋晥杩愯鏃堕棿 --- 鎸夐渶姹傜淮鎶ら浂浠跺姞宸ユ�绘椂闀縷|绯荤粺涓昏酱璐熻浇鏃堕棿 + Integer effectiveRunLong = 0; +// Integer totalProcessLong = mdcPartProcessInfoService.selectTotalProcessLong(equipmentId, validDate); + effectiveRunLong = mdcEquipmentStatisticalInfoService.selectProcessLong(equipmentId, validDate.replace("-", "")); + if (effectiveRunLong == null) { + effectiveRunLong = 0; + } + mdcOeeInfo.setEffectiveRunLong(effectiveRunLong); + // 鎬ц兘寮�鍔ㄧ巼 --- 鏈夋晥杩愯鏃堕棿/寮�鍔ㄦ椂闂� + BigDecimal performanceRate = BigDecimal.ZERO; + if (effectiveRunLong != 0 && actuateLong != 0) { + performanceRate = new BigDecimal(effectiveRunLong).divide(new BigDecimal(actuateLong), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + } + mdcOeeInfo.setPerformanceRate(performanceRate.compareTo(new BigDecimal(100)) > 0 ? new BigDecimal(100) : performanceRate); + // 鍔犲伐闆朵欢鏁伴噺 --- 鎸夌淮鎶ゆ暟鎹粺璁″綋澶� + Integer processCount = mdcPartProcessInfoService.selectTotalProcessCount(equipmentId, validDate); + mdcOeeInfo.setProcessCount(processCount); + // 鍚堟牸闆朵欢鏁伴噺 --- 鎸夌淮鎶ゆ暟鎹粺璁″綋澶� + Integer passCount = mdcPartProcessInfoService.selectTotalPassCount(equipmentId, validDate); + mdcOeeInfo.setPassCount(passCount); + // 鍚堟牸鐜� --- 鍚堟牸鏁�/鍔犲伐鏁� + BigDecimal passRate = new BigDecimal("100"); + if (processCount != 0 && passCount != 0) { + passRate = new BigDecimal(passCount).divide(new BigDecimal(processCount), 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP); + } + mdcOeeInfo.setPassRate(passRate); + // OEE --- 鏃堕棿寮�鍔ㄧ巼 * 鎬ц兘寮�鍔ㄧ巼 * 涓�娆″悎鏍肩巼 + BigDecimal oee = BigDecimal.ZERO; + if (!timeActuationRate.equals(BigDecimal.ZERO) && !performanceRate.equals(BigDecimal.ZERO) && !passRate.equals(BigDecimal.ZERO)) { + oee = timeActuationRate.multiply(performanceRate).multiply(passRate).divide(new BigDecimal("10000"), 4, RoundingMode.HALF_UP); + } + mdcOeeInfo.setOee(oee); + result.add(mdcOeeInfo); + } + } + } + super.saveBatch(result); + } + + @Override + public BigDecimal findByEquIdAndMonth(List<String> equipmentIdList, String month) { + return this.baseMapper.findByEquIdAndMonth(equipmentIdList, month); + } + +} -- Gitblit v1.9.3