qushaowei
2024-07-12 15ae1e3b5cda40a8248a1addf4a64c1e0a9e2b13
lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/RepairOrderServiceImpl.java
@@ -1,14 +1,22 @@
package org.jeecg.modules.eam.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.RepairOrder;
import org.jeecg.modules.eam.entity.RepairOrderDetail;
import org.jeecg.modules.eam.mapper.*;
import org.jeecg.modules.eam.service.IEamEquipmentService;
import org.jeecg.modules.eam.service.IEquipmentReportRepairService;
import org.jeecg.modules.eam.service.IRepairOrderDetailService;
import org.jeecg.modules.eam.service.IRepairOrderService;
import org.jeecg.modules.eam.vo.EquipmentAvailabilityVo;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.mapper.SysUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
@@ -16,7 +24,12 @@
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.YearMonth;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @Description: 维修工单
@@ -45,6 +58,10 @@
   private EquipmentDocumentMapper equipmentDocumentMapper;
   @Autowired
   private SysUserMapper sysUserMapper;
   @Autowired
   private IEamEquipmentService equipmentService;
   @Autowired
   private IEquipmentReportRepairService equipmentReportRepairService;
@@ -86,9 +103,54 @@
      }
      List<String> equipNums = new ArrayList<>();
        if(StringUtils.isNotBlank(repairOrder.getNums())){
           equipNums = Arrays.asList(repairOrder.getNums().trim().split(","));
           equipNums = Arrays.asList(repairOrder.getNums().trim().split("\n")).stream().filter(num->!num.equals("\n")).collect(Collectors.toList());
      }
      return page.setRecords(baseMapper.getRepairOrderList(page,repairOrder.getId(),repairOrder.getNum(),repairOrder.getEquipmentNum(),repairOrder.getEquipmentName(),repairOrder.getStatus(),repairOrder.getRepairOrderType(),repairOrder.getEquipmentCategoryId(),repairOrder.getFactoryModelId(),repairOrder.getSpecificEquipment(),repairOrder.getTeamId(),equipNums,repairOrder.getRepairOrderUda1()));
      return page.setRecords(baseMapper.getRepairOrderList(page,
            repairOrder.getId(),
            repairOrder.getNum(),
            repairOrder.getEquipmentNum(),
            repairOrder.getEquipmentName(),
            repairOrder.getStatus(),
            repairOrder.getRepairOrderType(),
            repairOrder.getEquipmentCategoryId(),
            repairOrder.getFactoryModelId(),
            repairOrder.getSpecificEquipment(),
            repairOrder.getTeamId(),
            equipNums,
            repairOrder.getRepairOrderUda1(),
            repairOrder.getFaultStartTime(),
            repairOrder.getFaultEndTime(),
            repairOrder.getCreateStartTime(),
            repairOrder.getCreateEndTime(),
            repairOrder.getEquipmentImportanceId(),
            repairOrder.getFaultCause()
            ));
   }
   @Override
   public List<Map<String, Object>> getFaultCause(String equipmentId) {
      return this.baseMapper.getFaultCause(equipmentId);
   }
   @Override
   public List<Map<String, Object>> getAllFaultCause() {
      return this.baseMapper.getAllFaultCause();
   }
   @Override
   public List<Map<String, Object>> getFaultCausePie( Map<String, Object> params) {
      return this.baseMapper.getFaultCausePie(params);
   }
   @Override
   public List<Map<String, Object>> getFaultCauseBar(Map<String, Object> params) {
      return this.baseMapper.getFaultCauseBar(params);
   }
   @Override
   public IPage<Map<String, Object>> getMTPF(Integer pageNo, Integer pageSize, Map<String, Object> params) {
      IPage<Map> pageData = new Page<Map>(pageNo, pageSize);
      return this.baseMapper.getMTPF(pageData,params);
   }
   @Override
@@ -115,5 +177,503 @@
      return super.baseMapper.getMaterialSpareList(pageData,num,status);
   }
   @Override
   public List<EquipmentAvailabilityVo> equipmentAvailability(Map<String, String> query) throws ParseException {
      List<EquipmentAvailabilityVo> equipmentAvailabilityVoList = new ArrayList<>();
      String yearStr = query.get("year");
      String startTime1 = "";
      String endTime1 = "";
      String startTime2 = "";
      String endTime2 = "";
      String startTime3 = "";
      String endTime3 = "";
      String startTime4 = "";
      String endTime4 = "";
      String startTime5 = "";
      String endTime5 = "";
      String startTime6 = "";
      String endTime6 = "";
      String startTime7 = "";
      String endTime7 = "";
      String startTime8 = "";
      String endTime8 = "";
      String startTime9 = "";
      String endTime9 = "";
      String startTime10 = "";
      String endTime10 = "";
      String startTime11 = "";
      String endTime11 = "";
      String startTime12 = "";
      String endTime12 = "";
        YearMonth yearMonth = null;
        if(StringUtils.isBlank(yearStr)){
         return equipmentAvailabilityVoList;
      }else {
            //根据年份获取本年度2月份有多少天
            yearMonth = YearMonth.of(Integer.parseInt(yearStr),2);
         startTime1 = yearStr+"-01-01 00:00:00";
         endTime1 = yearStr+"-01-31 23:59:59";
         startTime2 = yearStr+"-02-01 00:00:00";
         endTime2 = yearStr+"-02-"+String.valueOf(yearMonth.lengthOfMonth())+" 23:59:59";
         startTime3 = yearStr+"-03-01 00:00:00";
         endTime3 = yearStr+"-03-31 23:59:59";
         startTime4 = yearStr+"-04-01 00:00:00";
         endTime4 = yearStr+"-04-30 23:59:59";
         startTime5 = yearStr+"-05-01 00:00:00";
         endTime5 = yearStr+"-05-31 23:59:59";
         startTime6 = yearStr+"-06-01 00:00:00";
         endTime6 = yearStr+"-06-30 23:59:59";
         startTime7 = yearStr+"-07-01 00:00:00";
         endTime7 = yearStr+"-07-31 23:59:59";
         startTime8 = yearStr+"-08-01 00:00:00";
         endTime8 = yearStr+"-08-31 23:59:59";
         startTime9 = yearStr+"-09-01 00:00:00";
         endTime9 = yearStr+"-09-30 23:59:59";
         startTime10 = yearStr+"-10-01 00:00:00";
         endTime10 = yearStr+"-10-31 23:59:59";
         startTime11 = yearStr+"-11-01 00:00:00";
         endTime11 = yearStr+"-11-30 23:59:59";
         startTime12 = yearStr+"-12-01 00:00:00";
         endTime12 = yearStr+"-12-31 23:59:59";
      }
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      Date startDate1 = sdf.parse(startTime1);
      Date endDate1 = sdf.parse(endTime1);
      Date startDate2 = sdf.parse(startTime2);
      Date endDate2 = sdf.parse(endTime2);
      Date startDate3 = sdf.parse(startTime3);
      Date endDate3 = sdf.parse(endTime3);
      Date startDate4 = sdf.parse(startTime4);
      Date endDate4 = sdf.parse(endTime4);
      Date startDate5 = sdf.parse(startTime5);
      Date endDate5 = sdf.parse(endTime5);
      Date startDate6 = sdf.parse(startTime6);
      Date endDate6 = sdf.parse(endTime6);
      Date startDate7 = sdf.parse(startTime7);
      Date endDate7 = sdf.parse(endTime7);
      Date startDate8 = sdf.parse(startTime8);
      Date endDate8 = sdf.parse(endTime8);
      Date startDate9 = sdf.parse(startTime9);
      Date endDate9 = sdf.parse(endTime9);
      Date startDate10 = sdf.parse(startTime10);
      Date endDate10 = sdf.parse(endTime10);
      Date startDate11 = sdf.parse(startTime11);
      Date endDate11 = sdf.parse(endTime11);
      Date startDate12 = sdf.parse(startTime12);
      Date endDate12 = sdf.parse(endTime12);
      EquipmentAvailabilityVo equipmentAvailabilityVo1 = this.getFaultTime(startDate1,endDate1,"1",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo2 = this.getFaultTime(startDate2,endDate2,"2",yearMonth.lengthOfMonth());
      EquipmentAvailabilityVo equipmentAvailabilityVo3 = this.getFaultTime(startDate3,endDate3,"3",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo4 = this.getFaultTime(startDate4,endDate4,"4",30);
      EquipmentAvailabilityVo equipmentAvailabilityVo5 = this.getFaultTime(startDate5,endDate5,"5",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo6 = this.getFaultTime(startDate6,endDate6,"6",30);
      EquipmentAvailabilityVo equipmentAvailabilityVo7 = this.getFaultTime(startDate7,endDate7,"7",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo8 = this.getFaultTime(startDate8,endDate8,"8",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo9 = this.getFaultTime(startDate9,endDate9,"9",30);
      EquipmentAvailabilityVo equipmentAvailabilityVo10 = this.getFaultTime(startDate10,endDate10,"10",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo11 = this.getFaultTime(startDate11,endDate11,"11",30);
      EquipmentAvailabilityVo equipmentAvailabilityVo12 = this.getFaultTime(startDate12,endDate12,"12",31);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo1);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo2);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo3);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo4);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo5);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo6);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo7);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo8);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo9);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo10);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo11);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo12);
      return equipmentAvailabilityVoList;
   }
   @Override
   public List<EquipmentAvailabilityVo> getStartRate(Map<String, String> query) throws ParseException {
      List<EquipmentAvailabilityVo> equipmentAvailabilityVoList = new ArrayList<>();
      String yearStr = query.get("year");
      String startTime1 = "";
      String endTime1 = "";
      String startTime2 = "";
      String endTime2 = "";
      String startTime3 = "";
      String endTime3 = "";
      String startTime4 = "";
      String endTime4 = "";
      String startTime5 = "";
      String endTime5 = "";
      String startTime6 = "";
      String endTime6 = "";
      String startTime7 = "";
      String endTime7 = "";
      String startTime8 = "";
      String endTime8 = "";
      String startTime9 = "";
      String endTime9 = "";
      String startTime10 = "";
      String endTime10 = "";
      String startTime11 = "";
      String endTime11 = "";
      String startTime12 = "";
      String endTime12 = "";
      YearMonth yearMonth = null;
      if(StringUtils.isBlank(yearStr)){
         return equipmentAvailabilityVoList;
      }else {
         //根据年份获取本年度2月份有多少天
         yearMonth = YearMonth.of(Integer.parseInt(yearStr),2);
         startTime1 = yearStr+"-01-01 00:00:00";
         endTime1 = yearStr+"-01-31 23:59:59";
         startTime2 = yearStr+"-02-01 00:00:00";
         endTime2 = yearStr+"-02-"+String.valueOf(yearMonth.lengthOfMonth())+" 23:59:59";
         startTime3 = yearStr+"-03-01 00:00:00";
         endTime3 = yearStr+"-03-31 23:59:59";
         startTime4 = yearStr+"-04-01 00:00:00";
         endTime4 = yearStr+"-04-30 23:59:59";
         startTime5 = yearStr+"-05-01 00:00:00";
         endTime5 = yearStr+"-05-31 23:59:59";
         startTime6 = yearStr+"-06-01 00:00:00";
         endTime6 = yearStr+"-06-30 23:59:59";
         startTime7 = yearStr+"-07-01 00:00:00";
         endTime7 = yearStr+"-07-31 23:59:59";
         startTime8 = yearStr+"-08-01 00:00:00";
         endTime8 = yearStr+"-08-31 23:59:59";
         startTime9 = yearStr+"-09-01 00:00:00";
         endTime9 = yearStr+"-09-30 23:59:59";
         startTime10 = yearStr+"-10-01 00:00:00";
         endTime10 = yearStr+"-10-31 23:59:59";
         startTime11 = yearStr+"-11-01 00:00:00";
         endTime11 = yearStr+"-11-30 23:59:59";
         startTime12 = yearStr+"-12-01 00:00:00";
         endTime12 = yearStr+"-12-31 23:59:59";
      }
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      Date startDate1 = sdf.parse(startTime1);
      Date endDate1 = sdf.parse(endTime1);
      Date startDate2 = sdf.parse(startTime2);
      Date endDate2 = sdf.parse(endTime2);
      Date startDate3 = sdf.parse(startTime3);
      Date endDate3 = sdf.parse(endTime3);
      Date startDate4 = sdf.parse(startTime4);
      Date endDate4 = sdf.parse(endTime4);
      Date startDate5 = sdf.parse(startTime5);
      Date endDate5 = sdf.parse(endTime5);
      Date startDate6 = sdf.parse(startTime6);
      Date endDate6 = sdf.parse(endTime6);
      Date startDate7 = sdf.parse(startTime7);
      Date endDate7 = sdf.parse(endTime7);
      Date startDate8 = sdf.parse(startTime8);
      Date endDate8 = sdf.parse(endTime8);
      Date startDate9 = sdf.parse(startTime9);
      Date endDate9 = sdf.parse(endTime9);
      Date startDate10 = sdf.parse(startTime10);
      Date endDate10 = sdf.parse(endTime10);
      Date startDate11 = sdf.parse(startTime11);
      Date endDate11 = sdf.parse(endTime11);
      Date startDate12 = sdf.parse(startTime12);
      Date endDate12 = sdf.parse(endTime12);
      EquipmentAvailabilityVo equipmentAvailabilityVo1 = this.getRepairTime(startDate1,endDate1,"1",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo2 = this.getRepairTime(startDate2,endDate2,"2",yearMonth.lengthOfMonth());
      EquipmentAvailabilityVo equipmentAvailabilityVo3 = this.getRepairTime(startDate3,endDate3,"3",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo4 = this.getRepairTime(startDate4,endDate4,"4",30);
      EquipmentAvailabilityVo equipmentAvailabilityVo5 = this.getRepairTime(startDate5,endDate5,"5",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo6 = this.getRepairTime(startDate6,endDate6,"6",30);
      EquipmentAvailabilityVo equipmentAvailabilityVo7 = this.getRepairTime(startDate7,endDate7,"7",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo8 = this.getRepairTime(startDate8,endDate8,"8",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo9 = this.getRepairTime(startDate9,endDate9,"9",30);
      EquipmentAvailabilityVo equipmentAvailabilityVo10 = this.getRepairTime(startDate10,endDate10,"10",31);
      EquipmentAvailabilityVo equipmentAvailabilityVo11 = this.getRepairTime(startDate11,endDate11,"11",30);
      EquipmentAvailabilityVo equipmentAvailabilityVo12 = this.getRepairTime(startDate12,endDate12,"12",31);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo1);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo2);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo3);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo4);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo5);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo6);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo7);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo8);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo9);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo10);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo11);
      equipmentAvailabilityVoList.add(equipmentAvailabilityVo12);
      return equipmentAvailabilityVoList;
   }
   public EquipmentAvailabilityVo getFaultTime(Date startDate,Date endDate,String month,int days) throws ParseException {
      List<Equipment> equipmentList = equipmentService.lambdaQuery().eq(Equipment::getEquipmentImportanceId,"A").eq(Equipment::getDelFlag, CommonConstant.DEL_FLAG_0).lt(Equipment::getAcceptanceCheckDate,endDate).list();
        //A类设备台数
      int countA = equipmentList.size();
      EquipmentAvailabilityVo equipmentAvailabilityVo = new EquipmentAvailabilityVo();
      BigDecimal equipmentFaultTime = new BigDecimal("0");
      //故障台次
      int count = 0;
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      if(countA == 0){
         equipmentAvailabilityVo.setMonth(month);
         equipmentAvailabilityVo.setCountA(countA);
         equipmentAvailabilityVo.setFaultNumber("0");
         equipmentAvailabilityVo.setFaultDuration(new BigDecimal("0"));
         equipmentAvailabilityVo.setAvailability("0%");
      }
      //查询一月份故障时间
      for(Equipment equipment : equipmentList){
         //查询设备是否有报修单
         List<EquipmentReportRepair> equipmentReportRepairList = equipmentReportRepairService.lambdaQuery().eq(EquipmentReportRepair::getEquipmentId,equipment.getId())
               .eq(EquipmentReportRepair::getDelFlag,CommonConstant.DEL_FLAG_0).list();
         if(CollectionUtils.isNotEmpty(equipmentReportRepairList)){
            //当前设备的故障时间集合,用于判断多次故障是否发生在同一天
            List<String> faultTimeList = new ArrayList<>();
            //一、查询故障时间
            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());
                     int flag = 0;
                     if(CollectionUtils.isNotEmpty(faultTimeList)){
                        for(String faultTime : faultTimeList){
                           if(faultTime.equals(sdf.format(equipmentReportRepair.getFaultTime()))){
                              flag = 1;
                           }
                        }
                     }
                     if(flag == 0){
                        count++;
                        faultTimeList.add(sdf.format(equipmentReportRepair.getFaultTime()));
                     }
                     //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);
                     int flag = 0;
                     if(CollectionUtils.isNotEmpty(faultTimeList)){
                        for(String faultTime : faultTimeList){
                           if(faultTime.equals(sdf.format(equipmentReportRepair.getFaultTime()))){
                              flag = 1;
                           }
                        }
                     }
                     if(flag == 0){
                        count++;
                        faultTimeList.add(sdf.format(equipmentReportRepair.getFaultTime()));
                     }
                  }
                  //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);
                     int flag = 0;
                     if(CollectionUtils.isNotEmpty(faultTimeList)){
                        for(String faultTime : faultTimeList){
                           if(faultTime.equals(sdf.format(equipmentReportRepair.getFaultTime()))){
                              flag = 1;
                           }
                        }
                     }
                     if(flag == 0){
                        count++;
                        faultTimeList.add(sdf.format(equipmentReportRepair.getFaultTime()));
                     }
                     //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);
                     int flag = 0;
                     if(CollectionUtils.isNotEmpty(faultTimeList)){
                        for(String faultTime : faultTimeList){
                           if(faultTime.equals(sdf.format(equipmentReportRepair.getFaultTime()))){
                              flag = 1;
                           }
                        }
                     }
                     if(flag == 0){
                        count++;
                        faultTimeList.add(sdf.format(equipmentReportRepair.getFaultTime()));
                     }
                  }
               }
            }
            BigDecimal availability = new BigDecimal(countA).multiply(new BigDecimal(days)).subtract(new BigDecimal(count)).multiply(new BigDecimal(100)).divide(new BigDecimal(countA).multiply(new BigDecimal(days)),2,BigDecimal.ROUND_HALF_EVEN);
            equipmentAvailabilityVo.setMonth(month);
            equipmentAvailabilityVo.setCountA(countA);
            equipmentAvailabilityVo.setFaultNumber(String.valueOf(count));
            equipmentAvailabilityVo.setFaultDuration(equipmentFaultTime);
            equipmentAvailabilityVo.setAvailability(availability +"%");
         }else {
            equipmentAvailabilityVo.setMonth(month);
            equipmentAvailabilityVo.setCountA(countA);
            equipmentAvailabilityVo.setFaultNumber("0");
            equipmentAvailabilityVo.setFaultDuration(new BigDecimal("0"));
            equipmentAvailabilityVo.setAvailability("100%");
         }
      }
      return equipmentAvailabilityVo;
   }
   public EquipmentAvailabilityVo getRepairTime(Date startDate,Date endDate,String month,int days) throws ParseException {
      List<Equipment> equipmentList = equipmentService.lambdaQuery().eq(Equipment::getSpecificEquipment,"0").eq(Equipment::getDelFlag, CommonConstant.DEL_FLAG_0).lt(Equipment::getAcceptanceCheckDate,endDate).list();
      //关键设备台数
      int countA = equipmentList.size();
      EquipmentAvailabilityVo equipmentAvailabilityVo = new EquipmentAvailabilityVo();
      BigDecimal equipmentFaultTime = new BigDecimal("0");
      BigDecimal equipmentRepairTime = new BigDecimal("0");
      //维修台次
      int count = 0;
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      if(countA == 0){
         equipmentAvailabilityVo.setMonth(month);
         equipmentAvailabilityVo.setCountA(countA);
         equipmentAvailabilityVo.setFaultNumber("0");
         equipmentAvailabilityVo.setFaultDuration(new BigDecimal("0"));
         equipmentAvailabilityVo.setAvailability("0%");
      }
      //查询一月份故障时间
      for(Equipment equipment : equipmentList){
         //查询设备是否有报修单
         List<EquipmentReportRepair> equipmentReportRepairList = equipmentReportRepairService.lambdaQuery().eq(EquipmentReportRepair::getEquipmentId,equipment.getId())
               .eq(EquipmentReportRepair::getDelFlag,CommonConstant.DEL_FLAG_0).list();
         if(CollectionUtils.isNotEmpty(equipmentReportRepairList)){
            //当前设备的开工时间集合,用于判断是否在同一天维修了同一个设备
            List<String> startTimeList = new ArrayList<>();
            //一、查询故障时间
            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());
                     //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);
                  }
                  //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);
                     //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);
                  }
               }
               //二、查询修复时间
               //查询报修单是否已领取并开工
               List<RepairOrder> repairOrderList = this.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());
                        int flag = 0;
                        if(CollectionUtils.isNotEmpty(startTimeList)){
                           for(String faultTime : startTimeList){
                              if(faultTime.equals(sdf.format(repairOrderList.get(0).getActualStartTime()))){
                                 flag = 1;
                              }
                           }
                        }
                        if(flag == 0){
                           count++;
                           startTimeList.add(sdf.format(repairOrderList.get(0).getActualStartTime()));
                        }
                        //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);
                        int flag = 0;
                        if(CollectionUtils.isNotEmpty(startTimeList)){
                           for(String faultTime : startTimeList){
                              if(faultTime.equals(sdf.format(repairOrderList.get(0).getActualStartTime()))){
                                 flag = 1;
                              }
                           }
                        }
                        if(flag == 0){
                           count++;
                           startTimeList.add(sdf.format(repairOrderList.get(0).getActualStartTime()));
                        }
                     }
                     //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);
                        int flag = 0;
                        if(CollectionUtils.isNotEmpty(startTimeList)){
                           for(String faultTime : startTimeList){
                              if(faultTime.equals(sdf.format(repairOrderList.get(0).getActualStartTime()))){
                                 flag = 1;
                              }
                           }
                        }
                        if(flag == 0){
                           count++;
                           startTimeList.add(sdf.format(repairOrderList.get(0).getActualStartTime()));
                        }
                        //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);
                        int flag = 0;
                        if(CollectionUtils.isNotEmpty(startTimeList)){
                           for(String faultTime : startTimeList){
                              if(faultTime.equals(sdf.format(repairOrderList.get(0).getActualStartTime()))){
                                 flag = 1;
                              }
                           }
                        }
                        if(flag == 0){
                           count++;
                           startTimeList.add(sdf.format(repairOrderList.get(0).getActualStartTime()));
                        }
                     }
                  }
               }
            }
            BigDecimal availability = new BigDecimal(countA).multiply(new BigDecimal(days)).subtract(new BigDecimal(count)).multiply(new BigDecimal(100)).divide(new BigDecimal(countA).multiply(new BigDecimal(days)),2,BigDecimal.ROUND_HALF_EVEN);
            equipmentAvailabilityVo.setMonth(month);
            equipmentAvailabilityVo.setCountA(countA);
            equipmentAvailabilityVo.setFaultNumber(String.valueOf(count));
            equipmentAvailabilityVo.setFaultDuration(equipmentFaultTime);
            equipmentAvailabilityVo.setAvailability(availability +"%");
         }else {
            equipmentAvailabilityVo.setMonth(month);
            equipmentAvailabilityVo.setCountA(countA);
            equipmentAvailabilityVo.setFaultNumber("0");
            equipmentAvailabilityVo.setFaultDuration(new BigDecimal("0"));
            equipmentAvailabilityVo.setAvailability("100%");
         }
      }
      return equipmentAvailabilityVo;
   }
}