Explorar o código

Merge branch 'huangyuan-user' of lift-manager/lift-server into develop

huangyuan %!s(int64=5) %!d(string=hai) anos
pai
achega
fafa6c741e

+ 19 - 5
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/constants/DataStatisticsConstants.java

@@ -50,24 +50,38 @@ public class DataStatisticsConstants {
      */
     public static final Map<Integer, Double> PAYMENT_STATUS_TO_MONEY = new HashMap<>();
 
+    /**
+     * 合同状态->数量
+     */
+    public static final Map<Integer, Long> CONTRACT_TYPE_TO_NUM = new HashMap<>();
+
     /**
      * 年检状态数组 1:计划年检 2:实际完成 3:超期未检
      */
-    public static final int [] ANNUAL_STATUS_ARRAY = {1,2,3};
+    public static final int[] ANNUAL_STATUS_ARRAY = {1, 2, 3};
 
     /**
      * 收款状态 1:计划应收 2:时间收款 3:超期未收
      */
-    public static final int [] PAYMENT_STATUS_ARRAY = {1,2,3};
+    public static final int[] PAYMENT_STATUS_ARRAY = {1, 2, 3};
 
-    static{
+    /**
+     * 合同状态 1:新增 2:执行中 3:丢失
+     */
+    public static final int[] CONTRACT_TYPE_ARRAY = {1, 2, 3};
+
+    static {
         //初始化年检状态对应数量
-        for(int status: ANNUAL_STATUS_ARRAY){
+        for (int status : ANNUAL_STATUS_ARRAY) {
             ANNUAL_STATUS_TO_NUM.put(status, 0L);
         }
         //初始化收款数据
-        for(int status: PAYMENT_STATUS_ARRAY){
+        for (int status : PAYMENT_STATUS_ARRAY) {
             PAYMENT_STATUS_TO_MONEY.put(status, 0d);
         }
+        //初始化合同数据
+        for (int status : CONTRACT_TYPE_ARRAY) {
+            CONTRACT_TYPE_TO_NUM.put(status, 0L);
+        }
     }
 }

+ 68 - 1
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/dao/model/ContractDataModel.java

@@ -2,11 +2,78 @@ package cn.com.ty.lift.batch.applet.dao.model;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
 /**
  * @author huangyuan
  * @date 2020/2/3
  * @description
  */
 @Data
-public class ContractDataModel extends BaseDataModel{
+public class ContractDataModel extends BaseDataModel {
+    /**
+     * 合同id
+     */
+    private Long id;
+    /**
+     * 合同自定义编号
+     */
+    private String code;
+
+    /**
+     * 项目名称
+     */
+    private String projectName;
+
+    /**
+     * 开始时间
+     */
+    private LocalDate starDate;
+
+    /**
+     * 结束时间
+     */
+    private LocalDate endDate;
+
+    /**
+     * 签约时间
+     */
+    private LocalDate givenDate;
+
+    /**
+     * 计划收款时间
+     */
+    private LocalDate planDate;
+
+    /**
+     * 合同金额
+     */
+    private BigDecimal contractMoney;
+
+    /**
+     * 计划应收
+     */
+    private BigDecimal planMoney;
+
+    /**
+     * 实际金额
+     */
+    private BigDecimal workMoney;
+
+    /**
+     * 合同状态(1 未开始;2 执行中;3 已结束;4 款未结清)
+     */
+    private Integer status;
+
+    /**
+     * 合同状态 1:新增 2:在执行合同 3:丢失合同
+     */
+    private Integer contractType;
+
+    /**
+     * 上一个合同编号
+     */
+    private String previousId;
+
 }

+ 1 - 1
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/dao/model/PaymentDataModel.java

@@ -50,5 +50,5 @@ public class PaymentDataModel extends BaseDataModel{
     /**
      * 合同金额
      */
-    private BigDecimal contractAmount;
+    private BigDecimal contractMoney;
 }

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

@@ -1,9 +1,26 @@
 package cn.com.ty.lift.batch.applet.dao.model.request;
 
+import lombok.Data;
+
+import java.time.LocalDate;
+
 /**
  * @author huangyuan
  * @date 2020/2/4
  * @description
  */
+@Data
 public class ContractDataRequest extends CommonRequest{
+    /**
+     * 起始时间
+     */
+    private LocalDate startTimeDate;
+    /**
+     * 结束时间
+     */
+    private LocalDate endTimeDate;
+    /**
+     * 合同取值范围 top5 表示前5 all 表示全部
+     */
+    private String contractScope;
 }

+ 33 - 0
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/dao/model/response/DueToContractResponse.java

@@ -0,0 +1,33 @@
+package cn.com.ty.lift.batch.applet.dao.model.response;
+
+import lombok.Data;
+
+import java.time.LocalDate;
+
+/**
+ * @author huangyuan
+ * @date 2020/2/8
+ * @description
+ */
+@Data
+public class DueToContractResponse {
+    /**
+     * 项目名称
+     */
+    private String projectName;
+
+    /**
+     * 收款时间
+     */
+    private LocalDate collectDate;
+
+    /**
+     * 到期时间
+     */
+    private LocalDate endDate;
+
+    /**
+     * 应收金额
+     */
+    private double needMoney;
+}

+ 38 - 0
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/dao/model/response/LostContractResponse.java

@@ -0,0 +1,38 @@
+package cn.com.ty.lift.batch.applet.dao.model.response;
+
+import lombok.Data;
+
+import java.time.LocalDate;
+
+/**
+ * @author huangyuan
+ * @date 2020/2/8
+ * @description
+ */
+@Data
+public class LostContractResponse {
+    /**
+     * 合同编号
+     */
+    private String contractCode;
+    /**
+     * 项目名称
+     */
+    private String projectName;
+    /**
+     * 开始时间
+     */
+    private LocalDate startDate;
+    /**
+     * 结束时间
+     */
+    private LocalDate endDate;
+    /**
+     * 合同时长 (单位:天)
+     */
+    private Long duration;
+    /**
+     * 余款未收
+     */
+    private double notReceiveMoney;
+}

+ 1 - 1
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/dao/model/response/ProjectPaymentResponse.java

@@ -17,7 +17,7 @@ public class ProjectPaymentResponse {
     /**
      * 合同金额
      */
-    private Double contractAmount;
+    private Double contractMoney;
 
     /**
      * 超期时长

+ 116 - 3
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/service/ContractDataService.java

@@ -5,6 +5,8 @@ import cn.com.ty.lift.batch.applet.dao.mapper.ContractDataMapper;
 import cn.com.ty.lift.batch.applet.dao.model.ContractDataModel;
 import cn.com.ty.lift.batch.applet.dao.model.request.CommonRequest;
 import cn.com.ty.lift.batch.applet.dao.model.request.ContractDataRequest;
+import cn.com.ty.lift.batch.applet.dao.model.response.DueToContractResponse;
+import cn.com.ty.lift.batch.applet.dao.model.response.LostContractResponse;
 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 +14,12 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author huangyuan
@@ -36,6 +43,25 @@ public class ContractDataService {
      */
     public void putContractDataToRedis(CommonRequest commonRequest) {
         List<ContractDataModel> contractDataModelList = contractDataMapper.getContractDataList(commonRequest);
+        if (contractDataModelList != null && contractDataModelList.size() > 0) {
+            //将合同数据变为 id->数据的map
+            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);
+                                }
+                        }
+                    }
+            );
+        }
         //通过公司id给数据分组
         DataStatisticsUtil.putStatisticsDataToRedis(contractDataModelList, redisTemplate,
                 DataStatisticsConstants.CONTRACT_DATA_FIELD);
@@ -52,6 +78,20 @@ public class ContractDataService {
         List<ContractDataModel> contractDataModelList = (List<ContractDataModel>) DataStatisticsUtil
                 .getStatisticsDataFromRedis(redisTemplate,
                         DataStatisticsConstants.CONTRACT_DATA_FIELD, contractDataRequest.getMtCompanyId());
+        if (contractDataModelList != null && contractDataModelList.size() > 0) {
+            //通过起始时间过滤合同信息
+            if (contractDataRequest.getStartTimeDate() != null) {
+                contractDataModelList = contractDataModelList.stream()
+                        .filter(a -> a.getGivenDate().isAfter(contractDataRequest.getStartTimeDate()))
+                        .collect(Collectors.toList());
+            }
+            //通过终止时间过滤
+            if (contractDataRequest.getEndTimeDate() != null) {
+                contractDataModelList = contractDataModelList.stream()
+                        .filter(a -> a.getGivenDate().isBefore(contractDataRequest.getEndTimeDate()))
+                        .collect(Collectors.toList());
+            }
+        }
         return contractDataModelList;
     }
 
@@ -62,8 +102,22 @@ public class ContractDataService {
      * @date 2020/2/5 4:35 下午
      */
     public RestResponse contractOverView(ContractDataRequest contractDataRequest) {
+        Map<Integer, Long> contractTypeToNum = DataStatisticsConstants.ANNUAL_STATUS_TO_NUM;
+        //从redis中获取合同数据
         List<ContractDataModel> contractDataModelList = getContractDataListFromRedis(contractDataRequest);
-        return RestResponse.success(ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
+        if (contractDataModelList != null && contractDataModelList.size() > 0) {
+            //设置新增合同数量
+            contractTypeToNum.put(1, contractDataModelList.stream().count());
+            //设置计划合同数量
+            long planContractNum = contractDataModelList.stream()
+                    .filter(a -> a.getContractType() == 2).count();
+            contractTypeToNum.put(2, planContractNum);
+            //设置丢失合同数量
+            long lostContractNum = contractDataModelList.stream()
+                    .filter(a -> a.getContractType() == 3).count();
+            contractTypeToNum.put(3, lostContractNum);
+        }
+        return RestResponse.success(contractTypeToNum, ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
     }
 
     /**
@@ -73,8 +127,40 @@ public class ContractDataService {
      * @date 2020/2/5 4:39 下午
      */
     public RestResponse lostContract(ContractDataRequest contractDataRequest) {
+        List<LostContractResponse> lostContractResponseList = new ArrayList<>();
         List<ContractDataModel> contractDataModelList = getContractDataListFromRedis(contractDataRequest);
-        return RestResponse.success(ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
+        if (contractDataModelList != null && contractDataModelList.size() > 0) {
+            //定义一个临时变量
+            final List<LostContractResponse> finalLostContractResponseList = new ArrayList<>();
+            contractDataModelList = contractDataModelList.stream()
+                    .filter(a -> a.getContractType() == 3)
+                    .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);
+                    }
+            );
+            //通过应收金额降序排列,并取前5的数据
+            lostContractResponseList = finalLostContractResponseList.stream()
+                    .sorted(Comparator.comparing(a -> a.getNotReceiveMoney())).limit(5)
+                    .collect(Collectors.toList());
+        }
+        return RestResponse.success(lostContractResponseList, ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
     }
 
     /**
@@ -84,7 +170,34 @@ public class ContractDataService {
      * @date 2020/2/5 4:41 下午
      */
     public RestResponse dueToWarn(ContractDataRequest contractDataRequest) {
+        List<DueToContractResponse> dueToContractResponseList = new ArrayList<>();
         List<ContractDataModel> contractDataModelList = getContractDataListFromRedis(contractDataRequest);
-        return RestResponse.success(ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
+        if (contractDataModelList != null && contractDataModelList.size() > 0) {
+            final List<DueToContractResponse> finalDueToContractResponseList = new ArrayList<>();
+            //获取在执行中的合同
+            contractDataModelList = contractDataModelList.stream()
+                    .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);
+                    }
+            );
+            //通过到期时间顺序排列
+            dueToContractResponseList = finalDueToContractResponseList.stream()
+                    .sorted(Comparator.comparing(DueToContractResponse::getEndDate))
+                    .collect(Collectors.toList());
+            //如果是前5的数据获取前5的数据
+            if("top5".equals(contractDataRequest.getContractScope())){
+                dueToContractResponseList = dueToContractResponseList.stream()
+                        .limit(5).collect(Collectors.toList());
+            }
+        }
+        return RestResponse.success(dueToContractResponseList, ApiConstants.RESULT_SUCCESS, "获取统计数据成功");
     }
 }

+ 18 - 2
lift-batch-service/src/main/java/cn/com/ty/lift/batch/applet/service/PaymentDataService.java

@@ -73,6 +73,12 @@ public class PaymentDataService {
                         .filter(a -> a.getPlanDate().isBefore(paymentDataRequest.getEndDate()))
                         .collect(Collectors.toList());
             }
+            //通过合同类型过滤
+            if(paymentDataRequest.getPaymentType() != null){
+                paymentDataModelList = paymentDataModelList.stream()
+                        .filter(a -> a.getPaymentType() == paymentDataRequest.getPaymentType())
+                        .collect(Collectors.toList());
+            }
         }
         return paymentDataModelList;
     }
@@ -115,6 +121,8 @@ public class PaymentDataService {
         //从redis中获取收款数据
         List<PaymentDataModel> paymentDataModelList = getPaymentDataListFromRedis(paymentDataRequest);
         if (paymentDataModelList != null && paymentDataModelList.size() > 0) {
+            //声明一个final类型变量来封装数据
+            final List<RegionPaymentResponse> finalRegionPaymentResponseList = new ArrayList<>();
             //区域名称对应付款数据
             Map<String, List<PaymentDataModel>> regionNameToPaymentData = paymentDataModelList.stream()
                     .collect(Collectors.groupingBy(PaymentDataModel::getRegionName));
@@ -133,9 +141,10 @@ public class PaymentDataService {
                 regionPaymentResponse.setRegionName(key);
                 regionPaymentResponse.setPlanMoney(planMoney);
                 regionPaymentResponse.setBeyondMoney(beyondMoney);
+                finalRegionPaymentResponseList.add(regionPaymentResponse);
             });
             //通过超期款排名,并取前5的数据
-            regionPaymentResponseList = regionPaymentResponseList.stream()
+            regionPaymentResponseList = finalRegionPaymentResponseList.stream()
                     .sorted(Comparator.comparing(RegionPaymentResponse::getBeyondMoney)).limit(5)
                     .collect(Collectors.toList());
         }
@@ -153,6 +162,8 @@ public class PaymentDataService {
         //从redis中获取收款数据
         List<PaymentDataModel> paymentDataModelList = getPaymentDataListFromRedis(paymentDataRequest);
         if (paymentDataModelList != null && paymentDataModelList.size() > 0) {
+            //声明一个final类型变量来封装数据
+            final List<ProjectPaymentResponse> finalProjectPaymentResponseList = new ArrayList<>();
             //将数据转化为项目名->付款数据
             Map<String, List<PaymentDataModel>> projectNameToPaymentData = paymentDataModelList.stream()
                     .collect(Collectors.groupingBy(PaymentDataModel::getProjectName));
@@ -177,10 +188,15 @@ public class PaymentDataService {
                     }
                     Duration duration = Duration.between(afterDate, paymentDataModel.getPlanDate());
                     projectPaymentResponse.setDueToDays(duration.toDays());
+                    //合同金额
+                    double contractMoney = paymentDataModel.getContractMoney() != null
+                            ? paymentDataModel.getContractMoney().doubleValue() : 0d;
+                    projectPaymentResponse.setContractMoney(contractMoney);
+                    finalProjectPaymentResponseList.add(projectPaymentResponse);
                 }
             });
             //通过超期款倒序
-            projectPaymentResponseList = projectPaymentResponseList.stream()
+            projectPaymentResponseList = finalProjectPaymentResponseList.stream()
                     .sorted(Comparator.comparing(ProjectPaymentResponse::getBeyondAmount).reversed())
                     .collect(Collectors.toList());
             //判断获取的是前5的数据 还是所有数据

+ 28 - 1
lift-batch-service/src/main/resources/mapper/ContractData.xml

@@ -5,7 +5,34 @@
     <!-- 获取时间段内的合同数据 -->
     <select id="getContractDataList" parameterType="cn.com.ty.lift.batch.applet.dao.model.request.CommonRequest"
             resultType="cn.com.ty.lift.batch.applet.dao.model.ContractDataModel">
-
+            select
+                c.id as id,
+                c.mt_company_id as mtCompanyId,
+                c.code as code,
+                c.star_date as starDate,
+                c.end_date as endDate,
+                c.given_date as givenDate,
+                c.status as contractStatus,
+                c.previous_id as previousId,
+                c.moneys as contractMoney,
+                pay.plan_money as planMoney,
+                pay.work_money as workMoney,
+                pay.plan_date as planDate,
+                p.project_name as projectName
+            from
+                contracts c
+            left join
+                project p
+            on
+                c.project_id = p.id
+            left join
+                payment pay
+            on
+                c.id = pay.contracts_id
+            where
+                c.given_date <![CDATA[ >= ]]> #{startTimeStr}
+            and
+                c.given_date <![CDATA[ <= ]]> #{endTimeStr}
     </select>
 
 </mapper>

+ 24 - 1
lift-batch-service/src/main/resources/mapper/PaymentData.xml

@@ -5,6 +5,29 @@
     <!-- 获取时间段内的收款数据 -->
     <select id="getPaymentDataList" parameterType="cn.com.ty.lift.batch.applet.dao.model.request.CommonRequest"
             resultType="cn.com.ty.lift.batch.applet.dao.model.PaymentDataModel">
-
+           select
+              c.mt_company_id as mtCompanyId,
+              pay.plan_date as planDate,
+              pay.work_date as workDate,
+              pay.plan_money as planMoney,
+              pay.work_money as workMoney,
+              pro.project_name as projectName,
+              r.area_name as regionName,
+              c.type as paymentType,
+              c.moneys as contractMoney
+           from
+              payment pay
+           left join
+              contracts c
+           on
+              pay.contracts_id = c.id
+           left join
+              project pro
+           on
+              c.project_id = pro.id
+           left join
+              region r
+           on
+              pro.region_id = r.id
     </select>
 </mapper>