Sfoglia il codice sorgente

Merge branch 'master' into dev_jzg_lipf_v20260518

lipf 4 mesi fa
parent
commit
49683a6711
32 ha cambiato i file con 512 aggiunte e 154 eliminazioni
  1. 8 0
      commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesAddParam.java
  2. 6 0
      commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesEditParam.java
  3. 18 0
      commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostCopyParam.java
  4. 6 0
      commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementUndwrtRules.java
  5. 3 2
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  6. 5 0
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlAgreementInsCompanyVo.java
  7. 35 0
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlSchemeCopyVo.java
  8. 6 0
      commons/src/main/java/com/jzg/commons/entity/vo/AgreementRulesVo.java
  9. 4 4
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerApplyApplicationRequestBuild.java
  10. 58 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java
  11. 1 0
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/constant/enums/RequestUrl.java
  12. 1 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerApplyApplicationRequest.java
  13. 14 17
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java
  14. 2 1
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerSearchVehicleByVinRequest.java
  15. 8 6
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  16. 1 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java
  17. 3 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerRequestComponent.java
  18. 4 4
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java
  19. 58 10
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java
  20. 6 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/QrCodeController.java
  21. 85 83
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  22. 6 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  23. 39 20
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersQrcodeServiceImpl.java
  24. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  25. 9 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java
  26. 6 0
      tenant/organization/src/main/java/com/jzg/organization/controller/PtlAgreementCostController.java
  27. 7 0
      tenant/organization/src/main/java/com/jzg/organization/controller/SchemeController.java
  28. 5 0
      tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementCostService.java
  29. 8 0
      tenant/organization/src/main/java/com/jzg/organization/service/PtlSchemeService.java
  30. 41 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java
  31. 4 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java
  32. 54 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java

+ 8 - 0
commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesAddParam.java

@@ -7,6 +7,8 @@ import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Size;
 import lombok.Data;
 
+import java.time.LocalDateTime;
+import java.util.Date;
 import java.util.List;
 
 @Schema(description = "承保规则新增dto")
@@ -17,6 +19,12 @@ public class AgreementRulesAddParam {
     @NotNull(message = "协议id不能为空")
     private String agreementId;
 
+    @Schema(description = "生效开始时间")
+    private String startTime;
+
+    @Schema(description = "生效截止时间")
+    private String endTime;
+
     @Schema(description = "规则属性")
     @NotEmpty(message = "规则属性不能为空")
     private List<PtlAgreementUndwrtRulesAttrLink> rulesAttrList;

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesEditParam.java

@@ -20,6 +20,12 @@ public class AgreementRulesEditParam {
     @NotNull(message = "协议id不能为空")
     private String agreementId;
 
+    @Schema(description = "生效开始时间")
+    private String startTime;
+
+    @Schema(description = "生效截止时间")
+    private String endTime;
+
     @Schema(description = "规则属性")
     @NotEmpty(message = "规则属性不能为空")
     private List<PtlAgreementUndwrtRulesAttrLink> rulesAttrList;

+ 18 - 0
commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostCopyParam.java

@@ -0,0 +1,18 @@
+package com.jzg.commons.entity.dto;
+
+
+import com.jzg.commons.core.base.PageRequest;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@Schema(description = "协议费用复制参数")
+public class PtlAgreementCostCopyParam extends PageRequest {
+
+    @Schema(description = "需要复制的费用id")
+    private String costId;
+
+
+}

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementUndwrtRules.java

@@ -23,6 +23,12 @@ public class PtlAgreementUndwrtRules extends BaseModel {
     @Schema(description = "协议id")
     private String agreementId;
 
+    @Schema(description = "生效开始时间")
+    private String startTime;
+
+    @Schema(description = "生效结束时间")
+    private String endTime;
+
     /** 规则描述 */
     @Schema(description = "规则描述")
     private String ruleDescription;

+ 3 - 2
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java

@@ -135,7 +135,7 @@ public class QuoteEchoVo extends QuoteVo {
      * 费用信息
      */
     @Data
-    private static class OrdersCostsVo{
+    public static class OrdersCostsVo{
         @Schema(description = "交强险保费")
         private BigDecimal ciPremium;
 
@@ -434,7 +434,7 @@ public class QuoteEchoVo extends QuoteVo {
     }
 
 
-    public void setInsCompanyVo(EsmInsCompany esmInsCompany){
+    public void setInsCompanyVo(EsmInsCompany esmInsCompany, OrdersCostsVo costsVo){
         if(Objects.isNull(insCompanyVo)){
             this.insCompanyVo = new ArrayList<>();
         }
@@ -447,6 +447,7 @@ public class QuoteEchoVo extends QuoteVo {
         ptlAgreementInsCompanyVo.setCompanyCode(esmInsCompany.getCompanyCode());
         ptlAgreementInsCompanyVo.setNameSimple(esmInsCompany.getNameSimple());
         ptlAgreementInsCompanyVo.setCnName(esmInsCompany.getCode());
+        ptlAgreementInsCompanyVo.setCosts(costsVo);
         this.insCompanyVo.add(ptlAgreementInsCompanyVo);
 
     }

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlAgreementInsCompanyVo.java

@@ -2,6 +2,8 @@ package com.jzg.commons.entity.scheme.vo;
 
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.po.PtlAgreement;
+import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
+import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -42,4 +44,7 @@ public class PtlAgreementInsCompanyVo extends EsmInsCompany implements Serializa
     @Schema(description = "投保指引")
     private String insGuide;
 
+    @Schema(description = "费用")
+    private QuoteEchoVo.OrdersCostsVo costs;
+
 }

+ 35 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlSchemeCopyVo.java

@@ -0,0 +1,35 @@
+package com.jzg.commons.entity.scheme.vo;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.jzg.commons.constants.ProductsType;
+import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
+import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesDictLabal;
+import com.jzg.commons.entity.scheme.po.*;
+import com.jzg.commons.exception.ValidateException;
+import com.jzg.commons.util.idgen.IdGenerate;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PtlSchemeCopyVo {
+
+    @Schema(description = "方案id")
+    private String schemeId;
+
+    @Schema(description = "险种code")
+    private String productCode;
+
+}

+ 6 - 0
commons/src/main/java/com/jzg/commons/entity/vo/AgreementRulesVo.java

@@ -22,6 +22,12 @@ public class AgreementRulesVo extends BaseModel {
     @Schema(description = "协议id")
     private String agreementId;
 
+    @Schema(description = "生效开始时间")
+    private String startTime;
+
+    @Schema(description = "生效截止时间")
+    private String endTime;
+
     /** 规则描述 */
     @Schema(description = "规则描述")
     private String ruleDescription;

+ 4 - 4
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerApplyApplicationRequestBuild.java

@@ -25,7 +25,7 @@ public final class AnShengCrawlerApplyApplicationRequestBuild {
         throw new IllegalStateException("Utility class");
     }
 
-    public static AnShengCrawlerApplyApplicationRequest build(AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApply, AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply, AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse, String compulsoryVersionNo) {
+    public static AnShengCrawlerApplyApplicationRequest build(AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApply, AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply, AnShengCrawlerGetUserDetailResponse.DataDTO.AgentDefineDTO userDetailResponse, String compulsoryVersionNo,String brand) {
         AnShengCrawlerApplyApplicationRequest autoSpecialPromiseRequest = new AnShengCrawlerApplyApplicationRequest();
         String jsonString = JSONObject.toJSONString(calculatePremiumApply);
         String personnelName = InfoExtractUtil.extractPersonnelName(jsonString);
@@ -59,7 +59,7 @@ public final class AnShengCrawlerApplyApplicationRequestBuild {
             //contractsDTO.setBrandAutoModel(brandAutoModelDTO);
             contractsDTO.setSaleChannelSource(new AnShengCrawlerApplyApplicationRequest.ContractsDTO.SaleChannelSourceDTO(""));
             contractsDTO.setUnderwriteInfos(List.of(new AnShengCrawlerApplyApplicationRequest.ContractsDTO.UnderwriteInfosDTO("1", "")));
-            AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO policyExtendDTO = buildPolicyExtend(insuranerName, personDTO.getMobileTelephone());
+            AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO policyExtendDTO = buildPolicyExtend(insuranerName, personDTO.getMobileTelephone(),brand);
             contractsDTO.setPolicyExtend(policyExtendDTO);
             // 险种信息
             List<AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyCoveragesDTO> policyCoveragesDTO = buildPolicyCoveragesList(responseContracts.getPolicyCoverages(), requestContracts.getPolicyCoverages());
@@ -539,7 +539,7 @@ public final class AnShengCrawlerApplyApplicationRequestBuild {
         return policySaleInfoDTO;
     }
 
-    private static AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO buildPolicyExtend(String insuranerName, String phone) {
+    private static AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO buildPolicyExtend(String insuranerName, String phone,String brand) {
         AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO policyExtend = new AnShengCrawlerApplyApplicationRequest.ContractsDTO.PolicyExtendDTO();
         policyExtend.setOrderNumber("");
         policyExtend.setRiskSharingBusinessType("1");
@@ -549,7 +549,7 @@ public final class AnShengCrawlerApplyApplicationRequestBuild {
         policyExtend.setIssueChannel("5");
         policyExtend.setUsageAttributeCode("1");
         policyExtend.setRunRegionCode("");
-        policyExtend.setBrand("");
+        policyExtend.setBrand(brand);
         policyExtend.setInsuranceVehicleRelationship("1");
         policyExtend.setUsageAttributeCodePM("");
         policyExtend.setAvgMile("");

+ 58 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java

@@ -1,17 +1,23 @@
 package com.jzg.quotation.ansheng.crawler.build;
 
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.ansheng.crawler.constant.enums.DepartmentPlanCode;
 import com.jzg.quotation.ansheng.crawler.entity.response.AnShengCrawlerCalculatePremiumApplyResponse;
 import com.jzg.quotation.commons.component.ConversionOfQuoteInformation;
+import lombok.extern.slf4j.Slf4j;
 
 import java.util.List;
 
+
+@Slf4j
 public final class AnShengCrawlerQuoteResultsVoBuild {
 
     public AnShengCrawlerQuoteResultsVoBuild() {
@@ -57,11 +63,62 @@ public final class AnShengCrawlerQuoteResultsVoBuild {
             }
         });
 
-
+        quoteResultsVo.setScoreVo(buildScoreVo(calculatePremiumApply));
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         return quoteResultsVo;
     }
 
+
+    private static QuoteResultsVo.ScoreVo buildScoreVo( AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply) {
+        QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
+        JSONArray scoreArray = new JSONArray();
+        AnShengCrawlerCalculatePremiumApplyResponse.DataDTO data = calculatePremiumApply.getData();
+        String basicstring = data.getBasicstring();
+        if (StringUtils.isNotEmpty(basicstring)){
+            String[] parts = basicstring.split(":");
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName",parts.length > 0 ? parts[0].trim() : "")
+                    .fluentPut("scoreKey","basicstring")
+                    .fluentPut("score",parts.length > 1 ? parts[1].trim() : ""));
+        }
+        String blackDivisor = data.getBlackDivisor();
+        if (StringUtils.isNotEmpty(blackDivisor)){
+            String[] black = blackDivisor.split(":");
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName",black.length > 0 ? black[0].trim() : "")
+                    .fluentPut("scoreKey","blackDivisor")
+                    .fluentPut("score",black.length > 0 ? black[1].trim() : ""));
+        }
+        String comprehensiveScoreStr = data.getComprehensiveScoreStr();
+        if (StringUtils.isNotEmpty(comprehensiveScoreStr)){
+            String[] comprehensiveScore = comprehensiveScoreStr.split(":");
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName",comprehensiveScore.length > 0 ? comprehensiveScore[0].trim() : "")
+                    .fluentPut("scoreKey","comprehensiveScoreStr")
+                    .fluentPut("score",comprehensiveScore.length > 0 ? comprehensiveScore[1].trim() : ""));
+        }
+        String riskScore = data.getRiskScore();
+        if (StringUtils.isNotEmpty(riskScore)){
+            String[] riskScoreStr = riskScore.split(":");
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName",riskScoreStr.length > 0 ? riskScoreStr[0].trim() : "")
+                    .fluentPut("scoreKey","riskScore")
+                    .fluentPut("score",riskScoreStr.length > 0 ? riskScoreStr[1].trim() : ""));
+        }
+        String unifiedScore = data.getUnifiedScore();
+        if (StringUtils.isNotEmpty(unifiedScore)){
+            String[] unifiedScoreStr = unifiedScore.split(":");
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName",unifiedScoreStr.length > 0 ? unifiedScoreStr[0].trim() : "")
+                    .fluentPut("scoreKey","unifiedScore")
+                    .fluentPut("score",unifiedScoreStr.length > 0 ? unifiedScoreStr[1].trim() : ""));
+        }
+        scoreVo.setScoreJson(scoreArray);
+        return scoreVo;
+    }
+
+
+
     /**
      * 构造交强商业时间信息
      *

+ 1 - 0
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/constant/enums/RequestUrl.java

@@ -23,6 +23,7 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     QUERY_AUTO_MATCH_PRICE_RATIO("portalapi/queryAutoMatchPriceRatio", ""),
     SEARCH_VEHICLE_BY_VIN("/portalapi/searchVehicleByVIN", "车架号查询"),
     CALCULATE_PREMIUM_APPLY("/portalapi/calculatePremiumApply", "保费计算"),
+    AUTORESETTIME("/portalapi/autoResetTime", "计算时间"),
     // 上传影像
     FILE_UPLOAD("/portalapi/fileUpload", "影像上传"),
     // 核保

+ 1 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerApplyApplicationRequest.java

@@ -1007,7 +1007,7 @@ public class AnShengCrawlerApplyApplicationRequest {
             private String vehicleTypeName;
             @JsonProperty("makeDate")
             @JSONField(name = "makeDate")
-            private Integer makeDate;
+            private String makeDate;
             @JsonProperty("detailDesc")
             @JSONField(name = "detailDesc")
             private String detailDesc;

+ 14 - 17
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerCalculatePremiumApplyMessage.java

@@ -13,7 +13,6 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.springframework.util.ObjectUtils;
-import org.springframework.util.StringUtils;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -655,7 +654,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
             private String vehicleTypeName;
             @JsonProperty("makeDate")
             @JSONField(name = "makeDate")
-            private Integer makeDate;
+            private String makeDate;
             @JsonProperty("stopFlag")
             @JSONField(name = "stopFlag")
             private String stopFlag;
@@ -790,7 +789,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 this.seats = carInfoVo.getSeatCount();
                 this.rbCode = brandAutoModel.getRbCode();
                 this.otherEnergyTypeDesc = "";
-                this.madeDate = brandAutoModel.getMakeDate();
+                this.madeDate = dataDTO.getMadeDate();
                 this.exhaustCapability = brandAutoModel.getExhaustCapabilityString();
                 this.noDamageYears = "";
                 this.specialVehicleFlag = "";
@@ -840,12 +839,9 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 this.vehicleFgwCode = brandAutoModel.getAutoModelChnName();
                 this.vehicleFgwName = brandAutoModel.getBrandChnName();
                 this.vehicleModelType = "";
-                this.vehicleStyleDesc = "";
+                this.vehicleStyleDesc = "小型轿车";
                 this.vehicleTypeName = carInfoVo.getCarKindName();
-                if (StringUtils.hasLength(brandAutoModel.getMakeDate())) {
-                    this.makeDate = Integer.valueOf(brandAutoModel.getMakeDate());
-                }
-                this.stopFlag = brandAutoModel.getStopFlag();
+                this.makeDate = "";
                 this.detailDesc = brandAutoModel.getRemark();
                 this.vehicleCategory = "";
                 this.personnelName = personnelName;
@@ -861,7 +857,8 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 this.vehicleTonnages = "0";
                 this.power = brandAutoModel.getPower();
                 this.maxDesignSpeed = 0;
-                this.runCardCertificateDate = TimeProcessing.dateToDateTime(carInfoVo.getIssueDate());
+                //this.runCardCertificateDate = TimeProcessing.dateToDateTime(carInfoVo.getIssueDate());
+                this.runCardCertificateDate = "";
                 this.customerNegotiatePrice = customerNegotiatePrice;
                 this.originalCustomerNegotiatePrice = customerNegotiatePrice;
                 this.fleetNo = "";
@@ -1003,7 +1000,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 private String dbVehicleWeigth;
                 @JsonProperty("riskScore")
                 @JSONField(name = "riskScore")
-                private Integer riskScore;
+                private String riskScore;
                 @JsonProperty("riskScoreTwenty")
                 @JSONField(name = "riskScoreTwenty")
                 private String riskScoreTwenty;
@@ -1096,7 +1093,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                 private String fdConfigId;
                 @JsonProperty("modelDiscount")
                 @JSONField(name = "modelDiscount")
-                private Double modelDiscount;
+                private String modelDiscount;
                 @JsonProperty("autoFloatHandingCost")
                 @JSONField(name = "autoFloatHandingCost")
                 private Integer autoFloatHandingCost;
@@ -1183,7 +1180,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                     this.ratioFluctuateType = "0";
                     this.repairFactory = "";
                     this.dbVehicleWeigth = brandAutoModel.getCurbWeightMin();
-                    this.riskScore = null;
+                    this.riskScore = "";
                     this.riskScoreTwenty = "";
                     this.algrId = "";
                     this.riskScoreColor = "";
@@ -1214,7 +1211,7 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                     this.autoFloatRatioOther = "";
                     this.appointAreaCode = "";
                     this.fdConfigId = "";
-                    this.modelDiscount = 0D;
+                    this.modelDiscount = "";
                     this.autoFloatHandingCost = 0;
                     this.modelrate = "";
                     this.advicediscount = "";
@@ -1809,17 +1806,17 @@ public class AnShengCrawlerCalculatePremiumApplyMessage {
                         this.certificateType = customerInfoVo.getIdentifyType();
                         this.certificateNo = customerInfoVo.getIdentifyNumber();
                         this.sexCode = customerInfoVo.getGender();
-                        this.birthday = customerInfoVo.getBirthday();
-                        this.personnelAge = String.valueOf(customerInfoVo.getAge());
+                        this.birthday = customerInfoVo.getBirthday() + " 00:00:00";
+                        this.personnelAge = String.valueOf(customerInfoVo.getAge() + 1);
                         this.address = customerInfoVo.getAddr();
                         this.positionn = "";
                         this.mobileTelephone = customerInfoVo.getMobile();
                         this.email = "";
                         this.postcode = "030000";
                         this.vipMark = "1";
-                        this.effectedDate = customerInfoVo.getIdentifyValidDate();
+                        this.effectedDate = customerInfoVo.getIdentifyValidDate()  + " 00:00:00";
                         this.certType = "0";
-                        this.expiredDate = customerInfoVo.getIdentifyValidEndDate();
+                        this.expiredDate = customerInfoVo.getIdentifyValidEndDate() + " 00:00:00";
                         this.isRuralOrUrban = "";
                         this.idCardAddress = "";
                         this.nationalityType = "142";

+ 2 - 1
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/entity/request/AnShengCrawlerSearchVehicleByVinRequest.java

@@ -42,7 +42,7 @@ public class AnShengCrawlerSearchVehicleByVinRequest {
     @JsonProperty("customerSourceCode")
     private String customerSourceCode;
 
-    public AnShengCrawlerSearchVehicleByVinRequest(CarInfoVo carInfoVo, String departmentCode, String agentCode) {
+    public AnShengCrawlerSearchVehicleByVinRequest(CarInfoVo carInfoVo, String departmentCode, String agentCode,String realBusinessType) {
         this.vin = carInfoVo.getVinNo();
         this.priceType = "04";
         if(carInfoVo.isNewEnergyMark()){
@@ -56,5 +56,6 @@ public class AnShengCrawlerSearchVehicleByVinRequest {
         this.vehicleDBFlag = "1";
         this.vehicleType = carInfoVo.getCarKindCode();
         this.agentCode = agentCode;
+        this.realBusinessType = realBusinessType;
     }
 }

+ 8 - 6
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java

@@ -30,10 +30,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -98,12 +95,16 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         String checkVehicleCodeSecretGenerate = CheckVehicleCodeSecretGenerateUtils.getCheckVehicleCodeSecretGenerate(checkVehicleCode, userDetailResponse.getUserId());
 
         // 车架号查询
-        AnShengCrawlerSearchVehicleByVinRequest anShengCrawlerSearchVehicleByVinRequest = new AnShengCrawlerSearchVehicleByVinRequest(quoteVo.getCarInfoVo(), userDetailResponse.getDepartmentCode(), userDetailResponse.getAgentCode());
+        AnShengCrawlerSearchVehicleByVinRequest anShengCrawlerSearchVehicleByVinRequest = new AnShengCrawlerSearchVehicleByVinRequest(quoteVo.getCarInfoVo(), userDetailResponse.getDepartmentCode(), userDetailResponse.getAgentCode(),userDetailResponse.getRealBusinessType());
         List<AnShengCrawlerSearchVehicleByVinResponse.DataDTO> dataDTOS = anShengCrawlerRequestComponent.searchVehicleByVin(anShengCrawlerSearchVehicleByVinRequest, httpHeaders);
+        if (Objects.isNull(dataDTOS)){
+            throw new SystemException("车型查询错误");
+        }
         AnShengCrawlerSearchVehicleByVinResponse.DataDTO dataDTO = CarModelsFilterUtils.to(dataDTOS, quoteVo.getCarInfoVo());
         // 报价
         AnShengCrawlerCalculatePremiumApplyMessage crawlerCalculatePremiumApply = new AnShengCrawlerCalculatePremiumApplyMessage(quoteVo, dataDTO, userDetailResponse, departmentPlanCode, checkVehicleCodeSecretGenerate);
         log.info("安盛报价参数:{}", JSONObject.toJSONString(crawlerCalculatePremiumApply));
+
         AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply = anShengCrawlerRequestComponent.calculatePremiumApply(crawlerCalculatePremiumApply, httpHeaders);
         // 处理重复投保
         if (calculatePremiumApply.getMessage().contains("重复投保")) {
@@ -127,7 +128,7 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
                 });
             });
             log.info("安盛报价返回数据:{}", JSONObject.toJSONString(calculatePremiumApply));
-            AnShengCrawlerApplyApplicationRequest autoSpecialPromiseRequest = AnShengCrawlerApplyApplicationRequestBuild.build(crawlerCalculatePremiumApply, calculatePremiumApply, userDetailResponse, compulsoryVersionNo);
+            AnShengCrawlerApplyApplicationRequest autoSpecialPromiseRequest = AnShengCrawlerApplyApplicationRequestBuild.build(crawlerCalculatePremiumApply, calculatePremiumApply, userDetailResponse, compulsoryVersionNo,dataDTO.getBrandAutoModel().getBrand());
             // 缓存数据
             anShengCrawlerCacheComponent.cacheQuoteRequest(ordersNo, autoSpecialPromiseRequest);
         }
@@ -200,6 +201,7 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
             }
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
         }
+        underwritingResultsVo.setPaymentLink("");
         return underwritingResultsVo;
     }
 

+ 1 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java

@@ -239,6 +239,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
         CarModelQueryResponse.vehicle vehicle = CarModelsFilterUtils.to(carModelQueryResponse.getVehicleList(), carInfoVo);
 
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
+        underwritingResultsVo.setCompanyOrderNo(underwritingVo.getInsOrders().getCompanyOrderNo());
         // 核保
         SubmitRequest submitRequest = new SubmitRequest(underwritingVo,vehicle, parameters);
         SubmitResponse submitResponse = chengTaiRequestApiComponent.submit(submitRequest,apiUrl);

+ 3 - 2
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerRequestComponent.java

@@ -481,8 +481,9 @@ public class GuoRenCrawlerRequestComponent {
      */
     public GuoRenCrawlerQueryPrpallProposalInfoData queryPrpallProposalInfo(String loginUserCode, String loginComCode, String proposalNo, HttpHeaders httpHeaders) {
         GuoRenCrawlerQueryPrpallProposalInfoRequest queryPrpallProposalInfoRequest = new GuoRenCrawlerQueryPrpallProposalInfoRequest(loginUserCode, loginComCode, proposalNo);
-        List<GuoRenCrawlerQueryPrpallProposalInfoData> queryPrpallProposalInfoData = request(RequestUrl.QUERY_PRPALL_PROPOSAL_INFO, queryPrpallProposalInfoRequest, httpHeaders);
-        return queryPrpallProposalInfoData.get(0);
+        GuoRenCrawlerBaseResponse<List<GuoRenCrawlerQueryPrpallProposalInfoData>> response = request(RequestUrl.QUERY_PRPALL_PROPOSAL_INFO, queryPrpallProposalInfoRequest, new ParameterizedTypeReference<>() {
+        }, httpHeaders);
+        return response.getData().get(0);
     }
 
     /**

+ 4 - 4
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java

@@ -28,13 +28,12 @@ import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerInitSelectRe
 import com.jzg.quotation.guoren.crawler.entity.response.*;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerQuoteProcessService;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.http.util.TextUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 
-import java.util.Map;
-import java.util.stream.Collectors;
-
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteProcessService {
@@ -114,8 +113,9 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
         String token = guoRenCrawlerCacheComponent.getToken(username);
 //        String token = "eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3Nzg5MjY2MDB9.UYGTs0DQgbZJinMWJExUV18JhfJW23JonveQVVq6N5Muy_vu6Py8pL-AI5Ohv0BDoCCfdOD7SjLmiCqGy4uU9130O1_QlLzyxsriiBKUPXPJKbipftpqSdjYyFSgfNSIySO99hs005Ip89HnkaT34ephMA-C8jyyxGShQdNkuxI";
         if (!StringUtils.hasText(token)) {
-            throw new TokenExpireException();
+            throw new TokenExpireException("500", "国任财险账号登录过期,请重新登录");
         }
+        log.info("国任账号登录信息:{}", token);
         headers.add(HttpHeaders.AUTHORIZATION, token);
         return headers;
     }

+ 58 - 10
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java

@@ -1,43 +1,38 @@
 package com.jzg.quotation.guoren.crawler.service.impl;
 
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
-import com.jzg.commons.core.page.HttpResult;
-import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
+import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
-import com.jzg.commons.util.AssertionUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
-import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.TimeProcessing;
-import com.jzg.quotation.guoren.api.entity.Response.IdentifyCodeDataResponse;
 import com.jzg.quotation.guoren.crawler.build.GuoRenCrawlerQuoteResultsVoBuild;
-import com.jzg.quotation.guoren.crawler.component.GuoRenCrawlerCacheComponent;
 import com.jzg.quotation.guoren.crawler.component.GuoRenCrawlerRequestComponent;
 import com.jzg.quotation.guoren.crawler.constant.enums.RequestUrl;
 import com.jzg.quotation.guoren.crawler.entity.GuoRenCrawlerConfigureParameters;
+import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenPrpTitemCarDTO;
 import com.jzg.quotation.guoren.crawler.entity.dto.PrpTMainDTO;
 import com.jzg.quotation.guoren.crawler.entity.po.GuoRenCrawlerOrder;
 import com.jzg.quotation.guoren.crawler.entity.po.OrderCommon;
 import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerCalculationPremiumRequest;
-import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenPrpTitemCarDTO;
 import com.jzg.quotation.guoren.crawler.entity.response.*;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerOrderService;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerQuoteProcessService;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerRequest;
 import lombok.RequiredArgsConstructor;
-import org.apache.http.util.TextUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -236,10 +231,63 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
     }
 
     @Override
-    public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) throws Exception {
+    public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         OrderCommon orderCommon = getOrderCommon(orderStatusVo.getOrder());
         GuoRenCrawlerQueryPrpallProposalInfoData queryPrpallProposalInfo = guoRenCrawlerRequestComponent.queryPrpallProposalInfo(orderCommon.getUsername(), orderCommon.getComCode(), orderCommon.getBusinessNo(), orderCommon.getHttpHeaders());
-        return new OrderStatusResultVo();
+        OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
+        if (queryPrpallProposalInfo == null) {
+            return orderStatusResultVo;
+        }
+
+        // 获取订单信息
+        GuoRenCrawlerOrder guoRenCrawlerOrder = guoRenCrawlerOrderService.getById(orderStatusVo.getOrder().getOrdersNo());
+        InsOrders insOrders = orderStatusVo.getInsOrders();
+
+        List<String> proposalNos = queryPrpallProposalInfo.getProposalNo();
+        List<String> policyNos = queryPrpallProposalInfo.getPolicyNo();
+        String underWriteFlag = queryPrpallProposalInfo.getUnderWriteFlag();
+
+        // 匹配交强和商业投保单的索引(平行数组,索引一一对应)
+        int ciIndex = proposalNos != null ? proposalNos.indexOf(guoRenCrawlerOrder.getCiPolicyNumber()) : -1;
+        int biIndex = proposalNos != null ? proposalNos.indexOf(guoRenCrawlerOrder.getBiPolicyNumber()) : -1;
+
+        // 获取交强和商业的保单号
+        String ciPolicyNo = ciIndex >= 0 && proposalNos != null && ciIndex < proposalNos.size() ? proposalNos.get(ciIndex) : null;
+        String biPolicyNo = biIndex >= 0 && proposalNos != null && biIndex < proposalNos.size() ? proposalNos.get(biIndex) : null;
+
+        boolean auditPassed = "1".equals(underWriteFlag);
+        boolean ciHasPolicy = StringUtils.hasLength(ciPolicyNo);
+        boolean biHasPolicy = StringUtils.hasLength(biPolicyNo);
+
+        // 待核保状态 → 核保通过 → 待缴费(与API版逻辑保持一致)
+        if (insOrders != null && InsOrderStatusEnum.WAIT_AUDIT.getCode().equals(insOrders.getOrderStatus())) {
+            // 单交 / 单商 / 交商 任一核保通过即转为待缴费
+            boolean jqBoo = ciIndex >= 0 && biIndex < 0 && auditPassed;
+            boolean syBoo = biIndex >= 0 && ciIndex < 0 && auditPassed;
+            boolean jqSyBoo = ciIndex >= 0 && biIndex >= 0 && auditPassed;
+            if (jqBoo || syBoo || jqSyBoo) {
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.PAY_PENDING);
+                PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+                paymentLinkVo.setOrder(orderStatusVo.getOrder());
+                PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
+                orderStatusResultVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
+            }
+        }
+
+        // 保单号存在 → 已承保/已出单
+        if (ciHasPolicy || biHasPolicy) {
+            if (ciHasPolicy) {
+                orderStatusResultVo.setJqPolicyno(ciPolicyNo);
+                orderStatusResultVo.setJqApplyNo(guoRenCrawlerOrder.getCiPolicyNumber());
+            }
+            if (biHasPolicy) {
+                orderStatusResultVo.setSyPolicyno(biPolicyNo);
+                orderStatusResultVo.setSyApplyNo(guoRenCrawlerOrder.getBiPolicyNumber());
+            }
+            orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.UNDERWRITED);
+        }
+
+        return orderStatusResultVo;
     }
 
     private OrderCommon getOrderCommon(OrderBase orderBase) {

+ 6 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/QrCodeController.java

@@ -24,6 +24,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.ModelAndView;
@@ -108,7 +109,11 @@ public class QrCodeController extends BaseController {
 
     @PostMapping(value = "/destroyQrCode")
     @Operation(summary = "销毁二维码")
-    public ModelAndView destroyQrCode(@NotBlank(message = "订单号号不能为空") @RequestParam("orderNo") String orderNo) {
+    public ModelAndView destroyQrCode(@RequestBody JSONObject body) {
+        String orderNo = body.getString("orderNo");
+        if (StringUtils.isBlank(orderNo)) {
+            throw new IllegalArgumentException("订单号不能为空");
+        }
         ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView());
         insOrdersQrcodeService.destroyQrCode(orderNo);
         modelAndView.addObject("code", 200);

+ 85 - 83
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -60,6 +60,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
+import org.apache.http.util.TextUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -242,7 +243,7 @@ public class UnifyOrderManager {
         String systemCode = getSystemCode();
         String companyName = CompanyConstants.getCompanyNameByCode(esmInsCompanyHttpResult.getData().getCompanyCode());
 
-        log.info("查询保司配置的协议:systemCode=[{}],companyId=[{}]",systemCode, esmInsCompanyHttpResult.getData().getId());
+        log.info("查询保司配置的协议:systemCode=[{}],companyId=[{}]", systemCode, esmInsCompanyHttpResult.getData().getId());
         HttpResult<List<PtlAgreement>> byCompanyId = orgClient.getByCompanyId(esmInsCompanyHttpResult.getData().getId(), systemCode);
         if (CollUtil.isEmpty(byCompanyId.getData())) {
             AssertionUtils.isFail(true, "保司未配置协议");
@@ -697,7 +698,7 @@ public class UnifyOrderManager {
     @Operation(summary = "获取订单状态")
     @PostMapping("/getOrderStatus")
     public HttpResult getOrderStatus(@RequestBody OrderStatusVo orderStatusVo) throws Exception {
-        log.info("更新订单状态:orderStatusVo=[{}]",JSONUtil.toJsonStr(orderStatusVo));
+        log.info("更新订单状态:orderStatusVo=[{}]", JSONUtil.toJsonStr(orderStatusVo));
         InsOrders insOrders = insOrdersService.getById(orderStatusVo.getOrder().getOrdersNo());
         AssertionUtils.isFail(Objects.isNull(insOrders), "订单不存在");
         HttpResult<EsmInsCompany> esmInsCompanyHttpResult = platformClient.findById(insOrders.getCompanyId());
@@ -719,16 +720,17 @@ public class UnifyOrderManager {
         InsOrdersAccidentalDriving insOrdersAccidentalDriving = insOrdersAccidentalDrivingService.getByOrderId(insOrders.getId());
         orderStatusVo.setInsOrdersAccidentalDriving(insOrdersAccidentalDriving);
         OrderStatusResultVo orderStatusResultVo = orderStatusService.queryOrderState(orderStatusVo);
-        log.info("订单状态orderStatusResultVo=[{}]",JSONUtil.toJsonStr(orderStatusResultVo));
+        log.info("订单状态orderStatusResultVo=[{}]", JSONUtil.toJsonStr(orderStatusResultVo));
         // 保存状态查询结果
         insOrdersService.orderAfterUpdateOrderStatus(orderStatusVo.getOrder().getOrdersNo(), orderStatusResultVo);
         // 保存支付链接
-        insOrders.setPayLink(orderStatusResultVo.getPaymentLink());
+        insOrders.setPayLink(!TextUtils.isEmpty(orderStatusResultVo.getPaymentLink()) ? orderStatusResultVo.getPaymentLink() : insOrders.getPayLink());
         insOrdersQrcodeService.updateQrCode(insOrders);
         //////////////////////////////////////////新增营销抽奖活动////////////////////////////////////////////////
         // 承保(客户)、出单(业务员)
-        if(orderStatusResultVo.getOrderStatus() == InsOrderStatusEnum.UNDERWRITED){
-            doSomethingAfterUnderwited(insOrders);
+        if (orderStatusResultVo.getOrderStatus() == InsOrderStatusEnum.UNDERWRITED) {
+            // TODO: 本地生活逻辑未调试通畅,暂时先注掉
+            //doSomethingAfterUnderwited(insOrders);
         }
         return HttpResult.ok("状态刷新成功");
     }
@@ -744,7 +746,7 @@ public class UnifyOrderManager {
     public HttpResult<String> mockUnderwited(@RequestBody OrderStatusVo orderStatusVo) throws Exception {
         log.info("模拟承保(跳过实际付款操作). orderStatusVo=[{}]", JSONUtil.toJsonStr(orderStatusVo));
         InsOrders insOrders = insOrdersService.getById(orderStatusVo.getOrder().getOrdersNo());
-        if(!"4".equals(insOrders.getOrderStatus())){
+        if (!"4".equals(insOrders.getOrderStatus())) {
             return HttpResult.error("只能对待缴费的订单进行模拟承保");
         }
         AssertionUtils.isFail(Objects.isNull(insOrders), "订单不存在");
@@ -772,16 +774,16 @@ public class UnifyOrderManager {
         OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
         orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.UNDERWRITED);
         // 保存状态查询结果
-        try{
+        try {
             // 设置订单状态为 已承保(5)
-            InsOrders insOrdersItem = new  InsOrders();
+            InsOrders insOrdersItem = new InsOrders();
             insOrdersItem.setOrderStatus("5");
             insOrdersItem.setAuditStatus(1);
             insOrdersItem.setId(insOrders.getId());
             insOrdersService.updateById(insOrdersItem);
             insOrdersService.orderAfterUpdateOrderStatus(orderStatusVo.getOrder().getOrdersNo(), orderStatusResultVo);
-        }catch (Exception e){
-            log.error("承保后,更新状态,进行后续逻辑异常. orderStatusResultVo=[{}]",JSONUtil.toJsonStr(orderStatusResultVo), e);
+        } catch (Exception e) {
+            log.error("承保后,更新状态,进行后续逻辑异常. orderStatusResultVo=[{}]", JSONUtil.toJsonStr(orderStatusResultVo), e);
         }
 
         //this.doSomethingAfterUnderwited(insOrders);
@@ -811,82 +813,81 @@ public class UnifyOrderManager {
                     continue;
                 }
 
-                    if (activity.getLocalActivityTables() == null) {
-                        continue;
+                if (activity.getLocalActivityTables() == null) {
+                    continue;
+                }
+                // 遍历所有本地活动表
+                for (LocalActivityTableVO table : activity.getLocalActivityTables()) {
+                    // 处理 type=9 的承保规则
+                    if ("9".equals(table.getType())) {
+                        Double totalFee = insOrdersService.queryTotalFee(insOrders.getInsOrderNo());
+                        String userPhone = insOrdersService.queryCustomerPhone(insOrders.getInsOrderNo());
+                        for (UnderwritingRuleVO underwritingRuleVO : table.getUnderwritingRules()) {
+                            if (new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMinPremium()) >= 0 && new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMaxPremium()) <= 0) {
+                                // 存本地记录 等绑定后更新本地记录的同步状态字段即可
+                                completeRule(null, null, userPhone, activity.getId(),
+                                        table.getId(), underwritingRuleVO.getUwMinPremium() + "-" + underwritingRuleVO.getUwMaxPremium(), underwritingRuleVO.getUwLotteryNum(), null, YesNoEnum.NO.getCode(), 9);
+                                log.info("客户承保,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                            }
+                        }
                     }
-                    // 遍历所有本地活动表
-                    for (LocalActivityTableVO table : activity.getLocalActivityTables()) {
-                        // 处理 type=9 的承保规则
-                        if ("9".equals(table.getType())) {
-                            Double totalFee = insOrdersService.queryTotalFee(insOrders.getInsOrderNo());
-                            String userPhone = insOrdersService.queryCustomerPhone(insOrders.getInsOrderNo());
-                            for (UnderwritingRuleVO underwritingRuleVO : table.getUnderwritingRules()) {
-                                if (new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMinPremium()) >= 0 && new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMaxPremium()) <= 0) {
+                    // 处理 type=8 的出单规则
+                    if ("8".equals(table.getType())) {
+                        // 只处理本租户的出单规则
+                        if (!baseController.getUserSystemCode().equals(table.getTenantId())) {
+                            continue;
+                        }
+                        // 查询是否在一账通绑定
+                        UnifiedUserCenterDTO unifiedUserCenterDTO = new UnifiedUserCenterDTO();
+                        unifiedUserCenterDTO.setUserId(insOrders.getRealQuoteUserId());
+                        unifiedUserCenterDTO.setClientId(CLIENT_ID);
+                        unifiedUserCenterDTO.setTenantId(baseController.getUserSystemCode());
+                        HttpResult<UnifiedUserClientVO> unifiedUserClientVOHttpResult = null;
+                        try {
+                            unifiedUserClientVOHttpResult = localLivingClient.queryBind(unifiedUserCenterDTO);
+                        } catch (Exception e) {
+                            log.info("业务员出单,查询用户绑定一账通接口异常,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                            log.error("业务员出单,查询用户绑定一账通接口异常", e);
+                        }
+                        if (unifiedUserClientVOHttpResult == null || unifiedUserClientVOHttpResult.getCode() != 200 || unifiedUserClientVOHttpResult.getData() == null) {
+                            // 判断是否满足条件
+                            // 业务员累计出单次数是否大于等于本活动规定时间范围内的出单次数
+                            // 统计业务员的出单次数
+                            int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
+                            for (OrderRuleVO orderRule : table.getOrderRules()) {
+                                if (count >= Integer.parseInt(orderRule.getOrdNum())) {
                                     // 存本地记录 等绑定后更新本地记录的同步状态字段即可
-                                    completeRule(null, null, userPhone, activity.getId(),
-                                            table.getId(), underwritingRuleVO.getUwMinPremium() + "-" + underwritingRuleVO.getUwMaxPremium(), underwritingRuleVO.getUwLotteryNum(), null, YesNoEnum.NO.getCode(), 9);
-                                    log.info("客户承保,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                                    completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
+                                            table.getId(), orderRule.getOrdNum(), String.valueOf(orderRule.getOrdLotteryNum()), null, YesNoEnum.NO.getCode(), 8);
+
+                                    log.info("业务员出单,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
                                 }
                             }
-                        }
-                        // 处理 type=8 的出单规则
-                        if ("8".equals(table.getType())) {
-                            // 只处理本租户的出单规则
-                            if (!baseController.getUserSystemCode().equals(table.getTenantId())) {
-                                continue;
-                            }
-                            // 查询是否在一账通绑定
-                            UnifiedUserCenterDTO unifiedUserCenterDTO = new UnifiedUserCenterDTO();
-                            unifiedUserCenterDTO.setUserId(insOrders.getRealQuoteUserId());
-                            unifiedUserCenterDTO.setClientId(CLIENT_ID);
-                            unifiedUserCenterDTO.setTenantId(baseController.getUserSystemCode());
-                            HttpResult<UnifiedUserClientVO> unifiedUserClientVOHttpResult = null;
-                            try {
-                                unifiedUserClientVOHttpResult = localLivingClient.queryBind(unifiedUserCenterDTO);
-                            } catch (Exception e) {
-                                log.info("业务员出单,查询用户绑定一账通接口异常,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
-                                log.error("业务员出单,查询用户绑定一账通接口异常", e);
-                            }
-                            if (unifiedUserClientVOHttpResult == null || unifiedUserClientVOHttpResult.getCode() != 200 || unifiedUserClientVOHttpResult.getData() == null) {
-                                // 判断是否满足条件
-                                // 业务员累计出单次数是否大于等于本活动规定时间范围内的出单次数
-                                // 统计业务员的出单次数
-                                int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
-                                for (OrderRuleVO orderRule : table.getOrderRules()) {
-                                    if (count >= Integer.parseInt(orderRule.getOrdNum())) {
-                                        // 存本地记录 等绑定后更新本地记录的同步状态字段即可
-                                        completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
-                                                table.getId(), orderRule.getOrdNum(), String.valueOf(orderRule.getOrdLotteryNum()), null, YesNoEnum.NO.getCode(), 8);
-
-                                        log.info("业务员出单,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
-                                    }
+                        } else {
+                            Map<String, List<UnifiedUserClientVO>> userClientGroupMap = unifiedUserClientVOHttpResult.getData().getUserClients()
+                                    .stream()
+                                    .collect(Collectors.groupingBy(UnifiedUserClientVO::getClientId));
+                            // 首先查业务员是否在一账通绑定过本地生活  【已绑定过 远程调抽奖次数增加接口 标记已同步
+                            if (userClientGroupMap.containsKey(CLIENT_ID)) {
+                                LotteryCounDTO lotteryCounDTO = new LotteryCounDTO();
+                                lotteryCounDTO.setAppUserId(insOrders.getRealQuoteUserId());
+                                lotteryCounDTO.setActivityId(activity.getId());
+                                lotteryCounDTO.setCount(Integer.parseInt(table.getQutLotteryNum()));
+                                HttpResult<LotteryCountVO> lotteryCountVOHttpResult = null;
+                                try {
+                                    lotteryCountVOHttpResult = localLivingClient.addLotteryCount(lotteryCounDTO);
+                                } catch (Exception e) {
+                                    log.info("业务员出单,远程调用本地生活抽奖次数增加接口异常,userId:{},count:{},tenantId:{}", insOrders.getRealQuoteUserId(), table.getQutLotteryNum(), baseController.getUserSystemCode());
+                                    log.error("业务员出单,远程调用本地生活抽奖次数增加异常", e);
                                 }
-                            } else {
-                                Map<String, List<UnifiedUserClientVO>> userClientGroupMap = unifiedUserClientVOHttpResult.getData().getUserClients()
-                                        .stream()
-                                        .collect(Collectors.groupingBy(UnifiedUserClientVO::getClientId));
-                                // 首先查业务员是否在一账通绑定过本地生活  【已绑定过 远程调抽奖次数增加接口 标记已同步
-                                if (userClientGroupMap.containsKey(CLIENT_ID)) {
-                                    LotteryCounDTO lotteryCounDTO = new LotteryCounDTO();
-                                    lotteryCounDTO.setAppUserId(insOrders.getRealQuoteUserId());
-                                    lotteryCounDTO.setActivityId(activity.getId());
-                                    lotteryCounDTO.setCount(Integer.parseInt(table.getQutLotteryNum()));
-                                    HttpResult<LotteryCountVO> lotteryCountVOHttpResult = null;
-                                    try {
-                                        lotteryCountVOHttpResult = localLivingClient.addLotteryCount(lotteryCounDTO);
-                                    } catch (Exception e) {
-                                        log.info("业务员出单,远程调用本地生活抽奖次数增加接口异常,userId:{},count:{},tenantId:{}", insOrders.getRealQuoteUserId(), table.getQutLotteryNum(), baseController.getUserSystemCode());
-                                        log.error("业务员出单,远程调用本地生活抽奖次数增加异常", e);
-                                    }
-                                    if (lotteryCountVOHttpResult != null && lotteryCountVOHttpResult.getData().getSuccess()) {
-                                        int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
-                                        for (OrderRuleVO orderRule : table.getOrderRules()) {
-                                            if (count >= Integer.parseInt(orderRule.getOrdNum())) {
-                                                // 记录规则完成  标记已同步
-                                                completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
-                                                        table.getId(), table.getQutNum(), table.getQutLotteryNum(), table.getQutLotteryMax(), YesNoEnum.YES.getCode(), 8);
-                                                log.info("业务员出单,满足条件插入记录并远程同步,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
-                                            }
+                                if (lotteryCountVOHttpResult != null && lotteryCountVOHttpResult.getData().getSuccess()) {
+                                    int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
+                                    for (OrderRuleVO orderRule : table.getOrderRules()) {
+                                        if (count >= Integer.parseInt(orderRule.getOrdNum())) {
+                                            // 记录规则完成  标记已同步
+                                            completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
+                                                    table.getId(), table.getQutNum(), table.getQutLotteryNum(), table.getQutLotteryMax(), YesNoEnum.YES.getCode(), 8);
+                                            log.info("业务员出单,满足条件插入记录并远程同步,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
                                         }
                                     }
                                 }
@@ -896,7 +897,8 @@ public class UnifyOrderManager {
                 }
             }
         }
-        //return HttpResult.ok("状态刷新成功");
+    }
+    //return HttpResult.ok("状态刷新成功");
 
 
     @OrderOperationLog(

+ 6 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java

@@ -204,6 +204,12 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
 
     @Override
     public void feeAuditAdd(InsOrders orders) {
+        // 先检查是否已存在审核记录,避免重复INSERT导致主键冲突
+        InsFeeAudit existing = this.getOne(new LambdaQueryWrapper<InsFeeAudit>().eq(InsFeeAudit::getOrderNo, orders.getId()));
+        if (existing != null) {
+            return;
+        }
+
         InsFeeAudit insFeeAudit = new InsFeeAudit();
         insFeeAudit.setOrderNo(orders.getId());
 

+ 39 - 20
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersQrcodeServiceImpl.java

@@ -55,18 +55,24 @@ public class InsOrdersQrcodeServiceImpl extends ServiceImpl<InsOrdersQrcodeMappe
 
     @Override
     public InsOrdersQrcode saveQrCode(InsOrders orders) {
+        // 先查询是否已存在同 ordermo 的记录(不限状态),避免 INSERT 违反唯一约束
+        InsOrdersQrcode existing = baseMapper.selectOne(
+                new LambdaQueryWrapper<>(InsOrdersQrcode.class)
+                        .eq(InsOrdersQrcode::getOrderno, orders.getId()));
+        if (existing != null) {
+            // 已存在则复用旧记录,更新为有效状态
+            existing.setQrcodeStatus(1);
+            existing.setCreatetime(LocalDateTime.now());
+            String paylink = buildJumpUrl(orders.getPayLink());
+            existing.setJumpUrl(paylink);
+            baseMapper.updateById(existing);
+            return existing;
+        }
+
+        // 不存在则新建
         InsOrdersQrcode insOrdersQrcode = new InsOrdersQrcode();
         insOrdersQrcode.setOrderno(orders.getId());
-        String paylink = orders.getPayLink();
-        if(isHttpUrl(orders.getPayLink())){
-            paylink = paylink.replace("{", "").replace("}", "");
-            insOrdersQrcode.setJumpUrl(paylink);
-        }else{
-            if(paylink.contains("data:image/jpg;base64,")){
-                paylink = paylink.replace("data:image/jpg;base64,","");
-            }
-            insOrdersQrcode.setJumpUrl(paylink);
-        }
+        insOrdersQrcode.setJumpUrl(buildJumpUrl(orders.getPayLink()));
         insOrdersQrcode.setQrcodeStatus(1);
         insOrdersQrcode.setCreatetime(LocalDateTime.now());
         this.save(insOrdersQrcode);
@@ -75,17 +81,14 @@ public class InsOrdersQrcodeServiceImpl extends ServiceImpl<InsOrdersQrcodeMappe
 
     @Override
     public void updateQrCode(InsOrders orders) {
-        InsOrdersQrcode ordersQrcode = baseMapper.selectOne(new LambdaQueryWrapper<>(InsOrdersQrcode.class).eq(InsOrdersQrcode::getOrderno, orders.getId()));
-        String paylink = orders.getPayLink();
-        if(isHttpUrl(orders.getPayLink())){
-            paylink = paylink.replace("{", "").replace("}", "");
-            ordersQrcode.setJumpUrl(paylink);
-        }else{
-            if(paylink.contains("data:image/jpg;base64,")){
-                paylink = paylink.replace("data:image/jpg;base64,","");
-            }
-            ordersQrcode.setJumpUrl(paylink);
+        // 查询有效的二维码记录(qrcodeStatus=1),避免拿到已销毁的记录
+        InsOrdersQrcode ordersQrcode = getIsExit(orders.getId());
+        if (ordersQrcode == null) {
+            // 不存在有效记录则新建(内部会处理已销毁记录的复用,不会违反唯一约束)
+            getOneOrSave(orders);
+            return;
         }
+        ordersQrcode.setJumpUrl(buildJumpUrl(orders.getPayLink()));
         baseMapper.updateById(ordersQrcode);
     }
 
@@ -146,6 +149,22 @@ public class InsOrdersQrcodeServiceImpl extends ServiceImpl<InsOrdersQrcodeMappe
             return false;
         }
     }
+
+    /**
+     * 构建跳转链接(去除多余字符)
+     */
+    private String buildJumpUrl(String paylink) {
+        if (StringUtils.isEmpty(paylink)) {
+            return paylink;
+        }
+        if (isHttpUrl(paylink)) {
+            return paylink.replace("{", "").replace("}", "");
+        }
+        if (paylink.contains("data:image/jpg;base64,")) {
+            return paylink.replace("data:image/jpg;base64,", "");
+        }
+        return paylink;
+    }
 }
 
 

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java

@@ -1311,7 +1311,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         HttpResult<EsmInsCompany> esmInsCompanyHttpResult = platformClient.findLogoById(companyId);
         log.info("根据保司id=[{}]获取到的保司信息如下:[{}]", companyId, JSONUtil.toJsonStr(esmInsCompanyHttpResult));
         if (esmInsCompanyHttpResult.getCode() == 200) {
-            resultVo.setInsCompanyVo(esmInsCompanyHttpResult.getData());
+            resultVo.setInsCompanyVo(esmInsCompanyHttpResult.getData(),resultVo.getCosts());
         }
         // 影像资料
         List<InsTaskImages> imagesList = insTaskImagesService.list(new LambdaQueryWrapper<InsTaskImages>()

+ 9 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java

@@ -25,6 +25,7 @@ import lombok.RequiredArgsConstructor;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.*;
 
@@ -180,6 +181,14 @@ public class ZmCrawlerQuotedPriceRequest extends BaseRequest {
                 coverageDTO.setAmount(kindInfoVo.getAmount());
                 coverageDTO.setUnitAmount(Integer.parseInt(kindInfoVo.getUnitAmount()));
                 coverageDTO.setQuantity(Objects.isNull(kindInfoVo.getQuantity()) ? 0 : Integer.parseInt(kindInfoVo.getQuantity()));
+                Integer seatCount = Integer.parseInt(quoteVo.getCarInfoVo().getSeatCount());
+                if (kindInfoVo.getKindCode().equals("041")) {
+                    coverageDTO.setQuantity(1);
+                }
+                if (kindInfoVo.getKindCode().equals("044")) {
+                    coverageDTO.setQuantity(seatCount - 1);
+                    coverageDTO.setAmount(String.valueOf(new BigDecimal(kindInfoVo.getUnitAmount()).multiply(new BigDecimal(coverageDTO.getQuantity()))));
+                }
                 coverageDTO.setValidDate(biRiskInfoVo.getStartDate());
                 coverageDTO.setExpiryDate(biRiskInfoVo.getEndDate());
                 coverageDTOList.add(coverageDTO);

+ 6 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/PtlAgreementCostController.java

@@ -111,4 +111,10 @@ public class PtlAgreementCostController {
         return ptlAgreementCostService.pageList(costParam);
     }
 
+
+    @Operation(summary = "复制费用")
+    @PostMapping("copyCost")
+    public HttpResult copyCost(@RequestBody PtlAgreementCostCopyParam costCopyParam){
+        return ptlAgreementCostService.costCopy(costCopyParam) ? HttpResult.ok("复制费用成功") : HttpResult.error("复制费用失败");
+    }
 }

+ 7 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/SchemeController.java

@@ -33,6 +33,13 @@ public class SchemeController {
         return ptlSchemeService.saveScheme(ptlSchemeSaveVo);
     }
 
+    @Operation(summary = "复制方案")
+    @PostMapping("/copyScheme")
+    public HttpResult copyScheme(@RequestBody PtlSchemeCopyVo ptlSchemeCopyVo){
+        boolean result = ptlSchemeService.copyScheme(ptlSchemeCopyVo.getSchemeId(), ptlSchemeCopyVo.getProductCode());
+        return result ? HttpResult.ok("复制方案成功") : HttpResult.error("复制方案失败");
+    }
+
     @Operation(summary = "获取方案")
     @GetMapping("/getScheme")
     public HttpResult getScheme(String id){

+ 5 - 0
tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementCostService.java

@@ -59,4 +59,9 @@ public interface PtlAgreementCostService extends IService<PtlAgreementCost> {
      */
     HttpResult<Page<CostManagementVo>> pageList(PtlAgreementCostParam costParam);
 
+    /**
+     * 复制费用
+     */
+    Boolean costCopy(PtlAgreementCostCopyParam costCopyParam);
+
 }

+ 8 - 0
tenant/organization/src/main/java/com/jzg/organization/service/PtlSchemeService.java

@@ -83,4 +83,12 @@ public interface PtlSchemeService extends IService<PtlScheme> {
     public SchemeResultVo getSchemeResult(String companyId,String productId);
 
     List<InsBusinessInsuranceVo> getBusinessInsuranceListByKindType(String kindCode);
+
+    /**
+     * 复制方案
+     * @param schemeIds
+     * @param productCode
+     * @return
+     */
+    Boolean copyScheme(String schemeIds,String productCode);
 }

+ 41 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java

@@ -22,15 +22,20 @@ import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.BuildDescUtils;
 import com.jzg.commons.util.ListUtils;
 import com.jzg.commons.util.StringUtils;
+import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.organization.mapper.PtlAgreementCostMapper;
+import com.jzg.organization.mapper.PtlAgreementCostRuleMapper;
+import com.jzg.organization.mapper.PtlAgreementCostTypeMapper;
 import com.jzg.organization.service.PtlAgreementCostRuleService;
 import com.jzg.organization.service.PtlAgreementCostService;
 import com.jzg.organization.service.PtlAgreementCostTypeService;
 import com.jzg.organization.service.PtlAgreementUndwrtRulesAttrService;
 import com.jzg.organization.state.CostState;
 import com.jzg.organization.state.listener.CostStateListener;
+import io.seata.spring.annotation.GlobalTransactional;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.IdGenerator;
 import org.redisson.api.RList;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -81,6 +86,10 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
     private BaseController baseController;
 
     private static final String[] COST_TYPE_DICT_KEY = new String[]{"checkbox", "select", "inputTag"};
+    @Autowired
+    private PtlAgreementCostTypeMapper ptlAgreementCostTypeMapper;
+    @Autowired
+    private PtlAgreementCostRuleMapper ptlAgreementCostRuleMapper;
 
     /**
      * 报价配置/费用管理/新增费用
@@ -382,5 +391,37 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
         return HttpResult.ok(costManagementVoPage);
     }
 
+    @GlobalTransactional
+    @Override
+    public Boolean costCopy(PtlAgreementCostCopyParam costCopyParam) {
+        PtlAgreementCost ptlAgreementCost = ptlAgreementCostMapper.selectById(costCopyParam.getCostId());
+        List<PtlAgreementCostType> ptlAgreementCostTypes = ptlAgreementCostTypeMapper.selectList(new LambdaQueryWrapper<PtlAgreementCostType>()
+                .eq(PtlAgreementCostType::getPtlAgreementCostId, ptlAgreementCost.getId()));
+        List<PtlAgreementCostRule> ptlAgreementCostRules = ptlAgreementCostRuleMapper.selectList(new LambdaQueryWrapper<PtlAgreementCostRule>()
+                .eq(PtlAgreementCostRule::getPtlAgreementCostId, ptlAgreementCost.getId()));
+
+        // 调整数据 进行copy
+        String costId = IdGenerate.nextId();
+        ptlAgreementCost.setId(costId);
+        ptlAgreementCost.setCostDescribe("复制的费用:" + ptlAgreementCost.getCostDescribe());
+        ptlAgreementCost.setCreateTime(LocalDateTime.now());
+
+        ptlAgreementCostTypes.forEach(item->{
+            item.setId(IdGenerate.nextId());
+            item.setPtlAgreementCostId(costId);
+        });
+
+        ptlAgreementCostRules.forEach(item->{
+            item.setId(IdGenerate.nextId());
+            item.setPtlAgreementCostId(costId);
+        });
+
+        ptlAgreementCostMapper.insert(ptlAgreementCost);
+        ptlAgreementCostTypeMapper.insert(ptlAgreementCostTypes);
+        ptlAgreementCostRuleMapper.insert(ptlAgreementCostRules);
+
+        return true;
+    }
+
 
 }

+ 4 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java

@@ -117,6 +117,8 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
         PtlAgreementUndwrtRules rules = new PtlAgreementUndwrtRules();
         rules.setId(IdGenerate.nextId());
         rules.setOrderNum(Objects.nonNull(maxRules) ? maxRules.getOrderNum() + 1 : 1);
+        rules.setStartTime(param.getStartTime());
+        rules.setEndTime(param.getEndTime());
         rules.setAgreementId(param.getAgreementId());
 
         //遍历承保规则属性
@@ -180,7 +182,8 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
             costsAttrLink.add(link);
         });
         agreementUndwrtRulesAttrLinkService.saveBatch(costsAttrLink);
-
+        rules.setStartTime(param.getStartTime());
+        rules.setEndTime(param.getEndTime());
         rules.setRuleDescription(buildDesc(costsAttrLink, attrList));
         baseMapper.updateById(rules);
         return true;

+ 54 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java

@@ -26,11 +26,13 @@ import com.jzg.commons.entity.vo.EsmInsCompanyResVo;
 import com.jzg.commons.exception.NoneException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.MinioUtils;
+import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.organization.client.CostsRuleClient;
 import com.jzg.organization.client.EsmInsCompanyClient;
 import com.jzg.organization.client.OrgClient;
 import com.jzg.organization.mapper.*;
 import com.jzg.organization.service.*;
+import io.seata.spring.annotation.GlobalTransactional;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -565,6 +567,58 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
         return insBusinessInsuranceMapper.getBusinessInsuranceListByKindType(kindCode);
     }
 
+    @Autowired
+    PtlSchemeService ptlSchemeService;
+
+    @GlobalTransactional
+    @Override
+    public Boolean copyScheme(String schemeInfoId, String productCode) {
+
+
+        PtlSchemeInfo ptlSchemeInfo = ptlSchemeInfoMapper.selectOne(new LambdaQueryWrapper<PtlSchemeInfo>()
+                .eq(PtlSchemeInfo::getId, schemeInfoId));
+        PtlScheme ptlScheme = ptlSchemeMapper.selectOne(new LambdaQueryWrapper<PtlScheme>()
+                .eq(PtlScheme::getId, ptlSchemeInfo.getSchemeId()));
+        List<PtlSchemeInsurance> ptlSchemeInsurances = ptlSchemeInsuranceMapper.selectList(new LambdaQueryWrapper<PtlSchemeInsurance>()
+                .eq(PtlSchemeInsurance::getSchemeInfoId, ptlSchemeInfo.getId()));
+        List<PtlSchemeInsuranceDrivingIntention> ptlSchemeInsuranceDrivingIntentions = ptlSchemeInsuranceDrivingIntentionMapper.selectList(new LambdaQueryWrapper<PtlSchemeInsuranceDrivingIntention>()
+                .eq(PtlSchemeInsuranceDrivingIntention::getSchemeInfoId, ptlSchemeInfo.getId()));
+        List<PtlSchemeRulesAttrLink> ptlSchemeRulesAttrLinks = ptlSchemeRulesAttrLinkMapper.selectList(new LambdaQueryWrapper<PtlSchemeRulesAttrLink>()
+                .eq(PtlSchemeRulesAttrLink::getSchemeId, ptlScheme.getId()));
+
+        String newSchemeId = IdGenerate.nextId();
+        String newSchemeInfoId = IdGenerate.nextId();
+        ptlScheme.setId(newSchemeId);
+        ptlScheme.setProductId(productCode);
+
+        ptlSchemeInfo.setId(newSchemeInfoId);
+        ptlSchemeInfo.setSchemeId(newSchemeId);
+        ptlSchemeInfo.setSchemeName("复制费用-" + ptlSchemeInfo.getSchemeName());
+
+        ptlSchemeInsurances.forEach(item -> {
+            item.setId(IdGenerate.nextId());
+            item.setSchemeInfoId(newSchemeInfoId);
+        });
+
+        ptlSchemeInsuranceDrivingIntentions.forEach(item -> {
+            item.setId(IdGenerate.nextId());
+            item.setSchemeInfoId(newSchemeInfoId);
+        });
+
+        ptlSchemeRulesAttrLinks.forEach(item -> {
+            item.setId(IdGenerate.nextId());
+            item.setSchemeId(newSchemeId);
+        });
+
+        ptlSchemeMapper.insert(ptlScheme);
+        ptlSchemeInfoMapper.insert(ptlSchemeInfo);
+        ptlSchemeInsuranceMapper.insert(ptlSchemeInsurances);
+        ptlSchemeInsuranceDrivingIntentionMapper.insert(ptlSchemeInsuranceDrivingIntentions);
+        ptlSchemeRulesAttrLinkMapper.insert(ptlSchemeRulesAttrLinks);
+
+        return true;
+    }
+
     /**
      * 根据业务员的deptId过滤保险公司列表
      * @param schemeRuleFilterVo