chengf
2025-08-13 f44187822ea6217070c0f6fc585c3feadea03cb1
service-fee/src/main/java/com/java110/fee/smo/impl/FeeDiscountInnerServiceSMOImpl.java
@@ -256,6 +256,136 @@
        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,去折扣申请表查询是否有折扣
@@ -297,31 +427,102 @@
                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());
@@ -335,6 +536,7 @@
            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;