Эх сурвалжийг харах

杰生重构 合同付款

home 2 жил өмнө
parent
commit
20c1dd74c4

+ 6 - 6
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/entity/contract/Contract.java

@@ -69,19 +69,19 @@ public class Contract extends StorageBaseEntity {
     private BigDecimal backAmount;
 
     /**
-     * 申请付款金额
+     * 已付金额
      */
-    private BigDecimal payAmount;
+    private BigDecimal hadPayAmount;
 
     /**
-     * 已付金额
+     * 运费
      */
-    private BigDecimal hadPayAmount;
+    private BigDecimal expressAmount;
 
     /**
-     * 冲抵金额
+     * 申请付款金额
      */
-    private BigDecimal offsetAmount;
+    private BigDecimal payAmount;
 
     /**
      * 增值税

+ 1 - 1
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/enums/ContractPayStatusEnum.java

@@ -5,7 +5,7 @@ import lombok.Getter;
 import java.util.HashMap;
 
 /**
- * 质检状态
+ * 合同付款状态
  */
 @Getter
 public enum ContractPayStatusEnum {

+ 47 - 0
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/enums/ContractPayTypeEnum.java

@@ -0,0 +1,47 @@
+package com.fjhx.enums;
+
+import lombok.Getter;
+
+import java.util.HashMap;
+
+/**
+ * 合同付款类型
+ */
+@Getter
+public enum ContractPayTypeEnum {
+
+    ACCOUNTING_PERIOD(0, "有账期"),
+    ADVANCE_CHARGE(1, "预付款");
+
+    private final Integer type;
+    private final String name;
+
+    private static final HashMap<Integer, ContractPayTypeEnum> map = new HashMap<>();
+
+    ContractPayTypeEnum(Integer type, String name) {
+        this.type = type;
+        this.name = name;
+    }
+
+    static {
+        for (ContractPayTypeEnum value : ContractPayTypeEnum.values()) {
+            map.put(value.getType(), value);
+        }
+    }
+
+    /**
+     * 根据type获取枚举
+     */
+    public static ContractPayTypeEnum get(Integer type) {
+        return map.get(type);
+    }
+
+    /**
+     * 根据type值获取枚举
+     */
+    public static String getName(Integer type) {
+        return map.get(type).getName();
+    }
+
+
+}

+ 1 - 1
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/params/contract/DateStatisticsResult.java

@@ -24,7 +24,7 @@ public class DateStatisticsResult {
     private Date endTime;
 
     /**
-     * 账期类型 1之前账期 2当前账期 3未来账期
+     * 账期类型 1历史账期 2当前账期 3未来账期
      */
     private Integer type;
 

+ 82 - 60
hx-service/storage-restructure/src/main/java/com/fjhx/service/contract/impl/ContractPayServiceImpl.java

@@ -5,9 +5,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.base.StorageBaseEntity;
 import com.fjhx.entity.contract.Contract;
 import com.fjhx.entity.contract.ContractPay;
 import com.fjhx.enums.ContractPayStatusEnum;
+import com.fjhx.enums.ContractPayTypeEnum;
 import com.fjhx.enums.ContractStatusEnum;
 import com.fjhx.mapper.contract.ContractPayMapper;
 import com.fjhx.params.contract.ContractPayVo;
@@ -23,6 +25,7 @@ import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -34,6 +37,17 @@ import java.util.Map;
  */
 @Service
 public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, ContractPay> implements ContractPayService {
+    // 上半月
+    private static final String THE_FIRST_HALF_MONTH = "1";
+    // 下半月
+    private static final String THE_SECOND_HALF_MONTH = "2";
+
+    // 历史账期
+    private static final Integer HISTORICAL_ACCOUNTING_PERIOD = 1;
+    // 当前账期
+    private static final Integer CURRENT_ACCOUNTING_PERIOD = 2;
+    // 未来账期
+    private static final Integer FUTURE_ACCOUNTING_PERIOD = 3;
 
     @Autowired
     private ContractService contractService;
@@ -72,53 +86,69 @@ public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, Contr
 
         // 获取合同完成但未付款的数据
         List<Contract> contractList = contractService.list(Wrappers.<Contract>lambdaQuery()
+                .select(Contract::getAdjustAmount, Contract::getBackAmount, Contract::getHadPayAmount,
+                        Contract::getExpressAmount, Contract::getCompleteTime, Contract::getAccountDate)
                 .lt(Contract::getPayStatus, ContractPayStatusEnum.COMPLETED)
                 .and(q -> q.eq(Contract::getAccountDate, 0)
                         .or(w -> w.gt(Contract::getAccountDate, 0)
                                 .eq(Contract::getStatus, ContractStatusEnum.COMPLETED.getType()))));
 
         // 初始化返回结果
-        Map<Integer, DateStatisticsResult> result = dateStatisticsResultInit(date);
+        Map<Integer, DateStatisticsResult> result = initResult(date);
 
+        // 赋值合同未付款
         for (Contract contract : contractList) {
+
+            // 未付金额 = 质检金额 - 退货金额 - 已付金额 - 运费
+            BigDecimal notHadPayAmount = contract.getAdjustAmount().subtract(contract.getBackAmount())
+                    .subtract(contract.getHadPayAmount()).subtract(contract.getExpressAmount());
+
             // 付款日期
             Date paymentDate = DateUtil.offsetDay(contract.getCompleteTime(), contract.getAccountDate());
-            // 已付金额
-            BigDecimal hadPayAmount = contract.getHadPayAmount();
-            // 未付金额 = 质检金额 - 退货金额 - 已付金额 + 冲抵金额
-            BigDecimal notHadPayAmount = contract.getAdjustAmount().subtract(contract.getBackAmount())
-                    .subtract(hadPayAmount).add(contract.getOffsetAmount());
-
-            for (DateStatisticsResult item : result.values()) {
-                if (paymentDate.compareTo(item.getEndTime()) < 0) {
-                    // 预付款
-                    if (contract.getAccountDate() == 0) {
-                        // 未付预付款
-                        if (item.getType() == 1) {
-                            result.get(2).setUnpaidPayInAdvance(item.getUnpaidPayInAdvance().add(notHadPayAmount));
-                        } else {
-                            item.setUnpaidPayInAdvance(item.getUnpaidPayInAdvance().add(notHadPayAmount));
-                        }
-                        // 已付预付款
-                        item.setPaidPayInAdvance(item.getPaidPayInAdvance().add(hadPayAmount));
-                    }
-                    // 有账期
-                    else {
-                        // 未付有账期
-                        if (item.getType() == 1) {
-                            result.get(2).setUnpaidAccountingPeriod(item.getUnpaidAccountingPeriod().add(notHadPayAmount));
-                        } else {
-                            item.setUnpaidAccountingPeriod(item.getUnpaidAccountingPeriod().add(notHadPayAmount));
-                        }
-                        // 已付有账期
-                        item.setPaidAccountingPeriod(item.getPaidAccountingPeriod().add(hadPayAmount));
-                    }
 
+            for (DateStatisticsResult dateStatisticsResult : result.values()) {
+                if (paymentDate.compareTo(dateStatisticsResult.getEndTime()) < 0) {
+
+                    // 如果统计历史账期未付款,顺延到当前账期之中
+                    DateStatisticsResult item = HISTORICAL_ACCOUNTING_PERIOD.equals(dateStatisticsResult.getType())
+                            ? result.get(2) : dateStatisticsResult;
+
+                    if (contract.getAccountDate() == 0) {  // 未付预付款
+                        item.setUnpaidPayInAdvance(item.getUnpaidPayInAdvance().add(notHadPayAmount));
+                    } else { // 未付有账期
+                        item.setUnpaidAccountingPeriod(item.getUnpaidAccountingPeriod().add(notHadPayAmount));
+                    }
                     break;
                 }
             }
         }
 
+        // 获取本月付款记录
+        List<ContractPay> contractPayList = list(Wrappers.<ContractPay>lambdaQuery()
+                .between(StorageBaseEntity::getCreateTime, DateUtil.beginOfMonth(date), DateUtil.endOfMonth(date)));
+
+        // 分别统计出上半月和下班月的付款
+        Map<String, Map<Integer, BigDecimal>> collect = contractPayList.stream().collect(Collectors.groupingBy(
+                contractPay -> DateUtil.betweenDay(contractPay.getCreateTime(), date, true) < 15 ? THE_FIRST_HALF_MONTH : THE_SECOND_HALF_MONTH,
+                Collectors.toMap(ContractPay::getType, ContractPay::getPayAmount, BigDecimal::add)
+        ));
+
+        // 赋值上半月付款
+        Map<Integer, BigDecimal> theFirstHalfMonthMap = collect.get(THE_FIRST_HALF_MONTH);
+        if (theFirstHalfMonthMap != null) {
+            DateStatisticsResult dateStatisticsResult = result.get(1);
+            dateStatisticsResult.setPaidPayInAdvance(theFirstHalfMonthMap.get(ContractPayTypeEnum.ADVANCE_CHARGE.getType()));
+            dateStatisticsResult.setPaidAccountingPeriod(theFirstHalfMonthMap.get(ContractPayTypeEnum.ACCOUNTING_PERIOD.getType()));
+        }
+
+        // 赋值下半月付款
+        Map<Integer, BigDecimal> theSecondHalfMonthMap = collect.get(THE_SECOND_HALF_MONTH);
+        if (theSecondHalfMonthMap != null) {
+            DateStatisticsResult dateStatisticsResult = result.get(2);
+            dateStatisticsResult.setPaidPayInAdvance(theSecondHalfMonthMap.get(ContractPayTypeEnum.ADVANCE_CHARGE.getType()));
+            dateStatisticsResult.setPaidAccountingPeriod(theSecondHalfMonthMap.get(ContractPayTypeEnum.ACCOUNTING_PERIOD.getType()));
+        }
+
         return result;
     }
 
@@ -127,7 +157,7 @@ public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, Contr
      *
      * @param date 当前日期
      */
-    private Map<Integer, DateStatisticsResult> dateStatisticsResultInit(Date date) {
+    private Map<Integer, DateStatisticsResult> initResult(Date date) {
 
         Map<Integer, DateStatisticsResult> result = new LinkedHashMap<>();
 
@@ -135,52 +165,44 @@ public class ContractPayServiceImpl extends ServiceImpl<ContractPayMapper, Contr
         Date beginOfMonth = DateUtil.beginOfMonth(date);
         // 本月15号
         Date midOfMonth = DateUtil.offsetDay(beginOfMonth, 14);
-        // 本月最后一天
-        Date endOfMonth = DateUtil.endOfMonth(date);
         // 下月1号
         Date nextBeginOfMonth = DateUtil.offsetMonth(beginOfMonth, 1);
         // 下月15号
         Date nextMidOfMonth = DateUtil.offsetMonth(midOfMonth, 1);
-        // 下月最后一天
-        Date nextEndOfMonth = DateUtil.endOfMonth(nextBeginOfMonth);
         // 下下月1号
         Date nextTwoBeginOfMonth = DateUtil.offsetMonth(beginOfMonth, 2);
         // 下下月15号
         Date nextTwoMidOfMonth = DateUtil.offsetMonth(midOfMonth, 2);
-        // 下下月最后一天
-        Date nextTwoEndOfMonth = DateUtil.endOfMonth(nextTwoBeginOfMonth);
 
         // 距离月初有几天
         long day = DateUtil.betweenDay(date, beginOfMonth, true);
 
         // 当前月和未来2个月一共6个账期
-        for (int i = 1; i <= 6; i++) {
-            switch (i) {
-                case 1:
-                    result.put(i, getDateStatisticsResult(day < 15 ? 2 : 1, beginOfMonth, DateUtil.endOfDay(midOfMonth)));
-                    break;
-                case 2:
-                    result.put(i, getDateStatisticsResult(day < 15 ? 3 : 2, DateUtil.offsetDay(midOfMonth, 1), endOfMonth));
-                    break;
-                case 3:
-                    result.put(i, getDateStatisticsResult(3, nextBeginOfMonth, DateUtil.endOfDay(nextMidOfMonth)));
-                    break;
-                case 4:
-                    result.put(i, getDateStatisticsResult(3, DateUtil.offsetDay(nextMidOfMonth, 1), nextEndOfMonth));
-                    break;
-                case 5:
-                    result.put(i, getDateStatisticsResult(3, nextTwoBeginOfMonth, DateUtil.endOfDay(nextTwoMidOfMonth)));
-                    break;
-                case 6:
-                    result.put(i, getDateStatisticsResult(3, DateUtil.offsetDay(nextTwoMidOfMonth, 1), nextTwoEndOfMonth));
-                    break;
-            }
-        }
+        result.put(1, getDateStatisticsResult(day > 15 ? HISTORICAL_ACCOUNTING_PERIOD : CURRENT_ACCOUNTING_PERIOD,
+                beginOfMonth, DateUtil.endOfDay(midOfMonth)));
+
+        result.put(2, getDateStatisticsResult(day > 15 ? CURRENT_ACCOUNTING_PERIOD : FUTURE_ACCOUNTING_PERIOD,
+                DateUtil.offsetDay(midOfMonth, 1), DateUtil.endOfMonth(date)));
+
+        result.put(3, getDateStatisticsResult(FUTURE_ACCOUNTING_PERIOD,
+                nextBeginOfMonth, DateUtil.endOfDay(nextMidOfMonth)));
+
+        result.put(4, getDateStatisticsResult(FUTURE_ACCOUNTING_PERIOD,
+                DateUtil.offsetDay(nextMidOfMonth, 1), DateUtil.endOfMonth(nextBeginOfMonth)));
+
+        result.put(5, getDateStatisticsResult(FUTURE_ACCOUNTING_PERIOD,
+                nextTwoBeginOfMonth, DateUtil.endOfDay(nextTwoMidOfMonth)));
+
+        result.put(6, getDateStatisticsResult(FUTURE_ACCOUNTING_PERIOD,
+                DateUtil.offsetDay(nextTwoMidOfMonth, 1), DateUtil.endOfMonth(nextTwoBeginOfMonth)));
 
         return result;
     }
 
 
+    /**
+     * 生成返回结果集
+     */
     private DateStatisticsResult getDateStatisticsResult(Integer type, Date beginTime, Date endTime) {
         DateStatisticsResult dateStatisticsResult = new DateStatisticsResult();
         dateStatisticsResult.setType(type);

+ 1 - 1
hx-service/storage-restructure/src/main/java/com/fjhx/service/contract/impl/ContractServiceImpl.java

@@ -85,6 +85,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                 contract.setBackAmount(BigDecimal.ZERO);
                 contract.setPayAmount(BigDecimal.ZERO);
                 contract.setHadPayAmount(BigDecimal.ZERO);
+                contract.setExpressAmount(BigDecimal.ZERO);
                 contract.setTaxValue(commonConfigService.getValueToBigDecimal(ConfigConstant.TAX_RATE));
                 contract.setInvoiceType(0);
                 contract.setStatus(ContractStatusEnum.TO_BE_CONFIRMED.getType());
@@ -327,7 +328,6 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
                 item.getBackAmount().add(ContractIdBackAmountMap.get(item.getId()))));
 
         updateBatchById(contractList);
-
     }
 
 }