From eadaad85fc5fed59c34a0145c2f99a1022581458 Mon Sep 17 00:00:00 2001
From: cuijian <cuijian@xalxzn.com>
Date: 星期二, 21 十一月 2023 20:57:25 +0800
Subject: [PATCH] 生产时间间隔报表逻辑、设备完好率报表逻辑

---
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/FaultIntervalTime.java                  |   17 +
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/FaultIntervalTimeServiceImpl.java |  174 +++++++++++++++++++++
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/FaultIntervalTimeController.java    |   26 +++
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IFaultIntervalTimeService.java         |    6 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IRepairOrderService.java               |    3 
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/RepairOrderController.java          |   16 ++
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/RepairOrderServiceImpl.java       |  185 +++++++++++++++++++++++
 lxzn-module-eam/src/main/java/org/jeecg/modules/eam/vo/EquipmentAvailabilityVo.java                |   38 ++++
 8 files changed, 460 insertions(+), 5 deletions(-)

diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/FaultIntervalTimeController.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/FaultIntervalTimeController.java
index 58abbaf..6e711c3 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/FaultIntervalTimeController.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/FaultIntervalTimeController.java
@@ -1,5 +1,6 @@
 package org.jeecg.modules.eam.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,15 +13,20 @@
 import org.jeecg.common.system.query.QueryGenerator;
 import org.jeecg.modules.eam.entity.FaultIntervalTime;
 import org.jeecg.modules.eam.service.IFaultIntervalTimeService;
+import org.jeecg.modules.eam.vo.EquipmentAvailabilityVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.text.ParseException;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
- /**
+/**
  * @Description: mom_eam_fault_interval_time
  * @Author: jeecg-boot
  * @Date:   2023-08-30
@@ -158,4 +164,22 @@
         return super.importExcel(request, response, FaultIntervalTime.class);
     }
 
+
+	/**
+	 * 鐢熶骇璁惧骞冲潎鏁呴殰闂撮殧鏃堕棿MTBF
+	 * (璇存槑:璁惧骞冲潎鎶�闅滈棿闅旀湡 (MTBF): 鎸囧湪瑙勫畾鏈熷唴锛岃澶囨棤鏁呴殰宸ヤ綔鏃堕棿鐨勫钩鍧囧�笺�傝澶囩殑骞冲潎鏁呴殰鍚岄殧鏈熸寚鏍囪秺澶уソ锛岃〃鏄庤澶囨棤鏁呴殰杩愯鏃堕棿闀裤��
+	 * 璁惧骞冲潎鏁呴殰闂撮殧鏈燂紙MTBP锛�=锛堟棩鍘嗘椂闂�-鎬绘晠闅滃仠鏈烘椂闂达級/鎬绘晠闅滄鏁帮級
+	 *
+	 * @return
+	 */
+	@GetMapping("/getMTBF")
+	public JSONObject getMTBF(@RequestParam Map<String, String> query) throws ParseException {
+		Map<String,Object> result= new HashMap<>();
+		IPage<FaultIntervalTime> pageData = new Page<FaultIntervalTime>();
+		List<FaultIntervalTime> list = faultIntervalTimeService.getMTBF(query);
+		JSONObject jsonObject = new JSONObject();
+		jsonObject.put("data",list);
+		return jsonObject;
+	}
+
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/RepairOrderController.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/RepairOrderController.java
index 9af40e8..a867a9c 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/RepairOrderController.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/controller/RepairOrderController.java
@@ -1,5 +1,6 @@
 package org.jeecg.modules.eam.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -19,6 +20,7 @@
 import org.jeecg.common.util.oConvertUtils;
 import org.jeecg.modules.eam.entity.*;
 import org.jeecg.modules.eam.service.*;
+import org.jeecg.modules.eam.vo.EquipmentAvailabilityVo;
 import org.jeecgframework.poi.excel.ExcelImportUtil;
 import org.jeecgframework.poi.excel.def.NormalExcelConstants;
 import org.jeecgframework.poi.excel.entity.ExportParams;
@@ -36,6 +38,7 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.text.ParseException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -1700,4 +1703,17 @@
 		 repairOrderService.updateById(repairOrder);
 		 return Result.OK("鎿嶄綔鎴愬姛");
 	 }
+
+	 /**
+	  * 璁惧瀹屽ソ鐜�
+	  *
+	  * @return
+	  */
+	 @GetMapping("/equipmentAvailability")
+	 public JSONObject equipmentAvailability(@RequestParam Map<String, String> query) throws ParseException {
+		 List<EquipmentAvailabilityVo> list = repairOrderService.equipmentAvailability(query);
+		 JSONObject jsonObject = new JSONObject();
+		 jsonObject.put("data",list);
+		 return jsonObject;
+	 }
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/FaultIntervalTime.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/FaultIntervalTime.java
index f219d33..30cf1c6 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/FaultIntervalTime.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/entity/FaultIntervalTime.java
@@ -4,10 +4,8 @@
 import java.io.UnsupportedEncodingException;
 import java.util.Date;
 import java.math.BigDecimal;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableLogic;
+
+import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -96,4 +94,15 @@
     @DateTimeFormat(pattern="yyyy-MM-dd")
     @ApiModelProperty(value = "updateTime")
     private Date updateTime;
+
+	@TableField(exist = false)
+    private String equipmentNum;
+    @TableField(exist = false)
+    private String equipmentName;
+    @TableField(exist = false)
+    private String equipmentModel;
+    @TableField(exist = false)
+    private String userDepart;
+
+
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IFaultIntervalTimeService.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IFaultIntervalTimeService.java
index bdb595b..e201a8b 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IFaultIntervalTimeService.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IFaultIntervalTimeService.java
@@ -2,6 +2,11 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.jeecg.modules.eam.entity.FaultIntervalTime;
+import org.jeecg.modules.eam.vo.EquipmentAvailabilityVo;
+
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: mom_eam_fault_interval_time
@@ -11,4 +16,5 @@
  */
 public interface IFaultIntervalTimeService extends IService<FaultIntervalTime> {
 
+    public List<FaultIntervalTime> getMTBF(Map<String, String> query) throws ParseException;
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IRepairOrderService.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IRepairOrderService.java
index 77d0c6b..c418a21 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IRepairOrderService.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/IRepairOrderService.java
@@ -5,8 +5,10 @@
 import org.apache.ibatis.annotations.Param;
 import org.jeecg.modules.eam.entity.RepairOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.eam.vo.EquipmentAvailabilityVo;
 
 import java.io.Serializable;
+import java.text.ParseException;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -47,4 +49,5 @@
 
 	IPage<Map<String, Object>> getMaterialSpareList(Integer pageNo, Integer pageSize, Map<String, Object> params);
 
+	public List<EquipmentAvailabilityVo> equipmentAvailability(Map<String, String> query)  throws ParseException;
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/FaultIntervalTimeServiceImpl.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/FaultIntervalTimeServiceImpl.java
index 6a9b8ed..c6324fb 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/FaultIntervalTimeServiceImpl.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/FaultIntervalTimeServiceImpl.java
@@ -1,10 +1,34 @@
 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
@@ -15,4 +39,154 @@
 @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(new BigDecimal(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;
+    }
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/RepairOrderServiceImpl.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/RepairOrderServiceImpl.java
index 07dd294..aebfa46 100644
--- a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/RepairOrderServiceImpl.java
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/service/impl/RepairOrderServiceImpl.java
@@ -1,14 +1,21 @@
 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.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,6 +23,9 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 /**
@@ -45,6 +55,10 @@
 	private EquipmentDocumentMapper equipmentDocumentMapper;
 	@Autowired
 	private SysUserMapper sysUserMapper;
+	@Autowired
+	private IEamEquipmentService equipmentService;
+	@Autowired
+	private IEquipmentReportRepairService equipmentReportRepairService;
 
 
 
@@ -115,5 +129,176 @@
 		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 = "";
+		if(StringUtils.isBlank(yearStr)){
+			return equipmentAvailabilityVoList;
+		}else {
+			startTime1 = yearStr+"-01-01 00:00:00";
+			endTime1 = yearStr+"-01-31 23:59:59";
+			startTime2 = yearStr+"-02-01 00:00:00";
+			endTime2 = yearStr+"-02-31 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");
+		EquipmentAvailabilityVo equipmentAvailabilityVo2 = this.getFaultTime(startDate2,endDate2,"2");
+		EquipmentAvailabilityVo equipmentAvailabilityVo3 = this.getFaultTime(startDate3,endDate3,"3");
+		EquipmentAvailabilityVo equipmentAvailabilityVo4 = this.getFaultTime(startDate4,endDate4,"4");
+		EquipmentAvailabilityVo equipmentAvailabilityVo5 = this.getFaultTime(startDate5,endDate5,"5");
+		EquipmentAvailabilityVo equipmentAvailabilityVo6 = this.getFaultTime(startDate6,endDate6,"6");
+		EquipmentAvailabilityVo equipmentAvailabilityVo7 = this.getFaultTime(startDate7,endDate7,"7");
+		EquipmentAvailabilityVo equipmentAvailabilityVo8 = this.getFaultTime(startDate8,endDate8,"8");
+		EquipmentAvailabilityVo equipmentAvailabilityVo9 = this.getFaultTime(startDate9,endDate9,"9");
+		EquipmentAvailabilityVo equipmentAvailabilityVo10 = this.getFaultTime(startDate10,endDate10,"10");
+		EquipmentAvailabilityVo equipmentAvailabilityVo11 = this.getFaultTime(startDate11,endDate11,"11");
+		EquipmentAvailabilityVo equipmentAvailabilityVo12 = this.getFaultTime(startDate12,endDate12,"12");
+		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) throws ParseException {
+		//鏌ヨA绫昏澶囧彴鏁帮紝鎴鍒�1鏈堝簳
+		List<Equipment> equipmentList = equipmentService.lambdaQuery().eq(Equipment::getEquipmentImportanceId,"A").eq(Equipment::getDelFlag, CommonConstant.DEL_FLAG_0).lt(Equipment::getAcceptanceCheckDate,endDate).list();
+		Integer countA = equipmentList.size();
+		EquipmentAvailabilityVo equipmentAvailabilityVo = new EquipmentAvailabilityVo();
+		BigDecimal equipmentFaultTime = new BigDecimal("0");
+		int count = 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)){
+				//涓�銆佹煡璇㈡晠闅滄椂闂�
+				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(new BigDecimal(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++;
+						}
+					}
+				}
+				equipmentAvailabilityVo.setMonth(month);
+				equipmentAvailabilityVo.setCountA(countA);
+				equipmentAvailabilityVo.setFaultNumber(String.valueOf(count));
+				equipmentAvailabilityVo.setFaultDuration(equipmentFaultTime);
+			}else {
+				equipmentAvailabilityVo.setMonth(month);
+				equipmentAvailabilityVo.setCountA(countA);
+				equipmentAvailabilityVo.setFaultNumber("0");
+				equipmentAvailabilityVo.setFaultDuration(new BigDecimal("0"));
+				equipmentAvailabilityVo.setAvailability("100");
+			}
+		}
+		return equipmentAvailabilityVo;
+	}
+
 
 }
diff --git a/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/vo/EquipmentAvailabilityVo.java b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/vo/EquipmentAvailabilityVo.java
new file mode 100644
index 0000000..32c04ea
--- /dev/null
+++ b/lxzn-module-eam/src/main/java/org/jeecg/modules/eam/vo/EquipmentAvailabilityVo.java
@@ -0,0 +1,38 @@
+package org.jeecg.modules.eam.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.jeecg.common.aspect.annotation.Dict;
+import org.jeecg.common.constant.CommonConstant;
+import org.jeecg.common.system.base.entity.JeecgEntity;
+import org.jeecg.modules.eam.entity.EquipmentUnsealDetail;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.jeecgframework.poi.excel.annotation.ExcelCollection;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @Description: 璁惧瀹屽ソ鐜�
+ * @Author: cj
+ * @Date:   2023-11-16
+ * @Version: V1.0
+ */
+@Data
+public class EquipmentAvailabilityVo {
+
+
+	/**鏈堜唤*/
+    private String month;
+	/**A绫昏澶囧彴鏁�*/
+    private Integer countA;
+	/**鏁呴殰鏃堕棿*/
+    private BigDecimal faultDuration;
+
+	/**鏁呴殰鎬诲彴娆�*/
+    private String faultNumber;
+	/**A绫昏澶囧畬濂界巼*/
+	private String availability;
+}

--
Gitblit v1.9.3