Procházet zdrojové kódy

Merge branch 'master' into dev_jzg_lipf_v20260622

lipf před 2 měsíci
rodič
revize
fecef252a6
47 změnil soubory, kde provedl 769 přidání a 586 odebrání
  1. 4 1
      authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java
  2. 17 0
      commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostEnd.java
  3. 9 0
      commons/src/main/java/com/jzg/commons/entity/po/InsFeeOrders.java
  4. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java
  5. 7 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersVo.java
  6. 9 2
      commons/src/main/java/com/jzg/commons/util/BuildDescUtils.java
  7. 17 2
      commons/src/main/java/com/jzg/commons/util/MinioUtils.java
  8. 12 6
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java
  9. 1 3
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  10. 36 23
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java
  11. 73 14
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java
  12. 27 14
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java
  13. 1 20
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java
  14. 0 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java
  15. 6 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java
  16. 21 1
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerRequestImpl.java
  17. 1 1
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/component/HtCrawlerRequestComponent.java
  18. 48 22
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/service/Impl/HuaTaiCrawlerRequestImpl.java
  19. 1 1
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/util/CookieUtils.java
  20. 10 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  21. 3 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  22. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  23. 9 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  24. 3 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml
  25. 8 105
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKHttpAPIService.java
  26. 29 115
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKSimpleService.java
  27. 34 55
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/impl/TKQuotationBaseServiceImpl.java
  28. 38 44
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerQuoteProcessServiceImpl.java
  29. 37 8
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/build/ZhongAnCrawlerQuoteResultsVoBuild.java
  30. 22 20
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteRequestBuild.java
  31. 7 36
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteResultsVoBuild.java
  32. 9 9
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerSaveQuoteInfoRequestBuild.java
  33. 7 22
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinBuildingAttributionInformation.java
  34. 10 9
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerCacheComponent.java
  35. 4 2
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerCarRequest.java
  36. 2 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerSaveProposalRequest.java
  37. 45 43
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java
  38. 11 0
      tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementUndwrtRulesService.java
  39. 2 0
      tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoService.java
  40. 136 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java
  41. 12 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java
  42. 5 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDistributionSettingServiceImpl.java
  43. 3 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountServiceImpl.java
  44. 8 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgInfoServiceImpl.java
  45. 12 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java
  46. 1 1
      tenant/organization/src/main/resources/mapper/PtlAgreementUndwrtRulesMapper.xml
  47. 0 1
      tenant/organization/src/main/resources/mapper/SysDistributionSettingMapper.xml

+ 4 - 1
authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java

@@ -406,7 +406,10 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
                 log.info("租户登录异常:用户不存在。 userId=[{}]",userId);
                 log.info("租户登录异常:用户不存在。 userId=[{}]",userId);
                 throw new SystemException("业务员不存在");
                 throw new SystemException("业务员不存在");
             }
             }
-            SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfos.get(0);
+            SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfos.stream()
+                    .filter(x -> Objects.equals(x.getSystemCode(), system))
+                    .findFirst()
+                    .orElse(null);
             // 租户系统才会校验这个, 后台管理系统,没有租户的概念
             // 租户系统才会校验这个, 后台管理系统,没有租户的概念
             if(this.isTenantLogin(system)){
             if(this.isTenantLogin(system)){
                 if (sysUserJzgInfo.cannotLogin()) {
                 if (sysUserJzgInfo.cannotLogin()) {

+ 17 - 0
commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostEnd.java

@@ -93,6 +93,9 @@ public class PtlAgreementCostEnd {
         @Schema(description = "属性编码")
         @Schema(description = "属性编码")
         private String attrCode;
         private String attrCode;
 
 
+        @Schema(description = "属性类型")
+        private String attrType;
+
         @Schema(description = "左操作数")
         @Schema(description = "左操作数")
         private String min;
         private String min;
 
 
@@ -105,6 +108,20 @@ public class PtlAgreementCostEnd {
         @Schema(description = "操作符")
         @Schema(description = "操作符")
         private String operator;
         private String operator;
 
 
+        @Schema(description = "费用规则字典")
+        private List<PtlAgreementCostRulesDictLabalDto> dictLabal;
+
+    }
+
+    @Data
+    @Schema(description = "费用规则字典")
+    public static class PtlAgreementCostRulesDictLabalDto {
+
+        @Schema(description = "编码")
+        private String code;
+
+        @Schema(description = "编码")
+        private String name;
     }
     }
 
 
     @Data
     @Data

+ 9 - 0
commons/src/main/java/com/jzg/commons/entity/po/InsFeeOrders.java

@@ -222,18 +222,27 @@ public class InsFeeOrders {
     @Schema(description = "一级分销员id")
     @Schema(description = "一级分销员id")
     private String firstDistributorId;
     private String firstDistributorId;
 
 
+    @Schema(description = "一级分销比例")
+    private BigDecimal firstDistributionRatio;
+
     @Schema(description = "二级分销费")
     @Schema(description = "二级分销费")
     private BigDecimal secondDistributionFee;
     private BigDecimal secondDistributionFee;
 
 
     @Schema(description = "二级分销员id")
     @Schema(description = "二级分销员id")
     private String secondDistributorId;
     private String secondDistributorId;
 
 
+    @Schema(description = "二级分销比例")
+    private BigDecimal secondDistributionRatio;
+
     @Schema(description = "三级分销费")
     @Schema(description = "三级分销费")
     private BigDecimal thirdDistributionFee;
     private BigDecimal thirdDistributionFee;
 
 
     @Schema(description = "三级分销员id")
     @Schema(description = "三级分销员id")
     private String thirdDistributorId;
     private String thirdDistributorId;
 
 
+    @Schema(description = "三级分销比例")
+    private BigDecimal thirdDistributionRatio;
+
     @Schema(description = "车牌号")
     @Schema(description = "车牌号")
     @TableField(exist = false)
     @TableField(exist = false)
     private String licenseNo;
     private String licenseNo;

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysUserJzgInfo.java

@@ -147,6 +147,9 @@ public class SysUserJzgInfo extends BaseModel implements Serializable {
     @Schema(description = "邮政编码")
     @Schema(description = "邮政编码")
     private String postalCode;
     private String postalCode;
 
 
+    @TableField(value = "email")
+    private String email;
+
     @TableField(value = "blood_type")
     @TableField(value = "blood_type")
     @Schema(description = "血型")
     @Schema(description = "血型")
     private String bloodType;
     private String bloodType;

+ 7 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/orders/InsOrdersVo.java

@@ -7,6 +7,7 @@ import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.vo.InsFeeOrdersVo;
 import com.jzg.commons.entity.vo.InsFeeOrdersVo;
 import com.jzg.commons.entity.vo.InsOrdersOtherInfoVo;
 import com.jzg.commons.entity.vo.InsOrdersOtherInfoVo;
 import com.jzg.commons.entity.vo.InsTaskImagesVo;
 import com.jzg.commons.entity.vo.InsTaskImagesVo;
+import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.Data;
 
 
@@ -127,6 +128,12 @@ public class InsOrdersVo extends QuoteVo {
     @Schema(description = "订单费用")
     @Schema(description = "订单费用")
     private InsFeeOrdersVo feeOrdersVo;
     private InsFeeOrdersVo feeOrdersVo;
 
 
+    /**
+     * 费用比例信息
+     */
+    @Schema(description = "费用比例信息")
+    private PtlAgreementCostRatioVo costRatio;
+
     @Data
     @Data
     public static class Salesman{
     public static class Salesman{
 
 

+ 9 - 2
commons/src/main/java/com/jzg/commons/util/BuildDescUtils.java

@@ -21,7 +21,7 @@ public class BuildDescUtils {
 
 
         for (PtlAgreementUndwrtRulesAttr link : linkList) {
         for (PtlAgreementUndwrtRulesAttr link : linkList) {
             PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr = attrMap.get(link.getAttrCode());
             PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr = attrMap.get(link.getAttrCode());
-
+            ptlAgreementUndwrtRulesAttr.setDictLabal(link.getDictLabal());
             if (ptlAgreementUndwrtRulesAttr == null) {
             if (ptlAgreementUndwrtRulesAttr == null) {
                 continue;
                 continue;
             }
             }
@@ -36,7 +36,14 @@ public class BuildDescUtils {
                 if(link.getMinArray() != null && link.getMinArray().length > 0){
                 if(link.getMinArray() != null && link.getMinArray().length > 0){
                     desc.append(ptlAgreementUndwrtRulesAttr.getAttrName()).append("包含");
                     desc.append(ptlAgreementUndwrtRulesAttr.getAttrName()).append("包含");
                     for (int k=0 ; k<link.getMinArray().length; k++){
                     for (int k=0 ; k<link.getMinArray().length; k++){
-                        PtlAgreementUndwrtRulesDictLabal ptlAgreementUndwrtRulesDictLabal = ptlAgreementUndwrtRulesAttr.getDictLabal().stream().filter(x -> Arrays.asList(link.getMinArray()).contains(x.getCode())).findFirst().orElse(null);
+                        PtlAgreementUndwrtRulesDictLabal ptlAgreementUndwrtRulesDictLabal = null;
+                        for (PtlAgreementUndwrtRulesDictLabal x : ptlAgreementUndwrtRulesAttr.getDictLabal()) {
+                            if (Arrays.asList(link.getMinArray()).contains("select".equals(attrType) ? x.getName() : x.getCode())) {
+                                ptlAgreementUndwrtRulesDictLabal = x;
+                                link.getMinArray()[k] = null;
+                                break;
+                            }
+                        }
                         desc.append(null != ptlAgreementUndwrtRulesDictLabal ? ptlAgreementUndwrtRulesDictLabal.getName() : "").append(",");
                         desc.append(null != ptlAgreementUndwrtRulesDictLabal ? ptlAgreementUndwrtRulesDictLabal.getName() : "").append(",");
                     }
                     }
 
 

+ 17 - 2
commons/src/main/java/com/jzg/commons/util/MinioUtils.java

@@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.compress.utils.IOUtils;
 import org.apache.commons.compress.utils.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
@@ -43,6 +44,14 @@ public class MinioUtils {
         log.info("MinioClient has been initialized: {}", minioClient);
         log.info("MinioClient has been initialized: {}", minioClient);
     }
     }
 
 
+
+    private static String minioPublicUrl;
+
+    @Value("${minio.url:https://minio.baoxianzhanggui.com}")
+    public void setMinioPublicUrl(String minioPublicUrl) {
+        MinioUtils.minioPublicUrl = minioPublicUrl;
+    }
+
     public static MinioClient getMinioClient() {
     public static MinioClient getMinioClient() {
         return MinioUtils.minioClient;
         return MinioUtils.minioClient;
     }
     }
@@ -399,9 +408,15 @@ public class MinioUtils {
      */
      */
     @SneakyThrows(Exception.class)
     @SneakyThrows(Exception.class)
     public static String getPresignedObjectUrl(String bucketName, String objectName) {
     public static String getPresignedObjectUrl(String bucketName, String objectName) {
+//        try {
+//            GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).method(Method.GET).build();
+//            return minioClient.getPresignedObjectUrl(args);
+//        } catch (Exception e) {
+//            return null;
+//        }
+        // 重新调整方法  minio 设置公开权限
         try {
         try {
-            GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().bucket(bucketName).object(objectName).method(Method.GET).build();
-            return minioClient.getPresignedObjectUrl(args);
+            return minioPublicUrl + "/" + bucketName + "/" + objectName;
         } catch (Exception e) {
         } catch (Exception e) {
             return null;
             return null;
         }
         }

+ 12 - 6
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java

@@ -122,36 +122,36 @@ public interface OrgClient {
     /**
     /**
      * 获取租户分销设置
      * 获取租户分销设置
      */
      */
-    @PostMapping(value = "/sysDistributionSetting/getSettingBySystemCode")
+    @GetMapping(value = "/sysDistributionSetting/getSettingBySystemCode")
     HttpResult<SysDistributionSetting> getSettingBySystemCode();
     HttpResult<SysDistributionSetting> getSettingBySystemCode();
 
 
     /**
     /**
      * 获取机构
      * 获取机构
      */
      */
     @GetMapping(value = "/dept/deptGet")
     @GetMapping(value = "/dept/deptGet")
-    HttpResult<SysDeptVo> deptGet(String id);
+    HttpResult<SysDeptVo> deptGet(@RequestParam String id);
 
 
     /**
     /**
      * 获取租户用户
      * 获取租户用户
      */
      */
     @GetMapping(value = "userInfo/getUserInfoByMobile")
     @GetMapping(value = "userInfo/getUserInfoByMobile")
-    HttpResult<SysUserJzgInfo> getUserInfoByMobile(String mobile);
+    HttpResult<SysUserJzgInfo> getUserInfoByMobile(@RequestParam String mobile);
 
 
     /**
     /**
      * 获取上级推荐人
      * 获取上级推荐人
      */
      */
     @GetMapping(value = "esmUserReferrer/getReferrer")
     @GetMapping(value = "esmUserReferrer/getReferrer")
-    HttpResult<EsmUserReferrer> getReferrer(String id);
+    HttpResult<EsmUserReferrer> getReferrer(@RequestParam String id);
 
 
 
 
     /**
     /**
      * 获取租户用户
      * 获取租户用户
      */
      */
     @GetMapping(value = "userInfo/getUserInfo")
     @GetMapping(value = "userInfo/getUserInfo")
-    HttpResult<SysUserJzgInfo> getUserInfo(String id);
+    HttpResult<SysUserJzgInfo> getUserInfo(@RequestParam String id);
 
 
     @GetMapping(value = "userInfo/getUserInfoById")
     @GetMapping(value = "userInfo/getUserInfoById")
-    HttpResult<SysUserJzgInfo> getUserInfoById(String id);
+    HttpResult<SysUserJzgInfo> getUserInfoById(@RequestParam String id);
 
 
     @PostMapping(value = "receivable/restockInsPlyIncome")
     @PostMapping(value = "receivable/restockInsPlyIncome")
     void restockInsPlyIncome(@RequestBody InsOrderAdjust insOrderAdjust);
     void restockInsPlyIncome(@RequestBody InsOrderAdjust insOrderAdjust);
@@ -201,6 +201,12 @@ public interface OrgClient {
     @GetMapping(value = "/agreementRules/rulesGet")
     @GetMapping(value = "/agreementRules/rulesGet")
     HttpResult rulesGet(@RequestParam("ruleId") String ruleId);
     HttpResult rulesGet(@RequestParam("ruleId") String ruleId);
 
 
+    /**
+     * 复制承保规则(含parentId)
+     */
+    @GetMapping(value = "/agreementRules/rulesCopy")
+    HttpResult rulesCopy(@RequestParam("ruleId") String ruleId);
+
     /**
     /**
      * 根据父ID查询子规则列表
      * 根据父ID查询子规则列表
      */
      */

+ 1 - 3
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java

@@ -32,8 +32,6 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
 import java.nio.file.StandardOpenOption;
-import java.util.Map;
-import java.util.Optional;
 import java.time.Duration;
 import java.time.Duration;
 import java.util.Map;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Optional;
@@ -393,7 +391,7 @@ public class RequestComponent {
     public <Response> ResponseEntity<Response> post(String url, String body, Class<Response> responseClass, HttpHeaders headers) {
     public <Response> ResponseEntity<Response> post(String url, String body, Class<Response> responseClass, HttpHeaders headers) {
         body = Optional.ofNullable(body).orElse("");
         body = Optional.ofNullable(body).orElse("");
         log.info("URL的值:{},body的值:{}", url, body);
         log.info("URL的值:{},body的值:{}", url, body);
-        WebClient webClient = selectNoSSLWebClient();
+//        WebClient webClient = selectNoSSLWebClientWithProxy("127.0.0.1", 9001);
         try {
         try {
             // 创建一个不带Accept-Encoding的请求头,避免服务器返回压缩数据
             // 创建一个不带Accept-Encoding的请求头,避免服务器返回压缩数据
             HttpHeaders requestHeaders = new HttpHeaders();
             HttpHeaders requestHeaders = new HttpHeaders();

+ 36 - 23
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java

@@ -418,47 +418,60 @@ public class DateUtil {
 
 
     private static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     private static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     private static final DateTimeFormatter OUTPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
     private static final DateTimeFormatter OUTPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+    private static final ZoneId ASIA_SHANGHAI = ZoneId.of("Asia/Shanghai");
 
 
     /**
     /**
-     * 获取投保日期的下一天0点(北京时间)并转为UTC ISO8601格式
-     * 驾意险起保日期默认为投保日期的下一天的0点
+     * 获取北京时间下一天0点对应的UTC时间字符串
+     * 驾意险起保日期默认为投保日期的下一天的0点(北京时间)
      */
      */
     public static String getNextDayMidnightUtc() {
     public static String getNextDayMidnightUtc() {
-        LocalDate tomorrow = LocalDate.now().plusDays(1);
+        LocalDate tomorrow = LocalDate.now(ASIA_SHANGHAI).plusDays(1);
         String beijingTime = tomorrow.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 00:00:00";
         String beijingTime = tomorrow.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 00:00:00";
         return toUtcDateTime(beijingTime);
         return toUtcDateTime(beijingTime);
     }
     }
 
 
     /**
     /**
-     * 获取指定UTC日期时间的下一天0点(北京时间)并转为UTC ISO8601格式
-     * 驾意险不支持即时起保,需调整起保日期为主险投保日期的下一日0时
+     * 判断一个UTC时间是否对应北京时间的0点(用于驾意险起保时间判断)
      *
      *
-     * @param utcDateTime 主险起保UTC时间(ISO8601格式,如 2026-07-04T16:00:00.000Z
-     * @return 下一天北京时间0点对应的UTC ISO8601格式
+     * @param utcTime UTC时间字符串(ISO8601格式,如 2026-06-25T16:00:00.000Z 即北京06-26 00:00:00
+     * @return true=北京时间0点
      */
      */
-    public static String getNextDayMidnightUtc(String utcDateTime) {
-        ZonedDateTime utcZoned = ZonedDateTime.parse(utcDateTime, DateTimeFormatter.ISO_DATE_TIME);
-        ZonedDateTime beijingZoned = utcZoned.withZoneSameInstant(ZoneId.of("Asia/Shanghai"));
-        LocalDate nextDay = beijingZoned.toLocalDate().plusDays(1);
-        String beijingTime = nextDay.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 00:00:00";
+    public static boolean isBeijingMidnight(String utcTime) {
+        ZonedDateTime utcZdt = ZonedDateTime.parse(utcTime, DateTimeFormatter.ISO_DATE_TIME);
+        ZonedDateTime bjZdt = utcZdt.withZoneSameInstant(ASIA_SHANGHAI);
+        return "00:00:00".equals(bjZdt.toLocalTime().toString());
+    }
+
+    /**
+     * 获取驾意险起保时间对应的UTC时间字符串
+     * 驾意险不支持即时起保:
+     * - 调用方需先通过 isBeijingMidnight 判断,已是0点则直接复用原值,无需调用此方法
+     * - 若北京时间不是0点,则调整为下一日北京时间0点,再转为UTC
+     *
+     * @param utcTime 主险起保时间(ISO8601 UTC格式,如 2026-07-04T08:00:00.000Z 即北京16:00)
+     * @return UTC时间字符串
+     */
+    public static String getNextDayMidnightUtc(String utcTime) {
+        ZonedDateTime utcZdt = ZonedDateTime.parse(utcTime, DateTimeFormatter.ISO_DATE_TIME);
+        ZonedDateTime bjZdt = utcZdt.withZoneSameInstant(ASIA_SHANGHAI);
+        LocalDate targetDate = bjZdt.toLocalDate();
+        // 非0点则顺延至下一日0点
+        if (!"00:00:00".equals(bjZdt.toLocalTime().toString())) {
+            targetDate = targetDate.plusDays(1);
+        }
+        String beijingTime = targetDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 00:00:00";
         return toUtcDateTime(beijingTime);
         return toUtcDateTime(beijingTime);
     }
     }
 
 
     /**
     /**
-     * 将北京时间(yyyy-MM-dd HH:mm:ss)转换为UTC时间(ISO8601格式)
+     * 将北京时间字符串(yyyy-MM-dd HH:mm:ss)转为实际UTC时间(yyyy-MM-dd'T'HH:mm:ss.SSS'Z')
+     * 如 "2026-06-25 16:00:00"(北京)→ "2026-06-25T08:00:00.000Z"(UTC)
      */
      */
     public static String toUtcDateTime(String beijingTime) {
     public static String toUtcDateTime(String beijingTime) {
-        // 解析输入的北京时间
         LocalDateTime localDateTime = LocalDateTime.parse(beijingTime, INPUT_FORMAT);
         LocalDateTime localDateTime = LocalDateTime.parse(beijingTime, INPUT_FORMAT);
-
-        // 指定时区为中国北京时间
-        ZonedDateTime beijingZoned = localDateTime.atZone(ZoneId.of("Asia/Shanghai"));
-
-        // 转为UTC时区
-        ZonedDateTime utcZoned = beijingZoned.withZoneSameInstant(ZoneId.of("UTC"));
-
-        // 格式化为ISO8601字符串
-        return utcZoned.format(OUTPUT_FORMAT);
+        ZonedDateTime bjZdt = localDateTime.atZone(ASIA_SHANGHAI);
+        ZonedDateTime utcZdt = bjZdt.withZoneSameInstant(ZoneOffset.UTC);
+        return utcZdt.format(OUTPUT_FORMAT);
     }
     }
 
 
     public static void main(String[] args) throws ParseException {
     public static void main(String[] args) throws ParseException {

+ 73 - 14
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java

@@ -2,6 +2,8 @@ package com.jzg.quotation.hengbang.crawler.component;
 
 
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -10,6 +12,7 @@ import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.constant.CacheConstant;
 import com.jzg.quotation.commons.constant.CacheConstant;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
+import com.jzg.quotation.commons.utils.DateUtil;
 import com.jzg.quotation.commons.utils.RequestObjectConversion;
 import com.jzg.quotation.commons.utils.RequestObjectConversion;
 import com.jzg.quotation.hengbang.crawler.constant.RequestConstant;
 import com.jzg.quotation.hengbang.crawler.constant.RequestConstant;
 import com.jzg.quotation.hengbang.crawler.constant.enums.RequestUrl;
 import com.jzg.quotation.hengbang.crawler.constant.enums.RequestUrl;
@@ -39,6 +42,8 @@ import javax.crypto.spec.SecretKeySpec;
 import java.nio.charset.StandardCharsets;
 import java.nio.charset.StandardCharsets;
 import java.time.Duration;
 import java.time.Duration;
 import java.util.*;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -302,24 +307,78 @@ public class HengBangCrawlerRequestComponent {
             String json = mapper.writeValueAsString(calculationRequest);
             String json = mapper.writeValueAsString(calculationRequest);
             log.info("提交报价数据请求参数: {}", json);
             log.info("提交报价数据请求参数: {}", json);
             req.setHbEncD(HengBangAESUtil.encryptStr(json));
             req.setHbEncD(HengBangAESUtil.encryptStr(json));
-            HbCrawlerSaleInfoResponse response = requestComponent.toStringPost(RequestUrl.CALCULATION.getRequestUrl(hbCrawlerProperties.getBaseUrl()), req, RequestUrl.CALCULATION.getRequestDescription(), HbCrawlerSaleInfoResponse.class, headers);
-            System.out.println(HengBangAESUtil.decryptStr(response.getHbEncD()));
+
+            String requestJson = mapper.writeValueAsString(req);
+            String url = RequestUrl.CALCULATION.getRequestUrl(hbCrawlerProperties.getBaseUrl());
+            log.info("恒邦calculation请求URL: {}, 请求体: {}", url, requestJson);
+
+            // 使用Hutool发送HTTP POST请求
+            HttpResponse httpResponse = HttpRequest.post(url)
+                    .header(headers)
+                    .body(requestJson)
+                    .timeout(60000)
+                    .execute();
+
+            String responseBody = httpResponse.body();
+            int status = httpResponse.getStatus();
+            log.info("恒邦calculation响应状态码: {}, 响应体(前500字符): {}", status,
+                    responseBody != null && responseBody.length() > 500 ? responseBody.substring(0, 500) : responseBody);
+
+            // 处理非2xx响应
+            if (!httpResponse.isOk()) {
+                if (status == 500) {
+                    JSONObject resObj = JSONObject.parseObject(responseBody);
+                    String detail = resObj.getString("detail");
+                    if (StrUtil.isNotBlank(detail) && detail.contains("重复投保")) {
+                        String time = extractDuplicateEndTime(detail);
+                        if (time != null) {
+                            calculationRequest.setBegintimeCi(DateUtil.toUtcDateTime(time));
+                            calculationRequest.setBegintimeBi(DateUtil.toUtcDateTime(time));
+                        }
+                        return getCalculationResult(calculationRequest, headers);
+                    }
+                    return StrUtil.isNotBlank(detail) ? detail : responseBody;
+                } else if (status == 400) {
+                    JSONObject resObj = JSONObject.parseObject(responseBody);
+                    String title = resObj.getString("title");
+                    return StrUtil.isNotBlank(title) ? title : responseBody;
+                }
+                log.error("恒邦calculation接口返回非2xx: {}, 响应: {}", status, responseBody);
+            }
+
+            // Jackson解析响应
+            HbCrawlerSaleInfoResponse response = mapper.readValue(responseBody, HbCrawlerSaleInfoResponse.class);
+            if (response.getHbEncD() == null) {
+                throw new SystemException("恒邦calculation接口返回数据缺少hbEncD字段,原始响应: " + responseBody);
+            }
             String resJson = HengBangAESUtil.decryptStr(response.getHbEncD());
             String resJson = HengBangAESUtil.decryptStr(response.getHbEncD());
+            log.info("恒邦calculation解密后响应: {}", resJson);
             return resJson;
             return resJson;
-        } catch (WebClientResponseException e) {
-            log.error("恒邦calculation接口调用失败[{}]: {}", e.getStatusCode(), e.getResponseBodyAsString());
-            final JSONObject jsonObject = JSONObject.parseObject(e.getResponseBodyAsString());
-            if (jsonObject.getInteger("status") == 500) {
-                String detail = jsonObject.getString("detail");
-                return StrUtil.isNotBlank(detail) ? detail : e.getResponseBodyAsString();
-            } else if (jsonObject.getInteger("status") == 400) {
-                return jsonObject.getString("title");
-            } else {
-                throw new SystemException(e.getMessage());
-            }
+        } catch (SystemException e) {
+            throw e;
         } catch (Exception e) {
         } catch (Exception e) {
-            throw new SystemException(e.getMessage());
+            log.error("恒邦calculation接口调用异常", e);
+            throw new SystemException("恒邦报价第二步异常: " + e.getMessage());
+        }
+    }
+
+
+    // 重复投保提取时间
+    private static final Pattern DUPLICATE_END_TIME_PATTERN = Pattern.compile("终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
+
+    /**
+     * 提取系统自动分配的起保时间
+     *
+     * @param calculationResult 核心提示
+     * @return 提取到的时间字符串,未提取到返回 null
+     */
+    public String extractDuplicateEndTime(String calculationResult) {
+        Matcher matcher = DUPLICATE_END_TIME_PATTERN.matcher(calculationResult);
+        if (matcher.find()) {
+            String shortEndTime = matcher.group(1); // 提取到 2025-12-14 16:00
+            return shortEndTime + ":00"; // 补全秒数为 2025-12-14 16:00:00
         }
         }
+        return null;
     }
     }
 
 
     /**
     /**

+ 27 - 14
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java

@@ -1,7 +1,7 @@
 package com.jzg.quotation.hengbang.crawler.entity.request;
 package com.jzg.quotation.hengbang.crawler.entity.request;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
-import com.alibaba.excel.util.StringUtils;
+import cn.hutool.core.util.StrUtil;
 import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -88,16 +88,25 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         }
         }
         if (CollUtil.isNotEmpty(kindInfoVoList)) {
         if (CollUtil.isNotEmpty(kindInfoVoList)) {
             this.epersonliabilityList = getEpersonliabilityList(kindInfoVoList, depreciationPrice);
             this.epersonliabilityList = getEpersonliabilityList(kindInfoVoList, depreciationPrice);
-            this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getBiRiskInfoVo().getStartDate());
+            // 防 NPE:BiRiskInfoVo 或 startDate 为空时跳过 begintimeBi 赋值
+            if (Objects.nonNull(quoteVo.getBiRiskInfoVo()) && Objects.nonNull(quoteVo.getBiRiskInfoVo().getStartDate())) {
+                this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getBiRiskInfoVo().getStartDate());
+            }
             this.risktype = "2";
             this.risktype = "2";
         } else {
         } else {
             this.epersonliabilityList = new ArrayList<>();
             this.epersonliabilityList = new ArrayList<>();
         }
         }
-        // 驾意险不支持即时起保,起保日期为主险投保日期的下一日0时(北京时间)
+        // 驾意险不支持即时起保,若传入时间不是0点则自动改为下一日0点(北京时间),再转为UTC
         if ("2".equals(this.risktype) && this.begintimeBi != null) {
         if ("2".equals(this.risktype) && this.begintimeBi != null) {
-            this.begintimeAccident = DateUtil.getNextDayMidnightUtc(this.begintimeBi);
+            // 商业险起始时间已是北京时间0点,驾意险直接复用,无需取下一日0时
+            this.begintimeAccident = DateUtil.isBeijingMidnight(this.begintimeBi)
+                    ? this.begintimeBi
+                    : DateUtil.getNextDayMidnightUtc(this.begintimeBi);
         } else if ("1".equals(this.risktype) && this.begintimeCi != null) {
         } else if ("1".equals(this.risktype) && this.begintimeCi != null) {
-            this.begintimeAccident = DateUtil.getNextDayMidnightUtc(this.begintimeCi);
+            // 交强险起始时间已是北京时间0点,驾意险直接复用,无需取下一日0时
+            this.begintimeAccident = DateUtil.isBeijingMidnight(this.begintimeCi)
+                    ? this.begintimeCi
+                    : DateUtil.getNextDayMidnightUtc(this.begintimeCi);
         } else {
         } else {
             this.begintimeAccident = DateUtil.getNextDayMidnightUtc();
             this.begintimeAccident = DateUtil.getNextDayMidnightUtc();
         }
         }
@@ -123,6 +132,9 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
     public List<EpersonliabilityDTO> getEpersonliabilityList(List<KindInfoVo> kindInfoVoList, String depreciationPrice) {
     public List<EpersonliabilityDTO> getEpersonliabilityList(List<KindInfoVo> kindInfoVoList, String depreciationPrice) {
         List<EpersonliabilityDTO> epersonliabilityDTOList = new ArrayList<>();
         List<EpersonliabilityDTO> epersonliabilityDTOList = new ArrayList<>();
         for (KindInfoVo kindInfoVo : kindInfoVoList) {
         for (KindInfoVo kindInfoVo : kindInfoVoList) {
+            if (StrUtil.isBlank(kindInfoVo.getAmount())) {
+                throw new RuntimeException(kindInfoVo.getPlatformKindName() + "保险保额为空,请检查数据!");
+            }
             EpersonliabilityDTO epersonliabilityDTO = new EpersonliabilityDTO();
             EpersonliabilityDTO epersonliabilityDTO = new EpersonliabilityDTO();
             epersonliabilityDTO.setKindcode(kindInfoVo.getKindCode());
             epersonliabilityDTO.setKindcode(kindInfoVo.getKindCode());
             epersonliabilityDTO.setLiabname(kindInfoVo.getKindName());
             epersonliabilityDTO.setLiabname(kindInfoVo.getKindName());
@@ -194,9 +206,9 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
     public static AccidentInsuranceDTO convertToAccidentInsuranceDTO(RiskInfoVo biRiskInfoVo, AccidentalDrivingVo vo) {
     public static AccidentInsuranceDTO convertToAccidentInsuranceDTO(RiskInfoVo biRiskInfoVo, AccidentalDrivingVo vo) {
         AccidentInsuranceDTO dto = new AccidentInsuranceDTO();
         AccidentInsuranceDTO dto = new AccidentInsuranceDTO();
         dto.setNonriskcode(vo.getProductCode().split("_")[1]);
         dto.setNonriskcode(vo.getProductCode().split("_")[1]);
-        dto.setProgramcode(vo.getProductCode());
-        dto.setProgramname("1119险种5座非营运客车保额525000保费99.9(山西)");
         dto.setCompanycode("0107");
         dto.setCompanycode("0107");
+        dto.setProgramcode(vo.getProductCode());
+        dto.setProgramname(vo.getProductName());
         dto.setIfdefault(true);
         dto.setIfdefault(true);
         dto.setBuynum(vo.getQuantity());
         dto.setBuynum(vo.getQuantity());
         List<GgriskprogramdetailsDTO> detailsList = getGgriskprogramdetailsList(vo.getProductCode().split("_")[1], vo.getProductCode());
         List<GgriskprogramdetailsDTO> detailsList = getGgriskprogramdetailsList(vo.getProductCode().split("_")[1], vo.getProductCode());
@@ -331,6 +343,9 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
     private String clauseType;
     private String clauseType;
     private List<String> ecarChargingPosts;
     private List<String> ecarChargingPosts;
     private List<String> carInsureDevices;
     private List<String> carInsureDevices;
+    // 正确请求中 begintimeAccident/endtimeAccident 紧跟 carInsureDevices(位于 drivingtype 之前)
+    private String begintimeAccident;
+    private String endtimeAccident;
     private String effectfLag;
     private String effectfLag;
     private String drivingtype;
     private String drivingtype;
     private String relationCarOwner = "a";
     private String relationCarOwner = "a";
@@ -347,8 +362,6 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
     private String taxonomyCode;
     private String taxonomyCode;
     private String epolicyFlag;
     private String epolicyFlag;
     private String accidentEpolicyFlag;
     private String accidentEpolicyFlag;
-    private String begintimeAccident;
-    private String endtimeAccident;
     private HbCrawlerRecordResponse transferVehicle;
     private HbCrawlerRecordResponse transferVehicle;
 
 
     @Data
     @Data
@@ -425,19 +438,19 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         @Serial
         @Serial
         private static final long serialVersionUID = -9183755801236888529L;
         private static final long serialVersionUID = -9183755801236888529L;
 
 
-        private String createtime;
+        private String programcode;
         private String paramname;
         private String paramname;
         private String paramvalue;
         private String paramvalue;
-        private String programcode;
+        private String createtime;
         private String updatetime;
         private String updatetime;
         private String validind;
         private String validind;
 
 
         public GgriskprogramparamlDTO(String createtime, String paramname, String paramvalue, String programcode, String updatetime, String validind) {
         public GgriskprogramparamlDTO(String createtime, String paramname, String paramvalue, String programcode, String updatetime, String validind) {
-            this.createtime = createtime;
-            this.updatetime = updatetime;
+            this.programcode = programcode;
             this.paramname = paramname;
             this.paramname = paramname;
             this.paramvalue = paramvalue;
             this.paramvalue = paramvalue;
-            this.programcode = programcode;
+            this.createtime = createtime;
+            this.updatetime = updatetime;
             this.validind = validind;
             this.validind = validind;
         }
         }
     }
     }

+ 1 - 20
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java

@@ -53,8 +53,6 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 
 /**
 /**
  * @description: 恒邦财险 爬虫请求
  * @description: 恒邦财险 爬虫请求
@@ -173,7 +171,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         }
         }
 
 
         if (errorMsg.contains("重复投保")) {
         if (errorMsg.contains("重复投保")) {
-            String time = extractDuplicateEndTime(errorMsg);
+            String time = hbCrawlerRequestComponent.extractDuplicateEndTime(errorMsg);
             if (time != null) {
             if (time != null) {
                 calculationRequest.setBegintimeCi(DateUtil.toUtcDateTime(time));
                 calculationRequest.setBegintimeCi(DateUtil.toUtcDateTime(time));
                 calculationRequest.setBegintimeBi(DateUtil.toUtcDateTime(time));
                 calculationRequest.setBegintimeBi(DateUtil.toUtcDateTime(time));
@@ -243,23 +241,6 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
         calculationRequest.setAccidentEpolicyFlag(accidentList.isEmpty() ? "" : "Y");
         calculationRequest.setAccidentEpolicyFlag(accidentList.isEmpty() ? "" : "Y");
     }
     }
 
 
-    // 重复投保提取时间
-    private static final Pattern DUPLICATE_END_TIME_PATTERN = Pattern.compile("终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
-
-    /**
-     * 提取系统自动分配的起保时间
-     *
-     * @param calculationResult 核心提示
-     * @return 提取到的时间字符串,未提取到返回 null
-     */
-    private String extractDuplicateEndTime(String calculationResult) {
-        Matcher matcher = DUPLICATE_END_TIME_PATTERN.matcher(calculationResult);
-        if (matcher.find()) {
-            String shortEndTime = matcher.group(1); // 提取到 2025-12-14 16:00
-            return shortEndTime + ":00"; // 补全秒数为 2025-12-14 16:00:00
-        }
-        return null;
-    }
 
 
     /**
     /**
      * 获取当前时间2小时以后的时间
      * 获取当前时间2小时以后的时间

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java


+ 6 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java

@@ -223,6 +223,9 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
     public void uploadImage(LoginInfoBO loginInfoBO, String agreementId, String contractNo, List<InsuranceImageVo> imageVoList) {
     public void uploadImage(LoginInfoBO loginInfoBO, String agreementId, String contractNo, List<InsuranceImageVo> imageVoList) {
         // 获取归属信息
         // 获取归属信息
         HuaNongCrawlerQuotedPriceRequestRequest.BusinessDataDTO.SaleInfoDTO saleInfoDTO = huaNongCrawlerCacheComponent.getSaleInfoDTO(agreementId);
         HuaNongCrawlerQuotedPriceRequestRequest.BusinessDataDTO.SaleInfoDTO saleInfoDTO = huaNongCrawlerCacheComponent.getSaleInfoDTO(agreementId);
+        if(saleInfoDTO == null){
+            throw new SystemException("报价归属信息获取失败,请重新报价!");
+        }
         // 跳转上传影像页面
         // 跳转上传影像页面
         HuaNongCrawlerNewImageQueryRequestRequest huaNongCrawlerNewImageQueryRequest
         HuaNongCrawlerNewImageQueryRequestRequest huaNongCrawlerNewImageQueryRequest
                 = new HuaNongCrawlerNewImageQueryRequestRequest(loginInfoBO.getLoginCom(), loginInfoBO.getLoginComCode(), contractNo, loginInfoBO.getToken(), saleInfoDTO.getSalesman()
                 = new HuaNongCrawlerNewImageQueryRequestRequest(loginInfoBO.getLoginCom(), loginInfoBO.getLoginComCode(), contractNo, loginInfoBO.getToken(), saleInfoDTO.getSalesman()
@@ -359,6 +362,9 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
     public void uploadImageToUnclassified(LoginInfoBO loginInfoBO, String agreementId, String contractNo,
     public void uploadImageToUnclassified(LoginInfoBO loginInfoBO, String agreementId, String contractNo,
                                           List<String> policyNumbers, List<InsuranceImageVo> imageVoList) {
                                           List<String> policyNumbers, List<InsuranceImageVo> imageVoList) {
         HuaNongCrawlerQuotedPriceRequestRequest.BusinessDataDTO.SaleInfoDTO saleInfoDTO = huaNongCrawlerCacheComponent.getSaleInfoDTO(agreementId);
         HuaNongCrawlerQuotedPriceRequestRequest.BusinessDataDTO.SaleInfoDTO saleInfoDTO = huaNongCrawlerCacheComponent.getSaleInfoDTO(agreementId);
+        if(saleInfoDTO == null){
+            throw new SystemException("报价归属信息获取失败,请重新报价!");
+        }
 
 
         HuaNongCrawlerNewImageQueryRequestRequest huaNongCrawlerNewImageQueryRequest
         HuaNongCrawlerNewImageQueryRequestRequest huaNongCrawlerNewImageQueryRequest
                 = new HuaNongCrawlerNewImageQueryRequestRequest(loginInfoBO.getLoginCom(), loginInfoBO.getLoginComCode(), contractNo, loginInfoBO.getToken(), saleInfoDTO.getSalesman()
                 = new HuaNongCrawlerNewImageQueryRequestRequest(loginInfoBO.getLoginCom(), loginInfoBO.getLoginComCode(), contractNo, loginInfoBO.getToken(), saleInfoDTO.getSalesman()

+ 21 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerRequestImpl.java

@@ -44,6 +44,8 @@ import org.springframework.http.HttpHeaders;
 import java.time.Duration;
 import java.time.Duration;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 
 @QuoteCrawlerService(InsuranceCode.INSURANCE_HNIC)
 @QuoteCrawlerService(InsuranceCode.INSURANCE_HNIC)
 @RequiredArgsConstructor
 @RequiredArgsConstructor
@@ -362,10 +364,28 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
             if (contract.getPlatFormMessage() == null) {
             if (contract.getPlatFormMessage() == null) {
                 continue;
                 continue;
             }
             }
-            String ciEnd = contract.getPlatFormMessage().getCiReinsureEndDate();
+            // 匹配终保日期后面的时间字符串
             String ciMsg = contract.getPlatFormMessage().getCiReinsureMessage();
             String ciMsg = contract.getPlatFormMessage().getCiReinsureMessage();
+            String ciEnd = contract.getPlatFormMessage().getCiReinsureEndDate();
+            Pattern pattern = Pattern.compile("终保日期\\s*(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
+            Matcher matcher = pattern.matcher(ciMsg);
+            if (matcher.find()) {
+                String fullDateTime = matcher.group(1);
+                if(!fullDateTime.isEmpty()){
+                    ciEnd = fullDateTime;
+                }
+
+            }
             String biEnd = contract.getPlatFormMessage().getBiReinsureEndDate();
             String biEnd = contract.getPlatFormMessage().getBiReinsureEndDate();
             String biMsg = contract.getPlatFormMessage().getBiReinsureMessage();
             String biMsg = contract.getPlatFormMessage().getBiReinsureMessage();
+            matcher = pattern.matcher(biMsg);
+            if (matcher.find()) {
+                String fullDateTime = matcher.group(1);
+                if(!fullDateTime.isEmpty()){
+                    biEnd = fullDateTime;
+                }
+
+            }
 
 
             if (StringUtils.hasText(ciEnd)) ciReinsureEndDate = ciEnd;
             if (StringUtils.hasText(ciEnd)) ciReinsureEndDate = ciEnd;
             if (StringUtils.hasText(ciMsg)) ciReinsureMessage = ciMsg;
             if (StringUtils.hasText(ciMsg)) ciReinsureMessage = ciMsg;

+ 1 - 1
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/component/HtCrawlerRequestComponent.java

@@ -62,7 +62,7 @@ public class HtCrawlerRequestComponent {
 
 
     private final HuaTaiCrawlerCacheComponent huaTaiCrawlerCacheComponent;
     private final HuaTaiCrawlerCacheComponent huaTaiCrawlerCacheComponent;
 
 
-    private static final String proxyHostName = "39.98.41.104";
+    private static final String proxyHostName = "172.24.144.226";//39.98.41.104
 
 
     private static final int proxyPort = 2025;
     private static final int proxyPort = 2025;
 
 

+ 48 - 22
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/service/Impl/HuaTaiCrawlerRequestImpl.java

@@ -1,10 +1,13 @@
 package com.jzg.quotation.huatai.crawler.service.Impl;
 package com.jzg.quotation.huatai.crawler.service.Impl;
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.json.JsonReadFeature;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
 import com.jzg.commons.constants.ProductsType;
 import com.jzg.commons.constants.ProductsType;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.po.jyxSetting;
 import com.jzg.commons.entity.po.jyxSetting;
@@ -136,7 +139,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
                 super.prepareConnection(c, m);
                 super.prepareConnection(c, m);
             }
             }
         };
         };
-        factory.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("39.98.41.104", 2025)));
+        factory.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("172.24.144.226", 2025)));//39.98.41.104
         return new RestTemplate(factory);
         return new RestTemplate(factory);
     }
     }
 
 
@@ -238,17 +241,19 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
     // ====================== 报价主流程 ======================
     // ====================== 报价主流程 ======================
     @Override
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) throws Exception {
     public QuoteResultsVo quote(QuoteVo quoteVo) throws Exception {
+        // 构造登录参数
         AttributionInformationVo attr = quoteVo.getOrder().getAttributionInformationVo();
         AttributionInformationVo attr = quoteVo.getOrder().getAttributionInformationVo();
         LoginDTO dto = buildLoginDTO(attr);
         LoginDTO dto = buildLoginDTO(attr);
+        // 获取登录相关信息
         Map<String, Object> mmap = login(dto);
         Map<String, Object> mmap = login(dto);
-        //归属信息
+        // 归属信息
         Map<String, Object> gsInfo = parseToMap(mmap.get("gsInfo").toString());
         Map<String, Object> gsInfo = parseToMap(mmap.get("gsInfo").toString());
         log.info("gsInfo: {}", JSONObject.toJSONString(mmap));
         log.info("gsInfo: {}", JSONObject.toJSONString(mmap));
 
 
         String cookie = extractCookie(mmap);
         String cookie = extractCookie(mmap);
         CarInfoVo car = quoteVo.getCarInfoVo();
         CarInfoVo car = quoteVo.getCarInfoVo();
 
 
-        //带重试的获取报价编号、车型型号
+        // 带重试的获取报价编号、车型型号
         Map<String, Object> xbResult = retry(() -> {
         Map<String, Object> xbResult = retry(() -> {
             try { return xbQuery(dto.getUsername(), cookie, car); }
             try { return xbQuery(dto.getUsername(), cookie, car); }
             catch (Exception e) { refreshLogin(dto); throw new Exception(e); }
             catch (Exception e) { refreshLogin(dto); throw new Exception(e); }
@@ -256,14 +261,14 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
 
 
         String quotationNo = str(xbResult, "quotationNo");
         String quotationNo = str(xbResult, "quotationNo");
         String modelcodexh = str(xbResult, "modelcodexh");
         String modelcodexh = str(xbResult, "modelcodexh");
-        //报价前预处理-保存车辆信息、过滤车型等处理
+        // 报价前预处理-保存车辆信息、过滤车型等处理
         PreResult pre = prepareQuote(attr, mmap, car, modelcodexh, cookie, quotationNo);
         PreResult pre = prepareQuote(attr, mmap, car, modelcodexh, cookie, quotationNo);
-        //报价
+        // 报价
         CoreResult core = executeQuote(quoteVo, quotationNo, dto, cookie, pre, gsInfo, attr);
         CoreResult core = executeQuote(quoteVo, quotationNo, dto, cookie, pre, gsInfo, attr);
         if (!core.success()) throw new SystemException("报价失败");
         if (!core.success()) throw new SystemException("报价失败");
-        //保存订单到MongoDB
+        // 保存订单到MongoDB
         saveOrder(quoteVo, core);
         saveOrder(quoteVo, core);
-        //组装费用
+        // 组装费用
         return HuaTaiCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo, core.data(), core.fcPrice());
         return HuaTaiCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo, core.data(), core.fcPrice());
     }
     }
 
 
@@ -818,7 +823,9 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         HtCrawlerConfigureParameters params = ConfigureParametersConversion.conversionEntity(
         HtCrawlerConfigureParameters params = ConfigureParametersConversion.conversionEntity(
                 HtCrawlerConfigureParameters.class, attr.getConfigInfo());
                 HtCrawlerConfigureParameters.class, attr.getConfigInfo());
         doLoginCookie(attr);
         doLoginCookie(attr);
-
+        UnderwritingResultsVo r = new UnderwritingResultsVo();
+        r.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+        r.setUnderwritingResult("核保失败");
         HtCrawlerOrder order = orderService.findByOrdersNo(vo.getOrder().getOrdersNo());
         HtCrawlerOrder order = orderService.findByOrdersNo(vo.getOrder().getOrdersNo());
         if("N".equals(order.getCiCategory()) || "6C".equals(order.getCiCategory())) throw new SystemException("核保失败-------强制下发修改意见,1.N类、6C类业务,请确认业务类别后再提交核保。");
         if("N".equals(order.getCiCategory()) || "6C".equals(order.getCiCategory())) throw new SystemException("核保失败-------强制下发修改意见,1.N类、6C类业务,请确认业务类别后再提交核保。");
         vo.getOrder().setQuoteNo(order.getQuotationRelaNo());
         vo.getOrder().setQuoteNo(order.getQuotationRelaNo());
@@ -828,28 +835,45 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         String res = req.submit2(submit, req.getHeaders());
         String res = req.submit2(submit, req.getHeaders());
         log.info("提交核保结果: {}", res);
         log.info("提交核保结果: {}", res);
 
 
-        if(res.contains("<html>")) throw new SystemException("核保失败, 服务器繁忙, 请稍后重试");
-
+        if(res.contains("<html>")) {
+            r.setUnderwritingResult("核保失败, 服务器繁忙, 请稍后重试");
+            return r;
+        }
         if (res.contains("起保时间不正确")) {
         if (res.contains("起保时间不正确")) {
-            throw new SystemException("起保时间不正确-------即时起保分钟数必须为00/15/30/45\n请重新选择起保时间!");
+            r.setUnderwritingResult("起保时间不正确-------即时起保分钟数必须为00/15/30/45\n请重新选择起保时间!");
+            return r;
         }
         }
-
         Map<String, Object> map = new HashMap<>();
         Map<String, Object> map = new HashMap<>();
         try {
         try {
-            map = MAPPER.readValue(res, Map.class);
+            // 忽略未知字段
+            MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+            // 空字符串转null
+            MAPPER.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
+            // 允许单引号、宽松JSON格式(第三方不规范返回必备)
+            MAPPER.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
+            MAPPER.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
+            // 允许换行符、回车符存在于字符串值中
+            // MAPPER.configure(JsonParser.Feature.ALLOW_UNESCAPED_CONTROL_CHARS, true);
+
+            ObjectReader reader = MAPPER.readerFor(Map.class)
+                    .with(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
+                    .with(JsonReadFeature.ALLOW_SINGLE_QUOTES)
+                    .with(JsonReadFeature.ALLOW_UNQUOTED_FIELD_NAMES);
+
+            map = reader.readValue(res);
         } catch (JsonProcessingException e) {
         } catch (JsonProcessingException e) {
-            throw new SystemException("核保失败, {}", convertResponseMsg(res));
+            r.setUnderwritingResult(convertResponseMsg(res));
+            return r;
         }
         }
+        if (res.contains("已通过核保未实收") || "Y".equals(str(map, "isPassHB"))) return handlePassedUnderwriting(order, params, vo, map);
 
 
-        if (!"1,2,3,4".contains(order.getCiCategory()) || "Y".equals(str(map, "isOver")) || "Y".equals(str(map, "isOver1"))
+        if (!"1,2,3,4,Y1,Y2,Y3".contains(order.getCiCategory()) || "Y".equals(str(map, "isOver")) || "Y".equals(str(map, "isOver1"))
                 || "重新计算保费".equals(str(map, "MSG")) || (res.contains("下发修改意见") && !res.contains("isPassHB")) || res.contains("转人工意见")) {
                 || "重新计算保费".equals(str(map, "MSG")) || (res.contains("下发修改意见") && !res.contains("isPassHB")) || res.contains("转人工意见")) {
-            throw new SystemException("核保失败-------" + convertResponseMsg(res));
+            r.setUnderwritingResult("核保失败-------" + convertResponseMsg(res));
+            return r;
         }
         }
-        if (res.contains("转人工")) return handleManualUnderwriting(order, params);
-        if (res.contains("已通过核保未实收") || "Y".equals(str(map, "isPassHB"))) return handlePassedUnderwriting(order, params, vo);
-
-        UnderwritingResultsVo r = new UnderwritingResultsVo();
-        r.setUnderwritingStatus(InsOrderStatusEnum.WAIT_AUDIT);
+        // 转人工处理
+        if (res.contains("infomsg\":\"") && res.contains("htmlMsgTeam\":\"")) return handleManualUnderwriting(order, params);
         return r;
         return r;
     }
     }
 
 
@@ -885,7 +909,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         } catch (Exception e) { throw new SystemException(e.getMessage()); }
         } catch (Exception e) { throw new SystemException(e.getMessage()); }
     }
     }
 
 
-    private UnderwritingResultsVo handlePassedUnderwriting(HtCrawlerOrder order, HtCrawlerConfigureParameters params, UnderwritingVo vo) {
+    private UnderwritingResultsVo handlePassedUnderwriting(HtCrawlerOrder order, HtCrawlerConfigureParameters params, UnderwritingVo vo, Map<String, Object> map) {
         HtCrawlerPaymentLinkResponse pl = queryPaymentLink(order, params, new PaymentLinkVo());
         HtCrawlerPaymentLinkResponse pl = queryPaymentLink(order, params, new PaymentLinkVo());
         log.info("paymentLinkResponse: {}", JSONObject.toJSONString(pl));
         log.info("paymentLinkResponse: {}", JSONObject.toJSONString(pl));
         vo.getInsOrders().setPayLink(pl.getImg());
         vo.getInsOrders().setPayLink(pl.getImg());
@@ -893,6 +917,8 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         vo.getInsOrders().setCompanyOrderNo(order.getQuotationRelaNo());
         vo.getInsOrders().setCompanyOrderNo(order.getQuotationRelaNo());
         UnderwritingResultsVo r = new UnderwritingResultsVo();
         UnderwritingResultsVo r = new UnderwritingResultsVo();
         r.setPaymentLink(pl.getImg());
         r.setPaymentLink(pl.getImg());
+        r.setJqPolicyno(map.get("jqProposalno") == null ? "" : map.get("jqProposalno").toString());
+        r.setSyPolicyno(map.get("syProposalno") == null ? "" : map.get("syProposalno").toString());
         r.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
         r.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
         return r;
         return r;
     }
     }

+ 1 - 1
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/util/CookieUtils.java

@@ -154,7 +154,7 @@ public class CookieUtils {
             }
             }
         };
         };
 
 
-        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("39.98.41.104", 2025));
+        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("172.24.144.226", 2025));//39.98.41.104
         factory.setProxy(proxy);
         factory.setProxy(proxy);
 
 
         RestTemplate restTemplate = new RestTemplate(factory);
         RestTemplate restTemplate = new RestTemplate(factory);

+ 10 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java

@@ -273,6 +273,11 @@ public class QuoteVerificationAspect {
         BigDecimal jqFollowRatio = calculateFollowRatio(jqCostType, jqEntranceFeeRatio);
         BigDecimal jqFollowRatio = calculateFollowRatio(jqCostType, jqEntranceFeeRatio);
         BigDecimal syFollowRatio = calculateFollowRatio(syCostType, syEntranceFeeRatio);
         BigDecimal syFollowRatio = calculateFollowRatio(syCostType, syEntranceFeeRatio);
         BigDecimal jyFollowRatio = calculateFollowRatio(jyCostType, jyEntranceFeeRatio);
         BigDecimal jyFollowRatio = calculateFollowRatio(jyCostType, jyEntranceFeeRatio);
+        // 设置跟单比例
+        insFeeOrders.setJqFollowRatio(jqFollowRatio);
+        insFeeOrders.setSyFollowRatio(syFollowRatio);
+        insFeeOrders.setJyFollowRatio(jyFollowRatio);
+
         // modify by lipf ,2026年6月17日15:30:54 是否除以1.06,不再根据平台协议还是私有协议进行判断,而是根据协议的是否含税来进行判断
         // modify by lipf ,2026年6月17日15:30:54 是否除以1.06,不再根据平台协议还是私有协议进行判断,而是根据协议的是否含税来进行判断
         BigDecimal taxFactor = insOrdersService.obtainTaxRate(insOrders.getId());
         BigDecimal taxFactor = insOrdersService.obtainTaxRate(insOrders.getId());
         // 6. 统一处理各险种的费用计算(应收、应付、各类费用)
         // 6. 统一处理各险种的费用计算(应收、应付、各类费用)
@@ -390,7 +395,7 @@ public class QuoteVerificationAspect {
         BigDecimal taxablePremium = premium.divide(taxFactor,5,RoundingMode.HALF_EVEN);
         BigDecimal taxablePremium = premium.divide(taxFactor,5,RoundingMode.HALF_EVEN);
 
 
         // 计算应付金额(保费 * 出口比例,保留2位小数)
         // 计算应付金额(保费 * 出口比例,保留2位小数)
-        BigDecimal payable = premium.multiply(exportPercent.setScale(5, RoundingMode.DOWN));
+        BigDecimal payable = premium.multiply(exportPercent.setScale(5, RoundingMode.DOWN)).setScale(2,RoundingMode.DOWN);
 
 
         // 计算各类费用并设置到订单对象
         // 计算各类费用并设置到订单对象
         setPayable.accept(insFeeOrders, payable);
         setPayable.accept(insFeeOrders, payable);
@@ -600,7 +605,7 @@ public class QuoteVerificationAspect {
                         }
                         }
                         break;
                         break;
                     case "3":
                     case "3":
-                        String level1Id = calculateLevel1Distribution(insFeeOrders, totalPremium, currentUser.getUserId(), sysDistributionSetting);
+                        String level1Id = calculateLevel1Distribution(insFeeOrders, totalPremium, currentUser.getId(), sysDistributionSetting);
                         if (level1Id != null) {
                         if (level1Id != null) {
                             String level2Id = calculateLevel2Distribution(insFeeOrders, totalPremium, level1Id, sysDistributionSetting);
                             String level2Id = calculateLevel2Distribution(insFeeOrders, totalPremium, level1Id, sysDistributionSetting);
                             if (level2Id != null) {
                             if (level2Id != null) {
@@ -627,6 +632,7 @@ public class QuoteVerificationAspect {
                 String distributorId = referrer.getReferrerId();
                 String distributorId = referrer.getReferrerId();
                 insFeeOrders.setFirstDistributorId(distributorId);
                 insFeeOrders.setFirstDistributorId(distributorId);
                 insFeeOrders.setFirstDistributionFee(totalPremium.multiply(setting.getCommissionRatioLevel1()));
                 insFeeOrders.setFirstDistributionFee(totalPremium.multiply(setting.getCommissionRatioLevel1()));
+                insFeeOrders.setFirstDistributionRatio(setting.getCommissionRatioLevel1());
                 return distributorId;
                 return distributorId;
             }
             }
         }
         }
@@ -647,6 +653,7 @@ public class QuoteVerificationAspect {
                 String distributorId = referrer.getReferrerId();
                 String distributorId = referrer.getReferrerId();
                 insFeeOrders.setSecondDistributorId(distributorId);
                 insFeeOrders.setSecondDistributorId(distributorId);
                 insFeeOrders.setSecondDistributionFee(totalPremium.multiply(setting.getCommissionRatioLevel2()));
                 insFeeOrders.setSecondDistributionFee(totalPremium.multiply(setting.getCommissionRatioLevel2()));
+                insFeeOrders.setSecondDistributionRatio(setting.getCommissionRatioLevel2());
                 return distributorId;
                 return distributorId;
             }
             }
         }
         }
@@ -666,6 +673,7 @@ public class QuoteVerificationAspect {
                     && "1".equals(referrerInfoResult.getData().getIsDistribution())) {
                     && "1".equals(referrerInfoResult.getData().getIsDistribution())) {
                 insFeeOrders.setThirdDistributorId(referrer.getReferrerId());
                 insFeeOrders.setThirdDistributorId(referrer.getReferrerId());
                 insFeeOrders.setThirdDistributionFee(totalPremium.multiply(setting.getCommissionRatioLevel3()));
                 insFeeOrders.setThirdDistributionFee(totalPremium.multiply(setting.getCommissionRatioLevel3()));
+                insFeeOrders.setThirdDistributionRatio(setting.getCommissionRatioLevel3());
             }
             }
         }
         }
     }
     }

+ 3 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -727,6 +727,9 @@ public class UnifyOrderManager {
             AssertionUtils.isFail(true, "保司未配置协议");
             AssertionUtils.isFail(true, "保司未配置协议");
         }
         }
 
 
+        //处理可能的影像补录(验车照等)
+        imageSave(insuranceUploadImageVo);
+
         List<InsOrdersCarUserInfo> insOrdersCarUserInfos = insOrdersCarUserInfoService.getByOrderId(insuranceUploadImageVo.getOrder().getOrdersNo());
         List<InsOrdersCarUserInfo> insOrdersCarUserInfos = insOrdersCarUserInfoService.getByOrderId(insuranceUploadImageVo.getOrder().getOrdersNo());
         insuranceUploadImageVo.setInsOrdersCarUserInfoList(insOrdersCarUserInfos);
         insuranceUploadImageVo.setInsOrdersCarUserInfoList(insOrdersCarUserInfos);
         insuranceUploadImageVo.getOrder().setAgreementId(insOrders.getAgreementId());
         insuranceUploadImageVo.getOrder().setAgreementId(insOrders.getAgreementId());

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

@@ -202,6 +202,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
     }
     }
 
 
     @Override
     @Override
+    @GlobalTransactional
     public void feeAuditAdd(InsOrders orders, String systemCode) {
     public void feeAuditAdd(InsOrders orders, String systemCode) {
         log.info("systemCode = [{}], feeAuditAdd: orders=[{}]",systemCode, JSONUtil.toJsonStr(orders));
         log.info("systemCode = [{}], feeAuditAdd: orders=[{}]",systemCode, JSONUtil.toJsonStr(orders));
         // 先检查是否已存在审核记录,避免重复INSERT导致主键冲突
         // 先检查是否已存在审核记录,避免重复INSERT导致主键冲突
@@ -226,6 +227,14 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
             insFeeAudit.setAuditStatus(1);
             insFeeAudit.setAuditStatus(1);
         }
         }
         this.save(insFeeAudit);
         this.save(insFeeAudit);
+        // 如果是自动审核 则执行自动审核逻辑
+        if(insFeeAudit.getAuditStatus().equals(1)){
+            VerifyOrderParam param = new VerifyOrderParam();
+            param.setOrderNo(orders.getId());
+            param.setAuditStatus(1);
+            param.setRefuse("自动审核");
+            this.verifyOrder(param);
+        }
     }
     }
 
 
     /**
     /**

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

@@ -517,6 +517,15 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             insOrdersVo.getInsuredPersonInfo().setIdentifyType(insOrdersVo.getInsuredPersonInfo().getPersonType());
             insOrdersVo.getInsuredPersonInfo().setIdentifyType(insOrdersVo.getInsuredPersonInfo().getPersonType());
         }
         }
 
 
+        // 费用信息
+        InsFeeOrders insFeeOrders = insFeeOrdersMapper.selectOne(new LambdaQueryWrapper<InsFeeOrders>()
+                .eq(InsFeeOrders::getOrderNo, insOrdersVo.getInsOrders().getId()));
+        // 比例信息
+        if (insFeeOrders != null) {
+            insOrdersVo.setCostRatio(new PtlAgreementCostRatioVo(insFeeOrders));
+            insOrdersVo.setFeeOrdersVo(new InsFeeOrdersVo(insFeeOrders));
+        }
+
         if (CollectionUtil.isNotEmpty(insOrdersVo.getInsOrdersRiskList())) {
         if (CollectionUtil.isNotEmpty(insOrdersVo.getInsOrdersRiskList())) {
             insOrdersVo.getInsOrdersRiskList().forEach(riskInfo -> {
             insOrdersVo.getInsOrdersRiskList().forEach(riskInfo -> {
                 insOrdersVo.setBiRiskInfoVo(getRiskInfoVo(riskInfo));
                 insOrdersVo.setBiRiskInfoVo(getRiskInfoVo(riskInfo));

+ 3 - 0
tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml

@@ -89,6 +89,9 @@
             <if test="param.receiveUser != null and param.receiveUser != ''">
             <if test="param.receiveUser != null and param.receiveUser != ''">
                 and ifa.receive_user = #{param.receiveUser}
                 and ifa.receive_user = #{param.receiveUser}
             </if>
             </if>
+            <if test="param.receiveUser == null or param.receiveUser == ''">
+                and ifa.receive_user is null
+            </if>
             <if test="param.allTodoReceive != null and param.allTodoReceive == true">
             <if test="param.allTodoReceive != null and param.allTodoReceive == true">
                 and ifa.receive_user is null
                 and ifa.receive_user is null
             </if>
             </if>

+ 8 - 105
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKHttpAPIService.java

@@ -80,9 +80,7 @@ public class TKHttpAPIService {
         httpHeaders.add("actiontype", "queryClaimData");
         httpHeaders.add("actiontype", "queryClaimData");
 
 
         LoginResult.Response response = client.request(HttpURL.login, param, httpHeaders, LoginResult.Response.class);
         LoginResult.Response response = client.request(HttpURL.login, param, httpHeaders, LoginResult.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -116,13 +114,10 @@ public class TKHttpAPIService {
         }
         }
 
 
         IdentityTokenResult.Response response = client.request(HttpURL.identityToken, param, httpHeaders, IdentityTokenResult.Response.class);
         IdentityTokenResult.Response response = client.request(HttpURL.identityToken, param, httpHeaders, IdentityTokenResult.Response.class);
-
         if (response == null) {
         if (response == null) {
             return null;
             return null;
         }
         }
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -164,9 +159,7 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         InitIdentityResult.Response response = client.request(HttpURL.initIdentity, param, httpHeaders, InitIdentityResult.Response.class);
         InitIdentityResult.Response response = client.request(HttpURL.initIdentity, param, httpHeaders, InitIdentityResult.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -178,9 +171,7 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         InitBasicDataResult response = client.request(HttpURL.initBasicData, param, httpHeaders, InitBasicDataResult.class);
         InitBasicDataResult response = client.request(HttpURL.initBasicData, param, httpHeaders, InitBasicDataResult.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response;
         return response;
     }
     }
 
 
@@ -212,13 +203,9 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         StringResponse response = client.request(HttpURL.basicInfo, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.basicInfo, param, httpHeaders, StringResponse.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         BasicInfoResult.Response decrypt = decrypt(response, BasicInfoResult.Response.class);
         BasicInfoResult.Response decrypt = decrypt(response, BasicInfoResult.Response.class);
-
         checkResponseUnknownField(decrypt);
         checkResponseUnknownField(decrypt);
-
         return decrypt.getData();
         return decrypt.getData();
     }
     }
 
 
@@ -240,9 +227,7 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         CarTypeResult.Response response = client.request(HttpURL.carType, param, httpHeaders, CarTypeResult.Response.class);
         CarTypeResult.Response response = client.request(HttpURL.carType, param, httpHeaders, CarTypeResult.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -266,9 +251,7 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         CarTypeResult.Response response = client.request(HttpURL.carType, param, httpHeaders, CarTypeResult.Response.class);
         CarTypeResult.Response response = client.request(HttpURL.carType, param, httpHeaders, CarTypeResult.Response.class);
-
         // checkResponseUnknownField(response);
         // checkResponseUnknownField(response);
-
         return response.getPassengerSeat();
         return response.getPassengerSeat();
     }
     }
 
 
@@ -294,12 +277,8 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         AgentFuzzyResult.Response response = client.request(HttpURL.agentFuzzy, param, httpHeaders, AgentFuzzyResult.Response.class);
         AgentFuzzyResult.Response response = client.request(HttpURL.agentFuzzy, param, httpHeaders, AgentFuzzyResult.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
-        List<AgentFuzzyResult> data = response.getData();
-
-        return data;
+        return response.getData();
     }
     }
 
 
     /**
     /**
@@ -327,11 +306,8 @@ public class TKHttpAPIService {
         httpHeaders.add("carInsurOrderId", orderId);
         httpHeaders.add("carInsurOrderId", orderId);
 
 
         StringResponse response = client.request(HttpURL.agentQuery, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.agentQuery, param, httpHeaders, StringResponse.class);
-
         TKAgentQueryResult decrypt = decrypt(response, TKAgentQueryResult.class);
         TKAgentQueryResult decrypt = decrypt(response, TKAgentQueryResult.class);
-
         checkResponseUnknownField(decrypt);
         checkResponseUnknownField(decrypt);
-
         return decrypt;
         return decrypt;
     }
     }
 
 
@@ -378,12 +354,8 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         AreaUserResult.Response response = client.request(HttpURL.areaUser, param, httpHeaders, AreaUserResult.Response.class);
         AreaUserResult.Response response = client.request(HttpURL.areaUser, param, httpHeaders, AreaUserResult.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
-        List<AreaUserResult> data = response.getData();
-
-        return data;
+        return response.getData();
     }
     }
 
 
     /**
     /**
@@ -399,12 +371,8 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         OrderIdResult.Response response = client.request(HttpURL.orderId, param, httpHeaders, OrderIdResult.Response.class);
         OrderIdResult.Response response = client.request(HttpURL.orderId, param, httpHeaders, OrderIdResult.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
-        OrderIdResult data = response.getData();
-
-        return data;
+        return response.getData();
     }
     }
 
 
     /**
     /**
@@ -417,17 +385,12 @@ public class TKHttpAPIService {
         httpHeaders.add("tkcarrequesttoken", session.getToken());
         httpHeaders.add("tkcarrequesttoken", session.getToken());
 
 
         StringResponse response = client.request(HttpURL.carModelinfoQuery, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.carModelinfoQuery, param, httpHeaders, StringResponse.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         CarModelinfoQueryResult.Response decrypt = decrypt(response, CarModelinfoQueryResult.Response.class);
         CarModelinfoQueryResult.Response decrypt = decrypt(response, CarModelinfoQueryResult.Response.class);
-
         if (decrypt.getStatus() == 0) {
         if (decrypt.getStatus() == 0) {
             throw new RuntimeException(decrypt.getMessage());
             throw new RuntimeException(decrypt.getMessage());
         }
         }
-
         checkResponseUnknownField(decrypt);
         checkResponseUnknownField(decrypt);
-
         return decrypt.getData();
         return decrypt.getData();
     }
     }
 
 
@@ -446,9 +409,7 @@ public class TKHttpAPIService {
 
 
         // 车辆所有人信息
         // 车辆所有人信息
         TKCarOwnerVo carOwnerVo = new TKCarOwnerVo();
         TKCarOwnerVo carOwnerVo = new TKCarOwnerVo();
-
         CustomerInfoVo commonCustomersInfo = commonQuoteVo.getOwnersInfo();
         CustomerInfoVo commonCustomersInfo = commonQuoteVo.getOwnersInfo();
-
         if (commonCustomersInfo != null) {
         if (commonCustomersInfo != null) {
             carOwnerVo.setCarOwnerNature("1"); // todo
             carOwnerVo.setCarOwnerNature("1"); // todo
             carOwnerVo.setCertificateType("01");  // 身份证
             carOwnerVo.setCertificateType("01");  // 身份证
@@ -502,9 +463,6 @@ public class TKHttpAPIService {
             car.setSeatFlag(1); // todo
             car.setSeatFlag(1); // todo
             car.setExhaustScale(tkCarModel.getDisplacement().substring(0, tkCarModel.getDisplacement().indexOf(".")));
             car.setExhaustScale(tkCarModel.getDisplacement().substring(0, tkCarModel.getDisplacement().indexOf(".")));
             car.setPurchasePrice(tkCarModel.getPurchasePrice().substring(0, tkCarModel.getPurchasePrice().indexOf(".")));
             car.setPurchasePrice(tkCarModel.getPurchasePrice().substring(0, tkCarModel.getPurchasePrice().indexOf(".")));
-//            car.setVinNo(commonCarInfoVo.getVinNo());
-//            car.setEngineNo(commonCarInfoVo.getEngineNo());
-//            car.setEnrollDate(commonCarInfoVo.getRegisterDate());
 
 
             Double tonCount = commonCarInfoVo.getTonCountDouble();
             Double tonCount = commonCarInfoVo.getTonCountDouble();
             if (tonCount != null && tonCount > 2) {
             if (tonCount != null && tonCount > 2) {
@@ -549,7 +507,6 @@ public class TKHttpAPIService {
                 // 默认 8B 非营业企业
                 // 默认 8B 非营业企业
                 car.setUseNatureCodeCode("8B");
                 car.setUseNatureCodeCode("8B");
             }
             }
-
             TKSimpleService.setLicenseTypeByLicenseNo(car, car.getLicenseNo());
             TKSimpleService.setLicenseTypeByLicenseNo(car, car.getLicenseNo());
         }
         }
 
 
@@ -568,11 +525,8 @@ public class TKHttpAPIService {
 
 
         HttpHeaders httpHeaders = new HttpHeaders();
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("tkCarRequestToken", session.getToken());
         httpHeaders.add("tkCarRequestToken", session.getToken());
-
         StringResponse response = client.request(HttpURL.carModelinfoCheckVehicleType, carModelinfoCheckVehicleTypeParam, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.carModelinfoCheckVehicleType, carModelinfoCheckVehicleTypeParam, httpHeaders, StringResponse.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -611,9 +565,7 @@ public class TKHttpAPIService {
         httpHeaders.add("carinsurorderid", param.getOrderID());
         httpHeaders.add("carinsurorderid", param.getOrderID());
 
 
         SaveBasicInfoResult.Response response = client.request(HttpURL.saveBasicInfo, param, httpHeaders, SaveBasicInfoResult.Response.class);
         SaveBasicInfoResult.Response response = client.request(HttpURL.saveBasicInfo, param, httpHeaders, SaveBasicInfoResult.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -633,9 +585,7 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         InitQuoteResult.Response response = client.request(HttpURL.initQuote, param, httpHeaders, InitQuoteResult.Response.class);
         InitQuoteResult.Response response = client.request(HttpURL.initQuote, param, httpHeaders, InitQuoteResult.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -678,9 +628,7 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         PreciseInitResult.Response response = client.request(HttpURL.preciseInit, param, httpHeaders, PreciseInitResult.Response.class);
         PreciseInitResult.Response response = client.request(HttpURL.preciseInit, param, httpHeaders, PreciseInitResult.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -689,9 +637,7 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         StringResponse response = client.request(HttpURL.preciseInit, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.preciseInit, param, httpHeaders, StringResponse.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return decrypt(response, PreciseInitResult.class);
         return decrypt(response, PreciseInitResult.class);
     }
     }
 
 
@@ -714,12 +660,8 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         StringResponse response = client.request(HttpURL.preciseInit, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.preciseInit, param, httpHeaders, StringResponse.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
-        PreciseInitResult decrypt = decrypt(response, PreciseInitResult.class);
-
-        return decrypt;
+        return decrypt(response, PreciseInitResult.class);
     }
     }
 
 
     /**
     /**
@@ -737,9 +679,7 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         AgentTaxResult.Response response = client.request(HttpURL.agentTax, param, httpHeaders, AgentTaxResult.Response.class);
         AgentTaxResult.Response response = client.request(HttpURL.agentTax, param, httpHeaders, AgentTaxResult.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -770,9 +710,7 @@ public class TKHttpAPIService {
         }
         }
 
 
         InitQuotationResult.Response response1 = JsonUtil.readObjcet(json, InitQuotationResult.Response.class);
         InitQuotationResult.Response response1 = JsonUtil.readObjcet(json, InitQuotationResult.Response.class);
-
         checkResponseUnknownField(response1);
         checkResponseUnknownField(response1);
-
         return response1.getData();
         return response1.getData();
     }
     }
 
 
@@ -790,9 +728,7 @@ public class TKHttpAPIService {
 
 
         HttpHeaders httpHeaders = new HttpHeaders();
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
-
         InitQuotationResult.Response response = client.request(HttpURL.initQuotation, param, httpHeaders, InitQuotationResult.Response.class);
         InitQuotationResult.Response response = client.request(HttpURL.initQuotation, param, httpHeaders, InitQuotationResult.Response.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -817,7 +753,6 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         SaveQuoteResult.Response response = client.request(HttpURL.saveQuote, param, httpHeaders, SaveQuoteResult.Response.class);
         SaveQuoteResult.Response response = client.request(HttpURL.saveQuote, param, httpHeaders, SaveQuoteResult.Response.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -833,7 +768,6 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         FloatNoticeGetResult.Response response = client.request(HttpURL.floatNoticeGet, param, httpHeaders, FloatNoticeGetResult.Response.class);
         FloatNoticeGetResult.Response response = client.request(HttpURL.floatNoticeGet, param, httpHeaders, FloatNoticeGetResult.Response.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -854,13 +788,9 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         StringResponse response = client.request(HttpURL.initProposal, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.initProposal, param, httpHeaders, StringResponse.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         InitProposalResult.Response response1 = decrypt(response, InitProposalResult.Response.class);
         InitProposalResult.Response response1 = decrypt(response, InitProposalResult.Response.class);
-
-//        checkResponseUnknownField(response1);
-
+        // checkResponseUnknownField(response1);
         return response1.getData();
         return response1.getData();
     }
     }
 
 
@@ -882,7 +812,6 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         EngageEngageQueryResult.Response response = client.request(HttpURL.engageEngageQuery, param, httpHeaders, EngageEngageQueryResult.Response.class);
         EngageEngageQueryResult.Response response = client.request(HttpURL.engageEngageQuery, param, httpHeaders, EngageEngageQueryResult.Response.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -899,7 +828,6 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         InitFindRiskConfigResult.Response response = client.request(HttpURL.initFindRiskConfig, param, httpHeaders, InitFindRiskConfigResult.Response.class);
         InitFindRiskConfigResult.Response response = client.request(HttpURL.initFindRiskConfig, param, httpHeaders, InitFindRiskConfigResult.Response.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -915,7 +843,6 @@ public class TKHttpAPIService {
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
         GroupOrderGetNewNoticeStatusResult.Response response = client.request(HttpURL.groupOrderGetNewNoticeStatus, param, httpHeaders, GroupOrderGetNewNoticeStatusResult.Response.class);
         GroupOrderGetNewNoticeStatusResult.Response response = client.request(HttpURL.groupOrderGetNewNoticeStatus, param, httpHeaders, GroupOrderGetNewNoticeStatusResult.Response.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -930,10 +857,7 @@ public class TKHttpAPIService {
         httpHeaders.add("Actiontype", actionType);
         httpHeaders.add("Actiontype", actionType);
 
 
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
-
-        B response1 = decrypt(response, responseType);
-
-        return response1;
+        return decrypt(response, responseType);
     }
     }
 
 
     /**
     /**
@@ -948,10 +872,7 @@ public class TKHttpAPIService {
         httpHeaders.add("carssToken", carssToken);
         httpHeaders.add("carssToken", carssToken);
 
 
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
-
-        B response1 = decrypt(response, responseType);
-
-        return response1;
+        return decrypt(response, responseType);
     }
     }
 
 
     /**
     /**
@@ -965,7 +886,6 @@ public class TKHttpAPIService {
         httpHeaders.add("Actiontype", actionType);
         httpHeaders.add("Actiontype", actionType);
 
 
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -979,9 +899,7 @@ public class TKHttpAPIService {
         httpHeaders.add("Actiontype", actionType);
         httpHeaders.add("Actiontype", actionType);
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("tkCarRequestToken", token);
 
 
-        B response = client.request(HttpURL.entrance, param, httpHeaders, responseType);
-
-        return response;
+        return client.request(HttpURL.entrance, param, httpHeaders, responseType);
     }
     }
 
 
     /**
     /**
@@ -1000,7 +918,6 @@ public class TKHttpAPIService {
         param.setChannelEngages(new ArrayList<>());
         param.setChannelEngages(new ArrayList<>());
 
 
         EntranceResult.Response response = entranceForJson(token, param, "000012", EntranceResult.Response.class);
         EntranceResult.Response response = entranceForJson(token, param, "000012", EntranceResult.Response.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -1051,7 +968,6 @@ public class TKHttpAPIService {
         }
         }
 
 
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -1070,9 +986,7 @@ public class TKHttpAPIService {
         param.setUserId(userId);
         param.setUserId(userId);
 
 
         TKEntranceFor000086Result.Response response = entranceForDecrypt(token, carssToken, param, "000086", TKEntranceFor000086Result.Response.class);
         TKEntranceFor000086Result.Response response = entranceForDecrypt(token, carssToken, param, "000086", TKEntranceFor000086Result.Response.class);
-
         checkResponseUnknownField(response);
         checkResponseUnknownField(response);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -1088,11 +1002,9 @@ public class TKHttpAPIService {
         param.setOrderID(orderId);
         param.setOrderID(orderId);
 
 
         String response = entranceForString(token, param, "000133");
         String response = entranceForString(token, param, "000133");
-
         if (response != null) {
         if (response != null) {
             response = response.replace("验车码:", "");
             response = response.replace("验车码:", "");
         }
         }
-
         return response;
         return response;
     }
     }
 
 
@@ -1110,7 +1022,6 @@ public class TKHttpAPIService {
 
 
         // todo 这个接口,暂时了解到返回的数据的 data 字段是一个字符串格式,内容是 message 消息提示 “暂无模板,请联系客户经理”,怀疑有数据时会变成 json 数据,所以以后可能需要处理此问题。
         // todo 这个接口,暂时了解到返回的数据的 data 字段是一个字符串格式,内容是 message 消息提示 “暂无模板,请联系客户经理”,怀疑有数据时会变成 json 数据,所以以后可能需要处理此问题。
         StringResponse response = client.request(HttpURL.carCheckAttorneyList, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.carCheckAttorneyList, param, httpHeaders, StringResponse.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -1154,7 +1065,6 @@ public class TKHttpAPIService {
         // param.setFromId(null);
         // param.setFromId(null);
 
 
         StringResponse response = client.request(HttpURL.proposalDownload, param, null, StringResponse.class);
         StringResponse response = client.request(HttpURL.proposalDownload, param, null, StringResponse.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -1173,7 +1083,6 @@ public class TKHttpAPIService {
         param.setSubPolicyNo(subPolicyNo);
         param.setSubPolicyNo(subPolicyNo);
 
 
         StringResponse response = client.request(HttpURL.imageDownloadPolicy, param, null, StringResponse.class);
         StringResponse response = client.request(HttpURL.imageDownloadPolicy, param, null, StringResponse.class);
-
         return response.getData();
         return response.getData();
     }
     }
 
 
@@ -1268,7 +1177,6 @@ public class TKHttpAPIService {
         formData.add("uploadType", param.getUploadType());
         formData.add("uploadType", param.getUploadType());
         formData.add("tplatformId", param.getTplatformId());
         formData.add("tplatformId", param.getTplatformId());
         formData.add("fileType", param.getFileType());
         formData.add("fileType", param.getFileType());
-
         client.uploadFileWithParams(HttpURL.carCheckUploadFile, formData, file);
         client.uploadFileWithParams(HttpURL.carCheckUploadFile, formData, file);
     }
     }
 
 
@@ -1285,8 +1193,6 @@ public class TKHttpAPIService {
 
 
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
         TKEntranceFor000021Result.Response decrypt = decrypt(response, TKEntranceFor000021Result.Response.class);
         TKEntranceFor000021Result.Response decrypt = decrypt(response, TKEntranceFor000021Result.Response.class);
-
-
         return decrypt.getData();
         return decrypt.getData();
     }
     }
 
 
@@ -1320,7 +1226,6 @@ public class TKHttpAPIService {
 
 
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
         TKEntranceFor000052Result.Response decrypt = decrypt(response, TKEntranceFor000052Result.Response.class);
         TKEntranceFor000052Result.Response decrypt = decrypt(response, TKEntranceFor000052Result.Response.class);
-
         return decrypt.getData();
         return decrypt.getData();
     }
     }
 
 
@@ -1344,9 +1249,7 @@ public class TKHttpAPIService {
 
 
         HttpHeaders httpHeaders = new HttpHeaders();
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("token", token);
         httpHeaders.add("token", token);
-
         StringResponse response = client.request(HttpURL.receive, tkReceiveParam, httpHeaders, StringResponse.class);
         StringResponse response = client.request(HttpURL.receive, tkReceiveParam, httpHeaders, StringResponse.class);
-
         return null;
         return null;
     }
     }
 }
 }

+ 29 - 115
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKSimpleService.java

@@ -1,18 +1,17 @@
 package com.jzg.quotation.taikang.crawler.service;
 package com.jzg.quotation.taikang.crawler.service;
 
 
-import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.constants.quote.enums.quote.CarKindCode;
 import com.jzg.commons.constants.quote.enums.quote.CarKindCode;
 import com.jzg.commons.constants.quote.enums.quote.VehicleUseCode;
 import com.jzg.commons.constants.quote.enums.quote.VehicleUseCode;
 import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
 import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
 import com.jzg.commons.entity.quote.vo.*;
 import com.jzg.commons.entity.quote.vo.*;
-import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.IDCardUtils;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
-import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.taikang.crawler.CodeUtil;
 import com.jzg.quotation.taikang.crawler.CodeUtil;
 import com.jzg.quotation.taikang.crawler.model.TKLoginSession;
 import com.jzg.quotation.taikang.crawler.model.TKLoginSession;
 import com.jzg.quotation.taikang.crawler.model.api.*;
 import com.jzg.quotation.taikang.crawler.model.api.*;
 import com.jzg.quotation.taikang.crawler.model.entity.*;
 import com.jzg.quotation.taikang.crawler.model.entity.*;
 import jakarta.annotation.Resource;
 import jakarta.annotation.Resource;
+import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -21,8 +20,6 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.*;
 import java.util.function.Function;
 import java.util.function.Function;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 @Slf4j
 @Slf4j
@@ -118,64 +115,22 @@ public class TKSimpleService {
      */
      */
     public static void setLicenseTypeByLicenseNo(TKCarInfoVo carInfoVo, String licenseNo) {
     public static void setLicenseTypeByLicenseNo(TKCarInfoVo carInfoVo, String licenseNo) {
         carInfoVo.setLicenseNo(licenseNo);
         carInfoVo.setLicenseNo(licenseNo);
-
-        String licenseType = null;
-        String licenseTypeChinese = null;
-
-        if (StringUtils.isNotBlank(licenseNo)) {
-
-            if (licenseNo.startsWith("使")) {
-                licenseType = "03";
-                licenseTypeChinese = "使馆汽车号牌";
-            } else if (licenseNo.startsWith("领")) {
-                licenseType = "04";
-                licenseTypeChinese = "领馆汽车号牌";
-            } else if (licenseNo.startsWith("学")) {
-                licenseType = "16";
-                licenseTypeChinese = "教练汽车号牌";
-            } else if (licenseNo.startsWith("警")) {
-                licenseType = "23";
-                licenseTypeChinese = "公安警车号牌";
-            } else if (licenseNo.startsWith("WJ")) {
-                int length = licenseNo.length();
-
-                if (length == 7) {
-                    licenseType = "02";
-                    licenseTypeChinese = "小型汽车号牌";
-                } else if (length == 8) {
-                    licenseType = "52";
-                    licenseTypeChinese = "小型新能源汽车";
-
-                }
-            } else if (TKCommonUtil.isArmyCar(licenseNo)) {
-                licenseType = "32";
-                licenseTypeChinese = "军队号牌";
-            } else {
-                int length = licenseNo.length();
-
-                if (length == 7) {
-                    licenseType = "02";
-                    licenseTypeChinese = "小型汽车号牌";
-                } else if (length == 8) {
-                    licenseType = "52";
-                    licenseTypeChinese = "小型新能源汽车";
-
-                }
-            }
-        }
-
-        carInfoVo.setLicenseType(licenseType);
-        carInfoVo.setLicenseTypeChinese(licenseTypeChinese);
+        LicenseTypeResult result = getLicenseTypeByLicenseNo(licenseNo);
+        carInfoVo.setLicenseType(result.getLicenseType());
+        carInfoVo.setLicenseTypeChinese(result.getLicenseTypeChinese());
     }
     }
 
 
     public static void setLicenseTypeByLicenseNo(TKCar tkCar, String licenseNo) {
     public static void setLicenseTypeByLicenseNo(TKCar tkCar, String licenseNo) {
         tkCar.setLicenseNo(licenseNo);
         tkCar.setLicenseNo(licenseNo);
+        LicenseTypeResult result = getLicenseTypeByLicenseNo(licenseNo);
+        tkCar.setLicenseType(result.getLicenseType());
+        tkCar.setLicenseTypeChinese(result.getLicenseTypeChinese());
+    }
 
 
+    private static LicenseTypeResult getLicenseTypeByLicenseNo(String licenseNo) {
         String licenseType = null;
         String licenseType = null;
         String licenseTypeChinese = null;
         String licenseTypeChinese = null;
-
         if (StringUtils.isNotBlank(licenseNo)) {
         if (StringUtils.isNotBlank(licenseNo)) {
-
             if (licenseNo.startsWith("使")) {
             if (licenseNo.startsWith("使")) {
                 licenseType = "03";
                 licenseType = "03";
                 licenseTypeChinese = "使馆汽车号牌";
                 licenseTypeChinese = "使馆汽车号牌";
@@ -190,34 +145,39 @@ public class TKSimpleService {
                 licenseTypeChinese = "公安警车号牌";
                 licenseTypeChinese = "公安警车号牌";
             } else if (licenseNo.startsWith("WJ")) {
             } else if (licenseNo.startsWith("WJ")) {
                 int length = licenseNo.length();
                 int length = licenseNo.length();
-
                 if (length == 7) {
                 if (length == 7) {
                     licenseType = "02";
                     licenseType = "02";
                     licenseTypeChinese = "小型汽车号牌";
                     licenseTypeChinese = "小型汽车号牌";
                 } else if (length == 8) {
                 } else if (length == 8) {
                     licenseType = "52";
                     licenseType = "52";
                     licenseTypeChinese = "小型新能源汽车";
                     licenseTypeChinese = "小型新能源汽车";
-
                 }
                 }
             } else if (TKCommonUtil.isArmyCar(licenseNo)) {
             } else if (TKCommonUtil.isArmyCar(licenseNo)) {
                 licenseType = "32";
                 licenseType = "32";
                 licenseTypeChinese = "军队号牌";
                 licenseTypeChinese = "军队号牌";
             } else {
             } else {
                 int length = licenseNo.length();
                 int length = licenseNo.length();
-
                 if (length == 7) {
                 if (length == 7) {
                     licenseType = "02";
                     licenseType = "02";
                     licenseTypeChinese = "小型汽车号牌";
                     licenseTypeChinese = "小型汽车号牌";
                 } else if (length == 8) {
                 } else if (length == 8) {
                     licenseType = "52";
                     licenseType = "52";
                     licenseTypeChinese = "小型新能源汽车";
                     licenseTypeChinese = "小型新能源汽车";
-
                 }
                 }
             }
             }
         }
         }
+        return new LicenseTypeResult(licenseType, licenseTypeChinese);
+    }
+
+    @Getter
+    private static class LicenseTypeResult {
+        private final String licenseType;
+        private final String licenseTypeChinese;
 
 
-        tkCar.setLicenseType(licenseType);
-        tkCar.setLicenseTypeChinese(licenseTypeChinese);
+        private LicenseTypeResult(String licenseType, String licenseTypeChinese) {
+            this.licenseType = licenseType;
+            this.licenseTypeChinese = licenseTypeChinese;
+        }
     }
     }
 
 
     /**
     /**
@@ -256,14 +216,10 @@ public class TKSimpleService {
      */
      */
     public AgentFuzzyResult agentChannel(TKLoginSession session, String mainOrderId, String intermediaryName) {
     public AgentFuzzyResult agentChannel(TKLoginSession session, String mainOrderId, String intermediaryName) {
         List<AgentFuzzyResult> agentFuzzyResults = httpService.agentFuzzy(session.getToken(), session.getTplatformId(), session.getFromid(), mainOrderId, intermediaryName);
         List<AgentFuzzyResult> agentFuzzyResults = httpService.agentFuzzy(session.getToken(), session.getTplatformId(), session.getFromid(), mainOrderId, intermediaryName);
-
         if (agentFuzzyResults == null || agentFuzzyResults.isEmpty()) {
         if (agentFuzzyResults == null || agentFuzzyResults.isEmpty()) {
             return null;
             return null;
         }
         }
-
-        AgentFuzzyResult agentFuzzyResult = agentFuzzyResults.get(0);
-
-        return agentFuzzyResult;
+        return agentFuzzyResults.get(0);
     }
     }
 
 
     /**
     /**
@@ -276,9 +232,7 @@ public class TKSimpleService {
      * @return
      * @return
      */
      */
     public TKAgentQueryResult agentQuery(TKLoginSession session, String mainOrderId, AgentFuzzyResult agentFuzzyResult, String agentCode) {
     public TKAgentQueryResult agentQuery(TKLoginSession session, String mainOrderId, AgentFuzzyResult agentFuzzyResult, String agentCode) {
-        TKAgentQueryResult agentQueryResult = httpService.agentQuery(session.getToken(), session.getTplatformId(), mainOrderId, agentFuzzyResult, agentCode);
-
-        return agentQueryResult;
+        return httpService.agentQuery(session.getToken(), session.getTplatformId(), mainOrderId, agentFuzzyResult, agentCode);
     }
     }
 
 
     /**
     /**
@@ -322,7 +276,6 @@ public class TKSimpleService {
 
 
         // 车辆大类
         // 车辆大类
         String carKindCode = commonCarInfoVo.getCarKindCode();
         String carKindCode = commonCarInfoVo.getCarKindCode();
-
         if (carKindCode.equals(CarKindCode.CAR_KIND_CODE_A0.getCode())) {
         if (carKindCode.equals(CarKindCode.CAR_KIND_CODE_A0.getCode())) {
             carInfoVo.setCarType("A");
             carInfoVo.setCarType("A");
         } else if (carKindCode.equals(CarKindCode.CAR_KIND_CODE_A1.getCode())) {
         } else if (carKindCode.equals(CarKindCode.CAR_KIND_CODE_A1.getCode())) {
@@ -332,11 +285,8 @@ public class TKSimpleService {
         }
         }
 
 
         setLicenseTypeByLicenseNo(carInfoVo, carInfoVo.getLicenseNo());
         setLicenseTypeByLicenseNo(carInfoVo, carInfoVo.getLicenseNo());
-
         carInfoVo.setLocalCarFlag(null); // todo 车型查询时没有传这个参数,暂时不知什么地方用到。
         carInfoVo.setLocalCarFlag(null); // todo 车型查询时没有传这个参数,暂时不知什么地方用到。
-
 //        String tempOrderId = newOrderId(session);
 //        String tempOrderId = newOrderId(session);
-
         CarModelinfoQueryParam carModelinfoQueryParam = new CarModelinfoQueryParam();
         CarModelinfoQueryParam carModelinfoQueryParam = new CarModelinfoQueryParam();
         carModelinfoQueryParam.setTplatformId(session.getTplatformId());
         carModelinfoQueryParam.setTplatformId(session.getTplatformId());
         carModelinfoQueryParam.setTplatLoginKey(session.getTplatLoginKey());
         carModelinfoQueryParam.setTplatLoginKey(session.getTplatLoginKey());
@@ -347,10 +297,7 @@ public class TKSimpleService {
         carModelinfoQueryParam.setChannelCode("OffWeb");
         carModelinfoQueryParam.setChannelCode("OffWeb");
         carModelinfoQueryParam.setAreaInfoVo(area);
         carModelinfoQueryParam.setAreaInfoVo(area);
         carModelinfoQueryParam.setCarInfoVo(carInfoVo);
         carModelinfoQueryParam.setCarInfoVo(carInfoVo);
-
-        CarModelinfoQueryResult carModelinfoQueryResult = httpService.carModelinfoQuery(session, mainOrderId, carModelinfoQueryParam);
-
-        return carModelinfoQueryResult;
+        return httpService.carModelinfoQuery(session, mainOrderId, carModelinfoQueryParam);
     }
     }
 
 
     /**
     /**
@@ -479,7 +426,6 @@ public class TKSimpleService {
         }
         }
 
 
         carInfoVo.setLocalCarFlag(null); // todo 车型查询时没有传这个参数,暂时不知什么地方用到。
         carInfoVo.setLocalCarFlag(null); // todo 车型查询时没有传这个参数,暂时不知什么地方用到。
-
         CarModelinfoQueryParam carModelinfoQueryParam = new CarModelinfoQueryParam();
         CarModelinfoQueryParam carModelinfoQueryParam = new CarModelinfoQueryParam();
         carModelinfoQueryParam.setTplatformId(session.getTplatformId());
         carModelinfoQueryParam.setTplatformId(session.getTplatformId());
         carModelinfoQueryParam.setFromId(session.getFromid());
         carModelinfoQueryParam.setFromId(session.getFromid());
@@ -492,18 +438,11 @@ public class TKSimpleService {
         return httpService.carModelinfoQuery(session, mainOrderId, carModelinfoQueryParam);
         return httpService.carModelinfoQuery(session, mainOrderId, carModelinfoQueryParam);
     }
     }
 
 
-    public TKAreaInfoVo dataCreateArea(TKLoginSession session,
-                                       String mainOrderId,
-                                       CarInfoVo commonCarInfoVo,
-                                       TKAgentFuzzy agentFuzzy,
-                                       String agentCode,
-                                       TKAgentQueryResult agentQueryResult,
-                                       AreaUserResult province) {
+    public TKAreaInfoVo dataCreateArea(TKLoginSession session, String mainOrderId, CarInfoVo commonCarInfoVo, TKAgentFuzzy agentFuzzy,
+                                       String agentCode, TKAgentQueryResult agentQueryResult, AreaUserResult province) {
         String tplatformId = session.getTplatformId();
         String tplatformId = session.getTplatformId();
         String fromId = session.getFromid();
         String fromId = session.getFromid();
-
         AreaUserResult.CityInfo city = province.getCityList().get(0);
         AreaUserResult.CityInfo city = province.getCityList().get(0);
-
         TKAgent agent = new TKAgent();
         TKAgent agent = new TKAgent();
         agent.setStatus("1");
         agent.setStatus("1");
         agent.setAgentCode(agentCode);
         agent.setAgentCode(agentCode);
@@ -556,7 +495,6 @@ public class TKSimpleService {
         carOwnerVo.setCarOwnerNature(insOrdersCarUserInfo.getPersonType().toString());
         carOwnerVo.setCarOwnerNature(insOrdersCarUserInfo.getPersonType().toString());
         carOwnerVo.setCertificateType("01");
         carOwnerVo.setCertificateType("01");
 
 
-
         // 投保人信息
         // 投保人信息
         TKAppliInfo appliInfo = new TKAppliInfo();
         TKAppliInfo appliInfo = new TKAppliInfo();
         appliInfo.setAppliName(carOwnerVo.getName());
         appliInfo.setAppliName(carOwnerVo.getName());
@@ -598,7 +536,6 @@ public class TKSimpleService {
         insureInfo.setCarOwnerVo(carOwnerVo);
         insureInfo.setCarOwnerVo(carOwnerVo);
         insureInfo.setAppliInfo(appliInfo);
         insureInfo.setAppliInfo(appliInfo);
         insureInfo.setInsuredInfo(insuredInfo);
         insureInfo.setInsuredInfo(insuredInfo);
-
         return insureInfo;
         return insureInfo;
     }
     }
 
 
@@ -677,9 +614,7 @@ public class TKSimpleService {
 
 
         // 车辆所有人信息
         // 车辆所有人信息
         TKCarOwnerVo carOwnerVo = new TKCarOwnerVo();
         TKCarOwnerVo carOwnerVo = new TKCarOwnerVo();
-
         CustomerInfoVo commonCustomersInfo = commonQuoteVo.getOwnersInfo();
         CustomerInfoVo commonCustomersInfo = commonQuoteVo.getOwnersInfo();
-
         if (commonCustomersInfo != null) {
         if (commonCustomersInfo != null) {
             carOwnerVo.setCarOwnerNature("1"); // todo
             carOwnerVo.setCarOwnerNature("1"); // todo
             carOwnerVo.setCertificateType("01");  // 身份证
             carOwnerVo.setCertificateType("01");  // 身份证
@@ -687,7 +622,7 @@ public class TKSimpleService {
             carOwnerVo.setName(commonCustomersInfo.getName());
             carOwnerVo.setName(commonCustomersInfo.getName());
             carOwnerVo.setBirthDate(commonCustomersInfo.getBirthday());
             carOwnerVo.setBirthDate(commonCustomersInfo.getBirthday());
             carOwnerVo.setSerialno(BigDecimal.ZERO);
             carOwnerVo.setSerialno(BigDecimal.ZERO);
-            carOwnerVo.setSex(commonCustomersInfo.getGender()); // todo
+            carOwnerVo.setSex(IDCardUtils.getSex(commonCustomersInfo.getIdentifyNumber()));
             carOwnerVo.setInsuredAddress("");
             carOwnerVo.setInsuredAddress("");
         }
         }
 
 
@@ -778,16 +713,12 @@ public class TKSimpleService {
         }
         }
 
 
         TKSimpleService.setLicenseTypeByLicenseNo(car, car.getLicenseNo());
         TKSimpleService.setLicenseTypeByLicenseNo(car, car.getLicenseNo());
-
         String passengerSeat = httpService.carTypePassengerSeat(session.getToken(), session.getTplatformId(), session.getFromid(), session.getComCode());
         String passengerSeat = httpService.carTypePassengerSeat(session.getToken(), session.getTplatformId(), session.getFromid(), session.getComCode());
-
         String carType = carType(passengerSeat, car.getCarType(), carOwnerVo.getCarOwnerNature());
         String carType = carType(passengerSeat, car.getCarType(), carOwnerVo.getCarOwnerNature());
-
         if (carType != null) {
         if (carType != null) {
             car.setCarType(carType);
             car.setCarType(carType);
         }
         }
 
 
-
         orderCreateOther(null);
         orderCreateOther(null);
         car.setCarModel(Arrays.asList(tkCarModel));
         car.setCarModel(Arrays.asList(tkCarModel));
         car.setBrandName(tkCarModel.getModelName()); // todo 与 commonCarInfoVo.getBrandName() 重复
         car.setBrandName(tkCarModel.getModelName()); // todo 与 commonCarInfoVo.getBrandName() 重复
@@ -825,9 +756,7 @@ public class TKSimpleService {
         param.setCarTaxVo(carTax);
         param.setCarTaxVo(carTax);
         param.setOtherInfo(otherInfo);
         param.setOtherInfo(otherInfo);
         param.setOrderVersion("1");
         param.setOrderVersion("1");
-
         SaveBasicInfoResult saveBasicInfoResult = httpService.saveBasicInfo(session.getToken(), param);
         SaveBasicInfoResult saveBasicInfoResult = httpService.saveBasicInfo(session.getToken(), param);
-
         if (saveBasicInfoResult == null) {
         if (saveBasicInfoResult == null) {
             throw new RuntimeException("HttpService#saveBasicInfo 失败!");
             throw new RuntimeException("HttpService#saveBasicInfo 失败!");
         }
         }
@@ -969,10 +898,7 @@ public class TKSimpleService {
      * @param preciseInitResult
      * @param preciseInitResult
      * @param commonQuoteVo
      * @param commonQuoteVo
      */
      */
-    public PreciseInitResult orderQuote(TKLoginSession session,
-                                        String mainOrderId,
-                                        PreciseInitResult preciseInitResult,
-                                        QuoteVo commonQuoteVo) {
+    public PreciseInitResult orderQuote(TKLoginSession session, String mainOrderId, PreciseInitResult preciseInitResult, QuoteVo commonQuoteVo) {
         PreciseInitParam preciseInitParam = Converter.Instance.convertToParam(preciseInitResult);
         PreciseInitParam preciseInitParam = Converter.Instance.convertToParam(preciseInitResult);
 
 
         // 全局固定参数
         // 全局固定参数
@@ -981,7 +907,6 @@ public class TKSimpleService {
         String fromId = session.getFromid();
         String fromId = session.getFromid();
 
 
         // 险种选中标志
         // 险种选中标志
-
         TKFlag flag = preciseInitParam.getFlag();
         TKFlag flag = preciseInitParam.getFlag();
         if (flag == null) {
         if (flag == null) {
             flag = new TKFlag();
             flag = new TKFlag();
@@ -996,14 +921,8 @@ public class TKSimpleService {
         if (CollectionUtils.isEmpty(commonQuoteVo.getKindInfoVo())) {
         if (CollectionUtils.isEmpty(commonQuoteVo.getKindInfoVo())) {
             flag.setCiFlag("0");
             flag.setCiFlag("0");
         }
         }
-        // 无驾意险,经测试这个值无驾意险的时候请求还是传1,不用改变
-        // if (CollectionUtils.isEmpty(commonQuoteVo.getAccidentalDrivings())) {
-        //     flag.setIsAccidentInsureFlag("0");
-        // }
-
 
 
         // 其他参数
         // 其他参数
-
         TKOther other = preciseInitParam.getOther();
         TKOther other = preciseInitParam.getOther();
         if (other == null) {
         if (other == null) {
             other = new TKOther();
             other = new TKOther();
@@ -1054,7 +973,6 @@ public class TKSimpleService {
             }
             }
         }
         }
 
 
-
         // 同步商业险时间信息,从前端参数获取
         // 同步商业险时间信息,从前端参数获取
         RiskInfoVo commonBiRiskInfoVo = commonQuoteVo.getBiRiskInfoVo();
         RiskInfoVo commonBiRiskInfoVo = commonQuoteVo.getBiRiskInfoVo();
         if (commonBiRiskInfoVo != null) {
         if (commonBiRiskInfoVo != null) {
@@ -1095,11 +1013,9 @@ public class TKSimpleService {
                 } else if (StringUtils.isNotBlank(serviceTimes)) {
                 } else if (StringUtils.isNotBlank(serviceTimes)) {
                     tkCiKindVo.setQuantity(Integer.parseInt(serviceTimes));
                     tkCiKindVo.setQuantity(Integer.parseInt(serviceTimes));
                 }
                 }
-
             }
             }
         }
         }
 
 
-
         // 同步驾意险, 系统有选择驾意险进行匹配覆盖(泰康要求必须有驾意险)
         // 同步驾意险, 系统有选择驾意险进行匹配覆盖(泰康要求必须有驾意险)
         Map<String, TKCarPlanInfo> carPlanInfoMap = Optional.ofNullable(preciseInitParam.getDriverAccidentVo().getCarPlanInfoList()).orElseGet(Collections::emptyList).stream().collect(Collectors.toMap(TKCarPlanInfo::getPlanCode, Function.identity()));
         Map<String, TKCarPlanInfo> carPlanInfoMap = Optional.ofNullable(preciseInitParam.getDriverAccidentVo().getCarPlanInfoList()).orElseGet(Collections::emptyList).stream().collect(Collectors.toMap(TKCarPlanInfo::getPlanCode, Function.identity()));
         TKDriverAccidentVo driverAccidentVo = preciseInitParam.getDriverAccidentVo();// 泰康系统默认的驾意险信息
         TKDriverAccidentVo driverAccidentVo = preciseInitParam.getDriverAccidentVo();// 泰康系统默认的驾意险信息
@@ -1177,7 +1093,6 @@ public class TKSimpleService {
         httpService.entranceFor000012(token, tplatformId, fromId, mainOrderId, insureInfo);
         httpService.entranceFor000012(token, tplatformId, fromId, mainOrderId, insureInfo);
 
 
         PreciseInitResult preciseQuoteResult = httpService.preciseInitToVipQuote(token, tplatformId, tplatLoginKey, mainOrderId, insureInfo);
         PreciseInitResult preciseQuoteResult = httpService.preciseInitToVipQuote(token, tplatformId, tplatLoginKey, mainOrderId, insureInfo);
-
         if (preciseQuoteResult == null) {
         if (preciseQuoteResult == null) {
             throw new RuntimeException("HttpService#preciseInitToQuote (核保)失败!");
             throw new RuntimeException("HttpService#preciseInitToQuote (核保)失败!");
         }
         }
@@ -1195,7 +1110,6 @@ public class TKSimpleService {
         String tplatformId = session.getTplatformId();
         String tplatformId = session.getTplatformId();
         String tplatLoginKey = session.getTplatLoginKey();
         String tplatLoginKey = session.getTplatLoginKey();
         String token = session.getToken();
         String token = session.getToken();
-        InitProposalResult initProposalResult = httpService.initProposal(token, tplatformId, tplatLoginKey, mainOrderId);
-        return initProposalResult;
+        return httpService.initProposal(token, tplatformId, tplatLoginKey, mainOrderId);
     }
     }
 }
 }

+ 34 - 55
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/impl/TKQuotationBaseServiceImpl.java

@@ -20,7 +20,6 @@ import com.jzg.quotation.taikang.crawler.client.AESDecryptor;
 import com.jzg.quotation.taikang.crawler.model.TKLoginSession;
 import com.jzg.quotation.taikang.crawler.model.TKLoginSession;
 import com.jzg.quotation.taikang.crawler.model.api.*;
 import com.jzg.quotation.taikang.crawler.model.api.*;
 import com.jzg.quotation.taikang.crawler.model.entity.TKAreaInfoVo;
 import com.jzg.quotation.taikang.crawler.model.entity.TKAreaInfoVo;
-import com.jzg.quotation.taikang.crawler.model.entity.TKCarAccident;
 import com.jzg.quotation.taikang.crawler.model.entity.TKInsureInfo;
 import com.jzg.quotation.taikang.crawler.model.entity.TKInsureInfo;
 import com.jzg.quotation.taikang.crawler.model.entity.TKOrderData;
 import com.jzg.quotation.taikang.crawler.model.entity.TKOrderData;
 import com.jzg.quotation.taikang.crawler.model.entity.po.TKCrawlerOrder;
 import com.jzg.quotation.taikang.crawler.model.entity.po.TKCrawlerOrder;
@@ -121,14 +120,12 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
 
 
         // 查询代理机构
         // 查询代理机构
         AgentFuzzyResult agentFuzzyResult = tkSimpleService.agentChannel(session, mainOrderId, intermediaryName);
         AgentFuzzyResult agentFuzzyResult = tkSimpleService.agentChannel(session, mainOrderId, intermediaryName);
-
         if (agentFuzzyResult == null) {
         if (agentFuzzyResult == null) {
             throw new RuntimeException("未能获取代理机构信息!");
             throw new RuntimeException("未能获取代理机构信息!");
         }
         }
 
 
         // # 查询代理人
         // # 查询代理人
         TKAgentQueryResult agentQueryResult = tkSimpleService.agentQuery(session, mainOrderId, agentFuzzyResult, attributionInformationVo.getConfigInfo().get("agentCode"));
         TKAgentQueryResult agentQueryResult = tkSimpleService.agentQuery(session, mainOrderId, agentFuzzyResult, attributionInformationVo.getConfigInfo().get("agentCode"));
-
         if (agentQueryResult == null || agentQueryResult.getErrorMessage() != null) {
         if (agentQueryResult == null || agentQueryResult.getErrorMessage() != null) {
             throw new RuntimeException("未能获取代理人信息!");
             throw new RuntimeException("未能获取代理人信息!");
         }
         }
@@ -139,10 +136,10 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
         // 构建一个区域数据,供后面使用
         // 构建一个区域数据,供后面使用
         TKAreaInfoVo tkAreaInfoVo = tkSimpleService.dataCreateArea(session, mainOrderId, commonQuoteVo.getCarInfoVo(), agentFuzzyResult, attributionInformationVo.getConfigInfo().get("agentCode"), agentQueryResult, province);
         TKAreaInfoVo tkAreaInfoVo = tkSimpleService.dataCreateArea(session, mainOrderId, commonQuoteVo.getCarInfoVo(), agentFuzzyResult, attributionInformationVo.getConfigInfo().get("agentCode"), agentQueryResult, province);
 
 
-        // # 查询车型
+        // 查询车型
         CarModelinfoQueryResult carModelinfoQueryResult = tkSimpleService.queryCarModel(session, mainOrderId, commonQuoteVo.getCarInfoVo(), tkAreaInfoVo, commonQuoteVo.getOwnersInfo());
         CarModelinfoQueryResult carModelinfoQueryResult = tkSimpleService.queryCarModel(session, mainOrderId, commonQuoteVo.getCarInfoVo(), tkAreaInfoVo, commonQuoteVo.getOwnersInfo());
 
 
-        // 车管所校验接口  todo 暂时不知道是否需要执行 /car/modelinfo/checkVehicleType 接口
+        // 车管所校验
         httpService.carModelinfoCheckVehicleType(session, commonQuoteVo, mainOrderId, carModelinfoQueryResult);
         httpService.carModelinfoCheckVehicleType(session, commonQuoteVo, mainOrderId, carModelinfoQueryResult);
 
 
         // # 创建车险投保单
         // # 创建车险投保单
@@ -150,7 +147,6 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
 
 
         // # 初始化车险投保单,保司返回保单信息(默认选择的交强险,商业险,不推荐的险种内容(有默认选中的),驾乘意外险,泰乐途)
         // # 初始化车险投保单,保司返回保单信息(默认选择的交强险,商业险,不推荐的险种内容(有默认选中的),驾乘意外险,泰乐途)
         PreciseInitResult preciseInitResult = tkSimpleService.orderInit(session, mainOrderId);
         PreciseInitResult preciseInitResult = tkSimpleService.orderInit(session, mainOrderId);
-
         // 初始化失败,则返回
         // 初始化失败,则返回
         QuoteResultsVo quoteResultsVo = tkCrawlerQuoteResultsBuild.buildQuoteFailResultsVo(preciseInitResult);
         QuoteResultsVo quoteResultsVo = tkCrawlerQuoteResultsBuild.buildQuoteFailResultsVo(preciseInitResult);
         if (quoteResultsVo != null) {
         if (quoteResultsVo != null) {
@@ -177,80 +173,63 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
         AttributionInformationVo attributionInformationVo = underwritingVo.getOrder().getAttributionInformationVo();
         AttributionInformationVo attributionInformationVo = underwritingVo.getOrder().getAttributionInformationVo();
         TKLoginSession session = loginSession(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         TKLoginSession session = loginSession(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         PreciseInitResult preciseInitResult = redisCacheUtil.getPreciseInitResult(underwritingVo.getOrder().getOrdersNo());
         PreciseInitResult preciseInitResult = redisCacheUtil.getPreciseInitResult(underwritingVo.getOrder().getOrdersNo());
-
         // 保存报价,保存后不能再修改报价。
         // 保存报价,保存后不能再修改报价。
         tkSimpleService.orderQuoteSave(session, preciseInitResult.getMainOrderId());
         tkSimpleService.orderQuoteSave(session, preciseInitResult.getMainOrderId());
-
         InitProposalResult initProposalResult = tkSimpleService.queryCarOwner(session, preciseInitResult.getMainOrderId());
         InitProposalResult initProposalResult = tkSimpleService.queryCarOwner(session, preciseInitResult.getMainOrderId());
         // 获取车主手机号地址
         // 获取车主手机号地址
         List<InsOrdersCarUserInfo> insOrdersCarUserInfoList = underwritingVo.getInsOrdersCarUserInfoList();
         List<InsOrdersCarUserInfo> insOrdersCarUserInfoList = underwritingVo.getInsOrdersCarUserInfoList();
         InsOrdersCarUserInfo insOrdersCarUserInfo = insOrdersCarUserInfoList.get(0);
         InsOrdersCarUserInfo insOrdersCarUserInfo = insOrdersCarUserInfoList.get(0);
         TKInsureInfo insureInfo = tkSimpleService.dataCreateInsureInfo(initProposalResult, insOrdersCarUserInfo);
         TKInsureInfo insureInfo = tkSimpleService.dataCreateInsureInfo(initProposalResult, insOrdersCarUserInfo);
-        System.out.println("车主信息" + new Gson().toJson(insureInfo));
+        log.info("车主信息:{}", new Gson().toJson(insureInfo));
         // # 车险投保单报价下单
         // # 车险投保单报价下单
         TKEntranceFor000038Result tkEntranceFor000038Result = tkSimpleService.orderSubmit(session, preciseInitResult.getMainOrderId(), insureInfo);
         TKEntranceFor000038Result tkEntranceFor000038Result = tkSimpleService.orderSubmit(session, preciseInitResult.getMainOrderId(), insureInfo);
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         if (tkEntranceFor000038Result != null) {  // 核保通过
         if (tkEntranceFor000038Result != null) {  // 核保通过
-            // 验车标志
-            String checkCarFlag = tkEntranceFor000038Result.getCheckCarFlag();
             TKOrderData tkOrderData = tkEntranceFor000038Result.getData();
             TKOrderData tkOrderData = tkEntranceFor000038Result.getData();
             // 核保成功,保单编号缓存
             // 核保成功,保单编号缓存
             redisCacheUtil.setCache(tkOrderData.getProposalNo(), underwritingVo.getOrder().getOrdersNo(), "HB");
             redisCacheUtil.setCache(tkOrderData.getProposalNo(), underwritingVo.getOrder().getOrdersNo(), "HB");
-            String resultType = tkOrderData.getResultType();
-//
-//        if (checkCarFlag != null && checkCarFlag.equals("1") || !resultType.equals("自核通过")) {
-//            // 需要验车,需要上传影像
-//
-//            // 验车照片详情列表
-//            List<TKOrderCheckCarSpecification> checkCarSpecification = tkEntranceFor000038Result.getCheckCarSpecification();
-//
-//            // 验车原因
-//            Object checkReason = tkEntranceFor000038Result.getCheckReason();
-//            // 不知道是啥原因
-//            List<String> underwriteReason = tkEntranceFor000038Result.getUnderwriteReason();
-//
-//            // 验车码
-//            String checkCarCode = httpService.entranceFor000133(session.getToken(), preciseInitResult.getMainOrderId());
-//
-//            // 上传视频图像的二维码数据示例:https://car.tk.cn/carTKInsure/#/schema?type=checkcar&fullProposalNo=00671070808142500000004429&orderType=1
-//            // 其中 00671070808142500000004429 的商业保险单号
-//
-//
-//        } else {
-//            // 不需要验车
-//
-//        }
 
 
-            // todo 要考虑保存这个数据,包括投保单号、交强险单号、商业险单号、架意险单号
-            // 投保单号
-            String proposalNo = tkOrderData.getProposalNo();
+            // 验车标志
+            // String checkCarFlag = tkEntranceFor000038Result.getCheckCarFlag();
+            // String resultType = tkOrderData.getResultType();
+            // if (checkCarFlag != null && checkCarFlag.equals("1") || !resultType.equals("自核通过")) {
+            //     // 需要验车,需要上传影像
+            //
+            //     // 验车照片详情列表
+            //     List<TKOrderCheckCarSpecification> checkCarSpecification = tkEntranceFor000038Result.getCheckCarSpecification();
+            //
+            //     // 验车原因
+            //     Object checkReason = tkEntranceFor000038Result.getCheckReason();
+            //     // 不知道是啥原因
+            //     List<String> underwriteReason = tkEntranceFor000038Result.getUnderwriteReason();
+            //
+            //     // 验车码
+            //     String checkCarCode = httpService.entranceFor000133(session.getToken(), preciseInitResult.getMainOrderId());
+            //
+            //     // 上传视频图像的二维码数据示例:https://car.tk.cn/carTKInsure/#/schema?type=checkcar&fullProposalNo=00671070808142500000004429&orderType=1
+            //     // 其中 00671070808142500000004429 的商业保险单号
+            //
+            //
+            // } else {
+            //     // 不需要验车
+            //
+            // }
 
 
+            // 保司订单号
+            underwritingResultsVo.setCompanyOrderNo(tkOrderData.getProposalNo());
             // 交强险投保单号
             // 交强险投保单号
-            String proposalNoCI = tkOrderData.getProposalNoCI();
+            underwritingResultsVo.setJqApplyNo(tkOrderData.getProposalNoCI());
             // 商业险投保单号
             // 商业险投保单号
-            String proposalNoBI = tkOrderData.getProposalNoBI();
-            String JYProposalNo = "";
-            TKCarAccident carAccident = tkOrderData.getCarAccident();
-            if (carAccident != null) {
-                // 意架险投保单号
-                JYProposalNo = carAccident.getProposalNo();
-            }
-
-            // 交强险投保单号
-            underwritingResultsVo.setJqApplyNo(proposalNoCI);
-            // 商业投保单号
-            underwritingResultsVo.setSyApplyNo(proposalNoBI);
+            underwritingResultsVo.setSyApplyNo(tkOrderData.getProposalNoBI());
             // 驾意险投保单号
             // 驾意险投保单号
-            underwritingResultsVo.setJyApplyNo(JYProposalNo);
+            underwritingResultsVo.setJyApplyNo(tkOrderData.getCarAccident() != null ? tkOrderData.getCarAccident().getProposalNo() : null);
             // 核保结果
             // 核保结果
             underwritingResultsVo.setUnderwritingResult("核保成功");
             underwritingResultsVo.setUnderwritingResult("核保成功");
             // 核保状态
             // 核保状态
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
-            // 保司订单号
-            underwritingResultsVo.setCompanyOrderNo(proposalNo);
-
             tkCrawlerOrderService.save(underwritingVo, underwritingResultsVo, preciseInitResult.getMainOrderId(), true);
             tkCrawlerOrderService.save(underwritingVo, underwritingResultsVo, preciseInitResult.getMainOrderId(), true);
         } else {
         } else {
+            // 核保失败
             underwritingResultsVo.setUnderwritingResult("核保失败");
             underwritingResultsVo.setUnderwritingResult("核保失败");
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
             tkCrawlerOrderService.save(underwritingVo, underwritingResultsVo, preciseInitResult.getMainOrderId(), false);
             tkCrawlerOrderService.save(underwritingVo, underwritingResultsVo, preciseInitResult.getMainOrderId(), false);

+ 38 - 44
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerQuoteProcessServiceImpl.java

@@ -117,16 +117,28 @@ public class TaiShanCrawlerQuoteProcessServiceImpl implements TaiShanCrawlerQuot
                 TaiShanExternalSendCodeResponse externalResponse = JSON.parseObject(externalResponseBody, TaiShanExternalSendCodeResponse.class);
                 TaiShanExternalSendCodeResponse externalResponse = JSON.parseObject(externalResponseBody, TaiShanExternalSendCodeResponse.class);
                 log.info("externalSendCodeResponse参数的值:{}", JSON.toJSONString(externalResponse));
                 log.info("externalSendCodeResponse参数的值:{}", JSON.toJSONString(externalResponse));
 
 
-                // 从外部响应中获取数据并缓存
-                TaiShanExternalSendCodeResponse.DataDTO externalData = externalResponse.getData();
-                Map<String, Object> tokenMap = new HashMap<>();
-                tokenMap.put("token", externalData.getToken());
-                tokenMap.put("secretKey", externalData.getSecretKey());
-                tokenMap.put("pointJson", externalData.getPointJson());
-                log.info("TaiShan-tokenMap参数的值(从外部接口获取):{}", JSON.toJSONString(tokenMap));
-                taiShanCrawlerCacheComponent.cacheToken(username, tokenMap);
-
-                getCaptchaResponse.setIdentifyId(externalData.getToken());
+                if(externalResponse != null){
+                    if (externalResponse.getCode() != null && externalResponse.getCode().equals(200)) {
+                        TaiShanExternalSendCodeResponse.DataDTO externalData = externalResponse.getData();
+                        if (externalData != null && StringUtils.isNotBlank(externalData.getToken())) {
+                            Map<String, Object> tokenMap = new HashMap<>();
+                            tokenMap.put("token", externalData.getToken());
+                            tokenMap.put("secretKey", externalData.getSecretKey());
+                            tokenMap.put("pointJson", externalData.getPointJson());
+                            log.info("TaiShan-tokenMap参数的值(从外部接口获取):{}", JSON.toJSONString(tokenMap));
+                            taiShanCrawlerCacheComponent.cacheToken(username, tokenMap);
+
+                            getCaptchaResponse.setIdentifyId(externalData.getToken());
+                        } else {
+                            log.warn("外部发送验证码接口响应数据为空或token缺失");
+                        }
+                    } else {
+                        log.warn("外部发送验证码接口调用失败,code={}, message={}",
+                                externalResponse.getCode(), externalResponse.getMessage());
+                    }
+                } else {
+                    log.warn("外部发送验证码接口返回空响应");
+                }
             }
             }
         }
         }
 
 
@@ -152,14 +164,24 @@ public class TaiShanCrawlerQuoteProcessServiceImpl implements TaiShanCrawlerQuot
         TaiShanExternalSendCodeResponse externalResponse = JSON.parseObject(externalResponseBody, TaiShanExternalSendCodeResponse.class);
         TaiShanExternalSendCodeResponse externalResponse = JSON.parseObject(externalResponseBody, TaiShanExternalSendCodeResponse.class);
         log.info("externalSendCodeResponse参数的值:{}", JSON.toJSONString(externalResponse));
         log.info("externalSendCodeResponse参数的值:{}", JSON.toJSONString(externalResponse));
 
 
-//        if (externalResponse == null || externalResponse.getCode() != 200) {
-//            String message = externalResponse != null ? externalResponse.getMessage() : "未知错误";
-//            log.warn("外部发送验证码接口调用失败,错误信息:{}", message);
-//            throw new RuntimeException("外部发送验证码失败:" + message);
-//        }
+        if (externalResponse == null) {
+            log.warn("外部发送验证码接口返回空响应");
+            throw new RuntimeException("外部发送验证码失败:响应为空");
+        }
+
+        if (externalResponse.getCode() == null || !externalResponse.getCode().equals("200")) {
+            String message = externalResponse.getMessage() != null ? externalResponse.getMessage() : "未知错误";
+            log.warn("外部发送验证码接口调用失败,错误信息:{}", message);
+            throw new RuntimeException("外部发送验证码失败:" + message);
+        }
 
 
-        // 从外部响应中获取数据并缓存
         TaiShanExternalSendCodeResponse.DataDTO externalData = externalResponse.getData();
         TaiShanExternalSendCodeResponse.DataDTO externalData = externalResponse.getData();
+        if (externalData == null) {
+            log.warn("外部发送验证码接口响应数据为空");
+            throw new RuntimeException("外部发送验证码失败:响应数据为空");
+        }
+
+        // 从外部响应中获取数据并缓存
         Map<String, Object> tokenMap = new HashMap<>();
         Map<String, Object> tokenMap = new HashMap<>();
         tokenMap.put("token", externalData.getToken());
         tokenMap.put("token", externalData.getToken());
         tokenMap.put("secretKey", externalData.getSecretKey());
         tokenMap.put("secretKey", externalData.getSecretKey());
@@ -203,34 +225,6 @@ public class TaiShanCrawlerQuoteProcessServiceImpl implements TaiShanCrawlerQuot
             token = (String) tokenMap.get("token");
             token = (String) tokenMap.get("token");
         }
         }
         return StringUtils.hasText(token);
         return StringUtils.hasText(token);
-
-
-//        log.info("TaiShan-detectLoginRequest参数的值:{}", JSON.toJSONString(detectLoginRequest));
-//        String username = detectLoginRequest.getUsername();
-//        String password = detectLoginRequest.getPassword();
-//        LoginBase loginBase = new LoginBase();
-//        loginBase.setUsername(username);
-//        loginBase.setPassword(password);
-//        log.info("TaiShan-loginBase参数的值:{}", JSON.toJSONString(loginBase));
-//
-//        HttpHeaders httpHeaders = new HttpHeaders();
-//        getVerifyHeader(httpHeaders);
-//
-//        sendCode(username, password);
-//
-//        Map<String, Object> tokenMap = taiShanCrawlerCacheComponent.getToken(username);
-//        log.info("TaiShan-tokenMap参数的值:{}", JSON.toJSONString(tokenMap));
-
-
-//        TaiShanCrawlerLoginRequest loginRequest = new TaiShanCrawlerLoginRequest(loginBase,tokenMap);
-//        TaiShanCrawlerLoginResponse loginResponse = taiShanCrawlerRequestComponent.login(loginRequest, httpHeaders);
-//        log.info("TaiShan-loginResponse参数的值:{}", JSON.toJSONString(loginResponse));
-//        if(loginResponse.getCode().equals("200")){
-//            String authorization = loginResponse.getResult().getIdToken();
-//            //缓存登录的信息
-//            taiShanCrawlerCacheComponent.cacheAuthorization(loginBase.getUsername(), authorization);
-//        }
-//        return true;
     }
     }
 
 
 
 

+ 37 - 8
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/build/ZhongAnCrawlerQuoteResultsVoBuild.java

@@ -13,6 +13,7 @@ import com.jzg.quotation.commons.constant.enums.quote.RenewalEnum;
 import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerQuoteResponse;
 import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerQuoteResponse;
 import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerUploadInitDateResponse;
 import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerUploadInitDateResponse;
 
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -93,21 +94,49 @@ public class ZhongAnCrawlerQuoteResultsVoBuild {
         quoteResultsVo.getCosts().setBiPremium(String.valueOf(vehiclePremium.getBizTotalPremium()));
         quoteResultsVo.getCosts().setBiPremium(String.valueOf(vehiclePremium.getBizTotalPremium()));
         // 设置非车险(驾意险)保费,报价返回数据中不存在
         // 设置非车险(驾意险)保费,报价返回数据中不存在
         quoteResultsVo.getCosts().setNiPremium(String.valueOf(vehiclePremium.getNonTotalPremium()));
         quoteResultsVo.getCosts().setNiPremium(String.valueOf(vehiclePremium.getNonTotalPremium()));
+        // 总保费
+        BigDecimal jqPremium = BigDecimal.valueOf(vehiclePremium.getCompelPremium());
+        BigDecimal syPremium = BigDecimal.valueOf(vehiclePremium.getBizTotalPremium());
+        BigDecimal vvTaxPremium = BigDecimal.valueOf(vehiclePremium.getTaxPremium());
+        BigDecimal niPremium = BigDecimal.valueOf(vehiclePremium.getNonTotalPremium());
+        quoteResultsVo.getCosts().setSumPremium(String.valueOf(jqPremium.add(syPremium).add(vvTaxPremium).add(niPremium)));
     }
     }
 
 
     public static QuoteResultsVo.ScoreVo buildScoreVo(ZhongAnCrawlerQuoteResponse.ValueDTO.DataDTO dataDTO) {
     public static QuoteResultsVo.ScoreVo buildScoreVo(ZhongAnCrawlerQuoteResponse.ValueDTO.DataDTO dataDTO) {
         QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
         QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
         scoreVo.setJqAdjustRate(dataDTO.getCompelDiscount());
         scoreVo.setJqAdjustRate(dataDTO.getCompelDiscount());
         scoreVo.setSyAdjustRate(dataDTO.getBusinessDiscount());
         scoreVo.setSyAdjustRate(dataDTO.getBusinessDiscount());
-        switch (dataDTO.getForceRenewalFlag()) {
-            case "PA": scoreVo.setJqRenewal(String.valueOf(RenewalEnum.Transfer.getCode()));
-            case "ZA": scoreVo.setJqRenewal(String.valueOf(RenewalEnum.Renewal.getCode()));
-            default: scoreVo.setJqRenewal(String.valueOf(RenewalEnum.New.getCode()));
+        String forceRenewalFlag = dataDTO.getForceRenewalFlag();
+        String bizRenewalFlag = dataDTO.getBizRenewalFlag();
+        if (forceRenewalFlag == null) {
+            scoreVo.setJqRenewal(String.valueOf(RenewalEnum.Transfer.getCode()));
+        } else {
+            switch (forceRenewalFlag) {
+                case "PA":
+                    scoreVo.setJqRenewal(String.valueOf(RenewalEnum.Transfer.getCode()));
+                    break;
+                case "ZA":
+                    scoreVo.setJqRenewal(String.valueOf(RenewalEnum.Renewal.getCode()));
+                    break;
+                default:
+                    scoreVo.setJqRenewal(String.valueOf(RenewalEnum.New.getCode()));
+                    break;
+            }
         }
         }
-        switch (dataDTO.getBizRenewalFlag()) {
-            case "PA": scoreVo.setSyRenewal(String.valueOf(RenewalEnum.Transfer.getCode()));
-            case "ZA": scoreVo.setSyRenewal(String.valueOf(RenewalEnum.Renewal.getCode()));
-            default: scoreVo.setSyRenewal(String.valueOf(RenewalEnum.New.getCode()));
+        if (bizRenewalFlag == null) {
+            scoreVo.setSyRenewal(String.valueOf(RenewalEnum.Transfer.getCode()));
+        } else {
+            switch (bizRenewalFlag) {
+                case "PA":
+                    scoreVo.setSyRenewal(String.valueOf(RenewalEnum.Transfer.getCode()));
+                    break;
+                case "ZA":
+                    scoreVo.setSyRenewal(String.valueOf(RenewalEnum.Renewal.getCode()));
+                    break;
+                default:
+                    scoreVo.setSyRenewal(String.valueOf(RenewalEnum.New.getCode()));
+                    break;
+            }
         }
         }
         JSONArray scoreJson = new JSONArray();
         JSONArray scoreJson = new JSONArray();
         scoreJson.add(new JSONObject()
         scoreJson.add(new JSONObject()

+ 22 - 20
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteRequestBuild.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.jzg.commons.constants.quote.enums.quote.EnergyTypeCode;
 import com.jzg.commons.constants.quote.enums.quote.EnergyTypeCode;
 import com.jzg.commons.constants.quote.enums.quote.LicenseKindCode;
 import com.jzg.commons.constants.quote.enums.quote.LicenseKindCode;
 import com.jzg.commons.entity.quote.vo.*;
 import com.jzg.commons.entity.quote.vo.*;
+import com.jzg.commons.util.IDCardUtils;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.zijin.api.constant.enums.MotorVehicleInsuranceEnum;
 import com.jzg.quotation.zijin.api.constant.enums.MotorVehicleInsuranceEnum;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
@@ -53,23 +54,19 @@ public class ZiJinCrawlerQuoteRequestBuild {
      * @return 报价请求对象
      * @return 报价请求对象
      */
      */
     public ZiJinCrawlerQuotationRequest buildZiJinCrawlerQuotationRequest(QuoteVo quoteVo, ZiJinCrawlerConfigureParameters parameters, AttributionInformationVo attributionInformationVo, ZiJinCrawlerGetOrderNoResponse ziJinCrawlerGetOrderNoResponse, HttpHeaders headers, ZiJinCrawlerGetCarActualValueResponse ziJinCrawlerGetCarActualValueResponse, ZiJinCrawlerGetOrderNoRequest ziJinCrawlerGetOrderNoRequest, ZiJinCrawlerCarResponse ziJinCrawlerCarResponse) {
     public ZiJinCrawlerQuotationRequest buildZiJinCrawlerQuotationRequest(QuoteVo quoteVo, ZiJinCrawlerConfigureParameters parameters, AttributionInformationVo attributionInformationVo, ZiJinCrawlerGetOrderNoResponse ziJinCrawlerGetOrderNoResponse, HttpHeaders headers, ZiJinCrawlerGetCarActualValueResponse ziJinCrawlerGetCarActualValueResponse, ZiJinCrawlerGetOrderNoRequest ziJinCrawlerGetOrderNoRequest, ZiJinCrawlerCarResponse ziJinCrawlerCarResponse) {
-        // 报价接口
         ZiJinCrawlerQuotationRequest ziJinCrawlerQuotationRequest = new ZiJinCrawlerQuotationRequest();
         ZiJinCrawlerQuotationRequest ziJinCrawlerQuotationRequest = new ZiJinCrawlerQuotationRequest();
         // 设置基础信息
         // 设置基础信息
         ziJinCrawlerQuotationRequest.setBaseInfo(buildBaseInfo(quoteVo, parameters, attributionInformationVo.getUsername()));
         ziJinCrawlerQuotationRequest.setBaseInfo(buildBaseInfo(quoteVo, parameters, attributionInformationVo.getUsername()));
-
         // 设置车主信息
         // 设置车主信息
         ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo = buildCarOwnerInfo(quoteVo);
         ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo = buildCarOwnerInfo(quoteVo);
         ziJinCrawlerQuotationRequest.setCarOwnerInfo(carOwnerInfo);
         ziJinCrawlerQuotationRequest.setCarOwnerInfo(carOwnerInfo);
 
 
-        // 设置保险标志(固定"0")
-        ziJinCrawlerQuotationRequest.setInsuranceSign("0");
-
         // 设置被保险人列表
         // 设置被保险人列表
         ziJinCrawlerQuotationRequest.setInsuredList(buildInsuredList(quoteVo, carOwnerInfo));
         ziJinCrawlerQuotationRequest.setInsuredList(buildInsuredList(quoteVo, carOwnerInfo));
-
         // 设置订单ID - 从getOrderNo接口返回的动态获取
         // 设置订单ID - 从getOrderNo接口返回的动态获取
         ziJinCrawlerQuotationRequest.setOrderId(ziJinCrawlerGetOrderNoResponse.getOrderId());
         ziJinCrawlerQuotationRequest.setOrderId(ziJinCrawlerGetOrderNoResponse.getOrderId());
+        // 设置保险标志(固定"0")
+        ziJinCrawlerQuotationRequest.setInsuranceSign("0");
         // 设置订单来源(固定"KSCD_PROD")
         // 设置订单来源(固定"KSCD_PROD")
         ziJinCrawlerQuotationRequest.setOrderOrigin("KSCD_PROD");
         ziJinCrawlerQuotationRequest.setOrderOrigin("KSCD_PROD");
         // 设置需求单校验标志(固定"1")
         // 设置需求单校验标志(固定"1")
@@ -231,6 +228,7 @@ public class ZiJinCrawlerQuoteRequestBuild {
      *
      *
      * @return ZiJinCrawlerQuotationRequest.BaseInfo
      * @return ZiJinCrawlerQuotationRequest.BaseInfo
      */
      */
+    @NotNull
     private ZiJinCrawlerQuotationRequest.BaseInfo buildBaseInfo(QuoteVo quoteVo, ZiJinCrawlerConfigureParameters parameters, String operatorCode) {
     private ZiJinCrawlerQuotationRequest.BaseInfo buildBaseInfo(QuoteVo quoteVo, ZiJinCrawlerConfigureParameters parameters, String operatorCode) {
         ZiJinCrawlerQuotationRequest.BaseInfo baseInfo = new ZiJinCrawlerQuotationRequest.BaseInfo();
         ZiJinCrawlerQuotationRequest.BaseInfo baseInfo = new ZiJinCrawlerQuotationRequest.BaseInfo();
         baseInfo.setAgentCode(parameters.getAgentCode());
         baseInfo.setAgentCode(parameters.getAgentCode());
@@ -241,27 +239,31 @@ public class ZiJinCrawlerQuoteRequestBuild {
         baseInfo.setHandler1Code(parameters.getUserCode());
         baseInfo.setHandler1Code(parameters.getUserCode());
         baseInfo.setHandler1Name(parameters.getUserName());
         baseInfo.setHandler1Name(parameters.getUserName());
         baseInfo.setOperatorCode(operatorCode);
         baseInfo.setOperatorCode(operatorCode);
-        baseInfo.setStartDate(quoteVo.getCiRiskInfoVo().getStartDate().substring(0, 10));
+        // 交强险日期
         baseInfo.setStartDateCI(quoteVo.getCiRiskInfoVo().getStartDate().substring(0, 10));
         baseInfo.setStartDateCI(quoteVo.getCiRiskInfoVo().getStartDate().substring(0, 10));
-        baseInfo.setStartHour("00");
         baseInfo.setStartHourCI("00");
         baseInfo.setStartHourCI("00");
-        baseInfo.setStartMinute("00");
         baseInfo.setStartMinuteCI("00");
         baseInfo.setStartMinuteCI("00");
-        baseInfo.setEndDate(quoteVo.getCiRiskInfoVo().getEndDate().substring(0, 10));
         baseInfo.setEndDateCI(quoteVo.getCiRiskInfoVo().getEndDate().substring(0, 10));
         baseInfo.setEndDateCI(quoteVo.getCiRiskInfoVo().getEndDate().substring(0, 10));
-        baseInfo.setEndHour("24");
         baseInfo.setEndHourCI("24");
         baseInfo.setEndHourCI("24");
-        baseInfo.setEndMinute("00");
         baseInfo.setEndMinuteCI("00");
         baseInfo.setEndMinuteCI("00");
+        // 商业险日期
+        if (quoteVo.getBiRiskInfoVo() != null) {
+            baseInfo.setStartDate(quoteVo.getBiRiskInfoVo().getStartDate().substring(0, 10));
+            baseInfo.setStartHour("00");
+            baseInfo.setStartMinute("00");
+            baseInfo.setEndDate(quoteVo.getBiRiskInfoVo().getEndDate().substring(0, 10));
+            baseInfo.setEndHour("24");
+            baseInfo.setEndMinute("00");
+        }
         // 经测试:燃油单强设为0,交三不设置(待确认),会返回转保标志,紫金系统可以忽略进行下一步报价
         // 经测试:燃油单强设为0,交三不设置(待确认),会返回转保标志,紫金系统可以忽略进行下一步报价
         baseInfo.setXbFlag(quoteVo.getBiRiskInfoVo() == null ? "0" : null);
         baseInfo.setXbFlag(quoteVo.getBiRiskInfoVo() == null ? "0" : null);
         baseInfo.setXbFlagCI(quoteVo.getBiRiskInfoVo() == null ? "0" : null);
         baseInfo.setXbFlagCI(quoteVo.getBiRiskInfoVo() == null ? "0" : null);
         baseInfo.setGoalInsuredFlag("0");
         baseInfo.setGoalInsuredFlag("0");
-        baseInfo.setConfigName("");
-        baseInfo.setId("1dec8ac2ced74973842a5b098669813a");
         baseInfo.setBusinessName(parameters.getBusinessNatureName());
         baseInfo.setBusinessName(parameters.getBusinessNatureName());
+        baseInfo.setId("1dec8ac2ced74973842a5b098669813a");
         baseInfo.setIdMongo("1dec8ac2ced74973842a5b098669813a");
         baseInfo.setIdMongo("1dec8ac2ced74973842a5b098669813a");
-        baseInfo.setDesc("");
+        baseInfo.setConfigName(parameters.getUserName());
+        baseInfo.setDesc(parameters.getUserName());
         baseInfo.setHanderCode(parameters.getUserCode());
         baseInfo.setHanderCode(parameters.getUserCode());
         baseInfo.setHanderName(parameters.getUserName());
         baseInfo.setHanderName(parameters.getUserName());
         baseInfo.setDemandNo("01ZKIC140026051910017933666448");
         baseInfo.setDemandNo("01ZKIC140026051910017933666448");
@@ -389,9 +391,8 @@ public class ZiJinCrawlerQuoteRequestBuild {
             insuredItem.setIdentifyType("01");// 01-身份证
             insuredItem.setIdentifyType("01");// 01-身份证
         }
         }
 
 
-        // 性别映射
-        String gender = customerInfo.getGender();
-        insuredItem.setSex("男".equals(gender) ? "1" : "2");
+        // 性别
+        insuredItem.setSex(IDCardUtils.getSex(customerInfo.getIdentifyNumber()));
 
 
         // 根据车主性质设置投保人/被保人类型
         // 根据车主性质设置投保人/被保人类型
         // 个人车主("1"): 投保人/被保人都是自然人
         // 个人车主("1"): 投保人/被保人都是自然人
@@ -480,10 +481,11 @@ public class ZiJinCrawlerQuoteRequestBuild {
             carPolicySubInfo.setPlanName(accidentalDriving.getProductName());
             carPolicySubInfo.setPlanName(accidentalDriving.getProductName());
             carPolicySubInfo.setRiskCode(accidentalDriving.getRiskCode());
             carPolicySubInfo.setRiskCode(accidentalDriving.getRiskCode());
             carPolicySubInfo.setRiskName(accidentalDriving.getProductName());
             carPolicySubInfo.setRiskName(accidentalDriving.getProductName());
-            carPolicySubInfo.setSumAmount(ObjectUtils.isEmpty(accidentalDriving.getSumAmount()) ? 0 : (int) Double.parseDouble(accidentalDriving.getSumAmount()));
+            carPolicySubInfo.setSumAmount(ObjectUtils.isEmpty(accidentalDriving.getSumAmount()) ? 0 : (int) Double.parseDouble(accidentalDriving.getSumAmount()));// 空值,前端没传
             carPolicySubInfo.setQuantity(accidentalDriving.getQuantity() == 0 ? "0" : String.valueOf(accidentalDriving.getQuantity()));
             carPolicySubInfo.setQuantity(accidentalDriving.getQuantity() == 0 ? "0" : String.valueOf(accidentalDriving.getQuantity()));
             carPolicySubInfo.setIsUseInsured("1");
             carPolicySubInfo.setIsUseInsured("1");
             carPolicySubInfo.setSumPremium(ObjectUtils.isEmpty(accidentalDriving.getPremium()) ? 0 : (int) Double.parseDouble(accidentalDriving.getPremium()));
             carPolicySubInfo.setSumPremium(ObjectUtils.isEmpty(accidentalDriving.getPremium()) ? 0 : (int) Double.parseDouble(accidentalDriving.getPremium()));
+            carPolicySubInfo.setActualPremium(accidentalDriving.getPremium());
             carPolicySubInfoList.add(carPolicySubInfo);
             carPolicySubInfoList.add(carPolicySubInfo);
         }
         }
         return carPolicySubInfoList;
         return carPolicySubInfoList;
@@ -652,7 +654,7 @@ public class ZiJinCrawlerQuoteRequestBuild {
         vehicleInfo.setPlatVehicleCode(iacVehicleCode);
         vehicleInfo.setPlatVehicleCode(iacVehicleCode);
 
 
         // 车型唯一ID
         // 车型唯一ID
-        vehicleInfo.setVehicleStyleUniqueId("");
+        vehicleInfo.setVehicleStyleUniqueId(null);
 
 
         // 价格和商业信息
         // 价格和商业信息
         vehicleInfo.setPurchasePrice(carInfoVo.getPurchasePrice());
         vehicleInfo.setPurchasePrice(carInfoVo.getPurchasePrice());

+ 7 - 36
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteResultsVoBuild.java

@@ -212,7 +212,7 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
         }
         }
 
 
         // 设置非车险(驾意险)保费
         // 设置非车险(驾意险)保费
-        if (quotationResponse.getCarPolicySubInfoList() != null && !quotationResponse.getCarPolicySubInfoList().isEmpty()) {
+        if (CollectionUtils.isNotEmpty(quotationResponse.getCarPolicySubInfoList())) {
             ZiJinCrawlerQuotationResponse.CarPolicySubInfoList carPolicySubInfoList = quotationResponse.getCarPolicySubInfoList().get(0);
             ZiJinCrawlerQuotationResponse.CarPolicySubInfoList carPolicySubInfoList = quotationResponse.getCarPolicySubInfoList().get(0);
             if (carPolicySubInfoList != null && carPolicySubInfoList.getActualPremium() != null) {
             if (carPolicySubInfoList != null && carPolicySubInfoList.getActualPremium() != null) {
                 quoteResultsVo.getCosts().setNiPremium(carPolicySubInfoList.getActualPremium());
                 quoteResultsVo.getCosts().setNiPremium(carPolicySubInfoList.getActualPremium());
@@ -229,41 +229,12 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
      * @param quoteResultsVo
      * @param quoteResultsVo
      */
      */
     private static void calculateSumPremium(QuoteResultsVo quoteResultsVo) {
     private static void calculateSumPremium(QuoteResultsVo quoteResultsVo) {
-        double sumPremium = 0.0;
-
-        if (quoteResultsVo.getCosts().getCiPremium() != null) {
-            try {
-                sumPremium += Double.parseDouble(quoteResultsVo.getCosts().getCiPremium());
-            } catch (NumberFormatException e) {
-                log.warn("交强险保费解析失败: {}", quoteResultsVo.getCosts().getCiPremium());
-            }
-        }
-
-        if (quoteResultsVo.getCosts().getBiPremium() != null) {
-            try {
-                sumPremium += Double.parseDouble(quoteResultsVo.getCosts().getBiPremium());
-            } catch (NumberFormatException e) {
-                log.warn("商业险保费解析失败: {}", quoteResultsVo.getCosts().getBiPremium());
-            }
-        }
-
-        if (quoteResultsVo.getCosts().getVvTax() != null) {
-            try {
-                sumPremium += Double.parseDouble(quoteResultsVo.getCosts().getVvTax());
-            } catch (NumberFormatException e) {
-                log.warn("车船税解析失败: {}", quoteResultsVo.getCosts().getVvTax());
-            }
-        }
-
-        if (quoteResultsVo.getCosts().getNiPremium() != null) {
-            try {
-                sumPremium += Double.parseDouble(quoteResultsVo.getCosts().getNiPremium());
-            } catch (NumberFormatException e) {
-                log.warn("非车险保费解析失败: {}", quoteResultsVo.getCosts().getNiPremium());
-            }
-        }
-
-        quoteResultsVo.getCosts().setSumPremium(String.valueOf(sumPremium));
+        BigDecimal ci = quoteResultsVo.getCosts().getCiPremium() == null ? BigDecimal.ZERO : new BigDecimal(quoteResultsVo.getCosts().getCiPremium());
+        BigDecimal bi = quoteResultsVo.getCosts().getBiPremium() == null ? BigDecimal.ZERO : new BigDecimal(quoteResultsVo.getCosts().getBiPremium());
+        BigDecimal vv = quoteResultsVo.getCosts().getVvTax() == null ? BigDecimal.ZERO : new BigDecimal(quoteResultsVo.getCosts().getVvTax());
+        BigDecimal jyx = quoteResultsVo.getCosts().getNiPremium() == null ? BigDecimal.ZERO : new BigDecimal(quoteResultsVo.getCosts().getNiPremium());
+        BigDecimal total = ci.add(bi).add(vv).add(jyx);
+        quoteResultsVo.getCosts().setSumPremium(total.toPlainString());
     }
     }
 
 
     /**
     /**

+ 9 - 9
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerSaveQuoteInfoRequestBuild.java

@@ -1,7 +1,9 @@
 package com.jzg.quotation.zijin.crawler.build;
 package com.jzg.quotation.zijin.crawler.build;
 
 
+import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.util.IDCardUtils;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
 import com.jzg.quotation.zijin.crawler.component.ZiJinCrawlerCacheComponent;
 import com.jzg.quotation.zijin.crawler.component.ZiJinCrawlerCacheComponent;
 import com.jzg.quotation.zijin.crawler.entity.request.ZiJinCrawlerQuotationRequest;
 import com.jzg.quotation.zijin.crawler.entity.request.ZiJinCrawlerQuotationRequest;
@@ -185,7 +187,6 @@ public class ZiJinCrawlerSaveQuoteInfoRequestBuild {
                 .certificateDate(carInfo.getCertificateDate() != null ? carInfo.getCertificateDate() : "")
                 .certificateDate(carInfo.getCertificateDate() != null ? carInfo.getCertificateDate() : "")
                 .chgOwnerFlag(carInfo.getChgOwnerFlag())
                 .chgOwnerFlag(carInfo.getChgOwnerFlag())
                 .colorCode(carInfo.getColorCode())
                 .colorCode(carInfo.getColorCode())
-                // .completekerbmass(carInfo.getCompletekerbmass() != null ? Integer.parseInt(carInfo.getCompletekerbmass()) : 0)
                 .completekerbmass(carInfo.getCompletekerbmass())
                 .completekerbmass(carInfo.getCompletekerbmass())
                 .ecdemicVehicleFlag(carInfo.getEcdemicVehicleFlag() != null ? carInfo.getEcdemicVehicleFlag() : "0")
                 .ecdemicVehicleFlag(carInfo.getEcdemicVehicleFlag() != null ? carInfo.getEcdemicVehicleFlag() : "0")
                 .engineNo(carInfo.getEngineNo() != null ? carInfo.getEngineNo() : "")
                 .engineNo(carInfo.getEngineNo() != null ? carInfo.getEngineNo() : "")
@@ -207,12 +208,11 @@ public class ZiJinCrawlerSaveQuoteInfoRequestBuild {
                 .power(carInfo.getPower() != null ? carInfo.getPower() : "0")
                 .power(carInfo.getPower() != null ? carInfo.getPower() : "0")
                 .printUseNatureCode("")
                 .printUseNatureCode("")
                 .purchasePrice(carInfo.getPurchasePrice() != null ? carInfo.getPurchasePrice() : "0")
                 .purchasePrice(carInfo.getPurchasePrice() != null ? carInfo.getPurchasePrice() : "0")
-                // .seatCount(carInfo.getSeatCount() != null ? Integer.parseInt(carInfo.getSeatCount()) : 5)
                 .seatCount(carInfo.getSeatCount())
                 .seatCount(carInfo.getSeatCount())
                 .useNatureCode(carInfo.getUseNatureCode())
                 .useNatureCode(carInfo.getUseNatureCode())
                 .vehicleId(carInfo.getVehicleId())
                 .vehicleId(carInfo.getVehicleId())
-                .makeDate(carInfo.getMakeDate() != null ? carInfo.getMakeDate() : "")
-                .makeDateJQ(carInfo.getMakeDateJQ() != null ? carInfo.getMakeDateJQ() : "")
+                .makeDate(carInfo.getMakeDate())
+                .makeDateJQ(carInfo.getMakeDateJQ())
                 .aliasName(carInfo.getAliasName() != null ? carInfo.getAliasName() : "")
                 .aliasName(carInfo.getAliasName() != null ? carInfo.getAliasName() : "")
                 .carCheckStatus("2")
                 .carCheckStatus("2")
                 .carCheckReason("2")
                 .carCheckReason("2")
@@ -220,7 +220,7 @@ public class ZiJinCrawlerSaveQuoteInfoRequestBuild {
                 .oriBrandName(carInfo.getOriBrandName() != null ? carInfo.getOriBrandName() : "")
                 .oriBrandName(carInfo.getOriBrandName() != null ? carInfo.getOriBrandName() : "")
                 .oriPurchasePrice(carInfo.getOriPurchasePrice() != null ? carInfo.getOriPurchasePrice() : "0")
                 .oriPurchasePrice(carInfo.getOriPurchasePrice() != null ? carInfo.getOriPurchasePrice() : "0")
                 .isInvokeJingYou(carInfo.getIsInvokeJingYou())
                 .isInvokeJingYou(carInfo.getIsInvokeJingYou())
-                .vehicleStyleUniqueId(carInfo.getVehicleStyleUniqueId() != null ? carInfo.getVehicleStyleUniqueId() : "")
+                .vehicleStyleUniqueId(CollectionUtils.isNotEmpty(ziJinCrawlerQuotationResponse.getCarInfoList()) ? ziJinCrawlerQuotationResponse.getCarInfoList().get(0).getVehicleStyleUniqueId() : "")
                 .printModelName(carInfo.getPrintModelName() != null ? carInfo.getPrintModelName() : "")
                 .printModelName(carInfo.getPrintModelName() != null ? carInfo.getPrintModelName() : "")
                 .oriModelName(carInfo.getOriModelName() != null ? carInfo.getOriModelName() : "")
                 .oriModelName(carInfo.getOriModelName() != null ? carInfo.getOriModelName() : "")
                 .vINNo(carInfo.getVinNo() != null ? carInfo.getVinNo() : "")
                 .vINNo(carInfo.getVinNo() != null ? carInfo.getVinNo() : "")
@@ -359,12 +359,12 @@ public class ZiJinCrawlerSaveQuoteInfoRequestBuild {
                         .insuredType(insured.getInsuredType() != null ? insured.getInsuredType() : "1")
                         .insuredType(insured.getInsuredType() != null ? insured.getInsuredType() : "1")
                         .longAddress(insured.getInsuredFlag() == 2 ? addr : addr1)
                         .longAddress(insured.getInsuredFlag() == 2 ? addr : addr1)
                         .mobile(insured.getMobile())
                         .mobile(insured.getMobile())
-                        .sex("2") // 默认值,从request中无法获取性别
+                        .sex(IDCardUtils.getSex(insured.getIdentifyNumber()))
                         .nationality("中国")
                         .nationality("中国")
                         .occupation("A1301002")
                         .occupation("A1301002")
-                        .addressProvince("")
-                        .addressPrefecture("")
-                        .addressCounty("")
+                        .addressProvince(null)
+                        .addressPrefecture(null)
+                        .addressCounty(null)
                         .postCode(insured.getPostCode() != null ? insured.getPostCode() : "030053")
                         .postCode(insured.getPostCode() != null ? insured.getPostCode() : "030053")
                         .insuredRelationship("1")
                         .insuredRelationship("1")
                         .validDate(insured.getInsuredFlag() == 2 ? identifyValidEndDate : identifyValidEndDate1)
                         .validDate(insured.getInsuredFlag() == 2 ? identifyValidEndDate : identifyValidEndDate1)

+ 7 - 22
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinBuildingAttributionInformation.java

@@ -1,14 +1,11 @@
 package com.jzg.quotation.zijin.crawler.component;
 package com.jzg.quotation.zijin.crawler.component;
 
 
+import com.alibaba.fastjson.JSON;
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
+import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.zijin.crawler.entity.ZiJinCrawlerConfigureParameters;
 import com.jzg.quotation.zijin.crawler.entity.ZiJinCrawlerConfigureParameters;
-import com.jzg.quotation.zijin.crawler.entity.request.ZiJinCrawlerCompaniesRequest;
-import com.jzg.quotation.zijin.crawler.entity.request.quote.ProposalInfoDTO;
-import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerChannelPackagesResponse;
-import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerCompaniesResponse;
-import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerGetSaleInfoResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 /**
 /**
@@ -23,22 +20,10 @@ public class ZiJinBuildingAttributionInformation {
 
 
     private final ZiJinCrawlerRequestComponent boHaiCrawlerRequestComponent;
     private final ZiJinCrawlerRequestComponent boHaiCrawlerRequestComponent;
 
 
-    public ProposalInfoDTO build(ZiJinCrawlerConfigureParameters parameters, String operatorCode, HttpHeaders headers) {
-        /*try {
-            // 机构查询
-            ZiJinCrawlerCompaniesRequest boHaiCrawlerCompaniesRequest = new ZiJinCrawlerCompaniesRequest(parameters.getCDptCde(), parameters.getLoginCompany(), operatorCode);
-            ZiJinCrawlerCompaniesResponse.ListDTO companies = boHaiCrawlerRequestComponent.companies(boHaiCrawlerCompaniesRequest, parameters.getCDptCde(), headers);
-            // 获取渠道信息
-            ZiJinCrawlerGetSaleInfoResponse saleInfo = boHaiCrawlerRequestComponent.getSaleInfo(operatorCode, headers);
-            // 渠道套餐查询
-            ZiJinCrawlerChannelPackagesRequest boHaiCrawlerChannelPackagesRequest = new ZiJinCrawlerChannelPackagesRequest(parameters, operatorCode);
-            ZiJinCrawlerChannelPackagesResponse boHaiCrawlerChannelPackagesResponse = boHaiCrawlerRequestComponent.channelPackages(boHaiCrawlerChannelPackagesRequest, parameters.getChannelPackages(), headers);
-            return new ProposalInfoDTO(companies, boHaiCrawlerChannelPackagesResponse, saleInfo, parameters.getLoginCompany());
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw new RuntimeException(e);
-        }*/
-        return null;
+    public ZiJinCrawlerConfigureParameters getZiJinCrawlerConfigureParameters(AttributionInformationVo attributionInformationVo) {
+        ZiJinCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZiJinCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        log.info("紫金爬虫归属配置信息:{}", JSON.toJSONString(parameters));
+        return parameters;
     }
     }
 
 
 }
 }

+ 10 - 9
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerCacheComponent.java

@@ -19,7 +19,6 @@ import java.time.Duration;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
 
 
 /**
 /**
  * @description: 渤海财险爬虫缓存组件实现
  * @description: 渤海财险爬虫缓存组件实现
@@ -40,7 +39,7 @@ public class ZiJinCrawlerCacheComponent {
     // 紫金财险授权
     // 紫金财险授权
     public static final String ZIJIN_AUTHORIZATION = "zijin:authorization:";
     public static final String ZIJIN_AUTHORIZATION = "zijin:authorization:";
 
 
-    //渤海财险授权保存时间
+    // 紫金财险授权保存时间
     public static final int ZIJIN_AUTHORIZATION_TIME = 6;
     public static final int ZIJIN_AUTHORIZATION_TIME = 6;
 
 
     public static final String BEARER = "Bearer ";
     public static final String BEARER = "Bearer ";
@@ -59,20 +58,20 @@ public class ZiJinCrawlerCacheComponent {
 
 
     /**
     /**
      * 缓存认证信息
      * 缓存认证信息
+     *
      * @param token
      * @param token
      * @param userCode
      * @param userCode
-     * @param username
+     * @param
      * @return String
      * @return String
      */
      */
     public String cacheAuthorization(String token, String userCode, String userName) {
     public String cacheAuthorization(String token, String userCode, String userName) {
         Map<String, String> authorizationMap = new HashMap<>();
         Map<String, String> authorizationMap = new HashMap<>();
-        String authorization = token;
-        authorizationMap.put(AUTHORIZATION, authorization);
+        authorizationMap.put(AUTHORIZATION, token);
         authorizationMap.put(USER_CODE, userCode);
         authorizationMap.put(USER_CODE, userCode);
         RMap<Object, Object> map = redissonClient.getMap(ZIJIN_AUTHORIZATION + userCode);
         RMap<Object, Object> map = redissonClient.getMap(ZIJIN_AUTHORIZATION + userCode);
         map.putAll(authorizationMap);
         map.putAll(authorizationMap);
         map.expire(Duration.ofHours(ZIJIN_AUTHORIZATION_TIME));
         map.expire(Duration.ofHours(ZIJIN_AUTHORIZATION_TIME));
-        return authorization;
+        return token;
     }
     }
 
 
     /**
     /**
@@ -120,7 +119,8 @@ public class ZiJinCrawlerCacheComponent {
 
 
     /**
     /**
      * 缓存图片信息
      * 缓存图片信息
-     * @param orderNo 订单号
+     *
+     * @param orderNo  订单号
      * @param dataDTOS 图片信息
      * @param dataDTOS 图片信息
      */
      */
     public void cacheImagesInfo(String orderNo, List<ZiJinCrawlerUploadImageInfoListRequest.ItemFileDataListDTO> dataDTOS) {
     public void cacheImagesInfo(String orderNo, List<ZiJinCrawlerUploadImageInfoListRequest.ItemFileDataListDTO> dataDTOS) {
@@ -130,6 +130,7 @@ public class ZiJinCrawlerCacheComponent {
 
 
     /**
     /**
      * 获取图片信息
      * 获取图片信息
+     *
      * @param orderNo 订单号
      * @param orderNo 订单号
      * @return 图片信息
      * @return 图片信息
      */
      */
@@ -142,8 +143,8 @@ public class ZiJinCrawlerCacheComponent {
     /**
     /**
      * 缓存订单信息
      * 缓存订单信息
      *
      *
-     * @param orderNo   订单号
-     * @param order 报价请求信息
+     * @param orderNo 订单号
+     * @param order   报价请求信息
      */
      */
     public void cacheOrderRequest(String orderNo, ZiJinCrawlerOrder order) {
     public void cacheOrderRequest(String orderNo, ZiJinCrawlerOrder order) {
         String responseStr = JSONObject.toJSONString(order);
         String responseStr = JSONObject.toJSONString(order);

+ 4 - 2
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerCarRequest.java

@@ -1,8 +1,8 @@
 package com.jzg.quotation.zijin.crawler.entity.request;
 package com.jzg.quotation.zijin.crawler.entity.request;
 
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 
 import java.io.Serial;
 import java.io.Serial;
 import java.io.Serializable;
 import java.io.Serializable;
@@ -14,6 +14,8 @@ import java.io.Serializable;
  * @date 2025/09/28
  * @date 2025/09/28
  */
  */
 @Data
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
 public class ZiJinCrawlerCarRequest implements Serializable {
 public class ZiJinCrawlerCarRequest implements Serializable {
 
 
     @Serial
     @Serial

+ 2 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerSaveProposalRequest.java

@@ -2,6 +2,7 @@ package com.jzg.quotation.zijin.crawler.entity.request;
 
 
 import com.alibaba.fastjson.annotation.JSONField;
 import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 
 
@@ -13,6 +14,7 @@ import java.io.Serializable;
  */
  */
 @Data
 @Data
 @NoArgsConstructor
 @NoArgsConstructor
+@AllArgsConstructor
 public class ZiJinCrawlerSaveProposalRequest implements Serializable {
 public class ZiJinCrawlerSaveProposalRequest implements Serializable {
 
 
     @Serial
     @Serial

+ 45 - 43
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java

@@ -16,7 +16,6 @@ import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.entity.GetCaptchaResponse;
-import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.zijin.crawler.build.ZiJinCrawlerQuoteRequestBuild;
 import com.jzg.quotation.zijin.crawler.build.ZiJinCrawlerQuoteRequestBuild;
@@ -38,6 +37,7 @@ import com.jzg.quotation.zijin.crawler.util.Base64ImageExtractor;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.CollectionUtils;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpHeaders;
 import org.springframework.util.ObjectUtils;
 import org.springframework.util.ObjectUtils;
 import org.springframework.util.StringUtils;
 import org.springframework.util.StringUtils;
@@ -116,17 +116,11 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         HttpHeaders headers = ziJinCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         HttpHeaders headers = ziJinCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         log.info("headers参数的值:{}", JSON.toJSONString(headers));
         log.info("headers参数的值:{}", JSON.toJSONString(headers));
 
 
-        // 1.1 解析配置参数
-        ZiJinCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZiJinCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
-        log.info("parameters参数的值:{}", JSON.toJSONString(parameters));
+        ZiJinCrawlerConfigureParameters parameters = ziJinBuildingAttributionInformation.getZiJinCrawlerConfigureParameters(attributionInformationVo);
 
 
         try {
         try {
             // 查询车辆信息
             // 查询车辆信息
-            ZiJinCrawlerCarRequest ziJinCrawlerCarRequest = new ZiJinCrawlerCarRequest();
-            ziJinCrawlerCarRequest.setChannelCode("KSCD_PROD");
-            ziJinCrawlerCarRequest.setComCode(parameters.getComCode());
-            ziJinCrawlerCarRequest.setLicenseNo(quoteVo.getCarInfoVo().getLicenseNo());
-            ziJinCrawlerCarRequest.setVin(quoteVo.getCarInfoVo().getVinNo());
+            ZiJinCrawlerCarRequest ziJinCrawlerCarRequest = new ZiJinCrawlerCarRequest("KSCD_PROD", parameters.getComCode(), quoteVo.getCarInfoVo().getLicenseNo(), quoteVo.getCarInfoVo().getVinNo());
             ZiJinCrawlerCarResponse ziJinCrawlerCarResponse = ziJinCrawlerRequestComponent.car(ziJinCrawlerCarRequest, headers);
             ZiJinCrawlerCarResponse ziJinCrawlerCarResponse = ziJinCrawlerRequestComponent.car(ziJinCrawlerCarRequest, headers);
             log.info("ziJinCrawlerCarResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerCarResponse));
             log.info("ziJinCrawlerCarResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerCarResponse));
 
 
@@ -152,16 +146,18 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
 
 
             // 重复投保,延保
             // 重复投保,延保
             if (ResponseCode.R_0002.getCode().equals(ziJinCrawlerQuotationResponse.getRtnCode()) && ziJinCrawlerQuotationResponse.getRtnMsg() != null && ziJinCrawlerQuotationResponse.getRtnMsg().contains("重复投保")) {
             if (ResponseCode.R_0002.getCode().equals(ziJinCrawlerQuotationResponse.getRtnCode()) && ziJinCrawlerQuotationResponse.getRtnMsg() != null && ziJinCrawlerQuotationResponse.getRtnMsg().contains("重复投保")) {
-                String endTime = extractDuplicateEndTime(ziJinCrawlerQuotationResponse.getRtnMsg());
-                if (StringUtils.hasLength(endTime)) {
-                    String startTime = endTime;
+                // 提取重复投保消息中的结束时间为起保时间
+                String startTime = extractDuplicateEndTime(ziJinCrawlerQuotationResponse.getRtnMsg());
+                if (StringUtils.hasLength(startTime)) {
                     String newEndTime = TimeProcessing.minusOneSecondAfterYear(startTime);
                     String newEndTime = TimeProcessing.minusOneSecondAfterYear(startTime);
-                    // 修改商业险起保时间(后端接口期望日期格式为 yyyy-MM-dd)
-                    ziJinCrawlerQuotationRequest.getBaseInfo().setStartDate(TimeProcessing.dateTimeToDate(startTime));
-                    ziJinCrawlerQuotationRequest.getBaseInfo().setEndDate(TimeProcessing.minusDays(TimeProcessing.dateTimeToDate(newEndTime), 1));
-                    // 修改交强险起保时间
-                    ziJinCrawlerQuotationRequest.getBaseInfo().setStartDateCI(TimeProcessing.dateTimeToDate(startTime));
-                    ziJinCrawlerQuotationRequest.getBaseInfo().setEndDateCI(TimeProcessing.minusDays(TimeProcessing.dateTimeToDate(newEndTime), 1));
+                    String startDate = TimeProcessing.dateTimeToDate(startTime);
+                    String endDate = TimeProcessing.minusDays(TimeProcessing.dateTimeToDate(newEndTime), 1);
+                    // 修改交强险起保时间(保司接口期望日期格式为 yyyy-MM-dd)
+                    ziJinCrawlerQuotationRequest.getBaseInfo().setStartDateCI(startDate);
+                    ziJinCrawlerQuotationRequest.getBaseInfo().setEndDateCI(endDate);
+                    // 修改商业险起保时间
+                    ziJinCrawlerQuotationRequest.getBaseInfo().setStartDate(quoteVo.getBiRiskInfoVo() != null ? startDate : null);
+                    ziJinCrawlerQuotationRequest.getBaseInfo().setEndDate(quoteVo.getBiRiskInfoVo() != null ? endDate : null);
                     log.info("紫金报价重复投保日期参数: startTime={}, endTime={}", startTime, newEndTime);
                     log.info("紫金报价重复投保日期参数: startTime={}, endTime={}", startTime, newEndTime);
                     ziJinCrawlerQuotationResponse = ziJinCrawlerRequestComponent.quotation(ziJinCrawlerQuotationRequest, headers);
                     ziJinCrawlerQuotationResponse = ziJinCrawlerRequestComponent.quotation(ziJinCrawlerQuotationRequest, headers);
                     log.info("紫金报价重复投保后响应: {}", JSON.toJSONString(ziJinCrawlerQuotationResponse));
                     log.info("紫金报价重复投保后响应: {}", JSON.toJSONString(ziJinCrawlerQuotationResponse));
@@ -195,9 +191,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                 log.info("ziJinCrawlerSaveQuoteInfoResponse响应:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoResponse));
                 log.info("ziJinCrawlerSaveQuoteInfoResponse响应:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoResponse));
 
 
                 // 保存投保单
                 // 保存投保单
-                ZiJinCrawlerSaveProposalRequest ziJinCrawlerSaveProposalRequest = new ZiJinCrawlerSaveProposalRequest();
-                ziJinCrawlerSaveProposalRequest.setOrderNo(ziJinCrawlerGetOrderNoResponse.getOrderNo());
-                ziJinCrawlerSaveProposalRequest.setProposalCheckNo(ziJinCrawlerQuotationResponse.getBasePart().getProposalCheckNo());
+                ZiJinCrawlerSaveProposalRequest ziJinCrawlerSaveProposalRequest = new ZiJinCrawlerSaveProposalRequest(ziJinCrawlerGetOrderNoResponse.getOrderNo(), ziJinCrawlerQuotationResponse.getBasePart().getProposalCheckNo());
                 log.info("ziJinCrawlerSaveProposalRequest参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveProposalRequest));
                 log.info("ziJinCrawlerSaveProposalRequest参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveProposalRequest));
                 ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse = ziJinCrawlerRequestComponent.saveProposal(ziJinCrawlerSaveProposalRequest, headers);
                 ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse = ziJinCrawlerRequestComponent.saveProposal(ziJinCrawlerSaveProposalRequest, headers);
                 log.info("ziJinCrawlerSaveProposalResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveProposalResponse));
                 log.info("ziJinCrawlerSaveProposalResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveProposalResponse));
@@ -254,8 +248,8 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             AttributionInformationVo attributionInformationVo = paymentLinkVo.getOrder().getAttributionInformationVo();
             AttributionInformationVo attributionInformationVo = paymentLinkVo.getOrder().getAttributionInformationVo();
             log.info("attributionInformationVo对象的值:{}", JSONObject.toJSONString(attributionInformationVo));
             log.info("attributionInformationVo对象的值:{}", JSONObject.toJSONString(attributionInformationVo));
             HttpHeaders headers = ziJinCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
             HttpHeaders headers = ziJinCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+            ZiJinCrawlerConfigureParameters parameters = ziJinBuildingAttributionInformation.getZiJinCrawlerConfigureParameters(attributionInformationVo);
             ZiJinCrawlerOrder ziJinCrawlerOrder = ziJinCrawlerOrderService.getByOrdersNo(paymentLinkVo.getOrder().getOrdersNo());
             ZiJinCrawlerOrder ziJinCrawlerOrder = ziJinCrawlerOrderService.getByOrdersNo(paymentLinkVo.getOrder().getOrdersNo());
-
             log.info("获取支付链接,订单号:{}", ziJinCrawlerOrder.getOrderNo());
             log.info("获取支付链接,订单号:{}", ziJinCrawlerOrder.getOrderNo());
 
 
             ZiJinCrawlerPaymentLinkRequest ziJinCrawlerPaymentLinkRequest = new ZiJinCrawlerPaymentLinkRequest();
             ZiJinCrawlerPaymentLinkRequest ziJinCrawlerPaymentLinkRequest = new ZiJinCrawlerPaymentLinkRequest();
@@ -266,15 +260,15 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             paymentApplicationDto.setInvokeSystem("0201");
             paymentApplicationDto.setInvokeSystem("0201");
             paymentApplicationDto.setPremium(ziJinCrawlerOrder.getTotalPremium());
             paymentApplicationDto.setPremium(ziJinCrawlerOrder.getTotalPremium());
             ziJinCrawlerPaymentLinkRequest.setPaymentApplicationDtos(Collections.singletonList(paymentApplicationDto));
             ziJinCrawlerPaymentLinkRequest.setPaymentApplicationDtos(Collections.singletonList(paymentApplicationDto));
-            ziJinCrawlerPaymentLinkRequest.setOperatorCode("214000151");
-            ziJinCrawlerPaymentLinkRequest.setCompanyCode("2140000601");
+            ziJinCrawlerPaymentLinkRequest.setOperatorCode(attributionInformationVo.getUsername());
+            ziJinCrawlerPaymentLinkRequest.setCompanyCode(parameters.getComCode());
 
 
             // 获取支付链接
             // 获取支付链接
             ZiJinCrawlerPaymentLinkResponse ziJinCrawlerPaymentLinkResponse = ziJinCrawlerRequestComponent.payment(ziJinCrawlerPaymentLinkRequest, headers);
             ZiJinCrawlerPaymentLinkResponse ziJinCrawlerPaymentLinkResponse = ziJinCrawlerRequestComponent.payment(ziJinCrawlerPaymentLinkRequest, headers);
             log.info("ziJinCrawlerPaymentLinkResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerPaymentLinkResponse));
             log.info("ziJinCrawlerPaymentLinkResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerPaymentLinkResponse));
             PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
             PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
             // 支付链接获取成功
             // 支付链接获取成功
-            if ("0000".equals(ziJinCrawlerPaymentLinkResponse.getRtnCode())) {
+            if (ResponseCode.R_0000.getCode().equals(ziJinCrawlerPaymentLinkResponse.getRtnCode())) {
                 paymentLinkResultsVo.setPayLinkStatus(true);
                 paymentLinkResultsVo.setPayLinkStatus(true);
                 paymentLinkResultsVo.setPaymentLink(ziJinCrawlerPaymentLinkResponse.getWechatUrl());
                 paymentLinkResultsVo.setPaymentLink(ziJinCrawlerPaymentLinkResponse.getWechatUrl());
             } else {
             } else {
@@ -367,7 +361,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                 ZiJinCrawlerImageUploadResponse ziJinCrawlerImageUploadResponse = ziJinCrawlerRequestComponent.uploadImage(ziJinCrawlerImageUploadRequest, headers);
                 ZiJinCrawlerImageUploadResponse ziJinCrawlerImageUploadResponse = ziJinCrawlerRequestComponent.uploadImage(ziJinCrawlerImageUploadRequest, headers);
                 log.info("影像上传响应,订单号:{},响应:{}", ziJinCrawlerOrder.getOrderNo(), JSON.toJSONString(ziJinCrawlerImageUploadResponse));
                 log.info("影像上传响应,订单号:{},响应:{}", ziJinCrawlerOrder.getOrderNo(), JSON.toJSONString(ziJinCrawlerImageUploadResponse));
 
 
-                if ("0000".equals(ziJinCrawlerImageUploadResponse.getRtnCode())) {
+                if (ResponseCode.R_0000.getCode().equals(ziJinCrawlerImageUploadResponse.getRtnCode())) {
 
 
                     ZiJinCrawlerUploadImageInfoListRequest.ItemFileDataListDTO fileInfo = ZiJinCrawlerUploadImageInfoListRequest.ItemFileDataListDTO.builder()
                     ZiJinCrawlerUploadImageInfoListRequest.ItemFileDataListDTO fileInfo = ZiJinCrawlerUploadImageInfoListRequest.ItemFileDataListDTO.builder()
                             .fileId(ziJinCrawlerImageUploadResponse.getFileId())
                             .fileId(ziJinCrawlerImageUploadResponse.getFileId())
@@ -402,10 +396,10 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
     }
     }
 
 
     /**
     /**
-     * 根据影像编码获取文件类型
+     * 系统影像编码转换为紫金对应的文件类型代码
      *
      *
      * @param imageCode 影像编码
      * @param imageCode 影像编码
-     * @return 文件类型
+     * @return 紫金对应的文件类型代码
      */
      */
     private String getFileTypeByImageCode(String imageCode) {
     private String getFileTypeByImageCode(String imageCode) {
         switch (imageCode) {
         switch (imageCode) {
@@ -443,20 +437,11 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             HttpHeaders headers = ziJinCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
             HttpHeaders headers = ziJinCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
             ZiJinCrawlerOrder ziJinCrawlerOrder = ziJinCrawlerOrderService.getByOrdersNo(orderStatusVo.getOrder().getOrdersNo());
             ZiJinCrawlerOrder ziJinCrawlerOrder = ziJinCrawlerOrderService.getByOrdersNo(orderStatusVo.getOrder().getOrdersNo());
 
 
-            ZiJinCrawlerQueryOrderStatusRequest ziJinCrawlerQueryOrderStatusRequest = new ZiJinCrawlerQueryOrderStatusRequest();
-            // 设置请求参数
-            ziJinCrawlerQueryOrderStatusRequest.setOrderStatus(new String[]{});
-            ziJinCrawlerQueryOrderStatusRequest.setOrderNo(ziJinCrawlerOrder.getOrderNo());
-            ziJinCrawlerQueryOrderStatusRequest.setLicenseNo(orderStatusVo.getCarInfo().getLicenseNo());
-            ziJinCrawlerQueryOrderStatusRequest.setUpdateTimeBegin(DateTimeUtil.getLocalDateStr());
-            ziJinCrawlerQueryOrderStatusRequest.setUpdateTimeEnd(DateTimeUtil.getLocalDateStr());
-            ziJinCrawlerQueryOrderStatusRequest.setPageNum(1);
-            ziJinCrawlerQueryOrderStatusRequest.setPageSize(10);
-            ziJinCrawlerQueryOrderStatusRequest.setProductCodeList(new String[]{});
-            ziJinCrawlerQueryOrderStatusRequest.setOrderOrigin("KSCD_PROD,FH_PROD,DP_WXMP,DP_ZYB,RENEWAL_PROD,DP_ZNCD,SHHTB_B,QYYGTB");
+            ZiJinCrawlerQueryOrderStatusRequest ziJinCrawlerQueryOrderStatusRequest = getZiJinCrawlerQueryOrderStatusRequest(orderStatusVo, ziJinCrawlerOrder);
 
 
             ZiJinCrawlerQueryOrderStatusResponse ziJinCrawlerQueryOrderStatusResponse = ziJinCrawlerRequestComponent.queryOrderStatus(ziJinCrawlerQueryOrderStatusRequest, headers);
             ZiJinCrawlerQueryOrderStatusResponse ziJinCrawlerQueryOrderStatusResponse = ziJinCrawlerRequestComponent.queryOrderStatus(ziJinCrawlerQueryOrderStatusRequest, headers);
             log.info("ziJinCrawlerQueryOrderStatusResponse对象的值:{}", JSON.toJSONString(ziJinCrawlerQueryOrderStatusResponse));
             log.info("ziJinCrawlerQueryOrderStatusResponse对象的值:{}", JSON.toJSONString(ziJinCrawlerQueryOrderStatusResponse));
+
             // 获取订单状态
             // 获取订单状态
             String orderStatus = ziJinCrawlerQueryOrderStatusResponse.getData().getContent().get(0).getOrderStatus();
             String orderStatus = ziJinCrawlerQueryOrderStatusResponse.getData().getContent().get(0).getOrderStatus();
             log.info("订单状态:{},中文含义:{}", orderStatus, ziJinCrawlerQueryOrderStatusResponse.getData().getContent().get(0).getOrderStatusCN());
             log.info("订单状态:{},中文含义:{}", orderStatus, ziJinCrawlerQueryOrderStatusResponse.getData().getContent().get(0).getOrderStatusCN());
@@ -493,17 +478,18 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         try {
         try {
             log.info("downloadPolicy入参的值:{}", JSONObject.toJSONString(downloadPolicyVo));
             log.info("downloadPolicy入参的值:{}", JSONObject.toJSONString(downloadPolicyVo));
             ZiJinCrawlerOrder ziJinCrawlerOrder = ziJinCrawlerOrderService.getByOrdersNo(downloadPolicyVo.getOrder().getOrdersNo());
             ZiJinCrawlerOrder ziJinCrawlerOrder = ziJinCrawlerOrderService.getByOrdersNo(downloadPolicyVo.getOrder().getOrdersNo());
-
+            AttributionInformationVo attributionInformationVo = downloadPolicyVo.getOrder().getAttributionInformationVo();
+            ZiJinCrawlerConfigureParameters parameters = ziJinBuildingAttributionInformation.getZiJinCrawlerConfigureParameters(attributionInformationVo);
             // 1、查询车辆保单列表(下载保单的前一步操作)
             // 1、查询车辆保单列表(下载保单的前一步操作)
-            ZiJinCrawlerQueryCarPolicyListRequest ziJinCrawlerQueryCarPolicyListRequest = setQueryCarPolicyListRequest(downloadPolicyVo.getBeginDate(), downloadPolicyVo.getEndDate(), "2140000601");
+            ZiJinCrawlerQueryCarPolicyListRequest ziJinCrawlerQueryCarPolicyListRequest = setQueryCarPolicyListRequest(downloadPolicyVo.getBeginDate(), downloadPolicyVo.getEndDate(), parameters.getComCode());
             ZiJinCrawlerQueryCarPolicyListResponse ziJinCrawlerQueryCarPolicyListResponse = ziJinCrawlerRequestComponent.queryCarPolicyList(ziJinCrawlerQueryCarPolicyListRequest);
             ZiJinCrawlerQueryCarPolicyListResponse ziJinCrawlerQueryCarPolicyListResponse = ziJinCrawlerRequestComponent.queryCarPolicyList(ziJinCrawlerQueryCarPolicyListRequest);
             log.info("ziJinCrawlerQueryCarPolicyListResponse响应对象的值:{}", JSON.toJSONString(ziJinCrawlerQueryCarPolicyListResponse));
             log.info("ziJinCrawlerQueryCarPolicyListResponse响应对象的值:{}", JSON.toJSONString(ziJinCrawlerQueryCarPolicyListResponse));
 
 
             List<ZiJinCrawlerQueryCarPolicyListResponse.PolicyContent> content = ziJinCrawlerQueryCarPolicyListResponse.getData().getPolicyDataInfoDtoList().getContent();
             List<ZiJinCrawlerQueryCarPolicyListResponse.PolicyContent> content = ziJinCrawlerQueryCarPolicyListResponse.getData().getPolicyDataInfoDtoList().getContent();
             // 获取所有的保单号
             // 获取所有的保单号
-            List<String> policyNos = content.stream().map(ZiJinCrawlerQueryCarPolicyListResponse.PolicyContent::getPolicyNo).collect(Collectors.toList());
+            List<String> policyNos = content.stream().map(ZiJinCrawlerQueryCarPolicyListResponse.PolicyContent::getPolicyNo).toList();
             // 获取所有的加密验证码
             // 获取所有的加密验证码
-            List<String> encryptCodes = content.stream().map(ZiJinCrawlerQueryCarPolicyListResponse.PolicyContent::getEncrypt).collect(Collectors.toList());
+            List<String> encryptCodes = content.stream().map(ZiJinCrawlerQueryCarPolicyListResponse.PolicyContent::getEncrypt).toList();
             // 将保单号和加密验证码一一对应
             // 将保单号和加密验证码一一对应
             Map<String, String> policyNoEncryptMap = new LinkedHashMap<>();
             Map<String, String> policyNoEncryptMap = new LinkedHashMap<>();
             for (int i = 0; i < policyNos.size(); i++) {
             for (int i = 0; i < policyNos.size(); i++) {
@@ -556,6 +542,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
      * @param loginComCode 登录公司编码
      * @param loginComCode 登录公司编码
      * @return ZiJinCrawlerQueryCarPolicyListRequest
      * @return ZiJinCrawlerQueryCarPolicyListRequest
      */
      */
+    @NotNull
     private ZiJinCrawlerQueryCarPolicyListRequest setQueryCarPolicyListRequest(String beginDate, String endDate, String loginComCode) {
     private ZiJinCrawlerQueryCarPolicyListRequest setQueryCarPolicyListRequest(String beginDate, String endDate, String loginComCode) {
         ZiJinCrawlerQueryCarPolicyListRequest ziJinCrawlerQueryCarPolicyListRequest = new ZiJinCrawlerQueryCarPolicyListRequest();
         ZiJinCrawlerQueryCarPolicyListRequest ziJinCrawlerQueryCarPolicyListRequest = new ZiJinCrawlerQueryCarPolicyListRequest();
         ziJinCrawlerQueryCarPolicyListRequest.setInputDateBegin(beginDate);
         ziJinCrawlerQueryCarPolicyListRequest.setInputDateBegin(beginDate);
@@ -571,6 +558,21 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         return ziJinCrawlerQueryCarPolicyListRequest;
         return ziJinCrawlerQueryCarPolicyListRequest;
     }
     }
 
 
+    @NotNull
+    private ZiJinCrawlerQueryOrderStatusRequest getZiJinCrawlerQueryOrderStatusRequest(OrderStatusVo orderStatusVo, ZiJinCrawlerOrder ziJinCrawlerOrder) {
+        ZiJinCrawlerQueryOrderStatusRequest ziJinCrawlerQueryOrderStatusRequest = new ZiJinCrawlerQueryOrderStatusRequest();
+        ziJinCrawlerQueryOrderStatusRequest.setOrderStatus(new String[]{});
+        ziJinCrawlerQueryOrderStatusRequest.setOrderNo(ziJinCrawlerOrder.getOrderNo());
+        ziJinCrawlerQueryOrderStatusRequest.setLicenseNo(orderStatusVo.getCarInfo().getLicenseNo());
+        ziJinCrawlerQueryOrderStatusRequest.setUpdateTimeBegin(DateTimeUtil.getLocalDateStr());
+        ziJinCrawlerQueryOrderStatusRequest.setUpdateTimeEnd(DateTimeUtil.getLocalDateStr());
+        ziJinCrawlerQueryOrderStatusRequest.setPageNum(1);
+        ziJinCrawlerQueryOrderStatusRequest.setPageSize(10);
+        ziJinCrawlerQueryOrderStatusRequest.setProductCodeList(new String[]{});
+        ziJinCrawlerQueryOrderStatusRequest.setOrderOrigin("KSCD_PROD,FH_PROD,DP_WXMP,DP_ZYB,RENEWAL_PROD,DP_ZNCD,SHHTB_B,QYYGTB");
+        return ziJinCrawlerQueryOrderStatusRequest;
+    }
+
 
 
     /**
     /**
      * 截取重复投保终保日期的正则表达式
      * 截取重复投保终保日期的正则表达式

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementUndwrtRulesService.java

@@ -45,6 +45,17 @@ public interface PtlAgreementUndwrtRulesService extends IService<PtlAgreementUnd
      */
      */
     AgreementRulesVo rulesGet(String ruleId);
     AgreementRulesVo rulesGet(String ruleId);
 
 
+
+
+    /**
+     * 承保规则复制
+     * @param ruleId
+     * @return
+     */
+    AgreementRulesVo rulesCopy(String ruleId);
+
+
+
     /**
     /**
      * 根据父ID查询规则列表
      * 根据父ID查询规则列表
      *
      *

+ 2 - 0
tenant/organization/src/main/java/com/jzg/organization/service/SysUserJzgInfoService.java

@@ -20,6 +20,8 @@ public interface SysUserJzgInfoService extends IService<SysUserJzgInfo> {
      */
      */
     List<SysUserJzgInfo> getUserInfoByIdentity(String identity,String userId);
     List<SysUserJzgInfo> getUserInfoByIdentity(String identity,String userId);
 
 
+    SysUserJzgInfo getByUserIdOrId(String id);
+
     /**
     /**
      * 通过userId查询用户信息
      * 通过userId查询用户信息
      * @param userId 用户序号
      * @param userId 用户序号

+ 136 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java

@@ -391,6 +391,142 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
         return rulesVo;
         return rulesVo;
     }
     }
 
 
+
+
+    public AgreementRulesVo rulesCCC(String ruleId) {
+        PtlAgreementUndwrtRules rules = baseMapper.selectById(ruleId);
+        if (rules == null) {
+            log.info("承保规则不存在, ruleId={}", ruleId);
+            return null;
+        }
+        PtlAgreement agreement = ptlAgreementService.getById(rules.getAgreementId());//协议id
+        AgreementRulesVo rulesVo = new AgreementRulesVo();
+        BeanUtils.copyProperties(rules, rulesVo);
+
+        // 获取费用因子属性(公共逻辑,仅查询一次)
+        List<PtlAgreementUndwrtRulesAttr> attrList = agreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
+        Map<String, PtlAgreementUndwrtRulesAttr> attrMap = attrList.stream()
+                .filter(attr -> "all".equals(attr.getCompanyIds()) || attr.getCompanyIds().equals(agreement.getCompanyId()))
+                .collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, attr -> attr));
+
+        // 确定需要处理的规则ID列表
+        List<String> ruleIds;
+        if (rules.getParentId() != null && !rules.getParentId().isEmpty()) {
+            ruleIds = baseMapper.queryListByParentId(rules.getParentId()).stream()
+                    .map(AgreementRulesVo::getId).collect(Collectors.toList());
+        } else {
+            ruleIds = List.of(ruleId);
+        }
+
+        // 统一组装 groups
+        List<RulesGroupParam> groups = new ArrayList<>();
+        for (String id : ruleIds) {
+            List<PtlAgreementUndwrtRulesAttrLink> linkList = agreementUndwrtRulesAttrLinkService.queryLinkList(id);
+            List<PtlAgreementUndwrtRulesAttr> enrichedAttrs = enrichAttrLinks(linkList, attrMap);
+            RulesGroupParam group = new RulesGroupParam();
+            group.setRulesAttrList(linkList);
+            group.setCostsAttrLinks(enrichedAttrs);
+            groups.add(group);
+        }
+        rulesVo.setRulesGroups(groups);
+        // 单条模式向后兼容,同时设置 costsAttrLinks
+        if (ruleIds.size() == 1) {
+            rulesVo.setCostsAttrLinks(groups.get(0).getCostsAttrLinks());
+        }
+        return rulesVo;
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public AgreementRulesVo rulesCopy(String ruleId) {
+        PtlAgreementUndwrtRules rules = baseMapper.selectById(ruleId);
+        if (rules == null) {
+            log.info("承保规则不存在, ruleId={}", ruleId);
+            return null;
+        }
+
+        // 获取费用因子属性(公共逻辑,仅查询一次)
+        List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList = agreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
+
+        // 根据协议id获取最大的序号
+        LambdaQueryWrapper<PtlAgreementUndwrtRules> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(PtlAgreementUndwrtRules::getAgreementId, rules.getAgreementId())
+                .eq(PtlAgreementUndwrtRules::getIsDelete, 0);
+        queryWrapper.orderByDesc(PtlAgreementUndwrtRules::getOrderNum);
+        queryWrapper.last("LIMIT 1");
+        PtlAgreementUndwrtRules maxRules = baseMapper.selectOne(queryWrapper);
+        int startOrderNum = Objects.nonNull(maxRules) ? maxRules.getOrderNum() + 1 : 1;
+
+        // 确定需要复制的源规则ID列表
+        List<String> sourceRuleIds;
+        if (rules.getParentId() != null && !rules.getParentId().isEmpty()) {
+            sourceRuleIds = baseMapper.queryListByParentId(rules.getParentId()).stream()
+                    .map(AgreementRulesVo::getId).collect(Collectors.toList());
+        } else {
+            sourceRuleIds = List.of(ruleId);
+        }
+
+        // 批量复制:多条规则共享同一个新 parentId
+        String newParentId = sourceRuleIds.size() > 1 ? IdGenerate.nextId() : null;
+        List<RulesGroupParam> groups = new ArrayList<>();
+
+        // 获取属性映射(用于组装返回结果)
+        PtlAgreement agreement = ptlAgreementService.getById(rules.getAgreementId());
+        Map<String, PtlAgreementUndwrtRulesAttr> attrMap = undwrtRulesAttrList.stream()
+                .filter(attr -> "all".equals(attr.getCompanyIds()) || attr.getCompanyIds().equals(agreement.getCompanyId()))
+                .collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, attr -> attr));
+
+        for (int i = 0; i < sourceRuleIds.size(); i++) {
+            String sourceId = sourceRuleIds.get(i);
+            // 查询源规则的属性链接
+            List<PtlAgreementUndwrtRulesAttrLink> sourceLinkList = agreementUndwrtRulesAttrLinkService.queryLinkList(sourceId);
+
+            // 构建新规则记录
+            String newRuleId = IdGenerate.nextId();
+            PtlAgreementUndwrtRules newRules = new PtlAgreementUndwrtRules();
+            newRules.setId(newRuleId);
+            newRules.setAgreementId(rules.getAgreementId());
+            newRules.setStartTime(rules.getStartTime());
+            newRules.setEndTime(rules.getEndTime());
+            newRules.setInputDescription(rules.getInputDescription());
+            newRules.setParentId(newParentId);
+            newRules.setOrderNum(startOrderNum + i);
+
+            // 复制属性链接,关联到新规则ID
+            List<PtlAgreementUndwrtRulesAttrLink> newAttrLinks = processAndAttrs(sourceLinkList, undwrtRulesAttrList, newRuleId);
+            if (CollUtil.isNotEmpty(newAttrLinks)) {
+                agreementUndwrtRulesAttrLinkMapper.insert(newAttrLinks);
+            }
+
+            newRules.setRuleDescription(buildDesc(newAttrLinks, undwrtRulesAttrList));
+            baseMapper.insert(newRules);
+
+            // 组装返回的 groups
+            List<PtlAgreementUndwrtRulesAttr> enrichedAttrs = enrichAttrLinks(newAttrLinks, attrMap);
+            RulesGroupParam group = new RulesGroupParam();
+            group.setRulesAttrList(newAttrLinks);
+            group.setCostsAttrLinks(enrichedAttrs);
+            groups.add(group);
+        }
+
+        // 构建返回结果
+        AgreementRulesVo rulesVo = new AgreementRulesVo();
+        rulesVo.setAgreementId(rules.getAgreementId());
+        rulesVo.setStartTime(rules.getStartTime());
+        rulesVo.setEndTime(rules.getEndTime());
+        rulesVo.setInputDescription(rules.getInputDescription());
+        rulesVo.setParentId(newParentId);
+        rulesVo.setRulesGroups(groups);
+        if (groups.size() == 1) {
+            rulesVo.setCostsAttrLinks(groups.get(0).getCostsAttrLinks());
+        }
+        return rulesVo;
+    }
+
+
+
+
     /**
     /**
      * 将属性链接丰富为完整的属性对象
      * 将属性链接丰富为完整的属性对象
      */
      */

+ 12 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -678,7 +678,13 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         // modify by lipf, 和查询调用同一个查询mapper,并且将分页参数进行调整 2026年6月9日10:03:13
         // modify by lipf, 和查询调用同一个查询mapper,并且将分页参数进行调整 2026年6月9日10:03:13
         receivableQueryVo.setPages(1);
         receivableQueryVo.setPages(1);
         receivableQueryVo.setSize(Integer.MAX_VALUE);
         receivableQueryVo.setSize(Integer.MAX_VALUE);
+
         Page<InsPlyIncome> page = baseMapper.getReceivablePage(receivableQueryVo.getPage(), receivableQueryVo);
         Page<InsPlyIncome> page = baseMapper.getReceivablePage(receivableQueryVo.getPage(), receivableQueryVo);
+        // 手续费
+        page.getRecords().forEach(item->{
+            item.setReceivableAmount(item.getSuperviseCostsPremiums());
+        });
+
         //return baseMapper.getReceivableList(receivableQueryVo);
         //return baseMapper.getReceivableList(receivableQueryVo);
         return page.getRecords();
         return page.getRecords();
     }
     }
@@ -3322,7 +3328,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         dto.setDeptName(income.getDeptName());
         dto.setDeptName(income.getDeptName());
         dto.setAgreementName(income.getAgreementName());
         dto.setAgreementName(income.getAgreementName());
         dto.setLicenseNo(income.getLicenseNo());
         dto.setLicenseNo(income.getLicenseNo());
-//        dto.setReceivableAmount(income.getReceivableAmount());
+        dto.setReceivableAmount(income.getReceivableAmount());
         dto.setProductName(income.getProductName());
         dto.setProductName(income.getProductName());
         dto.setInsuredPerson(income.getInsuredPerson());
         dto.setInsuredPerson(income.getInsuredPerson());
         dto.setJqPolicyNo(income.getJqPolicyNo());
         dto.setJqPolicyNo(income.getJqPolicyNo());
@@ -3677,6 +3683,9 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         receivableQueryVo.setPages(1);
         receivableQueryVo.setPages(1);
         Page<InsPlyIncome> page = baseMapper.getReceivablePage(receivableQueryVo.getPage(), receivableQueryVo);
         Page<InsPlyIncome> page = baseMapper.getReceivablePage(receivableQueryVo.getPage(), receivableQueryVo);
         List<InsPlyIncome> records = page.getRecords();
         List<InsPlyIncome> records = page.getRecords();
+        records.forEach(item->{
+            item.setReceivableAmount(item.getOtherCostsPremiums());
+        });
         List<ExportOtherExcelDto> exportOtherExcelDtos = new ArrayList<>();
         List<ExportOtherExcelDto> exportOtherExcelDtos = new ArrayList<>();
         if(CollUtil.isNotEmpty(records)){
         if(CollUtil.isNotEmpty(records)){
             exportOtherExcelDtos = records.stream().map(action->{
             exportOtherExcelDtos = records.stream().map(action->{
@@ -3692,6 +3701,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 case "3" -> dto.setEntryStatus("补录订单");
                 case "3" -> dto.setEntryStatus("补录订单");
             }
             }
         });
         });
+
+
         EasyExcelUtils.exportForWeb(ServletUtils.getResponse(), ExportOtherExcelDto.class, exportOtherExcelDtos, "车险跟单费应收");
         EasyExcelUtils.exportForWeb(ServletUtils.getResponse(), ExportOtherExcelDto.class, exportOtherExcelDtos, "车险跟单费应收");
     }
     }
 
 

+ 5 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDistributionSettingServiceImpl.java

@@ -28,6 +28,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.HashSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import java.util.Set;
 
 
 /**
 /**
@@ -191,6 +192,7 @@ public class SysDistributionSettingServiceImpl extends ServiceImpl<SysDistributi
             // 审核通过 改为分销员身份
             // 审核通过 改为分销员身份
             sysDistributionAudit.setAuditApprovalTime(LocalDateTime.now());
             sysDistributionAudit.setAuditApprovalTime(LocalDateTime.now());
             sysUserJzgInfo.setIsDistribution("1");
             sysUserJzgInfo.setIsDistribution("1");
+            sysUserJzgInfo.setDistributionTime(LocalDateTime.now());
             sysUserJzgInfoMapper.updateById(sysUserJzgInfo);
             sysUserJzgInfoMapper.updateById(sysUserJzgInfo);
             // 添加分销推荐关系
             // 添加分销推荐关系
             SysUserJzgInfo inviter = sysUserJzgInfoMapper.selectById(sysUserJzgInfo.getReferrerId());
             SysUserJzgInfo inviter = sysUserJzgInfoMapper.selectById(sysUserJzgInfo.getReferrerId());
@@ -321,7 +323,9 @@ public class SysDistributionSettingServiceImpl extends ServiceImpl<SysDistributi
                 pendingAmount = pendingAmount.add(fee);
                 pendingAmount = pendingAmount.add(fee);
             }
             }
         }
         }
-        resultVo.setAuditApprovalTime(sysDistributionAudit.getAuditApprovalTime() != null ? sysDistributionAudit.getAuditApprovalTime() : null);
+        if(Objects.nonNull(sysDistributionAudit)) {
+            resultVo.setAuditApprovalTime(sysDistributionAudit.getAuditApprovalTime() != null ? sysDistributionAudit.getAuditApprovalTime() : null);
+        }
         resultVo.setTotalAmount(totalFee); // 累计佣金
         resultVo.setTotalAmount(totalFee); // 累计佣金
         resultVo.setPendingAmount(pendingAmount); // 待结算佣金
         resultVo.setPendingAmount(pendingAmount); // 待结算佣金
         resultVo.setTotalPremium(totalPremium); // 累计保费
         resultVo.setTotalPremium(totalPremium); // 累计保费

+ 3 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserAccountServiceImpl.java

@@ -102,6 +102,9 @@ public class SysUserAccountServiceImpl extends ServiceImpl<SysUserAccountMapper,
         // 获取个人中心信息
         // 获取个人中心信息
         String mobile = baseController.getUserName();
         String mobile = baseController.getUserName();
         String systemCode = baseController.getSystemCode();
         String systemCode = baseController.getSystemCode();
+        if (systemCode == null) {
+            systemCode = baseController.getAppSystemCode();
+        }
         String userId  = baseController.getUserId();
         String userId  = baseController.getUserId();
         log.info("查询用户的钱包信息:mobile=[{}], systemCode=[{}],userId=[{}]", mobile, systemCode, userId);
         log.info("查询用户的钱包信息:mobile=[{}], systemCode=[{}],userId=[{}]", mobile, systemCode, userId);
         SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getMobile, mobile));
         SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getMobile, mobile));

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

@@ -38,6 +38,14 @@ public class SysUserJzgInfoServiceImpl extends ServiceImpl<SysUserJzgInfoMapper,
         return baseMapper.getUserInfoByIdentity(identity, userId);
         return baseMapper.getUserInfoByIdentity(identity, userId);
     }
     }
 
 
+    @Override
+    public SysUserJzgInfo getByUserIdOrId(String id) {
+        return baseMapper.selectOne(new LambdaQueryWrapper<SysUserJzgInfo>()
+                .eq(SysUserJzgInfo::getUserId,id)
+                .or()
+                .eq(SysUserJzgInfo::getId,id));
+    }
+
     @Override
     @Override
     public SysUserJzgInfo getUserByUserId(String userId) {
     public SysUserJzgInfo getUserByUserId(String userId) {
         return baseMapper.getUserJzgInfoByUserId(userId);
         return baseMapper.getUserJzgInfoByUserId(userId);

+ 12 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserServiceImpl.java

@@ -218,7 +218,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             }
             }
             log.info("查看成员下的业务员信息:成员的序号:jzgInfoId=[{}]", jzgInfoId);
             log.info("查看成员下的业务员信息:成员的序号:jzgInfoId=[{}]", jzgInfoId);
             // modify by lipf 查询成员下业务员的时候,不进行分页
             // modify by lipf 查询成员下业务员的时候,不进行分页
-            page.setSize(Long.MAX_VALUE);
+//            page.setSize(Long.MAX_VALUE);
             userInfoList = sysUserJzgInfoMapper.queryYwy(page, sysUserInfoListVo, systemCode, jzgInfoId
             userInfoList = sysUserJzgInfoMapper.queryYwy(page, sysUserInfoListVo, systemCode, jzgInfoId
             );
             );
         }else if("1".equals(sysUserInfoListVo.getIsMember())){
         }else if("1".equals(sysUserInfoListVo.getIsMember())){
@@ -1041,7 +1041,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
      */
      */
     @Override
     @Override
     public HttpResult<SysUserJzgInfo> getUserInfoByUserId(String id) {
     public HttpResult<SysUserJzgInfo> getUserInfoByUserId(String id) {
-        SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfoService.getUserByUserId(id);
+        SysUserJzgInfo sysUserJzgInfo = sysUserJzgInfoService.getByUserIdOrId(id);
         log.info("根据id=[{}]查询用户信息sysUserJzgInfo=[{}]",id, JSONUtil.toJsonStr(sysUserJzgInfo));
         log.info("根据id=[{}]查询用户信息sysUserJzgInfo=[{}]",id, JSONUtil.toJsonStr(sysUserJzgInfo));
         if (sysUserJzgInfo == null) {
         if (sysUserJzgInfo == null) {
             throw new SystemException("该用户不存在");
             throw new SystemException("该用户不存在");
@@ -1051,7 +1051,17 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         if (sysUser == null) {
         if (sysUser == null) {
             throw new SystemException("该用户不存在");
             throw new SystemException("该用户不存在");
         }
         }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
         sysUserJzgInfo.setMobile(sysUser.getMobile());
         sysUserJzgInfo.setMobile(sysUser.getMobile());
+        sysUserJzgInfo.setIdentity(sysUser.getIdentity());
+        if(Objects.nonNull(sysUser.getIdentityTimeStart())) {
+            sysUserJzgInfo.setIdentityTimeStart(sysUser.getIdentityTimeStart().format(formatter));
+        }
+        if(Objects.nonNull(sysUser.getIdentityTimeEnd())) {
+            sysUserJzgInfo.setIdentityTimeEnd(sysUser.getIdentityTimeEnd().format(formatter));
+        }
         SysDept dept = sysDeptService.getById(sysUserJzgInfo.getDeptId());
         SysDept dept = sysDeptService.getById(sysUserJzgInfo.getDeptId());
         if (!Objects.isNull(dept)) {
         if (!Objects.isNull(dept)) {
             sysUserJzgInfo.setDeptName(dept.getName());
             sysUserJzgInfo.setDeptName(dept.getName());

+ 1 - 1
tenant/organization/src/main/resources/mapper/PtlAgreementUndwrtRulesMapper.xml

@@ -18,7 +18,7 @@
     </resultMap>
     </resultMap>
 
 
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
-        paur.id,paur.agreement_id,paur.rule_description,paur.parent_id,
+        paur.id,paur.agreement_id,paur.rule_description,paur.parent_id,paur.input_description,
         paur.order_num,paur.create_by,paur.create_time,
         paur.order_num,paur.create_by,paur.create_time,
         paur.update_by,paur.update_time,paur.is_delete
         paur.update_by,paur.update_time,paur.is_delete
     </sql>
     </sql>

+ 0 - 1
tenant/organization/src/main/resources/mapper/SysDistributionSettingMapper.xml

@@ -240,7 +240,6 @@
             and sda.audit_status = '1'
             and sda.audit_status = '1'
             AND suji3.id IS NOT NULL
             AND suji3.id IS NOT NULL
         </if>
         </if>
-        ORDER BY eur1.id DESC
     </select>
     </select>
 
 
     <select id="getDistributionOrder" resultType="com.jzg.commons.entity.vo.DistributionOrder">
     <select id="getDistributionOrder" resultType="com.jzg.commons.entity.vo.DistributionOrder">

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů