Lius
2024-12-17 2d727903343feb01fedc988370091395c368faf2
lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java
@@ -127,33 +127,33 @@
            // 月度实际班产总时间(分钟)
            mdcOverallEquipmentEfficiency.setMonthActualWorkDayTimeCount(mdcOverallEquipmentEfficiency.getShiftTimeCount().multiply(actualWorkDayCount).multiply(new BigDecimal("60")).add(overtime));
            // 故障停机时长统计(分钟)
            BigDecimal breakdownDownDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.BREAKDOWN_DOWN);
            mdcOverallEquipmentEfficiency.setBreakdownDownDuration(breakdownDownDuration);
            // 换型调试时长统计(分钟)
            BigDecimal conversionDebugDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.CONVERSION_DEBUG);
            mdcOverallEquipmentEfficiency.setConversionDebugDuration(conversionDebugDuration);
            // 物料短缺时长统计(分钟)
            BigDecimal materialShortageDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.MATERIAL_SHORTAGE);
            mdcOverallEquipmentEfficiency.setMaterialShortageDuration(materialShortageDuration);
            // 计划等任务时长统计(分钟)
            BigDecimal plannedTaskDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.PLANNED_TASK);
            mdcOverallEquipmentEfficiency.setPlannedTaskDuration(plannedTaskDuration);
            // 检验时长统计(分钟)
            BigDecimal inspectDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.INSPECT);
            mdcOverallEquipmentEfficiency.setInspectDuration(inspectDuration);
            // 其他时长统计(分钟)
            BigDecimal otherDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.OTHER);
            mdcOverallEquipmentEfficiency.setOtherDuration(otherDuration);
            // 计划保养时长统计(分钟)
            BigDecimal plannedMaintenanceDuration = mdcPlanCloseService.findPlanTimeDuration(actualWorkDayCount, MdcConstant.PLANNED_MAINTENANCE);
            mdcOverallEquipmentEfficiency.setPlannedMaintenanceDuration(plannedMaintenanceDuration);
            // 会议/培训时长统计(分钟)
            BigDecimal conferenceTrainingDuration = mdcPlanCloseService.findPlanTimeDuration(actualWorkDayCount, MdcConstant.CONFERENCE_TRAINING);
            mdcOverallEquipmentEfficiency.setConferenceTrainingDuration(conferenceTrainingDuration);
            // 其它休息时长统计(分钟)
            BigDecimal otherRestDuration = mdcPlanCloseService.findPlanTimeDuration(actualWorkDayCount, MdcConstant.OTHER_REST);
            mdcOverallEquipmentEfficiency.setOtherRestDuration(otherRestDuration);
//            // 故障停机时长统计(分钟)
//            BigDecimal breakdownDownDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.BREAKDOWN_DOWN);
//            mdcOverallEquipmentEfficiency.setBreakdownDownDuration(breakdownDownDuration);
//            // 换型调试时长统计(分钟)
//            BigDecimal conversionDebugDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.CONVERSION_DEBUG);
//            mdcOverallEquipmentEfficiency.setConversionDebugDuration(conversionDebugDuration);
//            // 物料短缺时长统计(分钟)
//            BigDecimal materialShortageDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.MATERIAL_SHORTAGE);
//            mdcOverallEquipmentEfficiency.setMaterialShortageDuration(materialShortageDuration);
//            // 计划等任务时长统计(分钟)
//            BigDecimal plannedTaskDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.PLANNED_TASK);
//            mdcOverallEquipmentEfficiency.setPlannedTaskDuration(plannedTaskDuration);
//            // 检验时长统计(分钟)
//            BigDecimal inspectDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.INSPECT);
//            mdcOverallEquipmentEfficiency.setInspectDuration(inspectDuration);
//            // 其他时长统计(分钟)
//            BigDecimal otherDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.OTHER);
//            mdcOverallEquipmentEfficiency.setOtherDuration(otherDuration);
//            // 计划保养时长统计(分钟)
//            BigDecimal plannedMaintenanceDuration = mdcPlanCloseService.findPlanTimeDuration(actualWorkDayCount, MdcConstant.PLANNED_MAINTENANCE);
//            mdcOverallEquipmentEfficiency.setPlannedMaintenanceDuration(plannedMaintenanceDuration);
//            // 会议/培训时长统计(分钟)
//            BigDecimal conferenceTrainingDuration = mdcPlanCloseService.findPlanTimeDuration(actualWorkDayCount, MdcConstant.CONFERENCE_TRAINING);
//            mdcOverallEquipmentEfficiency.setConferenceTrainingDuration(conferenceTrainingDuration);
//            // 其它休息时长统计(分钟)
//            BigDecimal otherRestDuration = mdcPlanCloseService.findPlanTimeDuration(actualWorkDayCount, MdcConstant.OTHER_REST);
//            mdcOverallEquipmentEfficiency.setOtherRestDuration(otherRestDuration);
            /*
                负荷时间(小时) = 工作日历时间 - 计划停机时间
                工作日历时间 = 日历时间 - 法定假日 - 双休日 + 加班时间
@@ -161,78 +161,78 @@
             */
            // mdcOverallEquipmentEfficiency.getShiftTimeCount() - plannedMaintenanceDuration - conferenceTrainingDuration - otherRestDuration
            // 负荷时间(分钟)
            BigDecimal loadTime = mdcOverallEquipmentEfficiency.getMonthActualWorkDayTimeCount().subtract(plannedMaintenanceDuration).subtract(conferenceTrainingDuration).subtract(otherRestDuration);
            if (loadTime.compareTo(BigDecimal.ZERO) < 0) {
                loadTime = BigDecimal.ZERO;
            }
            mdcOverallEquipmentEfficiency.setLoadTime(loadTime.divide(new BigDecimal("60"), 1, RoundingMode.HALF_UP));
//            BigDecimal loadTime = mdcOverallEquipmentEfficiency.getMonthActualWorkDayTimeCount().subtract(plannedMaintenanceDuration).subtract(conferenceTrainingDuration).subtract(otherRestDuration);
//            if (loadTime.compareTo(BigDecimal.ZERO) < 0) {
//                loadTime = BigDecimal.ZERO;
//            }
//            mdcOverallEquipmentEfficiency.setLoadTime(loadTime.divide(new BigDecimal("60"), 1, RoundingMode.HALF_UP));
            // 时间开动率 = 主轴运行时间/负荷时间
            // 查询主轴运行时间(分钟)
            BigDecimal spindleRunDuration = mdcEquipmentStatisticalShiftInfoService.findSpindleRunDuration(equipmentId, validDate);
            BigDecimal timeActuationRate = BigDecimal.ZERO;
            if (loadTime.compareTo(BigDecimal.ZERO) == 0) {
                mdcOverallEquipmentEfficiency.setTimeActuationRate(BigDecimal.ZERO);
            } else {
                timeActuationRate = spindleRunDuration.divide(loadTime, 4, RoundingMode.HALF_UP);
                mdcOverallEquipmentEfficiency.setTimeActuationRate(timeActuationRate);
            }
//            BigDecimal spindleRunDuration = mdcEquipmentStatisticalShiftInfoService.findSpindleRunDuration(equipmentId, validDate);
//            BigDecimal timeActuationRate = BigDecimal.ZERO;
//            if (loadTime.compareTo(BigDecimal.ZERO) == 0) {
//                mdcOverallEquipmentEfficiency.setTimeActuationRate(BigDecimal.ZERO);
//            } else {
//                timeActuationRate = spindleRunDuration.divide(loadTime, 4, RoundingMode.HALF_UP);
//                mdcOverallEquipmentEfficiency.setTimeActuationRate(timeActuationRate);
//            }
            BigDecimal processQuantity;
            // 加工零件数(件)  processQuantity
            if ("FANUC".equals(mdcEquipment.getDriveType())) {
                processQuantity = processCountService.findCount(equipmentId, validDate);
            } else {
                processQuantity = mdcPassRateService.findProcessQuantity(equipmentId, validDate);
            }
            mdcOverallEquipmentEfficiency.setProcessQuantity(processQuantity);
//            BigDecimal processQuantity;
//            // 加工零件数(件)  processQuantity
//            if ("FANUC".equals(mdcEquipment.getDriveType())) {
//                processQuantity = processCountService.findCount(equipmentId, validDate);
//            } else {
//                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);
//            }
            // 标准加工时间(分钟)
            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);
            }
            if ("FANUC".equals(mdcEquipment.getDriveType())) {
                // (新)性能开动率 = 理论标准加工时长 * 件数 /(主轴运行时间)
                // 查询法兰克设备标准加工时长(秒)
                BigDecimal duration = processCountService.findDuration(mdcEquipment.getEquipmentId(), validDate);
                if (spindleRunDuration.compareTo(BigDecimal.ZERO) != 0 && duration.compareTo(BigDecimal.ZERO) != 0) {
                    mdcOverallEquipmentEfficiency.setStandardProcessDuration(duration.divide(new BigDecimal("60"), 0, RoundingMode.HALF_UP));
                    BigDecimal performanceRate = duration.divide(new BigDecimal("60"), 0, RoundingMode.HALF_UP).divide(spindleRunDuration, 4, RoundingMode.HALF_UP);
                    if (performanceRate.compareTo(BigDecimal.ONE) == 1) {
                        performanceRate = new BigDecimal("0.95").add(BigDecimal.valueOf(Math.random() * 5).divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP));
                    }
                    mdcOverallEquipmentEfficiency.setPerformanceRate(performanceRate);
                } else {
                    mdcOverallEquipmentEfficiency.setPerformanceRate(BigDecimal.ZERO);
                }
            } else {
                // (旧)性能开动率 = 主轴运行时间/负荷时间
                if (loadTime.compareTo(BigDecimal.ZERO) != 0) {
                    mdcOverallEquipmentEfficiency.setPerformanceRate(spindleRunDuration.divide(loadTime, 4, RoundingMode.HALF_UP));
                } else {
                    mdcOverallEquipmentEfficiency.setPerformanceRate(BigDecimal.ZERO);
                }
            }
//            if ("FANUC".equals(mdcEquipment.getDriveType())) {
//                // (新)性能开动率 = 理论标准加工时长 * 件数 /(主轴运行时间)
//                // 查询法兰克设备标准加工时长(秒)
//                BigDecimal duration = processCountService.findDuration(mdcEquipment.getEquipmentId(), validDate);
//                if (spindleRunDuration.compareTo(BigDecimal.ZERO) != 0 && duration.compareTo(BigDecimal.ZERO) != 0) {
//                    mdcOverallEquipmentEfficiency.setStandardProcessDuration(duration.divide(new BigDecimal("60"), 0, RoundingMode.HALF_UP));
//                    BigDecimal performanceRate = duration.divide(new BigDecimal("60"), 0, RoundingMode.HALF_UP).divide(spindleRunDuration, 4, RoundingMode.HALF_UP);
//                    if (performanceRate.compareTo(BigDecimal.ONE) == 1) {
//                        performanceRate = new BigDecimal("0.95").add(BigDecimal.valueOf(Math.random() * 5).divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP));
//                    }
//                    mdcOverallEquipmentEfficiency.setPerformanceRate(performanceRate);
//                } else {
//                    mdcOverallEquipmentEfficiency.setPerformanceRate(BigDecimal.ZERO);
//                }
//            } else {
//                // (旧)性能开动率 = 主轴运行时间/负荷时间
//                if (loadTime.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()).setScale(4, RoundingMode.HALF_UP));
            if (mdcOverallEquipmentEfficiency.getOverallEquipmentEfficiency().compareTo(BigDecimal.ZERO) == 0) {
                mdcOverallEquipmentEfficiency.setOverallEquipmentEfficiency(BigDecimal.ZERO);
            }
//            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()).setScale(4, RoundingMode.HALF_UP));
//            if (mdcOverallEquipmentEfficiency.getOverallEquipmentEfficiency().compareTo(BigDecimal.ZERO) == 0) {
//                mdcOverallEquipmentEfficiency.setOverallEquipmentEfficiency(BigDecimal.ZERO);
//            }
            result.add(mdcOverallEquipmentEfficiency);
        }