From af9932d1d6fe3bd56799dcd8b4d76dc993c5c1db Mon Sep 17 00:00:00 2001
From: jiangping <jp@doumee.com>
Date: 星期三, 19 六月 2024 09:42:36 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/1.0.1' into 1.0.1

---
 server/service/src/main/java/com/doumee/core/utils/Constants.java |  149 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 146 insertions(+), 3 deletions(-)

diff --git a/server/service/src/main/java/com/doumee/core/utils/Constants.java b/server/service/src/main/java/com/doumee/core/utils/Constants.java
index a254342..15a4398 100644
--- a/server/service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/service/src/main/java/com/doumee/core/utils/Constants.java
@@ -4,7 +4,9 @@
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.dao.business.dto.CountCyclePriceDTO;
+import com.doumee.dao.business.model.ApplyDetail;
 import com.doumee.dao.business.model.Solutions;
+import com.doumee.dao.business.vo.ChangeDealTypeVO;
 import com.doumee.dao.business.vo.CountCyclePriceVO;
 import io.swagger.models.auth.In;
 import org.apache.commons.collections4.CollectionUtils;
@@ -229,12 +231,124 @@
         return countCyclePriceVO;
     }
 
+    //鏌ヨ姣忎釜鎵规敼鍛ㄦ湡璐圭敤
+    public static BigDecimal calculateSingleCycleFee(Solutions solutions,Date startTime){
+        if(Constants.equalsInteger(solutions.getTimeUnit(),solutions.getInsureCycleUnit())){
+            return solutions.getPrice();
+        }
+        CountCyclePriceVO countCyclePriceVO = Constants.countPriceVO(startTime,solutions);
+        //鍗曡璐瑰懆鏈熺殑璐圭敤
+        BigDecimal singleFee = Constants.singleCycleFee(solutions,startTime,countCyclePriceVO.getEndDate());
+        return singleFee;
+    }
+
 
     /**
      * 鍔犲噺淇濅笟鍔′娇鐢�
-     * 鏍规嵁鏂规銆佸紑濮�/缁撴潫鏃ユ湡
+     * 鍒ゆ柇鏄惁澶勪簬 鍛ㄦ湡鑺傜偣
+     * 缁撴潫鏃ユ湡 鍏ョ殑鏃ユ湡涓烘壒鍗曟棩鏈� 鍓嶄竴澶� 23:59:59
+     * @param solutions
+     * @param startTime
+     * @param endTime
+     * @return 0=鏃犲懆鏈熻垂鐢紱1=鏈夊懆鏈熻垂鐢紱2鏃犲懆鏈熻垂鐢� 涓� 鏁版嵁鏍囪鏃犳晥
      */
-    public void calculateRetreatCost(){
+    public static ChangeDealTypeVO calculateRetreatCost(Solutions solutions , Date startTime , Date endTime){
+        ChangeDealTypeVO changeDealTypeVO = new ChangeDealTypeVO();
+        //鏌ヨ姣忎釜鍛ㄦ湡鐨勮垂鐢�
+        changeDealTypeVO.setSinglePrice(Constants.calculateSingleCycleFee(solutions,startTime));
+
+        //鎵瑰崟鏃ユ湡涓哄紑濮嬫棩鏈熺殑绗竴澶� 鍒欐爣璁版槑缁嗚褰曚负 鏃犳晥鏁版嵁 鎴栬�� 寮�濮嬫椂闂村ぇ浜庡綋鍓嶆椂闂� 鐩存帴杩斿洖 鏁版嵁鏍囪鏃犳晥
+        if(startTime.getTime()>endTime.getTime()
+        || startTime.getTime() > System.currentTimeMillis()){
+            changeDealTypeVO.setChangeStatus(Constants.TWO);
+            return changeDealTypeVO;
+        }
+        //鑾峰彇鏄ㄦ棩鏃ユ湡缁撴潫  涓哄疄闄呭噺淇濈粨鏉熸棩鏈熉�
+        Boolean isOver = true;
+        if(solutions.getInsureCycleUnit().equals(InsureCycleUnit.DAY.getValue())){
+            //鏂规 璁¤垂鍛ㄦ湡鍜屾壒鏀瑰懆鏈� 鐩稿悓 鐩存帴杩斿洖 鏈夊懆鏈熻垂鐢�
+            changeDealTypeVO.setChangeStatus(Constants.ONE);
+            return changeDealTypeVO;
+        }else if(solutions.getInsureCycleUnit().equals(InsureCycleUnit.HALF_MONTH.getValue())){
+            //鍗婃湀鍛ㄦ湡 浠�15.5璁$畻 鐢变簬15.5 鏃犳硶鏁撮櫎 鎵�浠ラ渶瑕佺壒娈婂鐞�
+            //濂囨暟/鍋舵暟 鐢ㄤ簬娣诲姞澶╂暟 濡傛灉鏄鏁�
+            BigDecimal cycleHalfMonth = new BigDecimal(15.5);
+            Integer cycle = 1;
+            while(isOver){
+                //鑾峰彇鍛ㄦ湡鍚庣殑缁撴潫鏃堕棿 甯︽椂鍒嗙 23:59:59
+                Date cycleEndTime =   DateUtil.getMontageDate(DateUtil.afterDateByType(startTime,0,  cycleHalfMonth.multiply(new BigDecimal(cycle)).setScale(2,RoundingMode.HALF_UP).intValue()
+                ),2);
+                if(cycleEndTime.getTime()>=endTime.getTime()){
+                    isOver = false;
+                    //褰撹璐瑰懆鏈熺殑缁撴潫鏃ユ湡 鍒氬ソ 涓庢壒鍗曟棩鏈熺殑缁撴潫鏃ユ湡鐩哥瓑 鍒� 涓嶉渶瑕佹墸闄ゆ壒鍗曞懆鏈熻垂鐢�
+                    if(cycleEndTime.getTime()==endTime.getTime()){
+                        changeDealTypeVO.setChangeStatus(Constants.ZERO);
+                    }else{
+                        changeDealTypeVO.setChangeStatus(Constants.ONE);
+                    }
+                    return changeDealTypeVO;
+                }
+                cycle = cycle + 1;
+            }
+        }else if(solutions.getInsureCycleUnit().equals(InsureCycleUnit.MONTH.getValue())){
+            //鎵h垂鍛ㄦ湡涓烘湀
+            Integer cycle = 1;
+            while(isOver){
+                //鑾峰彇鍛ㄦ湡鍚庣殑缁撴潫鏃堕棿 甯︽椂鍒嗙 23:59:59
+                Date cycleEndTime =  DateUtil.getMontageDate(DateUtil.afterDateByType(startTime,1,cycle),2);
+                //褰撳墠鍛ㄦ湡 澶т簬绛変簬 鎵瑰崟缁撴潫鏃ユ湡鏃� 锛� 鍒欑粨鏉熸祦绋�
+                if(cycleEndTime.getTime()>=endTime.getTime()){
+                    isOver = false;
+                    //褰撹璐瑰懆鏈熺殑缁撴潫鏃ユ湡 鍒氬ソ 涓庢壒鍗曟棩鏈熺殑缁撴潫鏃ユ湡鐩哥瓑 鍒� 涓嶉渶瑕佹墸闄ゆ壒鍗曞懆鏈熻垂鐢�
+                    if(cycleEndTime.getTime()==endTime.getTime()){
+                        changeDealTypeVO.setChangeStatus(Constants.ZERO);
+                    }else{
+                        changeDealTypeVO.setChangeStatus(Constants.ONE);
+                    }
+                    return changeDealTypeVO;
+                }
+                cycle = cycle + 1;
+            }
+        }else if(solutions.getTimeUnit().equals(TimeUnit.QUARTER.getValue())){
+            //鎵h垂鍛ㄦ湡涓哄搴�
+            Integer cycle = 3;
+            while(isOver){
+                //鑾峰彇鍛ㄦ湡鍚庣殑缁撴潫鏃堕棿 甯︽椂鍒嗙 23:59:59
+                Date cycleEndTime =  DateUtil.getMontageDate(DateUtil.afterDateByType(startTime,1,cycle),2);
+                //褰撳墠鍛ㄦ湡 澶т簬绛変簬 鎵瑰崟缁撴潫鏃ユ湡鏃� 锛� 鍒欑粨鏉熸祦绋�
+                if(cycleEndTime.getTime()>=endTime.getTime()){
+                    isOver = false;
+                    //褰撹璐瑰懆鏈熺殑缁撴潫鏃ユ湡 鍒氬ソ 涓庢壒鍗曟棩鏈熺殑缁撴潫鏃ユ湡鐩哥瓑 鍒� 涓嶉渶瑕佹墸闄ゆ壒鍗曞懆鏈熻垂鐢�
+                    if(cycleEndTime.getTime()==endTime.getTime()){
+                        changeDealTypeVO.setChangeStatus(Constants.ZERO);
+                    }else{
+                        changeDealTypeVO.setChangeStatus(Constants.ONE);
+                    }
+                    return changeDealTypeVO;
+                }
+                cycle = cycle + 3;
+            }
+        }else if(solutions.getTimeUnit().equals(TimeUnit.HALF_YEAR.getValue())){
+            //鎵h垂鍛ㄦ湡涓哄崐骞�
+            Integer cycle = 3;
+            while(isOver){
+                //鑾峰彇鍛ㄦ湡鍚庣殑缁撴潫鏃堕棿 甯︽椂鍒嗙 23:59:59
+                Date cycleEndTime =  DateUtil.getMontageDate(DateUtil.afterDateByType(startTime,1,cycle),2);
+                //褰撳墠鍛ㄦ湡 澶т簬绛変簬 鎵瑰崟缁撴潫鏃ユ湡鏃� 锛� 鍒欑粨鏉熸祦绋�
+                if(cycleEndTime.getTime()>=endTime.getTime()){
+                    isOver = false;
+                    //褰撹璐瑰懆鏈熺殑缁撴潫鏃ユ湡 鍒氬ソ 涓庢壒鍗曟棩鏈熺殑缁撴潫鏃ユ湡鐩哥瓑 鍒� 涓嶉渶瑕佹墸闄ゆ壒鍗曞懆鏈熻垂鐢�
+                    if(cycleEndTime.getTime()==endTime.getTime()){
+                        changeDealTypeVO.setChangeStatus(Constants.ZERO);
+                    }else{
+                        changeDealTypeVO.setChangeStatus(Constants.ONE);
+                    }
+                    return changeDealTypeVO;
+                }
+                cycle = cycle + 3;
+            }
+        }
+        throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"璁$畻鎵瑰崟鍛ㄦ湡淇℃伅寮傚父");
 
     }
 
@@ -2234,6 +2348,35 @@
         }
     }
 
-
+    public static BigDecimal singleCycleFee(Solutions solutions,Date startTime ,Date endTime){
+        Integer countDays = DateUtil.daysBetweenDates(endTime, startTime) + 1;
+        Constants.TimeUnit timeUnit = Constants.TimeUnit.getTimeUnit(solutions.getTimeUnit());
+        BigDecimal fee = solutions.getPrice();
+        if(solutions.getTimeUnit().equals(solutions.getInsureCycleUnit())){
+            return fee;
+        }else{
+            if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.DAY.getValue())){
+                //澶╀负鎵规敼鍗曚綅
+                return fee.divide(new BigDecimal(countDays),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())) {
+                //鏍规嵁鎶曚繚鍛ㄦ湡 瀹氫箟鐨� 姣忎釜鍛ㄦ湡 = X涓� 鍗婃湀鍛ㄦ湡 杩涜璁$畻
+                // 鎬婚噾棰� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁�
+                return fee.divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())) {
+                // 鎬婚噾棰� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 2
+                return fee.multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())) {
+                //瀛e害涓烘壒鏀瑰崟浣�
+                // 鎬婚噾棰�  / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 6
+                return fee.multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_YEAR.getValue())) {
+                //鍗婂勾涓烘壒鏀瑰崟浣�
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 6
+                return fee.multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else {
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏂规閰嶇疆閿欒");
+            }
+        }
+    }
 
 }

--
Gitblit v1.9.3