From e8b49b7e925eecd7fc8415dfdbcf1fd4a8c9648f Mon Sep 17 00:00:00 2001
From: Your Name <you@example.com>
Date: 星期四, 18 五月 2023 02:19:50 +0800
Subject: [PATCH] 优化 离散月

---
 service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java |  237 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 233 insertions(+), 4 deletions(-)

diff --git a/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java b/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java
index 16a4483..be4bddb 100644
--- a/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java
+++ b/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java
@@ -1,11 +1,15 @@
 package com.java110.fee.feeMonth;
 
+import com.java110.core.factory.GenerateCodeFactory;
 import com.java110.core.smo.IComputeFeeSMO;
 import com.java110.dto.fee.FeeAttrDto;
 import com.java110.dto.fee.FeeDetailDto;
 import com.java110.dto.fee.FeeDto;
+import com.java110.dto.payFeeDetailMonth.PayFeeDetailMonthDto;
 import com.java110.dto.payFeeDetailMonth.PayFeeMonthOwnerDto;
 import com.java110.intf.community.IRoomInnerServiceSMO;
+import com.java110.intf.fee.IPayFeeDetailMonthInnerServiceSMO;
+import com.java110.po.payFeeDetailMonth.PayFeeDetailMonthPo;
 import com.java110.utils.util.BeanConvertUtil;
 import com.java110.utils.util.DateUtil;
 import org.springframework.beans.BeanUtils;
@@ -13,10 +17,7 @@
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Service
 public class PayFeeMonthHelp implements IPayFeeMonthHelp {
@@ -26,6 +27,9 @@
 
     @Autowired
     private IComputeFeeSMO computeFeeSMOImpl;
+
+    @Autowired
+    private IPayFeeDetailMonthInnerServiceSMO payFeeDetailMonthInnerServiceSMOImpl;
 
 
     public PayFeeMonthOwnerDto generatorOwnerRoom(FeeDto feeDto) {
@@ -144,6 +148,231 @@
     }
 
     /**
+     *  澶勭悊宸茬粡浜よ繃璐圭殑璁板綍澶勭悊
+     * @param feeDto
+     * @param payFeeMonthOwnerDto
+     */
+    @Autowired
+    public void waitDispersedFeeDetail(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto) {
+        PayFeeDetailMonthDto payFeeDetailMonthDto = new PayFeeDetailMonthDto();
+        payFeeDetailMonthDto.setCommunityId(feeDto.getCommunityId());
+        payFeeDetailMonthDto.setFeeId(feeDto.getFeeId());
+        List<FeeDetailDto> feeDetailDtos = payFeeDetailMonthInnerServiceSMOImpl.getWaitDispersedFeeDetail(payFeeDetailMonthDto);
+
+        if (feeDetailDtos == null || feeDetailDtos.size() < 1) {
+            return;
+        }
+
+        for (FeeDetailDto feeDetailDto : feeDetailDtos) {
+            // todo 閫愭潯鍘荤鏁�
+            doDispersedFeeDetail(feeDetailDto, feeDto, payFeeMonthOwnerDto);
+        }
+    }
+
+
+    /**
+     * 澶勭悊 娆犺垂 绂绘暎
+     * @param feeDto
+     * @param payFeeMonthOwnerDto
+     * @param feePrice
+     * @param deadlineTime
+     */
+    @Autowired
+    public void waitDispersedOweFee(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Double feePrice, Date deadlineTime) {
+        // todo 璐圭敤宸茬粡缁撴潫
+        if(FeeDto.STATE_FINISH.equals(feeDto.getState())){
+            return ;
+        }
+
+        // todo 娓呯悊 detailId 涓�-1 鐨勬暟鎹�
+        PayFeeDetailMonthPo payFeeDetailMonthPo = new PayFeeDetailMonthPo();
+        payFeeDetailMonthPo.setCommunityId(feeDto.getCommunityId());
+        payFeeDetailMonthPo.setFeeId(feeDto.getFeeId());
+        payFeeDetailMonthPo.setDetailId("-1");
+        payFeeDetailMonthInnerServiceSMOImpl.deletePayFeeDetailMonth(payFeeDetailMonthPo);
+
+        List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
+        // todo 澶勭悊 寮�濮嬫椂闂村拰缁撴潫鏃堕棿
+        Date startTime = DateUtil.timeToDate(feeDto.getEndTime());
+        Date endTime = DateUtil.timeToDate(deadlineTime);
+
+        BigDecimal receivableAmount = new BigDecimal(feePrice);
+
+        // todo 瀵绘壘绗竴涓嚜鐒舵湀 涓�鏃�
+        Calendar firstMonthDayCal = Calendar.getInstance();
+        firstMonthDayCal.setTime(startTime);
+        firstMonthDayCal.add(Calendar.MONTH, 1);
+        firstMonthDayCal.set(Calendar.DAY_OF_MONTH, 1);
+        Date firstMonthDayTime = firstMonthDayCal.getTime();
+
+        Date startMonthDayTime = startTime;
+        // todo  寰幆锛屽彧鍒� firstMonthDayTime 澶т簬 endTime
+        int curDay = 0;
+        int curMonthMaxDay = 30;
+        BigDecimal curMonthReceivableAmount = null;
+        BigDecimal dayReceivableAmount = null;
+        while (firstMonthDayTime.getTime() > endTime.getTime()) {
+            curDay = DateUtil.daysBetween(firstMonthDayTime, startMonthDayTime);
+
+            // todo 璁$畻褰撴湀澶╂暟
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(startMonthDayTime);
+            curMonthMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+            dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 4, BigDecimal.ROUND_HALF_UP);// 鏃� 瀹炴敹
+            // todo 璁$畻 搴旀敹
+            curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+
+            // todo 淇濆瓨鏁版嵁鍒皃ay_fee_detail_month
+            toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), 0, null, feeDto, payFeeMonthOwnerDto,payFeeDetailMonthPos,startMonthDayTime);
+
+            // todo 灏唖tartTime 淇敼涓� 涓嬫湀1鏃ユ椂闂�
+            startMonthDayTime = firstMonthDayTime;
+            firstMonthDayCal.add(Calendar.MONTH, 1);
+            firstMonthDayTime = firstMonthDayCal.getTime();
+        }
+
+        //todo 鏈�鍚庡鐞� 鏈�鍚� startMonthDayTime 鍒癳ndTime 鐨�
+        if (startMonthDayTime.getTime() >= endTime.getTime()) {
+            payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
+            return;
+        }
+
+        curDay = DateUtil.daysBetween(endTime, startMonthDayTime);
+
+        // todo 璁$畻褰撴湀澶╂暟
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startMonthDayTime);
+        curMonthMaxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
+        dayReceivableAmount = receivableAmount.divide(new BigDecimal(curMonthMaxDay), 4, BigDecimal.ROUND_HALF_UP);// 鏃� 瀹炴敹
+        // todo 璁$畻 搴旀敹
+        curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+
+        // todo 淇濆瓨鏁版嵁鍒皃ay_fee_detail_month
+        toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), 0, null, feeDto, payFeeMonthOwnerDto,payFeeDetailMonthPos,startMonthDayTime);
+        payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
+
+    }
+
+    private void doDispersedFeeDetail(FeeDetailDto feeDetailDto, FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto) {
+        List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
+
+        // todo 鍘婚櫎 寮�濮嬫椂闂村拰 缁撴潫鏃堕棿鐨� 灏忔椂 鍒嗛挓 绉�
+        Date startTime = DateUtil.timeToDate(feeDetailDto.getStartTime());
+        Date endTime = DateUtil.timeToDate(feeDetailDto.getEndTime());
+
+        int day = DateUtil.daysBetween(endTime, startTime);
+        if (day < 1) {
+            day = 1;
+        }
+
+        BigDecimal receivableAmount = new BigDecimal(Double.parseDouble(feeDetailDto.getReceivableAmount()));
+        BigDecimal receivedAmount = new BigDecimal(Double.parseDouble(feeDetailDto.getReceivedAmount()));
+
+        BigDecimal dayReceivableAmount = receivableAmount.divide(new BigDecimal(day), 4, BigDecimal.ROUND_HALF_UP);// 鏃� 搴旀敹
+        BigDecimal dayReceivedAmount = receivedAmount.divide(new BigDecimal(day), 4, BigDecimal.ROUND_HALF_UP);// 鏃� 瀹炴敹
+
+        // todo 瀵绘壘绗竴涓嚜鐒舵湀 涓�鏃�
+        Calendar firstMonthDayCal = Calendar.getInstance();
+        firstMonthDayCal.setTime(startTime);
+        firstMonthDayCal.add(Calendar.MONTH, 1);
+        firstMonthDayCal.set(Calendar.DAY_OF_MONTH, 1);
+        Date firstMonthDayTime = firstMonthDayCal.getTime();
+
+        Date startMonthDayTime = startTime;
+        // todo  寰幆锛屽彧鍒� firstMonthDayTime 澶т簬 endTime
+        int curDay = 0;
+        BigDecimal curMonthReceivableAmount = null;
+        BigDecimal curMonthReceivedAmount = null;
+        while (firstMonthDayTime.getTime() > endTime.getTime()) {
+            curDay = DateUtil.daysBetween(firstMonthDayTime, startMonthDayTime);
+            // todo 璁$畻 搴旀敹
+            curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+            // todo 璁$畻 瀹炴敹
+            curMonthReceivedAmount = new BigDecimal(curDay).multiply(dayReceivedAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+
+            // todo 淇濆瓨鏁版嵁鍒皃ay_fee_detail_month
+            toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), curMonthReceivedAmount.doubleValue(), feeDetailDto, feeDto, payFeeMonthOwnerDto,payFeeDetailMonthPos,startMonthDayTime);
+
+            // todo 灏唖tartTime 淇敼涓� 涓嬫湀1鏃ユ椂闂�
+            startMonthDayTime = firstMonthDayTime;
+            firstMonthDayCal.add(Calendar.MONTH, 1);
+            firstMonthDayTime = firstMonthDayCal.getTime();
+        }
+
+        //todo 鏈�鍚庡鐞� 鏈�鍚� startMonthDayTime 鍒癳ndTime 鐨�
+        if (startMonthDayTime.getTime() >= endTime.getTime()) {
+            payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
+            return;
+        }
+
+        curDay = DateUtil.daysBetween(endTime, startMonthDayTime);
+        // todo 璁$畻 搴旀敹
+        curMonthReceivableAmount = new BigDecimal(curDay).multiply(dayReceivableAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+        // todo 璁$畻 瀹炴敹
+        curMonthReceivedAmount = new BigDecimal(curDay).multiply(dayReceivedAmount).setScale(4, BigDecimal.ROUND_HALF_UP);
+
+        // todo 淇濆瓨鏁版嵁鍒皃ay_fee_detail_month
+        toSavePayFeeDetailMonth(curMonthReceivableAmount.doubleValue(), curMonthReceivedAmount.doubleValue(), feeDetailDto, feeDto, payFeeMonthOwnerDto,payFeeDetailMonthPos,startMonthDayTime);
+        payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
+
+    }
+
+    /**
+     * 淇濆瓨鏁版嵁
+     *
+     * @param receivableAmount
+     * @param receivedAmount
+     * @param feeDetailDto
+     * @param feeDto
+     */
+    private void toSavePayFeeDetailMonth(double receivableAmount,
+                                         double receivedAmount,
+                                         FeeDetailDto feeDetailDto,
+                                         FeeDto feeDto,
+                                         PayFeeMonthOwnerDto payFeeMonthOwnerDto,
+                                         List<PayFeeDetailMonthPo> payFeeDetailMonthPos,
+                                         Date curTime) {
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(curTime);
+        PayFeeDetailMonthPo tmpPayFeeDetailMonthPo = new PayFeeDetailMonthPo();
+        tmpPayFeeDetailMonthPo.setFeeId(feeDto.getFeeId());
+        tmpPayFeeDetailMonthPo.setCommunityId(feeDto.getCommunityId());
+        if(feeDetailDto == null){
+            tmpPayFeeDetailMonthPo.setDetailId("-1");
+        }else{ // todo 浜よ垂璁板綍 淇濆瓨鏃�
+            tmpPayFeeDetailMonthPo.setDetailId(feeDetailDto.getDetailId());
+        }
+        tmpPayFeeDetailMonthPo.setDetailYear(calendar.get(Calendar.YEAR) + "");
+        tmpPayFeeDetailMonthPo.setDetailMonth((calendar.get(Calendar.MONTH) + 1) + "");
+
+        tmpPayFeeDetailMonthPo.setReceivableAmount(receivableAmount + "");
+        tmpPayFeeDetailMonthPo.setReceivedAmount(receivedAmount + "");
+        tmpPayFeeDetailMonthPo.setDiscountAmount(
+                getDiscountAmount(Double.parseDouble(tmpPayFeeDetailMonthPo.getReceivableAmount()),
+                        Double.parseDouble(tmpPayFeeDetailMonthPo.getReceivedAmount()),
+                        calendar.getTime(), feeDto) + "");
+        tmpPayFeeDetailMonthPo.setMonthId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_monthId));
+        tmpPayFeeDetailMonthPo.setRemark("绋嬪簭璁$畻鐢熸垚");
+        tmpPayFeeDetailMonthPo.setObjName(payFeeMonthOwnerDto.getObjName());
+        tmpPayFeeDetailMonthPo.setObjId(payFeeMonthOwnerDto.getObjId());
+        tmpPayFeeDetailMonthPo.setOwnerId(payFeeMonthOwnerDto.getOwnerId());
+        tmpPayFeeDetailMonthPo.setOwnerName(payFeeMonthOwnerDto.getOwnerName());
+        tmpPayFeeDetailMonthPo.setLink(payFeeMonthOwnerDto.getLink());
+        tmpPayFeeDetailMonthPo.setCurMonthTime(DateUtil.getFormatTimeStringB(calendar.getTime()));
+        if(feeDetailDto == null){
+            tmpPayFeeDetailMonthPo.setPayFeeTime(null);
+        }else{ // todo 浜よ垂璁板綍 淇濆瓨鏃�
+            tmpPayFeeDetailMonthPo.setPayFeeTime(DateUtil.getFormatTimeStringA(feeDetailDto.getCreateTime()));
+        }
+        tmpPayFeeDetailMonthPo.setState("W"); // todo 杩欓噷鏆傛椂鍐欐锛岀洰鍓嶇敤涓嶅埌锛岀畻鏄鐣欏瓧娈�
+        tmpPayFeeDetailMonthPo.setFeeName(feeDto.getFeeName());
+        tmpPayFeeDetailMonthPo.setConfigId(feeDto.getConfigId());
+        payFeeDetailMonthPos.add(tmpPayFeeDetailMonthPo);
+
+    }
+
+    /**
      * 鑾峰彇褰撳墠缂磋垂璁板綍
      *
      * @param feeDetailDtos

--
Gitblit v1.8.0