| | |
| | | return computeDiscountDtoList; |
| | | } |
| | | |
| | | |
| | | public List<ComputeDiscountDto> computeDiscount(@RequestBody FeeDetailDto feeDetailDto,double useCycle) { |
| | | SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
| | | Calendar c = Calendar.getInstance(); |
| | | List<ComputeDiscountDto> computeDiscountDtos = new ArrayList<>(); |
| | | FeeDto feeDto = new FeeDto(); |
| | | feeDto.setFeeId(feeDetailDto.getFeeId()); |
| | | feeDto.setCommunityId(feeDetailDto.getCommunityId()); |
| | | feeDto.setState(FeeDto.STATE_DOING); |
| | | List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto); |
| | | Assert.listOnlyOne(feeDtos, "费用不存在"); |
| | | PayFeeConfigDiscountDto payFeeConfigDiscountDto = new PayFeeConfigDiscountDto(); |
| | | payFeeConfigDiscountDto.setConfigId(feeDtos.get(0).getConfigId()); |
| | | payFeeConfigDiscountDto.setRow(feeDetailDto.getRow()); |
| | | payFeeConfigDiscountDto.setPage(feeDetailDto.getPage()); |
| | | payFeeConfigDiscountDto.setCommunityId(feeDetailDto.getCommunityId()); |
| | | payFeeConfigDiscountDto.setStatusCd("0"); |
| | | Date currentTime = new Date(); |
| | | payFeeConfigDiscountDto.setCurrentTime(currentTime); |
| | | //根据房屋ID,去折扣申请表查询是否有折扣 |
| | | ApplyRoomDiscountDto applyRoomDiscountDto = new ApplyRoomDiscountDto(); |
| | | //审核已通过 |
| | | applyRoomDiscountDto.setState("4"); |
| | | //是否可用状态标识(0表示在用;1表示不可用) |
| | | applyRoomDiscountDto.setInUse("0"); |
| | | //小区ID |
| | | applyRoomDiscountDto.setCommunityId(feeDetailDto.getCommunityId()); |
| | | //房屋id |
| | | applyRoomDiscountDto.setRoomId(feeDetailDto.getPayerObjId()); |
| | | |
| | | applyRoomDiscountDto.setFeeId(feeDetailDto.getFeeId()); |
| | | List<ApplyRoomDiscountDto> applyRoomDiscountDtos = applyRoomDiscountInnerServiceSMOImpl.queryApplyRoomDiscounts(applyRoomDiscountDto); |
| | | |
| | | if (!ListUtil.isNull(applyRoomDiscountDtos)) { |
| | | computeApplyRoomDiscount(feeDetailDto, simpleDateFormat, c, computeDiscountDtos,useCycle); |
| | | //取出开关映射的值 |
| | | String value = MappingCache.getValue(DOMAIN_COMMON, DISCOUNT_MODE); |
| | | List<ComputeDiscountDto> computeDiscountDtoList = new ArrayList<>(); |
| | | for (ComputeDiscountDto computeDiscountDto : computeDiscountDtos) { |
| | | computeDiscountDto.setValue(value); |
| | | |
| | | computeDiscountDto.setDiscountPrice( |
| | | MoneyUtil.computePriceScale( |
| | | computeDiscountDto.getDiscountPrice(), |
| | | feeDtos.get(0).getScale(), |
| | | Integer.parseInt(feeDtos.get(0).getDecimalPlace()) |
| | | ) |
| | | ); |
| | | if (!StringUtil.isEmpty(computeDiscountDto.getDiscountType()) && "3003".equals(computeDiscountDto.getDiscountType())) { |
| | | computeDiscountDto.setArdId(feeDetailDto.getArdId()); |
| | | } |
| | | computeDiscountDtoList.add(computeDiscountDto); |
| | | } |
| | | return computeDiscountDtos; |
| | | } |
| | | //根据费用项查询折扣(该费用项下的所有折扣信息) |
| | | List<PayFeeConfigDiscountDto> payFeeConfigDiscountDtos = |
| | | payFeeConfigDiscountInnerServiceSMOImpl.queryPayFeeConfigDiscounts(payFeeConfigDiscountDto); |
| | | c.setTime(feeDetailDto.getStartTime()); |
| | | feeDetailDto.setCycles(useCycle+""); |
| | | double mon = Double.parseDouble(feeDetailDto.getCycles()); |
| | | c.add(Calendar.MONTH, (int) mon); |
| | | //获取缴费结束时间 |
| | | Date finishTime = feeDetailDto.getEndTime(); |
| | | for (PayFeeConfigDiscountDto tmpPayFeeConfigDiscountDto : payFeeConfigDiscountDtos) { |
| | | //获取缴费最大截止时间 |
| | | Date payMaxEndTime = tmpPayFeeConfigDiscountDto.getPayMaxEndTime(); |
| | | FeeDiscountDto feeDiscountDto = new FeeDiscountDto(); |
| | | feeDiscountDto.setDiscountId(tmpPayFeeConfigDiscountDto.getDiscountId()); |
| | | //查询打折表 |
| | | List<FeeDiscountDto> feeDiscountInfo = BeanConvertUtil.covertBeanList(feeDiscountServiceDaoImpl.getFeeDiscountInfo(BeanConvertUtil.beanCovertMap(feeDiscountDto)), FeeDiscountDto.class); |
| | | //Assert.listOnlyOne(feeDiscountInfo, "查询打折表错误!"); |
| | | if(ListUtil.isNull(feeDiscountInfo)){ |
| | | continue; |
| | | } |
| | | FeeDiscountRuleDto feeDiscountRuleDto = new FeeDiscountRuleDto(); |
| | | feeDiscountRuleDto.setRuleId(feeDiscountInfo.get(0).getRuleId()); |
| | | //查询打折规则表 |
| | | List<FeeDiscountRuleDto> feeDiscountRuleDtos = feeDiscountRuleInnerServiceSMOImpl.queryFeeDiscountRules(feeDiscountRuleDto); |
| | | //Assert.listOnlyOne(feeDiscountRuleDtos, "查询打折规则表错误!"); |
| | | if(ListUtil.isNull(feeDiscountRuleDtos)){ |
| | | continue; |
| | | } |
| | | if (!StringUtil.isEmpty(feeDiscountRuleDtos.get(0).getBeanImpl()) && feeDiscountRuleDtos.get(0).getBeanImpl().equals("reductionMonthFeeRule")) { //赠送规则 |
| | | FeeDiscountSpecDto feeDiscountSpecDto = new FeeDiscountSpecDto(); |
| | | feeDiscountSpecDto.setDiscountId(tmpPayFeeConfigDiscountDto.getDiscountId()); |
| | | feeDiscountSpecDto.setSpecId(SPEC_RATE); |
| | | //查询打折规格 |
| | | List<FeeDiscountSpecDto> feeDiscountSpecDtos = feeDiscountSpecInnerServiceSMOImpl.queryFeeDiscountSpecs(feeDiscountSpecDto); |
| | | //Assert.listOnlyOne(feeDiscountSpecDtos, "查询打折规格表错误!"); |
| | | if(ListUtil.isNull(feeDiscountSpecDtos)){ |
| | | continue; |
| | | } |
| | | //获取赠送月份 |
| | | String specValue = feeDiscountSpecDtos.get(0).getSpecValue(); |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.setTime(finishTime); |
| | | cal.add(Calendar.MONTH, Integer.parseInt(specValue)); |
| | | finishTime = cal.getTime(); |
| | | } |
| | | if (payMaxEndTime == null) { |
| | | doCompute(tmpPayFeeConfigDiscountDto, Double.parseDouble(feeDetailDto.getCycles()), computeDiscountDtos, feeDetailDto.getFeeId()); |
| | | } else if (payMaxEndTime.getTime() >= finishTime.getTime()) { |
| | | doCompute(tmpPayFeeConfigDiscountDto, Double.parseDouble(feeDetailDto.getCycles()), computeDiscountDtos, feeDetailDto.getFeeId()); |
| | | } else { |
| | | continue; |
| | | } |
| | | finishTime = c.getTime(); |
| | | } |
| | | computeApplyRoomDiscount(feeDetailDto, simpleDateFormat, c, computeDiscountDtos); |
| | | //取出开关映射的值 |
| | | String value = MappingCache.getValue(DOMAIN_COMMON, DISCOUNT_MODE); |
| | | List<ComputeDiscountDto> computeDiscountDtoList = new ArrayList<>(); |
| | | for (ComputeDiscountDto computeDiscountDto : computeDiscountDtos) { |
| | | computeDiscountDto.setValue(value); |
| | | computeDiscountDto.setDiscountPrice( |
| | | MoneyUtil.computePriceScale( |
| | | computeDiscountDto.getDiscountPrice(), |
| | | feeDtos.get(0).getScale(), |
| | | Integer.parseInt(feeDtos.get(0).getDecimalPlace()) |
| | | ) |
| | | ); |
| | | if (!StringUtil.isEmpty(computeDiscountDto.getDiscountType()) && "3003".equals(computeDiscountDto.getDiscountType())) { |
| | | computeDiscountDto.setArdId(feeDetailDto.getArdId()); |
| | | } |
| | | computeDiscountDtoList.add(computeDiscountDto); |
| | | } |
| | | return computeDiscountDtoList; |
| | | } |
| | | |
| | | private void computeApplyRoomDiscount(@RequestBody FeeDetailDto feeDetailDto, SimpleDateFormat simpleDateFormat, Calendar c, List<ComputeDiscountDto> computeDiscountDtos) { |
| | | if (!StringUtil.isEmpty(feeDetailDto.getPayerObjType()) && FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDetailDto.getPayerObjType())) { |
| | | //根据房屋ID,去折扣申请表查询是否有折扣 |
| | |
| | | PayFeeConfigDiscountDto payFeeConfigDiscount = new PayFeeConfigDiscountDto(); |
| | | payFeeConfigDiscount.setCommunityId(applyRoomDiscountDtos.get(0).getCommunityId()); |
| | | payFeeConfigDiscount.setDiscountId(discountId); |
| | | if(applyRoomDiscountDtos.get(0).getStartTime() == null){ |
| | | payFeeConfigDiscount.setStartTime(feeDetailDto.getStartTime()); |
| | | }else if(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getStartTime()).before(feeDetailDto.getStartTime())){ |
| | | payFeeConfigDiscount.setStartTime(feeDetailDto.getStartTime()); |
| | | }else{ |
| | | payFeeConfigDiscount.setStartTime(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getStartTime())); |
| | | if(month == 105){ |
| | | if(applyRoomDiscountDtos.get(0).getStartTime() == null){ |
| | | payFeeConfigDiscount.setStartTime(feeDetailDto.getStartTime()); |
| | | }else if(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getStartTime()).before(feeDetailDto.getStartTime())){ |
| | | payFeeConfigDiscount.setStartTime(feeDetailDto.getStartTime()); |
| | | }else{ |
| | | payFeeConfigDiscount.setStartTime(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getStartTime())); |
| | | } |
| | | if(applyRoomDiscountDtos.get(0).getEndTime() == null){ |
| | | payFeeConfigDiscount.setEndTime(endTime); |
| | | }else if(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getEndTime()).after(feeDetailDto.getEndTime())){ |
| | | payFeeConfigDiscount.setEndTime(feeDetailDto.getEndTime()); |
| | | }else{ |
| | | payFeeConfigDiscount.setEndTime(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getEndTime())); |
| | | } |
| | | month = |
| | | DateUtil.dayCompare( |
| | | payFeeConfigDiscount.getStartTime(), |
| | | payFeeConfigDiscount.getEndTime() |
| | | ); |
| | | } |
| | | if(applyRoomDiscountDtos.get(0).getEndTime() == null){ |
| | | payFeeConfigDiscount.setEndTime(endTime); |
| | | }else if(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getEndTime()).after(feeDetailDto.getEndTime())){ |
| | | payFeeConfigDiscount.setEndTime(feeDetailDto.getEndTime()); |
| | | }else{ |
| | | payFeeConfigDiscount.setEndTime(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getEndTime())); |
| | | } |
| | | double cycle = |
| | | DateUtil.dayCompare( |
| | | payFeeConfigDiscount.getStartTime(), |
| | | payFeeConfigDiscount.getEndTime() |
| | | ); |
| | | doComputeB(payFeeConfigDiscount, cycle, computeDiscountDtos, feeDetailDto.getFeeId()); |
| | | doComputeB(payFeeConfigDiscount, month, computeDiscountDtos, feeDetailDto.getFeeId(),month); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void doComputeB(PayFeeConfigDiscountDto tmpPayFeeConfigDiscountDto, double cycles, List<ComputeDiscountDto> computeDiscountDtos, String feeId) { |
| | | |
| | | |
| | | private void computeApplyRoomDiscount(@RequestBody FeeDetailDto feeDetailDto, SimpleDateFormat simpleDateFormat, Calendar c, List<ComputeDiscountDto> computeDiscountDtos,double useCycle) { |
| | | if (!StringUtil.isEmpty(feeDetailDto.getPayerObjType()) && FeeDto.PAYER_OBJ_TYPE_ROOM.equals(feeDetailDto.getPayerObjType())) { |
| | | //根据房屋ID,去折扣申请表查询是否有折扣 |
| | | ApplyRoomDiscountDto applyRoomDiscountDto = new ApplyRoomDiscountDto(); |
| | | //审核已通过 |
| | | applyRoomDiscountDto.setState("4"); |
| | | //是否可用状态标识(0表示在用;1表示不可用) |
| | | applyRoomDiscountDto.setInUse("0"); |
| | | //小区ID |
| | | applyRoomDiscountDto.setCommunityId(feeDetailDto.getCommunityId()); |
| | | //房屋id |
| | | applyRoomDiscountDto.setRoomId(feeDetailDto.getPayerObjId()); |
| | | //开始时间 |
| | | // applyRoomDiscountDto.setStartTime(simpleDateFormat.format(feeDetailDto.getStartTime())); |
| | | //结束时间 |
| | | c.setTime(feeDetailDto.getStartTime()); |
| | | // c.add(Calendar.DAY_OF_MONTH, 2);//开始时间,添加1,2天的冗余,只要比5小即可 |
| | | // applyRoomDiscountDto.setStartTime(simpleDateFormat.format(c.getTime()));//重新设置开始时间 |
| | | double month = useCycle; |
| | | // if(month == 105){ |
| | | // return; |
| | | // } |
| | | c.add(Calendar.MONTH, (int) month); |
| | | // c.add(Calendar.DAY_OF_MONTH, -5);//这里根据设置时间荣誉5天 |
| | | Date endTime = c.getTime(); |
| | | // applyRoomDiscountDto.setEndTime(simpleDateFormat.format(endTime)); |
| | | applyRoomDiscountDto.setFeeId(feeDetailDto.getFeeId()); |
| | | //查询折扣申请表 |
| | | List<ApplyRoomDiscountDto> applyRoomDiscountDtos = applyRoomDiscountInnerServiceSMOImpl.queryApplyRoomDiscounts(applyRoomDiscountDto); |
| | | |
| | | |
| | | |
| | | //判断查询的折扣申请表是否有数据 |
| | | if (applyRoomDiscountDtos != null && applyRoomDiscountDtos.size() > 0) { |
| | | //获取优惠id |
| | | String discountId = applyRoomDiscountDtos.get(0).getDiscountId(); |
| | | String ardId = applyRoomDiscountDtos.get(0).getArdId(); |
| | | feeDetailDto.setArdId(ardId); |
| | | PayFeeConfigDiscountDto payFeeConfigDiscount = new PayFeeConfigDiscountDto(); |
| | | payFeeConfigDiscount.setCommunityId(applyRoomDiscountDtos.get(0).getCommunityId()); |
| | | payFeeConfigDiscount.setDiscountId(discountId); |
| | | if(feeDetailDto.getCycles().equals("105.0") ){ |
| | | if(applyRoomDiscountDtos.get(0).getStartTime() == null){ |
| | | payFeeConfigDiscount.setStartTime(feeDetailDto.getStartTime()); |
| | | }else if(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getStartTime()).before(feeDetailDto.getStartTime()) || DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getStartTime()).equals(feeDetailDto.getStartTime())){ |
| | | payFeeConfigDiscount.setStartTime(feeDetailDto.getStartTime()); |
| | | }else{ |
| | | payFeeConfigDiscount.setStartTime(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getStartTime())); |
| | | } |
| | | if(applyRoomDiscountDtos.get(0).getEndTime() == null){ |
| | | payFeeConfigDiscount.setEndTime(endTime); |
| | | }else if(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getEndTime()).after(feeDetailDto.getEndTime()) || DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getEndTime()).equals(feeDetailDto.getEndTime())){ |
| | | payFeeConfigDiscount.setEndTime(feeDetailDto.getEndTime()); |
| | | }else{ |
| | | payFeeConfigDiscount.setEndTime(DateUtil.getDateFromStringB(applyRoomDiscountDtos.get(0).getEndTime())); |
| | | } |
| | | month = |
| | | DateUtil.dayCompare( |
| | | payFeeConfigDiscount.getStartTime(), |
| | | payFeeConfigDiscount.getEndTime() |
| | | ); |
| | | } |
| | | doComputeB(payFeeConfigDiscount, month, computeDiscountDtos, feeDetailDto.getFeeId(),useCycle); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void doComputeB(PayFeeConfigDiscountDto tmpPayFeeConfigDiscountDto, double cycles, List<ComputeDiscountDto> computeDiscountDtos, String feeId, double useCycle) { |
| | | FeeDiscountDto feeDiscountDto = new FeeDiscountDto(); |
| | | feeDiscountDto.setCommunityId(tmpPayFeeConfigDiscountDto.getCommunityId()); |
| | | feeDiscountDto.setDiscountId(tmpPayFeeConfigDiscountDto.getDiscountId()); |
| | |
| | | tmpFeeDiscountDto.setCycles(cycles); |
| | | } |
| | | IComputeDiscount computeDiscount = (IComputeDiscount) ApplicationContextFactory.getBean(feeDiscountDtos.get(0).getBeanImpl()); |
| | | feeDiscountDtos.get(0).setDiscountDesc(useCycle+""); |
| | | ComputeDiscountDto computeDiscountDto = computeDiscount.compute(feeDiscountDtos.get(0)); |
| | | if (computeDiscountDto == null) { |
| | | return; |