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/DateUtil.java                          |    1 
 server/service/src/main/java/com/doumee/service/business/impl/ApplyChangeServiceImpl.java |   15 ++-
 server/service/src/main/java/com/doumee/core/utils/Constants.java                         |  149 ++++++++++++++++++++++++++++++++++++
 server/service/src/main/java/com/doumee/dao/business/vo/ChangeDealTypeVO.java             |   23 +++++
 server/service/src/main/java/com/doumee/dao/business/model/ApplyChagneDetail.java         |    2 
 server/service/src/main/java/com/doumee/dao/business/model/ApplyDetail.java               |    2 
 server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java      |   15 ++-
 7 files changed, 191 insertions(+), 16 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(),"鏂规閰嶇疆閿欒");
+            }
+        }
+    }
 
 }
diff --git a/server/service/src/main/java/com/doumee/core/utils/DateUtil.java b/server/service/src/main/java/com/doumee/core/utils/DateUtil.java
index 7262f22..57536d2 100644
--- a/server/service/src/main/java/com/doumee/core/utils/DateUtil.java
+++ b/server/service/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -3151,7 +3151,6 @@
 
 
     public static void main(String[] args) {
-
     }
 
     /**
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/ApplyChagneDetail.java b/server/service/src/main/java/com/doumee/dao/business/model/ApplyChagneDetail.java
index 6bf85d6..2e53e7f 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/ApplyChagneDetail.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/ApplyChagneDetail.java
@@ -103,6 +103,8 @@
     @ApiModelProperty(value = "鍗曚环(姣忔棩)", example = "1")
     private BigDecimal price;
 
+    @ApiModelProperty(value = "鏇挎崲涓氬姟锛氬噺淇濇暟鎹噺灏戠殑閲戦", example = "1")
+    private BigDecimal reduceMoney;
 
     @ApiModelProperty(value = "鍛樺伐鍚嶇О")
     @TableField(exist = false)
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/ApplyDetail.java b/server/service/src/main/java/com/doumee/dao/business/model/ApplyDetail.java
index 7c7f991..7694fc1 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/ApplyDetail.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/ApplyDetail.java
@@ -116,7 +116,7 @@
 //    @ExcelColumn(name="褰撳墠璐圭敤")
     private Integer reduceId;
 
-    @ApiModelProperty(value = "鍔犲噺淇濇暟鎹姸鎬侊細0=姝e父锛�1=涓嶅彲鍑忎繚")
+    @ApiModelProperty(value = "鍔犲噺淇濇暟鎹姸鎬侊細0=姝e父锛�1=涓嶅彲鍑忎繚锛�2=鍑忎繚宸插彇娑�")
 //    @ExcelColumn(name="褰撳墠璐圭敤")
     private Integer changeStatus;
 
diff --git a/server/service/src/main/java/com/doumee/dao/business/vo/ChangeDealTypeVO.java b/server/service/src/main/java/com/doumee/dao/business/vo/ChangeDealTypeVO.java
new file mode 100644
index 0000000..9670c24
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/business/vo/ChangeDealTypeVO.java
@@ -0,0 +1,23 @@
+package com.doumee.dao.business.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 鍔犲噺淇濅笟鍔� 澶勭悊鍑忎繚鏁版嵁浣跨敤
+ * @author RenKang
+ */
+@Data
+public class ChangeDealTypeVO {
+
+    @ApiModelProperty(value = "鍗曞懆鏈熻垂鐢�", example = "1")
+    private BigDecimal singlePrice;
+
+    @ApiModelProperty(value = "鍑忎繚鏁版嵁鐘舵�侊細0=姝e父锛�1=涓嶅彲鍑忎繚锛�2=鍑忎繚宸插彇娑�")
+    private Integer changeStatus;
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/ApplyChangeServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/ApplyChangeServiceImpl.java
index 4a5ac91..e3e32ca 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/ApplyChangeServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/ApplyChangeServiceImpl.java
@@ -17,6 +17,7 @@
 import com.doumee.dao.business.dto.*;
 import com.doumee.dao.business.join.*;
 import com.doumee.dao.business.model.*;
+import com.doumee.dao.business.vo.ChangeDealTypeVO;
 import com.doumee.dao.business.vo.CountCyclePriceVO;
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.service.business.ApplyChangeService;
@@ -685,6 +686,7 @@
                             .set(ApplyDetail::getEndTime, delValidTime)
                             .set(ApplyDetail::getEditor, update.getEditor())
                             .set(ApplyDetail::getEditDate, update.getEditDate())
+
                             .eq(ApplyDetail::getId, oldModel.getId())
                     );
                     totalFee = totalFee.add(updateFee).subtract(oldModel.getFee());
@@ -703,12 +705,6 @@
                             .set( ApplyChagneDetail::getEndTime, delValidTime)
                             .eq(ApplyChagneDetail::getId,detail.getId())
                     );
-
-//                if(1==1){
-//                    throw new BusinessException(ResponseStatus.SERVER_ERROR);
-//                }
-
-
             }
 
             member.setApplyId(update.getApplyId());
@@ -1219,6 +1215,7 @@
             applyChagneDetail.setApplyDetailId(applyDetail.getId());
             applyChagneDetail.setStartTime(applyDetail.getStartTime());
             applyChagneDetail.setEndTime(endTime);
+            applyChagneDetail.setReduceMoney(BigDecimal.ZERO);
 
             member.setApplyId(insuranceApply.getId());
             member.setDuId(applyChagneDetail.getDuId());
@@ -1229,6 +1226,7 @@
             //鏌ヨ鍑忎繚鏃ユ湡
 //            Integer delDays = DateUtil.daysBetweenDates(applyDetail.getEndTime(),endTime);
 //            ;
+
             //鏌ヨ鍛ㄦ湡鏁伴噺
             applyChagneDetail.setFee(
                     Constants.reduceFee(solutions,
@@ -1239,6 +1237,11 @@
                                     applyDetail.getStartTime(),endTime)
                             .subtract(applyDetail.getFee()
             ));
+            //濡傛灉鏄噺淇濅笟鍔′负浠呮浛鎹� 涓� 鏂规鐨勬墸璐瑰懆鏈熷拰鎬诲懆鏈熺浉绛� 鍒欏鐞嗗噺淇濊垂鐢�
+            if(Constants.equalsInteger(solutions.getDelOnlyReplace(),Constants.ONE)
+             && Constants.equalsInteger(solutions.getTimeUnit(),solutions.getInsureCycleUnit())){
+                applyChagneDetail.setReduceMoney(solutions.getPrice().multiply(new BigDecimal(-1)));
+            }
             applyChagneDetailJoinMapper.insert(applyChagneDetail);
         }
     }
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index fc48ad9..2e7eb25 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -385,11 +385,11 @@
         if(dataList == null || dataList.size() ==0){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝褰曞叆鏁版嵁涓虹┖锛�");
         }
-        List<String> idCardList = dataList.stream().map(m->m.getIdCard()).collect(Collectors.toList());
-        Set<String> set = new HashSet<>(idCardList);
-        if(idCardList.size() != set.size()){
-            throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"瀵逛笉璧凤紝褰曞叆鏁版嵁瀛樺湪韬唤璇佸彿鐩稿悓鏁版嵁锛�");
-        }
+//        List<String> idCardList = dataList.stream().map(m->m.getIdCard()).collect(Collectors.toList());
+//        Set<String> set = new HashSet<>(idCardList);
+//        if(idCardList.size() != set.size()){
+//            throw new BusinessException(ResponseStatus.DATA_ERRO.getCode(),"瀵逛笉璧凤紝褰曞叆鏁版嵁瀛樺湪韬唤璇佸彿鐩稿悓鏁版嵁锛�");
+//        }
         List<DispatchUnit> dispatchUnitList = new ArrayList<>();
         if(!Objects.isNull(solutionId)){
             dispatchUnitList  = dispatchUnitJoinMapper.selectJoinList(DispatchUnit.class,
@@ -416,6 +416,7 @@
             }
         }
         long index = Constants.TWO;
+        Map<String,String> idCardMap = new HashMap<>();
         for(MemberImport model : dataList){
             if(StringUtils.isBlank(model.getIdCard())||model.getIdCard().length()!=18){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹韩浠借瘉淇℃伅寮傚父锛�");
@@ -426,6 +427,10 @@
             if(StringUtils.isBlank(model.getName())){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹鍚嶄俊鎭紓甯革紒");
             }
+            if(Objects.nonNull(idCardMap.get(model.getIdCard()))){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹韩浠借瘉鍙枫��"+model.getIdCard()+"銆戝瓨鍦ㄧ浉鍚屾暟鎹紒");
+            }
+            idCardMap.put(model.getIdCard(), model.getIdCard());
             index = index + Constants.ONE;
             if(CollectionUtils.isNotEmpty(list)){
                 Optional<Member>  memberOptional= list.stream().filter(m->m.getIdcardNo().equals(model.getIdCard())).findFirst();

--
Gitblit v1.9.3