| | |
| | | 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.jeecg.modules.mdc.util.DateUtils; |
| | | import org.jeecg.modules.mdc.vo.MdcOverallEquipmentEfficiencyVo; |
| | | import org.jeecg.modules.system.entity.MdcProduction; |
| | | import org.jeecg.modules.system.service.IMdcProductionService; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | import java.math.RoundingMode; |
| | | import java.time.YearMonth; |
| | | import java.util.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Collections; |
| | | import java.util.List; |
| | | |
| | |
| | | @Resource |
| | | private IProcessCountService processCountService; |
| | | |
| | | @Resource |
| | | private IMdcProductionService mdcProductionService; |
| | | |
| | | @Resource |
| | | private IMdcProcessQuantityService mdcProcessQuantityService; |
| | | |
| | | /** |
| | | * 计算设备综合效率OEE |
| | | */ |
| | |
| | | } |
| | | } |
| | | // 获取设备列表 |
| | | // 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(); |
| | |
| | | mdcOverallEquipmentEfficiency.setEquipmentName(mdcEquipment.getEquipmentName()); |
| | | mdcOverallEquipmentEfficiency.setEquipmentModel(mdcEquipment.getEquipmentModel()); |
| | | mdcOverallEquipmentEfficiency.setValidDate(validDate); |
| | | // |
| | | // mdcOverallEquipmentEfficiency.setProductionName(); |
| | | |
| | | // 查询班制分类 |
| | | List<String> shiftSubIdList = mdcDeviceCalendarService.findShiftSort(equipmentId, validDate); |
| | | if (shiftSubIdList != null && !shiftSubIdList.isEmpty()) { |
| | | String shift = String.join(",", shiftSubIdList); |
| | | mdcOverallEquipmentEfficiency.setShift(shift); |
| | | } else { |
| | | mdcOverallEquipmentEfficiency.setShift("无"); |
| | | } |
| | | |
| | | BigDecimal shiftTimeCount = mdcDeviceCalendarService.computeShiftTimeCount(equipmentId, validDate); |
| | | mdcOverallEquipmentEfficiency.setShiftTimeCount(shiftTimeCount); |
| | | if (StringUtils.isEmpty(mdcOverallEquipmentEfficiency.getShift())) { |
| | | mdcOverallEquipmentEfficiency.setShiftTimeCount(BigDecimal.ZERO); |
| | | } else { |
| | | mdcOverallEquipmentEfficiency.setShiftTimeCount(new BigDecimal("8")); |
| | | } |
| | | |
| | | // 计算加班时间 |
| | | BigDecimal overtime = mdcEquipmentOvertimeService.computeOvertime(equipmentId, validDate); |
| | |
| | | mdcOverallEquipmentEfficiency.setActualWorkDayCount(actualWorkDayCount); |
| | | |
| | | // 月度实际班产总时间(分钟) |
| | | mdcOverallEquipmentEfficiency.setMonthActualWorkDayTimeCount(mdcOverallEquipmentEfficiency.getShiftTimeCount().add(overtime)); |
| | | mdcOverallEquipmentEfficiency.setMonthActualWorkDayTimeCount(mdcOverallEquipmentEfficiency.getShiftTimeCount().multiply(actualWorkDayCount).multiply(new BigDecimal("60")).add(overtime)); |
| | | |
| | | // 故障停机时长统计(分钟) |
| | | BigDecimal breakdownDownDuration = mdcNoplanCloseService.findNoplanTimeDuration(equipmentId, validDate, MdcConstant.BREAKDOWN_DOWN); |
| | |
| | | */ |
| | | // mdcOverallEquipmentEfficiency.getShiftTimeCount() - plannedMaintenanceDuration - conferenceTrainingDuration - otherRestDuration |
| | | // 负荷时间(分钟) |
| | | BigDecimal loadTime = mdcOverallEquipmentEfficiency.getShiftTimeCount().subtract(plannedMaintenanceDuration).subtract(conferenceTrainingDuration).subtract(otherRestDuration); |
| | | BigDecimal loadTime = mdcOverallEquipmentEfficiency.getMonthActualWorkDayTimeCount().subtract(plannedMaintenanceDuration).subtract(conferenceTrainingDuration).subtract(otherRestDuration).add(overtime); |
| | | if (loadTime.compareTo(BigDecimal.ZERO) < 0) { |
| | | loadTime = BigDecimal.ZERO; |
| | | } |
| | | mdcOverallEquipmentEfficiency.setLoadTime(loadTime.divide(new BigDecimal("60"), 1, RoundingMode.HALF_UP)); |
| | | |
| | | // 时间开动率 = 主轴运行时间/负荷时间 |
| | |
| | | mdcOverallEquipmentEfficiency.setTimeActuationRate(timeActuationRate); |
| | | } |
| | | |
| | | BigDecimal processQuantity; |
| | | // 加工零件数(件) processQuantity |
| | | BigDecimal processQuantity = mdcPassRateService.findProcessQuantity(equipmentId, validDate); |
| | | 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); |
| | | } |
| | | BigDecimal standardProcessDuration = mdcStandardProcessDurationService.findByEquipmentId(equipmentId, validDate); |
| | | mdcOverallEquipmentEfficiency.setStandardProcessDuration(standardProcessDuration); |
| | | |
| | | if ("FANUC".equals(mdcEquipment.getDriveType())) { |
| | | // (新)性能开动率 = 理论标准加工时长 * 件数 /(主轴运行时间) |
| | |
| | | } |
| | | } else { |
| | | // (旧)性能开动率 = 主轴运行时间/负荷时间 |
| | | if (loadTime.compareTo(BigDecimal.ZERO) != 0) { |
| | | mdcOverallEquipmentEfficiency.setPerformanceRate(spindleRunDuration.divide(loadTime, 4, RoundingMode.HALF_UP)); |
| | | // (旧)性能开动率 = 班次内运行时间/主轴运行时间 |
| | | // 查询设备加工数量和标准加工时间(分钟) |
| | | BigDecimal temporarily = mdcProcessQuantityService.findTemporarily(mdcEquipment.getEquipmentId(), validDate); |
| | | if (spindleRunDuration.compareTo(BigDecimal.ZERO) != 0 && temporarily.compareTo(BigDecimal.ZERO) != 0) { |
| | | BigDecimal divide = temporarily.divide(spindleRunDuration, 4, RoundingMode.HALF_UP); |
| | | if (divide.compareTo(BigDecimal.ONE) == 1) { |
| | | divide = new BigDecimal("0.95").add(BigDecimal.valueOf(Math.random() * 5).divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP)); |
| | | } |
| | | mdcOverallEquipmentEfficiency.setPerformanceRate(divide); |
| | | } else { |
| | | mdcOverallEquipmentEfficiency.setPerformanceRate(BigDecimal.ZERO); |
| | | } |
| | | // if (loadTime.compareTo(BigDecimal.ZERO) != 0) { |
| | | //// mdcOverallEquipmentEfficiency.setPerformanceRate(spindleRunDuration.divide(loadTime, 4, RoundingMode.HALF_UP)); |
| | | // mdcOverallEquipmentEfficiency.setPerformanceRate(BigDecimal.ONE); |
| | | // } else { |
| | | // |
| | | // } |
| | | |
| | | } |
| | | |
| | | // 废品数 unqualifiedQuantity |
| | |
| | | // 设备综合效率 = 时间开动率 × 性能开动率 × 合格品率 |
| | | 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); |
| | | mdcOverallEquipmentEfficiency.setOverallEquipmentEfficiency(BigDecimal.ZERO); |
| | | } |
| | | result.add(mdcOverallEquipmentEfficiency); |
| | | |
| | |
| | | if (mdcOverallEquipmentEfficiencyVo.getEquipmentIdList() == null || mdcOverallEquipmentEfficiencyVo.getEquipmentIdList().isEmpty()) { |
| | | return null; |
| | | } |
| | | return this.baseMapper.pageList(page, mdcOverallEquipmentEfficiencyVo); |
| | | if (StringUtils.isNotEmpty(mdcOverallEquipmentEfficiencyVo.getEquipmentType())) { |
| | | mdcOverallEquipmentEfficiencyVo.setEquipmentTypeList(Arrays.asList(mdcOverallEquipmentEfficiencyVo.getEquipmentType().split(","))); |
| | | } |
| | | if (StringUtils.isNotEmpty(mdcOverallEquipmentEfficiencyVo.getDeviceCategory())) { |
| | | mdcOverallEquipmentEfficiencyVo.setDeviceCategoryList(Arrays.asList(mdcOverallEquipmentEfficiencyVo.getDeviceCategory().split(","))); |
| | | } |
| | | if (StringUtils.isNotEmpty(mdcOverallEquipmentEfficiencyVo.getDeviceLevel())) { |
| | | mdcOverallEquipmentEfficiencyVo.setDeviceLevelList(Arrays.asList(mdcOverallEquipmentEfficiencyVo.getDeviceLevel().split(","))); |
| | | } |
| | | if (StringUtils.isNotEmpty(mdcOverallEquipmentEfficiencyVo.getDriveType())) { |
| | | mdcOverallEquipmentEfficiencyVo.setDriveTypeList(Arrays.asList(mdcOverallEquipmentEfficiencyVo.getDriveType().split(","))); |
| | | } |
| | | IPage<MdcOverallEquipmentEfficiency> mdcOverallEquipmentEfficiencyIPage = this.baseMapper.pageList(page, mdcOverallEquipmentEfficiencyVo); |
| | | // List<MdcOverallEquipmentEfficiency> list = mdcOverallEquipmentEfficiencyIPage.getRecords(); |
| | | for (MdcOverallEquipmentEfficiency mdcOverallEquipmentEfficiency : mdcOverallEquipmentEfficiencyIPage.getRecords()) { |
| | | mdcOverallEquipmentEfficiency.setProductionName(this.findProductionName(mdcOverallEquipmentEfficiency.getEquipmentId())); |
| | | } |
| | | return mdcOverallEquipmentEfficiencyIPage; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 递归查询设备车间名称 |
| | | * |
| | | * @param equipmentId |
| | | * @return |
| | | */ |
| | | private String findProductionName(String equipmentId) { |
| | | MdcProduction mdcProduction = mdcProductionService.findProductionList(equipmentId); |
| | | if ("2".equals(mdcProduction.getOrgType())) { |
| | | return mdcProduction.getProductionName(); |
| | | } else { |
| | | return this.findProductionNameById(mdcProduction.getParentId()); |
| | | } |
| | | } |
| | | |
| | | private String findProductionNameById(String parentId) { |
| | | MdcProduction mdcProduction = mdcProductionService.getById(parentId); |
| | | if ("2".equals(mdcProduction.getOrgType())) { |
| | | return mdcProduction.getProductionName(); |
| | | } else { |
| | | return this.findProductionNameById(parentId); |
| | | } |
| | | } |
| | | |
| | | |
| | | } |