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

---
 java110-db/src/main/resources/mapper/fee/PayFeeDetailMonthServiceDaoImplMapper.xml           |   55 +++
 java110-interface/src/main/java/com/java110/intf/fee/IPayFeeDetailMonthInnerServiceSMO.java  |    9 
 service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeDetailMonthInnerServiceSMOImpl.java |   23 +
 service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthImpl.java                      |  195 ++++--------
 service-fee/src/main/java/com/java110/fee/dao/impl/PayFeeDetailMonthServiceDaoImpl.java      |   14 
 java110-utils/src/main/java/com/java110/utils/util/DateUtil.java                             |   12 
 service-fee/src/main/java/com/java110/fee/dao/IPayFeeDetailMonthServiceDao.java              |    9 
 service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthHelp.java                      |  237 +++++++++++++++
 service-fee/src/main/java/com/java110/fee/feeMonth/IPayFeeMonthHelp.java                     |    3 
 service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthImplV1.txt                     |  288 +++++++++++++++++++
 10 files changed, 712 insertions(+), 133 deletions(-)

diff --git a/java110-db/src/main/resources/mapper/fee/PayFeeDetailMonthServiceDaoImplMapper.xml b/java110-db/src/main/resources/mapper/fee/PayFeeDetailMonthServiceDaoImplMapper.xml
index 530e718..1917132 100644
--- a/java110-db/src/main/resources/mapper/fee/PayFeeDetailMonthServiceDaoImplMapper.xml
+++ b/java110-db/src/main/resources/mapper/fee/PayFeeDetailMonthServiceDaoImplMapper.xml
@@ -12,7 +12,8 @@
         fee_name,config_id
         ) values (
         #{detailMonth},#{detailYear},#{detailId},#{receivableAmount},#{discountAmount},#{remark},#{receivedAmount},#{communityId},#{feeId},#{monthId},
-        #{objName},#{objId},#{ownerName},#{ownerId},#{link},#{state},#{payFeeTime},#{curMonthTime}, #{feeName},#{configId}
+        #{objName},#{objId},#{ownerName},#{ownerId},#{link},#{state},#{payFeeTime},#{curMonthTime},
+        #{feeName},#{configId}
         )
     </insert>
 
@@ -39,7 +40,8 @@
         detailId,t.receivable_amount,t.receivable_amount receivableAmount,t.discount_amount,t.discount_amount
         discountAmount,t.remark,t.status_cd,t.status_cd statusCd,t.received_amount,t.received_amount
         receivedAmount,t.community_id,t.community_id communityId,t.fee_id,t.fee_id feeId,t.month_id,t.month_id monthId,
-        t.obj_name objName,t.obj_id objId,t.owner_name ownerName,t.owner_id ownerId,t.link,t.state,t.pay_fee_time payFeeTime,
+        t.obj_name objName,t.obj_id objId,t.owner_name ownerName,t.owner_id ownerId,t.link,t.state,t.pay_fee_time
+        payFeeTime,
         t.cur_month_time curMonthTime
         from pay_fee_detail_month t
         where 1 =1
@@ -163,6 +165,22 @@
         </if>
     </update>
 
+    <!-- 鍒犻櫎绂绘暎鏁版嵁 -->
+    <update id="deletePayFeeDetailMonthInfo" parameterType="Map">
+        delete from pay_fee_detail_month
+        where 1=1
+        and community_id= #{communityId}
+        <if test="monthId !=null and monthId != ''">
+            and month_id= #{monthId}
+        </if>
+        <if test="feeId !=null and feeId != ''">
+            and fee_id= #{feeId}
+        </if>
+        <if test="detailId !=null and detailId != ''">
+            and detail_id= #{detailId}
+        </if>
+    </update>
+
     <!-- 鏌ヨ鏈堢即璐硅〃鏁伴噺 add by wuxw 2018-07-03 -->
     <select id="queryPayFeeDetailMonthsCount" parameterType="Map" resultType="Map">
         select count(1) count
@@ -226,7 +244,8 @@
         detailId,t.receivable_amount,t.receivable_amount receivableAmount,t.discount_amount,t.discount_amount
         discountAmount,t.remark,t.status_cd,t.status_cd statusCd,t.received_amount,t.received_amount
         receivedAmount,t.community_id,t.community_id communityId,t.fee_id,t.fee_id feeId,t.month_id,t.month_id monthId,
-        t.obj_name objName,t.obj_id objId,t.owner_name ownerName,t.owner_id ownerId,t.link,t.state,t.pay_fee_time payFeeTime,
+        t.obj_name objName,t.obj_id objId,t.owner_name ownerName,t.owner_id ownerId,t.link,t.state,t.pay_fee_time
+        payFeeTime,
         t.cur_month_time curMonthTime
         from pay_fee_detail_month t
         where 1 =1
@@ -288,4 +307,34 @@
 
     </select>
 
+    <!-- 鏌ヨ闇�瑕佺鏁g殑缂磋垂璁板綍 -->
+    <select id="getWaitDispersedFeeDetail" parameterType="Map" resultType="Map">
+        select t.prime_rate,t.prime_rate primeRate,
+        t.detail_id,t.detail_id detailId,
+        t.receivable_amount,t.receivable_amount receivableAmount,
+        t.cycles,t.remark,t.status_cd,t.status_cd statusCd,t.received_amount,t.received_amount receivedAmount,
+        t.community_id,t.community_id communityId,t.b_id,t.b_id bId,t.fee_id,t.fee_id feeId ,t.create_time createTime,
+        t.state,d.name stateName,t.start_time,t.end_time,t.start_time startTime,t.end_time endTime,pfa.`value`
+        importFeeName,pfc.fee_name feeName,t.payable_amount,t.payable_amount payableAmount,
+        mw.cur_degrees curDegrees,mw.pre_degrees preDegrees, mw.pre_reading_time preReadingTime,mw.cur_reading_time
+        curReadingTime,t.pay_order_id payOrderId,pfc.config_id configId,td.`name` primeRateName,pfao1.`value`
+        payerObjName,
+        t.cashier_id cashierId,t.cashier_name cashierName
+        from pay_fee_detail t
+        left join pay_fee_detail_month pfdm on t.fee_id = pfdm.fee_id and pfdm.detail_id = t.detail_id and
+        pfdm.status_cd = '0' and t.community_id = pfdm.community_id
+        left join pay_fee_attrs pfa on t.fee_id = pfa.fee_id and pfa.spec_cd = '390002'
+        left join pay_fee pf on t.fee_id = pf.fee_id and pf.status_cd = '0'
+        left join pay_fee_config pfc on pf.config_id = pfc.config_id and pfc.status_cd = '0'
+        LEFT JOIN meter_water mw on t.fee_id = mw.fee_id and mw.status_cd = '0' and mw.community_id = t.community_id
+        left join pay_fee_attrs pfao1 on pfao1.fee_id = t.fee_id and pfao1.spec_cd = '390012' and pfao1.status_cd = '0'
+        left join t_dict d on t.state = d.status_cd and d.table_name = 'pay_fee_detail' and d.table_columns = 'state'
+        left join t_dict td on t.prime_rate = td.status_cd and td.table_name = 'pay_fee_detail' and td.table_columns =
+        'prime_rate'
+        where t.status_cd = '0'
+        and t.state in ('1000','1400')
+        and t.community_id = #{communityId}
+        and t.fee_id = #{feeId}
+        and pfdm.detail_id is null
+    </select>
 </mapper>
diff --git a/java110-interface/src/main/java/com/java110/intf/fee/IPayFeeDetailMonthInnerServiceSMO.java b/java110-interface/src/main/java/com/java110/intf/fee/IPayFeeDetailMonthInnerServiceSMO.java
index edec2ed..6b1c5b5 100644
--- a/java110-interface/src/main/java/com/java110/intf/fee/IPayFeeDetailMonthInnerServiceSMO.java
+++ b/java110-interface/src/main/java/com/java110/intf/fee/IPayFeeDetailMonthInnerServiceSMO.java
@@ -1,6 +1,7 @@
 package com.java110.intf.fee;
 
 import com.java110.config.feign.FeignConfiguration;
+import com.java110.dto.fee.FeeDetailDto;
 import com.java110.dto.payFeeDetailMonth.PayFeeDetailMonthDto;
 import com.java110.po.payFeeDetailMonth.PayFeeDetailMonthPo;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -57,4 +58,12 @@
 
     @RequestMapping(value = "/queryPayFeeDetailMaxMonths", method = RequestMethod.POST)
     List<PayFeeDetailMonthDto> queryPayFeeDetailMaxMonths(@RequestBody PayFeeDetailMonthDto payFeeDetailMonthDto);
+
+    /**
+     * 澶勭悊闇�瑕佺鏁g殑缂磋垂璁板綍
+     * @param payFeeDetailMonthDto
+     * @return
+     */
+    @RequestMapping(value = "/getWaitDispersedFeeDetail", method = RequestMethod.POST)
+    List<FeeDetailDto> getWaitDispersedFeeDetail(@RequestBody PayFeeDetailMonthDto payFeeDetailMonthDto);
 }
diff --git a/java110-utils/src/main/java/com/java110/utils/util/DateUtil.java b/java110-utils/src/main/java/com/java110/utils/util/DateUtil.java
index a2345bb..acf070f 100755
--- a/java110-utils/src/main/java/com/java110/utils/util/DateUtil.java
+++ b/java110-utils/src/main/java/com/java110/utils/util/DateUtil.java
@@ -756,4 +756,16 @@
         return list;
     }
 
+    /**
+     * 闄ゅ幓 灏忔椂 鍒� 绉�
+     * @param time
+     * @return
+     */
+    public static Date timeToDate(Date time){
+        Calendar calendar =Calendar.getInstance();
+        calendar.setTime(time);
+        setTimeToMidnight(calendar);
+        return calendar.getTime();
+    }
+
 }
diff --git a/service-fee/src/main/java/com/java110/fee/dao/IPayFeeDetailMonthServiceDao.java b/service-fee/src/main/java/com/java110/fee/dao/IPayFeeDetailMonthServiceDao.java
index e3f0443..7b3315f 100644
--- a/service-fee/src/main/java/com/java110/fee/dao/IPayFeeDetailMonthServiceDao.java
+++ b/service-fee/src/main/java/com/java110/fee/dao/IPayFeeDetailMonthServiceDao.java
@@ -62,4 +62,13 @@
 
 
     List<Map> queryPayFeeDetailMaxMonths(Map info);
+
+    /**
+     * 澶勭悊闇�瑕佺鏁g殑 缂磋垂璁板綍
+     * @param info
+     * @return
+     */
+    List<Map> getWaitDispersedFeeDetail(Map info);
+
+    void deletePayFeeDetailMonthInfo(Map info);
 }
diff --git a/service-fee/src/main/java/com/java110/fee/dao/impl/PayFeeDetailMonthServiceDaoImpl.java b/service-fee/src/main/java/com/java110/fee/dao/impl/PayFeeDetailMonthServiceDaoImpl.java
index b0848d9..04867bd 100644
--- a/service-fee/src/main/java/com/java110/fee/dao/impl/PayFeeDetailMonthServiceDaoImpl.java
+++ b/service-fee/src/main/java/com/java110/fee/dao/impl/PayFeeDetailMonthServiceDaoImpl.java
@@ -111,5 +111,19 @@
         return businessPayFeeDetailMonthInfos;
     }
 
+    @Override
+    public List<Map> getWaitDispersedFeeDetail(Map info) {
+        logger.debug("鏌ヨgetWaitDispersedFeeDetail淇℃伅 鍏ュ弬 info : {}", info);
+
+        List<Map> businessPayFeeDetailMonthInfos = sqlSessionTemplate.selectList("payFeeDetailMonthServiceDaoImpl.getWaitDispersedFeeDetail", info);
+
+        return businessPayFeeDetailMonthInfos;
+    }
+
+    @Override
+    public void deletePayFeeDetailMonthInfo(Map info) {
+        sqlSessionTemplate.update("payFeeDetailMonthServiceDaoImpl.deletePayFeeDetailMonthInfo", info);
+    }
+
 
 }
diff --git a/service-fee/src/main/java/com/java110/fee/feeMonth/IPayFeeMonthHelp.java b/service-fee/src/main/java/com/java110/fee/feeMonth/IPayFeeMonthHelp.java
index fb9ed97..16327b0 100644
--- a/service-fee/src/main/java/com/java110/fee/feeMonth/IPayFeeMonthHelp.java
+++ b/service-fee/src/main/java/com/java110/fee/feeMonth/IPayFeeMonthHelp.java
@@ -45,4 +45,7 @@
     String getFeeFeeTime(List<FeeDetailDto> feeDetailDtos, String detailId);
 
 
+    void waitDispersedFeeDetail(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto);
+
+    void waitDispersedOweFee(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Double feePrice, Date deadlineTime);
 }
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
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 24ad362..8cf7019 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
@@ -17,10 +17,14 @@
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.*;
 
 /**
  * 璐圭敤绂绘暎涓烘湀 瀹炵幇绫�
+ * V2
+ * <p>
+ * case 1 瀹氭椂浠诲姟 璋冪敤
  */
 @Service
 public class PayFeeMonthImpl implements IPayFeeMonth {
@@ -46,128 +50,8 @@
 
     public static final int DEFAULT_DEAL_COUNT = 200;
 
-
     /**
-     * 鐢熸垚鍗曚釜璐圭敤 骞� 绂绘暎鍒版湀
-     *
-     * @param feeId
-     * @param communityId
-     */
-    @Override
-    public void doGeneratorOrRefreshFeeMonth(String feeId, String communityId) {
-
-        // todo 鏌ヨ璐圭敤
-        FeeDto feeDto = new FeeDto();
-        feeDto.setCommunityId(communityId);
-        feeDto.setFeeId(feeId);
-        List<FeeDto> tmpFeeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
-
-        Assert.listOnlyOne(tmpFeeDtos, "璐圭敤涓嶅瓨鍦�");
-
-        doGeneratorOrRefreshFeeMonth(tmpFeeDtos.get(0), communityId);
-    }
-
-    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);
-
-
-    }
-
-    /**
-     * 绂绘暎鏈�澶� 绂绘暎鏈堝埌 deadlineTime 鐨勬暟鎹�
-     *
-     * @param feeDto
-     * @param payFeeMonthOwnerDto
-     * @param feePrice
-     */
-    private void maxMonthDateToDeadlineTimeData(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Double feePrice) {
-        PayFeeDetailMonthDto payFeeDetailMonthDto = new PayFeeDetailMonthDto();
-        payFeeDetailMonthDto.setCommunityId(feeDto.getCommunityId());
-        payFeeDetailMonthDto.setFeeId(feeDto.getFeeId());
-        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();
-        }
-
-        // 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());
-        feeDetailDto.setStates(new String[]{FeeDetailDto.STATE_NORMAL,FeeDetailDto.STATE_RETURNING});
-        List<FeeDetailDto> feeDetailDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto);
-
-        //todo 鐢熸垚 鏈堢鏁f暟鎹�
-        PayFeeDetailMonthPo tmpPayFeeDetailMonthPo;
-        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(payFeeMonthHelp.getFeeDetailId(feeDetailDtos, calendar.getTime()));
-            tmpPayFeeDetailMonthPo.setDetailYear(calendar.get(Calendar.YEAR) + "");
-            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.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);
-    }
-
-    /**
-     * 灏忓尯鏁版嵁 绂绘暎涓� 鏈堟暟鎹�
+     * 1.0 瀹氭椂浠诲姟绂绘暎 灏忓尯鏁版嵁 绂绘暎涓� 鏈堟暟鎹�
      *
      * @param communityId
      */
@@ -203,7 +87,7 @@
     }
 
     /**
-     * 鐗╀笟缂磋垂鏃剁鏁� 鎶ヨ〃鏁版嵁
+     * 2.0 鐗╀笟缂磋垂鏃剁鏁� 鎶ヨ〃鏁版嵁
      *
      * @param feeId
      * @param detailId
@@ -239,9 +123,38 @@
         doDeletePayFeeDetailInMonth(feeDto, feeDetailDtos.get(0));
 
         // todo 鐢熸垚涓�娈垫椂闂村唴鐨勬暟鎹�
-        doGeneratorTimeMonthData(feeDto, payFeeMonthOwnerDto, feePrice, feeDetailDtos.get(0).getStartTime(), feeDetailDtos.get(0).getEndTime());
+        maxMonthDateToDeadlineTimeData(feeDto, payFeeMonthOwnerDto, feePrice);
     }
 
+    /**
+     * 鐢熸垚鍗曚釜璐圭敤 骞� 绂绘暎鍒版湀
+     *
+     * @param feeId
+     * @param communityId
+     */
+    @Override
+    public void doGeneratorOrRefreshFeeMonth(String feeId, String communityId) {
+
+        // todo 鏌ヨ璐圭敤
+        FeeDto feeDto = new FeeDto();
+        feeDto.setCommunityId(communityId);
+        feeDto.setFeeId(feeId);
+        List<FeeDto> tmpFeeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+
+        Assert.listOnlyOne(tmpFeeDtos, "璐圭敤涓嶅瓨鍦�");
+
+        doGeneratorOrRefreshFeeMonth(tmpFeeDtos.get(0), communityId);
+    }
+
+
+
+
+    /**
+     * 鍒犻櫎鏈堣垂鐢�
+     *
+     * @param feeId
+     * @param communityId
+     */
     @Override
     public void deleteFeeMonth(String feeId, String communityId) {
 
@@ -251,6 +164,42 @@
         payFeeDetailMonthInnerServiceSMOImpl.deletePayFeeDetailMonth(payFeeDetailMonthPo);
     }
 
+    private 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);
+
+
+    }
+
+    /**
+     * 绂绘暎鏈�澶� 绂绘暎鏈堝埌 deadlineTime 鐨勬暟鎹�
+     * <p>
+     * 鏍稿績鏂规硶澶勭悊
+     *
+     * @param feeDto
+     * @param payFeeMonthOwnerDto
+     * @param feePrice
+     */
+    private void maxMonthDateToDeadlineTimeData(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Double feePrice) {
+
+        //todo 澶勭悊宸茬粡浜よ繃璐圭殑璁板綍澶勭悊
+        payFeeMonthHelp.waitDispersedFeeDetail(feeDto, payFeeMonthOwnerDto);
+
+
+        //todo 澶勭悊 endTime 鍒� deadlineTime 鐨勮垂鐢�
+        Date deadlineTime = computeFeeSMOImpl.getDeadlineTime(feeDto);
+        payFeeMonthHelp.waitDispersedOweFee(feeDto,payFeeMonthOwnerDto,feePrice,deadlineTime);
+
+    }
+
+
     /**
      * 鍒犻櫎缂磋垂鑼冨洿鍐呯殑鏁版嵁
      *
diff --git a/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthImplV1.txt b/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthImplV1.txt
new file mode 100644
index 0000000..6277391
--- /dev/null
+++ b/service-fee/src/main/java/com/java110/fee/feeMonth/PayFeeMonthImplV1.txt
@@ -0,0 +1,288 @@
+package com.java110.fee.feeMonth;
+
+import com.alibaba.fastjson.JSONObject;
+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.intf.fee.IFeeDetailInnerServiceSMO;
+import com.java110.intf.fee.IFeeInnerServiceSMO;
+import com.java110.intf.fee.IPayFeeConfigV1InnerServiceSMO;
+import com.java110.intf.fee.IPayFeeDetailMonthInnerServiceSMO;
+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.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 璐圭敤绂绘暎涓烘湀 瀹炵幇绫�
+ */
+//@Service
+public class PayFeeMonthImplV1 implements IPayFeeMonth {
+    private static Logger logger = LoggerFactory.getLogger(PayFeeMonthImplV1.class);
+
+    @Autowired
+    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
+
+    @Autowired
+    private IPayFeeConfigV1InnerServiceSMO payFeeConfigV1InnerServiceSMOImpl;
+
+    @Autowired
+    private IPayFeeDetailMonthInnerServiceSMO payFeeDetailMonthInnerServiceSMOImpl;
+
+    @Autowired
+    private IFeeDetailInnerServiceSMO feeDetailInnerServiceSMOImpl;
+
+    @Autowired
+    private IPayFeeMonthHelp payFeeMonthHelp;
+
+    @Autowired
+    private IComputeFeeSMO computeFeeSMOImpl;
+
+    public static final int DEFAULT_DEAL_COUNT = 200;
+
+
+    /**
+     * 鐢熸垚鍗曚釜璐圭敤 骞� 绂绘暎鍒版湀
+     *
+     * @param feeId
+     * @param communityId
+     */
+    @Override
+    public void doGeneratorOrRefreshFeeMonth(String feeId, String communityId) {
+
+        // todo 鏌ヨ璐圭敤
+        FeeDto feeDto = new FeeDto();
+        feeDto.setCommunityId(communityId);
+        feeDto.setFeeId(feeId);
+        List<FeeDto> tmpFeeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+
+        Assert.listOnlyOne(tmpFeeDtos, "璐圭敤涓嶅瓨鍦�");
+
+        doGeneratorOrRefreshFeeMonth(tmpFeeDtos.get(0), communityId);
+    }
+
+    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);
+
+
+    }
+
+    /**
+     * 绂绘暎鏈�澶� 绂绘暎鏈堝埌 deadlineTime 鐨勬暟鎹�
+     *
+     * @param feeDto
+     * @param payFeeMonthOwnerDto
+     * @param feePrice
+     */
+    private void maxMonthDateToDeadlineTimeData(FeeDto feeDto, PayFeeMonthOwnerDto payFeeMonthOwnerDto, Double feePrice) {
+        PayFeeDetailMonthDto payFeeDetailMonthDto = new PayFeeDetailMonthDto();
+        payFeeDetailMonthDto.setCommunityId(feeDto.getCommunityId());
+        payFeeDetailMonthDto.setFeeId(feeDto.getFeeId());
+        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();
+        }
+
+        // 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());
+        feeDetailDto.setStates(new String[]{FeeDetailDto.STATE_NORMAL,FeeDetailDto.STATE_RETURNING});
+        List<FeeDetailDto> feeDetailDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto);
+
+        //todo 鐢熸垚 鏈堢鏁f暟鎹�
+        PayFeeDetailMonthPo tmpPayFeeDetailMonthPo;
+        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(payFeeMonthHelp.getFeeDetailId(feeDetailDtos, calendar.getTime()));
+            tmpPayFeeDetailMonthPo.setDetailYear(calendar.get(Calendar.YEAR) + "");
+            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.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) {
+
+
+        FeeDto feeDto = new FeeDto();
+        feeDto.setCommunityId(communityId);
+        int count = feeInnerServiceSMOImpl.queryFeesCount(feeDto);
+
+        int page = 1;
+        int max = 15;
+        if (count < DEFAULT_DEAL_COUNT) {
+            page = 1;
+            max = count;
+        } else {
+            page = (int) Math.ceil((double) count / (double) DEFAULT_DEAL_COUNT);
+            max = DEFAULT_DEAL_COUNT;
+        }
+
+        //todo  姣忔鎸�200鏉″鐞�
+        for (int pageIndex = 0; pageIndex < page; pageIndex++) {
+            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) {
+        for (FeeDto tmpFeeDto : tmpFeeDtos) {
+            try {
+                doGeneratorOrRefreshFeeMonth(tmpFeeDto, communityId);
+            } catch (Exception e) {
+                e.printStackTrace();
+                logger.error("鐢熸垚璐圭敤鎶ヨ〃澶辫触" + JSONObject.toJSONString(tmpFeeDto), e);
+            }
+        }
+    }
+}
diff --git a/service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeDetailMonthInnerServiceSMOImpl.java b/service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeDetailMonthInnerServiceSMOImpl.java
index 3511863..3c9cbd2 100644
--- a/service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeDetailMonthInnerServiceSMOImpl.java
+++ b/service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeDetailMonthInnerServiceSMOImpl.java
@@ -3,6 +3,7 @@
 
 import com.java110.core.base.smo.BaseServiceSMO;
 import com.java110.dto.PageDto;
+import com.java110.dto.fee.FeeDetailDto;
 import com.java110.dto.payFeeDetailMonth.PayFeeDetailMonthDto;
 import com.java110.fee.dao.IPayFeeDetailMonthServiceDao;
 import com.java110.intf.fee.IPayFeeDetailMonthInnerServiceSMO;
@@ -41,8 +42,12 @@
     @Override
     public int savePayFeeDetailMonths(@RequestBody List<PayFeeDetailMonthPo> payFeeDetailMonthPos) {
         int saveFlag = 1;
+        if (payFeeDetailMonthPos == null || payFeeDetailMonthPos.size() < 1) {
+            return saveFlag;
+        }
+
         Map info = new HashMap();
-        info.put("payFeeDetailMonthPos",payFeeDetailMonthPos);
+        info.put("payFeeDetailMonthPos", payFeeDetailMonthPos);
         payFeeDetailMonthServiceDaoImpl.savePayFeeDetailMonthInfos(info);
         return saveFlag;
     }
@@ -57,8 +62,7 @@
     @Override
     public int deletePayFeeDetailMonth(@RequestBody PayFeeDetailMonthPo payFeeDetailMonthPo) {
         int saveFlag = 1;
-        payFeeDetailMonthPo.setStatusCd("1");
-        payFeeDetailMonthServiceDaoImpl.updatePayFeeDetailMonthInfo(BeanConvertUtil.beanCovertMap(payFeeDetailMonthPo));
+        payFeeDetailMonthServiceDaoImpl.deletePayFeeDetailMonthInfo(BeanConvertUtil.beanCovertMap(payFeeDetailMonthPo));
         return saveFlag;
     }
 
@@ -97,6 +101,19 @@
         return payFeeDetailMonths;
     }
 
+    /**
+     * 鏌ヨ闇�瑕佺鏁g殑 缂磋垂璁板綍
+     *
+     * @param payFeeDetailMonthDto
+     * @return
+     */
+    @Override
+    public List<FeeDetailDto> getWaitDispersedFeeDetail(@RequestBody PayFeeDetailMonthDto payFeeDetailMonthDto) {
+        List<FeeDetailDto> payFeeDetailMonths = BeanConvertUtil.covertBeanList(payFeeDetailMonthServiceDaoImpl.getWaitDispersedFeeDetail(BeanConvertUtil.beanCovertMap(payFeeDetailMonthDto)), FeeDetailDto.class);
+
+        return payFeeDetailMonths;
+    }
+
     public IPayFeeDetailMonthServiceDao getPayFeeDetailMonthServiceDaoImpl() {
         return payFeeDetailMonthServiceDaoImpl;
     }

--
Gitblit v1.8.0