From f44187822ea6217070c0f6fc585c3feadea03cb1 Mon Sep 17 00:00:00 2001
From: chengf <2156125618@qq.com>
Date: 星期三, 13 八月 2025 09:30:18 +0800
Subject: [PATCH] 折扣逻辑修改2025/08/13

---
 service-fee/src/main/java/com/java110/fee/smo/impl/FeeDiscountInnerServiceSMOImpl.java |  242 ++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 222 insertions(+), 20 deletions(-)

diff --git a/service-fee/src/main/java/com/java110/fee/smo/impl/FeeDiscountInnerServiceSMOImpl.java b/service-fee/src/main/java/com/java110/fee/smo/impl/FeeDiscountInnerServiceSMOImpl.java
index 7a9e62d..469e383 100755
--- a/service-fee/src/main/java/com/java110/fee/smo/impl/FeeDiscountInnerServiceSMOImpl.java
+++ b/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,鍘绘姌鎵g敵璇疯〃鏌ヨ鏄惁鏈夋姌鎵�
+        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;
+        }
+        //鏍规嵁璐圭敤椤规煡璇㈡姌鎵o紙璇ヨ垂鐢ㄩ」涓嬬殑鎵�鏈夋姌鎵d俊鎭級
+        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,鍘绘姌鎵g敵璇疯〃鏌ヨ鏄惁鏈夋姌鎵�
@@ -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,鍘绘姌鎵g敵璇疯〃鏌ヨ鏄惁鏈夋姌鎵�
+            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);//杩欓噷鏍规嵁璁剧疆鏃堕棿鑽h獕5澶�
+            Date endTime = c.getTime();
+//            applyRoomDiscountDto.setEndTime(simpleDateFormat.format(endTime));
+            applyRoomDiscountDto.setFeeId(feeDetailDto.getFeeId());
+            //鏌ヨ鎶樻墸鐢宠琛�
+            List<ApplyRoomDiscountDto> applyRoomDiscountDtos = applyRoomDiscountInnerServiceSMOImpl.queryApplyRoomDiscounts(applyRoomDiscountDto);
+
+
+
+            //鍒ゆ柇鏌ヨ鐨勬姌鎵g敵璇疯〃鏄惁鏈夋暟鎹�
+            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;

--
Gitblit v1.8.0