From 094a9290c836827bc1f45fd3549e7cd2ea1e1e45 Mon Sep 17 00:00:00 2001 From: qushaowei <qushaowei@163.com> Date: 星期二, 07 十一月 2023 09:45:36 +0800 Subject: [PATCH] Merge branch 'master' of http://117.34.109.166:18448/r/mdc_430 into develop --- lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java | 187 ++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 187 insertions(+), 0 deletions(-) diff --git a/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java new file mode 100644 index 0000000..c7a87ab --- /dev/null +++ b/lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java @@ -0,0 +1,187 @@ +package org.jeecg.modules.mdc.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.jeecg.modules.mdc.constant.MdcConstant; +import org.jeecg.modules.mdc.entity.MdcEquipment; +import org.jeecg.modules.mdc.entity.MdcOverallEquipmentEfficiency; +import org.jeecg.modules.mdc.entity.MdcStandardProcessDuration; +import org.jeecg.modules.mdc.mapper.MdcOverallEquipmentEfficiencyMapper; +import org.jeecg.modules.mdc.service.*; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.YearMonth; +import java.util.ArrayList; +import java.util.List; + +/** + * @author: LiuS + * @create: 2023-10-18 09:25 + */ +@Service +public class MdcOverallEquipmentEfficiencyServiceImpl extends ServiceImpl<MdcOverallEquipmentEfficiencyMapper, MdcOverallEquipmentEfficiency> implements IMdcOverallEquipmentEfficiencyService { + + @Resource + private IMdcEquipmentService mdcEquipmentService; + + @Resource + private IMdcEquipmentOvertimeService mdcEquipmentOvertimeService; + + @Resource + private IMdcDeviceCalendarService mdcDeviceCalendarService; + + @Resource + private IMdcNoplanCloseService mdcNoplanCloseService; + + @Resource + private IMdcPlanCloseService mdcPlanCloseService; + + @Resource + private IMdcPassRateService mdcPassRateService; + + @Resource + private IMdcStandardProcessDurationService mdcStandardProcessDurationService; + + @Resource + private IMdcEquipmentStatisticalShiftInfoService mdcEquipmentStatisticalShiftInfoService; + + /** + * 璁$畻璁惧缁煎悎鏁堢巼OEE + */ + @Override + public void runningOverallEquipmentEfficiency() { + /* + OEE = 鏃堕棿寮�鍔ㄧ巼 脳 鎬ц兘寮�鍔ㄧ巼 脳 鍚堟牸鍝佺巼 + 鏃堕棿寮�鍔ㄧ巼 = 锛堣礋鑽锋椂闂� - 闈炶鍒掑仠鏈烘椂闂达級 / 璐熻嵎鏃堕棿 脳 100% + 鎬ц兘寮�鍔ㄧ巼 = 鍑�寮�鍔ㄦ椂闂� / 寮�鍔ㄦ椂闂� 脳 100% + 鍚堟牸鍝佺巼 = 鍔犲伐鏁伴噺 - 涓嶅悎鏍兼暟閲� / 鍔犲伐鏁伴噺 + 璐熻嵎鏃堕棿 = 鏃ュ巻宸ヤ綔鏃堕棿 - 璁″垝鍋滄満鏃堕棿 + 闈炶鍒掑仠鏈烘椂闂� = 璐熻嵎鏃堕棿 - 涓昏酱杩愯浆鏃堕棿 + 宸ヤ綔鏃ュ巻鏃堕棿 = 鏃ュ巻鏃堕棿 - 娉曞畾鍋囨棩 - 鍙屼紤鏃� + 鍔犵彮鏃堕棿 + 鍑�寮�鍔ㄦ椂闂� = 鏍囧噯鍔犲伐鏃堕棿 脳 鍔犲伐鏁伴噺 + */ + List<MdcOverallEquipmentEfficiency> result = new ArrayList<>(); + // 鑾峰彇鏈夋晥鏃ユ湡 鏍煎紡 yyyy-MM + String validDate = YearMonth.now().minusMonths(1).toString(); + // 鑾峰彇璁惧鍒楄〃 + List<MdcEquipment> equipmentList = mdcEquipmentService.list(); + for (MdcEquipment mdcEquipment : equipmentList) { + String equipmentId = mdcEquipment.getEquipmentId(); + // 鏌ヨ鐝鍒嗙被 + List<String> shiftSubIdList = mdcDeviceCalendarService.findShiftSort(equipmentId, validDate); + // 鏁呴殰鍋滄満鏃堕暱缁熻(鍒嗛挓) + BigDecimal breakdownDownDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.BREAKDOWN_DOWN); + // 鎹㈠瀷璋冭瘯鏃堕暱缁熻(鍒嗛挓) + BigDecimal conversionDebugDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.CONVERSION_DEBUG); + // 鐗╂枡鐭己鏃堕暱缁熻(鍒嗛挓) + BigDecimal materialShortageDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.MATERIAL_SHORTAGE); + // 璁″垝绛変换鍔℃椂闀跨粺璁�(鍒嗛挓) + BigDecimal plannedTaskDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.PLANNED_TASK); + // 妫�楠屾椂闀跨粺璁�(鍒嗛挓) + BigDecimal inspectDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.INSPECT); + // 鍏朵粬鏃堕暱缁熻(鍒嗛挓) + BigDecimal otherDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.OTHER); + // 璁″垝淇濆吇鏃堕暱缁熻(鍒嗛挓) + BigDecimal plannedMaintenanceDuration = new BigDecimal("0"); + // 浼氳/鍩硅鏃堕暱缁熻(鍒嗛挓) + BigDecimal conferenceTrainingDuration = new BigDecimal("0"); + // 鍏跺畠浼戞伅鏃堕暱缁熻(鍒嗛挓) + BigDecimal otherRestDuration = new BigDecimal("0"); + if (shiftSubIdList != null && !shiftSubIdList.isEmpty()) { + for (String shiftSubId : shiftSubIdList) { + MdcOverallEquipmentEfficiency mdcOverallEquipmentEfficiency = new MdcOverallEquipmentEfficiency(); + // 鏃堕棿寮�鍔ㄧ巼璁$畻 + mdcOverallEquipmentEfficiency.setEquipmentId(equipmentId); + mdcOverallEquipmentEfficiency.setEquipmentName(mdcEquipment.getEquipmentName()); + mdcOverallEquipmentEfficiency.setEquipmentModel(mdcEquipment.getEquipmentModel()); + mdcOverallEquipmentEfficiency.setValidDate(validDate); + // 鐝 鐝鏃堕棿 + mdcOverallEquipmentEfficiency.setShiftSubId(shiftSubId); + BigDecimal shiftTimeCount = mdcDeviceCalendarService.computeShiftTimeCount(shiftSubId, equipmentId, validDate); + mdcOverallEquipmentEfficiency.setShiftTimeCount(shiftTimeCount); + // 璁$畻鍔犵彮鏃堕棿 + BigDecimal overtime = mdcEquipmentOvertimeService.computeOvertime(shiftSubId, equipmentId, validDate); + mdcOverallEquipmentEfficiency.setOvertime(overtime); + // 璁$畻瀹為檯鐝骇澶╂暟 + BigDecimal actualWorkDayCount = mdcDeviceCalendarService.computeActualWorkDayCount(shiftSubId, equipmentId, validDate); + mdcOverallEquipmentEfficiency.setActualWorkDayCount(actualWorkDayCount); + // 鏈堝害瀹為檯鐝骇鎬绘椂闂�(鍒嗛挓) + mdcOverallEquipmentEfficiency.setMonthActualWorkDayTimeCount(mdcOverallEquipmentEfficiency.getShiftTimeCount().add(overtime)); + // 鏁呴殰鍋滄満鏃堕暱缁熻(鍒嗛挓) + mdcOverallEquipmentEfficiency.setBreakdownDownDuration(breakdownDownDuration); + // 鎹㈠瀷璋冭瘯鏃堕暱缁熻(鍒嗛挓) + mdcOverallEquipmentEfficiency.setConversionDebugDuration(conversionDebugDuration); + // 鐗╂枡鐭己鏃堕暱缁熻(鍒嗛挓) + mdcOverallEquipmentEfficiency.setMaterialShortageDuration(materialShortageDuration); + // 璁″垝绛変换鍔℃椂闀跨粺璁�(鍒嗛挓) + mdcOverallEquipmentEfficiency.setPlannedTaskDuration(plannedTaskDuration); + // 妫�楠屾椂闀跨粺璁�(鍒嗛挓) + mdcOverallEquipmentEfficiency.setInspectDuration(inspectDuration); + // 鍏朵粬鏃堕暱缁熻(鍒嗛挓) + mdcOverallEquipmentEfficiency.setOtherDuration(otherDuration); + // 璁″垝淇濆吇鏃堕暱缁熻(鍒嗛挓) + mdcOverallEquipmentEfficiency.setPlannedMaintenanceDuration(plannedMaintenanceDuration); + // 浼氳/鍩硅鏃堕暱缁熻(鍒嗛挓) + mdcOverallEquipmentEfficiency.setConferenceTrainingDuration(conferenceTrainingDuration); + // 鍏跺畠浼戞伅鏃堕暱缁熻(鍒嗛挓) + mdcOverallEquipmentEfficiency.setOtherRestDuration(otherRestDuration); + /* + 璐熻嵎鏃堕棿(灏忔椂) = 宸ヤ綔鏃ュ巻鏃堕棿 - 璁″垝鍋滄満鏃堕棿 + 宸ヤ綔鏃ュ巻鏃堕棿 = 鏃ュ巻鏃堕棿 - 娉曞畾鍋囨棩 - 鍙屼紤鏃� + 鍔犵彮鏃堕棿 + 璁″垝鍋滄満鏃堕棿 = 璁″垝淇濆吇鏃堕暱 + 浼氳/鍩硅鏃堕暱 + 浼氳/鍩硅鏃堕暱 + */ + // mdcOverallEquipmentEfficiency.getShiftTimeCount() - plannedMaintenanceDuration - conferenceTrainingDuration - otherRestDuration + // 璐熻嵎鏃堕棿(鍒嗛挓) + BigDecimal loadTime = mdcOverallEquipmentEfficiency.getShiftTimeCount().subtract(plannedMaintenanceDuration).subtract(conferenceTrainingDuration).subtract(otherRestDuration); + mdcOverallEquipmentEfficiency.setLoadTime(loadTime.divide(new BigDecimal("60"), 1, RoundingMode.HALF_UP)); + // 鏃堕棿寮�鍔ㄧ巼 + BigDecimal timeActuationRate = BigDecimal.ZERO; + if (loadTime.compareTo(BigDecimal.ZERO) == 0) { + mdcOverallEquipmentEfficiency.setTimeActuationRate(BigDecimal.ZERO); + } else { + timeActuationRate = (loadTime.subtract(breakdownDownDuration).subtract(conversionDebugDuration).subtract(materialShortageDuration).subtract(plannedTaskDuration).subtract(inspectDuration).subtract(otherDuration)).divide(loadTime, 4, RoundingMode.HALF_UP); + mdcOverallEquipmentEfficiency.setTimeActuationRate(timeActuationRate); + } + // 鍔犲伐闆朵欢鏁�(浠�) processQuantity + BigDecimal processQuantity = mdcPassRateService.findProcessQuantity(equipmentId, validDate); + mdcOverallEquipmentEfficiency.setProcessQuantity(processQuantity); + // 鏍囧噯鍔犲伐鏃堕棿(鍒嗛挓) + MdcStandardProcessDuration mdcStandardProcessDuration = mdcStandardProcessDurationService.getOne(new LambdaQueryWrapper<MdcStandardProcessDuration>().eq(MdcStandardProcessDuration::getEquipmentId, equipmentId)); + if (mdcStandardProcessDuration != null) { + mdcOverallEquipmentEfficiency.setStandardProcessDuration(new BigDecimal(mdcStandardProcessDuration.getDuration()).multiply(processQuantity)); + } else { + mdcOverallEquipmentEfficiency.setStandardProcessDuration(BigDecimal.ZERO); + } + + // 鎬ц兘寮�鍔ㄧ巼 = 涓昏酱杩愯鏃堕棿/璐熻嵎鏃堕棿 + // 鏌ヨ涓昏酱杩愯鏃堕棿(鍒嗛挓) + BigDecimal spindleRunDuration = mdcEquipmentStatisticalShiftInfoService.findSpindleRunDuration(equipmentId, validDate, shiftSubId); + if (spindleRunDuration.compareTo(BigDecimal.ZERO) != 0) { + mdcOverallEquipmentEfficiency.setPerformanceRate(spindleRunDuration.divide(loadTime, 4, RoundingMode.HALF_UP)); + } else { + mdcOverallEquipmentEfficiency.setPerformanceRate(BigDecimal.ZERO); + } + // 搴熷搧鏁� unqualifiedQuantity + BigDecimal unqualifiedQuantity = mdcPassRateService.findUnqualifiedQuantity(equipmentId, validDate); + mdcOverallEquipmentEfficiency.setUnqualifiedQuantity(unqualifiedQuantity); + // 鍚堟牸鐜� + if (processQuantity.compareTo(BigDecimal.ZERO) == 0) { + mdcOverallEquipmentEfficiency.setPassRate(BigDecimal.ONE); + } else { + mdcOverallEquipmentEfficiency.setPassRate((processQuantity.subtract(unqualifiedQuantity)).divide(processQuantity, 4, RoundingMode.HALF_UP)); + } + // 璁惧缁煎悎鏁堢巼 = 鏃堕棿寮�鍔ㄧ巼 脳 鎬ц兘寮�鍔ㄧ巼 脳 鍚堟牸鍝佺巼 + mdcOverallEquipmentEfficiency.setOverallEquipmentEfficiency(timeActuationRate.multiply(mdcOverallEquipmentEfficiency.getPerformanceRate()).multiply(mdcOverallEquipmentEfficiency.getPassRate())); + if (mdcOverallEquipmentEfficiency.getOverallEquipmentEfficiency().compareTo(BigDecimal.ZERO) == 0) { + mdcOverallEquipmentEfficiency.setOverallEquipmentEfficiency(BigDecimal.ONE); + } + result.add(mdcOverallEquipmentEfficiency); + } + } + } + super.saveBatch(result); + } +} -- Gitblit v1.9.3