package org.jeecg.modules.eam.service.impl; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.util.DateUtils; import org.jeecg.modules.eam.entity.Equipment; import org.jeecg.modules.eam.entity.EquipmentReportRepair; import org.jeecg.modules.eam.entity.FaultIntervalTime; import org.jeecg.modules.eam.entity.RepairOrder; import org.jeecg.modules.eam.mapper.FaultIntervalTimeMapper; import org.jeecg.modules.eam.service.IEamEquipmentService; import org.jeecg.modules.eam.service.IEquipmentReportRepairService; import org.jeecg.modules.eam.service.IFaultIntervalTimeService; import org.jeecg.modules.eam.service.IRepairOrderService; import org.jeecg.modules.system.entity.SysDepart; import org.jeecg.modules.system.service.ISysDepartService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Period; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; /** * @Description: mom_eam_fault_interval_time * @Author: jeecg-boot * @Date: 2023-08-30 * @Version: V1.0 */ @Service public class FaultIntervalTimeServiceImpl extends ServiceImpl implements IFaultIntervalTimeService { @Autowired private IEamEquipmentService equipmentService; @Autowired private IEquipmentReportRepairService equipmentReportRepairService; @Autowired private IRepairOrderService repairOrderService; @Autowired private ISysDepartService departService; @Override public List getMTBF(Map query) throws ParseException { List faultIntervalTimeList = new ArrayList<>(); String startTime = query.get("startTime"); String endTime = query.get("endTime"); if(StringUtils.isBlank(startTime) || StringUtils.isBlank(endTime)){ return faultIntervalTimeList; }else { startTime = startTime+" 00:00:00"; endTime = endTime+" 23:59:59"; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date startDate = sdf.parse(startTime); Date endDate = sdf.parse(endTime); long diff = endDate.getTime() - startDate.getTime(); // 计算两个日期之间的毫秒数 BigDecimal totalHours = new BigDecimal(diff) .divide(new BigDecimal(60 * 60 * 1000), 2, BigDecimal.ROUND_HALF_EVEN); //时间段总可利用时间 String totalAvailableTime = String.valueOf(totalHours); //查询所有设备 List equipmentList = equipmentService.lambdaQuery().eq(Equipment::getDelFlag, CommonConstant.DEL_FLAG_0).list(); for(Equipment equipment : equipmentList){ FaultIntervalTime faultIntervalTime = new FaultIntervalTime(); faultIntervalTime.setEquipmentId(equipment.getId()); faultIntervalTime.setEquipmentNum(equipment.getNum()); faultIntervalTime.setEquipmentName(equipment.getName()); faultIntervalTime.setEquipmentModel(equipment.getModel()); SysDepart depart = departService.lambdaQuery().eq(SysDepart::getId,equipment.getUseId()).eq(SysDepart::getDelFlag,CommonConstant.DEL_FLAG_0).one(); if(depart != null){ faultIntervalTime.setUserDepart(depart.getDepartName()); } //查询设备是否有报修单 List equipmentReportRepairList = equipmentReportRepairService.lambdaQuery().eq(EquipmentReportRepair::getEquipmentId,equipment.getId()) .eq(EquipmentReportRepair::getDelFlag,CommonConstant.DEL_FLAG_0).list(); if(CollectionUtils.isNotEmpty(equipmentReportRepairList)){ BigDecimal equipmentFaultTime = new BigDecimal("0"); BigDecimal equipmentRepairTime = new BigDecimal("0"); int count = 0; //一、查询故障时间 for(EquipmentReportRepair equipmentReportRepair : equipmentReportRepairList){ //1、如果报修时间不为空,并且在查询时间段内 if(equipmentReportRepair.getFaultTime() != null && equipmentReportRepair.getFaultTime().compareTo(endDate) < 0 && equipmentReportRepair.getFaultTime().compareTo(startDate) > 0){ //2、验收时间在查询时间段内 if(equipmentReportRepair.getAcceptTime() != null && equipmentReportRepair.getAcceptTime().compareTo(endDate) < 0){ equipmentFaultTime = equipmentFaultTime.add(equipmentReportRepair.getFaultHour()); count++; //3、验收时间大于查询结束时间 }else { long diff2 = endDate.getTime() - equipmentReportRepair.getFaultTime().getTime(); BigDecimal faultTime1 = new BigDecimal(diff2) .divide(new BigDecimal(60 * 60 * 1000), 2, BigDecimal.ROUND_HALF_EVEN); equipmentFaultTime = equipmentFaultTime.add(faultTime1); count++; } //4、报修时间在查询开始时间之前 }else if(equipmentReportRepair.getFaultTime().compareTo(startDate) < 0 ){ //5、验收时间在查询时间段内 if(equipmentReportRepair.getAcceptTime() != null && equipmentReportRepair.getAcceptTime().compareTo(endDate) < 0){ long diff2 = equipmentReportRepair.getAcceptTime().getTime() - startDate.getTime(); BigDecimal faultTime1 = new BigDecimal(diff2) .divide(new BigDecimal(60 * 60 * 1000), 2, BigDecimal.ROUND_HALF_EVEN); equipmentFaultTime = equipmentFaultTime.add(faultTime1); count++; //6、验收时间为空或验收时间在查询结束时间之后 }else { long diff2 = endDate.getTime() - startDate.getTime(); BigDecimal faultTime1 = new BigDecimal(diff2) .divide(new BigDecimal(60 * 60 * 1000), 2, BigDecimal.ROUND_HALF_EVEN); equipmentFaultTime = equipmentFaultTime.add(faultTime1); count++; } } //二、查询修复时间 //查询报修单是否已领取并开工 List repairOrderList = repairOrderService.lambdaQuery().eq(RepairOrder::getReportRepairId,equipmentReportRepair.getId()) .eq(RepairOrder::getDelFlag,CommonConstant.DEL_FLAG_0).list(); if(CollectionUtils.isNotEmpty(repairOrderList)){ //1、开工时间在查询时间段内 if(repairOrderList.get(0).getActualStartTime() != null && repairOrderList.get(0).getActualStartTime().compareTo(endDate) < 0 && repairOrderList.get(0).getActualStartTime().compareTo(startDate) > 0 ){ //2、完工时间在查询时间段内 if(repairOrderList.get(0).getActualEndTime() != null && repairOrderList.get(0).getActualEndTime().compareTo(endDate) < 0){ equipmentRepairTime = equipmentRepairTime.add(repairOrderList.get(0).getActualHour()); //3、完工时间大于查询结束时间 }else { long diff1 = endDate.getTime() - repairOrderList.get(0).getActualStartTime().getTime(); BigDecimal repairTime1 = new BigDecimal(diff1) .divide(new BigDecimal(60 * 60 * 1000), 2, BigDecimal.ROUND_HALF_EVEN); equipmentRepairTime = equipmentRepairTime.add(repairTime1); } //4、开工时间在查询开始时间之前 }else if(repairOrderList.get(0).getActualStartTime() != null && repairOrderList.get(0).getActualStartTime().compareTo(startDate) < 0 ){ //5、完工时间在查询时间段内 if(repairOrderList.get(0).getActualEndTime() != null && repairOrderList.get(0).getActualEndTime().compareTo(endDate) < 0){ long diff1 = repairOrderList.get(0).getActualEndTime().getTime() - startDate.getTime(); BigDecimal repairTime1 = new BigDecimal(diff1) .divide(new BigDecimal(60 * 60 * 1000), 2, BigDecimal.ROUND_HALF_EVEN); equipmentRepairTime = equipmentRepairTime.add(repairTime1); //6、完工时间为空或完工时间在查询结束时间之后 }else{ long diff1 = endDate.getTime() - startDate.getTime(); BigDecimal repairTime1 = new BigDecimal(diff1) .divide(new BigDecimal(60 * 60 * 1000), 2, BigDecimal.ROUND_HALF_EVEN); equipmentRepairTime = equipmentRepairTime.add(repairTime1); } } } } //设备故障时间 String faultTime = String.valueOf(equipmentFaultTime); //设备维修时长 String repairTime = String.valueOf(equipmentRepairTime); //设备无故障时间 String noFaultTime = String.valueOf(totalHours.subtract(equipmentFaultTime)); //设备平均故障间隔时间 String averageFaultIntervalTime = String.valueOf(totalHours.subtract(equipmentFaultTime).divide(new BigDecimal(equipmentReportRepairList.size()), 2, BigDecimal.ROUND_HALF_EVEN)); //设备平均修复时间 String averageRepairTime = String.valueOf(equipmentRepairTime.divide(new BigDecimal(equipmentReportRepairList.size()), 2, BigDecimal.ROUND_HALF_EVEN)); faultIntervalTime.setTotalAvailableTime(totalAvailableTime); faultIntervalTime.setFaultTime(faultTime); faultIntervalTime.setRepairTime(repairTime); //设备故障次数 faultIntervalTime.setFaultNumber(String.valueOf(count)); faultIntervalTime.setAverageFaultIntervalTime(averageFaultIntervalTime); faultIntervalTime.setAverageRepairTime(averageRepairTime); faultIntervalTime.setNoFaultTime(noFaultTime); faultIntervalTimeList.add(faultIntervalTime); }else { faultIntervalTime.setTotalAvailableTime(totalAvailableTime); faultIntervalTime.setFaultTime("0"); faultIntervalTime.setRepairTime("0"); faultIntervalTime.setFaultNumber("0"); faultIntervalTime.setAverageRepairTime("0"); faultIntervalTime.setAverageFaultIntervalTime(totalAvailableTime); faultIntervalTime.setNoFaultTime(totalAvailableTime); faultIntervalTimeList.add(faultIntervalTime); } } return faultIntervalTimeList; } @Override public List> getEquipmentMTBF(Map params) { return this.baseMapper.getEquipmentMTBF(params); } @Override public List> getMTBFTotalAvailableTime(Map params) { return this.baseMapper.getMTBFTotalAvailableTime(params); } @Override public List> getEquipmentList(Map params) { return this.baseMapper.getEquipmentList(params); } @Override public List> getCenterEquipmentMTBF(Map params) { return this.baseMapper.getCenterEquipmentMTBF(params); } @Override public List> getCenterMTBFTotalAvailableTime(Map params) { return this.baseMapper.getCenterMTBFTotalAvailableTime(params); } @Override public List> getWorkCenterList(Map params) { return this.baseMapper.getWorkCenterList(params); } }