qushaowei
2025-06-17 68b6b248be403bfd684472a4a4876e5d35101e71
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
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);
    }
}