CycleConvertOnceFeeImpl.java 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package com.java110.fee.convertOnce;
  2. import com.java110.core.factory.GenerateCodeFactory;
  3. import com.java110.core.log.LoggerFactory;
  4. import com.java110.dto.fee.FeeConfigDto;
  5. import com.java110.dto.fee.FeeDto;
  6. import com.java110.fee.dao.IPayFeeConfigV1ServiceDao;
  7. import com.java110.fee.dao.impl.PayFeeV1ServiceDaoImpl;
  8. import com.java110.intf.fee.IFeeInnerServiceSMO;
  9. import com.java110.intf.fee.IPayFeeConfigV1InnerServiceSMO;
  10. import com.java110.intf.fee.IPayFeeRuleV1InnerServiceSMO;
  11. import com.java110.po.fee.PayFeePo;
  12. import com.java110.po.payFeeRule.PayFeeRulePo;
  13. import com.java110.utils.util.Assert;
  14. import com.java110.utils.util.BeanConvertUtil;
  15. import com.java110.utils.util.DateUtil;
  16. import com.java110.utils.util.StringUtil;
  17. import org.slf4j.Logger;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Service;
  20. import java.util.ArrayList;
  21. import java.util.Calendar;
  22. import java.util.Date;
  23. import java.util.List;
  24. /**
  25. * 转换一次性费用
  26. */
  27. @Service
  28. public class CycleConvertOnceFeeImpl implements ICycleConvertOnceFee {
  29. private static Logger logger = LoggerFactory.getLogger(PayFeeV1ServiceDaoImpl.class);
  30. @Autowired
  31. private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
  32. @Autowired
  33. private IPayFeeConfigV1InnerServiceSMO payFeeConfigV1InnerServiceSMOImpl;
  34. @Autowired
  35. private IPayFeeRuleV1InnerServiceSMO payFeeRuleV1InnerServiceSMOImpl;
  36. @Override
  37. public int convertPayFees(List<PayFeePo> payFeePos) {
  38. List<PayFeePo> tmpPayFeePos = new ArrayList<>();
  39. for (PayFeePo tmpPayFeePo : payFeePos) {
  40. //todo 一次性费用 直接跳过
  41. if (FeeDto.FEE_FLAG_ONCE.equals(tmpPayFeePo.getFeeFlag())) {
  42. continue;
  43. }
  44. tmpPayFeePos.add(tmpPayFeePo);
  45. }
  46. if (tmpPayFeePos.isEmpty()) {
  47. return 0;
  48. }
  49. //todo 业务处理
  50. List<PayFeeRulePo> payFeeRulePos = new ArrayList<>();
  51. PayFeeRulePo tmpPayFeeRulePo = null;
  52. String curYearMonth = "";
  53. for (PayFeePo tmpPayFeePo : payFeePos) {
  54. tmpPayFeeRulePo = BeanConvertUtil.covertBean(tmpPayFeePo, PayFeeRulePo.class);
  55. tmpPayFeeRulePo.setRuleId(GenerateCodeFactory.getGeneratorId("11"));
  56. curYearMonth = DateUtil.getFormatTimeStringB(DateUtil.getDateFromStringB(tmpPayFeePo.getEndTime()));
  57. tmpPayFeeRulePo.setCurYearMonth(curYearMonth);
  58. payFeeRulePos.add(tmpPayFeeRulePo);
  59. }
  60. if (payFeeRulePos.isEmpty()) {
  61. return 0;
  62. }
  63. //todo 保存规则
  64. payFeeRuleV1InnerServiceSMOImpl.savePayFeeRules(payFeeRulePos);
  65. //todo 根据规则生成费用
  66. rulesGeneratePayFees(payFeeRulePos);
  67. return 0;
  68. }
  69. @Override
  70. public int convertPayFee(PayFeePo payFeePo) {
  71. List<PayFeePo> payFeePos = new ArrayList<>();
  72. payFeePos.add(payFeePo);
  73. return convertPayFees(payFeePos);
  74. }
  75. @Override
  76. public int covertCommunityPayFee(String communityId) {
  77. return 0;
  78. }
  79. @Override
  80. public int covertRuleIdsPayFee(List<String> ruleIds) {
  81. return 0;
  82. }
  83. @Override
  84. public int rulesGeneratePayFees(List<PayFeeRulePo> payFeeRulePos) {
  85. if (payFeeRulePos == null || payFeeRulePos.isEmpty()) {
  86. return 0;
  87. }
  88. for (PayFeeRulePo tmpPayFeeRulePo : payFeeRulePos) {
  89. try {
  90. //todo 单个费用处理
  91. ruleGeneratePayFee(tmpPayFeeRulePo);
  92. } catch (Exception e) {
  93. logger.error("处理异常 ruleId" + tmpPayFeeRulePo.getRuleId(), e);
  94. }
  95. }
  96. return payFeeRulePos.size();
  97. }
  98. /**
  99. * @param tmpPayFeeRulePo
  100. */
  101. public int ruleGeneratePayFee(PayFeeRulePo tmpPayFeeRulePo) {
  102. //todo 查询费用项信息
  103. FeeConfigDto feeConfigDto = new FeeConfigDto();
  104. feeConfigDto.setConfigId(tmpPayFeeRulePo.getConfigId());
  105. feeConfigDto.setCommunityId(tmpPayFeeRulePo.getCommunityId());
  106. List<FeeConfigDto> feeConfigDtos = payFeeConfigV1InnerServiceSMOImpl.queryPayFeeConfigs(feeConfigDto);
  107. Assert.listOnlyOne(feeConfigDtos, "费用项不存在,configId=" + tmpPayFeeRulePo.getConfigId());
  108. //todo 计算目标 结束时间
  109. Date targetEndTime = computeTargetEndTime(tmpPayFeeRulePo, feeConfigDtos.get(0));
  110. //todo 创建 pay_fee 和 attrs 数据
  111. List<PayFeePo> payFeePos = new ArrayList<>();
  112. //for()
  113. return 0;
  114. }
  115. /**
  116. * 计算目标结束时间
  117. *
  118. * @param tmpPayFeeRulePo
  119. * @param feeConfigDto
  120. * @return
  121. */
  122. private Date computeTargetEndTime(PayFeeRulePo tmpPayFeeRulePo, FeeConfigDto feeConfigDto) {
  123. Date targetEndDate = null;
  124. //todo 判断当前费用是否已结束
  125. if (FeeDto.STATE_FINISH.equals(tmpPayFeeRulePo.getState())) {
  126. targetEndDate = DateUtil.getDateFromStringB(tmpPayFeeRulePo.getEndTime());
  127. return targetEndDate;
  128. }
  129. Calendar preEndTimeCal = Calendar.getInstance();
  130. preEndTimeCal.setTime(DateUtil.getDateFromStringB(tmpPayFeeRulePo.getEndTime()));
  131. if (StringUtil.isNumber(feeConfigDto.getPrepaymentPeriod())) {
  132. preEndTimeCal.add(Calendar.DAY_OF_MONTH, Integer.parseInt(feeConfigDto.getPrepaymentPeriod()) * -1);
  133. }
  134. Date preEndTime = preEndTimeCal.getTime();
  135. Date maxEndTime = DateUtil.getDateFromStringB(tmpPayFeeRulePo.getMaxTime());
  136. Date billEndTime = DateUtil.getCurrentDate();
  137. //建账时间
  138. Date startDate = DateUtil.getDateFromStringB(tmpPayFeeRulePo.getStartTime());
  139. //计费起始时间
  140. Date endDate = DateUtil.getDateFromStringB(tmpPayFeeRulePo.getEndTime());
  141. //缴费周期
  142. long paymentCycle = Long.parseLong(feeConfigDto.getPaymentCycle());
  143. // 当前时间 - 开始时间 = 月份
  144. double mulMonth = 0.0;
  145. mulMonth = DateUtil.dayCompare(startDate, billEndTime);
  146. // 月份/ 周期 = 轮数(向上取整)
  147. double round = 0.0;
  148. if ("1200".equals(feeConfigDto.getPaymentCd())) { // 1200预付费
  149. round = Math.floor(mulMonth / paymentCycle) + 1;
  150. } else { //2100后付费
  151. round = Math.floor(mulMonth / paymentCycle);
  152. }
  153. // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间
  154. targetEndDate = DateUtil.getTargetEndTime(round * paymentCycle, startDate);//目标结束时间
  155. //todo 如果 到了 预付期 产生下个周期的费用
  156. if (DateUtil.getFormatTimeStringB(targetEndDate).equals(DateUtil.getFormatTimeStringB(endDate))
  157. && DateUtil.getCurrentDate().getTime() > preEndTime.getTime()
  158. ) {
  159. targetEndDate = DateUtil.getTargetEndTime((round + 1) * paymentCycle, startDate);//目标结束时间
  160. }
  161. //todo 费用项的结束时间<缴费的结束时间 费用快结束了 取费用项的结束时间
  162. if (maxEndTime.getTime() < targetEndDate.getTime()) {
  163. targetEndDate = maxEndTime;
  164. }
  165. if (DateUtil.getDateFromStringB(tmpPayFeeRulePo.getEndTime()).getTime() > targetEndDate.getTime()) {
  166. targetEndDate = DateUtil.getDateFromStringB(tmpPayFeeRulePo.getEndTime());
  167. }
  168. return targetEndDate;
  169. }
  170. }