qushaowei
2025-06-13 4b27dd367eae2f24958c6bb857fb6959dcdb7a4a
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/FaultIntervalTimeServiceImpl.java
@@ -1,10 +1,38 @@
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.apache.shiro.SecurityUtils;
import org.jeecg.common.constant.CommonConstant;
import org.jeecg.common.system.vo.LoginUser;
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.entity.SysUser;
import org.jeecg.modules.system.service.ISysDepartService;
import org.jeecg.modules.system.service.ISysUserService;
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
@@ -15,4 +43,196 @@
@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;
    @Autowired
    private ISysUserService sysUserService;
    @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) {
//        LoginUser user= (LoginUser) SecurityUtils.getSubject().getPrincipal();
//        SysUser sysUser = sysUserService.getById(user.getId());
//        String areaId = sysUser.getAreaId();
//        List<String>  workCenterIds = null;
//        if(StringUtils.isNotBlank(areaId)){
//            String[] split = areaId.split(",");
//            workCenterIds = Arrays.asList(split);
//            params.put("workCenterIds",workCenterIds);
//        }
        return this.baseMapper.getEquipmentList(params);
    }
    @Override
    public List<Map<String, Object>> getCenterEquipmentMTBF(Map<String, Object> params) {
        return this.baseMapper.getCenterEquipmentMTBF(params);
    }
    @Override
    public List<Map<String, Object>> getCenterMTBFTotalAvailableTime(Map<String, Object> params) {
        return this.baseMapper.getCenterMTBFTotalAvailableTime(params);
    }
    @Override
    public List<Map<String, Object>> getWorkCenterList(Map<String, Object> params) {
        return this.baseMapper.getWorkCenterList(params);
    }
}