package org.jeecg.modules.eam.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ctc.wstx.util.DataUtil; import org.jeecg.common.util.DateUtils; import org.jeecg.modules.eam.entity.Mtbf; import org.jeecg.modules.eam.entity.MtbfLog; import org.jeecg.modules.eam.mapper.MtbfMapper; import org.jeecg.modules.eam.service.IMtbfLogService; import org.jeecg.modules.eam.service.IMtbfService; import org.jeecg.modules.eam.vo.MtbfVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.Date; import java.util.List; import java.util.Map; /** * @Description: mom_eam_mtbf * @Author: jeecg-boot * @Date: 2025-06-12 * @Version: V1.0 */ @Service public class MtbfServiceImpl extends ServiceImpl implements IMtbfService { @Autowired @Lazy private IMtbfLogService mtbfLogService; @Override public IPage> getMTBF(Integer pageNo, Integer pageSize, Map params) { IPage pageData = new Page(pageNo, pageSize); return super.getBaseMapper().getMTBF(pageData, params) ; } @Override @Transactional(rollbackFor = Exception.class) public List getReportRepairTimeList(String yesterday) { List reportRepairTimeList = this.baseMapper.getReportRepairTimeList(yesterday); for (MtbfVo mtbf : reportRepairTimeList) { List list = mtbfLogService.lambdaQuery().eq(MtbfLog::getReportRepairNum, mtbf.getReportRepairNum()).list(); if(list.size()>0){ MtbfLog mtbfLog = list.get(0); mtbfLog.setReportRepairNum(mtbf.getReportRepairNum()); mtbfLog.setEquipmentId(mtbf.getEquipmentId()); mtbfLog.setReportTime(mtbf.getFaultStartTime()); mtbfLog.setRepairStartTime(mtbf.getRepairStartTime()); mtbfLog.setRepairFinishTime(mtbf.getRepairEndTime()); mtbfLogService.updateById(mtbfLog); }else{ MtbfLog mtbfLog = new MtbfLog(); mtbfLog.setReportRepairNum(mtbf.getReportRepairNum()); mtbfLog.setEquipmentId(mtbf.getEquipmentId()); mtbfLog.setReportTime(mtbf.getFaultStartTime()); mtbfLog.setRepairStartTime(mtbf.getRepairStartTime()); mtbfLog.setRepairFinishTime(mtbf.getRepairEndTime()); mtbfLog.setCreateTime(new Date()); mtbfLogService.save(mtbfLog); } Date faultStartTime = mtbf.getFaultStartTime();//故障开始时间 Date yesterdayData = DateUtils.getDayAfter(new Date(), -1);//昨天日期 //故障时间是不是昨天发生的 boolean f = isSameDate(faultStartTime, yesterdayData); //计算故障时长 Date todayMidnightAsDate = getTodayMidnightAsDate();//今日凌晨 String status = mtbf.getStatus(); Mtbf mtbf1 = new Mtbf(); mtbf1.setReportRepairNum(mtbf.getReportRepairNum()); mtbf1.setEquipmentId(mtbf.getEquipmentId()); mtbf1.setFaultData(new Date()); mtbf1.setCreateTime(new Date()); mtbf1.setTotalAvailableTime(new BigDecimal(24)); if("1".equals(status)){//状态1:报修 //故障报修时间是昨天 故障时间 = 24 - 故障开始时间 if(f){ //今日凌晨 - 昨日故障发生时间 = 故障时间 double faultTime = getPreciseHoursDifference(faultStartTime, todayMidnightAsDate); // double faultTime = getHoursFromYesterdayMidnightToDate(faultStartTime); mtbf1.setFaultTime(new BigDecimal(faultTime).setScale(2, RoundingMode.HALF_UP)); mtbf1.setNoFaultTime((new BigDecimal(24).subtract(new BigDecimal(faultTime))).setScale(2, RoundingMode.HALF_UP)); }else{ //故障报修时间不是昨天 故障时间 = 24 //double faultTime = 24; mtbf1.setFaultTime(new BigDecimal(24)); mtbf1.setNoFaultTime(new BigDecimal(0)); } mtbf1.setRepairTime(new BigDecimal(0)); this.save(mtbf1); }else if("2".equals(status)){//状态2:维修 Date repairStartTime = mtbf.getRepairStartTime(); //维修时间是不是昨天发生的 boolean rr = isSameDate(repairStartTime, yesterdayData); //故障报修时间是昨天 故障时间 = 24 - 故障开始时间 if(f){ double faultTime = getPreciseHoursDifference(faultStartTime,todayMidnightAsDate); mtbf1.setFaultTime(new BigDecimal(faultTime).setScale(2, RoundingMode.HALF_UP)); mtbf1.setNoFaultTime((new BigDecimal(24).subtract(new BigDecimal(faultTime))).setScale(2, RoundingMode.HALF_UP)); if(repairStartTime == null){ mtbf1.setRepairTime(new BigDecimal(0)); }else if(rr){ double repairTime = getPreciseHoursDifference(repairStartTime, todayMidnightAsDate); mtbf1.setRepairTime(new BigDecimal(repairTime).setScale(2, RoundingMode.HALF_UP)); } //不存在维修时间是当天的,因为定时任务是今天执行,算昨天的结果 // else{ // mtbf1.setRepairTime(new BigDecimal(24)); // } }else{ //故障报修时间不是昨天 故障时间 = 24 mtbf1.setFaultTime(new BigDecimal(24)); mtbf1.setNoFaultTime(new BigDecimal(0)); if(rr){ // double repairTime = getPreciseHoursDifference(todayMidnightAsDate, repairStartTime); double repairTime = getHoursFromYesterdayMidnightToDate(repairStartTime); mtbf1.setRepairTime(new BigDecimal(repairTime).setScale(2, RoundingMode.HALF_UP)); }else{ mtbf1.setRepairTime(new BigDecimal(24)); } } // mtbf1.setNoFaultTime(new BigDecimal(0)); this.save(mtbf1); }else{//状态4:修完 Date repairStartTime = mtbf.getRepairStartTime(); Date repairEndTime = mtbf.getRepairEndTime(); if(f){ double faultTime = getPreciseHoursDifference(faultStartTime,repairEndTime); double repairTime = getPreciseHoursDifference(repairStartTime,repairEndTime); mtbf1.setFaultTime(new BigDecimal(faultTime).setScale(2, RoundingMode.HALF_UP)); mtbf1.setRepairTime(new BigDecimal(repairTime).setScale(2, RoundingMode.HALF_UP)); mtbf1.setNoFaultTime((new BigDecimal(24).subtract(new BigDecimal(faultTime))).setScale(2, RoundingMode.HALF_UP)); }else{ double repairTime = getHoursFromYesterdayMidnightToDate(repairEndTime); mtbf1.setFaultTime(new BigDecimal(repairTime).setScale(2, RoundingMode.HALF_UP)); mtbf1.setRepairTime(new BigDecimal(repairTime).setScale(2, RoundingMode.HALF_UP)); mtbf1.setNoFaultTime((new BigDecimal(24).subtract(new BigDecimal(repairTime))).setScale(2, RoundingMode.HALF_UP)); } this.save(mtbf1); } } return reportRepairTimeList; } // 方法1:计算昨天凌晨到指定Date的精确小时数(包括小数部分) public static double getHoursFromYesterdayMidnightToDate(Date targetDate) { if (targetDate == null) { return 0.0; } // 获取昨天凌晨的时间并转换为Date LocalDateTime yesterdayMidnight = LocalDate.now().minusDays(1).atStartOfDay(); Date yesterdayMidnightDate = Date.from( yesterdayMidnight.atZone(ZoneId.systemDefault()).toInstant() ); // 计算毫秒差 long diffInMillis = targetDate.getTime() - yesterdayMidnightDate.getTime(); // 转换为小时(包括小数部分) return diffInMillis / (1000.0 * 60 * 60); } // 计算包含小数部分的小时差 public static double getPreciseHoursDifference(Date startDate, Date endDate) { long diffInMillis = endDate.getTime() - startDate.getTime(); return (double) diffInMillis / (1000 * 60 * 60); } // 获取今天凌晨的Date对象 public static Date getTodayMidnightAsDate() { LocalDateTime midnight = LocalDate.now().atStartOfDay(); return Date.from(midnight.atZone(ZoneId.systemDefault()).toInstant()); } public static boolean isSameDate(Date date1, Date date2) { // 将Date转换为LocalDate(只包含年月日) LocalDate localDate1 = date1.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); LocalDate localDate2 = date2.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); // 直接比较两个LocalDate对象 return localDate1.isEqual(localDate2); } }