From 356a40aadb35fa3cf61bc0214e1d803956d98114 Mon Sep 17 00:00:00 2001
From: k94314517 <8417338+k94314517@user.noreply.gitee.com>
Date: 星期五, 17 五月 2024 16:45:32 +0800
Subject: [PATCH] git ch

---
 server/service/src/main/java/com/doumee/dao/business/model/Solutions.java                    |    6 
 server/service/pom.xml                                                                       |    1 
 server/service/src/main/java/com/doumee/core/annotation/excel/ExcelToPdfToolNew.java         |    4 
 server/service/src/main/java/com/doumee/dao/business/model/Member.java                       |   23 
 server/company/src/main/java/com/doumee/api/system/SystemDictController.java                 |   29 
 server/platform/src/main/java/com/doumee/api/business/UnionChangeController.java             |    4 
 server/service/src/main/java/com/doumee/service/business/impl/SolutionsServiceImpl.java      |   30 
 server/service/src/main/java/com/doumee/dao/business/dto/UnionChangeBXDDTO.java              |    6 
 server/service/src/main/java/com/doumee/dao/business/model/ApplyChagneDetail.java            |    5 
 server/shop/src/main/java/com/doumee/api/system/SystemDictController.java                    |   30 
 server/service/src/main/java/com/doumee/dao/business/vo/CountCyclePriceVO.java               |    6 
 server/company/src/main/java/com/doumee/api/business/SolutionsController.java                |   25 
 server/service/src/main/java/com/doumee/service/business/SolutionsService.java               |   11 
 server/service/src/main/java/com/doumee/dao/business/dto/SaveUnionChangeDTO.java             |    6 
 server/service/src/main/java/com/doumee/core/utils/Constants.java                            |  364 +++++++++++
 server/service/src/main/java/com/doumee/service/business/impl/InsuranceApplyServiceImpl.java |   69 +
 server/service/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java             |    2 
 server/shop/src/main/java/com/doumee/api/business/ApplyChangeController.java                 |    7 
 server/platform/src/main/java/com/doumee/api/business/ApplyChangeController.java             |    8 
 server/service/src/main/java/com/doumee/service/business/impl/ApplyChangeServiceImpl.java    |  517 ++++++++++------
 server/platform/src/main/java/com/doumee/api/system/SystemDictController.java                |   32 +
 server/company/src/main/java/com/doumee/api/business/InsuranceApplyController.java           |    4 
 server/service/src/main/java/com/doumee/config/shiro/ShiroConfig.java                        |    1 
 server/company/src/main/java/com/doumee/api/business/ApplyChangeController.java              |    3 
 server/company/src/main/resources/application.yml                                            |    2 
 server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java         |   42 +
 server/service/src/main/java/com/doumee/service/business/impl/UnionApplyServiceImpl.java     |   58 +
 server/service/src/main/java/com/doumee/core/utils/DateUtil.java                             |   39 +
 server/shop/src/main/java/com/doumee/api/business/UnionApplyController.java                  |   12 
 server/platform/src/main/java/com/doumee/task/ScheduleTool.java                              |    2 
 server/pom.xml                                                                               |   10 
 server/service/src/main/java/com/doumee/service/business/impl/UnionChangeServiceImpl.java    |  438 ++++++++-----
 server/shop/src/main/resources/application.yml                                               |    2 
 server/service/src/main/java/com/doumee/service/business/impl/DispatchUnitServiceImpl.java   |    6 
 server/service/src/main/java/com/doumee/dao/business/dto/CountCyclePriceDTO.java             |    4 
 server/service/src/main/java/com/doumee/dao/business/model/InsuranceApply.java               |    8 
 server/shop/src/main/java/com/doumee/api/business/UnionChangeController.java                 |    4 
 server/platform/src/main/resources/application.yml                                           |    2 
 server/service/src/main/java/com/doumee/service/business/InsuranceApplyService.java          |    4 
 server/service/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java             |   11 
 40 files changed, 1,380 insertions(+), 457 deletions(-)

diff --git a/server/company/src/main/java/com/doumee/api/business/ApplyChangeController.java b/server/company/src/main/java/com/doumee/api/business/ApplyChangeController.java
index b879fd3..5b31c4e 100644
--- a/server/company/src/main/java/com/doumee/api/business/ApplyChangeController.java
+++ b/server/company/src/main/java/com/doumee/api/business/ApplyChangeController.java
@@ -8,6 +8,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.model.PageData;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.dao.business.dto.*;
 import com.doumee.dao.business.model.ApplyChange;
 import com.doumee.dao.business.vo.CountCyclePriceVO;
@@ -21,6 +22,7 @@
 import javax.servlet.http.HttpServletResponse;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -129,6 +131,7 @@
     @ApiOperation("鍔犲噺淇濅笟鍔¤ˉ鍏呴噾棰�")
     @PostMapping("/getChangeCountCyclePriceVO")
     public ApiResponse<CountCyclePriceVO> getChangeCountCyclePriceVO (@RequestBody ApplyChangeCyclePriceDTO applyChangeCyclePriceDTO) {
+        applyChangeCyclePriceDTO.setValidTime(DateUtil.getMontageDate(new Date(),1));
         return ApiResponse.success("鎿嶄綔鎴愬姛",applyChangeService.getChangeCountCyclePriceVO(applyChangeCyclePriceDTO));
     }
 
diff --git a/server/company/src/main/java/com/doumee/api/business/InsuranceApplyController.java b/server/company/src/main/java/com/doumee/api/business/InsuranceApplyController.java
index d349490..b0d569d 100644
--- a/server/company/src/main/java/com/doumee/api/business/InsuranceApplyController.java
+++ b/server/company/src/main/java/com/doumee/api/business/InsuranceApplyController.java
@@ -162,8 +162,8 @@
 
     @ApiOperation("娴嬭瘯瀹為檯閲戦")
     @GetMapping("/testFee")
-    public ApiResponse testFee(Integer id) {
-        insuranceApplyService.updateApplyCurrentFee(id);
+    public ApiResponse testFee(Integer id,Integer unionId) {
+        insuranceApplyService.updateApplyCurrentFee(id, unionId);
         return ApiResponse.success(null);
     }
 
diff --git a/server/company/src/main/java/com/doumee/api/business/SolutionsController.java b/server/company/src/main/java/com/doumee/api/business/SolutionsController.java
index cccad8d..56f85a2 100644
--- a/server/company/src/main/java/com/doumee/api/business/SolutionsController.java
+++ b/server/company/src/main/java/com/doumee/api/business/SolutionsController.java
@@ -7,7 +7,9 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.model.PageData;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.dao.business.model.Solutions;
+import com.doumee.dao.system.vo.BigDecimalVO;
 import com.doumee.service.business.SolutionsService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -16,7 +18,9 @@
 import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Objects;
 
@@ -122,4 +126,25 @@
         return ApiResponse.success(solutionsService.findById(id));
     }
 
+
+
+    @ApiOperation("testSolutionAddMoney")
+    @GetMapping("/testSolutionAddMoney")
+    public ApiResponse<BigDecimal> testSolutionAddMoney (Integer id, BigDecimal fee, String start, String end, String newDate, String newEndDate) {
+        return ApiResponse.success(solutionsService.testSolutionAddMoney(id,fee, DateUtil.StringToDate(start),DateUtil.StringToDate(end)
+                ,DateUtil.StringToDate(newDate),DateUtil.StringToDate(newEndDate)));
+    }
+
+    @ApiOperation("testSolutionReduceMoney")
+    @GetMapping("/testSolutionReduceMoney")
+    public ApiResponse<BigDecimal> testSolutionReduceMoney (Integer id, BigDecimal fee, String start, String end, String reduceStartTime,String reduceEndTime) {
+        return ApiResponse.success(solutionsService.testSolutionReduceMoney(id,fee, DateUtil.StringToDate(start),DateUtil.StringToDate(end) ,DateUtil.StringToDate(reduceStartTime),DateUtil.StringToDate(reduceEndTime)));
+    }
+
+    @ApiOperation("testSolutionProduceMoney")
+    @GetMapping("/testSolutionProduceMoney")
+    public ApiResponse<BigDecimal> testSolutionProduceMoney (Integer id, BigDecimal fee, String start, String end,String produceStart) {
+        return ApiResponse.success(solutionsService.testSolutionProduceMoney(id,fee, DateUtil.StringToDate(start),DateUtil.StringToDate(end),DateUtil.StringToDate(produceStart)));
+    }
+
 }
diff --git a/server/company/src/main/java/com/doumee/api/system/SystemDictController.java b/server/company/src/main/java/com/doumee/api/system/SystemDictController.java
index 71a297a..1c12638 100644
--- a/server/company/src/main/java/com/doumee/api/system/SystemDictController.java
+++ b/server/company/src/main/java/com/doumee/api/system/SystemDictController.java
@@ -2,13 +2,16 @@
 
 import com.doumee.api.BaseController;
 import com.doumee.biz.system.SystemDictBiz;
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.constants.OperaType;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
 import com.doumee.dao.system.dto.QuerySystemDictDTO;
 import com.doumee.dao.system.model.SystemDict;
+import com.doumee.dao.system.model.SystemDictData;
 import com.doumee.dao.system.vo.SystemDictListVO;
 import com.doumee.service.system.SystemDictService;
 import io.swagger.annotations.Api;
@@ -20,6 +23,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * @author Eva.Caesar Liu
@@ -79,4 +83,29 @@
     public ApiResponse<PageData<SystemDictListVO>> findPage (@RequestBody PageWrap<QuerySystemDictDTO> pageWrap) {
         return ApiResponse.success(systemDictService.findPage(pageWrap));
     }
+
+
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @ApiOperation("鏌ヨ瀛楀吀鍊�")
+    @PostMapping("/getAgreement")
+    public ApiResponse<List<String>> getAgreement() {
+        List<String> list = new ArrayList<>();
+        SystemDictData use = systemDictDataBiz.queryByCode(Constants.PROTOCOL,Constants.USE);
+        if(Objects.nonNull(use)){
+            list.add(use.getCode());
+        }else{
+            list.add("");
+        }
+        SystemDictData privacy = systemDictDataBiz.queryByCode(Constants.PROTOCOL,Constants.PRIVACY);
+        if(Objects.nonNull(privacy)){
+            list.add(privacy.getCode());
+        }else{
+            list.add("");
+        }
+        return ApiResponse.success(list);
+    }
+
 }
diff --git a/server/company/src/main/resources/application.yml b/server/company/src/main/resources/application.yml
index dba634a..2107f6a 100644
--- a/server/company/src/main/resources/application.yml
+++ b/server/company/src/main/resources/application.yml
@@ -12,7 +12,7 @@
 #  application:git
 #    name: doumeemes
   profiles:
-    active: dev
+    active: pro
 
   # JSON杩斿洖閰嶇疆
   jackson:
diff --git a/server/platform/src/main/java/com/doumee/api/business/ApplyChangeController.java b/server/platform/src/main/java/com/doumee/api/business/ApplyChangeController.java
index 237d7d8..b7724da 100644
--- a/server/platform/src/main/java/com/doumee/api/business/ApplyChangeController.java
+++ b/server/platform/src/main/java/com/doumee/api/business/ApplyChangeController.java
@@ -9,6 +9,7 @@
 import com.doumee.dao.business.model.ApplyChange;
 import com.doumee.dao.business.model.InsuranceApply;
 import com.doumee.service.business.ApplyChangeService;
+import com.doumee.service.business.InsuranceApplyService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.shiro.authz.annotation.RequiresPermissions;    
@@ -30,6 +31,9 @@
 
     @Autowired
     private ApplyChangeService applyChangeService;
+
+    @Autowired
+    private InsuranceApplyService insuranceApplyService;
 
     @PreventRepeat
     @ApiOperation("鏂板缓")
@@ -57,7 +61,9 @@
     @PostMapping("/uploadPidan")
     @RequiresPermissions("business:applychange:uploadPidan")
     public ApiResponse uploadPidan(@RequestBody ApplyChange applyChange) {
-        return ApiResponse.success(applyChangeService.uploadPidan(applyChange));
+        Integer applyId = applyChangeService.uploadPidan(applyChange);
+        insuranceApplyService.updateApplyCurrentFee(applyId,null);
+        return ApiResponse.success(null);
     }
     @PreventRepeat
     @ApiOperation("骞冲彴淇敼鎵瑰崟")
diff --git a/server/platform/src/main/java/com/doumee/api/business/UnionChangeController.java b/server/platform/src/main/java/com/doumee/api/business/UnionChangeController.java
index a473c24..73317e5 100644
--- a/server/platform/src/main/java/com/doumee/api/business/UnionChangeController.java
+++ b/server/platform/src/main/java/com/doumee/api/business/UnionChangeController.java
@@ -11,6 +11,7 @@
 import com.doumee.dao.business.dto.SmsCheckDTO;
 import com.doumee.dao.business.dto.UnionChangeBXDDTO;
 import com.doumee.dao.business.model.UnionChange;
+import com.doumee.service.business.InsuranceApplyService;
 import com.doumee.service.business.UnionChangeService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -33,6 +34,8 @@
 
     @Autowired
     private UnionChangeService unionChangeService;
+    @Autowired
+    private InsuranceApplyService insuranceApplyService;
 
     @PreventRepeat
     @ApiOperation("鏂板缓")
@@ -122,6 +125,7 @@
     @RequiresPermissions("business:unionchange:uploadBXD")
     public ApiResponse uploadBXD(@RequestBody UnionChangeBXDDTO unionChangeBXDDTO) {
         unionChangeService.uploadBXD(unionChangeBXDDTO);
+        insuranceApplyService.updateApplyCurrentFee(null,unionChangeBXDDTO.getApplyId());
         return ApiResponse.success(null);
     }
 
diff --git a/server/platform/src/main/java/com/doumee/api/system/SystemDictController.java b/server/platform/src/main/java/com/doumee/api/system/SystemDictController.java
index 71a297a..169f85c 100644
--- a/server/platform/src/main/java/com/doumee/api/system/SystemDictController.java
+++ b/server/platform/src/main/java/com/doumee/api/system/SystemDictController.java
@@ -2,13 +2,16 @@
 
 import com.doumee.api.BaseController;
 import com.doumee.biz.system.SystemDictBiz;
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.constants.OperaType;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
 import com.doumee.dao.system.dto.QuerySystemDictDTO;
 import com.doumee.dao.system.model.SystemDict;
+import com.doumee.dao.system.model.SystemDictData;
 import com.doumee.dao.system.vo.SystemDictListVO;
 import com.doumee.service.system.SystemDictService;
 import io.swagger.annotations.Api;
@@ -20,6 +23,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * @author Eva.Caesar Liu
@@ -35,6 +39,9 @@
 
     @Autowired
     private SystemDictBiz systemDictBiz;
+
+
+
 
     @PreventRepeat
     @ApiOperation("鏂板缓")
@@ -79,4 +86,29 @@
     public ApiResponse<PageData<SystemDictListVO>> findPage (@RequestBody PageWrap<QuerySystemDictDTO> pageWrap) {
         return ApiResponse.success(systemDictService.findPage(pageWrap));
     }
+
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @ApiOperation("鏌ヨ瀛楀吀鍊�")
+    @PostMapping("/getAgreement")
+    public ApiResponse<List<String>> getAgreement() {
+        List<String> list = new ArrayList<>();
+        SystemDictData use = systemDictDataBiz.queryByCode(Constants.PROTOCOL,Constants.USE);
+        if(Objects.nonNull(use)){
+            list.add(use.getCode());
+        }else{
+            list.add("");
+        }
+        SystemDictData privacy = systemDictDataBiz.queryByCode(Constants.PROTOCOL,Constants.PRIVACY);
+        if(Objects.nonNull(privacy)){
+            list.add(privacy.getCode());
+        }else{
+            list.add("");
+        }
+        return ApiResponse.success(list);
+    }
+
+
 }
diff --git a/server/platform/src/main/java/com/doumee/task/ScheduleTool.java b/server/platform/src/main/java/com/doumee/task/ScheduleTool.java
index 694ce40..081395c 100644
--- a/server/platform/src/main/java/com/doumee/task/ScheduleTool.java
+++ b/server/platform/src/main/java/com/doumee/task/ScheduleTool.java
@@ -76,7 +76,7 @@
     @Scheduled(cron = "0 5 00 * * ?")
     public void updateApplyCurrentFee(){
         log.info("==============瀹氭椂鏇存柊淇濆崟瀹為檯閲戦=======start======");
-        insuranceApplyService.updateApplyCurrentFee(null);
+        insuranceApplyService.updateApplyCurrentFee(null,null);
         log.info("==============瀹氭椂鏇存柊淇濆崟瀹為檯閲戦======end=======");
 
         log.info("==============瀹氭椂鏇存柊鍚堝苟鍗曞疄闄呴噾棰�=======start======");
diff --git a/server/platform/src/main/resources/application.yml b/server/platform/src/main/resources/application.yml
index 368c575..781f762 100644
--- a/server/platform/src/main/resources/application.yml
+++ b/server/platform/src/main/resources/application.yml
@@ -11,7 +11,7 @@
 #  application:
 #  name: doumeemes
   profiles:
-    active: dev
+    active: pro
 
   # JSON杩斿洖閰嶇疆
   jackson:
diff --git a/server/pom.xml b/server/pom.xml
index 96b6768..258166e 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -37,6 +37,8 @@
     <oshi.version>5.7.0</oshi.version>
     <jna.version>5.7.0</jna.version>
     <poi.version>5.0.0</poi.version>
+    <!-- hutool 宸ュ叿鐩稿叧-->
+    <hutool.version>5.5.8</hutool.version>
     <!-- 寰俊灏忕▼搴� -->
     <weixin-java-miniapp.version>4.1.0</weixin-java-miniapp.version>
   </properties>
@@ -80,7 +82,12 @@
       <artifactId>mysql-connector-java</artifactId>
       <scope>runtime</scope>
     </dependency>
-
+    <!--hutool宸ュ叿-->
+    <dependency>
+      <groupId>cn.hutool</groupId>
+      <artifactId>hutool-all</artifactId>
+      <version>${hutool.version}</version>
+    </dependency>
     <!-- swagger -->
     <dependency>
       <groupId>com.github.xiaoymin</groupId>
@@ -227,6 +234,7 @@
       <artifactId>jxl</artifactId>
       <version>2.6.12</version>
     </dependency>
+
   </dependencies>
   <repositories>
     <repository>
diff --git a/server/service/pom.xml b/server/service/pom.xml
index 73e5822..56610c5 100644
--- a/server/service/pom.xml
+++ b/server/service/pom.xml
@@ -21,6 +21,7 @@
             <artifactId>dianziqian</artifactId>
             <version>1.0.0-SNAPSHOT</version>
         </dependency>
+
         <!--jacob渚濊禆-->
         <dependency>
             <groupId>com.jacob</groupId>
diff --git a/server/service/src/main/java/com/doumee/config/shiro/ShiroConfig.java b/server/service/src/main/java/com/doumee/config/shiro/ShiroConfig.java
index 7078689..5a10b6a 100644
--- a/server/service/src/main/java/com/doumee/config/shiro/ShiroConfig.java
+++ b/server/service/src/main/java/com/doumee/config/shiro/ShiroConfig.java
@@ -97,6 +97,7 @@
         map.put("/public/signNotify", "anon");
         map.put("/public/testPdf", "anon");
         map.put("/business/areas/*", "anon");
+        map.put("/system/dict/getAgreement", "anon");
         // - 鏀捐swagger
         map.put("/doc.html", "anon");
         map.put("/webjars/**", "anon");
diff --git a/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java b/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
index a78ff84..5d1254d 100644
--- a/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
+++ b/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelExporter.java
@@ -811,7 +811,7 @@
             header2.createCell(5).setCellValue("");
             header2.createCell(6).setCellValue(com.doumee.core.utils.DateUtil.getPlusTime2(data.getEndTime()));
             header2.createCell(7).setCellValue("");
-            header2.createCell(8).setCellValue(com.doumee.core.utils.DateUtil.getPlusTime2(data.getValidTime()));
+            header2.createCell(8).setCellValue(com.doumee.core.utils.DateUtil.getPlusTime2(data.getApplyStartTime()));
             header2.createCell(9).setCellValue(com.doumee.core.utils.DateUtil.getPlusTime2(data.getDelValidTime()));
             header2.createCell(10).setCellValue(data.getAddNum());
             header2.createCell(11).setCellValue(data.getDelNum());
@@ -1255,7 +1255,7 @@
             sheet.addMergedRegion(new CellRangeAddress(rowIndex ,rowIndex,0,5));
             Row header7= sheet.createRow(rowIndex+1);
             header7.setHeight((short) 3000);
-            header7.createCell(0).setCellValue("鎶曚繚浼佷笟绛剧珷 锛�                            \n \n \n" +"鏃ユ湡锛�     骞�     鏈�     鏃�    ");
+            header7.createCell(0).setCellValue("琚繚闄╀汉绛剧珷 锛�                            \n \n \n" +"鏃ユ湡锛�     骞�     鏈�     鏃�    ");
             for (int i =0; i < 6; i++) {
                 if(i>0){
                     header7.createCell(i).setCellValue("");
@@ -1650,9 +1650,10 @@
                 configFirstCell(sxssfWorkbook,header3.getCell(i));
             }
             sheet.addMergedRegion(new CellRangeAddress(3  ,3,1,8));
-            Integer row = 4;
+            Integer row = 3;
             List<ApplyChagneDetail> addChangeDetailList = data.getApplyChagneDetailList().stream().filter(i->i.getType().equals(Constants.ZERO)).collect(Collectors.toList());
             if(CollectionUtils.isNotEmpty(addChangeDetailList)){
+                row = row + 1;
                 Row header4 = sheet.createRow(row);
                 header4.createCell(0).setCellValue("鍔犱繚浜哄憳");
                 for (int i = 0; i < 8; i++) {
@@ -1722,7 +1723,6 @@
 
                 row = row + 1 ;
                 for (int rowIndex = 0; rowIndex < reduceChangeDetailList.size(); rowIndex++) {
-                    row = row + rowIndex;
                     Row header6 = sheet.createRow(row);
                     ApplyChagneDetail applyChagneDetail = reduceChangeDetailList.get(rowIndex);
                     header6.createCell(0).setCellValue(rowIndex + 1);
@@ -1738,6 +1738,7 @@
                         configDataCell(sxssfWorkbook,header6.getCell(i));
                     }
                     sheet.addMergedRegion(new CellRangeAddress(row  ,row,5,6));
+                    row = row +  1;
                 }
             }
 
@@ -1776,7 +1777,7 @@
             byte [] bookByteAry = out.toByteArray();
             InputStream     in = new ByteArrayInputStream(bookByteAry);
             String tempExcel = saveIsToFile(in);
-            String tempPdf =System.getProperty("java.io.tmpdir")+File.separator+UUID.randomUUID().toString()+".pdf";
+            String tempPdf =   System.getProperty("java.io.tmpdir")+File.separator+UUID.randomUUID().toString()+".pdf"; //"d:/1.docx";
 //            ExcelToPdfToolNew.excelToPdf(in,tempPdf);//杞琍DF
             ExcelToPdfToolNew.excelToPdf(tempExcel,tempPdf);//杞琍DF
             File f = new File(tempPdf);
diff --git a/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java b/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
index b7e0631..71dddc0 100644
--- a/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
+++ b/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
@@ -143,7 +143,7 @@
      * @return
      */
     public int getDataRowNum(){
-        return headerNum+1;
+        return headerNum;
     }
 
     /**
diff --git a/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelToPdfToolNew.java b/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelToPdfToolNew.java
index e658569..b1d574c 100644
--- a/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelToPdfToolNew.java
+++ b/server/service/src/main/java/com/doumee/core/annotation/excel/ExcelToPdfToolNew.java
@@ -34,8 +34,8 @@
                 // 鑾峰彇椤甸潰璁剧疆
                 Dispatch pageSetup = Dispatch.get(currentSheet, "PageSetup") .toDispatch();
                 Dispatch.put(pageSetup, "Orientation", new Variant(2));
-                Dispatch.put(pageSetup, "FitToPagesTall", new Variant(0));
-                Dispatch.put(pageSetup, "FitToPagesWide", new Variant(1));
+                Dispatch.put(pageSetup, "FitToPagesTall", new Variant(false));
+                Dispatch.put(pageSetup, "FitToPagesWide", new Variant(false));
                 // 鑾峰彇椤甸潰璁剧疆
 //                Dispatch.put(pageSetup, "PaperSize", pageSize);
                 // 鍐呭缂╂斁
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 93d9893..ccb4265 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
@@ -1,7 +1,9 @@
 package com.doumee.core.utils;
 
+import cn.hutool.core.util.IdcardUtil;
 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.Solutions;
 import com.doumee.dao.business.vo.CountCyclePriceVO;
 import io.swagger.models.auth.In;
@@ -13,6 +15,7 @@
 import javax.servlet.ServletOutputStream;
 import java.io.*;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.net.URL;
 import java.net.URLDecoder;
 import java.time.LocalDate;
@@ -49,6 +52,11 @@
     public static final String WX_MIN_SECRET = "WX_MIN_SECRET";
 
     public static final String SYSTEM ="SYSTEM";
+    public static final String PROTOCOL ="PROTOCOL";
+    public static final String PRIVACY ="PRIVACY";
+    public static final String USE ="USE";
+
+
     public static final String GOODS_IMG_DIR ="GOODS_IMG_DIR";
     public static final String CREDIT_CODE_REGEX = "[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}";
 
@@ -175,31 +183,77 @@
 
     }
 
+    public static CountCyclePriceVO getCountCyclePriceVO(CountCyclePriceDTO countCyclePriceDTO){
+        if(Objects.isNull(countCyclePriceDTO)
+                || Objects.isNull(countCyclePriceDTO.getSolutions())
+                || Objects.isNull(countCyclePriceDTO.getStartDate())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        return Constants.countPriceVO(countCyclePriceDTO.getStartDate(),countCyclePriceDTO.getSolutions());
+    }
 
     public static CountCyclePriceVO countPriceVO(Date startDate, Solutions solutions){
         CountCyclePriceVO countCyclePriceVO = new CountCyclePriceVO();
-        if(solutions.getInsureCycleUnit().equals(Constants.ZERO)){
+        //澶�
+        if(solutions.getTimeUnit().equals(TimeUnit.DAY.getValue())){
             countCyclePriceVO.setEndDate(
                     DateUtil.getMontageDate(
-                        DateUtil.afterDateByType(startDate,0,solutions.getInsureCycle()-1)
-                    ,2)
+                            DateUtil.afterDateByType(startDate,0,0)
+                            ,2)
             );
-        }else if(solutions.getInsureCycleUnit().equals(Constants.TWO)){
+        }else if(solutions.getTimeUnit().equals(TimeUnit.MONTH.getValue())){
             //鑾峰彇褰撴湀澶╂暟
             Integer monthDays = DateUtil.monthDays(startDate);
             //鑾峰彇澶╂暟鍚庣殑鏃ユ湡
             Date afterDate = DateUtil.afterDateByType(startDate,0,monthDays);
             //璧嬪�� 姣忔棩缁撴潫鏃跺垎绉�
             countCyclePriceVO.setEndDate(DateUtil.getMontageDate(afterDate,3));
-        }else if(solutions.getInsureCycleUnit().equals(Constants.THREE)){
+        }else if(solutions.getTimeUnit().equals(TimeUnit.QUARTER.getValue())){
             //鑾峰彇X骞村悗鏃ユ湡 澶氫簡涓�澶�
-            Date afterDate = DateUtil.afterDateByType(startDate,2,solutions.getInsureCycle());
+            Date afterDate = DateUtil.afterDateByType(startDate,1,3);
+            //璧嬪�� 姣忔棩缁撴潫鏃跺垎绉� 鐒跺悗鍑忓皯涓�澶�
+            countCyclePriceVO.setEndDate(DateUtil.getMontageDate(afterDate,3));
+        }else if(solutions.getTimeUnit().equals(TimeUnit.HALF_YEAR.getValue())){
+            //鑾峰彇X骞村悗鏃ユ湡 澶氫簡涓�澶�
+            Date afterDate = DateUtil.afterDateByType(startDate,1,6);
+            //璧嬪�� 姣忔棩缁撴潫鏃跺垎绉� 鐒跺悗鍑忓皯涓�澶�
+            countCyclePriceVO.setEndDate(DateUtil.getMontageDate(afterDate,3));
+        }else if(solutions.getTimeUnit().equals(TimeUnit.YEAR.getValue())){
+            //鑾峰彇X骞村悗鏃ユ湡 澶氫簡涓�澶�
+            Date afterDate = DateUtil.afterDateByType(startDate,2,1);
             //璧嬪�� 姣忔棩缁撴潫鏃跺垎绉� 鐒跺悗鍑忓皯涓�澶�
             countCyclePriceVO.setEndDate(DateUtil.getMontageDate(afterDate,3));
         }
-        countCyclePriceVO.setCyclePrice(Constants.countDetailFee(solutions,countCyclePriceVO.getEndDate(),startDate));
+        countCyclePriceVO.setCyclePrice(solutions.getPrice());
         return countCyclePriceVO;
     }
+
+
+//    public static CountCyclePriceVO countPriceVO(Date startDate, Solutions solutions){
+//        CountCyclePriceVO countCyclePriceVO = new CountCyclePriceVO();
+//        if(solutions.getInsureCycleUnit().equals(Constants.ZERO)){
+//            countCyclePriceVO.setEndDate(
+//                    DateUtil.getMontageDate(
+//                        DateUtil.afterDateByType(startDate,0,solutions.getInsureCycle()-1)
+//                    ,2)
+//            );
+//        }else if(solutions.getInsureCycleUnit().equals(Constants.TWO)){
+//            //鑾峰彇褰撴湀澶╂暟
+//            Integer monthDays = DateUtil.monthDays(startDate);
+//            //鑾峰彇澶╂暟鍚庣殑鏃ユ湡
+//            Date afterDate = DateUtil.afterDateByType(startDate,0,monthDays);
+//            //璧嬪�� 姣忔棩缁撴潫鏃跺垎绉�
+//            countCyclePriceVO.setEndDate(DateUtil.getMontageDate(afterDate,3));
+//        }else if(solutions.getInsureCycleUnit().equals(Constants.THREE)){
+//            //鑾峰彇X骞村悗鏃ユ湡 澶氫簡涓�澶�
+//            Date afterDate = DateUtil.afterDateByType(startDate,2,solutions.getInsureCycle());
+//            //璧嬪�� 姣忔棩缁撴潫鏃跺垎绉� 鐒跺悗鍑忓皯涓�澶�
+//            countCyclePriceVO.setEndDate(DateUtil.getMontageDate(afterDate,3));
+//        }
+//        countCyclePriceVO.setCyclePrice(Constants.countDetailFee(solutions,countCyclePriceVO.getEndDate(),startDate));
+//        return countCyclePriceVO;
+//    }
 
     public static Integer getSexByIdCard(String idCard){
         if(StringUtils.isBlank(idCard)){
@@ -579,7 +633,10 @@
 
     public static void main(String[] args) {
 
-        System.out.println("{\"companyName\":\"搴斿疂绉戞妧\",\"endtime\":\"2024-03-01 17:19:00\",\"erpId\":\"4D40185D5BC74A13821BE46EAF8B4179\",\"erpWithVisitDTOList\":[],\"faceImg\":\"20240304/1709518170325_742.jpg\",\"idcardNo\":\"342501199609300535\",\"idcardType\":0,\"name\":\"榛勬檵\",\"phone\":\"17756328697\",\"reason\":\"鎺㈤櫓\",\"receptMemberId\":\"E7E514BD7DE3F27CE0530B630A0AEAE0\",\"starttime\":\"2024-03-01 13:18:00\"}");
+        System.out.println(IdcardUtil.isValidCard("340621199310134818"));
+        System.out.println(IdcardUtil.isValidCard("341621199310134818"));
+
+//        System.out.println("{\"companyName\":\"搴斿疂绉戞妧\",\"endtime\":\"2024-03-01 17:19:00\",\"erpId\":\"4D40185D5BC74A13821BE46EAF8B4179\",\"erpWithVisitDTOList\":[],\"faceImg\":\"20240304/1709518170325_742.jpg\",\"idcardNo\":\"342501199609300535\",\"idcardType\":0,\"name\":\"榛勬檵\",\"phone\":\"17756328697\",\"reason\":\"鎺㈤櫓\",\"receptMemberId\":\"E7E514BD7DE3F27CE0530B630A0AEAE0\",\"starttime\":\"2024-03-01 13:18:00\"}");
     }
     /**
      * 鐢ㄦ埛绫诲瀷 0绯荤粺鐢ㄦ埛 1浼佷笟鐢ㄦ埛 2鏈嶅姟鏈烘瀯绠$悊鍛� 3鏈嶅姟鏈烘瀯瀛愯处鍙� 4缁煎悎鏈嶅姟鍗曚綅绠$悊鍛� 5缁煎悎鏈嶅姟鍗曚綅瀛愯处鍙� 6涓撳 7鍘垮尯鐢ㄦ埛 8甯傚眬鐢ㄦ埛
@@ -1000,6 +1057,128 @@
             this.collectStatus = collectStatus;
         }
     }
+
+    /**
+     * 鏂规 鍛ㄦ湡鍗曚綅
+     *  coefficient  浠ュ崐鏈堜负鏈�灏忛绮�
+     */
+    public enum TimeUnit {
+        DAY(0,"鏃�",0),
+        MONTH(2,"鏈�",2),
+        QUARTER(3,"瀛e害",6),
+        HALF_YEAR(4,"鍗婂勾",12),
+        YEAR(5,"骞�",24);
+        private  Integer value;
+        private  String des;
+        private  Integer coefficient;
+
+
+        TimeUnit(Integer value, String des, Integer coefficient) {
+            this.value = value;
+            this.des = des;
+            this.coefficient = coefficient;
+        }
+
+        public Integer getValue() {
+            return value;
+        }
+
+        public void setValue(Integer value) {
+            this.value = value;
+        }
+
+        public String getDes() {
+            return des;
+        }
+
+        public void setDes(String des) {
+            this.des = des;
+        }
+
+        public Integer getCoefficient() {
+            return coefficient;
+        }
+
+        public void setCoefficient(Integer coefficient) {
+            this.coefficient = coefficient;
+        }
+
+        public static TimeUnit getTimeUnit(Integer value) {
+            for (TimeUnit c : TimeUnit.values()) {
+                if (Constants.equalsInteger(c.getValue() , value)) {
+                    return c;
+                }
+            }
+            return null;
+        }
+    }
+
+    /**
+     * 鏂规 鍛ㄦ湡鍗曚綅 INSURE_CYCLE_UNIT
+     *  coefficient  浠ュ崐鏈堜负鏈�灏忛绮�
+     */
+    public enum InsureCycleUnit {
+        DAY(0,"鏃�",new BigDecimal(1),0),
+        HALF_MONTH(1,"鍗婃湀",new BigDecimal(15.5),1),
+        MONTH(2,"鏈�",new BigDecimal(31),2),
+        QUARTER(3,"瀛e害",new BigDecimal(92),6),
+        HALF_YEAR(4,"鍗婂勾", new BigDecimal(184),12),
+        YEAR(5,"骞�", new BigDecimal(365),24);
+        private  Integer value;
+        private  String des;
+        private  BigDecimal days;
+        private  Integer coefficient;
+
+
+        public static InsureCycleUnit getInsureCycleUnit(Integer value) {
+            for (InsureCycleUnit c : InsureCycleUnit.values()) {
+                if (Constants.equalsInteger(c.getValue() , value)) {
+                    return c;
+                }
+            }
+            return null;
+        }
+
+        InsureCycleUnit(Integer value, String des,BigDecimal days, Integer coefficient) {
+            this.value = value;
+            this.des = des;
+            this.days = days;
+            this.coefficient = coefficient;
+        }
+
+        public Integer getValue() {
+            return value;
+        }
+
+        public void setValue(Integer value) {
+            this.value = value;
+        }
+
+        public String getDes() {
+            return des;
+        }
+
+        public void setDes(String des) {
+            this.des = des;
+        }
+        public BigDecimal getDays() {
+            return days;
+        }
+
+        public void setDays(BigDecimal days) {
+            this.days = days;
+        }
+
+        public Integer getCoefficient() {
+            return coefficient;
+        }
+
+        public void setCoefficient(Integer coefficient) {
+            this.coefficient = coefficient;
+        }
+
+    }
+
 
 
 
@@ -1874,4 +2053,173 @@
             }
         }
     }
+
+
+
+    /**
+     * 鍑忎繚 鎬昏垂鐢�
+     * @param solutions
+     * @param fee
+     * @param startTime
+     * @param endTime
+     * @param reduceStartTime
+     * @param reduceEndTime
+     * @return
+     */
+    public static BigDecimal reduceFee(Solutions solutions,BigDecimal fee,Date startTime ,Date endTime,Date reduceStartTime,Date reduceEndTime){
+        Integer days = DateUtil.daysBetweenDates(reduceEndTime, reduceStartTime) + 1;
+        Integer countDays = DateUtil.daysBetweenDates(endTime, startTime) + 1;
+        Constants.TimeUnit timeUnit = Constants.TimeUnit.getTimeUnit(solutions.getTimeUnit());
+        Constants.InsureCycleUnit insureCycleUnit = Constants.InsureCycleUnit.getInsureCycleUnit(solutions.getInsureCycleUnit());
+        if(solutions.getTimeUnit().equals(solutions.getInsureCycleUnit())){
+            return fee;
+        }else{
+            if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.DAY.getValue())){
+                //澶╀负鎵规敼鍗曚綅
+                return fee.multiply(new BigDecimal(days)).divide(new BigDecimal(countDays),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())) {
+                //鍗婃湀涓烘壒鏀瑰崟浣�
+                BigDecimal cycle = new BigDecimal(days).divide(insureCycleUnit.getDays(),0,RoundingMode.CEILING);
+                //鏍规嵁鎶曚繚鍛ㄦ湡 瀹氫箟鐨� 姣忎釜鍛ㄦ湡 = X涓� 鍗婃湀鍛ㄦ湡 杩涜璁$畻
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁�
+                return fee.multiply(cycle).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())) {
+                //鏈堜唤涓烘壒鏀瑰崟浣�
+                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(reduceEndTime,reduceStartTime));
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 2
+                return fee.multiply(cycle).multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())) {
+                //瀛e害涓烘壒鏀瑰崟浣�
+                //鏌ヨ浜х敓璐圭敤鎬绘湀浠�
+                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(reduceEndTime,reduceStartTime));
+                //杞崲涓� 鎬诲搴�
+                cycle = cycle.divide(new BigDecimal(3),0,RoundingMode.CEILING);
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 6
+                return fee.multiply(cycle).multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_YEAR.getValue())) {
+                //鍗婂勾涓烘壒鏀瑰崟浣�
+                //鏌ヨ浜х敓璐圭敤鎬绘湀浠�
+                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(reduceEndTime,reduceStartTime));
+                //杞崲涓� 鍗婂勾
+                cycle = cycle.divide(new BigDecimal(6),0,RoundingMode.CEILING);
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 6
+                return fee.multiply(cycle).multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else {
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏂规閰嶇疆閿欒");
+            }
+        }
+    }
+
+    /**
+     * 鍔犱繚涓氬姟 鏍规嵁鏂规璁$畻鎬昏垂鐢�
+     * @param solutions
+     * @param startTime
+     * @param endTime
+     * @param newStartTime
+     * @return
+     */
+    public static BigDecimal addFee(Solutions solutions,BigDecimal fee,Date startTime ,Date endTime,Date newStartTime,Date newEndTime){
+        Integer days = DateUtil.daysBetweenDates(newEndTime, newStartTime) + 1;
+        Integer countDays = DateUtil.daysBetweenDates(endTime, startTime) + 1;
+        Constants.TimeUnit timeUnit = Constants.TimeUnit.getTimeUnit(solutions.getTimeUnit());
+        Constants.InsureCycleUnit insureCycleUnit = Constants.InsureCycleUnit.getInsureCycleUnit(solutions.getInsureCycleUnit());
+        if(solutions.getTimeUnit().equals(solutions.getInsureCycleUnit())){
+            return fee;
+        }else{
+            if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.DAY.getValue())){
+                //澶╀负鎵规敼鍗曚綅
+                return fee.multiply(new BigDecimal(days)).divide(new BigDecimal(countDays),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())) {
+                //鍗婃湀涓烘壒鏀瑰崟浣�
+                BigDecimal cycle = new BigDecimal(days).divide(insureCycleUnit.getDays(),0,RoundingMode.CEILING);
+                //鏍规嵁鎶曚繚鍛ㄦ湡 瀹氫箟鐨� 姣忎釜鍛ㄦ湡 = X涓� 鍗婃湀鍛ㄦ湡 杩涜璁$畻
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁�
+                return fee.multiply(cycle).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())) {
+                //鏈堜唤涓烘壒鏀瑰崟浣�
+                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(newEndTime,newStartTime));
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 2
+                return fee.multiply(cycle).multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())) {
+                //瀛e害涓烘壒鏀瑰崟浣�
+                //鏌ヨ浜х敓璐圭敤鎬绘湀浠�
+                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(newEndTime,newStartTime));
+                //杞崲涓� 鎬诲搴�
+                cycle = cycle.divide(new BigDecimal(3),0,RoundingMode.CEILING);
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 6
+                return fee.multiply(cycle).multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_YEAR.getValue())) {
+                //鍗婂勾涓烘壒鏀瑰崟浣�
+                //鏌ヨ浜х敓璐圭敤鎬绘湀浠�
+                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(newEndTime,newStartTime));
+                //杞崲涓� 鍗婂勾
+                cycle = cycle.divide(new BigDecimal(6),0,RoundingMode.CEILING);
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 6
+                return fee.multiply(cycle).multiply(new BigDecimal(12)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else {
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏂规閰嶇疆閿欒");
+            }
+        }
+    }
+
+
+
+    /**
+     * 璁$畻宸蹭骇鐢熻垂鐢�
+     * @param solutions
+     * @param fee
+     * @param startTime
+     * @param endTime
+     * @return
+     */
+    public static BigDecimal produceFee(Solutions solutions,BigDecimal fee,Date startTime ,Date endTime,Date produceStartTime){
+        //瓒呭嚭澶╂暟
+        Integer days = DateUtil.daysBetweenDates(DateUtil.getMontageDate(new Date(), 2), produceStartTime) + 1;
+        Integer countDays = DateUtil.daysBetweenDates(endTime, startTime) + 1;
+        Constants.TimeUnit timeUnit = Constants.TimeUnit.getTimeUnit(solutions.getTimeUnit());
+        Constants.InsureCycleUnit insureCycleUnit = Constants.InsureCycleUnit.getInsureCycleUnit(solutions.getInsureCycleUnit());
+        if(solutions.getTimeUnit().equals(solutions.getInsureCycleUnit())){
+            return fee;
+        }else{
+            if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.DAY.getValue())){
+                //澶╀负鎵规敼鍗曚綅
+                return fee.multiply(new BigDecimal(days)).divide(new BigDecimal(countDays),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())) {
+                //鍗婃湀涓烘壒鏀瑰崟浣�
+                BigDecimal cycle = new BigDecimal(days).divide(insureCycleUnit.getDays(),0,RoundingMode.CEILING);
+                //鏍规嵁鎶曚繚鍛ㄦ湡 瀹氫箟鐨� 姣忎釜鍛ㄦ湡 = X涓� 鍗婃湀鍛ㄦ湡 杩涜璁$畻
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁�
+                return fee.multiply(cycle).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())) {
+                //鏈堜唤涓烘壒鏀瑰崟浣�
+                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(new Date(),startTime));
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 2
+                return fee.multiply(cycle).multiply(new BigDecimal(2)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())) {
+                //瀛e害涓烘壒鏀瑰崟浣�
+                //鏌ヨ浜х敓璐圭敤鎬绘湀浠�
+                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(new Date(),startTime));
+                //杞崲涓� 鎬诲搴�
+                cycle = cycle.divide(new BigDecimal(3),0,RoundingMode.CEILING);
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 6
+                return fee.multiply(cycle).multiply(new BigDecimal(6)).divide(new BigDecimal(timeUnit.getCoefficient()),2, RoundingMode.HALF_UP);
+            }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_YEAR.getValue())) {
+                //鍗婂勾涓烘壒鏀瑰崟浣�
+                //鏌ヨ浜х敓璐圭敤鎬绘湀浠�
+                BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(new Date(),startTime));
+                //杞崲涓� 鍗婂勾
+                cycle = cycle.divide(new BigDecimal(6),0,RoundingMode.CEILING);
+                // 鎬婚噾棰� * 浜х敓璐圭敤鐨勫懆鏈� / 鎶曚繚鍛ㄦ湡瀹氫箟鐨� 鍗婃湀鍛ㄦ湡鏁� * 6
+                return fee.multiply(cycle).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 1acf22d..0c8a385 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
@@ -1,6 +1,8 @@
 package com.doumee.core.utils;
 
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.sql.Timestamp;
 import java.text.DateFormat;
 import java.text.DateFormatSymbols;
@@ -8,6 +10,7 @@
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.Period;
+import java.time.ZoneId;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Enumeration;
@@ -3186,8 +3189,17 @@
 
 //        );
 
-        LocalDate startDate= LocalDate.of(2021,2,28);
-        LocalDate endDate =LocalDate.of(2022,4,5);
+//        System.out.println(
+//                new BigDecimal(16).divide(new BigDecimal(15.5),0, RoundingMode.CEILING)
+//        );
+        LocalDate startDate = DateUtil.StringToDate("2021-02-28 23:59:59").toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDate();
+        LocalDate endDate = DateUtil.StringToDate("2022-04-05 23:59:59").toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDate();
+//        LocalDate startDate= LocalDate.of(2021,2,28);
+//        LocalDate endDate =LocalDate.of(2022,4,5);
         Period period = Period.between(startDate,endDate);
         int months = period.getYears()* 12 + period.getMonths();
         System.out.println("Months between the two dates: " + months);
@@ -3214,9 +3226,28 @@
 //
 //        );
 
-
-
     }
 
+    /**
+     * 鑾峰彇鐩稿樊鐨勬湀鏁�
+     * @param sDate
+     * @param eDate
+     * @return
+     */
+    public static Integer getDifferenceMonths(Date sDate ,Date eDate) {
+        LocalDate startDate = sDate.toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDate();
+        LocalDate endDate = eDate.toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDate();
+//        LocalDate startDate= LocalDate.of(2021,2,28);
+//        LocalDate endDate =LocalDate.of(2022,4,5);
+        Period period = Period.between(endDate,startDate);
+        int months = period.getYears()* 12 + period.getMonths();
+        return months + 1;
+    }
+
+
 
 }
\ No newline at end of file
diff --git a/server/service/src/main/java/com/doumee/dao/business/dto/CountCyclePriceDTO.java b/server/service/src/main/java/com/doumee/dao/business/dto/CountCyclePriceDTO.java
index d997b60..8f737d1 100644
--- a/server/service/src/main/java/com/doumee/dao/business/dto/CountCyclePriceDTO.java
+++ b/server/service/src/main/java/com/doumee/dao/business/dto/CountCyclePriceDTO.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.dto;
 
+import com.doumee.dao.business.model.Solutions;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -21,5 +22,8 @@
     @ApiModelProperty(value = "鐢熸晥璧锋湡")
     private Date startDate;
 
+    @ApiModelProperty(value = "鏂规", example = "1")
+    private Solutions solutions;
+
 
 }
diff --git a/server/service/src/main/java/com/doumee/dao/business/dto/SaveUnionChangeDTO.java b/server/service/src/main/java/com/doumee/dao/business/dto/SaveUnionChangeDTO.java
index 0cd5caf..1e7789e 100644
--- a/server/service/src/main/java/com/doumee/dao/business/dto/SaveUnionChangeDTO.java
+++ b/server/service/src/main/java/com/doumee/dao/business/dto/SaveUnionChangeDTO.java
@@ -22,9 +22,9 @@
     @ApiModelProperty(value = "鍔犲噺淇�/鎹㈠巶鍗曟嵁涓婚敭 澶氫釜浠�,鍒嗗壊")
     private List<Integer> applyIds;
 
-//    @ApiModelProperty(value = "鎵瑰崟鏃ユ湡")
-//    @JsonFormat(pattern = "yyyy-MM-dd")
-//    private Date applyDate;
+    @ApiModelProperty(value = "鎵瑰崟鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date applyDate;
 
     @ApiModelProperty(value = "涓氬姟绫诲瀷锛�0=鍔犲噺淇�;1=鎹㈠巶")
     private Integer businessType;
diff --git a/server/service/src/main/java/com/doumee/dao/business/dto/UnionChangeBXDDTO.java b/server/service/src/main/java/com/doumee/dao/business/dto/UnionChangeBXDDTO.java
index 98c3fea..6be285d 100644
--- a/server/service/src/main/java/com/doumee/dao/business/dto/UnionChangeBXDDTO.java
+++ b/server/service/src/main/java/com/doumee/dao/business/dto/UnionChangeBXDDTO.java
@@ -20,12 +20,16 @@
     @ApiModelProperty(value = "鍚堝苟鍗曚富閿�")
     private Integer id;
 
+    @ApiModelProperty(value = "鎶曚繚鐢宠鍗曞悎骞跺崟涓婚敭")
+    private Integer applyId;
+
     @ApiModelProperty(value = "淇濆崟鍙�")
     private String code;
 
-    @ApiModelProperty(value = "鎵瑰崟鏃ユ湡")
+    @ApiModelProperty(value = "鎵瑰崟鏃ユ湡(鍔犱繚鎵瑰崟鏃ユ湡)")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date applyDate;
+
     @ApiModelProperty(value = "鍑忎繚鎵瑰崟鏃ユ湡")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date delValidTime;
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 4113d79..fcb027b 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
@@ -142,6 +142,11 @@
     @TableField(exist = false)
     private BigDecimal solutionPrice;
 
+    @ApiModelProperty(value = "鏈嶅姟璐�")
+    @TableField(exist = false)
+    private BigDecimal serverCost;
+
+
     @ApiModelProperty(value = "淇濋櫓鏃堕棿鍗曚綅0澶� 1鍗婃湀 2鏈� 3骞�", example = "1")
     @TableField(exist = false)
     private Integer solutionTimeUnit;
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/InsuranceApply.java b/server/service/src/main/java/com/doumee/dao/business/model/InsuranceApply.java
index 65b1e31..4bce582 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/InsuranceApply.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/InsuranceApply.java
@@ -147,6 +147,14 @@
     @ExcelColumn(name="浜哄憳鍚嶅崟绛剧讲鍚堝悓鍙�")
     private String signMemberListNo;
 
+
+    @ApiModelProperty(value = "鍛ㄦ湡缁撴潫鏃ユ湡 锛�2022-02-02 23:59:59锛�")
+    @ExcelColumn(name="鍛ㄦ湡缁撴潫鏃ユ湡 锛�2022-02-02 23:59:59锛�")
+//    @DateTimeFormat(pattern = "yyyy-MM-dd")
+//    @JsonFormat(pattern="yyyy-MM-dd")
+    private Date finalEndTime;
+
+
     @ApiModelProperty(value = "浼佷笟鍚嶇О")
     @TableField(exist = false)
     private String companyName;
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/Member.java b/server/service/src/main/java/com/doumee/dao/business/model/Member.java
index beba41d..1fa8b42 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/Member.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -9,6 +9,8 @@
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -111,4 +113,25 @@
     @TableField(exist = false)
     private Integer sn;
 
+
+    @ApiModelProperty(value = "淇濋櫓鏂规涓婚敭")
+    @TableField(exist = false)
+    private Integer solutionId;
+
+    @ApiModelProperty(value = "璐圭敤")
+    @TableField(exist = false)
+    private BigDecimal fee;
+
+    @ApiModelProperty(value = "淇濆崟鏄庣粏琛屽疄闄呭紑濮嬫棩鏈�")
+    @TableField(exist = false)
+    private Date detailStartTime;
+
+    @ApiModelProperty(value = "淇濆崟鏄庣粏琛屽疄闄呯粨鏉熸棩鏈�")
+    @TableField(exist = false)
+    private Date detailEndTime;
+
+    @ApiModelProperty(value = "淇濆崟鏄庣粏琛屾湇鍔¤垂")
+    @TableField(exist = false)
+    private BigDecimal detailServerCost;
+
 }
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/Solutions.java b/server/service/src/main/java/com/doumee/dao/business/model/Solutions.java
index a67f42c..f9f9f57 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/Solutions.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/Solutions.java
@@ -89,11 +89,11 @@
     @ExcelColumn(name="鏈�楂樺勾榫�")
     private Integer maxAge;
 
-    @ApiModelProperty(value = "淇濋櫓璐圭敤(浜�/澶╋級", example = "1")
+    @ApiModelProperty(value = "淇濋櫓璐圭敤锛堜汉锛� -- 淇濋櫓璐圭敤(浜�/澶╋級", example = "1")
     @ExcelColumn(name="淇濋櫓璐圭敤(浜�/澶╋級")
     private BigDecimal price;
 
-    @ApiModelProperty(value = "淇濋櫓鏃堕棿鍗曚綅0澶� 1鍗婃湀 2鏈� 3骞�", example = "1")
+    @ApiModelProperty(value = " 鍛ㄦ湡鍗曚綅 0澶� 2鏈� 3瀛e害  4鍗婂勾 5骞� -- 淇濋櫓鏃堕棿鍗曚綅0澶� 1鍗婃湀 2鏈� 3骞�", example = "1")
     @ExcelColumn(name="淇濋櫓鏃堕棿鍗曚綅0澶� 1鍗婃湀 2鏈� 3骞�")
     private Integer timeUnit;
 
@@ -101,7 +101,7 @@
     @ExcelColumn(name="鎶曚繚鍛ㄦ湡")
     private Integer insureCycle;
 
-    @ApiModelProperty(value = "鏈�灏忔姇淇濆懆鏈熸椂闂村崟浣�0澶� 1鍗婃湀 2鏈� 3骞�", example = "1")
+    @ApiModelProperty(value = "鎵规敼璁¤垂鍗曚綅 0澶� 1鍗婃湀 2鏈� 3瀛e害  4鍗婂勾 5骞� -- 鏈�灏忔姇淇濆懆鏈熸椂闂村崟浣�0澶� 1鍗婃湀 2鏈� 3骞�", example = "1")
     @ExcelColumn(name="鏈�灏忔姇淇濆懆鏈熸椂闂村崟浣�0澶� 1鍗婃湀 2鏈� 3骞�")
     private Integer insureCycleUnit;
 
diff --git a/server/service/src/main/java/com/doumee/dao/business/vo/CountCyclePriceVO.java b/server/service/src/main/java/com/doumee/dao/business/vo/CountCyclePriceVO.java
index 220b347..129928e 100644
--- a/server/service/src/main/java/com/doumee/dao/business/vo/CountCyclePriceVO.java
+++ b/server/service/src/main/java/com/doumee/dao/business/vo/CountCyclePriceVO.java
@@ -12,10 +12,14 @@
 @Data
 public class CountCyclePriceVO {
 
-    @ApiModelProperty(value = "鎬婚噾棰�", example = "1")
+    @ApiModelProperty(value = "鍔犱繚浣跨敤閲戦", example = "1")
     private BigDecimal cyclePrice;
 
     @ApiModelProperty(value = "鐢熸晥姝㈡湡")
     private Date endDate;
 
+
+    @ApiModelProperty(value = "鍔犱繚浣跨敤閲戦", example = "1")
+    private BigDecimal reducePrice;
+
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/InsuranceApplyService.java b/server/service/src/main/java/com/doumee/service/business/InsuranceApplyService.java
index 755231b..95286b8 100644
--- a/server/service/src/main/java/com/doumee/service/business/InsuranceApplyService.java
+++ b/server/service/src/main/java/com/doumee/service/business/InsuranceApplyService.java
@@ -117,13 +117,13 @@
 
     Integer check(InsuranceApply insuranceApply);
 
-     InsuranceApply  findDetailForExport(InsuranceApply model);
+    InsuranceApply  findDetailForExport(InsuranceApply model);
 
     List<InsuranceApply> findListByDTO(InsuranceApplyQueryDTO model);
 
     Integer editBaoxiandan(InsuranceApply param);
 
-    void updateApplyCurrentFee(Integer id);
+    void updateApplyCurrentFee(Integer id,Integer unionId);
 
     String getSignLink(Integer id);
 
diff --git a/server/service/src/main/java/com/doumee/service/business/SolutionsService.java b/server/service/src/main/java/com/doumee/service/business/SolutionsService.java
index 3d6d0de..6c3c81a 100644
--- a/server/service/src/main/java/com/doumee/service/business/SolutionsService.java
+++ b/server/service/src/main/java/com/doumee/service/business/SolutionsService.java
@@ -3,6 +3,9 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Solutions;
+
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -100,4 +103,12 @@
      * @return long
      */
     long count(Solutions solutions);
+
+
+    BigDecimal testSolutionAddMoney(Integer id, BigDecimal fee, Date start,Date end,Date newDate,Date newEndDate);
+
+    BigDecimal testSolutionReduceMoney(Integer id, BigDecimal fee, Date start,Date end,Date reduceStartTime,Date reduceEndTime);
+
+    BigDecimal testSolutionProduceMoney(Integer id, BigDecimal fee, Date start,Date end,Date produceStart);
+
 }
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 151b5c5..d581e01 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
@@ -1,6 +1,8 @@
 package com.doumee.service.business.impl;
 
+import cn.hutool.core.util.IdcardUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.api.R;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.annotation.excel.ExcelExporter;
 import com.doumee.core.constants.ResponseStatus;
@@ -193,6 +195,26 @@
         }
 
         ApplyChange model = applyChangeMapper.selectById(param.getId());
+        InsuranceApply insuranceApply = insuranceApplyMapper.selectById(model.getApplyId());
+        if(Objects.isNull(insuranceApply)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌淇濆崟淇℃伅");
+        }
+        if(model.getType().equals(Constants.ZERO)){
+            if(param.getDelValidTime() == null){
+                throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+            }
+            if(!(param.getApplyStartTime().getTime()>insuranceApply.getStartTime().getTime()&&param.getApplyStartTime().getTime()<=insuranceApply.getEndTime().getTime())){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎵瑰鏃ユ湡蹇呴』澶勪簬淇濆崟鐢宠鏃ユ湡鍐�");
+            }
+
+            if(!(param.getDelValidTime().getTime()>insuranceApply.getStartTime().getTime()&&param.getDelValidTime().getTime()<=insuranceApply.getEndTime().getTime())){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎵瑰噺鏃ユ湡蹇呴』澶勪簬淇濆崟鐢宠鏃ユ湡鍐�");
+            }
+        }else{
+            if(param.getApplyStartTime().getTime()<model.getApplyStartTime().getTime()){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎵瑰崟鏃ユ湡蹇呴』澶т簬鐢宠鏃ユ湡");
+            }
+        }
         if(model == null ||!Constants.equalsInteger(model.getIsdeleted(),Constants.ZERO)){
             throw  new BusinessException(ResponseStatus.DATA_EMPTY);
         }
@@ -204,10 +226,6 @@
             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝璇ョ敵璇风姸鎬佸凡娴佽浆锛屽綋鍓嶄笉鏀寔璇ユ搷浣渵");
         }
 
-        InsuranceApply insuranceApply = insuranceApplyMapper.selectById(model.getApplyId());
-        if(Objects.isNull(insuranceApply)){
-            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌淇濆崟淇℃伅");
-        }
 
         LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
         ApplyChange update = new ApplyChange();
@@ -268,7 +286,7 @@
         applyLogMapper.insert(log);
 
 
-        return  1;
+        return  model.getApplyId();
 
     }
     @Override
@@ -388,86 +406,117 @@
             if(oldModel == null  ){
                 throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鐢ㄦ埛銆�"+detail.getMemberName()+"銆戝師淇濆崟淇℃伅鏈夎锛屾壒鍗曟棩鏈熸湭鍦ㄤ繚鍗曟棩鏈熷唴锛�");
             }
-            Date endDate = oldModel.getEndTime();
+
+            MemberInsurance memberInsurance = new MemberInsurance(detail,update,update.getEditor(),null,insuranceApply.getSolutionId());
+            memberInsurance.setSolutionId(detail.getSolutionId());
+            memberInsurance.setWorktypeName(detail.getWorkTypeName());
+            memberInsurance.setDuName(detail.getDuName());
+            memberInsurance.setApplyChangeId(detail.getApplyChangeId());
+            memberInsurance.setSolutionName(detail.getSolutionsName());
+            memberInsurance.setPdCode(update.getValidCode());
+            memberInsurance.setBdCode(insuranceApply.getCode());
+            memberInsurance.setRelationType(Constants.ONE);
+            memberInsurance.setStartTime(DateUtil.getMontageDate(update.getApplyStartTime(),1));
+            memberInsurance.setRelationId(oldModel.getId());
+            memberInsuranceJoinMapper.insert(memberInsurance);
+
+            applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
+                    .set(ApplyDetail::getEditor,update.getEditor())
+                    .set(ApplyDetail::getEditDate,update.getEditDate())
+                    .set(ApplyDetail::getDuId,detail.getDuId())
+                    .set(ApplyDetail::getWorktypeId,detail.getWorktypeId())
+                    .eq(ApplyDetail::getId,oldModel.getId())
+            );
+            memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
+                    .eq(MemberInsurance::getApplyId,update.getApplyId())
+                    .le(MemberInsurance::getStartTime,applyStartTime)
+                    .ge(MemberInsurance::getEndTime,applyStartTime)
+                    .set(insuranceApply.getStartTime().compareTo(update.getApplyStartTime())!=0,
+                            MemberInsurance::getEndTime,DateUtil.getMontageDate(update.getApplyStartTime(), 3))
+                    .set(insuranceApply.getStartTime().compareTo(update.getApplyStartTime())==0,
+                            MemberInsurance::getEndTime,DateUtil.getMontageDate(update.getApplyStartTime(), 2))
+                            .ne(MemberInsurance::getId,memberInsurance.getId())
+//                    .eq(MemberInsurance::getRelationId,oldModel.getId())
+            );
 
             //濡傛灉瀹為檯鎵瑰崟鏃ユ湡 鍜� 鍘熻褰曟棩鏈熺浉绛� 鍒欑洿鎺ヤ慨鏀硅褰曟淳閬e崟浣嶄笌宸ョ淇℃伅
-            if(applyStartTime.compareTo(oldModel.getStartTime())!=Constants.ZERO){
-                //褰撳墠鏃ユ湡澶т簬鎵瑰崟鏃ユ湡 闇�瑕佸洖婊氭暟鎹疄闄呮暟鎹�
-                Boolean flag = DateUtil.getMontageDate(new Date(),2).compareTo(DateUtil.getMontageDate(update.getApplyStartTime(),2))>0;
-                //鎹㈠巶鍚庡巻鍙茶褰曠殑璐圭敤 fee
-                Integer days = DateUtil.daysBetweenDates(DateUtil.getMontageDate(update.getApplyStartTime(),3),DateUtil.getMontageDate(oldModel.getStartTime(),1))+1;
-                BigDecimal oldFee = this.getApplyPrice(update.getApplyId(),days);
-                BigDecimal fee = oldModel.getFee();
-                BigDecimal oldCurrentFee = oldModel.getCurrentFee();
-
-                applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
-                        .set(ApplyDetail::getEditor,update.getEditor())
-                        .set(ApplyDetail::getEditDate,update.getEditDate())
-                        .set(ApplyDetail::getEndTime,DateUtil.getMontageDate(update.getApplyStartTime(),3))
-                        .set(ApplyDetail::getFee,oldFee)
-                        .set(flag,ApplyDetail::getCurrentFee,oldFee)
-                        .eq(ApplyDetail::getId,oldModel.getId())
-                );
-
-                //淇敼 鍛樺伐鎶曚繚鏄庣粏璁板綍 鍘嗗彶鏁版嵁
-                memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
-                        .set(MemberInsurance::getEndTime,update.getApplyStartTime())
-                        .set(MemberInsurance::getFee,oldFee)
-                        .eq(MemberInsurance::getRelationId,oldModel.getId())
-                );
-
-                ApplyDetail applyDetail = new ApplyDetail();
-                applyDetail.setApplyId(oldModel.getApplyId());
-                applyDetail.setCreateDate(new Date());
-                applyDetail.setCreator(update.getEditor());
-                applyDetail.setMemberId(oldModel.getMemberId());
-                applyDetail.setIdcardNo(detail.getIdcardNo());
-                applyDetail.setSex(Constants.getSexByIdCard(detail.getIdcardNo()));
-                applyDetail.setMemberName(detail.getMemberName());
-                applyDetail.setStartTime(DateUtil.getMontageDate(update.getApplyStartTime(),1));
-                applyDetail.setEndTime(endDate);
-                applyDetail.setDuId(detail.getDuId());
-                applyDetail.setWorktypeId(detail.getWorktypeId());
-                applyDetail.setIdcardNo(oldModel.getIdcardNo());
-                applyDetail.setFee(fee.subtract(oldFee));
-                applyDetail.setIsdeleted(Constants.ZERO);
-                if(flag){
-                    applyDetail.setCurrentFee(oldCurrentFee.multiply(oldFee));
-                }else{
-                    applyDetail.setCurrentFee(BigDecimal.ZERO);
-                }
-                applyDetail.setSex(oldModel.getSex());
-                applyDetail.setMemberName(oldModel.getMemberName());
-                applyDetail.setFromId(detail.getId());
-                applyDetailJoinMapper.insert(applyDetail);
-
-                MemberInsurance memberInsurance = new MemberInsurance(applyDetail,update.getId());
-                memberInsurance.setSolutionId(detail.getSolutionId());
-                memberInsurance.setWorktypeName(detail.getWorkTypeName());
-                memberInsurance.setDuName(detail.getDuName());
-                memberInsurance.setApplyChangeId(detail.getApplyChangeId());
-                memberInsurance.setSolutionName(detail.getSolutionsName());
-                memberInsurance.setPdCode(update.getValidCode());
-                memberInsurance.setBdCode(insuranceApply.getCode());
-                memberInsurance.setRelationType(Constants.ONE);
-                memberInsuranceJoinMapper.insert(memberInsurance);
-            }else{
-                applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
-                        .set(ApplyDetail::getEditor,update.getEditor())
-                        .set(ApplyDetail::getEditDate,update.getEditDate())
-                        .set(ApplyDetail::getDuId,detail.getDuId())
-                        .set(ApplyDetail::getWorktypeId,detail.getWorktypeId())
-                        .eq(ApplyDetail::getId,oldModel.getId())
-                );
-                //鍛樺伐鎶曚繚鏄庣粏璁板綍 鍘嗗彶鏁版嵁
-                memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
-                        .set(MemberInsurance::getDuId,detail.getDuId())
-                        .set(MemberInsurance::getDuName,detail.getDuName())
-                        .set(MemberInsurance::getWorktypeId,detail.getWorktypeId())
-                        .set(MemberInsurance::getWorktypeName,detail.getWorkTypeName())
-                        .eq(MemberInsurance::getRelationId,oldModel.getId())
-                );
-            }
+//            if(applyStartTime.compareTo(oldModel.getStartTime())!=Constants.ZERO){
+//                //褰撳墠鏃ユ湡澶т簬鎵瑰崟鏃ユ湡 闇�瑕佸洖婊氭暟鎹疄闄呮暟鎹�
+//                Boolean flag = DateUtil.getMontageDate(new Date(),2).compareTo(DateUtil.getMontageDate(update.getApplyStartTime(),2))>0;
+//                //鎹㈠巶鍚庡巻鍙茶褰曠殑璐圭敤 fee
+//                Integer days = DateUtil.daysBetweenDates(DateUtil.getMontageDate(update.getApplyStartTime(),3),DateUtil.getMontageDate(oldModel.getStartTime(),1))+1;
+//                BigDecimal oldFee = this.getApplyPrice(update.getApplyId(),days);
+//                BigDecimal fee = oldModel.getFee();
+//                BigDecimal oldCurrentFee = oldModel.getCurrentFee();
+//
+//                applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
+//                        .set(ApplyDetail::getEditor,update.getEditor())
+//                        .set(ApplyDetail::getEditDate,update.getEditDate())
+//                        .set(ApplyDetail::getEndTime,DateUtil.getMontageDate(update.getApplyStartTime(),3))
+//                        .set(ApplyDetail::getFee,oldFee)
+//                        .set(flag,ApplyDetail::getCurrentFee,oldFee)
+//                        .eq(ApplyDetail::getId,oldModel.getId())
+//                );
+//
+//                //淇敼 鍛樺伐鎶曚繚鏄庣粏璁板綍 鍘嗗彶鏁版嵁
+//                memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
+//                        .set(MemberInsurance::getEndTime,update.getApplyStartTime())
+//                        .set(MemberInsurance::getFee,oldFee)
+//                        .eq(MemberInsurance::getRelationId,oldModel.getId())
+//                );
+//
+//                ApplyDetail applyDetail = new ApplyDetail();
+//                applyDetail.setApplyId(oldModel.getApplyId());
+//                applyDetail.setCreateDate(new Date());
+//                applyDetail.setCreator(update.getEditor());
+//                applyDetail.setMemberId(oldModel.getMemberId());
+//                applyDetail.setIdcardNo(detail.getIdcardNo());
+//                applyDetail.setSex(Constants.getSexByIdCard(detail.getIdcardNo()));
+//                applyDetail.setMemberName(detail.getMemberName());
+//                applyDetail.setStartTime(DateUtil.getMontageDate(update.getApplyStartTime(),1));
+//                applyDetail.setEndTime(endDate);
+//                applyDetail.setDuId(detail.getDuId());
+//                applyDetail.setWorktypeId(detail.getWorktypeId());
+//                applyDetail.setIdcardNo(oldModel.getIdcardNo());
+//                applyDetail.setFee(fee.subtract(oldFee));
+//                applyDetail.setIsdeleted(Constants.ZERO);
+//                if(flag){
+//                    applyDetail.setCurrentFee(oldCurrentFee.multiply(oldFee));
+//                }else{
+//                    applyDetail.setCurrentFee(BigDecimal.ZERO);
+//                }
+//                applyDetail.setSex(oldModel.getSex());
+//                applyDetail.setMemberName(oldModel.getMemberName());
+//                applyDetail.setFromId(detail.getId());
+//                applyDetailJoinMapper.insert(applyDetail);
+//
+//                MemberInsurance memberInsurance = new MemberInsurance(applyDetail,update.getId());
+//                memberInsurance.setSolutionId(detail.getSolutionId());
+//                memberInsurance.setWorktypeName(detail.getWorkTypeName());
+//                memberInsurance.setDuName(detail.getDuName());
+//                memberInsurance.setApplyChangeId(detail.getApplyChangeId());
+//                memberInsurance.setSolutionName(detail.getSolutionsName());
+//                memberInsurance.setPdCode(update.getValidCode());
+//                memberInsurance.setBdCode(insuranceApply.getCode());
+//                memberInsurance.setRelationType(Constants.ONE);
+//                memberInsuranceJoinMapper.insert(memberInsurance);
+//            }else{
+//                applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
+//                        .set(ApplyDetail::getEditor,update.getEditor())
+//                        .set(ApplyDetail::getEditDate,update.getEditDate())
+//                        .set(ApplyDetail::getDuId,detail.getDuId())
+//                        .set(ApplyDetail::getWorktypeId,detail.getWorktypeId())
+//                        .eq(ApplyDetail::getId,oldModel.getId())
+//                );
+//                //鍛樺伐鎶曚繚鏄庣粏璁板綍 鍘嗗彶鏁版嵁
+//                memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
+//                        .set(MemberInsurance::getDuId,detail.getDuId())
+//                        .set(MemberInsurance::getDuName,detail.getDuName())
+//                        .set(MemberInsurance::getWorktypeId,detail.getWorktypeId())
+//                        .set(MemberInsurance::getWorktypeName,detail.getWorkTypeName())
+//                        .eq(MemberInsurance::getRelationId,oldModel.getId())
+//                );
+//            }
 
             Member member = memberMapper.selectById(detail.getMemberId());
             if(Objects.isNull(member)){
@@ -476,8 +525,8 @@
             member.setApplyId(update.getApplyId());
             member.setDuId(detail.getDuId());
             member.setWorktypeId(detail.getWorktypeId());
-            member.setStartTime(detail.getStartTime());
-            member.setEndTime(detail.getEndTime());
+//            member.setStartTime(detail.getStartTime());
+//            member.setEndTime(detail.getEndTime());
             memberMapper.updateById(member);
 
             applyChangeDetailJoinMapper.update(null,new UpdateWrapper<ApplyChagneDetail>().lambda()
@@ -513,39 +562,27 @@
         if (detailList == null || detailList.size() == 0) {
             return;
         }
-        List<ApplyDetail> addList = new ArrayList<>();
-        List<Integer> reduceMembers = new ArrayList<>();
         BigDecimal totalFee = new BigDecimal(0);
         BigDecimal currentFee = new BigDecimal(0);
         //鎶曚繚璁板綍 鍔犱繚鏁版嵁鍔犲叆鏂版暟鎹�  鍑忎繚鏁版嵁 淇敼鑰佹暟鎹�
         List<MemberInsurance> memberInsuranceList = new ArrayList<>();
 
-        //鍔犱繚涓氬姟 浣跨敤鐨勫姞淇濋噾棰�
-        ApplyChangeCyclePriceDTO applyChangeCyclePriceDTO_add = new ApplyChangeCyclePriceDTO();
-        applyChangeCyclePriceDTO_add.setApplyId(update.getApplyId());
-        applyChangeCyclePriceDTO_add.setValidTime(DateUtil.getMontageDate(update.getApplyStartTime(), 1));
-        //鍔犱繚 娣诲姞鐨勯噾棰�
-        CountCyclePriceVO countCyclePriceVO_add = this.getChangeCountCyclePriceVO(applyChangeCyclePriceDTO_add);
-
         Solutions solutions = solutionsMapper.selectById(insuranceApply.getSolutionId());
         if(Objects.isNull(solutions)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌淇濋櫓鏂规");
         }
-        if(solutions.getDataType().equals(Constants.ONE)){
-            solutions = solutionsMapper.selectOne(new QueryWrapper<Solutions>().lambda().eq(Solutions::getBaseId,solutions.getBaseId()).eq(Solutions::getDataType,Constants.TWO).last("limit 1"));
-            if(Objects.isNull(solutions)){
-                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈煡璇㈠埌鏂规鏈�鏂扮増鏈俊鎭�");
-            }
-        }
-
-
+//        if(solutions.getDataType().equals(Constants.ONE)){
+//            solutions = solutionsMapper.selectOne(new QueryWrapper<Solutions>().lambda().eq(Solutions::getBaseId,solutions.getBaseId()).eq(Solutions::getDataType,Constants.TWO).last("limit 1"));
+//            if(Objects.isNull(solutions)){
+//                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈煡璇㈠埌鏂规鏈�鏂扮増鏈俊鎭�");
+//            }
+//        }
         for (ApplyChagneDetail detail : detailList) {
             Member member = memberMapper.selectById(detail.getMemberId());
             if(Objects.isNull(member)){
                 throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鍛樺伐鏁版嵁");
             }
             if (Constants.equalsInteger(detail.getType(), Constants.ZERO)) {
-
                 //鏌ヨ鍔犱繚浜哄憳鏄惁瀛樺湪 鍐茬獊鐨� 淇濆崟鏄庣粏鏁版嵁
                 if(applyDetailJoinMapper.selectCount(new QueryWrapper<ApplyDetail>()
                         .lambda()
@@ -556,8 +593,6 @@
                 )>Constants.ZERO){
                     throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠淇濆崟涓嬶紝鍔犱繚浜哄憳銆�" + detail.getMemberName() + "銆戝瓨鍦ㄦ棩鏈熷啿绐佺殑鏁版嵁");
                 }
-
-
                 //鍔犱繚
                 ApplyDetail add = new ApplyDetail();
                 add.setApplyId(update.getApplyId());
@@ -573,17 +608,17 @@
                 add.setIdcardNo(detail.getIdcardNo());
                 add.setSex(Constants.getSexByIdCard(detail.getIdcardNo()));
                 add.setMemberName(detail.getMemberName());
+                add.setRemark(detail.getRemark());
                 add.setDuId(detail.getDuId());
-                add.setStartTime(update.getApplyStartTime());
                 add.setStartTime(DateUtil.getMontageDate(update.getApplyStartTime(), 1));
                 add.setEndTime(DateUtil.getMontageDate(detail.getEndTime(), 2));
-                add.setFee(countCyclePriceVO_add.getCyclePrice());
-
+                add.setFee(Constants.addFee(solutions,solutions.getPrice(),insuranceApply.getStartTime(),insuranceApply.getFinalEndTime(),update.getApplyStartTime(),insuranceApply.getEndTime()));
 
                 if(new Date().compareTo(DateUtil.getMontageDate(detail.getStartTime(), 2))>=0){
-                    Integer days = DateUtil.daysBetweenDates(DateUtil.getMontageDate(new Date(), 2), detail.getStartTime()) + 1;
-                    //濡傛灉宸插凡浜х敓璐圭敤锛岃绠楀凡宸蹭骇鐢熻垂鐢�
-                    add.setCurrentFee(this.getApplyPrice(update.getApplyId(), days));
+                    //2024骞�5鏈�8鏃�17:37:23 淇敼 璁$畻浜х敓璐圭敤
+                    add.setCurrentFee(
+                            Constants.produceFee(solutions,add.getFee(),add.getStartTime(),add.getEndTime(),add.getStartTime())
+                    );
                 }else{
                     add.setCurrentFee(BigDecimal.ZERO);
                 }
@@ -603,6 +638,10 @@
                         .eq(ApplyChagneDetail::getId,detail.getId())
                 );
 
+//                if(1==1){
+//                    throw new BusinessException(ResponseStatus.SERVER_ERROR);
+//                }
+
             } else {
                     //鍑忎繚鎿嶄綔
                     //鏌ヨ鍛樺伐鏄湪涓诲崟涓� 鏄惁瀛樺湪鐢熸晥涓殑鏁版嵁
@@ -614,50 +653,61 @@
                     if (oldModel == null || oldModel.getStartTime() == null || oldModel.getStartTime().getTime() > update.getApplyStartTime().getTime()) {
                         throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝鐢ㄦ埛銆�" + detail.getMemberName() + "銆戝師淇濆崟淇℃伅鏈夎锛屽綋鍓嶇敵璇蜂笉鏀寔鍑忎繚澶勭悊锛�");
                     }
-                    //鍑忎繚涓氬姟 浣跨敤鐨勫噺淇濋噾棰�
-                    ApplyChangeCyclePriceDTO applyChangeCyclePriceDTO_reduce = new ApplyChangeCyclePriceDTO();
-                    applyChangeCyclePriceDTO_reduce.setApplyId(update.getApplyId());
-                    applyChangeCyclePriceDTO_reduce.setValidTime(DateUtil.getMontageDate(update.getApplyStartTime(), 2));
-                    //鍑忎繚 闇�瑕佸噺灏戠殑閲戦 鍗� 閫�淇濋渶瑕侀��鍥炵殑璐圭敤
-                    CountCyclePriceVO countCyclePriceVO_reduce = this.getChangeCountCyclePriceVO(applyChangeCyclePriceDTO_reduce);
-                    BigDecimal updateFee = countCyclePriceVO_reduce.getCyclePrice().multiply(new BigDecimal(-1));
-                    //褰撳鎵规椂闂� 澶т簬 鐢宠鐨勬椂闂存椂 璁$畻瀹為檯鍑忓皯閲戦 鍥犱负宸叉墸閲戦浼氬ぇ浜� 搴旀墸閲戦
-                    BigDecimal updateCurrentFee = BigDecimal.ZERO;
-                    if (DateUtil.daysBetweenDates(DateUtil.getMontageDate(new Date(), 2),update.getApplyStartTime()) > 0) {
-                        applyChangeCyclePriceDTO_reduce.setValidTime(DateUtil.getMontageDate(new Date(), 2));
-                        //鑾峰彇 澶т簬瀹℃壒鏃ユ湡瀵艰嚧 澶氬噺鐨勯噾棰�
-                        CountCyclePriceVO timeoutCountCyclePriceVOReduce = this.getChangeCountCyclePriceVO(applyChangeCyclePriceDTO_reduce);
-                        updateCurrentFee = timeoutCountCyclePriceVOReduce.getCyclePrice().subtract(countCyclePriceVO_reduce.getCyclePrice());
+                    if(!(oldModel.getStartTime().getTime()<update.getDelValidTime().getTime()&& oldModel.getEndTime().getTime()>=update.getDelValidTime().getTime())){
+                        throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝鐢ㄦ埛銆�" + detail.getMemberName() + "銆戝噺淇濇棩鏈熸湭鍦ㄤ繚鍗曡褰曟棩鏈熶腑锛�");
                     }
 
+                    Date delValidTime = oldModel.getStartTime().compareTo(update.getDelValidTime())!=0?
+                            DateUtil.getMontageDate(update.getDelValidTime(), 3):
+                            DateUtil.getMontageDate(update.getDelValidTime(), 2);
+
+                    BigDecimal sumFee = Objects.isNull(insuranceApply.getServerCost())?
+                            solutions.getPrice():
+                            solutions.getPrice().add(insuranceApply.getServerCost());
+                    // 鍑忎繚鍚� 鎬昏垂鐢�
+                    BigDecimal updateFee =  Constants.reduceFee(
+                            solutions,
+                            sumFee
+                            ,insuranceApply.getStartTime(),insuranceApply.getFinalEndTime(),oldModel.getStartTime(),delValidTime
+                    ) ;
+                    //褰撳鎵规椂闂� 澶т簬 鐢宠鐨勬椂闂存椂 璁$畻瀹為檯鍑忓皯閲戦 鍥犱负宸叉墸閲戦浼氬ぇ浜� 搴旀墸閲戦
+                    BigDecimal updateCurrentFee = BigDecimal.ZERO;
+                    if (DateUtil.daysBetweenDates(DateUtil.getMontageDate(new Date(), 2),oldModel.getStartTime()) > 0) {
+                        //// 2024骞�5鏈�8鏃�17:37:23 淇敼 璁$畻浜х敓璐圭敤
+                        updateCurrentFee = Constants.produceFee(solutions,sumFee,insuranceApply.getStartTime(),insuranceApply.getEndTime(),
+                                oldModel.getStartTime()
+                        );
+                    }
 
                     applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
-                            .setSql(" fee = ifnull(fee,0)+" + updateFee)
+                            .setSql(" fee = " + updateFee)
                             .setSql(" current_fee = " + updateCurrentFee)
-                            .set(insuranceApply.getStartTime().compareTo(update.getApplyStartTime())!=0,ApplyDetail::getEndTime, DateUtil.getMontageDate(update.getApplyStartTime(), 3))
-                            .set(insuranceApply.getStartTime().compareTo(update.getApplyStartTime())==0,ApplyDetail::getEndTime, DateUtil.getMontageDate(update.getApplyStartTime(), 2))
+                            .set(ApplyDetail::getEndTime, delValidTime)
                             .set(ApplyDetail::getEditor, update.getEditor())
                             .set(ApplyDetail::getEditDate, update.getEditDate())
                             .eq(ApplyDetail::getId, oldModel.getId())
                     );
-                    totalFee = totalFee.add(updateFee);
+                    totalFee = totalFee.add(updateFee).subtract(oldModel.getFee());
                     currentFee = currentFee.add(updateCurrentFee);
 
                     //淇敼 鍛樺伐鎶曚繚鏄庣粏璁板綍 鍘嗗彶鏁版嵁
                     memberInsuranceJoinMapper.update(null, new UpdateWrapper<MemberInsurance>().lambda()
-                            .setSql(" fee = ifnull(fee,0)+" + updateFee)
-                            .set(insuranceApply.getStartTime().compareTo(update.getApplyStartTime())!=0,MemberInsurance::getEndTime,DateUtil.getMontageDate(update.getApplyStartTime(), 3))
-                            .set(insuranceApply.getStartTime().compareTo(update.getApplyStartTime())==0,MemberInsurance::getEndTime,DateUtil.getMontageDate(update.getApplyStartTime(), 2))
-                            .set(MemberInsurance::getStartTime, update.getApplyStartTime())
+                            .setSql(" fee = " + updateFee)
+                            .set(MemberInsurance::getEndTime, delValidTime) 
                             .eq(MemberInsurance::getRelationId, oldModel.getId())
                     );
 
                     //淇敼涓氬姟鏄庣粏琛屾暟鎹疄闄呮壒鍗曟棩鏈�
                     applyChangeDetailJoinMapper.update(null,new UpdateWrapper<ApplyChagneDetail>().lambda()
-                            .set(ApplyChagneDetail::getFee,updateFee)
-                            .set(ApplyChagneDetail::getEndTime,DateUtil.getMontageDate(update.getApplyStartTime(), 3))
+                            .set(ApplyChagneDetail::getFee,updateFee.subtract(oldModel.getFee()))
+                            .set( ApplyChagneDetail::getEndTime, delValidTime)
                             .eq(ApplyChagneDetail::getId,detail.getId())
                     );
+
+//                if(1==1){
+//                    throw new BusinessException(ResponseStatus.SERVER_ERROR);
+//                }
+
 
             }
 
@@ -668,10 +718,11 @@
             member.setEndTime(detail.getEndTime());
             memberMapper.updateById(member);
 
-            if (memberInsuranceList != null && memberInsuranceList.size() > 0) {
-                memberInsuranceJoinMapper.insertBatchSomeColumn(memberInsuranceList);
-            }
         }
+        if (memberInsuranceList != null && memberInsuranceList.size() > 0) {
+            memberInsuranceJoinMapper.insertBatchSomeColumn(memberInsuranceList);
+        }
+
         if (totalFee.compareTo(new BigDecimal(0)) != 0) {
             //濡傛灉淇濆崟閲戦鍙戠敓缂栫爜锛屾洿鏂版�讳繚鍗曢噾棰�
             insuranceApplyMapper.update(null, new UpdateWrapper<InsuranceApply>().lambda()
@@ -778,6 +829,11 @@
     @Override
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
     public Integer create(ApplyChange applyChange) {
+        if(applyChange.getType().equals(Constants.ZERO)){
+            //2024骞�5鏈�9鏃�14:59:24  淇敼 榛樿鍏ュ綋鍓嶅ぉ
+            applyChange.setValidTime(DateUtil.getMontageDate(new Date(),1));
+        }
+
         if (Objects.isNull(applyChange)
                 || Objects.isNull(applyChange.getApplyId())
                 || Objects.isNull(applyChange.getValidTime())
@@ -809,14 +865,12 @@
         if(Objects.isNull(solutions)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌淇濋櫓鏂规");
         }
-        if(solutions.getDataType().equals(Constants.ONE)){
-            solutions = solutionsMapper.selectOne(new QueryWrapper<Solutions>().lambda().eq(Solutions::getBaseId,solutions.getBaseId()).eq(Solutions::getDataType,Constants.TWO).last("limit 1"));
-            if(Objects.isNull(solutions)){
-                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈煡璇㈠埌鏂规鏈�鏂扮増鏈俊鎭�");
-            }
-        }
-
-
+//        if(solutions.getDataType().equals(Constants.ONE)){
+//            solutions = solutionsMapper.selectOne(new QueryWrapper<Solutions>().lambda().eq(Solutions::getBaseId,solutions.getBaseId()).eq(Solutions::getDataType,Constants.TWO).last("limit 1"));
+//            if(Objects.isNull(solutions)){
+//                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈煡璇㈠埌鏂规鏈�鏂扮増鏈俊鎭�");
+//            }
+//        }
         CompanySolution companySolution = companySolutionMapper.selectOne(new QueryWrapper<CompanySolution>().lambda()
                 .eq(CompanySolution::getCompanyId,loginUserInfo.getCompanyId())
                 .eq(CompanySolution::getSolutionBaseId,solutions.getBaseId())
@@ -840,27 +894,31 @@
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀛樺湪杩涜涓殑鍔犲噺淇�/鎹㈠巶鐢宠");
         };
 
-
         applyChange.setCreateDate(new Date());
         applyChange.setCreator(loginUserInfo.getId());
         applyChange.setEditor(loginUserInfo.getId());
         applyChange.setEditDate(new Date());
         applyChange.setIsdeleted(Constants.ZERO);
         //鏍规嵁鐢宠鏃ユ湡 澶勭悊鍔犲噺淇濈殑 瀹為檯鐢熸晥鏃ユ湡
-        if(Objects.nonNull(solutions.getAddValidDays())){
-            applyChange.setApplyStartTime(
-                    DateUtil.afterDateByType(applyChange.getValidTime(),0,solutions.getAddValidDays())
-            );
+        if(applyChange.getType().equals(Constants.ZERO)){
+            if(Objects.nonNull(solutions.getAddValidDays())){
+                applyChange.setApplyStartTime(
+                        DateUtil.afterDateByType(applyChange.getValidTime(),0,solutions.getAddValidDays())
+                );
+            }else{
+                applyChange.setApplyStartTime(applyChange.getValidTime());
+            }
+            if(Objects.nonNull(solutions.getDelValidDays())){
+                applyChange.setDelValidTime(
+                        DateUtil.afterDateByType(applyChange.getValidTime(),0,solutions.getDelValidDays())
+                );
+            }else{
+                applyChange.setDelValidTime(applyChange.getValidTime());
+            }
         }else{
             applyChange.setApplyStartTime(applyChange.getValidTime());
         }
-        if(Objects.nonNull(solutions.getDelValidDays())){
-            applyChange.setDelValidTime(
-                    DateUtil.afterDateByType(applyChange.getValidTime(),0,solutions.getDelValidDays())
-            );
-        }else{
-            applyChange.setDelValidTime(applyChange.getValidTime());
-        }
+
         applyChange.setStatus(Constants.ZERO);
         applyChangeMapper.insert(applyChange);
 
@@ -874,7 +932,10 @@
         Constants.ApplyLogType applyLogType = Constants.ApplyLogType.CA_COMPANY_COMMIT;
         ApplyLog log = new ApplyLog(applyChange,applyLogType.getName(),"",applyChange.getId(),applyLogType.getKey(), null, null);
         applyLogMapper.insert(log);
-        
+
+//        if(1==1){
+//            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀛樺湪杩涜涓殑鍔犲噺淇�/鎹㈠巶鐢宠");
+//        }
 
         return applyChange.getId();
     }
@@ -1028,12 +1089,16 @@
             }
 
             //鍔犱繚鏄庣粏鏁版嵁 璁$畻閲戦  鏍规嵁鎵瑰崟鏃堕棿 璁$畻
-            applyChangeCyclePriceDTO.setValidTime(DateUtil.getMontageDate(applyChange.getValidTime(),1));
-            CountCyclePriceVO countCyclePriceVO =  this.getChangeCountCyclePriceVO(applyChangeCyclePriceDTO);
-            BigDecimal detailFee = countCyclePriceVO.getCyclePrice();
+//            applyChangeCyclePriceDTO.setValidTime(DateUtil.getMontageDate(applyChange.getValidTime(),1));
+//            CountCyclePriceVO countCyclePriceVO =  this.getChangeCountCyclePriceVO(applyChangeCyclePriceDTO);
+//            BigDecimal detailFee = countCyclePriceVO.getCyclePrice();
+            BigDecimal sumPrice = Objects.isNull(insuranceApply.getServerCost())?solutions.getPrice():solutions.getPrice().add(insuranceApply.getServerCost());
+            BigDecimal detailFee = Constants.addFee(solutions,
+                    sumPrice
+                    ,insuranceApply.getStartTime(),insuranceApply.getFinalEndTime(),
+                    applyChange.getApplyStartTime(),insuranceApply.getEndTime());
 
             this.addChangeDetail(applyChange,addDetailList,duWorktypeList,duSolutionList,insuranceApply,solutions,loginUserInfo,detailFee);
-
             fee = addDetailList.stream().map(ApplyChagneDetail::getFee).reduce(BigDecimal.ZERO,BigDecimal::add);
         }
 
@@ -1051,21 +1116,14 @@
             if(Objects.isNull(solutions.getCanReduce()) || solutions.getCanReduce().equals(Constants.ZERO)){
                 throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璇ヤ繚闄╂柟妗堟棤娉曡繘琛屽噺淇�");
             }
-//            if(companySolution.getCanReduce().equals(Constants.ZERO)){
-//                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璇ヤ紒涓氬垎閰嶄繚闄╂柟妗堟棤娉曡繘琛屽噺淇�");
-//            }
-            //鍑忎繚鏄庣粏鏁版嵁 璁$畻閲戦  鏍规嵁鎵瑰崟鏃堕棿 鍓嶄竴澶� 璁$畻
-            applyChangeCyclePriceDTO.setValidTime(DateUtil.getMontageDate(applyChange.getValidTime(),3));
-
-            CountCyclePriceVO countCyclePriceVO =  this.getChangeCountCyclePriceVO(applyChangeCyclePriceDTO);
-            BigDecimal detailFee = countCyclePriceVO.getCyclePrice();
-            this.delChangeDetail(applyChange,delDetailList,insuranceApply,solutions,loginUserInfo,detailFee,applyChangeCyclePriceDTO.getValidTime());
+            this.delChangeDetail(applyChange,delDetailList,insuranceApply,solutions,loginUserInfo, BigDecimal.ZERO,
+                    DateUtil.getMontageDate(applyChange.getDelValidTime(),3));
             fee = fee.add(delDetailList.stream().map(ApplyChagneDetail::getFee).reduce(BigDecimal.ZERO,BigDecimal::add));
         }
 
         if(Objects.nonNull(solutions.getDelOnlyReplace())&& solutions.getDelOnlyReplace().equals(Constants.ONE)){
             if(delDetailSize > addDetailSize){
-                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璇ヤ繚闄╂柟妗堜粎鏀寔鏇挎崲");
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "璇ヤ繚闄╂柟妗堜粎鏀寔鏇挎崲锛堝噺淇濅汉鏁颁笉寰楀ぇ浜庡姞淇濅汉鏁帮級");
             }
         }
 
@@ -1124,8 +1182,8 @@
                     .lambda()
                     .eq(ApplyDetail::getApplyId,applyChange.getApplyId())
                     .eq(ApplyDetail::getIdcardNo,applyChagneDetail.getIdcardNo())
-                    .le(ApplyDetail::getStartTime,DateUtil.getMontageDate(applyChange.getApplyStartTime(),1))
-                    .ge(ApplyDetail::getEndTime,DateUtil.getMontageDate(applyChange.getApplyStartTime(),3))
+                    .le(ApplyDetail::getStartTime,DateUtil.getMontageDate(applyChange.getDelValidTime(),1))
+                    .ge(ApplyDetail::getEndTime,DateUtil.getMontageDate(applyChange.getDelValidTime(),3))
             )<=Constants.ZERO){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠淇濆崟涓嬶紝鍑忎繚浜哄憳銆�" + applyChagneDetail.getMemberName() + "銆戞湭鏌ヨ鍒扮鍚堟壒鍗曟棩鏈熺殑鏁版嵁");
             }
@@ -1148,8 +1206,8 @@
             List<ApplyDetail> applyDetailList = applyDetailJoinMapper.selectList(new QueryWrapper<ApplyDetail>().lambda()
                     .eq(ApplyDetail::getApplyId, applyChange.getApplyId())
                     .eq(ApplyDetail::getMemberId, applyChagneDetail.getMemberId())
-                    .le(ApplyDetail::getStartTime,DateUtil.getMontageDate(applyChange.getApplyStartTime(),1))
-                    .ge(ApplyDetail::getEndTime,DateUtil.getMontageDate(applyChange.getApplyStartTime(),3))
+                    .le(ApplyDetail::getStartTime,DateUtil.getMontageDate(applyChange.getDelValidTime(),1))
+                    .ge(ApplyDetail::getEndTime,DateUtil.getMontageDate(applyChange.getDelValidTime(),3))
                     .orderByDesc(ApplyDetail::getCreateDate));
             if (applyDetailList.size() > Constants.ONE) {
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍑忎繚浜哄憳銆�" + applyChagneDetail.getMemberName() + "銆戜繚鍗曚俊鎭紓甯革紝瀛樺湪澶氭潯鏁版嵁");
@@ -1158,8 +1216,6 @@
             if (applyChange.getValidTime().compareTo(applyDetail.getEndTime()) > 0) {
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "鍑忎繚浜哄憳銆�" + applyChagneDetail.getMemberName() + "銆戜繚鍗曚繚闅滄棩鏈熻嚦锛氥��" + applyDetail.getEndTime() + "銆戞棤娉曢�氳繃鏈鐢宠");
             }
-
-
             applyChagneDetail.setPrice(applyDetail.getPrice());
             applyChagneDetail.setCreateDate(new Date());
             applyChagneDetail.setCreator(loginUserInfo.getId());
@@ -1174,13 +1230,20 @@
             member.setDuId(applyChagneDetail.getDuId());
             member.setWorktypeId(applyChagneDetail.getWorktypeId());
             member.setStartTime(applyChagneDetail.getStartTime());
-            member.setEndTime(applyChagneDetail.getEndTime());
+            member.setEndTime(applyDetail.getEndTime());
             memberMapper.updateById(member);
-
             //鏌ヨ鍑忎繚鏃ユ湡
-            Integer delDays = DateUtil.daysBetweenDates(applyDetail.getEndTime(),endTime);
-
-            applyChagneDetail.setFee( new BigDecimal(delDays).multiply(applyDetail.getPrice()).multiply(new BigDecimal(-1)));
+//            Integer delDays = DateUtil.daysBetweenDates(applyDetail.getEndTime(),endTime);
+//            ;
+            applyChagneDetail.setFee(
+                    Constants.reduceFee(solutions,
+                                    Objects.isNull(insuranceApply.getServerCost())?
+                                    solutions.getPrice():solutions.getPrice().add(insuranceApply.getServerCost()),
+                                    insuranceApply.getStartTime(),
+                                    insuranceApply.getFinalEndTime(),
+                                    applyDetail.getStartTime(),endTime)
+                            .subtract(applyDetail.getFee()
+            ));
             applyChagneDetailJoinMapper.insert(applyChagneDetail);
         }
     }
@@ -1248,6 +1311,9 @@
                     member.setName(applyChagneDetail.getMemberName());
                     member.setCompanyId(insuranceApply.getCompanyId());
                     member.setSex(Constants.getSexByIdCard(applyChagneDetail.getIdcardNo()));
+                    if(!IdcardUtil.isValidCard(applyDetail.getIdcardNo())){
+                        throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鍔犱繚鍛樺伐淇℃伅韬唤璇佷俊鎭敊璇痆"+member.getName()+"]");
+                    }
                     member.setIdcardNo(applyChagneDetail.getIdcardNo());
                     member.setApplyId(insuranceApply.getId());
                     member.setDuId(applyChagneDetail.getDuId());
@@ -1569,7 +1635,7 @@
             }else if(pageWrap.getModel().getSolutionType()!=null && pageWrap.getModel().getSolutionType() ==1){
                 queryWrapper.eq(Solutions::getShopId,loginUserInfo.getCompanyId());
             }else{
-                queryWrapper.apply("((t1.type=0 and exists(select cs.id from company_solution cs where cs.isdeleted=0 AND cs.SOLUTION_ID = t1.SOLUTION_ID  and cs.shop_id="+loginUserInfo.getCompanyId()+")) or (" +
+                queryWrapper.apply("((t2.type=0 and exists(select cs.id from company_solution cs where cs.isdeleted=0 AND cs.SOLUTION_ID = t1.SOLUTION_ID  and cs.shop_id="+loginUserInfo.getCompanyId()+")) or (" +
                         "t2.type=1 and t2.shop_id="+loginUserInfo.getCompanyId()+"))") ;
             }
         }else{
@@ -2082,18 +2148,19 @@
                 && DateUtil.compareDate( applyChangeCyclePriceDTO.getValidTime(),insuranceApply.getEndTime()) >= Constants.ZERO)) {
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "鐢宠鏃ユ湡鏈浜庝繚鍗曟棩鏈熷唴锛屾棤娉曡繘琛岃鎿嶄綔");
         }
-        //鎬诲ぉ鏁�
-        Integer sumDays = DateUtil.daysBetweenDates(insuranceApply.getEndTime(),insuranceApply.getStartTime()) + 1;
-        //鍔犲噺淇� 鍒扮粨鏉熺殑澶╂暟
-        Integer optDays = DateUtil.daysBetweenDates(insuranceApply.getEndTime(),applyChangeCyclePriceDTO.getValidTime()) + 1;
-
-        CountCyclePriceVO countCyclePriceVO = Constants.countPriceVO(insuranceApply.getStartTime(),solutions);
-        //鎬婚噾棰�
-        BigDecimal sumPrice = countCyclePriceVO.getCyclePrice();
+        BigDecimal sumPrice = Objects.isNull(insuranceApply.getServerCost())?solutions.getPrice():solutions.getPrice().add(insuranceApply.getServerCost());
         CountCyclePriceVO returnCountCyclePriceVO = new CountCyclePriceVO();
-        //鍔犲噺淇濋噾棰�
-//        returnCountCyclePriceVO.setCyclePrice(sumPrice.multiply(new BigDecimal(optDays)).divide(new BigDecimal(sumDays),2, RoundingMode.HALF_UP));
-        returnCountCyclePriceVO.setCyclePrice(applyDetail.getPrice().multiply(new BigDecimal(optDays)).setScale(2, RoundingMode.HALF_UP));
+        returnCountCyclePriceVO.setCyclePrice(Constants.addFee(solutions,
+                sumPrice
+                ,insuranceApply.getStartTime(),insuranceApply.getFinalEndTime(),
+                DateUtil.afterDateByType(applyChangeCyclePriceDTO.getValidTime(),0,solutions.getAddValidDays()),insuranceApply.getEndTime()));
+        BigDecimal reducePrice =  solutions.getPrice().subtract(Constants.reduceFee(solutions,
+                        sumPrice
+                        ,insuranceApply.getStartTime(),insuranceApply.getFinalEndTime()
+                ,insuranceApply.getStartTime(),
+                DateUtil.getMontageDate(
+                        DateUtil.afterDateByType(applyChangeCyclePriceDTO.getValidTime(),0,solutions.getDelValidDays()),3)));
+        returnCountCyclePriceVO.setReducePrice(reducePrice);
         return returnCountCyclePriceVO;
     }
 
@@ -2300,4 +2367,62 @@
 
     }
 
+
+
+
+//    BigDecimal cycle1 = new BigDecimal(days).divide(insureCycleUnit.getDays(),0,RoundingMode.CEILING);
+//
+//                if(solutions.getTimeUnit().equals(Constants.TimeUnit.MONTH.getValue())){
+//                    if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())){
+//                        BigDecimal cycle = new BigDecimal(days).divide(Constants.InsureCycleUnit.HALF_MONTH.getDays(),0,RoundingMode.CEILING);
+//                        return fee.multiply(cycle).divide(new BigDecimal(2),2, RoundingMode.HALF_UP);
+//                    }else{
+//                        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏂规閰嶇疆閿欒");
+//                    }
+//                }else if(solutions.getTimeUnit().equals(Constants.TimeUnit.QUARTER.getValue())){
+//                    if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())){
+//                        BigDecimal cycle = new BigDecimal(days).divide(Constants.InsureCycleUnit.HALF_MONTH.getDays(),0,RoundingMode.CEILING);
+//                        return fee.multiply(cycle).divide(new BigDecimal(6),2, RoundingMode.HALF_UP);
+//                    }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())){
+//                        BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(new Date(),startTime));
+//                        return fee.multiply(cycle).divide(new BigDecimal(3),2, RoundingMode.HALF_UP);
+//                    }else{
+//                        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏂规閰嶇疆閿欒");
+//                    }
+//                }else if(solutions.getTimeUnit().equals(Constants.TimeUnit.HALF_YEAR.getValue())){
+//                    if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())){
+//                        BigDecimal cycle = new BigDecimal(days).divide(Constants.InsureCycleUnit.HALF_MONTH.getDays(),0,RoundingMode.CEILING);
+//                        return fee.multiply(cycle).divide(new BigDecimal(12),2, RoundingMode.HALF_UP);
+//                    }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())){
+//                        BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(new Date(),startTime));
+//                        return fee.multiply(cycle).divide(new BigDecimal(6),2, RoundingMode.HALF_UP);
+//                    }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())){
+//                        BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(new Date(),startTime));
+//                        cycle = cycle.divide(new BigDecimal(3),0,RoundingMode.CEILING);
+//                        return fee.multiply(cycle).divide(new BigDecimal(2),2, RoundingMode.HALF_UP);
+//                    }else{
+//                        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏂规閰嶇疆閿欒");
+//                    }
+//                }else if(solutions.getTimeUnit().equals(Constants.TimeUnit.YEAR.getValue())){
+//                    if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_MONTH.getValue())){
+//                        BigDecimal cycle = new BigDecimal(days).divide(Constants.InsureCycleUnit.HALF_MONTH.getDays(),0,RoundingMode.CEILING);
+//                        return fee.multiply(cycle).divide(new BigDecimal(24),2, RoundingMode.HALF_UP);
+//                    }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.MONTH.getValue())){
+//                        BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(new Date(),startTime));
+//                        return fee.multiply(cycle).divide(new BigDecimal(12),2, RoundingMode.HALF_UP);
+//                    }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.QUARTER.getValue())){
+//                        BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(new Date(),startTime));
+//                        cycle = cycle.divide(new BigDecimal(3),0,RoundingMode.CEILING);
+//                        return fee.multiply(cycle).divide(new BigDecimal(4),2, RoundingMode.HALF_UP);
+//                    }else if(solutions.getInsureCycleUnit().equals(Constants.InsureCycleUnit.HALF_YEAR.getValue())){
+//                        BigDecimal cycle = new BigDecimal(DateUtil.getDifferenceMonths(new Date(),startTime));
+//                        cycle = cycle.divide(new BigDecimal(6),0,RoundingMode.CEILING);
+//                        return fee.multiply(cycle).divide(new BigDecimal(2),2, RoundingMode.HALF_UP);
+//                    }else{
+//                        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏂规閰嶇疆閿欒");
+//                    }
+//                }else{
+//                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏂规閰嶇疆閿欒");
+//                }
+
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/DispatchUnitServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/DispatchUnitServiceImpl.java
index 3e7672d..874e23a 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/DispatchUnitServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/DispatchUnitServiceImpl.java
@@ -404,6 +404,7 @@
         }
         if(dispatchUnitMapper.selectCount(new QueryWrapper<DispatchUnit>().lambda()
                 .ne(DispatchUnit::getId,saveDispatchUnitDTO.getId())
+                .ne(DispatchUnit::getBaseId,saveDispatchUnitDTO.getId())
                 .eq(DispatchUnit::getCompanyId,loginUserInfo.getCompanyId())
                 .eq(DispatchUnit::getName,saveDispatchUnitDTO.getName())
                 .eq(DispatchUnit::getIsdeleted,Constants.ZERO)
@@ -418,6 +419,11 @@
         dispatchUnit.setEditor(loginUserInfo.getId());
         dispatchUnitMapper.updateById(dispatchUnit);
 
+        dispatchUnitMapper.update(null,new UpdateWrapper<DispatchUnit>().lambda().set(DispatchUnit::getDataType,Constants.ONE).eq(DispatchUnit::getBaseId,dispatchUnit.getId())
+                .eq(DispatchUnit::getDataType,Constants.TWO)
+        );
+
+
         //瀛樺偍鎿嶄綔璁板綍
         this.saveDuLog(dispatchUnit,Constants.DispatchUnitLogType.EDIT_UNIT,null);
 
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/InsuranceApplyServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/InsuranceApplyServiceImpl.java
index a259e96..07136ac 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/InsuranceApplyServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/InsuranceApplyServiceImpl.java
@@ -1,5 +1,6 @@
 package com.doumee.service.business.impl;
 
+import cn.hutool.core.util.IdcardUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.annotation.excel.ExcelExporter;
@@ -98,6 +99,8 @@
     private DuSolutionJoinMapper duSolutionJoinMapper;
     @Autowired
     private DuWorktypeMapper duWorktypeMapper;
+    @Autowired
+    private DuWorkTypeJoinMapper duWorkTypeJoinMapper;
 
     @Autowired
     private NoticesMapper noticesMapper;
@@ -235,11 +238,17 @@
         update.setCode(insuranceApply.getCode());
         update.setEndTime(actEndTime);
         update.setStartTime(insuranceApply.getStartTime());
+        CountCyclePriceDTO countCyclePriceDTO = new CountCyclePriceDTO();
+        countCyclePriceDTO.setSolutionsId(model.getSolutionId());
+        countCyclePriceDTO.setStartDate(insuranceApply.getStartTime());
+        update.setFinalEndTime(this.getCountCyclePriceVO(countCyclePriceDTO).getEndDate());
         insuranceApplyMapper.updateById(update);
 
         //淇敼鏄庣粏琛岀殑寮�濮嬬粨鏉熸棩鏈�
-        applyDetailMapper.update(null,new UpdateWrapper<ApplyDetail>().lambda().set(ApplyDetail::getStartTime,insuranceApply.getStartTime())
-                .set(ApplyDetail::getEndTime,actEndTime).eq(ApplyDetail::getApplyId,model.getId()));
+        applyDetailMapper.update(null,new UpdateWrapper<ApplyDetail>().lambda()
+                .set(ApplyDetail::getStartTime,insuranceApply.getStartTime())
+                .set(ApplyDetail::getEndTime,actEndTime)
+                .eq(ApplyDetail::getApplyId,model.getId()));
 
         multifileMapper.update(null,new UpdateWrapper<Multifile>().lambda()
                 .eq(Multifile::getIsdeleted,Constants.ZERO)
@@ -313,6 +322,7 @@
             memberInsuranceJoinMapper.insertBatchSomeColumn(memberInsuranceList);
         }
 
+        this.updateApplyCurrentFee(insuranceApply.getId(),null);
         return  1;
     }
 
@@ -1596,18 +1606,18 @@
         insuranceApply.setCheckUserId(loginUserInfo.getId());
         insuranceApply.setStatus(insuranceApplyStatus.getKey());
         insuranceApply.setUnionApplyTbdStatus(Constants.ZERO);
-
         CountCyclePriceDTO countCyclePriceDTO = new CountCyclePriceDTO();
         countCyclePriceDTO.setSolutionsId(insuranceApply.getSolutionId());
         countCyclePriceDTO.setStartDate(insuranceApply.getStartTime());
         CountCyclePriceVO  countCyclePriceVO = this.getCountCyclePriceVO(countCyclePriceDTO);
         insuranceApply.setApplyEndTime(countCyclePriceVO.getEndDate());
         insuranceApply.setEndTime(countCyclePriceVO.getEndDate());
+        insuranceApply.setFinalEndTime(countCyclePriceVO.getEndDate());
         insuranceApplyMapper.insert(insuranceApply);
 
 
         //澶勭悊涓嬬骇鏁版嵁
-        this.dealApplyDetailData(insuranceApply,solutions,applyDetailList,loginUserInfo,countCyclePriceVO);
+        this.dealApplyDetailData(insuranceApply,solutions,applyDetailList,loginUserInfo,countCyclePriceVO,true);
         InsuranceApply updBean = new InsuranceApply();
         updBean.setId(insuranceApply.getId());
         updBean.setFee(applyDetailList.stream().map(ApplyDetail::getFee).reduce(BigDecimal.ZERO,BigDecimal::add));
@@ -1643,7 +1653,6 @@
                 noticesMapper.insert(shopNotices);
             }
         }
-
         return insuranceApply.getId();
     }
 
@@ -1709,7 +1718,7 @@
         }
 
         //澶勭悊涓嬬骇鏁版嵁
-        this.dealApplyDetailData(insuranceApply,solutions,applyDetailList,loginUserInfo,countCyclePriceVO);
+        this.dealApplyDetailData(insuranceApply,solutions,applyDetailList,loginUserInfo,countCyclePriceVO,false);
         insuranceApply.setFee(applyDetailList.stream().map(ApplyDetail::getFee).reduce(BigDecimal.ZERO,BigDecimal::add));
         insuranceApplyMapper.updateById(insuranceApply);
         //瀛樺偍鏃ュ織鏁版嵁
@@ -1735,7 +1744,8 @@
 
 
 
-    public void dealApplyDetailData(InsuranceApply insuranceApply,Solutions solutions,List<ApplyDetail> applyDetailList,LoginUserInfo loginUserInfo,CountCyclePriceVO  countCyclePriceVO){
+    public void dealApplyDetailData(InsuranceApply insuranceApply,Solutions solutions,List<ApplyDetail> applyDetailList,
+                                    LoginUserInfo loginUserInfo,CountCyclePriceVO  countCyclePriceVO,Boolean checkNewData){
         //鏌ヨ淇濋櫓鏂规涓嬬殑鎵�鏈夋淳閬e崟浣�
         List<DuSolution>  duSolutionList = duSolutionJoinMapper.selectJoinList(DuSolution.class,new MPJLambdaWrapper<DuSolution>()
                 .selectAll(DuSolution.class)
@@ -1744,16 +1754,22 @@
                 .eq(DispatchUnit::getIsdeleted,Constants.ZERO)
                 .eq(DispatchUnit::getUnitStatus,Constants.ONE)
                 .eq(DuSolution::getIsdeleted,Constants.ZERO)
+                .eq(checkNewData,DispatchUnit::getDataType,Constants.TWO)
                 .eq(DuSolution::getStatus,Constants.ONE)
-                .eq(DuSolution::getSolutionId,insuranceApply.getSolutionId()));
+                .eq(DuSolution::getSolutionId,insuranceApply.getSolutionId())
+                .apply(" t1.BASE_ID in ( select du.id from dispatch_unit du where du.STATUS = 0 and du.ISDELETED = 0 ) ")
+        );
         if(!CollectionUtils.isNotEmpty(duSolutionList)){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鏁版嵁寮傚父锛氫繚闄╂柟妗堜笅鏈煡璇㈠埌娲鹃仯鍗曚綅");
         }
         //鏌ヨ鎵�鏈夋淳閬e崟浣嶄笅鐨勫伐绉�
         List<Integer> duSolutionIdList = duSolutionList.stream().map(i->i.getId()).collect(Collectors.toList());
-        List<DuWorktype> duWorktypeList = duWorktypeMapper.selectList(new QueryWrapper<DuWorktype>().lambda()
+        List<DuWorktype> duWorktypeList = duWorkTypeJoinMapper.selectJoinList(DuWorktype.class,new MPJLambdaWrapper<DuWorktype>()
+                .selectAll(DuWorktype.class)
+                .innerJoin(Worktype.class,Worktype::getId,DuWorktype::getWorkTypeId)
                 .eq(DuWorktype::getIsdeleted,Constants.ZERO)
                 .eq(DuWorktype::getStatus,Constants.ONE)
+                .eq(checkNewData,Worktype::getDataType,Constants.TWO)
                 .in(DuWorktype::getDuSolutionId,duSolutionIdList));
         if(!CollectionUtils.isNotEmpty(duWorktypeList)){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鏁版嵁寮傚父锛氫繚闄╂柟妗堜笅鏈煡璇㈠埌宸ョ淇℃伅");
@@ -1794,12 +1810,16 @@
                         member.setName(applyDetail.getMemberName());
                         member.setCompanyId(insuranceApply.getCompanyId());
                         member.setSex(Constants.getSexByIdCard(applyDetail.getIdcardNo()));
+                        if(!IdcardUtil.isValidCard(applyDetail.getIdcardNo())){
+                            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鎶曚繚鍛樺伐淇℃伅韬唤璇佷俊鎭敊璇痆"+member.getName()+"]");
+                        }
                         member.setIdcardNo(applyDetail.getIdcardNo());
                         member.setApplyId(insuranceApply.getId());
                         member.setStartTime(applyDetail.getStartTime());
                         member.setEndTime(applyDetail.getEndTime());
                         member.setDuId(applyDetail.getDuId());
                         member.setWorktypeId(applyDetail.getWorktypeId());
+
                         memberMapper.insert(member);
                     }else{
                         member.setApplyId(insuranceApply.getId());
@@ -2516,38 +2536,38 @@
      */
     @Override
     @Transactional(rollbackFor = {Exception.class,BusinessException.class})
-    public void updateApplyCurrentFee(Integer id){
+    public void updateApplyCurrentFee(Integer id,Integer unionId){
         List<InsuranceApply> insuranceApplyList = insuranceApplyJoinMapper.selectJoinList(InsuranceApply.class,new MPJLambdaWrapper<InsuranceApply>()
                 .selectAll(InsuranceApply.class)
                 .eq(InsuranceApply::getIsdeleted,Constants.ZERO)
                 .in(InsuranceApply::getStatus,Constants.InsuranceApplyStatus.UPLOAD_INSURANCE.getKey(),Constants.InsuranceApplyStatus.WTB_DONE.getKey())
                 .eq(!Objects.isNull(id),InsuranceApply::getId,id)
+                .eq(!Objects.isNull(unionId),InsuranceApply::getUnionApplyId,unionId)
                 .le(InsuranceApply::getStartTime,DateUtil.getDate(new Date(),"yyyy-MM-dd") + " 00:00:00")
                 .ge(InsuranceApply::getEndTime,DateUtil.getDate(new Date(),"yyyy-MM-dd") + " 23:59:59")
         );
-
         if(CollectionUtils.isNotEmpty(insuranceApplyList)){
             for (InsuranceApply insuranceApply:insuranceApplyList) {
-//                Solutions solutions = solutionsMapper.selectById(insuranceApply.getSolutionId());
-//                if(Objects.isNull(solutions)){
-//                    continue;
-//                }
+                Solutions solutions = solutionsMapper.selectById(insuranceApply.getSolutionId());
+                if(Objects.isNull(solutions)){
+                    continue;
+                }
                 BigDecimal sumAmount = BigDecimal.ZERO;
                 List<ApplyDetail> applyDetailList = applyDetailMapper
                         .selectList(new QueryWrapper<ApplyDetail>().lambda()
                                 .eq(ApplyDetail::getApplyId,insuranceApply.getId()));
                 if(CollectionUtils.isNotEmpty(applyDetailList)){
                     for (ApplyDetail applyDetail: applyDetailList) {
-                        //2024-1-30 10:04:24 淇敼 鏍规嵁瀹為檯澶╂暟杩涜璁$畻 褰撳墠璐圭敤  鎬婚噾棰�/鎬诲ぉ鏁�*瀹為檯澶╂暟
-//                        Integer maxDays = DateUtil.calculateBetween(applyDetail.getStartTime(),applyDetail.getEndTime(),0);
-                        BigDecimal fee = applyDetail.getFee();
+                        BigDecimal fee =  Objects.isNull(insuranceApply.getServerCost())?
+                                solutions.getPrice():
+                                solutions.getPrice().add(insuranceApply.getServerCost());
+                        //鍦ㄥ紑濮嬬粨鏉熸棩鏈熶箣闂�
                         if(applyDetail.getStartTime().compareTo(new Date()) <= 0 && applyDetail.getEndTime().compareTo(new Date()) >= 0 ){
-                            Integer days =  DateUtil.calculateBetween(applyDetail.getStartTime(),new Date(),0);
-                            applyDetail.setCurrentFee(new BigDecimal(days).multiply(applyDetail.getPrice()));
-                            //applyDetail.setCurrentFee(fee.divide(BigDecimal.valueOf(maxDays),2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(days)));
+                            applyDetail.setCurrentFee(Constants.produceFee(solutions,fee,insuranceApply.getStartTime(),insuranceApply.getFinalEndTime(),applyDetail.getStartTime()));
                             applyDetailMapper.updateById(applyDetail);
-                        }else if(applyDetail.getStartTime().compareTo(new Date()) <= 0&&applyDetail.getEndTime().compareTo(new Date()) <= 0){
-                            applyDetail.setCurrentFee(fee);
+                        }else  if(applyDetail.getStartTime().compareTo(new Date()) <= 0&&applyDetail.getEndTime().compareTo(new Date()) <= 0){
+                            //鍦ㄧ粨鏉熸棩鏈熶箣鍚�
+                            applyDetail.setCurrentFee(applyDetail.getFee());
                             applyDetailMapper.updateById(applyDetail);
                         }
                         sumAmount = sumAmount.add(applyDetail.getCurrentFee());
@@ -2557,6 +2577,9 @@
                 insuranceApplyMapper.updateById(insuranceApply);
             }
         }
+//        if(1==1){
+//            throw new BusinessException(ResponseStatus.NOT_ALLOWED);
+//        }
     }
 
 
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 1fb46bc..33a8f2a 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
@@ -1,5 +1,6 @@
 package com.doumee.service.business.impl;
 
+import cn.hutool.core.util.IdcardUtil;
 import com.doumee.core.annotation.excel.ExcelImporter;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
@@ -10,6 +11,7 @@
 import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.SolutionsMapper;
 import com.doumee.dao.business.WorktypeMapper;
 import com.doumee.dao.business.dto.MemberImport;
 import com.doumee.dao.business.dto.MemberQueryDTO;
@@ -31,6 +33,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -53,6 +56,9 @@
 
     @Autowired
     private WorktypeMapper worktypeMapper;
+
+    @Autowired
+    private SolutionsMapper solutionsMapper;
 
     @Override
     public Integer create(Member member) {
@@ -297,10 +303,19 @@
                                 " and ad.member_id = t.id ") ;
         if(!Objects.isNull(memberQueryDTO.getInsuranceApplyId())){
             lambdaWrapper = new MPJLambdaWrapper<Member>()
-                    .selectAll(Member.class)
+                    .select(Member::getId,Member::getName,Member::getIdcardNo)
+                    .selectAs(Worktype::getId,Member::getWorktypeId)
+                    .selectAs(DispatchUnit::getId,Member::getDuId)
                     .selectAs(DispatchUnit::getName,Member::getDuName)
                     .selectAs(Worktype::getName,Member::getWorkTypeName)
                     .selectAs(Company::getName,Member::getCompanyName)
+                    .selectAs(InsuranceApply::getStartTime,Member::getStartTime)
+                    .selectAs(InsuranceApply::getFinalEndTime,Member::getEndTime)
+                    .selectAs(InsuranceApply::getSolutionId,Member::getSolutionId)
+                    .selectAs(ApplyDetail::getStartTime,Member::getDetailStartTime)
+                    .selectAs(ApplyDetail::getEndTime,Member::getDetailEndTime)
+                    .selectAs(ApplyDetail::getFee,Member::getFee)
+                    .selectAs(InsuranceApply::getServerCost,Member::getDetailServerCost)
                     .leftJoin(ApplyDetail.class,ApplyDetail::getMemberId,Member::getId)
                     .leftJoin(InsuranceApply.class,InsuranceApply::getId,ApplyDetail::getApplyId)
                     .leftJoin(DispatchUnit.class,DispatchUnit::getId,ApplyDetail::getDuId)
@@ -316,6 +331,26 @@
                                     " and ad.member_id = t.id ");
         }
         List<Member> memberList = memberJoinMapper.selectJoinList(Member.class,lambdaWrapper);
+        if(!Objects.isNull(memberQueryDTO.getInsuranceApplyId())&&Objects.isNull(memberQueryDTO.getValidTime())){
+            if(CollectionUtils.isNotEmpty(memberList)){
+                Solutions solutions = solutionsMapper.selectById(memberList.get(Constants.ZERO).getSolutionId());
+                Date  reduceEndTime = DateUtil.getMontageDate(
+                        DateUtil.afterDateByType(new Date(),0,solutions.getDelValidDays()),3);
+                memberList = memberList.stream().filter(member->member.getDetailStartTime().getTime()<=reduceEndTime.getTime()
+                        &&member.getDetailEndTime().getTime()>=reduceEndTime.getTime()).collect(Collectors.toList());
+                for (Member member:memberList) {
+                    //鍑忎繚涓氬姟 浣跨敤 閫夋嫨浜哄憳 鏍规嵁鏃ユ湡瀹炴椂鏌ヨ
+                    member.setFee(
+                    Constants.reduceFee(solutions,
+                            Objects.isNull(member.getDetailServerCost())?
+                            solutions.getPrice():solutions.getPrice().add(member.getDetailServerCost()),member.getStartTime(),member.getEndTime(),member.getDetailStartTime(),
+                            reduceEndTime).subtract(member.getFee()));
+                }
+            }
+
+
+
+        }
         return memberList;
     }
 
@@ -338,7 +373,7 @@
         ExcelImporter ie = null;
         List<MemberImport> dataList =null;
         try {
-            ie = new ExcelImporter(file,0,0);
+            ie = new ExcelImporter(file,1,0);
             dataList = ie.getDataList(MemberImport.class,null);
         }  catch (Exception e) {
             e.printStackTrace();
@@ -381,6 +416,9 @@
             if(StringUtils.isBlank(model.getIdCard())||model.getIdCard().length()!=18){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹韩浠借瘉淇℃伅寮傚父锛�");
             }
+            if(!IdcardUtil.isValidCard(model.getIdCard())){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹韩浠借瘉淇℃伅寮傚父锛�");
+            }
             if(StringUtils.isBlank(model.getName())){
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+index+"琛屾暟鎹鍚嶄俊鎭紓甯革紒");
             }
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/SolutionsServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/SolutionsServiceImpl.java
index 84e20a6..0fb0948 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/SolutionsServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/SolutionsServiceImpl.java
@@ -488,13 +488,14 @@
         if (pageWrap.getModel().getBaseId() != null) {
             queryWrapper.eq(Solutions::getBaseId, pageWrap.getModel().getBaseId());
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
+        queryWrapper.orderByDesc(Solutions::getCreateDate);
+//        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+//            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+//                queryWrapper.orderByDesc(sortData.getProperty());
+//            } else {
+//                queryWrapper.orderByAsc(sortData.getProperty());
+//            }
+//        }
         PageData<Solutions> pageData = PageData.from(solutionsJoinMapper.selectJoinPage(page,Solutions.class, queryWrapper));
 
         return pageData;
@@ -546,7 +547,7 @@
                 .eq(Company::getStatus,Constants.ZERO)
                 .eq(Insurance::getIsdeleted,Constants.ZERO)
                 .eq(Insurance::getStatus,Constants.ZERO)
-                .orderByAsc(Solutions::getSortnum)
+                .orderByDesc(Solutions::getCreateDate)
         );
         return solutionsList;
     }
@@ -585,5 +586,18 @@
     }
 
 
+    @Override
+    public BigDecimal testSolutionAddMoney(Integer id, BigDecimal fee, Date start,Date end,Date newDate,Date newEndTime){
+        return Constants.addFee(solutionsMapper.selectById(id),fee,start,end,newDate,newEndTime);
+    }
 
+    @Override
+    public BigDecimal testSolutionReduceMoney(Integer id, BigDecimal fee, Date start,Date end,Date reduceStartTime,Date reduceEndTime){
+        return Constants.reduceFee(solutionsMapper.selectById(id),fee,start,end,reduceStartTime,reduceEndTime);
+    }
+
+    @Override
+    public BigDecimal testSolutionProduceMoney(Integer id, BigDecimal fee, Date start,Date end,Date produceStart){
+        return Constants.produceFee(solutionsMapper.selectById(id),fee,start,end,produceStart);
+    }
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/UnionApplyServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/UnionApplyServiceImpl.java
index 6f0308e..041d2e8 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/UnionApplyServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/UnionApplyServiceImpl.java
@@ -156,7 +156,7 @@
                 .selectAs(Solutions::getOrtherInfo,UnionApply::getOrtherInfo)
                 .selectAs(Solutions::getSpecialAgreement,UnionApply::getSpecialAgreement)
                 .selectAs(Solutions::getSpecialInfo,UnionApply::getSpecialInfo);
-        queryWrapper.select("(select count(b.id) from apply_detail b where b.isdeleted=0 and b.union_apply_id=t.id) as insureNum ");
+        queryWrapper.select("(select count(distinct(b.MEMBER_ID)) from apply_detail b where b.isdeleted=0 and b.union_apply_id=t.id) as insureNum ");
 
         if(pageWrap.getModel().getQueryFlag() == 1){
             queryWrapper.select("(select count(1) from apply_change a inner join insurance_apply b on a.apply_id = b.id  where b.union_apply_id=t.id " +
@@ -246,7 +246,8 @@
         }
         if (pageWrap.getModel().getSignApplyNo() != null) {
             queryWrapper.eq(UnionApply::getSignApplyNo, pageWrap.getModel().getSignApplyNo());
-        }if(pageWrap.getSorts().size() == 0){
+        }
+        if(pageWrap.getSorts().size() == 0){
             queryWrapper.orderByDesc(UnionApply::getCreateDate );
         }else {
             for(PageWrap.SortData sortData: pageWrap.getSorts()) {
@@ -416,6 +417,14 @@
         if(solutions == null){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"瀵逛笉璧凤紝鏂规淇℃伅鏈夎锛岃鍒锋柊椤甸潰閲嶈瘯");
         }
+        //鏍规嵁鏂规鏌ヨ瀵瑰簲鐨勭粨鏉熸棩鏈�
+        CountCyclePriceDTO countCyclePriceDTO = new CountCyclePriceDTO();
+        countCyclePriceDTO.setSolutions(solutions);
+        countCyclePriceDTO.setStartDate(saveUnionApplyDTO.getStartDate());
+        Date endTime =  Constants.getCountCyclePriceVO(countCyclePriceDTO).getEndDate();
+        if(saveUnionApplyDTO.getEndDate().getTime()>endTime.getTime()) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀵逛笉璧凤紝缁撴潫鏃ユ湡瓒呭嚭鏂规鍙厑璁告棩鏈熷懆鏈燂紝璇锋洿鏀瑰悗閲嶈瘯锛�");
+        }
         List<InsuranceApply> insuranceApplyList = insuranceApplyJoinMapper.selectJoinList(InsuranceApply.class,
                 new MPJLambdaWrapper<InsuranceApply>()
                         .selectAll(InsuranceApply.class)
@@ -458,8 +467,9 @@
         }
         BigDecimal fee = BigDecimal.ZERO;
         for (ApplyDetail applyDetail:applyDetailList) {
-            Integer oldDays = DateUtil.calculateBetween(applyDetail.getStartTime(),applyDetail.getEndTime(),0);
-            fee =fee.add(new BigDecimal(maxDays).multiply( applyDetail.getFee()).divide(new BigDecimal(oldDays),2,RoundingMode.HALF_UP));
+            fee =fee.add(
+                    Constants.reduceFee(solutions,solutions.getPrice(),applyDetail.getStartTime(),applyDetail.getEndTime(),saveUnionApplyDTO.getStartDate(),saveUnionApplyDTO.getEndDate())
+            );
         }
         unionApply.setFee(fee);
 
@@ -752,6 +762,18 @@
         if(!unionApply.getStatus().equals(Constants.UnionApplyStatus.UPLOAD_INSURANCE_POLICY.getKey())){
             throw  new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝璇ュ悎骞跺崟鐘舵�佸凡娴佽浆锛屽綋鍓嶄笉鏀寔璇ユ搷浣渵");
         }
+        Solutions solutions = solutionsMapper.selectById(unionApply.getSolutionId());
+        if(Objects.isNull(solutions)){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鏈煡璇㈠埌鏂规淇℃伅");
+        }
+        //鏍规嵁鏂规鏌ヨ瀵瑰簲鐨勭粨鏉熸棩鏈�
+        CountCyclePriceDTO countCyclePriceDTO = new CountCyclePriceDTO();
+        countCyclePriceDTO.setSolutions(solutions);
+        countCyclePriceDTO.setStartDate(unionApplyBXDDTO.getStartTime());
+        Date endTime =  Constants.getCountCyclePriceVO(countCyclePriceDTO).getEndDate();
+        if(unionApplyBXDDTO.getEndTime().getTime()>endTime.getTime()) {
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "瀵逛笉璧凤紝缁撴潫鏃ユ湡瓒呭嚭鏂规鍙厑璁告棩鏈熷懆鏈燂紝璇锋洿鏀瑰悗閲嶈瘯锛�");
+        }
         //鍔犱环鍙傛暟
         List<UnionApplyBXDDetailDTO> unionApplyBXDDetailDTOList = unionApplyBXDDTO.getUnionApplyBXDDDetailDTOList();
 
@@ -794,16 +816,12 @@
                 continue;
             }
             BigDecimal price = Constants.formatBigdecimal(applyDetails.get(Constants.ZERO).getPrice());
-
             Optional<UnionApplyBXDDetailDTO> unionApplyBXDDDetailTO= unionApplyBXDDetailDTOList.stream().filter(
                     m->m.getApplyId().equals(insuranceApply.getId())).findFirst();
             BigDecimal serverCost = BigDecimal.ZERO;
             if(unionApplyBXDDDetailTO.isPresent()){
                 UnionApplyBXDDetailDTO unionApplyBXDDetailDTO = unionApplyBXDDDetailTO.get();
                 serverCost = unionApplyBXDDetailDTO.getServerMoney();
-                BigDecimal dayServerMoney = unionApplyBXDDetailDTO.getServerMoney().divide(new BigDecimal(maxDays),6, RoundingMode.HALF_UP);
-
-                price = Constants.formatBigdecimal(price).add(Constants.formatBigdecimal(dayServerMoney));
                 //涓婁紶淇濆崟淇℃伅
                 if(StringUtils.isNotBlank(unionApplyBXDDetailDTO.getFileUrl())){
                     Multifile multifile = new Multifile();
@@ -824,9 +842,12 @@
             //瀹為檯宸蹭骇鐢熻垂鐢紙鍗曚汉锛�
             BigDecimal currentFee = BigDecimal.ZERO;
             if(useDays==-1){
-                currentFee =  new BigDecimal(maxDays).multiply(price);
+                currentFee = solutions.getPrice().add(serverCost);
             }else if(useDays>0){
-                currentFee =  new BigDecimal(useDays).multiply(price);
+                currentFee = Constants.produceFee(solutions,solutions.getPrice().add(serverCost)
+                        ,unionApplyBXDDTO.getStartTime(),unionApplyBXDDTO.getEndTime(),
+                        unionApplyBXDDTO.getStartTime()
+                );
             }
             //鐢熸垚鎶曚繚璁板綍
             if(CollectionUtils.isNotEmpty(applyDetailList)){
@@ -834,7 +855,7 @@
                 for (ApplyDetail applyDetail:applyDetailList.stream()
                         .filter(m->Constants.equalsInteger(m.getApplyId(),(insuranceApply.getId()))).collect(Collectors.toList())) {
                     applyDetail.setPrice(price);
-                    applyDetail.setFee(price.multiply(new BigDecimal(maxDays)));
+                    applyDetail.setFee(price.multiply(new BigDecimal(maxDays)).add(serverCost));
                     applyDetail.setStartTime(unionApplyBXDDTO.getStartTime());
                     applyDetail.setEndTime(unionApplyBXDDTO.getEndTime());
                     MemberInsurance memberInsurance = new MemberInsurance(applyDetail,user.getId());
@@ -854,12 +875,18 @@
                 }
                 memberInsuranceJoinMapper.insertBatchSomeColumn(memberInsuranceList);
             }
+            BigDecimal detailFee = Constants.reduceFee(solutions,solutions.getPrice().add(serverCost),insuranceApply.getStartTime(),insuranceApply.getFinalEndTime(),
+                    unionApplyBXDDTO.getStartTime(),unionApplyBXDDTO.getEndTime());
+
+            BigDecimal applyFee =  detailFee.multiply(new BigDecimal(applyDetails.size()));
+
+            Date finalEndTime =  endTime;
 
             //鏇存柊鎶曚繚鐢宠鍗�
             insuranceApplyJoinMapper.update(null,new UpdateWrapper<InsuranceApply>().lambda()
                     .set(InsuranceApply::getUnionApplyTbdStatus,Constants.THREE)
                     .set(InsuranceApply::getStatus,Constants.InsuranceApplyStatus.WTB_DONE.getKey())
-                    .set(InsuranceApply::getFee,price.multiply(new BigDecimal(applyDetails.size())).multiply(new BigDecimal(maxDays)))
+                    .set(InsuranceApply::getFee,applyFee)
                     .set(InsuranceApply::getCurrentFee,currentFee.multiply(new BigDecimal(applyDetails.size())))
                     .set(InsuranceApply::getStartTime,unionApplyBXDDTO.getStartTime())
                     .set(InsuranceApply::getEndTime,unionApplyBXDDTO.getEndTime())
@@ -867,11 +894,12 @@
                     .set(InsuranceApply::getEditor,user.getId())
                     .set(InsuranceApply::getServerCost,serverCost)
                     .set(InsuranceApply::getCode,unionApplyBXDDTO.getCode())
+                    .set(InsuranceApply::getFinalEndTime,finalEndTime)
                     .eq(InsuranceApply::getId,insuranceApply.getId()));
             //鏇存柊鎶曚繚鍗曟槑缁嗛噾棰�
             applyDetailJoinMapper.update(null,new UpdateWrapper<ApplyDetail>().lambda()
                     .set(ApplyDetail::getPrice,price)
-                    .set(ApplyDetail::getFee, price.multiply(new BigDecimal(maxDays)))
+                    .set(ApplyDetail::getFee, detailFee)
                     .set(ApplyDetail::getCurrentFee,currentFee)
                     .set(ApplyDetail::getEditDate,new Date())
                     .set(ApplyDetail::getEditor,user.getId())
@@ -879,7 +907,7 @@
                     .set(ApplyDetail::getEndTime,unionApplyBXDDTO.getEndTime())
                     .in(ApplyDetail::getId,applyDetails.stream().map(m->m.getId()).collect(Collectors.toList()))
             );
-            sumFee = sumFee.add(price.multiply(new BigDecimal(applyDetails.size())).multiply(new BigDecimal(maxDays)));
+            sumFee = sumFee.add(applyFee);
             sumCurrFee = sumCurrFee.add(currentFee.multiply(new BigDecimal(applyDetails.size())));
         }
 
@@ -931,7 +959,7 @@
         List<UnionApply> unionApplyList = unionApplyJoinMapper.selectJoinList(UnionApply.class,new MPJLambdaWrapper<UnionApply>()
                 .selectAll(UnionApply.class)
                 .eq(UnionApply::getIsdeleted,Constants.ZERO)
-                .eq(UnionApply::getStatus,Constants.UnionApplyStatus.FINISH)
+                .eq(UnionApply::getStatus,Constants.UnionApplyStatus.FINISH.getKey())
                 .eq(!Objects.isNull(id),UnionApply::getId,id)
                 .le(UnionApply::getStartTime,DateUtil.getDate(new Date(),"yyyy-MM-dd") + " 00:00:00")
                 .ge(UnionApply::getEndTime,DateUtil.getDate(new Date(),"yyyy-MM-dd") + " 23:59:59")
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/UnionChangeServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/UnionChangeServiceImpl.java
index 1efb65a..ef47549 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/UnionChangeServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/UnionChangeServiceImpl.java
@@ -167,7 +167,6 @@
                         .eq(UnionChange::getId,id)
                         .last(" limit 1 ")
         );
-
         if(!Objects.isNull(unionChange)){
             //鏌ヨ鍔犲噺淇濇槑缁嗘暟鎹�
             List<ApplyChagneDetail> applyChangeList = applyChagneDetailJoinMapper
@@ -176,18 +175,18 @@
                             .eq(ApplyChagneDetail::getIsdeleted,Constants.ZERO)
                             .ne(ApplyChagneDetail::getType,Constants.TWO)
                             .eq(ApplyChagneDetail::getUnionChangeId,unionChange.getId()));
-            BigDecimal fee = BigDecimal.ZERO;
-            for (ApplyChagneDetail applyChagneDetail:applyChangeList) {
-                Integer maxDays = DateUtil.calculateBetween(unionChange.getApplyStartTime(),applyChagneDetail.getEndTime(),0);
-                if(applyChagneDetail.getType().equals(Constants.ONE)){
-                    maxDays = DateUtil.daysBetweenDates(applyChagneDetail.getEndTime(),DateUtil.getMontageDate(unionChange.getApplyStartTime(),3));
-                }
-                if(applyChagneDetail.getType().equals(Constants.ZERO)){
-                    fee = fee.add(new BigDecimal(maxDays).multiply(applyChagneDetail.getPrice()));
-                }else{
-                    fee = fee.subtract(new BigDecimal(maxDays).multiply(applyChagneDetail.getPrice())).add(applyChagneDetail.getFee());
-                }
-            }
+            BigDecimal fee = applyChangeList.stream().map(m->m.getFee()).reduce(BigDecimal.ZERO,BigDecimal::add);
+//            for (ApplyChagneDetail applyChagneDetail:applyChangeList) {
+//                Integer maxDays = DateUtil.calculateBetween(unionChange.getApplyStartTime(),applyChagneDetail.getEndTime(),0);
+//                if(applyChagneDetail.getType().equals(Constants.ONE)){
+//                    maxDays = DateUtil.daysBetweenDates(applyChagneDetail.getEndTime(),DateUtil.getMontageDate(unionChange.getApplyStartTime(),3));
+//                }
+//                if(applyChagneDetail.getType().equals(Constants.ZERO)){
+//                    fee = fee.add(new BigDecimal(maxDays).multiply(applyChagneDetail.getPrice()));
+//                }else{
+//                    fee = fee.subtract(new BigDecimal(maxDays).multiply(applyChagneDetail.getPrice())).add(applyChagneDetail.getFee());
+//                }
+//            }
             unionChange.setFee(fee.setScale(2, RoundingMode.HALF_UP));
             //鏌ヨ鎿嶄綔璁板綍
             List<ApplyLog> applyLogList = applyLogJoinMapper.selectJoinList(ApplyLog.class,
@@ -324,13 +323,18 @@
         if (pageWrap.getModel().getSignApplyNo() != null) {
             queryWrapper.eq(UnionChange::getSignApplyNo, pageWrap.getModel().getSignApplyNo());
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
+        if(pageWrap.getSorts().size() == 0){
+            queryWrapper.orderByDesc(UnionChange::getCreateDate );
+        }else {
+            for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+                if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                    queryWrapper.orderByDesc(sortData.getProperty());
+                } else {
+                    queryWrapper.orderByAsc(sortData.getProperty());
+                }
             }
         }
+
         PageData<UnionChange> pageData = PageData.from(unionChangeJoinMapper.selectJoinPage(page,UnionChange.class, queryWrapper));
         return pageData;
     }
@@ -350,10 +354,13 @@
         if(!user.getType().equals(Constants.TWO)){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"闈炲晢鎴风敤鎴凤紝鏃犳硶杩涜璇ユ搷浣�");
         }
+        if(saveUnionChangeDTO.getBusinessType().equals(Constants.ZERO)){
+            //2024骞�5鏈�9鏃�14:59:24  淇敼 榛樿鍏ュ綋鍓嶅ぉ
+            saveUnionChangeDTO.setApplyDate(DateUtil.getMontageDate(new Date(),1));
+        }
         if(Objects.isNull(saveUnionChangeDTO)
                 || Objects.isNull(saveUnionChangeDTO.getApplyIds())
-                || Objects.isNull(saveUnionChangeDTO.getAddValidDate())
-                || Objects.isNull(saveUnionChangeDTO.getDelValidDate())
+                || Objects.isNull(saveUnionChangeDTO.getApplyDate())
                 || Objects.isNull(saveUnionChangeDTO.getUnionApplyId())
                 || Objects.isNull(saveUnionChangeDTO.getBusinessType())
         ){
@@ -364,16 +371,44 @@
         if(Objects.isNull(unionApply)){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鏈煡璇㈠埌鍚堝苟淇濆崟鏁版嵁");
         }
-        //鍒ゆ柇鎵瑰崟鏃ユ湡 鍚堝苟鍗曠殑鎵瑰崟鐢熸晥鏈熷湪涓� 淇濆崟璧锋湡鐨勬鏃� 鍒颁繚鍗曟鏈�
-        //鑾峰彇寮�濮嬫棩鏈熸鏃�
-        if(saveUnionChangeDTO.getAddValidDate().getTime()<DateUtil.afterDateByType(unionApply.getStartTime(),0,1).getTime()
-        || saveUnionChangeDTO.getAddValidDate().getTime()> unionApply.getEndTime().getTime()){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍚堝苟鍗曠殑鎵瑰崟鍔犱繚鐢熸晥鏈熼敊璇�");
+        Solutions solutions = solutionsMapper.selectById(unionApply.getSolutionId());
+        if(Objects.isNull(solutions)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌淇濋櫓鏂规");
         }
-        if(saveUnionChangeDTO.getDelValidDate().getTime()<DateUtil.afterDateByType(unionApply.getStartTime(),0,1).getTime()
-                || saveUnionChangeDTO.getDelValidDate().getTime()> unionApply.getEndTime().getTime()){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍚堝苟鍗曠殑鎵瑰崟鍔犱繚鐢熸晥鏈熼敊璇�");
+        if(saveUnionChangeDTO.getBusinessType().equals(Constants.ZERO)){
+            //鏍规嵁鐢宠鏃ユ湡 澶勭悊鍔犲噺淇濈殑 瀹為檯鐢熸晥鏃ユ湡
+            if(Objects.nonNull(solutions.getAddValidDays())){
+                saveUnionChangeDTO.setAddValidDate(
+                        DateUtil.afterDateByType(saveUnionChangeDTO.getApplyDate(),0,solutions.getAddValidDays())
+                );
+            }else{
+                saveUnionChangeDTO.setAddValidDate(saveUnionChangeDTO.getApplyDate());
+            }
+            if(Objects.nonNull(solutions.getDelValidDays())){
+                saveUnionChangeDTO.setDelValidDate(
+                        DateUtil.afterDateByType(saveUnionChangeDTO.getApplyDate(),0,solutions.getDelValidDays())
+                );
+            }else{
+                saveUnionChangeDTO.setDelValidDate(saveUnionChangeDTO.getApplyDate());
+            }
+            //鍒ゆ柇鎵瑰崟鏃ユ湡 鍚堝苟鍗曠殑鎵瑰崟鐢熸晥鏈熷湪涓� 淇濆崟璧锋湡鐨勬鏃� 鍒颁繚鍗曟鏈�
+            //鑾峰彇寮�濮嬫棩鏈熸鏃�
+            if(saveUnionChangeDTO.getAddValidDate().getTime()<unionApply.getStartTime().getTime()
+                    || saveUnionChangeDTO.getAddValidDate().getTime()> unionApply.getEndTime().getTime()){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍚堝苟鍗曠殑鎵瑰崟鍔犱繚鐢熸晥鏈熼敊璇�");
+            }
+            if(saveUnionChangeDTO.getDelValidDate().getTime()<unionApply.getStartTime().getTime()
+                    || saveUnionChangeDTO.getDelValidDate().getTime()> unionApply.getEndTime().getTime()){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍚堝苟鍗曠殑鎵瑰崟鍔犱繚鐢熸晥鏈熼敊璇�");
+            }
+        }else{
+            if(saveUnionChangeDTO.getApplyDate().getTime()<DateUtil.afterDateByType(unionApply.getStartTime(),0,1).getTime()
+                    || saveUnionChangeDTO.getApplyDate().getTime()> unionApply.getEndTime().getTime()){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍚堝苟鍗曠殑鎹㈠巶鐢熸晥鏈熼敊璇�");
+            }
+            saveUnionChangeDTO.setAddValidDate(saveUnionChangeDTO.getApplyDate());
         }
+
 
         List<ApplyChange> applyChangeList = applyChangeJoinMapper.selectJoinList(ApplyChange.class,
                 new MPJLambdaWrapper<ApplyChange>()
@@ -637,6 +672,7 @@
                 unionChangeBXDDTO.getDelValidTime() == null ){
             throw  new BusinessException(ResponseStatus.BAD_REQUEST);
         }
+        unionChangeBXDDTO.setApplyId(unionChange.getUnionApplyId());
         unionChange.setStatus(Constants.formatIntegerNum(unionChange.getStatus()));
         unionChange.setShopId(Constants.formatIntegerNum(unionChange.getShopId()));
         if(!unionChange.getShopId().equals(user.getCompanyId())){
@@ -655,17 +691,26 @@
         if(Objects.isNull(unionApply)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鍚堝苟淇濆崟淇℃伅");
         }
-        //鍒ゆ柇鎵瑰崟鏃ユ湡 鍚堝苟鍗曠殑鎵瑰崟鐢熸晥鏈熷湪涓� 淇濆崟璧锋湡鐨勬鏃� 鍒颁繚鍗曟鏈�
-        //鑾峰彇寮�濮嬫棩鏈熸鏃�
-        if(unionChangeBXDDTO.getApplyDate().getTime()<DateUtil.afterDateByType(unionApply.getStartTime(),0,1).getTime()
-                || unionChangeBXDDTO.getApplyDate().getTime()> unionApply.getEndTime().getTime()){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍚堝苟鍗曠殑鎵瑰崟鍔犱繚鐢熸晥鏈熼敊璇�");
+        Solutions solutions = solutionsMapper.selectById(unionApply.getSolutionId());
+        if(Objects.isNull(solutions)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌淇濋櫓鏂规");
         }
-        if(unionChangeBXDDTO.getDelValidTime().getTime()<DateUtil.afterDateByType(unionApply.getStartTime(),0,1).getTime()
-                || unionChangeBXDDTO.getDelValidTime().getTime()> unionApply.getEndTime().getTime()){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍚堝苟鍗曠殑鎵瑰崟鍑忎繚鐢熸晥鏈熼敊璇�");
+        if(unionChange.getType().equals(Constants.ZERO)){
+            //鍒ゆ柇鎵瑰崟鏃ユ湡 鍚堝苟鍗曠殑鎵瑰崟鐢熸晥鏈熷湪涓� 淇濆崟璧锋湡鐨勬鏃� 鍒颁繚鍗曟鏈�
+            //鑾峰彇寮�濮嬫棩鏈熸鏃�
+            if(unionChangeBXDDTO.getApplyDate().getTime()<unionApply.getStartTime().getTime()
+                    || unionChangeBXDDTO.getApplyDate().getTime()> unionApply.getEndTime().getTime()){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍚堝苟鍗曠殑鎵瑰崟鍔犱繚鐢熸晥鏈熼敊璇�");
+            }
+            if(unionChangeBXDDTO.getDelValidTime().getTime()<unionApply.getStartTime().getTime()
+                    || unionChangeBXDDTO.getDelValidTime().getTime()> unionApply.getEndTime().getTime()){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍚堝苟鍗曠殑鎵瑰崟鍑忎繚鐢熸晥鏈熼敊璇�");
+            }
+        }else{
+            if(unionChangeBXDDTO.getApplyDate().getTime()<unionChange.getApplyStartTime().getTime()){
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎵瑰崟鏃ユ湡蹇呴』澶т簬鐢宠鏃ユ湡");
+            }
         }
-
 
         List<ApplyChange> applyChangeList = applyChangeJoinMapper.selectJoinList(ApplyChange.class,
                 new MPJLambdaWrapper<ApplyChange>()
@@ -741,6 +786,7 @@
                                 .selectAs(Member::getName, ApplyChagneDetail::getMemberName)
                                 .selectAs(Solutions::getName,ApplyChagneDetail::getSolutionsName)
                                 .selectAs(InsuranceApply::getCode,ApplyChagneDetail::getApplyCode)
+                                .selectAs(InsuranceApply::getServerCost,ApplyChagneDetail::getServerCost)
                                 .leftJoin(ApplyChange.class, ApplyChange::getId, ApplyChagneDetail::getApplyChangeId)
                                 .leftJoin(Member.class, Member::getId, ApplyChagneDetail::getMemberId)
                                 .leftJoin(InsuranceApply.class, InsuranceApply::getId, ApplyChange::getApplyId)
@@ -748,7 +794,7 @@
                                 .leftJoin(Worktype.class, Worktype::getId, ApplyChagneDetail::getWorktypeId)
                                 .leftJoin(DispatchUnit.class, DispatchUnit::getId, ApplyChagneDetail::getDuId)
                                 .eq(ApplyChagneDetail::getApplyChangeId,applyChange.getId()));
-                this.dealApplyChangeDetail(applyChange,allList);
+                this.dealApplyChangeDetail(applyChange,allList,solutions);
                 applyChangeJoinMapper.updateById(applyChange);
 
                 //瀛樺偍鎵瑰崟瀹屾垚淇℃伅
@@ -789,37 +835,34 @@
 
 
 
-    public void dealApplyChangeDetail(ApplyChange applyChange,List<ApplyChagneDetail> applyChagneDetailList){
+    public void dealApplyChangeDetail(ApplyChange applyChange,List<ApplyChagneDetail> applyChagneDetailList,Solutions solutions){
 
         BigDecimalVO bigDecimalVO = new BigDecimalVO();
         bigDecimalVO.setTotalFee(BigDecimal.ZERO);
         bigDecimalVO.setCurrentFee(BigDecimal.ZERO);
+        InsuranceApply insuranceApply = insuranceApplyMapper.selectById(applyChange.getApplyId());
         for (ApplyChagneDetail detail:applyChagneDetailList) {
             Member member = memberMapper.selectById(detail.getMemberId());
             if(Objects.isNull(member)){
                 throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鍛樺伐鏁版嵁");
             }
             if (Constants.equalsInteger(detail.getType(), Constants.ZERO)) {
-               this.addChangeDetailData(applyChange,detail,bigDecimalVO);
+               this.addChangeDetailData(applyChange,detail,insuranceApply,solutions,bigDecimalVO);
             }else if(Constants.equalsInteger(detail.getType(),Constants.ONE)){
-                this.reduceChangeDetailData(applyChange,detail,bigDecimalVO);
+                this.reduceChangeDetailData(applyChange,detail,insuranceApply,solutions,bigDecimalVO);
             }else{
-                this.otherChangeDetailData(applyChange,detail);
+                this.otherChangeDetailData(applyChange,detail,insuranceApply);
             }
         }
-
-        if (bigDecimalVO.getTotalFee().compareTo(new BigDecimal(0)) != 0) {
-            //濡傛灉淇濆崟閲戦鍙戠敓缂栫爜锛屾洿鏂版�讳繚鍗曢噾棰�
-            insuranceApplyMapper.update(null, new UpdateWrapper<InsuranceApply>().lambda()
-                    .setSql(" fee = ifnull(fee,0)+" + bigDecimalVO.getTotalFee())
-                    .setSql(" current_fee = ifnull(current_fee,0)+" + bigDecimalVO.getCurrentFee())
-                    .set(InsuranceApply::getEditor, applyChange.getEditor())
-                    .set(InsuranceApply::getEditDate, applyChange.getEditDate())
-                    .eq(InsuranceApply::getId, applyChange.getApplyId())
-            );
-            applyChange.setFee(bigDecimalVO.getTotalFee());
-        }
-
+        //濡傛灉淇濆崟閲戦鍙戠敓缂栫爜锛屾洿鏂版�讳繚鍗曢噾棰�
+        insuranceApplyMapper.update(null, new UpdateWrapper<InsuranceApply>().lambda()
+                .setSql(bigDecimalVO.getTotalFee().compareTo(new BigDecimal(0)) != 0," fee = ifnull(fee,0)+" + bigDecimalVO.getTotalFee())
+                .setSql(bigDecimalVO.getCurrentFee().compareTo(new BigDecimal(0)) != 0," current_fee = ifnull(current_fee,0)+" + bigDecimalVO.getCurrentFee())
+                .set(InsuranceApply::getEditor, applyChange.getEditor())
+                .set(InsuranceApply::getEditDate, applyChange.getEditDate())
+                .eq(InsuranceApply::getId, applyChange.getApplyId())
+        );
+        applyChange.setFee(bigDecimalVO.getTotalFee());
     }
 
 
@@ -828,7 +871,7 @@
      * @param applyChange
      * @param detail
      */
-    public void addChangeDetailData(ApplyChange applyChange, ApplyChagneDetail detail
+    public void addChangeDetailData(ApplyChange applyChange, ApplyChagneDetail detail,InsuranceApply insuranceApply,Solutions solutions
             , BigDecimalVO bigDecimalVO){
         //鏌ヨ鍔犱繚浜哄憳鏄惁瀛樺湪 鍐茬獊鐨� 淇濆崟鏄庣粏鏁版嵁
         if(applyDetailJoinMapper.selectCount(new QueryWrapper<ApplyDetail>()
@@ -840,26 +883,24 @@
         )>Constants.ZERO){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "褰撳墠淇濆崟涓嬶紝鍔犱繚浜哄憳銆�" + detail.getMemberName() + "銆戝瓨鍦ㄦ棩鏈熷啿绐佺殑鏁版嵁");
         }
-        //鎬诲ぉ鏁�
-        Integer countDays = DateUtil.calculateBetween(applyChange.getApplyStartTime(),DateUtil.getMontageDate(detail.getEndTime(), 2),0);
-
         //鍔犱繚
         ApplyDetail add = new ApplyDetail();
-        if(new Date().compareTo(DateUtil.getMontageDate(applyChange.getApplyStartTime(), 2))>=0){
-            Integer days =  DateUtil.calculateBetween(applyChange.getApplyStartTime(),DateUtil.getMontageDate(new Date(), 2),0);
+        BigDecimal fee = Objects.isNull(insuranceApply.getServerCost())?
+                solutions.getPrice():
+                solutions.getPrice().add(insuranceApply.getServerCost());
 
-
-
-            //濡傛灉宸插凡浜х敓璐圭敤锛岃绠楀凡宸蹭骇鐢熻垂鐢�
-            add.setCurrentFee(new BigDecimal(days).multiply(detail.getPrice()));
+        add.setFee(Constants.addFee
+                (solutions,fee,insuranceApply.getStartTime(),insuranceApply.getFinalEndTime(),applyChange.getApplyStartTime(),insuranceApply.getEndTime()));
+        if(new Date().compareTo(DateUtil.getMontageDate(applyChange.getApplyStartTime(), 1))>=0){
+            add.setCurrentFee(
+                    Constants.produceFee(solutions,fee,insuranceApply.getStartTime(),insuranceApply.getEndTime(),DateUtil.getMontageDate(applyChange.getApplyStartTime(), 1))
+            );
         }else{
             add.setCurrentFee(BigDecimal.ZERO);
         }
-
         add.setPrice(detail.getPrice());
         add.setApplyId(applyChange.getApplyId());
         add.setValidCode(applyChange.getValidCode());
-        add.setFee(detail.getFee());
         add.setIsdeleted(Constants.ZERO);
         add.setCreator(applyChange.getEditor());
         add.setCreateDate(applyChange.getEditDate());
@@ -873,7 +914,8 @@
         add.setDuId(detail.getDuId());
         add.setStartTime(DateUtil.getMontageDate(applyChange.getApplyStartTime(), 1));
         add.setEndTime(DateUtil.getMontageDate(detail.getEndTime(), 2));
-        add.setFee(new BigDecimal(countDays).multiply(detail.getPrice()));
+        add.setRemark(detail.getRemark());
+        add.setUnionApplyId(insuranceApply.getUnionApplyId());
         applyDetailJoinMapper.insert(add);
 
         detail.setFee(add.getFee());
@@ -901,6 +943,9 @@
                 .eq(Member::getId, memberInsurance.getMemberId())
         );
 
+//        if(1==1){
+//            throw new BusinessException(ResponseStatus.NOT_ALLOWED);
+//        }
     }
 
     /**
@@ -908,59 +953,62 @@
      * @param applyChange
      * @param detail
      */
-    public void reduceChangeDetailData(ApplyChange applyChange,ApplyChagneDetail detail,BigDecimalVO bigDecimalVO){
+    public void reduceChangeDetailData(ApplyChange applyChange,ApplyChagneDetail detail,InsuranceApply insuranceApply,Solutions solutions
+            ,BigDecimalVO bigDecimalVO){
         //鏌ヨ鍛樺伐鏄湪涓诲崟涓� 鏄惁瀛樺湪鐢熸晥涓殑鏁版嵁
         ApplyDetail oldModel = applyDetailJoinMapper.selectOne(new QueryWrapper<ApplyDetail>().lambda()
                 .eq(ApplyDetail::getApplyId, applyChange.getApplyId())
                 .eq(ApplyDetail::getMemberId, detail.getMemberId())
                 .orderByDesc(ApplyDetail::getCreateDate)
                 .last("limit 1"));
-        if (oldModel == null || oldModel.getStartTime() == null || oldModel.getStartTime().getTime() > applyChange.getApplyStartTime().getTime()) {
-            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝鐢ㄦ埛銆�" + detail.getMemberName() + "銆戝師淇濆崟淇℃伅鏈夎锛屽綋鍓嶇敵璇蜂笉鏀寔鍑忎繚澶勭悊锛�");
+        if (oldModel == null || oldModel.getStartTime() == null || oldModel.getStartTime().getTime() > applyChange.getDelValidTime().getTime()) {
+            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝鐢ㄦ埛銆�" + detail.getMemberName() + "銆戝綋鍓嶆壒鍑忔棩鏈熶笉鏀寔鍑忎繚鎿嶄綔锛�");
         }
-        //璁$畻宸茬敓鏁堝ぉ鏁�
-        //褰撳鎵规椂闂� 灏忎簬 褰撳墠鏃堕棿 璁$畻瀹為檯鍑忓皯閲戦 鍥犱负宸叉墸閲戦浼氬ぇ浜� 搴旀墸閲戦
+        if(oldModel.getStartTime().getTime()>applyChange.getDelValidTime().getTime()||oldModel.getEndTime().getTime()<applyChange.getDelValidTime().getTime()){
+            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "瀵逛笉璧凤紝鎵瑰噺鏃ユ湡鏈湪鐢ㄦ埛銆�" + detail.getMemberName() + "銆戠殑淇濆崟鏃ユ湡鍐咃紒");
+        }
+        BigDecimal fee = Objects.isNull(insuranceApply.getServerCost())?
+                solutions.getPrice():
+                solutions.getPrice().add(insuranceApply.getServerCost());
+
+        Date reduceDate = oldModel.getStartTime().compareTo(applyChange.getDelValidTime())!=0?
+                DateUtil.getMontageDate(applyChange.getDelValidTime(), 3):
+                DateUtil.getMontageDate(applyChange.getDelValidTime(), 2);
+        //鍑忎繚璁板綍鎿嶄綔鍚庣殑鎬昏垂鐢�
+        BigDecimal reduceFee = Constants.reduceFee(
+                solutions,fee,insuranceApply.getStartTime(),insuranceApply.getFinalEndTime(),oldModel.getStartTime(),reduceDate) ;
         BigDecimal pullFee = BigDecimal.ZERO;
-        //鍑忎繚鍑忓皯鐨勯噾棰�
-        BigDecimal reduceFee = BigDecimal.ZERO;
-        Date reduceDate = DateUtil.getMontageDate(applyChange.getApplyStartTime(),3);
-        if (reduceDate.getTime() <  DateUtil.getMontageDate(new Date(), 2).getTime()) {
-            //璁$畻澶氭墸閲戦
-            Integer days = DateUtil.calculateBetween(reduceDate,DateUtil.getMontageDate(new Date(), 2),0);
-            pullFee = new BigDecimal(days).multiply(detail.getPrice()).multiply(new BigDecimal(-1));
+        if (DateUtil.getMontageDate(new Date(), 2).getTime()>oldModel.getStartTime().getTime()) {
+            //// 2024骞�5鏈�8鏃�17:37:23 淇敼 璁$畻浜х敓璐圭敤
+            pullFee =  Constants.produceFee(solutions,fee,insuranceApply.getStartTime(),insuranceApply.getFinalEndTime(),oldModel.getStartTime());
+            if(pullFee.compareTo(reduceFee)>0){
+                pullFee = reduceFee;
+            }
         }
-        //璁$畻鎶曚繚鏄庣粏搴斿噺灏戠殑澶╂暟
-        Integer reduceDays = DateUtil.daysBetweenDates(oldModel.getEndTime(),reduceDate);
-        if(reduceDays>0){
-            reduceFee = new BigDecimal(reduceDays).multiply(detail.getPrice()).multiply(new BigDecimal(-1));
-        }
+
+        bigDecimalVO.setTotalFee(bigDecimalVO.getTotalFee().add(reduceFee).subtract(oldModel.getFee()));
+        bigDecimalVO.setCurrentFee(bigDecimalVO.getCurrentFee().add(pullFee).subtract(oldModel.getCurrentFee()));
+
         applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
-                .setSql(" fee = ifnull(fee,0)+" + reduceFee)
-                .setSql(" current_fee = ifnull(current_fee,0)+" + pullFee)
-                .set(oldModel.getStartTime().compareTo(reduceDate)!=0,ApplyDetail::getEndTime, reduceDate)
-                .set(oldModel.getStartTime().compareTo(reduceDate)==0,ApplyDetail::getEndTime, DateUtil.getMontageDate(applyChange.getApplyStartTime(), 2))
+                .setSql(" fee =  " + reduceFee)
+                .setSql(" current_fee =  " + pullFee)
+                .set(ApplyDetail::getEndTime, reduceDate)
                 .set(ApplyDetail::getEditor, applyChange.getEditor())
                 .set(ApplyDetail::getEditDate, applyChange.getEditDate())
                 .eq(ApplyDetail::getId, oldModel.getId())
         );
 
-        bigDecimalVO.setTotalFee(bigDecimalVO.getTotalFee().add(reduceFee));
-        bigDecimalVO.setCurrentFee(bigDecimalVO.getCurrentFee().add(pullFee));
-
         //淇敼 鍛樺伐鎶曚繚鏄庣粏璁板綍 鍘嗗彶鏁版嵁
         memberInsuranceJoinMapper.update(null, new UpdateWrapper<MemberInsurance>().lambda()
-                .setSql(" fee = ifnull(fee,0)+" + reduceFee)
-                .set(oldModel.getStartTime().compareTo(reduceDate)!=0,MemberInsurance::getEndTime,reduceDate)
-                .set(oldModel.getStartTime().compareTo(reduceDate)==0,MemberInsurance::getEndTime,DateUtil.getMontageDate(applyChange.getApplyStartTime(), 2))
+                .setSql(" fee = " + reduceFee)
+                .set(MemberInsurance::getEndTime,reduceDate)
                 .eq(MemberInsurance::getRelationId, oldModel.getId())
         );
-
 
         memberMapper.update(null,new UpdateWrapper<Member>()
                 .lambda()
                 .set(Member::getStartTime,oldModel.getStartTime())
-                .set(oldModel.getStartTime().compareTo(reduceDate)!=0,Member::getEndTime,reduceDate)
-                .set(oldModel.getStartTime().compareTo(reduceDate)==0,Member::getEndTime,DateUtil.getMontageDate(applyChange.getApplyStartTime(), 2))
+                .set(Member::getEndTime,reduceDate)
                 .set(Member::getDuId,oldModel.getDuId())
                 .set(Member::getWorktypeId,oldModel.getWorktypeId())
                 .eq(Member::getId, oldModel.getMemberId())
@@ -969,13 +1017,13 @@
         //淇敼涓氬姟鏄庣粏琛屾暟鎹疄闄呮壒鍗曟棩鏈�
         applyChagneDetailJoinMapper.update(null,new UpdateWrapper<ApplyChagneDetail>().lambda()
 //                .setSql(" fee = ifnull(fee,0)+" + reduceFee)
-                .set(ApplyChagneDetail::getFee,reduceFee)
+                .set(ApplyChagneDetail::getFee,reduceFee.subtract(oldModel.getFee()))
                 .set(ApplyChagneDetail::getEndTime,reduceDate)
                 .eq(ApplyChagneDetail::getId,detail.getId())
         );
     }
 
-    public void otherChangeDetailData(ApplyChange applyChange,ApplyChagneDetail detail){
+    public void otherChangeDetailData(ApplyChange applyChange,ApplyChagneDetail detail,InsuranceApply insuranceApply){
         //瀹為檯鎵瑰崟鐢熸晥鏃ユ湡
         Date applyStartTime = DateUtil.getMontageDate(applyChange.getApplyStartTime(),1);
         //鏌ヨ鍑忎繚浜哄憳鏄惁瀛樺湪 鍐茬獊鐨� 淇濆崟鏄庣粏鏁版嵁
@@ -1000,86 +1048,128 @@
         if(oldModel == null  ){
             throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"瀵逛笉璧凤紝鐢ㄦ埛銆�"+detail.getMemberName()+"銆戝師淇濆崟淇℃伅鏈夎锛屾壒鍗曟棩鏈熸湭鍦ㄤ繚鍗曟棩鏈熷唴锛�");
         }
-        //濡傛灉瀹為檯鎵瑰崟鏃ユ湡 鍜� 鍘熻褰曟棩鏈熺浉绛� 鍒欑洿鎺ヤ慨鏀硅褰曟淳閬e崟浣嶄笌宸ョ淇℃伅
-        if(applyStartTime.compareTo(oldModel.getStartTime())!=Constants.ZERO){
-            //褰撳墠鏃ユ湡澶т簬鎵瑰崟鏃ユ湡 闇�瑕佸洖婊氭暟鎹疄闄呮暟鎹�
-            Boolean flag = DateUtil.getMontageDate(new Date(),2).compareTo(DateUtil.getMontageDate(applyStartTime,2))>0;
-            //鎹㈠巶鍚庡巻鍙茶褰曠殑璐圭敤 fee
-            Integer days = DateUtil.calculateBetween(DateUtil.getMontageDate(applyStartTime,3),DateUtil.getMontageDate(oldModel.getStartTime(),1),0);
-            BigDecimal oldFee = new BigDecimal(days).multiply(detail.getPrice());
-            BigDecimal fee = oldModel.getFee();
-            BigDecimal oldCurrentFee = oldModel.getCurrentFee();
 
-            applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
-                    .set(ApplyDetail::getEditor,applyChange.getEditor())
-                    .set(ApplyDetail::getEditDate,applyChange.getEditDate())
-                    .set(ApplyDetail::getEndTime,DateUtil.getMontageDate(applyStartTime,3))
-                    .set(ApplyDetail::getFee,oldFee)
-                    .set(flag,ApplyDetail::getCurrentFee,oldFee)
-                    .eq(ApplyDetail::getId,oldModel.getId())
-            );
+        MemberInsurance memberInsurance = new MemberInsurance(detail,applyChange,applyChange.getEditor(),null,insuranceApply.getSolutionId());
+        memberInsurance.setSolutionId(detail.getSolutionId());
+        memberInsurance.setWorktypeName(detail.getWorkTypeName());
+        memberInsurance.setDuName(detail.getDuName());
+        memberInsurance.setApplyChangeId(detail.getApplyChangeId());
+        memberInsurance.setSolutionName(detail.getSolutionsName());
+        memberInsurance.setPdCode(applyChange.getValidCode());
+        memberInsurance.setBdCode(insuranceApply.getCode());
+        memberInsurance.setRelationType(Constants.ONE);
+        memberInsurance.setStartTime(DateUtil.getMontageDate(applyChange.getApplyStartTime(),1));
+        memberInsurance.setEndTime(oldModel.getEndTime());
 
-            //淇敼 鍛樺伐鎶曚繚鏄庣粏璁板綍 鍘嗗彶鏁版嵁
-            memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
-                    .set(MemberInsurance::getEndTime,DateUtil.getMontageDate(applyStartTime,3))
-                    .set(MemberInsurance::getFee,oldFee)
-                    .eq(MemberInsurance::getRelationId,oldModel.getId())
-            );
+        applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
+                .set(ApplyDetail::getEditor,applyChange.getEditor())
+                .set(ApplyDetail::getEditDate,applyChange.getEditDate())
+                .set(ApplyDetail::getDuId,detail.getDuId())
+                .set(ApplyDetail::getWorktypeId,detail.getWorktypeId())
+                .eq(ApplyDetail::getId,oldModel.getId())
+        );
 
-            ApplyDetail add = new ApplyDetail();
-            add.setApplyId(oldModel.getApplyId());
-            add.setCreateDate(new Date());
-            add.setCreator(applyChange.getEditor());
-            add.setMemberId(oldModel.getMemberId());
-            add.setIdcardNo(detail.getIdcardNo());
-            add.setSex(Constants.getSexByIdCard(detail.getIdcardNo()));
-            add.setMemberName(detail.getMemberName());
-            add.setStartTime(DateUtil.getMontageDate(applyStartTime,1));
-            add.setEndTime(oldModel.getEndTime());
-            add.setDuId(detail.getDuId());
-            add.setWorktypeId(detail.getWorktypeId());
-            add.setIdcardNo(oldModel.getIdcardNo());
-            add.setFee(fee.subtract(oldFee));
-            add.setIsdeleted(Constants.ZERO);
-            if(flag){
-                add.setCurrentFee(oldCurrentFee.multiply(oldFee));
-            }else{
-                add.setCurrentFee(BigDecimal.ZERO);
-            }
-            add.setSex(oldModel.getSex());
-            add.setMemberName(oldModel.getMemberName());
-            add.setFromId(detail.getId());
-            applyDetailJoinMapper.insert(add);
+//        memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
+//                .set(MemberInsurance::getEndTime,DateUtil.getMontageDate(applyChange.getApplyStartTime(),3))
+//                .eq(MemberInsurance::getRelationId,oldModel.getId())
+//        );
 
-            MemberInsurance memberInsurance = new MemberInsurance(add,applyChange.getId());
-            memberInsurance.setSolutionId(detail.getSolutionId());
-            memberInsurance.setWorktypeName(detail.getWorkTypeName());
-            memberInsurance.setDuName(detail.getDuName());
-            memberInsurance.setApplyChangeId(detail.getApplyChangeId());
-            memberInsurance.setSolutionName(detail.getSolutionsName());
-            memberInsurance.setPdCode(applyChange.getValidCode());
-            memberInsurance.setBdCode(applyChange.getApplyCode());
-            memberInsurance.setRelationType(Constants.ONE);
-            memberInsuranceJoinMapper.insert(memberInsurance);
+        memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
+                        .eq(MemberInsurance::getApplyId,applyChange.getApplyId())
+                        .eq(MemberInsurance::getMemberId,detail.getMemberId())
+                        .le(MemberInsurance::getStartTime,applyStartTime)
+                        .ge(MemberInsurance::getEndTime,applyStartTime)
+                        .set(insuranceApply.getStartTime().compareTo(applyChange.getApplyStartTime())!=0,
+                                MemberInsurance::getEndTime,DateUtil.getMontageDate(applyChange.getApplyStartTime(), 3))
+                        .set(insuranceApply.getStartTime().compareTo(applyChange.getApplyStartTime())==0,
+                                MemberInsurance::getEndTime,DateUtil.getMontageDate(applyChange.getApplyStartTime(), 2))
+//                        .ne(MemberInsurance::getId,memberInsurance.getId())
+//                    .eq(MemberInsurance::getRelationId,oldModel.getId())
+        );
 
-        }else{
-            applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
-                    .set(ApplyDetail::getEditor,applyChange.getEditor())
-                    .set(ApplyDetail::getEditDate,applyChange.getEditDate())
-                    .set(ApplyDetail::getDuId,detail.getDuId())
-                    .set(ApplyDetail::getWorktypeId,detail.getWorktypeId())
-                    .eq(ApplyDetail::getId,oldModel.getId())
-            );
-            //鍛樺伐鎶曚繚鏄庣粏璁板綍 鍘嗗彶鏁版嵁
-            memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
-                    .set(MemberInsurance::getDuId,detail.getDuId())
-                    .set(MemberInsurance::getDuName,detail.getDuName())
-                    .set(MemberInsurance::getWorktypeId,detail.getWorktypeId())
-                    .set(MemberInsurance::getWorktypeName,detail.getWorkTypeName())
-                    .eq(MemberInsurance::getRelationId,oldModel.getId())
-            );
+        memberInsuranceJoinMapper.insert(memberInsurance);
 
-        }
+
+//        //濡傛灉瀹為檯鎵瑰崟鏃ユ湡 鍜� 鍘熻褰曟棩鏈熺浉绛� 鍒欑洿鎺ヤ慨鏀硅褰曟淳閬e崟浣嶄笌宸ョ淇℃伅
+//        if(applyStartTime.compareTo(oldModel.getStartTime())!=Constants.ZERO){
+//            //褰撳墠鏃ユ湡澶т簬鎵瑰崟鏃ユ湡 闇�瑕佸洖婊氭暟鎹疄闄呮暟鎹�
+//            Boolean flag = DateUtil.getMontageDate(new Date(),2).compareTo(DateUtil.getMontageDate(applyStartTime,2))>0;
+//            //鎹㈠巶鍚庡巻鍙茶褰曠殑璐圭敤 fee
+//            Integer days = DateUtil.calculateBetween(DateUtil.getMontageDate(applyStartTime,3),DateUtil.getMontageDate(oldModel.getStartTime(),1),0);
+//            BigDecimal oldFee = new BigDecimal(days).multiply(detail.getPrice());
+//            BigDecimal fee = oldModel.getFee();
+//            BigDecimal oldCurrentFee = oldModel.getCurrentFee();
+//
+//            applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
+//                    .set(ApplyDetail::getEditor,applyChange.getEditor())
+//                    .set(ApplyDetail::getEditDate,applyChange.getEditDate())
+//                    .set(ApplyDetail::getEndTime,DateUtil.getMontageDate(applyStartTime,3))
+//                    .set(ApplyDetail::getFee,oldFee)
+//                    .set(flag,ApplyDetail::getCurrentFee,oldFee)
+//                    .eq(ApplyDetail::getId,oldModel.getId())
+//            );
+//
+//            //淇敼 鍛樺伐鎶曚繚鏄庣粏璁板綍 鍘嗗彶鏁版嵁
+//            memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
+//                    .set(MemberInsurance::getEndTime,DateUtil.getMontageDate(applyStartTime,3))
+//                    .set(MemberInsurance::getFee,oldFee)
+//                    .eq(MemberInsurance::getRelationId,oldModel.getId())
+//            );
+//
+//            ApplyDetail add = new ApplyDetail();
+//            add.setApplyId(oldModel.getApplyId());
+//            add.setCreateDate(new Date());
+//            add.setCreator(applyChange.getEditor());
+//            add.setMemberId(oldModel.getMemberId());
+//            add.setIdcardNo(detail.getIdcardNo());
+//            add.setSex(Constants.getSexByIdCard(detail.getIdcardNo()));
+//            add.setMemberName(detail.getMemberName());
+//            add.setStartTime(DateUtil.getMontageDate(applyStartTime,1));
+//            add.setEndTime(oldModel.getEndTime());
+//            add.setDuId(detail.getDuId());
+//            add.setWorktypeId(detail.getWorktypeId());
+//            add.setIdcardNo(oldModel.getIdcardNo());
+//            add.setFee(fee.subtract(oldFee));
+//            add.setIsdeleted(Constants.ZERO);
+//            if(flag){
+//                add.setCurrentFee(oldCurrentFee.multiply(oldFee));
+//            }else{
+//                add.setCurrentFee(BigDecimal.ZERO);
+//            }
+//            add.setSex(oldModel.getSex());
+//            add.setMemberName(oldModel.getMemberName());
+//            add.setFromId(detail.getId());
+//            applyDetailJoinMapper.insert(add);
+//
+//            MemberInsurance memberInsurance = new MemberInsurance(add,applyChange.getId());
+//            memberInsurance.setSolutionId(detail.getSolutionId());
+//            memberInsurance.setWorktypeName(detail.getWorkTypeName());
+//            memberInsurance.setDuName(detail.getDuName());
+//            memberInsurance.setApplyChangeId(detail.getApplyChangeId());
+//            memberInsurance.setSolutionName(detail.getSolutionsName());
+//            memberInsurance.setPdCode(applyChange.getValidCode());
+//            memberInsurance.setBdCode(applyChange.getApplyCode());
+//            memberInsurance.setRelationType(Constants.ONE);
+//            memberInsuranceJoinMapper.insert(memberInsurance);
+//
+//        }else{
+//            applyDetailJoinMapper.update(null, new UpdateWrapper<ApplyDetail>().lambda()
+//                    .set(ApplyDetail::getEditor,applyChange.getEditor())
+//                    .set(ApplyDetail::getEditDate,applyChange.getEditDate())
+//                    .set(ApplyDetail::getDuId,detail.getDuId())
+//                    .set(ApplyDetail::getWorktypeId,detail.getWorktypeId())
+//                    .eq(ApplyDetail::getId,oldModel.getId())
+//            );
+//            //鍛樺伐鎶曚繚鏄庣粏璁板綍 鍘嗗彶鏁版嵁
+//            memberInsuranceJoinMapper.update(null,new UpdateWrapper<MemberInsurance>().lambda()
+//                    .set(MemberInsurance::getDuId,detail.getDuId())
+//                    .set(MemberInsurance::getDuName,detail.getDuName())
+//                    .set(MemberInsurance::getWorktypeId,detail.getWorktypeId())
+//                    .set(MemberInsurance::getWorktypeName,detail.getWorkTypeName())
+//                    .eq(MemberInsurance::getRelationId,oldModel.getId())
+//            );
+//
+//        }
 
         Member member = memberMapper.selectById(detail.getMemberId());
         if(Objects.isNull(member)){
diff --git a/server/shop/src/main/java/com/doumee/api/business/ApplyChangeController.java b/server/shop/src/main/java/com/doumee/api/business/ApplyChangeController.java
index 12b3293..f4ac097 100644
--- a/server/shop/src/main/java/com/doumee/api/business/ApplyChangeController.java
+++ b/server/shop/src/main/java/com/doumee/api/business/ApplyChangeController.java
@@ -10,6 +10,7 @@
 import com.doumee.dao.business.model.ApplyChange;
 import com.doumee.dao.business.model.InsuranceApply;
 import com.doumee.service.business.ApplyChangeService;
+import com.doumee.service.business.InsuranceApplyService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -31,6 +32,8 @@
 
     @Autowired
     private ApplyChangeService applyChangeService;
+    @Autowired
+    private InsuranceApplyService insuranceApplyService;
 
     @PreventRepeat
     @ApiOperation("鏂板缓")
@@ -58,7 +61,9 @@
     @PostMapping("/uploadPidan")
     @RequiresPermissions("business:applychange:uploadPidan")
     public ApiResponse uploadPidan(@RequestBody ApplyChange applyChange) {
-        return ApiResponse.success(applyChangeService.uploadPidan(applyChange));
+        Integer applyId = applyChangeService.uploadPidan(applyChange);
+        insuranceApplyService.updateApplyCurrentFee(applyId,null);
+        return ApiResponse.success(null);
     }
     @PreventRepeat
     @ApiOperation("骞冲彴淇敼鎵瑰崟")
diff --git a/server/shop/src/main/java/com/doumee/api/business/UnionApplyController.java b/server/shop/src/main/java/com/doumee/api/business/UnionApplyController.java
index 2ca7485..d9f5a0d 100644
--- a/server/shop/src/main/java/com/doumee/api/business/UnionApplyController.java
+++ b/server/shop/src/main/java/com/doumee/api/business/UnionApplyController.java
@@ -9,6 +9,7 @@
 import com.doumee.dao.business.dto.*;
 import com.doumee.dao.business.model.InsuranceApply;
 import com.doumee.dao.business.model.UnionApply;
+import com.doumee.service.business.InsuranceApplyService;
 import com.doumee.service.business.UnionApplyService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -31,6 +32,8 @@
 
     @Autowired
     private UnionApplyService unionApplyService;
+    @Autowired
+    private InsuranceApplyService insuranceApplyService;
 
     @PreventRepeat
     @ApiOperation("鏂板缓")
@@ -135,8 +138,17 @@
     @RequiresPermissions("business:unionapply:uploadBXD")
     public ApiResponse uploadBXD(@RequestBody UnionApplyBXDDTO unionApplyBXDDTO) {
         unionApplyService.uploadBXD(unionApplyBXDDTO);
+        insuranceApplyService.updateApplyCurrentFee(null,unionApplyBXDDTO.getId());
+        unionApplyService.updateUnionApplyCurrentFee(unionApplyBXDDTO.getId());
         return ApiResponse.success(null);
     }
 
 
+    @ApiOperation("娴嬭瘯鍚堝苟鍗曞疄闄呴噾棰�")
+    @GetMapping("/testFee")
+    public ApiResponse testFee(Integer id) {
+        unionApplyService.updateUnionApplyCurrentFee(id);
+        return ApiResponse.success(null);
+    }
+
 }
diff --git a/server/shop/src/main/java/com/doumee/api/business/UnionChangeController.java b/server/shop/src/main/java/com/doumee/api/business/UnionChangeController.java
index f9581af..04a7479 100644
--- a/server/shop/src/main/java/com/doumee/api/business/UnionChangeController.java
+++ b/server/shop/src/main/java/com/doumee/api/business/UnionChangeController.java
@@ -12,6 +12,7 @@
 import com.doumee.dao.business.dto.UnionChangeBXDDTO;
 import com.doumee.dao.business.model.UnionApply;
 import com.doumee.dao.business.model.UnionChange;
+import com.doumee.service.business.InsuranceApplyService;
 import com.doumee.service.business.UnionChangeService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -34,6 +35,8 @@
 
     @Autowired
     private UnionChangeService unionChangeService;
+    @Autowired
+    private InsuranceApplyService insuranceApplyService;
 
     @PreventRepeat
     @ApiOperation("鏂板缓")
@@ -123,6 +126,7 @@
     @RequiresPermissions("business:unionchange:uploadBXD")
     public ApiResponse uploadBXD(@RequestBody UnionChangeBXDDTO unionChangeBXDDTO) {
         unionChangeService.uploadBXD(unionChangeBXDDTO);
+        insuranceApplyService.updateApplyCurrentFee(null,unionChangeBXDDTO.getApplyId());
         return ApiResponse.success(null);
     }
 
diff --git a/server/shop/src/main/java/com/doumee/api/system/SystemDictController.java b/server/shop/src/main/java/com/doumee/api/system/SystemDictController.java
index 71a297a..575d338 100644
--- a/server/shop/src/main/java/com/doumee/api/system/SystemDictController.java
+++ b/server/shop/src/main/java/com/doumee/api/system/SystemDictController.java
@@ -2,13 +2,16 @@
 
 import com.doumee.api.BaseController;
 import com.doumee.biz.system.SystemDictBiz;
+import com.doumee.biz.system.SystemDictDataBiz;
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.constants.OperaType;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
 import com.doumee.dao.system.dto.QuerySystemDictDTO;
 import com.doumee.dao.system.model.SystemDict;
+import com.doumee.dao.system.model.SystemDictData;
 import com.doumee.dao.system.vo.SystemDictListVO;
 import com.doumee.service.system.SystemDictService;
 import io.swagger.annotations.Api;
@@ -20,6 +23,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * @author Eva.Caesar Liu
@@ -79,4 +83,30 @@
     public ApiResponse<PageData<SystemDictListVO>> findPage (@RequestBody PageWrap<QuerySystemDictDTO> pageWrap) {
         return ApiResponse.success(systemDictService.findPage(pageWrap));
     }
+
+
+
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
+
+    @ApiOperation("鏌ヨ瀛楀吀鍊�")
+    @PostMapping("/getAgreement")
+    public ApiResponse<List<String>> getAgreement() {
+        List<String> list = new ArrayList<>();
+        SystemDictData use = systemDictDataBiz.queryByCode(Constants.PROTOCOL,Constants.USE);
+        if(Objects.nonNull(use)){
+            list.add(use.getCode());
+        }else{
+            list.add("");
+        }
+        SystemDictData privacy = systemDictDataBiz.queryByCode(Constants.PROTOCOL,Constants.PRIVACY);
+        if(Objects.nonNull(privacy)){
+            list.add(privacy.getCode());
+        }else{
+            list.add("");
+        }
+        return ApiResponse.success(list);
+    }
+
+
 }
diff --git a/server/shop/src/main/resources/application.yml b/server/shop/src/main/resources/application.yml
index 0252e02..b5c9b1e 100644
--- a/server/shop/src/main/resources/application.yml
+++ b/server/shop/src/main/resources/application.yml
@@ -12,7 +12,7 @@
 #  application:git
 #    name: doumeemes
   profiles:
-    active: dev
+    active: pro
 
   # JSON杩斿洖閰嶇疆
   jackson:

--
Gitblit v1.9.3