| | |
| | | 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; |
| | | |
| | | /** |
| | |
| | | @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; |
| | |
| | | |
| | | //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; |
| | | } |
| | |
| | | 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; |
| | | } |
| | | } |