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<FaultIntervalTimeMapper, FaultIntervalTime> implements IFaultIntervalTimeService {
|
|
@Autowired
|
private IEamEquipmentService equipmentService;
|
@Autowired
|
private IEquipmentReportRepairService equipmentReportRepairService;
|
@Autowired
|
private IRepairOrderService repairOrderService;
|
@Autowired
|
private ISysDepartService departService;
|
|
@Override
|
public List<FaultIntervalTime> getMTBF(Map<String, String> query) throws ParseException {
|
List<FaultIntervalTime> 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<Equipment> 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<EquipmentReportRepair> 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<RepairOrder> 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<Map<String, Object>> getEquipmentMTBF(Map<String, Object> params) {
|
return this.baseMapper.getEquipmentMTBF(params);
|
}
|
|
@Override
|
public List<Map<String, Object>> getMTBFTotalAvailableTime(Map<String, Object> params) {
|
return this.baseMapper.getMTBFTotalAvailableTime(params);
|
}
|
|
@Override
|
public List<Map<String, Object>> getEquipmentList(Map<String, Object> params) {
|
return this.baseMapper.getEquipmentList(params);
|
}
|
}
|