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<MtbfMapper, Mtbf> implements IMtbfService {
|
|
@Autowired
|
@Lazy
|
private IMtbfLogService mtbfLogService;
|
|
@Override
|
public IPage<Map<String, Object>> getMTBF(Integer pageNo, Integer pageSize, Map<String, Object> params) {
|
IPage<Map> pageData = new Page<Map>(pageNo, pageSize);
|
return super.getBaseMapper().getMTBF(pageData, params) ;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public List<MtbfVo> getReportRepairTimeList(String yesterday) {
|
List<MtbfVo> reportRepairTimeList = this.baseMapper.getReportRepairTimeList(yesterday);
|
for (MtbfVo mtbf : reportRepairTimeList) {
|
List<MtbfLog> 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);
|
}
|
}
|