Browse Source

优化代码

wuxw 2 years ago
parent
commit
a5106b61fc

+ 10 - 0
java110-bean/src/main/java/com/java110/dto/user/LoginOwnerResDto.java

@@ -29,6 +29,8 @@ public class LoginOwnerResDto implements Serializable {
 
     private String appUserId;
 
+    private String ownerTypeCd;
+
     public String getUserId() {
         return userId;
     }
@@ -116,4 +118,12 @@ public class LoginOwnerResDto implements Serializable {
     public void setAppUserId(String appUserId) {
         this.appUserId = appUserId;
     }
+
+    public String getOwnerTypeCd() {
+        return ownerTypeCd;
+    }
+
+    public void setOwnerTypeCd(String ownerTypeCd) {
+        this.ownerTypeCd = ownerTypeCd;
+    }
 }

+ 10 - 0
java110-bean/src/main/java/com/java110/po/fee/PayFeePo.java

@@ -19,6 +19,8 @@ public class PayFeePo implements Serializable {
     private String incomeObjId;
     private String startTime;
     private String endTime;
+
+    private String maxTime;
     private String amount;
     private String userId;
     private String bId;
@@ -171,4 +173,12 @@ public class PayFeePo implements Serializable {
     public String getDeductFrom() { return deductFrom; }
 
     public void setDeductFrom(String deductFrom) { this.deductFrom = deductFrom; }
+
+    public String getMaxTime() {
+        return maxTime;
+    }
+
+    public void setMaxTime(String maxTime) {
+        this.maxTime = maxTime;
+    }
 }

+ 14 - 0
java110-db/src/main/resources/mapper/fee/PayFeeRuleV1ServiceDaoImplMapper.xml

@@ -14,6 +14,20 @@
         )
     </insert>
 
+    <insert id="savePayFeeRules" parameterType="Map">
+        insert into pay_fee_rule(
+        max_time,amount,fee_type_cd,cur_year_month,batch_id,user_id,income_obj_id,config_id,fee_flag,
+        start_time,end_time,state,rule_id,community_id,payer_obj_type,payer_obj_id
+        ) values
+        <foreach collection="payFeeRulePos" item="item" separator=",">
+            (
+            #{item.maxTime},#{item.amount},#{item.feeTypeCd},#{item.curYearMonth},#{item.batchId},#{item.userId},
+            #{item.incomeObjId},#{item.configId},#{item.feeFlag},#{item.startTime},#{item.endTime},#{item.state},#{item.ruleId},
+            #{item.communityId},#{item.payerObjType},#{item.payerObjId}
+            )
+        </foreach>
+    </insert>
+
 
     <!-- 查询费用规则信息 add by wuxw 2018-07-03 -->
     <select id="getPayFeeRuleInfo" parameterType="Map" resultType="Map">

+ 7 - 0
java110-interface/src/main/java/com/java110/intf/fee/IPayFeeRuleV1InnerServiceSMO.java

@@ -41,6 +41,11 @@ public interface IPayFeeRuleV1InnerServiceSMO {
     @RequestMapping(value = "/savePayFeeRule", method = RequestMethod.POST)
      int savePayFeeRule(@RequestBody  PayFeeRulePo payFeeRulePo);
 
+
+    @RequestMapping(value = "/savePayFeeRules", method = RequestMethod.POST)
+    int savePayFeeRules(@RequestBody List<PayFeeRulePo> payFeeRulePos);
+
+
     @RequestMapping(value = "/updatePayFeeRule", method = RequestMethod.POST)
      int updatePayFeeRule(@RequestBody  PayFeeRulePo payFeeRulePo);
 
@@ -65,4 +70,6 @@ public interface IPayFeeRuleV1InnerServiceSMO {
      */
     @RequestMapping(value = "/queryPayFeeRulesCount", method = RequestMethod.POST)
     int queryPayFeeRulesCount(@RequestBody PayFeeRuleDto payFeeRuleDto);
+
+
 }

+ 16 - 0
java110-utils/src/main/java/com/java110/utils/util/DateUtil.java

@@ -889,4 +889,20 @@ public class DateUtil {
         return resMonth.doubleValue();
 
     }
+
+    public static Date getTargetEndTime(double month, Date startDate) {
+        Calendar endDate = Calendar.getInstance();
+        endDate.setTime(startDate);
+
+        Double intMonth = Math.floor(month);
+        endDate.add(Calendar.MONTH, intMonth.intValue());
+        double doubleMonth = month - intMonth;
+        if (doubleMonth <= 0) {
+            return endDate.getTime();
+        }
+        int futureDay = endDate.getActualMaximum(Calendar.DAY_OF_MONTH);
+        Double hour = doubleMonth * futureDay * 24;
+        endDate.add(Calendar.HOUR_OF_DAY, hour.intValue());
+        return endDate.getTime();
+    }
 }

+ 149 - 0
service-fee/src/main/java/com/java110/fee/convertOnce/CycleConvertOnceFeeImpl.java

@@ -1,13 +1,27 @@
 package com.java110.fee.convertOnce;
 
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.core.log.LoggerFactory;
+import com.java110.dto.fee.FeeConfigDto;
 import com.java110.dto.fee.FeeDto;
+import com.java110.fee.dao.IPayFeeConfigV1ServiceDao;
+import com.java110.fee.dao.impl.PayFeeV1ServiceDaoImpl;
 import com.java110.intf.fee.IFeeInnerServiceSMO;
+import com.java110.intf.fee.IPayFeeConfigV1InnerServiceSMO;
 import com.java110.intf.fee.IPayFeeRuleV1InnerServiceSMO;
 import com.java110.po.fee.PayFeePo;
+import com.java110.po.payFeeRule.PayFeeRulePo;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.DateUtil;
+import com.java110.utils.util.StringUtil;
+import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -17,9 +31,15 @@ import java.util.List;
 @Service
 public class CycleConvertOnceFeeImpl implements ICycleConvertOnceFee {
 
+    private static Logger logger = LoggerFactory.getLogger(PayFeeV1ServiceDaoImpl.class);
+
+
     @Autowired
     private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
 
+    @Autowired
+    private IPayFeeConfigV1InnerServiceSMO payFeeConfigV1InnerServiceSMOImpl;
+
     @Autowired
     private IPayFeeRuleV1InnerServiceSMO payFeeRuleV1InnerServiceSMOImpl;
 
@@ -41,6 +61,27 @@ public class CycleConvertOnceFeeImpl implements ICycleConvertOnceFee {
 
         //todo 业务处理
 
+        List<PayFeeRulePo> payFeeRulePos = new ArrayList<>();
+
+        PayFeeRulePo tmpPayFeeRulePo = null;
+        String curYearMonth = "";
+        for (PayFeePo tmpPayFeePo : payFeePos) {
+            tmpPayFeeRulePo = BeanConvertUtil.covertBean(tmpPayFeePo, PayFeeRulePo.class);
+            tmpPayFeeRulePo.setRuleId(GenerateCodeFactory.getGeneratorId("11"));
+            curYearMonth = DateUtil.getFormatTimeStringB(DateUtil.getDateFromStringB(tmpPayFeePo.getEndTime()));
+            tmpPayFeeRulePo.setCurYearMonth(curYearMonth);
+            payFeeRulePos.add(tmpPayFeeRulePo);
+        }
+
+        if (payFeeRulePos.isEmpty()) {
+            return 0;
+        }
+
+        //todo 保存规则
+        payFeeRuleV1InnerServiceSMOImpl.savePayFeeRules(payFeeRulePos);
+
+        //todo 根据规则生成费用
+        rulesGeneratePayFees(payFeeRulePos);
 
         return 0;
     }
@@ -61,4 +102,112 @@ public class CycleConvertOnceFeeImpl implements ICycleConvertOnceFee {
     public int covertRuleIdsPayFee(List<String> ruleIds) {
         return 0;
     }
+
+    @Override
+    public int rulesGeneratePayFees(List<PayFeeRulePo> payFeeRulePos) {
+
+        if (payFeeRulePos == null || payFeeRulePos.isEmpty()) {
+            return 0;
+        }
+
+        for (PayFeeRulePo tmpPayFeeRulePo : payFeeRulePos) {
+            try {
+                //todo 单个费用处理
+                ruleGeneratePayFee(tmpPayFeeRulePo);
+            } catch (Exception e) {
+                logger.error("处理异常 ruleId" + tmpPayFeeRulePo.getRuleId(), e);
+            }
+        }
+        return payFeeRulePos.size();
+    }
+
+    /**
+     * @param tmpPayFeeRulePo
+     */
+    public int ruleGeneratePayFee(PayFeeRulePo tmpPayFeeRulePo) {
+
+        //todo 查询费用项信息
+        FeeConfigDto feeConfigDto = new FeeConfigDto();
+        feeConfigDto.setConfigId(tmpPayFeeRulePo.getConfigId());
+        feeConfigDto.setCommunityId(tmpPayFeeRulePo.getCommunityId());
+        List<FeeConfigDto> feeConfigDtos = payFeeConfigV1InnerServiceSMOImpl.queryPayFeeConfigs(feeConfigDto);
+
+        Assert.listOnlyOne(feeConfigDtos, "费用项不存在,configId=" + tmpPayFeeRulePo.getConfigId());
+
+        //todo 计算目标 结束时间
+        Date targetEndTime = computeTargetEndTime(tmpPayFeeRulePo, feeConfigDtos.get(0));
+
+        //todo 创建 pay_fee 和 attrs 数据
+
+        List<PayFeePo> payFeePos = new ArrayList<>();
+        for()
+
+
+        return 0;
+    }
+
+    /**
+     * 计算目标结束时间
+     *
+     * @param tmpPayFeeRulePo
+     * @param feeConfigDto
+     * @return
+     */
+    private Date computeTargetEndTime(PayFeeRulePo tmpPayFeeRulePo, FeeConfigDto feeConfigDto) {
+
+        Date targetEndDate = null;
+        //todo 判断当前费用是否已结束
+        if (FeeDto.STATE_FINISH.equals(tmpPayFeeRulePo.getState())) {
+            targetEndDate = DateUtil.getDateFromStringB(tmpPayFeeRulePo.getEndTime());
+            return targetEndDate;
+        }
+
+        Calendar preEndTimeCal = Calendar.getInstance();
+        preEndTimeCal.setTime(DateUtil.getDateFromStringB(tmpPayFeeRulePo.getEndTime()));
+        if (StringUtil.isNumber(feeConfigDto.getPrepaymentPeriod())) {
+            preEndTimeCal.add(Calendar.DAY_OF_MONTH, Integer.parseInt(feeConfigDto.getPrepaymentPeriod()) * -1);
+        }
+        Date preEndTime = preEndTimeCal.getTime();
+        Date maxEndTime = DateUtil.getDateFromStringB(tmpPayFeeRulePo.getMaxTime());
+
+        Date billEndTime = DateUtil.getCurrentDate();
+        //建账时间
+        Date startDate = DateUtil.getDateFromStringB(tmpPayFeeRulePo.getStartTime());
+        //计费起始时间
+        Date endDate = DateUtil.getDateFromStringB(tmpPayFeeRulePo.getEndTime());
+        //缴费周期
+        long paymentCycle = Long.parseLong(feeConfigDto.getPaymentCycle());
+        // 当前时间 - 开始时间  = 月份
+        double mulMonth = 0.0;
+        mulMonth = DateUtil.dayCompare(startDate, billEndTime);
+
+        // 月份/ 周期 = 轮数(向上取整)
+        double round = 0.0;
+        if ("1200".equals(feeConfigDto.getPaymentCd())) { // 1200预付费
+            round = Math.floor(mulMonth / paymentCycle) + 1;
+        } else { //2100后付费
+            round = Math.floor(mulMonth / paymentCycle);
+        }
+        // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间
+        targetEndDate = DateUtil.getTargetEndTime(round * paymentCycle, startDate);//目标结束时间
+
+        //todo 如果 到了 预付期 产生下个周期的费用
+        if (DateUtil.getFormatTimeStringB(targetEndDate).equals(DateUtil.getFormatTimeStringB(endDate))
+                && DateUtil.getCurrentDate().getTime() > preEndTime.getTime()
+        ) {
+            targetEndDate = DateUtil.getTargetEndTime((round + 1) * paymentCycle, startDate);//目标结束时间
+        }
+
+
+        //todo 费用项的结束时间<缴费的结束时间  费用快结束了   取费用项的结束时间
+        if (maxEndTime.getTime() < targetEndDate.getTime()) {
+            targetEndDate = maxEndTime;
+        }
+
+        if (DateUtil.getDateFromStringB(tmpPayFeeRulePo.getEndTime()).getTime() > targetEndDate.getTime()) {
+            targetEndDate = DateUtil.getDateFromStringB(tmpPayFeeRulePo.getEndTime());
+        }
+
+        return targetEndDate;
+    }
 }

+ 18 - 0
service-fee/src/main/java/com/java110/fee/convertOnce/ICycleConvertOnceFee.java

@@ -1,6 +1,7 @@
 package com.java110.fee.convertOnce;
 
 import com.java110.po.fee.PayFeePo;
+import com.java110.po.payFeeRule.PayFeeRulePo;
 
 import java.util.List;
 
@@ -36,8 +37,25 @@ public interface ICycleConvertOnceFee {
 
     /**
      * 根据 费用规则转换
+     *
      * @param ruleIds 费用规则
      * @return 大于1 转换成功 0 转换失败
      */
     int covertRuleIdsPayFee(List<String> ruleIds);
+
+    /**
+     * 根据规则生成 一次性费用
+     *
+     * @param payFeeRulePos
+     * @return
+     */
+    int rulesGeneratePayFees(List<PayFeeRulePo> payFeeRulePos);
+
+    /**
+     * 根据规则生成 一次性费用
+     *
+     * @param payFeeRulePo
+     * @return
+     */
+    int ruleGeneratePayFee(PayFeeRulePo payFeeRulePo);
 }

+ 7 - 0
service-fee/src/main/java/com/java110/fee/dao/IPayFeeRuleV1ServiceDao.java

@@ -70,4 +70,11 @@ public interface IPayFeeRuleV1ServiceDao {
      */
     int queryPayFeeRulesCount(Map info);
 
+    /**
+     * 保存创建费用规则
+     *
+     * @param info
+     * @return
+     */
+    int savePayFeeRules(Map info);
 }

+ 11 - 0
service-fee/src/main/java/com/java110/fee/dao/impl/PayFeeRuleV1ServiceDaoImpl.java

@@ -60,6 +60,16 @@ public class PayFeeRuleV1ServiceDaoImpl extends BaseServiceDao implements IPayFe
         return saveFlag;
     }
 
+    @Override
+    public int savePayFeeRules(Map info) {
+        logger.debug("保存 savePayFeeRules 入参 info : {}",info);
+
+        int saveFlag = sqlSessionTemplate.insert("payFeeRuleV1ServiceDaoImpl.savePayFeeRules",info);
+
+        return saveFlag;
+    }
+
+
 
     /**
      * 查询费用规则信息(instance)
@@ -109,4 +119,5 @@ public class PayFeeRuleV1ServiceDaoImpl extends BaseServiceDao implements IPayFe
     }
 
 
+
 }

+ 11 - 1
service-fee/src/main/java/com/java110/fee/smo/impl/PayFeeRuleV1InnerServiceSMOImpl.java

@@ -29,7 +29,9 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 类表述: 服务之前调用的接口实现类,不对外提供接口能力 只用于接口建调用
@@ -52,7 +54,15 @@ public class PayFeeRuleV1InnerServiceSMOImpl extends BaseServiceSMO implements I
         return saveFlag;
     }
 
-     @Override
+    @Override
+    public int savePayFeeRules(@RequestBody List<PayFeeRulePo> payFeeRulePos) {
+        Map info = new HashMap();
+        info.put("payFeeRulePos",payFeeRulePos);
+        int saveFlag = payFeeRuleV1ServiceDaoImpl.savePayFeeRules(info);
+        return saveFlag;
+    }
+
+    @Override
     public int updatePayFeeRule(@RequestBody  PayFeeRulePo payFeeRulePo) {
         int saveFlag = payFeeRuleV1ServiceDaoImpl.updatePayFeeRuleInfo(BeanConvertUtil.beanCovertMap(payFeeRulePo));
         return saveFlag;

+ 1 - 0
service-user/src/main/java/com/java110/user/cmd/user/OwnerUserLoginCmd.java

@@ -171,6 +171,7 @@ public class OwnerUserLoginCmd extends Cmd {
         loginOwnerResDto.setCommunityName(communityDtos.get(0).getName());
         loginOwnerResDto.setToken(token);
         loginOwnerResDto.setKey(newKey);
+        loginOwnerResDto.setOwnerTypeCd(ownerDto.getOwnerTypeCd());
         loginOwnerResDto.setAppUserId(ownerAppUserDtos.get(0).getAppUserId());
         context.setResponseEntity(ResultVo.createResponseEntity(loginOwnerResDto));