lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/entity/MdcOverallEquipmentEfficiency.java
@@ -59,126 +59,126 @@ */ @Excel(name = "每班小时", width = 15) @ApiModelProperty(value = "每班小时") private BigDecimal shiftTimeCount; private BigDecimal shiftTimeCount = BigDecimal.ZERO; /** * 加班时间 */ @Excel(name = "加班时间", width = 15) @ApiModelProperty(value = "加班时间") private BigDecimal overtime; private BigDecimal overtime = BigDecimal.ZERO; /** * 实际班产天数 */ @Excel(name = "实际班产天数", width = 15) @ApiModelProperty(value = "实际班产天数") private BigDecimal actualWorkDayCount; private BigDecimal actualWorkDayCount = BigDecimal.ZERO; /** * 月度实际班产总时间 */ @Excel(name = "月度实际班产总时间", width = 15) @ApiModelProperty(value = "月度实际班产总时间") private BigDecimal monthActualWorkDayTimeCount; private BigDecimal monthActualWorkDayTimeCount = BigDecimal.ZERO; /** * 故障停机时长(分钟) */ @Excel(name = "故障停机时长", width = 15) @ApiModelProperty(value = "故障停机时长(分钟)") private BigDecimal breakdownDownDuration; private BigDecimal breakdownDownDuration = BigDecimal.ZERO; /** * 换型调试时长(分钟) */ @Excel(name = "换型调试时长(分钟)", width = 15) @ApiModelProperty(value = "换型调试时长(分钟)") private BigDecimal conversionDebugDuration; private BigDecimal conversionDebugDuration = BigDecimal.ZERO; /** * 物料短缺时长(分钟) */ @Excel(name = "物料短缺时长(分钟)", width = 15) @ApiModelProperty(value = "物料短缺时长(分钟)") private BigDecimal materialShortageDuration; private BigDecimal materialShortageDuration = BigDecimal.ZERO; /** * 计划等任务(分钟) */ @Excel(name = "计划等任务(分钟)", width = 15) @ApiModelProperty(value = "计划等任务(分钟)") private BigDecimal plannedTaskDuration; private BigDecimal plannedTaskDuration = BigDecimal.ZERO; /** * 检验(分钟) */ @Excel(name = "检验(分钟)", width = 15) @ApiModelProperty(value = "检验(分钟)") private BigDecimal inspectDuration; private BigDecimal inspectDuration = BigDecimal.ZERO; /** * 其他(分钟) */ @Excel(name = "其他(分钟)", width = 15) @ApiModelProperty(value = "其他(分钟)") private BigDecimal otherDuration; private BigDecimal otherDuration = BigDecimal.ZERO; /** * 计划保养 */ @Excel(name = "计划保养", width = 15) @ApiModelProperty(value = "计划保养") private BigDecimal plannedMaintenanceDuration; private BigDecimal plannedMaintenanceDuration = BigDecimal.ZERO; /** * 会议培训时长 */ @Excel(name = "会议培训时长", width = 15) @ApiModelProperty(value = "会议培训时长") private BigDecimal conferenceTrainingDuration; private BigDecimal conferenceTrainingDuration = BigDecimal.ZERO; /** * 其他休息时长 */ @Excel(name = "其他休息时长", width = 15) @ApiModelProperty(value = "其他休息时长") private BigDecimal otherRestDuration; private BigDecimal otherRestDuration = BigDecimal.ZERO; /** * 负荷时间 */ @Excel(name = "负荷时间", width = 15) @ApiModelProperty(value = "负荷时间") private BigDecimal loadTime; private BigDecimal loadTime = BigDecimal.ZERO; /** * 时间开动率 */ @Excel(name = "时间开动率", width = 15) @ApiModelProperty(value = "时间开动率") private BigDecimal timeActuationRate; private BigDecimal timeActuationRate = BigDecimal.ZERO; /** * 加工零件数 */ @Excel(name = "加工零件数", width = 15) @ApiModelProperty(value = "加工零件数") private BigDecimal processQuantity; private BigDecimal processQuantity = BigDecimal.ZERO; /** * 标准加工时间(分钟) */ @Excel(name = "标准加工时间(分钟)", width = 15) @ApiModelProperty(value = "标准加工时间(分钟)") private BigDecimal standardProcessDuration; private BigDecimal standardProcessDuration = BigDecimal.ZERO; /** * 性能开动率 */ @Excel(name = "性能开动率", width = 15) @ApiModelProperty(value = "性能开动率") private BigDecimal performanceRate; private BigDecimal performanceRate = BigDecimal.ZERO; /** * 废品数 */ @Excel(name = "废品数", width = 15) @ApiModelProperty(value = "废品数") private BigDecimal unqualifiedQuantity; private BigDecimal unqualifiedQuantity = BigDecimal.ZERO; /** * 合格率 */ @Excel(name = "合格率", width = 15) @ApiModelProperty(value = "合格率") private BigDecimal passRate; private BigDecimal passRate = BigDecimal.ONE; /** * 设备综合效率 */ @Excel(name = "设备综合效率", width = 15) @ApiModelProperty(value = "设备综合效率") private BigDecimal overallEquipmentEfficiency; private BigDecimal overallEquipmentEfficiency = BigDecimal.ONE; } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/job/RunningOverallEquipmentEfficiencyJob.java
@@ -25,6 +25,15 @@ @Slf4j public class RunningOverallEquipmentEfficiencyJob implements Job { /** * 若参数变量名修改 QuartzJobController中也需对应修改 时间: yyyyMMdd 例: 20230414 */ private String parameter; public void setParameter(String parameter) { this.parameter = parameter; } @Resource private IQuartzJobService quartzJobService; @@ -45,10 +54,11 @@ if (byJobClassName != null && !byJobClassName.isEmpty()) { quartzLog.setJobId(byJobClassName.get(0).getId()); } log.info("定时计算设备综合效率OEE任务 RunningOverallEquipmentEfficiencyJob start! 时间:" + DateUtils.now()); quartzLog.setParams(this.parameter); log.info("定时计算设备综合效率OEE任务 RunningOverallEquipmentEfficiencyJob start! 时间:" + DateUtils.now(), this.parameter); long startTime = System.currentTimeMillis(); try { mdcOverallEquipmentEfficiencyService.runningOverallEquipmentEfficiency(); mdcOverallEquipmentEfficiencyService.runningOverallEquipmentEfficiency(this.parameter); quartzLog.setIsSuccess(0); } catch (Exception e) { quartzLog.setIsSuccess(-1); lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/MdcProcessCountMapper.java
@@ -8,6 +8,8 @@ import org.jeecg.modules.mdc.entity.MdcProcessCount; import org.jeecg.modules.mdc.vo.MdcProcessCountVo; import java.math.BigDecimal; /** * @author Lius * @date 2023/11/27 11:07 @@ -23,4 +25,7 @@ * @return */ IPage<MdcProcessCountDto> pageList(Page<MdcProcessCountDto> page, @Param("mdcProcessCountVo") MdcProcessCountVo mdcProcessCountVo); BigDecimal findDuration(@Param("equipmentId") String equipmentId, @Param("validDate") String validDate); } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcOverallEquipmentEfficiencyMapper.xml
@@ -38,6 +38,7 @@ t1.update_time FROM mdc_overall_equipment_efficiency t1 LEFT JOIN mdc_equipment t2 ON t1.equipment_id = t2.equipment_id <where> <if test="mdcOverallEquipmentEfficiency.startTime != null and mdcOverallEquipmentEfficiency.startTime != '' and mdcOverallEquipmentEfficiency.endTime != null and mdcOverallEquipmentEfficiency.endTime != ''"> AND t1.valid_date BETWEEN #{ mdcOverallEquipmentEfficiency.startTime } AND #{ mdcOverallEquipmentEfficiency.endTime } @@ -48,6 +49,9 @@ #{ id } </foreach> </if> <if test="mdcOverallEquipmentEfficiency.driveType != null and mdcOverallEquipmentEfficiency.driveType != ''"> AND t2.drive_type = #{ mdcOverallEquipmentEfficiency.driveType } </if> </where> </select> </mapper> lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/mapper/xml/MdcProcessCountMapper.xml
@@ -44,4 +44,13 @@ t1.the_date, t1.sequence_number </select> <select id="findDuration" resultType="java.math.BigDecimal"> SELECT SUM( duration ) FROM mdc_process_count WHERE equipment_id = #{ equipmentId } AND the_date LIKE CONCAT(#{ validDate }, '%') </select> </mapper> lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IMdcOverallEquipmentEfficiencyService.java
@@ -17,7 +17,7 @@ /** * 计算设备综合效率OEE */ void runningOverallEquipmentEfficiency(); void runningOverallEquipmentEfficiency(String dateTime); /** * 分页列表查询 lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/IProcessCountService.java
@@ -8,6 +8,7 @@ import org.jeecg.modules.mdc.vo.MdcProcessCountVo; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; /** * @author Lius @@ -31,4 +32,5 @@ */ IPage<MdcProcessCountDto> pageList(String userId, Page<MdcProcessCountDto> page, MdcProcessCountVo mdcProcessCountVo, HttpServletRequest req); BigDecimal findDuration(String equipmentId, String validDate); } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcDeviceCalendarServiceImpl.java
@@ -165,6 +165,7 @@ */ @Override public BigDecimal computeShiftTimeCount(String equipmentId, String validDate) { validDate = validDate.replaceAll("-", ""); Integer shiftCount = this.baseMapper.computeShiftTimeCount(equipmentId, validDate); return new BigDecimal(shiftCount).multiply(new BigDecimal("8")).multiply(new BigDecimal("60")); } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcEquipmentOvertimeServiceImpl.java
@@ -138,7 +138,7 @@ */ @Override public BigDecimal computeOvertime(String equipmentId, String validDate) { List<MdcEquipmentOvertime> list = this.baseMapper.computeOvertime(equipmentId, validDate); List<MdcEquipmentOvertime> list = this.baseMapper.computeOvertime(equipmentId, validDate.replaceAll("-", "")); BigDecimal result = new BigDecimal("0"); if (list != null && !list.isEmpty()) { for (MdcEquipmentOvertime equipmentOvertime : list) { lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcOverallEquipmentEfficiencyServiceImpl.java
@@ -11,6 +11,7 @@ import org.jeecg.modules.mdc.entity.MdcStandardProcessDuration; import org.jeecg.modules.mdc.mapper.MdcOverallEquipmentEfficiencyMapper; import org.jeecg.modules.mdc.service.*; import org.jeecg.modules.mdc.util.DateUtils; import org.jeecg.modules.mdc.vo.MdcOverallEquipmentEfficiencyVo; import org.springframework.stereotype.Service; @@ -54,11 +55,14 @@ @Resource private IMdcEquipmentStatisticalShiftInfoService mdcEquipmentStatisticalShiftInfoService; @Resource private IProcessCountService processCountService; /** * 计算设备综合效率OEE */ @Override public void runningOverallEquipmentEfficiency() { public void runningOverallEquipmentEfficiency(String dateTime) { /* OEE = 时间开动率 × 性能开动率 × 合格品率 时间开动率 = (负荷时间 - 非计划停机时间) / 负荷时间 × 100% @@ -72,7 +76,19 @@ List<MdcOverallEquipmentEfficiency> result = new ArrayList<>(); // 获取有效日期 格式 yyyy-MM String validDate = YearMonth.now().minusMonths(1).toString(); if (StringUtils.isNotBlank(dateTime)) { validDate = DateUtils.format(DateUtils.toDate(dateTime, "yyyyMM"), DateUtils.STR_YEAR_MONTH); try { if (validDate != null) { this.remove(new LambdaQueryWrapper<MdcOverallEquipmentEfficiency>(). eq(MdcOverallEquipmentEfficiency::getValidDate, validDate)); } } catch (Exception e) { log.error("参数格式不对", e); } } // 获取设备列表 // List<MdcEquipment> equipmentList = mdcEquipmentService.list(new LambdaQueryWrapper<MdcEquipment>().eq(MdcEquipment::getEquipmentId, "2140198")); List<MdcEquipment> equipmentList = mdcEquipmentService.list(); for (MdcEquipment mdcEquipment : equipmentList) { String equipmentId = mdcEquipment.getEquipmentId(); @@ -141,17 +157,22 @@ // 负荷时间(分钟) BigDecimal loadTime = mdcOverallEquipmentEfficiency.getShiftTimeCount().subtract(plannedMaintenanceDuration).subtract(conferenceTrainingDuration).subtract(otherRestDuration); 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 = (loadTime.subtract(breakdownDownDuration).subtract(conversionDebugDuration).subtract(materialShortageDuration).subtract(plannedTaskDuration).subtract(inspectDuration).subtract(otherDuration)).divide(loadTime, 4, RoundingMode.HALF_UP); timeActuationRate = spindleRunDuration.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) { @@ -160,14 +181,29 @@ mdcOverallEquipmentEfficiency.setStandardProcessDuration(BigDecimal.ZERO); } // 性能开动率 = 主轴运行时间/负荷时间 // 查询主轴运行时间(分钟) BigDecimal spindleRunDuration = mdcEquipmentStatisticalShiftInfoService.findSpindleRunDuration(equipmentId, validDate); if (loadTime.compareTo(BigDecimal.ZERO) != 0) { mdcOverallEquipmentEfficiency.setPerformanceRate(spindleRunDuration.divide(loadTime, 4, RoundingMode.HALF_UP)); 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 { mdcOverallEquipmentEfficiency.setPerformanceRate(BigDecimal.ZERO); // (旧)性能开动率 = 主轴运行时间/负荷时间 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); @@ -177,8 +213,9 @@ } else { mdcOverallEquipmentEfficiency.setPassRate((processQuantity.subtract(unqualifiedQuantity)).divide(processQuantity, 4, RoundingMode.HALF_UP)); } // 设备综合效率 = 时间开动率 × 性能开动率 × 合格品率 mdcOverallEquipmentEfficiency.setOverallEquipmentEfficiency(timeActuationRate.multiply(mdcOverallEquipmentEfficiency.getPerformanceRate()).multiply(mdcOverallEquipmentEfficiency.getPassRate())); mdcOverallEquipmentEfficiency.setOverallEquipmentEfficiency(timeActuationRate.multiply(mdcOverallEquipmentEfficiency.getPerformanceRate()).multiply(mdcOverallEquipmentEfficiency.getPassRate()).setScale(4, RoundingMode.HALF_UP)); if (mdcOverallEquipmentEfficiency.getOverallEquipmentEfficiency().compareTo(BigDecimal.ZERO) == 0) { mdcOverallEquipmentEfficiency.setOverallEquipmentEfficiency(BigDecimal.ONE); } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/MdcPlanCloseServiceImpl.java
@@ -9,7 +9,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Collections; import java.util.Arrays; import java.util.List; @@ -25,7 +25,7 @@ @Override public BigDecimal findPlanTimeDuration(BigDecimal actualWorkDayCount, String planCloseType) { BigDecimal result = new BigDecimal("0"); List<MdcPlanClose> mdcPlanCloses = this.baseMapper.selectList(new LambdaQueryWrapper<MdcPlanClose>().in(MdcPlanClose::getPlanCloseType, Collections.singletonList(planCloseType))); List<MdcPlanClose> mdcPlanCloses = this.baseMapper.selectList(new LambdaQueryWrapper<MdcPlanClose>().in(MdcPlanClose::getPlanCloseType, Arrays.asList(planCloseType.split(",")))); if (mdcPlanCloses != null && !mdcPlanCloses.isEmpty()) { for (MdcPlanClose mdcPlanClose : mdcPlanCloses) { switch (mdcPlanClose.getPlanCloseTimeType()) { lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/service/impl/ProcessCountServiceImpl.java
@@ -22,6 +22,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.*; /** @@ -112,6 +113,12 @@ return this.baseMapper.pageList(page, mdcProcessCountVo); } @Override public BigDecimal findDuration(String equipmentId, String validDate) { BigDecimal result = this.baseMapper.findDuration(equipmentId, validDate.replaceAll("-", "")); return result == null ? BigDecimal.ZERO : result; } @Transactional(readOnly = true) List<MdcProcessCount> processCount(MdcEquipment mdcEquipment) { Date initDate = null; @@ -197,13 +204,15 @@ } //计算加工时长 long duration = this.handleProcessDuration(equipmentRunningSectionList); MdcProcessCount mdcProcessCount = new MdcProcessCount(); mdcProcessCount.setEquipmentId(mdcEquipment.getEquipmentId()); mdcProcessCount.setEquipmentName(mdcEquipment.getEquipmentName()); mdcProcessCount.setSequenceNumber(sequenceNumber); mdcProcessCount.setDuration(duration); mdcProcessCount.setTheDate(stringDate); resultList.add(mdcProcessCount); if (duration != 0 && duration < 100000) { MdcProcessCount mdcProcessCount = new MdcProcessCount(); mdcProcessCount.setEquipmentId(mdcEquipment.getEquipmentId()); mdcProcessCount.setEquipmentName(mdcEquipment.getEquipmentName()); mdcProcessCount.setSequenceNumber(sequenceNumber); mdcProcessCount.setDuration(duration); mdcProcessCount.setTheDate(stringDate); resultList.add(mdcProcessCount); } } } } lxzn-module-mdc/src/main/java/org/jeecg/modules/mdc/vo/MdcOverallEquipmentEfficiencyVo.java
@@ -45,6 +45,11 @@ */ private List<String> equipmentIdList; /** * 驱动类型 */ private String driveType;