Ver Fonte

数据统计-维保统计

黄远 há 5 anos atrás
pai
commit
b54d4f88dd

+ 50 - 0
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/dao/model/MaintenanceDataModel.java

@@ -2,6 +2,8 @@ package cn.com.ty.lift.batch.applet.dao.model;
 
 import lombok.Data;
 
+import java.time.LocalDate;
+
 /**
  * @author huangyuan
  * @date 2020/2/3
@@ -9,4 +11,52 @@ import lombok.Data;
  */
 @Data
 public class MaintenanceDataModel extends BaseDataModel {
+    /**
+     * 电梯id
+     */
+    private Long liftId;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+
+    /**
+     * 计划维保时间
+     */
+    private LocalDate planDate;
+
+    /**
+     * 保养次数
+     */
+    private Integer count;
+
+    /**
+     * 首保时间
+     */
+    private LocalDate firstDate;
+
+    /**
+     * 维保记录id
+     */
+    private Long recordId;
+
+    /**
+     * 保养完成时间
+     */
+    private LocalDate finishDate;
+
+    /**
+     * 计划制定时间
+     */
+    private LocalDate createDate;
+
+    /**
+     * 保养状态 0:待完成 1:已完成 2:超期
+     */
+    private Integer maintenanceStatus;
+
+    /**
+     * 超期类型 1:计划超期 2:法规超期
+     */
+    private Integer beyondType;
 }

+ 10 - 0
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/dao/model/request/MaintenanceDataRequest.java

@@ -2,6 +2,8 @@ package cn.com.ty.lift.batch.applet.dao.model.request;
 
 import lombok.Data;
 
+import java.time.LocalDate;
+
 /**
  * @author huangyuan
  * @date 2020/2/4
@@ -9,4 +11,12 @@ import lombok.Data;
  */
 @Data
 public class MaintenanceDataRequest extends CommonRequest {
+    /**
+     * 起始时间
+     */
+    private LocalDate startDate;
+    /**
+     * 终止时间
+     */
+    private LocalDate endDate;
 }

+ 37 - 40
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/service/ContractDataService.java

@@ -48,19 +48,18 @@ public class ContractDataService {
             Map<Long, ContractDataModel> idToContractModel = contractDataModelList.stream().collect(Collectors.toMap(ContractDataModel::getId, a -> a));
             //设置合同状态
             contractDataModelList.forEach(a -> {
-                        switch (a.getStatus()) {
-                            case 2:
-                                a.setContractType(2);
-                            case 3:
-                                //合同结束,如果有续签,则合同未丢失,如果没有需求合同丢失
-                                a.setContractType(3);
-                                ContractDataModel contractDataModel = idToContractModel.get(a.getId());
-                                if (contractDataModel != null) {
-                                    a.setContractType(0);
-                                }
+                switch (a.getStatus()) {
+                    case 2:
+                        a.setContractType(2);
+                    case 3:
+                        //合同结束,如果有续签,则合同未丢失,如果没有需求合同丢失
+                        a.setContractType(3);
+                        ContractDataModel contractDataModel = idToContractModel.get(a.getId());
+                        if (contractDataModel != null) {
+                            a.setContractType(0);
                         }
-                    }
-            );
+                }
+            });
         }
         //通过公司id给数据分组
         DataStatisticsUtil.putStatisticsDataToRedis(contractDataModelList, redisTemplate,
@@ -137,24 +136,23 @@ public class ContractDataService {
                     .collect(Collectors.toList());
             //循环设置丢失合同信息
             contractDataModelList.forEach(a -> {
-                        LostContractResponse lostContractResponse = new LostContractResponse();
-                        lostContractResponse.setContractCode(a.getCode());
-                        lostContractResponse.setProjectName(a.getProjectName());
-                        lostContractResponse.setStartDate(a.getStarDate());
-                        lostContractResponse.setEndDate(a.getEndDate());
-                        //设置应收金额
-                        double planMoney = a.getPlanMoney() != null ? a.getPlanMoney().doubleValue() : 0d;
-                        double workMoney = a.getWorkMoney() != null ? a.getWorkMoney().doubleValue() : 0d;
-                        lostContractResponse.setNotReceiveMoney(planMoney - workMoney);
-                        //设置持续时间
-                        lostContractResponse.setDuration(0L);
-                        if (a.getStarDate() != null && a.getEndDate() != null) {
-                            lostContractResponse.setDuration(
-                                    Duration.between(a.getEndDate(), a.getStarDate()).toDays());
-                        }
-                        finalLostContractResponseList.add(lostContractResponse);
-                    }
-            );
+                LostContractResponse lostContractResponse = new LostContractResponse();
+                lostContractResponse.setContractCode(a.getCode());
+                lostContractResponse.setProjectName(a.getProjectName());
+                lostContractResponse.setStartDate(a.getStarDate());
+                lostContractResponse.setEndDate(a.getEndDate());
+                //设置应收金额
+                double planMoney = a.getPlanMoney() != null ? a.getPlanMoney().doubleValue() : 0d;
+                double workMoney = a.getWorkMoney() != null ? a.getWorkMoney().doubleValue() : 0d;
+                lostContractResponse.setNotReceiveMoney(planMoney - workMoney);
+                //设置持续时间
+                lostContractResponse.setDuration(0L);
+                if (a.getStarDate() != null && a.getEndDate() != null) {
+                    lostContractResponse.setDuration(
+                            Duration.between(a.getEndDate(), a.getStarDate()).toDays());
+                }
+                finalLostContractResponseList.add(lostContractResponse);
+            });
             //通过应收金额降序排列,并取前5的数据
             lostContractResponseList = finalLostContractResponseList.stream()
                     .sorted(Comparator.comparing(a -> a.getNotReceiveMoney())).limit(5)
@@ -179,21 +177,20 @@ public class ContractDataService {
                     .filter(a -> a.getContractType() == 2)
                     .collect(Collectors.toList());
             contractDataModelList.forEach(a -> {
-                        DueToContractResponse dueToContractResponse = new DueToContractResponse();
-                        dueToContractResponse.setCollectDate(a.getPlanDate());
-                        dueToContractResponse.setEndDate(a.getEndDate());
-                        dueToContractResponse.setProjectName(a.getProjectName());
-                        double needMoney = a.getPlanMoney() != null ? a.getPlanMoney().doubleValue() : 0d;
-                        dueToContractResponse.setNeedMoney(needMoney);
-                        finalDueToContractResponseList.add(dueToContractResponse);
-                    }
-            );
+                DueToContractResponse dueToContractResponse = new DueToContractResponse();
+                dueToContractResponse.setCollectDate(a.getPlanDate());
+                dueToContractResponse.setEndDate(a.getEndDate());
+                dueToContractResponse.setProjectName(a.getProjectName());
+                double needMoney = a.getPlanMoney() != null ? a.getPlanMoney().doubleValue() : 0d;
+                dueToContractResponse.setNeedMoney(needMoney);
+                finalDueToContractResponseList.add(dueToContractResponse);
+            });
             //通过到期时间顺序排列
             dueToContractResponseList = finalDueToContractResponseList.stream()
                     .sorted(Comparator.comparing(DueToContractResponse::getEndDate))
                     .collect(Collectors.toList());
             //如果是前5的数据获取前5的数据
-            if("top5".equals(contractDataRequest.getContractScope())){
+            if ("top5".equals(contractDataRequest.getContractScope())) {
                 dueToContractResponseList = dueToContractResponseList.stream()
                         .limit(5).collect(Collectors.toList());
             }

+ 6 - 8
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/service/LiftDataService.java

@@ -243,17 +243,15 @@ public class LiftDataService {
             projectNameToLiftNums = liftDataModelList.stream()
                     .collect(Collectors.groupingBy(LiftDataModel::getProjectName, Collectors.counting()));
         }
-        //通过电梯台量给map排序
-        projectNameToLiftNums.entrySet().stream()
-                .sorted(Comparator.comparing(entry -> entry.getValue()));
+        //通过电梯台量给map排序 通过值降序
+        projectNameToLiftNums = DataStatisticsUtil.sortByValue(projectNameToLiftNums, true);
         //获取前5的数据
         Map<String, Long> topFive = new HashMap<>();
         projectNameToLiftNums.forEach((key, value) -> {
-                    if (topFive.size() < 5) {
-                        topFive.put(key, value);
-                    }
-                }
-        );
+            if (topFive.size() < 5) {
+                topFive.put(key, value);
+            }
+        });
         return RestResponse.success(topFive, ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
     }
 }

+ 128 - 2
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/service/MaintenanceDataService.java

@@ -5,6 +5,7 @@ import cn.com.ty.lift.batch.applet.dao.mapper.MaintenanceDataMapper;
 import cn.com.ty.lift.batch.applet.dao.model.MaintenanceDataModel;
 import cn.com.ty.lift.batch.applet.dao.model.request.CommonRequest;
 import cn.com.ty.lift.batch.applet.dao.model.request.MaintenanceDataRequest;
+import cn.com.ty.lift.batch.applet.dao.model.response.MaintenanceOverViewResponse;
 import cn.com.ty.lift.batch.applet.util.DataStatisticsUtil;
 import cn.com.ty.lift.common.constants.ApiConstants;
 import cn.com.xwy.boot.web.dto.RestResponse;
@@ -12,7 +13,12 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author huangyuan
@@ -52,6 +58,20 @@ public class MaintenanceDataService {
         List<MaintenanceDataModel> maintenanceDataModelList = (List<MaintenanceDataModel>) DataStatisticsUtil
                 .getStatisticsDataFromRedis(redisTemplate, DataStatisticsConstants.MAINTENANCE_DATA_FIELD,
                         maintenanceDataRequest.getMtCompanyId());
+        if (maintenanceDataModelList != null && maintenanceDataModelList.size() > 0) {
+            //通过起始时间过滤
+            if (maintenanceDataRequest.getStartDate() != null) {
+                maintenanceDataModelList = maintenanceDataModelList.stream()
+                        .filter(a -> a.getPlanDate().isAfter(maintenanceDataRequest.getStartDate()))
+                        .collect(Collectors.toList());
+            }
+            //通过终止时间过滤
+            if (maintenanceDataRequest.getEndDate() != null) {
+                maintenanceDataModelList = maintenanceDataModelList.stream()
+                        .filter(a -> a.getPlanDate().isBefore(maintenanceDataRequest.getEndDate()))
+                        .collect(Collectors.toList());
+            }
+        }
         return maintenanceDataModelList;
     }
 
@@ -62,7 +82,21 @@ public class MaintenanceDataService {
      * @date 2020/2/5 4:50 下午
      */
     public RestResponse maintenanceOverView(MaintenanceDataRequest maintenanceDataRequest) {
-        return RestResponse.success(ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
+        MaintenanceOverViewResponse maintenanceOverViewResponse = new MaintenanceOverViewResponse();
+        //从redis中获取数据
+        List<MaintenanceDataModel> maintenanceDataModelList = getMaintenanceDataListFromRedis(maintenanceDataRequest);
+        if (maintenanceDataModelList != null && maintenanceDataModelList.size() > 0) {
+            //设置计划保养数
+            maintenanceOverViewResponse.setPlanNum(maintenanceDataModelList.stream().count());
+            //保养状态 0:待完成 1:已完成 2:超期
+            //设置完成保养数
+            long finishNum = maintenanceDataModelList.stream()
+                    .filter(a -> a.getMaintenanceStatus() == 1)
+                    .count();
+            maintenanceOverViewResponse.setFinishNum(finishNum);
+            setBeyondNum(maintenanceOverViewResponse, maintenanceDataModelList);
+        }
+        return RestResponse.success(maintenanceOverViewResponse, ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
     }
 
     /**
@@ -72,6 +106,98 @@ public class MaintenanceDataService {
      * @date 2020/2/5 4:53 下午
      */
     public RestResponse beyondStatistics(MaintenanceDataRequest maintenanceDataRequest) {
-        return RestResponse.success(ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
+        Map<String, Long> projectNameToBeyondNum = new HashMap<>();
+        //从redis中获取维保数据
+        List<MaintenanceDataModel> maintenanceDataModelList = getMaintenanceDataListFromRedis(maintenanceDataRequest);
+        if (maintenanceDataModelList != null && maintenanceDataModelList.size() > 0) {
+            //获取超期数
+            maintenanceDataModelList = maintenanceDataModelList.stream()
+                    .filter(a -> a.getMaintenanceStatus() == 2)
+                    .collect(Collectors.toList());
+            Map<String, Long> allProjectNameToBeyondNum = maintenanceDataModelList.stream()
+                    .collect(Collectors.groupingBy(MaintenanceDataModel::getProjectName, Collectors.counting()));
+            //通过超期台量倒序排列
+            allProjectNameToBeyondNum = DataStatisticsUtil.sortByValue(allProjectNameToBeyondNum, true);
+            //获取前5的数据
+            allProjectNameToBeyondNum.forEach((key, value) -> {
+                if(projectNameToBeyondNum.size() < 5) {
+                    projectNameToBeyondNum.put(key, value);
+                }
+            });
+        }
+        return RestResponse.success(projectNameToBeyondNum, ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
+    }
+
+    /**
+     * @param
+     * @return
+     * @description 设置超期数
+     * @date 2020/2/9 9:57 下午
+     */
+    private void setBeyondNum(MaintenanceOverViewResponse maintenanceOverViewResponse,
+                              List<MaintenanceDataModel> maintenanceDataModelList) {
+        //设置总超期数
+        long totalBeyondNum = maintenanceDataModelList.stream()
+                .filter(a -> a.getMaintenanceStatus() == 2)
+                .count();
+        maintenanceOverViewResponse.setTotalBeyondNum(totalBeyondNum);
+        //获取超期的维保记录
+        List<MaintenanceDataModel> beyondMaintenanceDataModelList = maintenanceDataModelList.stream()
+                .filter(a -> a.getMaintenanceStatus() == 2)
+                .collect(Collectors.toList());
+        if (beyondMaintenanceDataModelList != null && beyondMaintenanceDataModelList.size() > 0) {
+            //获取当前时间
+            LocalDate now = LocalDate.now();
+            //设置超期类型
+            setBeyondType(maintenanceDataModelList, beyondMaintenanceDataModelList, now);
+            //设置计划超期数
+            long planBeyondNum = beyondMaintenanceDataModelList.stream()
+                    .filter(a -> a.getBeyondType() == 1)
+                    .count();
+            //设置法规超期数
+            long lawBeyondNum = beyondMaintenanceDataModelList.stream()
+                    .filter(a -> a.getBeyondType() == 2)
+                    .count();
+            maintenanceOverViewResponse.setPlanBeyondNum(planBeyondNum);
+            maintenanceOverViewResponse.setLawBeyondNum(lawBeyondNum);
+        }
+    }
+
+    /**
+     * @param
+     * @return
+     * @description 设置超期类型
+     * @date 2020/2/9 10:01 下午
+     */
+    private void setBeyondType(List<MaintenanceDataModel> maintenanceDataModelList, List<MaintenanceDataModel> beyondMaintenanceDataModelList, LocalDate now) {
+        //通过电梯将维保记录分组
+        Map<Long, List<MaintenanceDataModel>> liftIdToMaintenanceData = maintenanceDataModelList.stream()
+                .collect(Collectors.groupingBy(MaintenanceDataModel::getLiftId));
+        //设置超期类型 1:计划超期 2:法规超期
+        beyondMaintenanceDataModelList.forEach(beyondMaintenanceDataModel -> {
+            //获取电梯的维保计划
+            List<MaintenanceDataModel> liftMaintenanceDataModelList =
+                    liftIdToMaintenanceData.get(beyondMaintenanceDataModel.getLiftId());
+            //保养时间
+            LocalDate maintenanceDate;
+            if (beyondMaintenanceDataModel.getCount() == 1) {
+                //第一次保养, 获取首保时间
+                maintenanceDate = beyondMaintenanceDataModel.getFirstDate();
+            } else {
+                //获取上次保养记录
+                MaintenanceDataModel lastMaintenanceDataModel = liftMaintenanceDataModelList.stream()
+                        .filter(a -> a.getCount() == beyondMaintenanceDataModel.getCount() - 1)
+                        .collect(Collectors.toList()).get(0);
+                //获取保养完成时间
+                maintenanceDate = lastMaintenanceDataModel.getFinishDate();
+            }
+            //计划现在时间与上次保养间隔天数
+            long intervalDay = Duration.between(now, maintenanceDate).toDays();
+            beyondMaintenanceDataModel.setBeyondType(1);
+            //间隔天数大于15属于法规超期
+            if (intervalDay > 15) {
+                beyondMaintenanceDataModel.setBeyondType(2);
+            }
+        });
     }
 }

+ 40 - 0
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/util/DataStatisticsUtil.java

@@ -2,6 +2,7 @@ package cn.com.ty.lift.batch.applet.util;
 
 import cn.com.ty.lift.batch.applet.dao.model.BaseDataModel;
 import cn.com.ty.lift.batch.applet.dao.model.request.CommonRequest;
+import com.google.common.collect.Maps;
 import org.springframework.data.redis.core.RedisTemplate;
 
 import java.math.BigDecimal;
@@ -144,4 +145,43 @@ public class DataStatisticsUtil {
     public static double getDoubleValue(BigDecimal bigDecimalValue) {
         return bigDecimalValue != null ? bigDecimalValue.doubleValue() : 0d;
     }
+
+    /**
+     * 根据map的key排序
+     *
+     * @param map 待排序的map
+     * @param isDesc 是否降序,true:降序,false:升序
+     * @return 排序好的map
+     */
+    public static <K extends Comparable<? super K>, V> Map<K, V> sortByKey(Map<K, V> map, boolean isDesc) {
+        Map<K, V> result = Maps.newLinkedHashMap();
+        if (isDesc) {
+            map.entrySet().stream().sorted(Map.Entry.<K, V>comparingByKey().reversed())
+                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
+        } else {
+            map.entrySet().stream().sorted(Map.Entry.<K, V>comparingByKey())
+                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
+        }
+        return result;
+    }
+
+    /**
+     * 根据map的value排序
+     *
+     * @param map 待排序的map
+     * @param isDesc 是否降序,true:降序,false:升序
+     * @return 排序好的map
+     */
+    public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map, boolean isDesc) {
+        Map<K, V> result = Maps.newLinkedHashMap();
+        if (isDesc) {
+            map.entrySet().stream().sorted(Map.Entry.<K, V>comparingByValue().reversed())
+                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
+        } else {
+            map.entrySet().stream().sorted(Map.Entry.<K, V>comparingByValue())
+                    .forEachOrdered(e -> result.put(e.getKey(), e.getValue()));
+        }
+        return result;
+    }
+
 }

+ 2 - 0
lift-batch-service/src/main/resources/application.yml

@@ -1,5 +1,7 @@
 server:
   port: 20231
+  tomcat:
+    basedir: /Users/huangyuan/application/tomcat/data/tomcat_temp
 
 spring:
   application:

+ 29 - 1
lift-batch-service/src/main/resources/mapper/MaintenanceData.xml

@@ -1,10 +1,38 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-<mapper namespace="cn.com.ty.lift.batch.applet.dao.mapper.MaintenanceDataMapper" >
+<mapper namespace="cn.com.ty.lift.batch.applet.dao.mapper.MaintenanceDataMapper">
 
     <!-- 获取指定时间段内的维保数据 -->
     <select id="getMaintenanceDataList" parameterType="cn.com.ty.lift.batch.applet.dao.model.request.CommonRequest"
             resultType="cn.com.ty.lift.batch.applet.dao.model.MaintenanceDataModel">
+        select
+            mp.mt_company_id as mtCompanyId,
+            mp.project_id as projectId,
+            mp.plan_date as planDate,
+            mp.lift_id as liftId,
+            mp.create_date as createDate,
+            mp.work_date as finishDate,
+            mp.count as count,
+            plr.first_time as firstDate,
+            p.project_name as projectName
+        from
+            maintenance_plan mp
+        left join
+            maintenance_record mr
+        on
+            mp.id = mr.mt_plan_id
+        left join
+            project_lift_relevance plr
+        on
+            mp.lift_id = plr.lift_id
+        left join
+            project p
+        on
+            mp.project_id = p.id
+        where
+            mp.plan_date <![CDATA[ >= ]]> #{startTimeStr}
+        and
+            mp.plan_date <![CDATA[ <= ]]> #{endTimeStr}
 
     </select>