From 0e0e1f080d4a986ca75cde7cf5d23b2f8539fb10 Mon Sep 17 00:00:00 2001
From: java110 <928255095@qq.com>
Date: 星期三, 17 五月 2023 12:25:35 +0800
Subject: [PATCH] Merge branch 'master' of http://git.homecommunity.cn/supervip/MicroCommunity

---
 service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthImpl.java |  177 +++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 136 insertions(+), 41 deletions(-)

diff --git a/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthImpl.java b/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthImpl.java
index ea64b65..8c3cc54 100644
--- a/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthImpl.java
+++ b/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthImpl.java
@@ -4,21 +4,19 @@
 import com.java110.core.factory.GenerateCodeFactory;
 import com.java110.core.log.LoggerFactory;
 import com.java110.core.smo.IComputeFeeSMO;
+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.dto.report.ReportRoomDto;
-import com.java110.intf.fee.IFeeInnerServiceSMO;
-import com.java110.intf.fee.IPayFeeConfigV1InnerServiceSMO;
-import com.java110.intf.fee.IPayFeeDetailMonthInnerServiceSMO;
+import com.java110.intf.fee.*;
 import com.java110.po.payFeeDetailMonth.PayFeeDetailMonthPo;
 import com.java110.utils.util.Assert;
 import com.java110.utils.util.DateUtil;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
 import java.util.*;
 
 /**
@@ -38,6 +36,9 @@
     private IPayFeeDetailMonthInnerServiceSMO payFeeDetailMonthInnerServiceSMOImpl;
 
     @Autowired
+    private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl;
+
+    @Autowired
     private IPayFeeMonthHelp payFeeMonthHelp;
 
     @Autowired
@@ -48,6 +49,7 @@
 
     /**
      * 鐢熸垚鍗曚釜璐圭敤 骞� 绂绘暎鍒版湀
+     *
      * @param feeId
      * @param communityId
      */
@@ -67,83 +69,108 @@
 
     public void doGeneratorOrRefreshFeeMonth(FeeDto feeDto, String communityId) {
 
+
         //todo 璁$畻姣忔湀鍗曚环
         Double feePrice = payFeeMonthHelp.getMonthFeePrice(feeDto);
 
-        // 鍑嗗绂绘暎鐨勫熀纭�鏁版嵁
+        // todo 鍑嗗绂绘暎鐨勫熀纭�鏁版嵁
         PayFeeMonthOwnerDto payFeeMonthOwnerDto = payFeeMonthHelp.generatorOwnerRoom(feeDto);
 
+        //todo 绂绘暎start_time 鎴栬�� pay_fee_detail_month 鏈�澶ф湀浠� 鍒�  deadlineTime 鐨勬暟鎹�
+        maxMonthDateToDeadlineTimeData(feeDto, payFeeMonthOwnerDto, feePrice);
 
-        //todo 妫�鏌ヨ垂鐢ㄦ槸鍚︾鏁h繃锛屽鏋滄病鏈夌鏁h繃锛屽厛绂绘暎 start_time 鍒� end_time 鐨勬暟鎹�
-        ifHasNoMonthData(feeDto,payFeeMonthOwnerDto,feePrice);
 
     }
 
-
-
-
     /**
-     * 濡傛灉璐圭敤娌℃湁month 鏁版嵁锛屽垯鐩存帴绂绘暎 start_time 鍒癳nd_time 鏁版嵁
+     * 绂绘暎鏈�澶� 绂绘暎鏈堝埌 deadlineTime 鐨勬暟鎹�
+     *
      * @param feeDto
+     * @param payFeeMonthOwnerDto
+     * @param feePrice
      */
-    private void ifHasNoMonthData(FeeDto feeDto,PayFeeMonthOwnerDto payFeeMonthOwnerDto,Double feePrice) {
-
-        //todo 鍒嗘瀽寤鸿处鏃堕棿 鍜屽紑濮嬫椂闂�
-        Date startTime = feeDto.getStartTime();
-        if(startTime == null){
-            throw new IllegalArgumentException("鏁版嵁閿欒锛屾湭鍖呭惈寮�濮嬫椂闂�");
-        }
-
-        Calendar calendar = Calendar.getInstance();
-        int startYear = calendar.get(Calendar.YEAR);
-        int startMonth = calendar.get(Calendar.MONTH)+1;
-
+    private void maxMonthDateToDeadlineTimeData(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Double feePrice) {
         PayFeeDetailMonthDto payFeeDetailMonthDto = new PayFeeDetailMonthDto();
         payFeeDetailMonthDto.setCommunityId(feeDto.getCommunityId());
         payFeeDetailMonthDto.setFeeId(feeDto.getFeeId());
-        payFeeDetailMonthDto.setDetailYear(startYear+"");
-        payFeeDetailMonthDto.setDetailMonth(startMonth+"");
-        int count = payFeeDetailMonthInnerServiceSMOImpl.queryPayFeeDetailMonthsCount(payFeeDetailMonthDto);
-
-        // todo 璇存槑杩欎釜璐圭敤宸茬粡绗竴娆$鏁h繃
-        if(count > 0){
-            return ;
+        List<PayFeeDetailMonthDto> payFeeDetailMonthDtos = payFeeDetailMonthInnerServiceSMOImpl.queryPayFeeDetailMaxMonths(payFeeDetailMonthDto);
+        Date startTime = null;
+        Date deadlineTime = computeFeeSMOImpl.getDeadlineTime(feeDto);
+        if (payFeeDetailMonthDtos == null || payFeeDetailMonthDtos.size() < 1) {
+            startTime = feeDto.getStartTime();
+        } else {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(DateUtil.getDateFromStringA(payFeeDetailMonthDtos.get(0).getCurMonthTime()));
+            calendar.add(Calendar.MONTH, 1);
+            startTime = calendar.getTime();
         }
 
-        double maxMonth = Math.ceil(computeFeeSMOImpl.dayCompare(startTime, feeDto.getEndTime()));
+        // todo 鐢熸垚涓�娈垫椂闂村唴鐨勬暟鎹�
+        doGeneratorTimeMonthData(feeDto, payFeeMonthOwnerDto, feePrice, startTime, deadlineTime);
+
+    }
+
+    private void doGeneratorTimeMonthData(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Double feePrice, Date startTime, Date endTime) {
+        double maxMonth = Math.ceil(computeFeeSMOImpl.dayCompare(startTime, endTime));
 
         if (maxMonth < 1) {
             return;
         }
+        //todo 鏌ヨ 缂磋垂鏄庣粏
+        FeeDetailDto feeDetailDto = new FeeDetailDto();
+        feeDetailDto.setCommunityId(feeDto.getCommunityId());
+        feeDetailDto.setFeeId(feeDto.getFeeId());
+        List<FeeDetailDto> feeDetailDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto);
 
+        //todo 鐢熸垚 鏈堢鏁f暟鎹�
         PayFeeDetailMonthPo tmpPayFeeDetailMonthPo;
-        String detailId = "";
-        String discountAmount = "";
-        String receivedAmount = "";
         List<PayFeeDetailMonthPo> payFeeDetailMonthPos = new ArrayList<>();
+        double receivableAmount = 0.0;
         for (int month = 0; month < maxMonth; month++) {
+            Calendar calendar = Calendar.getInstance();
             calendar.setTime(startTime);
             calendar.add(Calendar.MONTH, month);
+            //calendar.set(Calendar.DAY_OF_MONTH, 1);
             tmpPayFeeDetailMonthPo = new PayFeeDetailMonthPo();
             tmpPayFeeDetailMonthPo.setFeeId(feeDto.getFeeId());
             tmpPayFeeDetailMonthPo.setCommunityId(feeDto.getCommunityId());
-            tmpPayFeeDetailMonthPo.setDetailId(detailId);
-            tmpPayFeeDetailMonthPo.setDetailMonth((calendar.get(Calendar.MONTH) + 1) + "");
+            tmpPayFeeDetailMonthPo.setDetailId(payFeeMonthHelp.getFeeDetailId(feeDetailDtos, calendar.getTime()));
             tmpPayFeeDetailMonthPo.setDetailYear(calendar.get(Calendar.YEAR) + "");
-            tmpPayFeeDetailMonthPo.setDiscountAmount(discountAmount);
+            tmpPayFeeDetailMonthPo.setDetailMonth((calendar.get(Calendar.MONTH) + 1) + "");
+            receivableAmount = payFeeMonthHelp.getReceivableAmount(feeDetailDtos, feePrice, calendar.getTime(), feeDto);
+            //todo 搴旀敹灏忎簬绛変簬0 涓嶇粺璁�
+            if(receivableAmount <=0){
+                continue;
+            }
+            tmpPayFeeDetailMonthPo.setReceivableAmount( receivableAmount + "");
+            tmpPayFeeDetailMonthPo.setReceivedAmount(payFeeMonthHelp.getReceivedAmount(feeDetailDtos, feePrice, calendar.getTime(), feeDto) + "");
+            tmpPayFeeDetailMonthPo.setDiscountAmount(
+                    payFeeMonthHelp.getDiscountAmount(Double.parseDouble(tmpPayFeeDetailMonthPo.getReceivableAmount()),
+                            Double.parseDouble(tmpPayFeeDetailMonthPo.getReceivedAmount()),
+                            calendar.getTime(), feeDto) + "");
             tmpPayFeeDetailMonthPo.setMonthId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_monthId));
-            tmpPayFeeDetailMonthPo.setReceivableAmount(feePrice + "");
-            tmpPayFeeDetailMonthPo.setReceivedAmount(receivedAmount);
             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()));
+            tmpPayFeeDetailMonthPo.setPayFeeTime(payFeeMonthHelp.getFeeFeeTime(feeDetailDtos, tmpPayFeeDetailMonthPo.getDetailId()));
+            tmpPayFeeDetailMonthPo.setState("W"); // todo 杩欓噷鏆傛椂鍐欐锛岀洰鍓嶇敤涓嶅埌锛岀畻鏄鐣欏瓧娈�
+            tmpPayFeeDetailMonthPo.setFeeName(feeDto.getFeeName());
+            tmpPayFeeDetailMonthPo.setConfigId(feeDto.getConfigId());
             payFeeDetailMonthPos.add(tmpPayFeeDetailMonthPo);
         }
         payFeeDetailMonthInnerServiceSMOImpl.savePayFeeDetailMonths(payFeeDetailMonthPos);
     }
 
+    /**
+     * 灏忓尯鏁版嵁 绂绘暎涓� 鏈堟暟鎹�
+     *
+     * @param communityId
+     */
+    @Async
     @Override
     public void doGeneratorOrRefreshAllFeeMonth(String communityId) {
 
@@ -164,13 +191,81 @@
 
         //todo  姣忔鎸�200鏉″鐞�
         for (int pageIndex = 0; pageIndex < page; pageIndex++) {
-            feeDto.setPage(pageIndex * max);
+            feeDto.setPage(pageIndex + 1);
             feeDto.setRow(max);
             List<FeeDto> tmpFeeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
             // 绂绘暎璐圭敤
             doTmpFeeDtoMonths(communityId, tmpFeeDtos);
         }
 
+
+    }
+
+    /**
+     * 鐗╀笟缂磋垂鏃剁鏁� 鎶ヨ〃鏁版嵁
+     *
+     * @param feeId
+     * @param detailId
+     * @param communityId
+     */
+    @Async
+    @Override
+    public void payFeeDetailRefreshFeeMonth(String feeId, String detailId, String communityId) {
+        // todo 鏌ヨ璐圭敤
+        FeeDto feeDto = new FeeDto();
+        feeDto.setCommunityId(communityId);
+        feeDto.setFeeId(feeId);
+        List<FeeDto> tmpFeeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+
+        Assert.listOnlyOne(tmpFeeDtos, "璐圭敤涓嶅瓨鍦�");
+
+        //todo 鏌ヨ 缂磋垂鏄庣粏
+        FeeDetailDto feeDetailDto = new FeeDetailDto();
+        feeDetailDto.setCommunityId(feeDto.getCommunityId());
+        feeDetailDto.setFeeId(feeDto.getFeeId());
+        feeDetailDto.setDetailId(detailId);
+        List<FeeDetailDto> feeDetailDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto);
+
+        Assert.listOnlyOne(feeDetailDtos, "缂磋垂璁板綍涓嶅瓨鍦�");
+
+        //todo 璁$畻姣忔湀鍗曚环
+        Double feePrice = payFeeMonthHelp.getMonthFeePrice(feeDto);
+
+        // todo 鍑嗗绂绘暎鐨勫熀纭�鏁版嵁
+        PayFeeMonthOwnerDto payFeeMonthOwnerDto = payFeeMonthHelp.generatorOwnerRoom(feeDto);
+
+        // todo 鍒犻櫎缂磋垂鏃堕棿鑼冨洿鍐呯殑鏁版嵁
+        doDeletePayFeeDetailInMonth(feeDto, feeDetailDtos.get(0));
+
+        // todo 鐢熸垚涓�娈垫椂闂村唴鐨勬暟鎹�
+        doGeneratorTimeMonthData(feeDto, payFeeMonthOwnerDto, feePrice, feeDetailDtos.get(0).getStartTime(), feeDetailDtos.get(0).getEndTime());
+    }
+
+    @Override
+    public void deleteFeeMonth(String feeId, String communityId) {
+
+        PayFeeDetailMonthPo payFeeDetailMonthPo = new PayFeeDetailMonthPo();
+        payFeeDetailMonthPo.setFeeId(feeId);
+        payFeeDetailMonthPo.setCommunityId(communityId);
+        payFeeDetailMonthInnerServiceSMOImpl.deletePayFeeDetailMonth(payFeeDetailMonthPo);
+    }
+
+    /**
+     * 鍒犻櫎缂磋垂鑼冨洿鍐呯殑鏁版嵁
+     *
+     * @param feeDto
+     * @param feeDetailDto
+     */
+    private void doDeletePayFeeDetailInMonth(FeeDto feeDto, FeeDetailDto feeDetailDto) {
+
+        PayFeeDetailMonthPo payFeeDetailMonthPo = new PayFeeDetailMonthPo();
+        payFeeDetailMonthPo.setFeeId(feeDto.getFeeId());
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(feeDetailDto.getStartTime());
+        calendar.set(Calendar.DAY_OF_MONTH, 1);
+        payFeeDetailMonthPo.setCurMonthTime(DateUtil.getFormatTimeStringB(calendar.getTime()));
+        payFeeDetailMonthPo.setCurMonthEndTime(DateUtil.getFormatTimeStringB(feeDetailDto.getEndTime()));
+        payFeeDetailMonthInnerServiceSMOImpl.deletePayFeeDetailMonth(payFeeDetailMonthPo);
     }
 
     private void doTmpFeeDtoMonths(String communityId, List<FeeDto> tmpFeeDtos) {

--
Gitblit v1.8.0