chengf
2025-08-27 074caee550216dfd4bb676677ae33cbd837c5710
service-fee/src/main/java/com/java110/fee/smo/impl/FeeDiscountInnerServiceSMOImpl.java
@@ -10,6 +10,7 @@
import com.java110.dto.fee.FeeDiscountRuleDto;
import com.java110.dto.fee.FeeDiscountSpecDto;
import com.java110.dto.payFee.PayFeeConfigDiscountDto;
import com.java110.dto.work.WorkCopyDto;
import com.java110.fee.dao.IFeeDiscountServiceDao;
import com.java110.fee.discount.IComputeDiscount;
import com.java110.intf.fee.*;
@@ -197,7 +198,7 @@
            //查询打折表
            List<FeeDiscountDto> feeDiscountInfo = BeanConvertUtil.covertBeanList(feeDiscountServiceDaoImpl.getFeeDiscountInfo(BeanConvertUtil.beanCovertMap(feeDiscountDto)), FeeDiscountDto.class);
            //Assert.listOnlyOne(feeDiscountInfo, "查询打折表错误!");
            if(!ListUtil.isNull(feeDiscountInfo)){
            if(ListUtil.isNull(feeDiscountInfo)){
                continue;
            }
            FeeDiscountRuleDto feeDiscountRuleDto = new FeeDiscountRuleDto();
@@ -205,7 +206,7 @@
            //查询打折规则表
            List<FeeDiscountRuleDto> feeDiscountRuleDtos = feeDiscountRuleInnerServiceSMOImpl.queryFeeDiscountRules(feeDiscountRuleDto);
            //Assert.listOnlyOne(feeDiscountRuleDtos, "查询打折规则表错误!");
            if(!ListUtil.isNull(feeDiscountRuleDtos)){
            if(ListUtil.isNull(feeDiscountRuleDtos)){
                continue;
            }
            if (!StringUtil.isEmpty(feeDiscountRuleDtos.get(0).getBeanImpl()) && feeDiscountRuleDtos.get(0).getBeanImpl().equals("reductionMonthFeeRule")) { //赠送规则
@@ -215,7 +216,7 @@
                //查询打折规格
                List<FeeDiscountSpecDto> feeDiscountSpecDtos = feeDiscountSpecInnerServiceSMOImpl.queryFeeDiscountSpecs(feeDiscountSpecDto);
                //Assert.listOnlyOne(feeDiscountSpecDtos, "查询打折规格表错误!");
                if(!ListUtil.isNull(feeDiscountSpecDtos)){
                if(ListUtil.isNull(feeDiscountSpecDtos)){
                    continue;
                }
                //获取赠送月份
@@ -255,6 +256,151 @@
        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);
                }
                if(computeDiscountDtos.size() > 0){
                    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();
            }
            double cycle = Double.parseDouble(feeDetailDto.getCycles());
            Date startTime = feeDetailDto.getStartTime();
            if(tmpPayFeeConfigDiscountDto.getPayMaxStarTime() == null || startTime.getTime() > tmpPayFeeConfigDiscountDto.getPayMaxStarTime().getTime()){
                tmpPayFeeConfigDiscountDto.setPayMaxStarTime(startTime);
            }
            if (tmpPayFeeConfigDiscountDto.getPayMaxEndTime() == null || finishTime.getTime() < tmpPayFeeConfigDiscountDto.getPayMaxEndTime().getTime()) {
                tmpPayFeeConfigDiscountDto.setPayMaxEndTime(DateUtil.getDateFromStringA(DateUtil.getAddHoursStringA(finishTime,12).split(" ")[0] + " 12:59:59"));
            }
            cycle =DateUtil.dayCompare(
                    tmpPayFeeConfigDiscountDto.getPayMaxStarTime(),
                    tmpPayFeeConfigDiscountDto.getPayMaxEndTime()
            );
            if (cycle > 0) {
                doCompute(tmpPayFeeConfigDiscountDto, cycle, computeDiscountDtos, feeDetailDto.getFeeId());
            } else {
                continue;
            }
            finishTime = c.getTime();
        }
        //取出开关映射的值
        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,去折扣申请表查询是否有折扣
@@ -268,19 +414,25 @@
            //房屋id
            applyRoomDiscountDto.setRoomId(feeDetailDto.getPayerObjId());
            //开始时间
            applyRoomDiscountDto.setStartTime(simpleDateFormat.format(feeDetailDto.getStartTime()));
//            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()));//重新设置开始时间
//            c.add(Calendar.DAY_OF_MONTH, 2);//开始时间,添加1,2天的冗余,只要比5小即可
//            applyRoomDiscountDto.setStartTime(simpleDateFormat.format(c.getTime()));//重新设置开始时间
            double month = Double.parseDouble(feeDetailDto.getCycles());
//            if(month == 105){
//                return;
//            }
            c.add(Calendar.MONTH, (int) month);
            c.add(Calendar.DAY_OF_MONTH, -5);//这里根据设置时间荣誉5天
//            c.add(Calendar.DAY_OF_MONTH, -5);//这里根据设置时间荣誉5天
            Date endTime = c.getTime();
            applyRoomDiscountDto.setEndTime(simpleDateFormat.format(endTime));
//            applyRoomDiscountDto.setEndTime(simpleDateFormat.format(endTime));
            applyRoomDiscountDto.setFeeId(feeDetailDto.getFeeId());
            //查询折扣申请表
            List<ApplyRoomDiscountDto> applyRoomDiscountDtos = applyRoomDiscountInnerServiceSMOImpl.queryApplyRoomDiscounts(applyRoomDiscountDto);
            //判断查询的折扣申请表是否有数据
            if (applyRoomDiscountDtos != null && applyRoomDiscountDtos.size() > 0) {
                //获取优惠id
@@ -290,11 +442,123 @@
                PayFeeConfigDiscountDto payFeeConfigDiscount = new PayFeeConfigDiscountDto();
                payFeeConfigDiscount.setCommunityId(applyRoomDiscountDtos.get(0).getCommunityId());
                payFeeConfigDiscount.setDiscountId(discountId);
                doCompute(payFeeConfigDiscount, Double.parseDouble(feeDetailDto.getCycles()), computeDiscountDtos, feeDetailDto.getFeeId());
                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()
                            );
                }
                doComputeB(payFeeConfigDiscount, month, computeDiscountDtos, feeDetailDto.getFeeId(),month);
            }
        }
    }
    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());
        List<FeeDiscountDto> feeDiscountDtos = queryFeeDiscounts(feeDiscountDto);
        if (feeDiscountDtos == null || feeDiscountDtos.size() < 1) {
            return;
        }
        for (FeeDiscountDto tmpFeeDiscountDto : feeDiscountDtos) {
            tmpFeeDiscountDto.setFeeId(feeId);
            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 || computeDiscountDto.getDiscountPrice() == 0) {
            return;
        }
        computeDiscountDtos.add(computeDiscountDto);
    }
    private void doCompute(PayFeeConfigDiscountDto tmpPayFeeConfigDiscountDto, double cycles, List<ComputeDiscountDto> computeDiscountDtos, String feeId) {
        FeeDiscountDto feeDiscountDto = new FeeDiscountDto();
        feeDiscountDto.setCommunityId(tmpPayFeeConfigDiscountDto.getCommunityId());