theFlyNeedProgressive 1 年間 前
親
コミット
c735ab3b81
92 ファイル変更、7154 行追加、186 行削除
  1. 4 0
      authentication/pom.xml
  2. 134 44
      authentication/src/main/java/com/jzg/controller/AuthController.java
  3. 2 2
      authentication/src/main/resources/application-dev.yml
  4. 10 2
      commons/pom.xml
  5. 1 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/CarInfoVo.java
  6. 5 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteResultsVo.java
  7. 2 2
      gateway/src/main/resources/application-dev.yml
  8. 2 2
      platform/src/main/resources/application-dev.yml
  9. 5 14
      pom.xml
  10. 2 2
      tenant/costsorrule/src/main/resources/application-dev.yml
  11. 2 1
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/build/BoHaiApiQuoteResultsVoBuild.java
  12. 12 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/component/BoHaiRequestApiComponent.java
  13. 3 1
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/BoHaiConfigureParameters.java
  14. 2 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/po/BoHaiApiOrder.java
  15. 58 5
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/response/GenerateOrderNoResponse.java
  16. 99 5
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/response/QuotationResponse.java
  17. 43 2
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/response/VehicleConfirmationResponse.java
  18. 21 2
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/response/VehicleTypeQueryResponse.java
  19. 15 5
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/properties/BohaiApiConfigurationProperties.java
  20. 22 6
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/BoHaiApiOrderService.java
  21. 3 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiOrderServiceImpl.java
  22. 35 7
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiRequestImpl.java
  23. 107 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/component/BoHaiCrawlerCacheComponent.java
  24. 39 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/component/BuildingAttributionInformation.java
  25. 58 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/constant/enums/RequestUrl.java
  26. 22 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/constant/enums/ResponseCode.java
  27. 72 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerAuthenticateRequest.java
  28. 77 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCarRequest.java
  29. 50 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerChannelPackagesRequest.java
  30. 25 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCheckTokenRequest.java
  31. 41 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCompaniesRequest.java
  32. 575 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerVehicleConfirmationReqeust.java
  33. 50 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/AcctinfoDTO.java
  34. 570 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/BusinessInsuranceDTO.java
  35. 60 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/CheckCarInfomationDTO.java
  36. 894 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/CompulsoryInsuranceDTO.java
  37. 323 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/DriveInsuranceDTO.java
  38. 17 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/EmptyObjectDTO.java
  39. 85 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/FlatvhlInfoDTO.java
  40. 284 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/PersonnelInformation.java
  41. 428 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/ProposalInfoDTO.java
  42. 284 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/VehicleInfoDTO.java
  43. 133 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/VehicleOwnerInfoDTO.java
  44. 48 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerAuthenticateResponse.java
  45. 32 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCaptchaResponse.java
  46. 241 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCarResponse.java
  47. 102 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerChannelPackagesResponse.java
  48. 41 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCheckTokenResponse.java
  49. 46 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCompaniesResponse.java
  50. 47 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerGetSaleInfoResponse.java
  51. 511 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerQuotationResponse.java
  52. 211 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerSaveResponse.java
  53. 68 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerVehicleConfirmationResponse.java
  54. 107 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/DESEncryption.java
  55. 28 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/CIKind.java
  56. 39 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/Deductible.java
  57. 54 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/PayCarType.java
  58. 33 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/ProductCode.java
  59. 23 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/Risk.java
  60. 23 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/TaxTypeYn.java
  61. 67 0
      tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/TicketNoType.java
  62. 1 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  63. 4 2
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/compoment/DaJiaApiRequestComponent.java
  64. 21 18
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/DaJiaApiConfigureParameters.java
  65. 42 3
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/DaJiaBaseRequest.java
  66. 1 1
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/po/DaJiaApiOrder.java
  67. 3 1
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/request/ODR1016Request.java
  68. 98 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/response/ODR1009Response.java
  69. 27 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/response/ODR1016Response.java
  70. 61 15
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/vo/PersonAreaVo.java
  71. 1 1
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/properties/DaJiaApiProperties.java
  72. 1 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/service/impl/DaJiaApiOrderServiceImpl.java
  73. 6 1
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/service/impl/DaJiaApiRequestImpl.java
  74. 16 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/DaJiaCrawlerActualValueRequest.java
  75. 13 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/DaJiaCrawlerChannelPackagesRequest.java
  76. 34 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/DaJiaCrawlerPriceRequest.java
  77. 46 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/quote/CompulsoryInsuranceDTO.java
  78. 150 5
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/quote/ProposalInfoDTO.java
  79. 9 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/response/DaJiaCrawlerAuthenticateResponse.java
  80. 55 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/response/DaJiaCrawlerCarResponse.java
  81. 12 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerQuoteProcessServiceImpl.java
  82. 131 25
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerRequestImpl.java
  83. 2 2
      tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml
  84. 1 0
      tenant/insurance/quotation-taikang/pom.xml
  85. 2 2
      tenant/insurance/quotation-taikang/src/test/java/com/jzg/quotation/taikang/crawler/TKHttpAPIServiceTest1.java
  86. 2 0
      tenant/insurance/quotation-yangguang/pom.xml
  87. 1 0
      tenant/insurance/quotation-zhongan/pom.xml
  88. 3 1
      tenant/insurance/quotation-zhongan/src/test/java/com/jzg/quotation/zhongan/crawler/service/ZhongAnAPIServiceTest.java
  89. 4 1
      tenant/openfeign/pom.xml
  90. 4 0
      tenant/openfeign/src/main/resources/application.yml
  91. 2 2
      tenant/organization/src/main/resources/application-dev.yml
  92. 4 4
      tenant/pom.xml

+ 4 - 0
authentication/pom.xml

@@ -6,10 +6,12 @@
         <artifactId>jzg</artifactId>
         <version>1.0-SNAPSHOT</version>
     </parent>
+
     <artifactId>authentication</artifactId>
     <packaging>jar</packaging>
     <name>authentication Maven Webapp</name>
     <url>http://maven.apache.org</url>
+
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -78,10 +80,12 @@
             <groupId>org.redisson</groupId>
             <artifactId>redisson-spring-boot-starter</artifactId>
         </dependency>
+
         <dependency>
             <groupId>org.redisson</groupId>
             <artifactId>redisson-spring-data-27</artifactId>
         </dependency>
+
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-crypto</artifactId>

+ 134 - 44
authentication/src/main/java/com/jzg/controller/AuthController.java

@@ -79,7 +79,7 @@ import java.util.regex.Pattern;
 /**
  * 授权接口
  */
-@Tag(name="授权接口")
+@Tag(name = "授权接口")
 @RestController
 @RequestMapping("/auth")
 @Slf4j
@@ -117,6 +117,13 @@ public class AuthController extends BaseController {
 
     /**
      * 登录接口
+     *
+     *      * 用户名/手机号+密码登录
+     *      * 请求方式/路径:POST /auth/login
+     *      * 入参:LoginFormVo(JSON Body)
+     *      * 返回:无(直接通过过滤器向响应写入登录结果与令牌)
+     *      * 注意:成功后在响应中返回认证信息,方法本身不返回 HttpResult
+     *
      * @param loginFormVo
      * @throws ServletException
      * @throws IOException
@@ -124,16 +131,16 @@ public class AuthController extends BaseController {
     @Operation(
             summary = "登录接口",
             description = "登录接口",
-    responses = {
-            @ApiResponse(responseCode = "200",description = "登录成功"),
-            @ApiResponse(responseCode = "403",description = "登录失败")
-    })
-
+            responses = {
+                    @ApiResponse(responseCode = "200", description = "登录成功"),
+                    @ApiResponse(responseCode = "403", description = "登录失败")
+            })
     @PostMapping("/login")
     @IgnoreTenant
     public void login(@RequestBody LoginFormVo loginFormVo) throws ServletException, IOException {
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
         HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+
         JzgUsernamePasswordAuthenticationToken authentication = new JzgUsernamePasswordAuthenticationToken(loginFormVo);
         Authentication authenticate = authenticationManager.authenticate(authentication);
         SecurityContextHolder.getContext().setAuthentication(authenticate);
@@ -141,20 +148,24 @@ public class AuthController extends BaseController {
         successHandler.onAuthenticationSuccess(request, response, authenticate);
     }
 
-
-
-
+    /**
+     * 获取图形验证码(按用户ID)
+     * 请求方式/路径:GET /auth/captchaById
+     * 入参:captchaId(Query 参数)
+     * 返回:直接向响应输出验证码图片(二进制)
+     * 注意:验证码文本存入 Redis,键:VERIFICATION_CODE + captchaId
+     */
     @GetMapping("captchaById")
-    @Operation(summary = "获取验证码通过用户ID",
-                description = "获取验证码通过用户ID")
+    @Operation(summary = "获取验证码通过用户ID", description = "获取验证码通过用户ID")
     public void captchaByIdNew(HttpServletResponse response, String captchaId) throws Exception {
         response.setHeader("Cache-Control", "no-store, no-cache");
         response.setContentType("image/jpeg");
         String text;
         String imageId = null;
-        if(Objects.isNull(redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId))) {
+        if (Objects.isNull(redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId))) {
             imageId = redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).get().toString();
         }
+        log.info("imageId:{}", imageId);
 
         Captcha captcha = new SpecCaptcha();
 
@@ -165,6 +176,7 @@ public class AuthController extends BaseController {
             // 生成文字验证码
             text = captcha.text();
         }
+        log.info("text:{}", text);
         // 生成图片验证码
         BufferedImage image = ImageUtil.base64ToBufferedImage(captcha.toBase64());
         if (StringUtils.isEmpty(captchaId)) {
@@ -172,16 +184,23 @@ public class AuthController extends BaseController {
         }
 
         // 保存到验证码到 redis
-        redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).set(text, 120, TimeUnit.SECONDS);
+        redissonClient.getBucket(RedisKeyConstants.VERIFICATION_CODE + captchaId).set(text, 24, TimeUnit.HOURS);
         ServletOutputStream out = response.getOutputStream();
         ImageIO.write(image, "jpg", out);
         IOUtils.closeQuietly(out);
     }
 
+    /**
+     * 发送短信验证码(注册/登录)
+     * 请求方式/路径:GET /auth/sendSmsCode
+     * 入参:mobile(Query 参数,11位手机号)
+     * 返回:HttpResult 文本提示
+     * 注意:验证码暂固定为 123456,存入 Redis,120 秒过期
+     */
     @GetMapping("sendSmsCode")
     @Operation(summary = "发送短信验证码")
-    public HttpResult sendSmsCode(String mobile){
-        if(mobile.isEmpty() && mobile.length() != 11){
+    public HttpResult sendSmsCode(String mobile) {
+        if (mobile.isEmpty() && mobile.length() != 11) {
             throw new SystemException("手机号格式错误");
         }
         //存储短信验证码
@@ -193,10 +212,17 @@ public class AuthController extends BaseController {
         return HttpResult.ok("验证码发送成功");
     }
 
+    /**
+     * 发送更换手机号的短信验证码
+     * 请求方式/路径:GET /auth/sendSmsCodeMobile
+     * 入参:mobile(Query 参数,11位手机号)
+     * 返回:HttpResult 文本提示
+     * 注意:验证码暂固定为 123456,存入 Redis,120 秒过期,键前缀为 SMS_REPLACE_MOBILE
+     */
     @GetMapping("sendSmsCodeMobile")
     @Operation(summary = "发送更换手机短信验证码")
-    public HttpResult sendSmsCodeMobile(String mobile){
-        if(mobile.isEmpty() && mobile.length() != 11){
+    public HttpResult sendSmsCodeMobile(String mobile) {
+        if (mobile.isEmpty() && mobile.length() != 11) {
             throw new SystemException("手机号格式错误");
         }
         //存储短信验证码
@@ -210,7 +236,14 @@ public class AuthController extends BaseController {
 
     @PostMapping("modifyPass")
     @Operation(summary = "修改密码")
-    public HttpResult modifyPass(@RequestBody ModifyPassWordFormVo modifyPassWordFormVo){
+    /**
+     * 修改当前登录用户密码
+     * 请求方式/路径:POST /auth/modifyPass
+     * 入参:ModifyPassWordFormVo(JSON Body)
+     * 返回:HttpResult 文本提示
+     * 校验:密码需 8-20 位且包含字母与数字;需校验旧密码
+     */
+    public HttpResult modifyPass(@RequestBody ModifyPassWordFormVo modifyPassWordFormVo) {
         String userName = getUserName();
         SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
                 .eq(SysUser::getUsername, userName)
@@ -220,26 +253,31 @@ public class AuthController extends BaseController {
         //检验密码
         String passwordPattern = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,20}$";
         Pattern pattern = Pattern.compile(passwordPattern);
-        if(!pattern.matcher(modifyPassWordFormVo.getNewPassWord()).matches()){
+        if (!pattern.matcher(modifyPassWordFormVo.getNewPassWord()).matches()) {
             throw new SystemException("密码格式错误");
         }
 
         //如果旧密码一致更改密码
-        if(!PasswordUtils.encode(modifyPassWordFormVo.getOldPassWord(),sysUser.getSalt()).equals(sysUser.getPassword()))
-        {
+        if (!PasswordUtils.encode(modifyPassWordFormVo.getOldPassWord(), sysUser.getSalt()).equals(sysUser.getPassword())) {
             throw new SystemException("旧密码错误");
         }
 
-        sysUser.setPassword(PasswordUtils.encode(modifyPassWordFormVo.getNewPassWord(),sysUser.getSalt()));
+        sysUser.setPassword(PasswordUtils.encode(modifyPassWordFormVo.getNewPassWord(), sysUser.getSalt()));
         return sysUserService.updateById(sysUser) ? HttpResult.ok("密码修改成功") : HttpResult.error("密码修改失败");
     }
 
+    /**
+     * 用户注册
+     * 请求方式/路径:POST /auth/register
+     * 入参:AppRegisterFormVo(JSON Body)
+     * 返回:HttpResult 文本提示
+     * 校验:手机号未注册;校验图形验证码(可选短信验证码)
+     */
     @PostMapping("register")
     @Operation(summary = "用户注册")
-    public HttpResult register(@RequestBody AppRegisterFormVo appRegisterFormVo){
-        SysUser userById = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
-                .eq(SysUser::getMobile, appRegisterFormVo.getMobile()));
-        AssertionUtils.isFail(Objects.nonNull(userById),"用户已注册,请直接登录");
+    public HttpResult register(@RequestBody AppRegisterFormVo appRegisterFormVo) {
+        SysUser userById = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getMobile, appRegisterFormVo.getMobile()));
+        AssertionUtils.isFail(Objects.nonNull(userById), "用户已注册,请直接登录");
         sysUserService.validateCode(appRegisterFormVo.getCaptchaId(), appRegisterFormVo.getCaptcha());
 //        sysUserService.validateSmsCode(appRegisterFormVo.getMobile(), appRegisterFormVo.getSmsCode());
         boolean register = sysUserService.register(appRegisterFormVo);
@@ -249,14 +287,21 @@ public class AuthController extends BaseController {
 
     @PostMapping("forgotPassword")
     @Operation(summary = "忘记密码")
-    public HttpResult forgotPassword(@RequestBody ForgotPasswordFormVo forgotPasswordFormVo){
-        if(forgotPasswordFormVo.getMobile().isEmpty() && forgotPasswordFormVo.getMobile().length()!= 11){
+    /**
+     * 忘记密码重设
+     * 请求方式/路径:POST /auth/forgotPassword
+     * 入参:ForgotPasswordFormVo(JSON Body)
+     * 返回:HttpResult 文本提示
+     * 校验:手机号格式;短信验证码
+     */
+    public HttpResult forgotPassword(@RequestBody ForgotPasswordFormVo forgotPasswordFormVo) {
+        if (forgotPasswordFormVo.getMobile().isEmpty() && forgotPasswordFormVo.getMobile().length() != 11) {
             throw new SystemException("手机号格式错误");
         }
 
         SysUser userById = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
                 .eq(SysUser::getMobile, forgotPasswordFormVo.getMobile()));
-        AssertionUtils.isFail(Objects.isNull(userById),"用户名不存在");
+        AssertionUtils.isFail(Objects.isNull(userById), "用户名不存在");
 
         //校验短信验证码
         sysUserService.validateSmsCode(forgotPasswordFormVo.getMobile(), forgotPasswordFormVo.getSmsCode());
@@ -266,7 +311,14 @@ public class AuthController extends BaseController {
 
     @PostMapping("logout")
     @Operation(summary = "退出登录")
-    public HttpResult logout(){
+    /**
+     * 退出登录
+     * 请求方式/路径:POST /auth/logout
+     * 入参:无(从请求头读取 Authorization)
+     * 返回:HttpResult 文本提示
+     * 注意:删除 Redis 中对应 token
+     */
+    public HttpResult logout() {
         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
         HttpServletRequest request = attributes.getRequest();
         String authorizationHeader = request.getHeader("Authorization");
@@ -276,7 +328,14 @@ public class AuthController extends BaseController {
 
     @PostMapping("cancel")
     @Operation(summary = "注销账号")
-    public HttpResult cancel(@RequestBody AppCancelFormVo appCancelFormVo){
+    /**
+     * 注销账号(物理删除 APP 侧账号并清空授权)
+     * 请求方式/路径:POST /auth/cancel
+     * 入参:AppCancelFormVo(JSON Body)
+     * 返回:HttpResult 文本提示
+     * 注意:校验短信验证码;删除 Redis token
+     */
+    public HttpResult cancel(@RequestBody AppCancelFormVo appCancelFormVo) {
         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
         HttpServletRequest request = attributes.getRequest();
         String authorizationHeader = request.getHeader("Authorization");
@@ -286,7 +345,7 @@ public class AuthController extends BaseController {
         // 物理删除app账号,清空授权登录信息
         SysUser userById = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
                 .eq(SysUser::getMobile, appCancelFormVo.getMobile()));
-        AssertionUtils.isFail(Objects.isNull(userById),"用户名不存在");
+        AssertionUtils.isFail(Objects.isNull(userById), "用户名不存在");
         SysUserJzgApp appUser = sysUserJzgAppMapper.selectOne(new LambdaQueryWrapper<SysUserJzgApp>()
                 .eq(SysUserJzgApp::getUserId, userById.getId()));
         appUser.setIsDelete(1);
@@ -299,19 +358,31 @@ public class AuthController extends BaseController {
 
     @PostMapping("changeHeadSculpture")
     @Operation(summary = "修改头像")
-    public HttpResult<String> changeHeadSculpture(@RequestSingleParam(value = "id") String id){
+    /**
+     * 修改头像
+     * 请求方式/路径:POST /auth/changeHeadSculpture
+     * 入参:id(表单或查询参数,上传文件记录ID)
+     * 返回:HttpResult<String>(头像访问的预签名 URL)
+     */
+    public HttpResult<String> changeHeadSculpture(@RequestSingleParam(value = "id") String id) {
         String userName = getUserName();
         SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>()
                 .eq(SysUser::getMobile, userName));
         sysUser.setHeadSculpture(id);
         SysUploadFiles sysUploadFiles = sysUploadFilesMapper.selectById(id);
         String jzgTouXiang = MinioUtils.getPresignedObjectUrl(bucketName, sysUploadFiles.getFileName());
-        return sysUserService.updateById(sysUser)? HttpResult.ok(jzgTouXiang) : HttpResult.error("头像修改失败");
+        return sysUserService.updateById(sysUser) ? HttpResult.ok(jzgTouXiang) : HttpResult.error("头像修改失败");
     }
 
     @PostMapping("getUsers")
     @Operation(summary = "用户列表")
-    public HttpResult getUsers(){
+    /**
+     * 获取用户列表(分页:当前固定每页10条,第1页)
+     * 请求方式/路径:POST /auth/getUsers
+     * 入参:无
+     * 返回:HttpResult(分页数据)
+     */
+    public HttpResult getUsers() {
         Page page = new Page();
         page.setSize(10);
         page.setPages(1);
@@ -320,36 +391,55 @@ public class AuthController extends BaseController {
 
     @Operation(summary = "获取用户权限标识")
     @GetMapping("/getUserPer")
-    public HttpResult<List<String>> getUserPer(){
+    /**
+     * 获取当前登录用户的权限标识集合
+     * 请求方式/路径:GET /auth/getUserPer
+     * 入参:无
+     * 返回:HttpResult<List<String>>(权限标识列表)
+     */
+    public HttpResult<List<String>> getUserPer() {
         List<String> userPerms = getUserPerms();
         return HttpResult.ok(userPerms);
     }
 
     @Operation(summary = "获取个人信息")
     @GetMapping("/getUserInfo")
-    public HttpResult<RedisToken> getUserInfo(){
+    /**
+     * 获取当前登录用户的个人信息
+     * 请求方式/路径:GET /auth/getUserInfo
+     * 入参:无
+     * 返回:HttpResult<RedisToken>(从 token 解析的用户信息)
+     */
+    public HttpResult<RedisToken> getUserInfo() {
         String userTokenString = getUserTokenString();
-        return HttpResult.ok(JSONObject.parseObject(userTokenString,RedisToken.class));
+        return HttpResult.ok(JSONObject.parseObject(userTokenString, RedisToken.class));
     }
 
     @Operation(summary = "公钥交换")
     @PostMapping("/publicKeyExchange")
+    /**
+     * 公钥交换(SM2):保存前端公钥并返回后端公钥
+     * 请求方式/路径:POST /auth/publicKeyExchange
+     * 入参:publicKey(表单或查询参数,前端 SM2 公钥)
+     * 返回:HttpResult(data 为后端 SM2 公钥 Hex)
+     * 注意:后端生成的私钥与前端公钥一起存入 Redis 以便后续加解密
+     */
     public HttpResult publicKeyExchange(@RequestSingleParam("publicKey") String publicKey) throws InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchProviderException {
         //redis 存储公钥
         JSONObject jsonObject = new JSONObject();
-        jsonObject.put("vueSm2PublicKey",publicKey);
+        jsonObject.put("vueSm2PublicKey", publicKey);
         //后端生成的SM2私钥
         SM2 sm2 = SmUtil.sm2();
         String sm2PrivateKeyHex = HexUtil.encodeHexStr(BCUtil.encodeECPrivateKey(sm2.getPrivateKey()));
-        if(sm2PrivateKeyHex.length() > 64){
-            sm2PrivateKeyHex = sm2PrivateKeyHex.substring(2,sm2PrivateKeyHex.length());
+        if (sm2PrivateKeyHex.length() > 64) {
+            sm2PrivateKeyHex = sm2PrivateKeyHex.substring(2, sm2PrivateKeyHex.length());
         }
         String sm2PublicKeyHex = HexUtil.encodeHexStr(((BCECPublicKey) sm2.getPublicKey()).getQ().getEncoded(false));
-        jsonObject.put("javaSm2PrivateKey",sm2PrivateKeyHex);
+        jsonObject.put("javaSm2PrivateKey", sm2PrivateKeyHex);
         redissonClient.getBucket(EncryptionConstants.SM2_PUBLIC_KEY_REDIS + "admin").set(jsonObject.toJSONString());
         System.out.printf("SM2公钥:" + sm2PublicKeyHex + "\n");
-        System.out.printf("SM2私钥:" + sm2PrivateKeyHex  + "\n");
-        return HttpResult.ok("success",sm2PublicKeyHex);
+        System.out.printf("SM2私钥:" + sm2PrivateKeyHex + "\n");
+        return HttpResult.ok("success", sm2PublicKeyHex);
     }
 
 

+ 2 - 2
authentication/src/main/resources/application-dev.yml

@@ -10,10 +10,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
         group: DEFAULT_GROUP
       discovery:
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
   config:
     import:
       - nacos:mysql

+ 10 - 2
commons/pom.xml

@@ -6,12 +6,13 @@
         <artifactId>jzg</artifactId>
         <version>1.0-SNAPSHOT</version>
     </parent>
+
     <artifactId>commons</artifactId>
     <packaging>jar</packaging>
     <name>commons Maven Webapp</name>
     <url>http://maven.apache.org</url>
-    <dependencies>
 
+    <dependencies>
         <!-- Spring Boot Starter Web -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -44,14 +45,17 @@
             <groupId>org.redisson</groupId>
             <artifactId>redisson-spring-boot-starter</artifactId>
         </dependency>
+
         <dependency>
             <groupId>org.redisson</groupId>
             <artifactId>redisson-spring-data-27</artifactId>
         </dependency>
+
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-extension</artifactId>
         </dependency>
+
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-core</artifactId>
@@ -62,6 +66,7 @@
             <artifactId>minio</artifactId>
             <version>${minio.version}</version>
         </dependency>
+
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>easyexcel-core</artifactId>
@@ -69,7 +74,6 @@
             <scope>compile</scope>
         </dependency>
 
-
         <dependency>
             <groupId>org.reflections</groupId>
             <artifactId>reflections</artifactId>
@@ -87,17 +91,20 @@
             <artifactId>httpclient5</artifactId>
             <version>5.2.1</version> <!-- 请使用最新版本 -->
         </dependency>
+
         <!--读取pdf-->
         <dependency>
             <groupId>org.apache.pdfbox</groupId>
             <artifactId>pdfbox</artifactId>
             <version>2.0.28</version>
         </dependency>
+
         <dependency>
             <groupId>net.lingala.zip4j</groupId>
             <artifactId>zip4j</artifactId>
             <version>1.3.2</version>
         </dependency>
+
         <dependency>
             <groupId>javax.validation</groupId>
             <artifactId>validation-api</artifactId>
@@ -105,6 +112,7 @@
             <scope>compile</scope>
         </dependency>
     </dependencies>
+
     <build>
         <plugins>
             <plugin>

+ 1 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/CarInfoVo.java

@@ -158,6 +158,7 @@ public class CarInfoVo implements Serializable {
 
     @Schema(description = "号牌颜色名称")
     private String licenseColorName;
+
     /**
      * @see CarKindDetailIdCode
      * 车种明细

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteResultsVo.java

@@ -45,6 +45,7 @@ public class QuoteResultsVo implements Serializable {
     private List<KindInfoVo> kindInfoVo;
 
     private List<TaxInfoVo> taxVo;
+
     /**
      * 费用因子
      */
@@ -111,11 +112,15 @@ public class QuoteResultsVo implements Serializable {
      * 费用不符合描述
      */
     private String feeNoDescription;
+
     /**
      * 错误提示
      */
     private String errorMessage;
 
+    /**
+     * 评分VO
+     */
     @Data
     @AllArgsConstructor
     @NoArgsConstructor

+ 2 - 2
gateway/src/main/resources/application-dev.yml

@@ -13,10 +13,10 @@ spring:
         import-check:
           enabled: false
         file-extension: yaml
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
         group: DEFAULT_GROUP
       discovery:
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
 
     gateway:
       routes:

+ 2 - 2
platform/src/main/resources/application-dev.yml

@@ -8,10 +8,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
         group: DEFAULT_GROUP
       discovery:
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
   config:
     import:
       - nacos:mysql

+ 5 - 14
pom.xml

@@ -1,10 +1,12 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
+
   <groupId>com.jzg</groupId>
   <artifactId>jzg</artifactId>
   <version>1.0-SNAPSHOT</version>
   <name>jzg Maven Webapp</name>
+
   <modules>
     <module>authentication</module>
     <module>commons</module>
@@ -43,8 +45,6 @@
 
 
   <dependencies>
-
-
     <!-- Spring Boot Starter Test -->
     <dependency>
       <groupId>org.springframework.boot</groupId>
@@ -94,11 +94,10 @@
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
     </dependency>
-
   </dependencies>
+
   <dependencyManagement>
     <dependencies>
-
       <dependency>
         <groupId>com.alibaba.cloud</groupId>
         <artifactId>spring-cloud-alibaba-dependencies</artifactId>
@@ -107,7 +106,6 @@
         <scope>import</scope>
       </dependency>
 
-
       <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-openfeign</artifactId>
@@ -138,6 +136,7 @@
         <artifactId>redisson-spring-boot-starter</artifactId>
         <version>${redisson.version}</version>
       </dependency>
+
       <dependency>
         <groupId>org.redisson</groupId>
         <artifactId>redisson-spring-data-27</artifactId>
@@ -157,19 +156,12 @@
         <version>3.0.0</version>
       </dependency>
 
-      <dependency>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-starter-webflux</artifactId>
-      </dependency>
-
-
-
       <!-- 数据库驱动,如 MySQL -->
       <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
-        <scope>runtime</scope>
         <version>${mysql.connect.version}</version>
+        <scope>runtime</scope>
       </dependency>
 
       <dependency>
@@ -238,7 +230,6 @@
         <artifactId>rocketmq</artifactId>
         <version>${rocket.version}</version>
       </dependency>
-
     </dependencies>
   </dependencyManagement>
 

+ 2 - 2
tenant/costsorrule/src/main/resources/application-dev.yml

@@ -8,10 +8,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
         group: DEFAULT_GROUP
       discovery:
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
   config:
     import:
       - nacos:mysql

+ 2 - 1
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/build/BoHaiApiQuoteResultsVoBuild.java

@@ -18,6 +18,7 @@ import java.util.stream.Collectors;
  * @date: 2025/3/4 14:34
  **/
 public class BoHaiApiQuoteResultsVoBuild {
+
     public static QuoteResultsVo buildQuoteResultsVo(String orderNo, QuoteVo quoteVo, QuotationResponse quotationResponse) {
         QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
         quoteResultsVo.setOrdersNo(orderNo);
@@ -112,7 +113,7 @@ public class BoHaiApiQuoteResultsVoBuild {
     /**
      * 处理报价失败结果
      * @param boHaiQuoteResponse
-     * @return
+     * @return QuoteResultsVo
      */
     public static QuoteResultsVo buildQuoteFailResultsVo(QuotationResponse boHaiQuoteResponse) {
         QuoteResultsVo quoteResultsVo = new QuoteResultsVo();

+ 12 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/component/BoHaiRequestApiComponent.java

@@ -41,6 +41,18 @@ public class BoHaiRequestApiComponent {
 
     private final RestTemplate restTemplate;
 
+    /**
+     *
+     * @param url
+     * @param requestBody
+     * @param responseType
+     * @param sysSourceCode
+     * @param requestType
+     * @return
+     * @param <T>
+     * @param <B>
+     * @throws Exception
+     */
     public <T extends BoHaiBaseRequest, B extends BoHaiBaseResponse> B requestUrl(String url, T requestBody, Class<B> responseType, String sysSourceCode, RequestType requestType) throws Exception {
         requestBody.setBaseParamRequestType(requestType.getCode());
         HttpHeaders httpHeaders = new HttpHeaders();

+ 3 - 1
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/BoHaiConfigureParameters.java

@@ -11,7 +11,9 @@ import lombok.Data;
 @Data
 public class BoHaiConfigureParameters implements ConfigureParameters {
 
-    // 合作方代码
+    /**
+     * 合作方代码
+     */
     private String sysSourceCode;
 
     // 二级机构编码

+ 2 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/po/BoHaiApiOrder.java

@@ -16,8 +16,10 @@ import org.springframework.data.mongodb.core.mapping.Document;
 @Data
 @Document("bohai.api.order")
 public class BoHaiApiOrder {
+
     @Id
     private String id;
+
     /**
      * 交互唯一订单 OrderBase类的ordersNo
      */

+ 58 - 5
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/response/GenerateOrderNoResponse.java

@@ -8,10 +8,45 @@ import lombok.NoArgsConstructor;
 import java.io.Serial;
 
 /**
- * @description: todo
- * @author: shenwd
- * @date: 2025/3/3 16:24
- **/
+ * 渤海保险生成订单号响应实体类
+ * <p>
+ * 该类用于接收渤海保险API生成订单号接口(Z00002)的响应数据。
+ * 订单号是后续报价、核保、支付等业务流程的重要标识符。
+ * </p>
+ * 
+ * <p><b>API接口信息:</b></p>
+ * <ul>
+ *   <li>接口编码:Z00002</li>
+ *   <li>接口名称:生成订单号</li>
+ *   <li>请求方式:POST</li>
+ *   <li>业务场景:在车险报价流程开始前,需要先生成唯一的订单号</li>
+ * </ul>
+ * 
+ * <p><b>响应数据结构:</b></p>
+ * <pre>
+ * {
+ *   "responseCode": "Z00001",
+ *   "responseMsg": "成功",
+ *   "data": {
+ *     "orderNo": "BH202503030001"
+ *   }
+ * }
+ * </pre>
+ * 
+ * <p><b>使用示例:</b></p>
+ * <pre>
+ * GenerateOrderNoRequest request = new GenerateOrderNoRequest(parameters);
+ * GenerateOrderNoResponse response = boHaiRequestApiComponent.generateOrderNo(request, sysSourceCode, url);
+ * String orderNo = response.getData().getOrderNo();
+ * </pre>
+ * 
+ * @author shenwd
+ * @date 2025/3/3 16:24
+ * @version 1.0
+ * @see BoHaiBaseResponse 基础响应类
+ * @see com.jzg.quotation.bohai.api.entity.request.GenerateOrderNoRequest 对应的请求类
+ * @see com.jzg.quotation.bohai.api.constant.enums.RequestType#Z00002 请求类型枚举
+ */
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @Data
@@ -19,15 +54,33 @@ public class GenerateOrderNoResponse extends BoHaiBaseResponse {
 
     @Serial
     private static final long serialVersionUID = 8333642936965912523L;
+    
+    /**
+     * 响应数据对象
+     * 包含生成的订单号信息
+     */
     @JsonProperty("data")
     private DataDTO data;
 
+    /**
+     * 响应数据传输对象
+     * <p>
+     * 封装了渤海保险生成订单号接口返回的具体业务数据。
+     * 该内部类遵循DTO设计模式,专门用于数据传输。
+     * </p>
+     */
     @NoArgsConstructor
     @Data
     public static class DataDTO {
 
+        /**
+         * 渤海保险订单号
+         * <p>
+         * 由渤海保险系统生成的唯一订单标识符,用于标识整个保险业务流程。
+         * 该订单号将在后续的车型查询、车辆确认、报价、核保、支付等环节中使用。
+         * </p>
+         */
         @JsonProperty("orderNo")
         private String orderNo;
     }
-
 }

+ 99 - 5
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/response/QuotationResponse.java

@@ -10,10 +10,11 @@ import java.io.Serializable;
 import java.util.List;
 
 /**
- * @description: todo
+ * 渤海保险报价响应实体
+ * 
  * @author: shenwd
  * @date: 2025/3/4 08:41
- **/
+ */
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @Data
@@ -21,9 +22,14 @@ public class QuotationResponse extends BoHaiBaseResponse {
 
     @Serial
     private static final long serialVersionUID = -7074383106771349265L;
+
+    /** 响应数据 */
     @JsonProperty("data")
     private DataDTO data;
 
+    /**
+     * 报价数据传输对象
+     */
     @NoArgsConstructor
     @Data
     public static class DataDTO implements Serializable {
@@ -132,6 +138,7 @@ public class QuotationResponse extends BoHaiBaseResponse {
             @JsonProperty("plateNo")
             private String plateNo;
 
+            /** 车牌颜色 */
             @JsonProperty("plateColor")
             private String plateColor;
 
@@ -155,6 +162,7 @@ public class QuotationResponse extends BoHaiBaseResponse {
 
             @Serial
             private static final long serialVersionUID = -4953589376949080420L;
+            /** 车主姓名 */
             @JsonProperty("ownerName")
             private String ownerName;
 
@@ -169,30 +177,50 @@ public class QuotationResponse extends BoHaiBaseResponse {
              */
             @JsonProperty("certNo")
             private String certNo;
+            /** 手机号码 */
             @JsonProperty("phoneNumber")
             private String phoneNumber;
+            
+            /** 邮箱地址 */
             @JsonProperty("email")
             private String email;
+            
+            /** 联系地址 */
             @JsonProperty("address")
             private String address;
         }
 
+        /**
+         * 投保人信息数据传输对象
+         */
         @NoArgsConstructor
         @Data
         public static class HolderDTO implements Serializable {
 
             @Serial
             private static final long serialVersionUID = -8424986900592324029L;
+            
+            /** 投保人姓名 */
             @JsonProperty("holderName")
             private String holderName;
+            
+            /** 证件类型 */
             @JsonProperty("certType")
             private String certType;
+            
+            /** 证件号码 */
             @JsonProperty("certNo")
             private String certNo;
+            
+            /** 手机号码 */
             @JsonProperty("phoneNumber")
             private String phoneNumber;
+            
+            /** 邮箱地址 */
             @JsonProperty("email")
             private String email;
+            
+            /** 联系地址 */
             @JsonProperty("address")
             private String address;
 
@@ -215,26 +243,44 @@ public class QuotationResponse extends BoHaiBaseResponse {
             private String forceFormatType;
         }
 
+        /**
+         * 被保险人信息数据传输对象
+         */
         @NoArgsConstructor
         @Data
         public static class InsurederDTO implements Serializable {
 
             @Serial
             private static final long serialVersionUID = 8204617214215277369L;
+            
+            /** 被保险人姓名 */
             @JsonProperty("insuredName")
             private String insuredName;
+            
+            /** 证件类型 */
             @JsonProperty("certType")
             private String certType;
+            
+            /** 证件号码 */
             @JsonProperty("certNo")
             private String certNo;
+            
+            /** 手机号码 */
             @JsonProperty("phoneNumber")
             private String phoneNumber;
+            
+            /** 邮箱地址 */
             @JsonProperty("email")
             private String email;
+            
+            /** 联系地址 */
             @JsonProperty("address")
             private String address;
         }
 
+        /**
+         * 商业险保单信息数据传输对象
+         */
         @NoArgsConstructor
         @Data
         public static class BusinessPolicyDTO implements Serializable {
@@ -275,49 +321,66 @@ public class QuotationResponse extends BoHaiBaseResponse {
              */
             @JsonProperty("sumInsurd")
             private String sumInsurd;
+            /** 保险起期 */
             @JsonProperty("startDate")
             private String startDate;
+            
+            /** 保险止期 */
             @JsonProperty("endDate")
             private String endDate;
 
-            // 2024-11-18 新增商业险维度编码
+            /** 商业险维度编码 */
             @JsonProperty("dimenSionCode")
             private String dimenSionCode;
 
-            //  add by hxl  2024-04-07
+            /** 错误信息 */
             @JsonProperty("errorMsg")
             private String errorMsg;
 
+            /** 浮动费率选项 */
             @JsonProperty("floatingRateOption")
             private FloatingRateOptionDTO floatingRateOption;
 
 
+            /**
+             * 浮动费率选项数据传输对象
+             */
             @NoArgsConstructor
             @Data
             public static class FloatingRateOptionDTO implements Serializable {
 
                 @Serial
                 private static final long serialVersionUID = 4212441794484941902L;
+                
+                /** 最大浮动费率 */
                 @JsonProperty("maxFloatingRate")
                 private String maxFloatingRate;
 
+                /** 最小浮动费率 */
                 @JsonProperty("minFloatingRate")
                 private String minFloatingRate;
 
+                /** 浮动费率 */
                 @JsonProperty("floatingRate")
                 private String floatingRate;
 
+                /** 无赔款优待费率 */
                 @JsonProperty("nonClaimDiscountRate")
                 private String nonClaimDiscountRate	;
 
+                /** 交通违法费率 */
                 @JsonProperty("trafficTransgressRate")
                 private String trafficTransgressRate;
 
+                /** 调整系数 */
                 @JsonProperty("adjustFactor")
                 private String adjustFactor;
             }
 
 
+            /**
+             * 险别信息数据传输对象
+             */
             @NoArgsConstructor
             @Data
             public static class CoveragesDTO implements Serializable {
@@ -335,6 +398,7 @@ public class QuotationResponse extends BoHaiBaseResponse {
                  */
                 @JsonProperty("coverageName")
                 private String coverageName;
+                /** 是否投保不计免赔 */
                 @JsonProperty("isNonDeductionCovered")
                 private String isNonDeductionCovered;
 
@@ -349,24 +413,34 @@ public class QuotationResponse extends BoHaiBaseResponse {
                  */
                 @JsonProperty("premium")
                 private String premium;
+                /** 浮动费率 */
                 @JsonProperty("floatingRate")
                 private String floatingRate;
             }
 
+            /**
+             * 特别约定条款数据传输对象
+             */
             @NoArgsConstructor
             @Data
             public static class SpecialTermItemsDTO implements Serializable {
 
                 @Serial
                 private static final long serialVersionUID = -696978603455134076L;
+                
+                /** 特别约定代码 */
                 @JsonProperty("specialTermCode")
                 private String specialTermCode;
 
+                /** 特别约定内容 */
                 @JsonProperty("specialTermText")
                 private String specialTermText;
             }
         }
 
+        /**
+         * 交强险保单信息数据传输对象
+         */
         @NoArgsConstructor
         @Data
         public static class TrafficPolicyDTO implements Serializable {
@@ -403,16 +477,21 @@ public class QuotationResponse extends BoHaiBaseResponse {
             @JsonProperty("vehicleTax")
             private VehicleTaxDTO vehicleTax;
 
+            /** 保险起期 */
             @JsonProperty("startDate")
             private String startDate;
 
+            /** 保险止期 */
             @JsonProperty("endDate")
             private String endDate;
 
-            // 2024-11-18 新增交强险维度编码
+            /** 交强险维度编码 */
             @JsonProperty("dimenSionCode")
             private String dimenSionCode;
 
+            /**
+             * 车船税信息数据传输对象
+             */
             @NoArgsConstructor
             @Data
             public static class VehicleTaxDTO implements Serializable {
@@ -468,39 +547,54 @@ public class QuotationResponse extends BoHaiBaseResponse {
             }
         }
 
+        /**
+         * 转保问题检查信息数据传输对象
+         */
         @NoArgsConstructor
         @Data
         public static class CheckInfoDTO implements Serializable {
 
             @Serial
             private static final long serialVersionUID = -7310260036900373077L;
+            
+            /** 回答标识 */
             @JsonProperty("answerFlag")
             private String answerFlag;
 
+            /** 检查代码 */
             @JsonProperty("checkCode")
             private String checkCode;
 
+            /** 问题内容 */
             @JsonProperty("question")
             private String question;
 
+            /** 是否交强险问题 */
             @JsonProperty("isTrafficQuestion")
             private String isTrafficQuestion;
 
         }
 
 
+        /**
+         * 财意险保费信息数据传输对象
+         */
         @NoArgsConstructor
         @Data
         public static class UnAutoPremiumDTO implements Serializable {
 
             @Serial
             private static final long serialVersionUID = -6416113416581494822L;
+            
+            /** 总保费 */
             @JsonProperty("premium")
             private String premium;
 
+            /** 财产险保费 */
             @JsonProperty("propertyPremium")
             private String propertyPremium;
 
+            /** 意外险保费 */
             @JsonProperty("casualtyPremium")
             private String casualtyPremium;
 

+ 43 - 2
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/response/VehicleConfirmationResponse.java

@@ -8,58 +8,99 @@ import java.io.Serial;
 import java.util.List;
 
 /**
- * @description: 车辆确认 返回数据
+ * 渤海保险车辆确认响应实体
+ * 
  * @author: shenwd
  * @date: 2025/3/3 16:52
- **/
+ */
 @NoArgsConstructor
 @Data
 public class VehicleConfirmationResponse extends BoHaiBaseResponse {
 
     @Serial
     private static final long serialVersionUID = -1117358781373926565L;
+    
+    /** 响应数据 */
     @JsonProperty("data")
     private DataDTO data;
 
+    /**
+     * 车辆确认数据传输对象
+     */
     @NoArgsConstructor
     @Data
     public static class DataDTO {
+        /** 车型列表 */
         @JsonProperty("vehicleModels")
         private List<VehicleModelsDTO> vehicleModels;
 
+        /**
+         * 车型信息数据传输对象
+         */
         @NoArgsConstructor
         @Data
         public static class VehicleModelsDTO {
+            /** 车系代码 */
             @JsonProperty("familyCode")
             private String familyCode;
+            
+            /** 车系名称 */
             @JsonProperty("familyName")
             private String familyName;
+            
+            /** 发动机排量 */
             @JsonProperty("engineCapacity")
             private String engineCapacity;
+            
+            /** 车型别名 */
             @JsonProperty("vehicleAlias")
             private String vehicleAlias;
+            
+            /** 新车指导价 */
             @JsonProperty("purchasePrice")
             private String purchasePrice;
+            
+            /** 车型名称 */
             @JsonProperty("moldName")
             private String moldName;
+            
+            /** 座位数 */
             @JsonProperty("seatCount")
             private String seatCount;
+            
+            /** 车型特征码 */
             @JsonProperty("moldCharacterCode")
             private String moldCharacterCode;
+            
+            /** 产地 */
             @JsonProperty("producingArea")
             private String producingArea;
+            
+            /** 品牌名称 */
             @JsonProperty("vehicleBrand")
             private String vehicleBrand;
+            
+            /** 年份 */
             @JsonProperty("yearPattern")
             private String yearPattern;
+            
+            /** 整备质量 */
             @JsonProperty("emptyWeight")
             private String emptyWeight;
+            
+            /** 载重量 */
             @JsonProperty("carryingCapacity")
             private Object carryingCapacity;
+            
+            /** 交强险免赔代码 */
             @JsonProperty("deductionDueCodeJY")
             private String deductionDueCodeJY;
+            
+            /** 燃料类型 */
             @JsonProperty("fuelType")
             private String fuelType;
+            
+            /** 当前价值 */
             @JsonProperty("currentValue")
             private String currentValue;
         }

+ 21 - 2
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/entity/response/VehicleTypeQueryResponse.java

@@ -12,10 +12,11 @@ import java.io.Serializable;
 import java.util.List;
 
 /**
- * @description:
+ * 渤海保险车型查询响应实体
+ * 
  * @author: shenwd
  * @date: 2025/3/3 16:30
- **/
+ */
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
 @Data
@@ -23,9 +24,14 @@ public class VehicleTypeQueryResponse extends BoHaiBaseResponse {
 
     @Serial
     private static final long serialVersionUID = 8820284696823147297L;
+    
+    /** 响应数据 */
     @JsonProperty("data")
     private DataDTO data;
 
+    /**
+     * 车型查询数据传输对象
+     */
     @NoArgsConstructor
     @Data
     public static class DataDTO implements Serializable {
@@ -44,12 +50,16 @@ public class VehicleTypeQueryResponse extends BoHaiBaseResponse {
         @JsonProperty("vehicleModels")
         private List<VehicleModelsDTO> vehicleModels;
 
+        /**
+         * 车型信息数据传输对象
+         */
         @NoArgsConstructor
         @Data
         public static class VehicleModelsDTO implements Serializable, CarModelsFilter {
 
             private static final long serialVersionUID = -8338971802644830464L;
 
+            /** 车型特征码 */
             @JsonProperty("moldCharacterCode")
             private String moldCharacterCode;
 
@@ -89,9 +99,11 @@ public class VehicleTypeQueryResponse extends BoHaiBaseResponse {
             @JsonProperty("emptyWeight")
             private String emptyWeight;
 
+            /** 载重量 */
             @JsonProperty("carryingCapacity")
             private String carryingCapacity;
 
+            /** 发动机排量 */
             @JsonProperty("engineCapacity")
             private String engineCapacity;
 
@@ -107,9 +119,11 @@ public class VehicleTypeQueryResponse extends BoHaiBaseResponse {
             @JsonProperty("yearPattern")
             private String yearPattern;
 
+            /** 排量 */
             @JsonProperty("exhaustMeasure")
             private String exhaustMeasure;
 
+            /** 车辆型号编码 */
             @JsonProperty("vehicleModelCode")
             private String vehicleModelCode;
 
@@ -123,6 +137,11 @@ public class VehicleTypeQueryResponse extends BoHaiBaseResponse {
                 return yearPattern;
             }
 
+            /**
+             * 转换为核心车型VO对象
+             * 
+             * @return 核心车型VO
+             */
             public CoreModelsVo toCoreModelsVo(){
                 CoreModelsVo coreModelsVo = new CoreModelsVo();
                 coreModelsVo.setModelCode(this.getModelCode());

+ 15 - 5
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/properties/BohaiApiConfigurationProperties.java

@@ -14,19 +14,29 @@ import org.springframework.stereotype.Component;
 @ConfigurationProperties(prefix = "bohai.api")
 public class BohaiApiConfigurationProperties {
 
-    // 请求地址
+    /**
+     * 请求地址
+     */
     private String url;
 
-    // 我司公钥
+    /**
+     * 我司公钥
+     */
     private String selfPublicKey;
 
-    // 我司私钥
+    /**
+     * 我司私钥
+     */
     private String selfPrivateKey;
 
-    // 渤海方公钥
+    /**
+     * 渤海方公钥
+     */
     private String boHaiPublicKey;
 
-    // 合作方代码,由渤海分配
+    /**
+     * 合作方代码,由渤海分配
+     */
     private String insurerCode;
 
 

+ 22 - 6
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/BoHaiApiOrderService.java

@@ -6,13 +6,29 @@ import com.jzg.quotation.bohai.api.entity.response.QuotationResponse;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 
 /**
- * @description: 渤海财险 mongodb操作数据
- * @author: shenwd
- * @date: 2025/3/6 11:27
- **/
+ * 渤海保险订单服务接口
+ * 负责订单数据的MongoDB存储和查询操作
+ * 
+ * @author shenwd
+ * @date 2025/3/6 11:27
+ */
 public interface BoHaiApiOrderService {
-    void save(QuoteVo quoteVo, QuotationResponse response, GenerateOrderNoResponse generateOrderNoResponse,  boolean quoteSuccess);
+    
+    /**
+     * 保存报价订单信息
+     * 
+     * @param quoteVo 报价请求对象
+     * @param response 报价响应对象
+     * @param generateOrderNoResponse 订单号生成响应
+     * @param quoteSuccess 报价是否成功
+     */
+    void save(QuoteVo quoteVo, QuotationResponse response, GenerateOrderNoResponse generateOrderNoResponse, boolean quoteSuccess);
 
+    /**
+     * 根据订单号查询订单信息
+     * 
+     * @param ordersNo 系统订单号
+     * @return 渤海保险订单对象,不存在时返回null
+     */
     BoHaiApiOrder findByOrdersNo(String ordersNo);
-
 }

+ 3 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiOrderServiceImpl.java

@@ -21,8 +21,11 @@ public class BoHaiApiOrderServiceImpl implements BoHaiApiOrderService {
     private final BoHaiApiOrderRepository bohaiApiOrderRepository;
 
     /**
+     * 保存报价订单信息
      * @param quoteVo
      * @param response
+     * @param generateOrderNoResponse
+     * @param quoteSuccess 报价成功标识
      */
     @Override
     public void save(QuoteVo quoteVo, QuotationResponse response, GenerateOrderNoResponse generateOrderNoResponse, boolean quoteSuccess) {

+ 35 - 7
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/api/service/impl/BoHaiApiRequestImpl.java

@@ -62,10 +62,11 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
      * @return
      */
     private QuotationResponse repeatQuote(QuotationRequest quotationRequest,String sysSourceCode,List<KindInfoVo> kindList,QuotationResponse quotationResponse,String url) throws Exception {
+        //1、执行报价
         quotationResponse = boHaiRequestApiComponent.quotation(quotationRequest, sysSourceCode,url);
 
-        List<KindInfoVo> collect =
-                kindList.stream().filter(x -> InsuranceRisk.BUSINESS.getCode().equals(x.getKindCode())).toList();
+        //2、处理商业险重复投保
+        List<KindInfoVo> collect = kindList.stream().filter(x -> InsuranceRisk.BUSINESS.getCode().equals(x.getKindCode())).toList();
         if (!collect.isEmpty()) {
             if (ResponseCode.R_Z00001.getCode().equals(quotationResponse.getResponseCode()) && quotationResponse.getData().getBusinessPolicy().getErrorMsg() != null) {
                 String errorMsg = quotationResponse.getData().getBusinessPolicy().getErrorMsg();
@@ -87,6 +88,8 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
                 }
             }
         }
+
+        //处理交强险重复投保(类似逻辑)
         if (ResponseCode.R_Z00004.getCode().equals(quotationResponse.getResponseCode())) {
             String responseMsg = quotationResponse.getResponseMsg();
             if (responseMsg.contains("发生重复投保")) {
@@ -110,6 +113,14 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
         }
         return quotationResponse;
     }
+
+
+    /**
+     * 报价
+     * @param quoteVo 报价实体
+     * @return QuoteResultsVo
+     * @throws Exception
+     */
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) throws Exception {
         OrderBase order = quoteVo.getOrder();
@@ -117,22 +128,24 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
         //配置信息
         String url = getApiUrl(order.getInsuranceCompanyId());
         BoHaiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(BoHaiConfigureParameters.class, attributionInformationVo.getConfigInfo());
+
         // 生成订单号
         GenerateOrderNoRequest generateOrderNoRequest = new GenerateOrderNoRequest(parameters);
         GenerateOrderNoResponse generateOrderNoResponse;
         try {
-            generateOrderNoResponse = boHaiRequestApiComponent.generateOrderNo(generateOrderNoRequest,
-                    parameters.getSysSourceCode(),url);
+            generateOrderNoResponse = boHaiRequestApiComponent.generateOrderNo(generateOrderNoRequest, parameters.getSysSourceCode(),url);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
         String orderNo = generateOrderNoResponse.getData().getOrderNo();
+
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
         // 车辆型号截去汉字
         String brandName = carInfoVo.getBrandName();
         String processedName = brandName.replaceAll("[\\u4e00-\\u9fa5]", "");
         //查询车辆
         VehicleTypeQueryRequest vehicleTypeQueryRequest = new VehicleTypeQueryRequest(parameters, processedName, orderNo);
+
         // 调用 车辆查询和车辆确认接口
         Map<String, Object> map = new HashMap<>();
         try {
@@ -140,9 +153,11 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
+
         //调用车型号查询可能会出现多条数据,导致车辆确认报错  ESB车型及纯风险保费查询服务返回错误信息_选择车辆的行业车型编码(BBWABBUA0005)在平台不存在!请使用正确的行业车型编码(BBWABBUB0007)"
-        //通过报错信息截取出正确的行业车型编
+        //通过报错信息截取出正确的行业车型编码
         VehicleConfirmationResponse vehicleConfirmationResponse = (VehicleConfirmationResponse) map.get("vehicleConfirmationResponse");
+
         if (ResponseCode.R_Z00004.getCode().equals(vehicleConfirmationResponse.getResponseCode())) {
             String responseMsg = vehicleConfirmationResponse.getResponseMsg();
             if (responseMsg.contains("行业车型编码")) {
@@ -153,8 +168,7 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
                 // 重新调用 车辆查询和车辆确认接口
                 Map<String, Object> map_two = null;
                 try {
-                    map_two = getVehicleConfirmationResponse(quoteVo, parameters, carInfoVo, orderNo,
-                            vehicleTypeQueryRequest,url);
+                    map_two = getVehicleConfirmationResponse(quoteVo, parameters, carInfoVo, orderNo, vehicleTypeQueryRequest,url);
                 } catch (Exception e) {
                     throw new SystemException(e.getMessage());
                 }
@@ -169,15 +183,18 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
         // 4. 报价接口
         String discount = "";// 折扣待补充
         List<AccidentalDrivingVo> accidentVos = quoteVo.getAccidentalDrivings();//驾意险待处理
+        //构建报价请求
         QuotationRequest quotationRequest = new QuotationRequest(parameters, quoteVo, currentValue, orderNo, accidentVos, discount);
 
         //报价接口递归调用
         QuotationResponse quotationResponse = repeatQuote(quotationRequest,parameters.getSysSourceCode(),quoteVo.getKindInfoVo(),null, url);
+
         //处理报价失败
         if(!ResponseCode.R_Z00001.getCode().equals(quotationResponse.getResponseCode())) {
             boHaiApiOrderService.save(quoteVo, quotationResponse, generateOrderNoResponse,false);
             return BoHaiApiQuoteResultsVoBuild.buildQuoteFailResultsVo(quotationResponse);
         } else {
+            //报价成功
             boHaiApiOrderService.save(quoteVo, quotationResponse, generateOrderNoResponse,true);
             return BoHaiApiQuoteResultsVoBuild.buildQuoteResultsVo(order.getOrdersNo(), quoteVo, quotationResponse);
         }
@@ -364,6 +381,17 @@ public class BoHaiApiRequestImpl implements BoHaiApiRequest {
         return response.getData().getDocumentList();
     }
 
+    /**
+     * 车辆查询和车辆确认
+     * @param quoteVo
+     * @param parameters
+     * @param carInfo
+     * @param orderNo
+     * @param vehicleTypeQueryRequest
+     * @param url
+     * @return
+     * @throws Exception
+     */
     public Map<String, Object> getVehicleConfirmationResponse(QuoteVo quoteVo, BoHaiConfigureParameters parameters,
                                                               CarInfoVo carInfo, String orderNo,
                                                               VehicleTypeQueryRequest vehicleTypeQueryRequest,String url) throws Exception {

+ 107 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/component/BoHaiCrawlerCacheComponent.java

@@ -0,0 +1,107 @@
+package com.jzg.quotation.bohai.crawler.component;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerSaveResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RBucket;
+import org.redisson.api.RMap;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Component;
+
+import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @description: 渤海财险爬虫缓存组件实现
+ * @author:
+ * @date:
+ **/
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class BoHaiCrawlerCacheComponent {
+
+    private final RedissonClient redissonClient;
+
+    public static final String BOHAI_SAVE = "bohai:save:";
+
+    public static final Duration BOHAI_SAVE_TIME = Duration.ofHours(3L);
+
+    // 渤海财险授权
+    public static final String BOHAI_AUTHORIZATION = "bohai:authorization:";
+
+    //渤海财险授权保存时间
+    public static final int BOHAI_AUTHORIZATION_TIME = 6;
+
+    public static final String BEARER = "Bearer ";
+
+    public static final String AUTHORIZATION = "AUTHORIZATION";
+
+    public static final String USER_CODE = "USER_CODE";
+
+    /**
+     * 缓存认证信息
+     * @param token
+     * @param userCode
+     * @param username
+     * @return String
+     */
+    public String cacheAuthorization(String token, String userCode, String userName) {
+        Map<String, String> authorizationMap = new HashMap<>();
+        String authorization = BEARER + token;
+        authorizationMap.put(AUTHORIZATION, authorization);
+        authorizationMap.put(USER_CODE, userCode);
+        RMap<Object, Object> map = redissonClient.getMap(BOHAI_AUTHORIZATION + userName);
+        map.putAll(authorizationMap);
+        map.expire(Duration.ofHours(BOHAI_AUTHORIZATION_TIME));
+        return authorization;
+    }
+
+    /**
+     * 保存订单财险
+     *
+     * @param daJiaCrawlerSaveResponse 大家财险 保存订单数据
+     * @param ordersNo                 订单号
+     */
+    public void cacheDaJiaCrawlerSaveResponse(BoHaiCrawlerSaveResponse daJiaCrawlerSaveResponse, String ordersNo) {
+        String response = JSONObject.toJSONString(daJiaCrawlerSaveResponse);
+        RBucket<String> bucket = redissonClient.getBucket(BOHAI_SAVE + ordersNo);
+        bucket.set(response, BOHAI_SAVE_TIME);
+    }
+
+    /**
+     * 获取渤海财险订单保存数据
+     *
+     * @param ordersNo 订单号
+     * @return BoHaiCrawlerSaveResponse
+     */
+    public BoHaiCrawlerSaveResponse getDaJiaCrawlerSaveResponse(String ordersNo) {
+        RBucket<String> bucket = redissonClient.getBucket(BOHAI_SAVE + ordersNo);
+        return JSON.parseObject(bucket.get(), BoHaiCrawlerSaveResponse.class);
+    }
+
+    /**
+     * 通过用户名获取userCode
+     *
+     * @param username 用户名
+     * @return userCode
+     */
+    public String getUserCode(String username) {
+        return (String) redissonClient.getMap(BOHAI_AUTHORIZATION + username).get(USER_CODE);
+    }
+
+    /**
+     * 获取授权信息
+     *
+     * @param username 用户名
+     * @return 授权token
+     */
+    public String getAuthorization(String username) {
+        return (String) redissonClient.getMap(BOHAI_AUTHORIZATION + username).get(AUTHORIZATION);
+    }
+
+}

+ 39 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/component/BuildingAttributionInformation.java

@@ -0,0 +1,39 @@
+package com.jzg.quotation.bohai.crawler.component;
+
+import com.jzg.quotation.bohai.crawler.entity.BoHaiCrawlerConfigureParameters;
+import com.jzg.quotation.bohai.crawler.entity.request.BoHaiCrawlerChannelPackagesRequest;
+import com.jzg.quotation.bohai.crawler.entity.request.BoHaiCrawlerCompaniesRequest;
+import com.jzg.quotation.bohai.crawler.entity.request.quote.ProposalInfoDTO;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerChannelPackagesResponse;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerCompaniesResponse;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerGetSaleInfoResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: 渤海财险 归属配置
+ * @author: wenks
+ * @date: 2025/3/3 11:59
+ **/
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class BuildingAttributionInformation {
+
+    private final BoHaiCrawlerRequestComponent boHaiCrawlerRequestComponent;
+
+    public ProposalInfoDTO build(BoHaiCrawlerConfigureParameters parameters, String operatorCode, HttpHeaders headers) {
+        // 机构查询
+        BoHaiCrawlerCompaniesRequest boHaiCrawlerCompaniesRequest = new BoHaiCrawlerCompaniesRequest(parameters.getCDptCde(), parameters.getLoginCompany(), operatorCode);
+        BoHaiCrawlerCompaniesResponse.ListDTO companies = boHaiCrawlerRequestComponent.companies(boHaiCrawlerCompaniesRequest, parameters.getCDptCde(), headers);
+        // 获取渠道信息
+        BoHaiCrawlerGetSaleInfoResponse saleInfo = boHaiCrawlerRequestComponent.getSaleInfo(operatorCode, headers);
+        // 渠道套餐查询
+        BoHaiCrawlerChannelPackagesRequest boHaiCrawlerChannelPackagesRequest = new BoHaiCrawlerChannelPackagesRequest(parameters, operatorCode);
+        BoHaiCrawlerChannelPackagesResponse boHaiCrawlerChannelPackagesResponse = boHaiCrawlerRequestComponent.channelPackages(boHaiCrawlerChannelPackagesRequest, parameters.getChannelPackages(), headers);
+        return new ProposalInfoDTO(companies, boHaiCrawlerChannelPackagesResponse, saleInfo, parameters.getLoginCompany());
+    }
+
+}

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

@@ -0,0 +1,58 @@
+package com.jzg.quotation.bohai.crawler.constant.enums;
+
+
+import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
+import lombok.AllArgsConstructor;
+
+/**
+ * @description: 渤海财险请求 url 配置
+ * @author: wenks
+ * @date: 2025/2/11 11:43
+ **/
+@AllArgsConstructor
+public enum RequestUrl implements CrawlerRequestUrlStandard {
+
+    // 登录
+    CAPTCHA("/api_prod/api/captcha", "验证码"),
+    AUTHENTICATE("/api_prod/api/authenticate", "登录"),
+    CREATE_TOKEN("/api_prod/api/cabinet/createToken", "创建token"),
+    CHECK_TOKEN("/api_vhl_prod/api/checkToken", "校验token(获取新的token)"),
+    //归属信息
+    GET_SALE_INFO("/api_vhl_prod/api/getSaleInfo/", "获取账号信息"),
+    COMPANIES("/api_vhl_prod/api/companies", "承保机构"),
+    CHANNEL_PACKAGES("/api_vhl_prod/api/default/package/list", "渠道套餐"),
+    // 报价
+    CAR("/api_vhl_prod/api/car", "车型查询"),
+    VEHICLECONFIRMATION("","车辆确认"),
+    ACTUAL_VALUE("/api_vhl_prod/api/actualvalue", "计算折旧价格"),
+    PRICE("/api_vhl_prod/api/price", "报价"),
+    SAVE("/api_vhl_prod/api/save", "保存订单"),
+    INIT_DATA("/api_vhl_prod/imp/web/page/init_data", "初始化数据"),
+    //上传影像
+    UPLOAD_SIGNS("/api_vhl_prod/imp/web/obs/upload_signs", "上传标志"),
+    UPLOAD("/api_vhl_prod/imp/web/file/upload", "上传"),
+    // 提交核保
+    GENERATE("/api_vhl_prod/api/generate", "生成订单(核保)"),
+    // 支付二维码
+    QRCODE("/api_vhl_prod/api/qrcode", "支付二维码"),
+    // 下载保单
+    ELECTRON_POLICY_IO_DOWNLOAD("/api_vhl_prod/api/electronPolicyIODownload", "下载保单"),
+    // 状态查询
+    ORDER_LIST_REVISED("/api_vhl_prod/api/orderListRevised", "订单状态查询"),
+    ;
+
+    private final String uri;
+
+    private final String description;
+
+    @Override
+    public String getRequestDescription() {
+        return description;
+    }
+
+    @Override
+    public String uri() {
+        return uri;
+    }
+
+}

+ 22 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/constant/enums/ResponseCode.java

@@ -0,0 +1,22 @@
+package com.jzg.quotation.bohai.crawler.constant.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 渤海财险请求状态
+ * @author: shenwd
+ * @date: 2025/3/3 17:46
+ **/
+@AllArgsConstructor
+@Getter
+public enum ResponseCode {
+
+    R_Z00001("Z00001", "处理成功"),
+    R_Z00002("Z00002", "再次调用此接口确认"),
+    R_Z00004("Z00004", "处理失败");
+
+    private final String code;
+
+    private final String desc;
+}

+ 72 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerAuthenticateRequest.java

@@ -0,0 +1,72 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerCaptchaResponse;
+import com.jzg.quotation.bohai.crawler.util.DESEncryption;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * @description: 渤海财险【爬虫】【登录】【响应体】
+ * @author: wenks
+ * @date: 2025/2/13 14:23
+ **/
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class BoHaiCrawlerAuthenticateRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7368689446049547605L;
+
+    /**
+     * 用户名
+     */
+    @JsonProperty("username")
+    private String username;
+
+    /**
+     * 密码
+     */
+    @JsonProperty("password")
+    private String password;
+
+    /**
+     * 验证码
+     */
+    @JsonProperty("checkCode")
+    private String checkCode;
+
+    /**
+     * 验证码id
+     */
+    @JsonProperty("imgId")
+    private String imgId;
+
+    /**
+     * 记住密码
+     */
+    @JsonProperty("rememberMe")
+    private Boolean rememberMe = false;
+
+    /**
+     * 用户名
+     */
+    @JsonProperty("operatorId")
+    private String operatorId;
+
+
+    public BoHaiCrawlerAuthenticateRequest(BoHaiCrawlerCaptchaResponse captcha, String username, String password) {
+        this.username = username;
+        this.password = DESEncryption.encrypt(password);
+        this.checkCode = captcha.getImg();
+        this.imgId = captcha.getUuid();
+        this.operatorId = username;
+    }
+
+}

+ 77 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCarRequest.java

@@ -0,0 +1,77 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerCarRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 3887879260967024252L;
+
+    @JsonProperty("pageNo")
+    private Integer pageNo;
+
+    @JsonProperty("pageSize")
+    private Integer pageSize;
+    /**
+     * 品牌型号
+     */
+    @JsonProperty("vehicleName")
+    private String vehicleName;
+
+    @JsonProperty("areaCode")
+    private String areaCode;
+    /**
+     * 订单号 可以为空
+     */
+    @JsonProperty("orderNo")
+    private String orderNo;
+
+    @JsonProperty("dptCode")
+    private String dptCode;
+    /**
+     * 发动机号
+     */
+    @JsonProperty("engineNo")
+    private String engineNo;
+    /**
+     * 车架号
+     */
+    @JsonProperty("vin")
+    private String vin;
+    /**
+     * 车牌号
+     */
+    @JsonProperty("licensePlateNo")
+    private String licensePlateNo;
+    /**
+     * 号牌种类
+     */
+    @JsonProperty("queryMod")
+    private String queryMod;
+
+    @JsonProperty("operatorCode")
+    private String operatorCode;
+
+    public BoHaiCrawlerCarRequest(CarInfoVo carInfoVo, String areaCode, String dptCode, String operatorCode) {
+        this.pageNo = 1;
+        this.pageSize = 30;
+        this.vehicleName = carInfoVo.getBrandName();
+        this.areaCode = areaCode;
+        this.orderNo = null;
+        this.dptCode = dptCode;
+        this.engineNo = carInfoVo.getEngineNo();
+        this.vin = carInfoVo.getVinNo();
+        this.licensePlateNo = carInfoVo.getLicenseNo();
+        this.queryMod = carInfoVo.getLicenseKindCode();
+        this.operatorCode = operatorCode;
+    }
+
+}

+ 50 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerChannelPackagesRequest.java

@@ -0,0 +1,50 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import com.jzg.quotation.bohai.crawler.entity.BoHaiCrawlerConfigureParameters;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerBaseResponse;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 渤海保险爬虫渠道套餐查询请求实体
+ * 用于查询指定机构和产品组合的可用套餐信息
+ * 
+ * @author system
+ * @date 2025/9/18
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BoHaiCrawlerChannelPackagesRequest {
+
+    /**
+     * 登录机构
+     */
+    private String loginCompany;
+    /**
+     * 承保机构
+     */
+    private String companyCode;
+    /**
+     * 产品组合编码
+     */
+    private String combineProductCode;
+    /**
+     * 登录userCode
+     */
+    private String operatorCode;
+
+    /**
+     * 构造方法:基于配置参数和操作员代码创建请求对象
+     * 
+     * @param parameters 大家保险爬虫配置参数
+     * @param operatorCode 操作员代码
+     */
+    public BoHaiCrawlerChannelPackagesRequest(BoHaiCrawlerConfigureParameters parameters, String operatorCode) {
+        this.loginCompany = parameters.getLoginCompany();
+        this.companyCode = parameters.getCDptCde();
+        this.combineProductCode = parameters.getCombineProductCode();
+        this.operatorCode = operatorCode;
+    }
+}

+ 25 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCheckTokenRequest.java

@@ -0,0 +1,25 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @version
+ * @description: 渤海财险【校验token】响应
+ * @author: wenks
+ * @date: 2025/5/21 16:59
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerCheckTokenRequest {
+
+    @JsonProperty("tokenId")
+    private String tokenId;
+
+    @JsonProperty("operatorCode")
+    private String operatorCode;
+
+}

+ 41 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerCompaniesRequest.java

@@ -0,0 +1,41 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @description: 渤海财险 【爬虫】 查询机构列表
+ * @author: wenks
+ * @date: 2025/2/28 10:51
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class BoHaiCrawlerCompaniesRequest {
+
+    private String companyPrefix;
+
+    private String companyName;
+
+    private String recommendCode;
+
+    private String loginCompany;
+
+    private int pageNum;
+
+    private int pageSize;
+
+    private String operatorCode;
+
+    public BoHaiCrawlerCompaniesRequest(String companyPrefix, String loginCompany, String operatorCode) {
+        this.companyPrefix = companyPrefix;
+        this.companyName = null;
+        this.loginCompany = loginCompany;
+        this.recommendCode = operatorCode;
+        this.pageNum = 1;
+        this.pageSize = 10;
+        this.operatorCode = operatorCode;
+    }
+
+}

+ 575 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/BoHaiCrawlerVehicleConfirmationReqeust.java

@@ -0,0 +1,575 @@
+package com.jzg.quotation.bohai.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.util.IDCardUtils;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.bohai.api.constant.enums.CertType;
+import com.jzg.quotation.bohai.api.constant.enums.CustomerType;
+import com.jzg.quotation.bohai.api.constant.enums.FormatType;
+import com.jzg.quotation.bohai.api.constant.enums.InvoiceType;
+import com.jzg.quotation.bohai.api.entity.BoHaiConfigureParameters;
+import com.jzg.quotation.bohai.api.entity.request.BoHaiBaseRequest;
+import com.jzg.quotation.bohai.api.entity.response.VehicleTypeQueryResponse;
+import com.jzg.quotation.bohai.api.entity.vo.PersonAreaVo;
+import com.jzg.quotation.bohai.crawler.entity.BoHaiCrawlerConfigureParameters;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerCarResponse;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 渤海财险 车辆确认请求接口
+ * @author: shenwd
+ * @date: 2025/3/3 16:53
+ **/
+@EqualsAndHashCode(callSuper = false)
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerVehicleConfirmationReqeust {
+
+    @Serial
+    private static final long serialVersionUID = 5738667931387435773L;
+
+    @JsonProperty("vehicle")
+    private VehicleDTO vehicle;
+
+    @JsonProperty("carOwner")
+    private CarOwnerDTO carOwner;
+
+    @JsonProperty("holder")
+    private HolderDTO holder;
+
+    @JsonProperty("insureder")
+    private InsurederDTO insureder;
+
+
+    public BoHaiCrawlerVehicleConfirmationReqeust(BoHaiCrawlerConfigureParameters parameters, QuoteVo quoteVo,
+                                                  BoHaiCrawlerCarResponse boHaiCrawlerCarResponse, PersonAreaVo ownerInfoArea, PersonAreaVo insuredPersonArea,
+                                                  PersonAreaVo policyHolderArea) {
+        String effectDate;
+        if (quoteVo.getBiRiskInfoVo() != null) {
+            effectDate = quoteVo.getBiRiskInfoVo().getStartDate();
+        } else {
+            effectDate = quoteVo.getCiRiskInfoVo().getStartDate();
+        }
+        //this.setBaseParam(parameters, orderNo);
+        // 车辆信息
+        CarInfoVo carInfo = quoteVo.getCarInfoVo();
+        this.vehicle = new VehicleDTO(carInfo, boHaiCrawlerCarResponse, effectDate);
+        // 车主
+        CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();
+        this.carOwner = new CarOwnerDTO(ownersInfo, ownerInfoArea);
+        // 投保人
+        CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();
+        this.holder = new HolderDTO(policyHolderInfo, policyHolderArea);
+        // 被保人
+        CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();
+        this.insureder = new InsurederDTO(insuredPersonInfo, insuredPersonArea);
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class VehicleDTO implements Serializable {
+
+        private static final long serialVersionUID = -2343894775576071422L;
+
+        /**
+         * 车辆识别代号/车架号
+         */
+        @JsonProperty("carVin")
+        private String carVin;
+
+        /**
+         * 车型编码
+         */
+        @JsonProperty("vehicleModelCode")
+        private String vehicleModelCode;
+
+        /**
+         * 发动机号
+         */
+        @JsonProperty("engineNo")
+        private String engineNo;
+
+        /**
+         * 号牌号码
+         */
+        @JsonProperty("plateNo")
+        private String plateNo;
+
+        @JsonProperty("licenseType")
+        private String licenseType;
+
+        /**
+         * 初登日期
+         */
+        @JsonProperty("registerDate")
+        private String registerDate;
+
+        /**
+         * 指导价格
+         */
+        @JsonProperty("purchasePrice")
+        private String purchasePrice;
+
+        /**
+         * 是否新车
+         */
+        @JsonProperty("newVehicleFlag")
+        private String newVehicleFlag;
+
+        /**
+         * 车型名称 (品牌型号)
+         */
+        @JsonProperty("moldName")
+        private String moldName;
+
+        @JsonProperty("modelCode")
+        private String modelCode;
+        /**
+         * 座位数
+         */
+        @JsonProperty("seatCount")
+        private String seatCount;
+
+
+        @JsonProperty("purchaseinvoicesDate")
+        private String purchaseinvoicesDate;
+
+        /**
+         * 核定载质量(KG)
+         */
+        @JsonProperty("tonNumber")
+        private String tonNumber;
+
+        /**
+         * 燃料类型
+         */
+        @JsonProperty("fuelType")
+        private String fuelType;
+
+        /**
+         * 整备质量(KG)
+         */
+        @JsonProperty("emptyWeight")
+        private String emptyWeight;
+
+        /**
+         * 保险起期
+         */
+        @JsonProperty("effectDate")
+        private String effectDate;
+
+        /**
+         * 排气量(L)
+         */
+        @JsonProperty("exhaustMeasure")
+        private String exhaustMeasure;
+
+        /**
+         * 车辆种类
+         */
+        @JsonProperty("vehicleKind")
+        private String vehicleKind;
+
+        /**
+         * 车辆所属性质
+         */
+        @JsonProperty("vehicleAffNature")
+        private String vehicleAffNature;
+
+        /**
+         * 车辆使用性质
+         */
+        @JsonProperty("vehicleUsage")
+        private String vehicleUsage;
+
+        /**
+         * 车辆使用性质细分
+         */
+        @JsonProperty("vehicleUsageDetail")
+        private String vehicleUsageDetail;
+
+        /**
+         * 是否过户
+         */
+        @JsonProperty("isTransfer")
+        private String isTransfer;
+
+        /**
+         * 过户日期
+         */
+        @JsonProperty("transferDate")
+        private String transferDate;
+
+        @JsonProperty("vehicleTypeOfDrivingPermit")
+        private String vehicleTypeOfDrivingPermit;
+
+        @JsonProperty("secondHandVehicleFlag")
+        private String secondHandVehicleFlag;
+
+
+        public VehicleDTO(CarInfoVo carInfo, BoHaiCrawlerCarResponse vehicleModelsDTO, String effectDate) {
+            this.carVin = carInfo.getVinNo();
+            this.vehicleModelCode = vehicleModelsDTO.getList().get(0).getVehicleModelCode();
+            this.engineNo = carInfo.getEngineNo();
+            this.plateNo = carInfo.getLicenseNo();
+            this.licenseType = "02";
+            this.registerDate = carInfo.getRegisterDate();
+            this.purchasePrice = vehicleModelsDTO.getList().get(0).getPurchasePrice();
+            // 新车
+            this.newVehicleFlag = StringUtils.isNotEmpty(carInfo.getLicenseNo()) ? "0" : "1";
+            //车型名称 (品牌型号)
+            this.moldName = vehicleModelsDTO.getList().get(0).getMoldName();
+            //模型编码
+            this.modelCode = vehicleModelsDTO.getList().get(0).getModelCode();
+
+            this.seatCount = carInfo.getSeatCount();
+            this.tonNumber = StringUtils.isEmpty(carInfo.getLimitLoad()) ? "0": carInfo.getLimitLoad();
+            this.fuelType = carInfo.getEnergyTypeCode();
+            this.emptyWeight = carInfo.getCompleteKerbMass();
+            this.exhaustMeasure = vehicleModelsDTO.getList().get(0).getVehicleExhaust();
+            this.effectDate = effectDate;
+            this.vehicleKind = carInfo.getCarKindCode();
+            this.vehicleAffNature = carInfo.getPropertyCode();
+            // 车辆使用性质
+            this.vehicleUsage = carInfo.getCarNatureCode();
+            // 车辆用途
+            this.vehicleUsageDetail = carInfo.getVehicleUseCode();
+            this.isTransfer = carInfo.isTransfer() ? "1" : "0";
+            this.transferDate = carInfo.getTransferDate();
+
+            this.vehicleTypeOfDrivingPermit = carInfo.getCarTypeCode();
+            this.secondHandVehicleFlag = "0";
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class CarOwnerDTO implements Serializable {
+
+        private static final long serialVersionUID = 8709315851618789033L;
+
+        @JsonProperty("certType")
+        private String certType;
+
+        @JsonProperty("ownerName")
+        private String ownerName;
+
+        @JsonProperty("certNo")
+        private String certNo;
+
+        @JsonProperty("address")
+        private String address;
+
+        @JsonProperty("phoneNumber")
+        private String phoneNumber;
+
+        /**
+         * 客户类型
+         */
+        @JsonProperty("customerType")
+        private String customerType;
+        /**
+         *
+         */
+        @JsonProperty("certiType")
+        private String certiType;
+
+        /**
+         * 邮箱
+         */
+        @JsonProperty("email")
+        private String email;
+        /**
+         * 省份代码
+         */
+        @JsonProperty("provCode")
+        private String provCode;
+
+        /**
+         * 省份名称
+         */
+        @JsonProperty("provName")
+        private String provName;
+        /**
+         * 城市代码
+         */
+        @JsonProperty("cityCode")
+        private String cityCode;
+        /**
+         * 城市名称
+         */
+        @JsonProperty("cityName")
+        private String cityName;
+        /**
+         * 区县代码
+         */
+        @JsonProperty("distCode")
+        private String distCode;
+        /**
+         * 区县名称
+         */
+        @JsonProperty("distName")
+        private String distName;
+
+        @JsonProperty("residentialAddress")
+        private String residentialAddress;
+
+        @JsonProperty("birthday")
+        private String birthday;
+
+        public CarOwnerDTO(CustomerInfoVo ownerInfo, PersonAreaVo ownerInfoArea) {
+            this.certType = CertType.CT_111.getCode();
+            this.ownerName = ownerInfo.getName();
+            this.certNo = ownerInfo.getIdentifyNumber();
+            this.address = ownerInfo.getAddr();
+            this.phoneNumber = ownerInfo.getMobile();
+            this.customerType = CustomerType.CT_2.getCode();
+            this.email = ownerInfo.getEmail();
+            this.certiType = ownerInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+            this.residentialAddress = ownerInfo.getAddr();
+            this.provCode = ownerInfoArea.getProvinceCode();
+            this.provName = ownerInfoArea.getProvinceName();
+            this.cityCode = ownerInfoArea.getCityCode();
+            this.cityName = ownerInfoArea.getCityName();
+            this.distCode = ownerInfoArea.getCountyCode();
+            this.distName = ownerInfoArea.getCountyName();
+            this.birthday = IDCardUtils.GetBirthday(ownerInfo.getIdentifyNumber());
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class HolderDTO implements Serializable {
+
+        private static final long serialVersionUID = -2088635630636574306L;
+
+        @JsonProperty("certType")
+        private String certType;
+
+        @JsonProperty("holderName")
+        private String holderName;
+
+        @JsonProperty("certNo")
+        private String certNo;
+
+        @JsonProperty("address")
+        private String address;
+
+        @JsonProperty("phoneNumber")
+        private String phoneNumber;
+
+        @JsonProperty("nation")
+        private String nation;
+
+        @JsonProperty("certiStartDate")
+        private String certiStartDate;
+
+        @JsonProperty("certiEndDate")
+        private String certiEndDate;
+
+        @JsonProperty("certiType")
+        private String certiType;
+
+        @JsonProperty("issuer")
+        private String issuer;
+
+        @JsonProperty("email")
+        private String email;
+
+        @JsonProperty("invoiceType")
+        private String invoiceType;
+
+        @JsonProperty("bizFormatType")
+        private String bizFormatType;
+
+        @JsonProperty("forceFormatType")
+        private String forceFormatType;
+
+        @JsonProperty("elecApplicationFlag")
+        private String elecApplicationFlag;
+
+        @JsonProperty("customerType")
+        private String customerType;
+
+        /**
+         * 省份代码
+         */
+        @JsonProperty("provCode")
+        private String provCode;
+
+        /**
+         * 省份名称
+         */
+        @JsonProperty("provName")
+        private String provName;
+        /**
+         * 城市代码
+         */
+        @JsonProperty("cityCode")
+        private String cityCode;
+        /**
+         * 城市名称
+         */
+        @JsonProperty("cityName")
+        private String cityName;
+        /**
+         * 区县代码
+         */
+        @JsonProperty("distCode")
+        private String distCode;
+        /**
+         * 区县名称
+         */
+        @JsonProperty("distName")
+        private String distName;
+
+        @JsonProperty("residentialAddress")
+        private String residentialAddress;
+
+        @JsonProperty("birthday")
+        private String birthday;
+
+        public HolderDTO(CustomerInfoVo policyHolderInfo, PersonAreaVo policyHolderArea) {
+            // 通用参数
+            this.certType = CertType.CT_111.getCode();
+            this.holderName = policyHolderInfo.getName();
+            this.certNo = policyHolderInfo.getIdentifyNumber();
+            this.address = policyHolderInfo.getAddr();
+            this.phoneNumber = policyHolderInfo.getMobile();
+            this.customerType = CustomerType.CT_2.getCode();
+            this.email = policyHolderInfo.getEmail();
+            this.certiType = policyHolderInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+
+            // 个别参数
+            this.invoiceType = InvoiceType.IT_1.getCode();
+            this.bizFormatType = FormatType.FT_1.getCode();
+            this.forceFormatType = FormatType.FT_1.getCode();
+
+            // 省市县
+            this.provCode = policyHolderArea.getProvinceCode();
+            this.provName = policyHolderArea.getProvinceName();
+            this.cityCode = policyHolderArea.getCityCode();
+            this.cityName = policyHolderArea.getCityName();
+            this.distCode = policyHolderArea.getCountyCode();
+            this.distName = policyHolderArea.getCountyName();
+
+            this.residentialAddress = policyHolderInfo.getAddr();
+            this.birthday = IDCardUtils.GetBirthday(policyHolderInfo.getIdentifyNumber());
+        }
+    }
+
+    /**
+     * 被保人
+     */
+    @NoArgsConstructor
+    @Data
+    public static class InsurederDTO implements Serializable {
+
+        private static final long serialVersionUID = 1045840175935280892L;
+
+        @JsonProperty("certType")
+        private String certType;
+
+        @JsonProperty("insuredName")
+        private String insuredName;
+
+        @JsonProperty("certNo")
+        private String certNo;
+
+        @JsonProperty("address")
+        private String address;
+
+        @JsonProperty("phoneNumber")
+        private String phoneNumber;
+
+        @JsonProperty("nation")
+        private String nation;
+
+        @JsonProperty("certiStartDate")
+        private String certiStartDate;
+
+        @JsonProperty("certiEndDate")
+        private String certiEndDate;
+
+        @JsonProperty("certiType")
+        private String certiType;
+
+        @JsonProperty("customerType")
+        private String customerType;
+
+        @JsonProperty("email")
+        private String email;
+
+        /**
+         * 省份代码
+         */
+        @JsonProperty("provCode")
+        private String provCode;
+
+        /**
+         * 省份名称
+         */
+        @JsonProperty("provName")
+        private String provName;
+        /**
+         * 城市代码
+         */
+        @JsonProperty("cityCode")
+        private String cityCode;
+        /**
+         * 城市名称
+         */
+        @JsonProperty("cityName")
+        private String cityName;
+        /**
+         * 区县代码
+         */
+        @JsonProperty("distCode")
+        private String distCode;
+        /**
+         * 区县名称
+         */
+        @JsonProperty("distName")
+        private String distName;
+
+        @JsonProperty("residentialAddress")
+        private String residentialAddress;
+
+
+        @JsonProperty("birthday")
+        private String birthday;
+
+        public InsurederDTO(CustomerInfoVo insuredPersonInfo, PersonAreaVo insuredPersonArea) {
+            // 通用参数
+            this.certType = CertType.CT_111.getCode();
+            this.insuredName = insuredPersonInfo.getName();
+            this.certNo = insuredPersonInfo.getIdentifyNumber();
+            this.address = insuredPersonInfo.getAddr();
+            this.phoneNumber = insuredPersonInfo.getMobile();
+            this.customerType = CustomerType.CT_2.getCode();
+            this.email = insuredPersonInfo.getEmail();
+            this.certiType = insuredPersonInfo.getIdentifyValidEndDate().contains("9999") ? "1" : "0";
+            this.residentialAddress = insuredPersonInfo.getAddr();
+            // 省市县
+            this.provCode = insuredPersonArea.getProvinceCode();
+            this.provName = insuredPersonArea.getProvinceName();
+            this.cityCode = insuredPersonArea.getCityCode();
+            this.cityName = insuredPersonArea.getCityName();
+            this.distCode = insuredPersonArea.getCountyCode();
+            this.distName = insuredPersonArea.getCountyName();
+            this.birthday = IDCardUtils.GetBirthday(insuredPersonInfo.getIdentifyNumber());
+
+        }
+
+    }
+
+
+}

+ 50 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/AcctinfoDTO.java

@@ -0,0 +1,50 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class AcctinfoDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 8621092056192776893L;
+
+    @JsonProperty("acctNme")
+    private String acctNme;
+
+    @JsonProperty("acctTyp")
+    private String acctTyp;
+
+    @JsonProperty("acctNo")
+    private String acctNo;
+
+    @JsonProperty("bankPro")
+    private String bankPro;
+
+    @JsonProperty("bankArea")
+    private String bankArea;
+
+    @JsonProperty("bankRelCde")
+    private String bankRelCde;
+
+    @JsonProperty("bankCde")
+    private String bankCde;
+
+    @JsonProperty("bankCdeName")
+    private String bankCdeName;
+
+
+    public AcctinfoDTO() {
+        this.acctNme = "";
+        this.acctTyp = "";
+        this.acctNo = "";
+        this.bankPro = "";
+        this.bankArea = "";
+        this.bankRelCde = "";
+        this.bankCde = "";
+        this.bankCdeName = "";
+    }
+}

+ 570 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/BusinessInsuranceDTO.java

@@ -0,0 +1,570 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.KindInfoVo;
+import com.jzg.commons.entity.quote.vo.RiskInfoVo;
+import com.jzg.quotation.bohai.enums.dictionary.Deductible;
+import com.jzg.quotation.bohai.enums.dictionary.TicketNoType;
+import com.jzg.quotation.commons.utils.TimeProcessing;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Data
+public class BusinessInsuranceDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 9140485846197533624L;
+
+    @JsonProperty("productInfo")
+    private ProductInfoDTO productInfo;
+
+    @JsonProperty("itemKinds")
+    private List<ItemKindsDTO> itemKinds;
+
+    @JsonProperty("deviceInfos")
+    private List<Object> deviceInfos;
+
+    @JsonProperty("coefficientInfo")
+    private CoefficientInfoDTO coefficientInfo;
+
+    @JsonProperty("platformInfo")
+    private String platformInfo;
+
+    @JsonProperty("ubiMessage")
+    private String ubiMessage;
+
+    @JsonProperty("feeInfos")
+    private String feeInfos;
+
+    @JsonProperty("specialInfos")
+    private List<SpecialInfosDTO> specialInfos;
+
+    @JsonProperty("chargPostInfos")
+    private List<Object> chargPostInfos;
+
+    public BusinessInsuranceDTO(RiskInfoVo biRiskInfoVo, List<KindInfoVo> kindInfoVo) {
+        this.coefficientInfo = new CoefficientInfoDTO();
+        this.deviceInfos = List.of();
+        this.itemKinds = kindInfoVo.stream().map(ItemKindsDTO::new).collect(Collectors.toList());
+        this.productInfo = new ProductInfoDTO(biRiskInfoVo);
+        this.specialInfos = List.of();
+    }
+
+    public BusinessInsuranceDTO(){
+        this.coefficientInfo = new CoefficientInfoDTO();
+        this.deviceInfos = List.of();
+        this.itemKinds = List.of();
+        this.productInfo = new ProductInfoDTO();
+        this.specialInfos = List.of();
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ProductInfoDTO {
+        @JsonProperty("businessID")
+        private String businessID;
+        @JsonProperty("effective")
+        private String effective;
+        @JsonProperty("startDate")
+        private String startDate;
+        @JsonProperty("endDate")
+        private String endDate;
+        @JsonProperty("productCode")
+        private String productCode;
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("proposalTime")
+        private String proposalTime;
+        @JsonProperty("premium")
+        private String premium;
+        @JsonProperty("feeRate")
+        private String feeRate;
+        @JsonProperty("feeCoef")
+        private String feeCoef;
+        @JsonProperty("proposalStatus")
+        private String proposalStatus;
+        @JsonProperty("tgtObjCpkid")
+        private String tgtObjCpkid;
+        @JsonProperty("artificialFlag")
+        private String artificialFlag;
+        @JsonProperty("flatCarReinsuredMessage")
+        private String flatCarReinsuredMessage;
+        @JsonProperty("caclCode")
+        private String caclCode;
+        @JsonProperty("resultCode")
+        private String resultCode;
+        @JsonProperty("underwritingCode")
+        private String underwritingCode;
+        @JsonProperty("message")
+        private String message;
+        @JsonProperty("errorMessage")
+        private String errorMessage;
+        @JsonProperty("lastPolicyNo")
+        private String lastPolicyNo;
+        @JsonProperty("lastEndDate")
+        private String lastEndDate;
+        @JsonProperty("policyNo")
+        private String policyNo;
+        @JsonProperty("quotedNo")
+        private String quotedNo;
+        @JsonProperty("performanceRate")
+        private String performanceRate;
+        @JsonProperty("teamManageFeeRate")
+        private String teamManageFeeRate;
+        @JsonProperty("underWriteMessage")
+        private String underWriteMessage;
+        @JsonProperty("underWriteMessageRecord")
+        private String underWriteMessageRecord;
+        @JsonProperty("sumPremium")
+        private String sumPremium;
+        @JsonProperty("discount")
+        private String discount;
+        @JsonProperty("valueAddTax")
+        private String valueAddTax;
+        @JsonProperty("noTaxSumPremium")
+        private String noTaxSumPremium;
+        @JsonProperty("sumInsured")
+        private String sumInsured;
+        @JsonProperty("invoiceForm")
+        private String invoiceForm;
+        @JsonProperty("meal")
+        private String meal;
+        @JsonProperty("renewMark")
+        private String renewMark;
+        @JsonProperty("serviceCode")
+        private String serviceCode;
+        @JsonProperty("day")
+        private String day;
+        @JsonProperty("elProposal")
+        private String elProposal;
+        @JsonProperty("elPolicy")
+        private String elPolicy;
+        @JsonProperty("selfMark")
+        private String selfMark;
+        @JsonProperty("issueDate")
+        private String issueDate;
+        @JsonProperty("syAdjustRate")
+        private String syAdjustRate;
+        @JsonProperty("isReform")
+        private String isReform;
+        @JsonProperty("taxRate")
+        private String taxRate;
+        @JsonProperty("taxPrm")
+        private String taxPrm;
+        @JsonProperty("lastYearEndDateSy")
+        private String lastYearEndDateSy;
+        @JsonProperty("planId")
+        private String planId;
+        @JsonProperty("planName")
+        private String planName;
+        @JsonProperty("number")
+        private String number;
+        @JsonProperty("perPrmSum")
+        private String perPrmSum;
+        @JsonProperty("perAmtSum")
+        private String perAmtSum;
+        @JsonProperty("lastYearEndDateJq")
+        private String lastYearEndDateJq;
+        @JsonProperty("orginAppNo")
+        private String orginAppNo;
+        @JsonProperty("plyCrtTm")
+        private String plyCrtTm;
+        @JsonProperty("adjustProportion")
+        private String adjustProportion;
+        @JsonProperty("basePremium")
+        private String basePremium;
+        @JsonProperty("province")
+        private String province;
+        @JsonProperty("city")
+        private String city;
+        @JsonProperty("county")
+        private String county;
+        @JsonProperty("street")
+        private String street;
+        @JsonProperty("subAddress")
+        private String subAddress;
+        @JsonProperty("houseConstruction")
+        private String houseConstruction;
+        @JsonProperty("uncarPayMark")
+        private String uncarPayMark;
+        @JsonProperty("serialNo")
+        private String serialNo;
+        @JsonProperty("uncarDateMark")
+        private String uncarDateMark;
+        @JsonProperty("supFlag")
+        private String supFlag;
+
+        public ProductInfoDTO(RiskInfoVo biRiskInfoVo) {
+            this.businessID = "KSCD";
+            this.day = "365";
+            this.effective = "";
+            this.elPolicy = "";
+            this.endDate = TimeProcessing.minusOneSecondAfterYear(biRiskInfoVo.getStartDate());
+            this.feeCoef = "";
+            this.feeRate = "";
+            this.lastPolicyNo = "";
+            this.policyNo = "";
+            this.premium = "";
+            this.productCode = "0356";
+            this.proposalNo = "";
+            this.proposalStatus = "";
+            this.proposalTime = "";
+            this.renewMark = "";
+            this.selfMark = "";
+            this.startDate = biRiskInfoVo.getStartDate();
+            this.isReform = "1";
+            this.taxRate = "";
+            this.noTaxSumPremium = "";
+            this.taxPrm = "";
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class CoefficientInfoDTO {
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("entireDiscount")
+        private String entireDiscount;
+        @JsonProperty("claimAdjustValue")
+        private String claimAdjustValue;
+        @JsonProperty("claimFlatReason")
+        private String claimFlatReason;
+        @JsonProperty("peccancyAdjustValue")
+        private String peccancyAdjustValue;
+        @JsonProperty("noFloatReason")
+        private String noFloatReason;
+        @JsonProperty("lastPolicyNum")
+        private String lastPolicyNum;
+        @JsonProperty("drunkFeeRateFlat")
+        private String drunkFeeRateFlat;
+        @JsonProperty("totalCoefNum")
+        private String totalCoefNum;
+        @JsonProperty("drunkTotalCoef")
+        private String drunkTotalCoef;
+        @JsonProperty("totalCoef")
+        private String totalCoef;
+        @JsonProperty("drinkFeeRateFlat")
+        private String drinkFeeRateFlat;
+        @JsonProperty("lossRatioCi")
+        private String lossRatioCi;
+        @JsonProperty("lossRatioBi")
+        private String lossRatioBi;
+        @JsonProperty("totalRatio")
+        private String totalRatio;
+        @JsonProperty("handFeeCi")
+        private String handFeeCi;
+        @JsonProperty("expDisCoef")
+        private String expDisCoef;
+        @JsonProperty("noComLastFlatRsn")
+        private String noComLastFlatRsn;
+        @JsonProperty("selfChannelRatio")
+        private String selfChannelRatio;
+        @JsonProperty("selfSubmitRatio")
+        private String selfSubmitRatio;
+        @JsonProperty("reason")
+        private String reason;
+        @JsonProperty("recordCoefCi")
+        private String recordCoefCi;
+        @JsonProperty("trafficFloatRes")
+        private String trafficFloatRes;
+        @JsonProperty("areaCoef")
+        private String areaCoef;
+        @JsonProperty("lastPayAmt")
+        private String lastPayAmt;
+        @JsonProperty("handFeeBi")
+        private String handFeeBi;
+        @JsonProperty("channelCoefRes")
+        private String channelCoefRes;
+        @JsonProperty("trafficRateFloat")
+        private String trafficRateFloat;
+        @JsonProperty("startTm")
+        private String startTm;
+        @JsonProperty("endTm")
+        private String endTm;
+        @JsonProperty("lowestCoef")
+        private String lowestCoef;
+        @JsonProperty("suggestCoef")
+        private String suggestCoef;
+        @JsonProperty("payoutRateCi")
+        private String payoutRateCi;
+        @JsonProperty("payoutRateBi")
+        private String payoutRateBi;
+        @JsonProperty("payoutRate")
+        private String payoutRate;
+        @JsonProperty("riskScore")
+        private String riskScore;
+        @JsonProperty("totalFeeRate")
+        private String totalFeeRate;
+        @JsonProperty("singlePaymentCi")
+        private String singlePaymentCi;
+        @JsonProperty("singlePaymentBi")
+        private String singlePaymentBi;
+        @JsonProperty("singlePayment")
+        private String singlePayment;
+        @JsonProperty("insureYears")
+        private String insureYears;
+        @JsonProperty("claimTimes")
+        private String claimTimes;
+        @JsonProperty("claimAdjustLvl")
+        private String claimAdjustLvl;
+        @JsonProperty("pricingAdjustValue")
+        private String pricingAdjustValue;
+        @JsonProperty("riskVar")
+        private String riskVar;
+        @JsonProperty("pricePlan")
+        private String pricePlan;
+        @JsonProperty("floatDown")
+        private String floatDown;
+        @JsonProperty("compensateFeeRate")
+        private String compensateFeeRate;
+        @JsonProperty("fixedDropDiscount")
+        private String fixedDropDiscount;
+        @JsonProperty("entireInitialDiscount")
+        private String entireInitialDiscount;
+        @JsonProperty("coefficientScore")
+        private String coefficientScore;
+        @JsonProperty("pubScores")
+        private String pubScores;
+        @JsonProperty("microDiscoverScore")
+        private String microDiscoverScore;
+        @JsonProperty("truckRiskMrk")
+        private String truckRiskMrk;
+        @JsonProperty("busRiskMrk")
+        private String busRiskMrk;
+        @JsonProperty("truckScore")
+        private String truckScore;
+        @JsonProperty("truckRiskWarning")
+        private String truckRiskWarning;
+        @JsonProperty("predictedNature")
+        private String predictedNature;
+        @JsonProperty("fullCoverageScore")
+        private String fullCoverageScore;
+        @JsonProperty("liabilityOnlyScore")
+        private String liabilityOnlyScore;
+        @JsonProperty("ctpOnlyScore")
+        private String ctpOnlyScore;
+        @JsonProperty("renewalFrequency")
+        private String renewalFrequency;
+        @JsonProperty("didScore")
+        private String didScore;
+        @JsonProperty("vhlPriceType")
+        private String vhlPriceType;
+        @JsonProperty("suggestedDiscount")
+        private String suggestedDiscount;
+        @JsonProperty("onlineCarScore")
+        private String onlineCarScore;
+        @JsonProperty("carIllegalScore")
+        private String carIllegalScore;
+        @JsonProperty("completeControlScore")
+        private String completeControlScore;
+        @JsonProperty("pingAnBillCOMELR")
+        private String pingAnBillCOMELR;
+        @JsonProperty("pingAnBillCTPELR")
+        private String pingAnBillCTPELR;
+        @JsonProperty("pingAnBillELR")
+        private String pingAnBillELR;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ItemKindsDTO {
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("kindCode")
+        private String kindCode;
+        @JsonProperty("kindName")
+        private String kindName;
+        @JsonProperty("kindPackage")
+        private String kindPackage;
+        @JsonProperty("productName")
+        private String productName;
+        @JsonProperty("basePremium")
+        private String basePremium;
+        @JsonProperty("noTaxDiscountPremium")
+        private String noTaxDiscountPremium;
+        @JsonProperty("taxDiscountPremium")
+        private String taxDiscountPremium;
+        @JsonProperty("premium")
+        private String premium;
+        @JsonProperty("noDeductible")
+        private String noDeductible;
+        @JsonProperty("noDeductiblePremium")
+        private String noDeductiblePremium;
+        @JsonProperty("payPremium")
+        private String payPremium;
+        @JsonProperty("amount")
+        private String amount;
+        @JsonProperty("liabilityLevel")
+        private String liabilityLevel;
+        @JsonProperty("damageDeductible")
+        private String damageDeductible;
+        @JsonProperty("deductible")
+        private String deductible;
+        @JsonProperty("deductibleFlag")
+        private String deductibleFlag;
+        @JsonProperty("rate")
+        private String rate;
+        @JsonProperty("deductibleRatio")
+        private String deductibleRatio;
+        @JsonProperty("dutyDays")
+        private String dutyDays;
+        @JsonProperty("quantity")
+        private String quantity;
+        @JsonProperty("yearPayPremium")
+        private String yearPayPremium;
+        @JsonProperty("glassType")
+        private String glassType;
+        @JsonProperty("valueAddTax")
+        private String valueAddTax;
+        @JsonProperty("discount")
+        private String discount;
+        @JsonProperty("needCalculateAmount")
+        private String needCalculateAmount;
+        @JsonProperty("mainRiskFlag")
+        private String mainRiskFlag;
+        @JsonProperty("beginTime")
+        private String beginTime;
+        @JsonProperty("endTime")
+        private String endTime;
+        @JsonProperty("pkID")
+        private String pkID;
+        @JsonProperty("premiumYear")
+        private String premiumYear;
+        @JsonProperty("afterPremiumYear")
+        private String afterPremiumYear;
+        @JsonProperty("adjustRate")
+        private String adjustRate;
+        @JsonProperty("nindemlmt")
+        private String nindemlmt;
+        @JsonProperty("amtChange")
+        private String amtChange;
+        @JsonProperty("ductAmt")
+        private String ductAmt;
+        @JsonProperty("perAmt")
+        private String perAmt;
+        @JsonProperty("actPremium")
+        private String actPremium;
+        @JsonProperty("days")
+        private String days;
+        @JsonProperty("ductDiscount")
+        private String ductDiscount;
+        @JsonProperty("seqNo")
+        private String seqNo;
+        @JsonProperty("totalPremium")
+        private String totalPremium;
+        @JsonProperty("serviceTimes")
+        private String serviceTimes;
+        @JsonProperty("ductRate")
+        private String ductRate;
+        @JsonProperty("kindValueRate")
+        private String kindValueRate;
+        @JsonProperty("kindCost")
+        private String kindCost;
+        @JsonProperty("dutyCode")
+        private String dutyCode;
+        @JsonProperty("dutyName")
+        private String dutyName;
+        @JsonProperty("perPrm")
+        private String perPrm;
+        @JsonProperty("prodPlace")
+        private String prodPlace;
+        @JsonProperty("cancelMrk")
+        private String cancelMrk;
+        @JsonProperty("adjustProportion")
+        private String adjustProportion;
+        @JsonProperty("floatRate")
+        private String floatRate;
+        @JsonProperty("identifyNo")
+        private String identifyNo;
+        @JsonProperty("cvrgType")
+        private String cvrgType;
+        @JsonProperty("onceInjurLmt")
+        private String onceInjurLmt;
+        @JsonProperty("onceMedicalIndemLmt")
+        private String onceMedicalIndemLmt;
+        @JsonProperty("oncePropertyIndemLmt")
+        private String oncePropertyIndemLmt;
+        @JsonProperty("oncePerDeathLmt")
+        private String oncePerDeathLmt;
+        @JsonProperty("oncePerDisableLmt")
+        private String oncePerDisableLmt;
+        @JsonProperty("onceIndemLmt")
+        private String onceIndemLmt;
+
+        private String nindemtChoose(){
+            if (Deductible.DEDUCTIBLE.equals(kindCode)) {
+                return Deductible.getDeductible().get(amount);
+            }
+            if (TicketNoType.getThirdInsurance().contains(kindCode)) {
+                return Deductible.getDeductible().get(amount);
+            }
+            return "";
+        }
+
+        public ItemKindsDTO(KindInfoVo kindInfoVo) {
+            this.actPremium = "0";
+            this.adjustRate = "0";
+            this.afterPremiumYear = "0";
+            this.amount = kindInfoVo.getAmount();
+            this.amtChange = "0";
+            this.basePremium = "0";
+            this.beginTime = "";
+            this.damageDeductible = "0";
+            this.days = "";
+            this.deductible = "";
+            this.deductibleFlag = "";
+            this.deductibleRatio = "";
+            this.discount = "0";
+            this.ductAmt = "";
+            this.ductDiscount = "";
+            this.dutyDays = "";
+            this.endTime = "";
+            this.kindCode = kindInfoVo.getKindCode();
+            this.kindName = kindInfoVo.getKindName();
+            this.liabilityLevel = "";
+            this.mainRiskFlag = "";
+            this.needCalculateAmount = "";
+            this.noDeductible = "";
+            this.noDeductiblePremium = "";
+            this.noTaxDiscountPremium = "";
+            this.payPremium = "0";
+            this.perAmt = kindInfoVo.getAmount();
+            this.pkID = "";
+            this.premium = "0";
+            this.premiumYear = "0";
+            this.proposalNo = "";
+            this.quantity = kindInfoVo.getQuantity();
+            this.rate = "0";
+            this.seqNo = "";
+            this.taxDiscountPremium = "0";
+            this.valueAddTax = "0";
+            this.yearPayPremium = "0";
+            this.serviceTimes = "";
+            this.ductRate = "";
+            this.kindValueRate = "";
+            this.kindCost = "0.00";
+            this.nindemlmt = nindemtChoose();
+        }
+
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class SpecialInfosDTO {
+        @JsonProperty("specialNo")
+        private String specialNo;
+        @JsonProperty("specialContent")
+        private String specialContent;
+        @JsonProperty("unfixSpcFlag")
+        private String unfixSpcFlag;
+        @JsonProperty("onlyLook")
+        private String onlyLook;
+    }
+
+}

+ 60 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/CheckCarInfomationDTO.java

@@ -0,0 +1,60 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class CheckCarInfomationDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7715313986126454795L;
+    @JsonProperty("noInspectReason")
+    private String noInspectReason;
+    @JsonProperty("inspectionPerson")
+    private String inspectionPerson;
+    @JsonProperty("inspectionAddress")
+    private String inspectionAddress;
+    @JsonProperty("inspectionTime")
+    private String inspectionTime;
+    @JsonProperty("carSameLicense")
+    private String carSameLicense;
+    @JsonProperty("existCar")
+    private String existCar;
+    @JsonProperty("glassWhole")
+    private String glassWhole;
+    @JsonProperty("modifyCar")
+    private String modifyCar;
+    @JsonProperty("destroyCar")
+    private String destroyCar;
+    @JsonProperty("startCar")
+    private String startCar;
+    @JsonProperty("inspectionStandard")
+    private String inspectionStandard;
+    @JsonProperty("inspectionSuggestion")
+    private String inspectionSuggestion;
+    @JsonProperty("carInspection")
+    private String carInspection;
+    @JsonProperty("inspectionResult")
+    private String inspectionResult;
+    @JsonProperty("inspectionCode")
+    private String inspectionCode;
+    @JsonProperty("vehicleInspectionMessage")
+    private String vehicleInspectionMessage;
+    @JsonProperty("checkStatus")
+    private String checkStatus;
+    @JsonProperty("damagedSite")
+    private String damagedSite;
+
+    public CheckCarInfomationDTO() {
+        this.carInspection = "305005003";
+        this.inspectionPerson = "";
+        this.inspectionResult = "";
+        this.damagedSite = "";
+        this.inspectionTime = "";
+        this.noInspectReason = "383001";
+        this.checkStatus = "0";
+    }
+}

+ 894 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/CompulsoryInsuranceDTO.java

@@ -0,0 +1,894 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import cn.hutool.core.date.DateTime;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.RiskInfoVo;
+import com.jzg.quotation.bohai.enums.dictionary.CIKind;
+import com.jzg.quotation.bohai.enums.dictionary.PayCarType;
+import com.jzg.quotation.bohai.enums.dictionary.TaxTypeYn;
+import com.jzg.quotation.commons.utils.TimeProcessing;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * 大家财险交强险信息DTO
+ */
+@Data
+public class CompulsoryInsuranceDTO {
+
+    /** 产品信息 */
+    @JsonProperty("productInfo")
+    private ProductInfoDTO productInfo;
+
+    /** 险种明细列表 */
+    @JsonProperty("itemKinds")
+    private List<ItemKindsDTO> itemKinds;
+
+    /** 车船税信息 */
+    @JsonProperty("carShipTax")
+    private CarShipTaxDTO carShipTax;
+
+    /** 系数信息 */
+    @JsonProperty("coefficientInfo")
+    private CoefficientInfoDTO coefficientInfo;
+
+    /** 平台信息 */
+    @JsonProperty("platformInfo")
+    private String platformInfo;
+
+    /** UBI信息 */
+    @JsonProperty("ubiMessage")
+    private String ubiMessage;
+
+    /** 费用信息 */
+    @JsonProperty("feeInfos")
+    private String feeInfos;
+
+    /** 特殊信息列表 */
+    @JsonProperty("specialInfos")
+    private List<Object> specialInfos;
+
+    /**
+     * 构造交强险信息
+     * 
+     * @param ciRiskInfoVo 交强险风险信息
+     * @param vehicleExhaust 车辆排量
+     * @param seatCount 座位数
+     * @param completeKerbMass 整备质量
+     */
+    public CompulsoryInsuranceDTO(RiskInfoVo ciRiskInfoVo, double vehicleExhaust, int seatCount, String completeKerbMass) {
+        this.productInfo = new ProductInfoDTO(ciRiskInfoVo);
+        this.itemKinds = ItemKindsDTO.getKinds();
+        this.carShipTax = new CarShipTaxDTO(vehicleExhaust, seatCount, completeKerbMass);
+        this.coefficientInfo = new CoefficientInfoDTO();
+        this.specialInfos = List.of();
+    }
+
+    /**
+     * 默认构造函数
+     */
+    public CompulsoryInsuranceDTO() {
+        this.coefficientInfo = new CoefficientInfoDTO();
+        this.carShipTax = new CarShipTaxDTO();
+        this.itemKinds = List.of();
+        this.productInfo = new ProductInfoDTO();
+        this.specialInfos = List.of();
+    }
+
+    /**
+     * 交强险产品信息DTO
+     */
+    @NoArgsConstructor
+    @Data
+    public static class ProductInfoDTO {
+
+        @JsonProperty("businessID")
+        private String businessID;
+        @JsonProperty("effective")
+        private String effective;
+        @JsonProperty("startDate")
+        private String startDate;
+        @JsonProperty("endDate")
+        private String endDate;
+        @JsonProperty("productCode")
+        private String productCode;
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("proposalTime")
+        private String proposalTime;
+        @JsonProperty("premium")
+        private String premium;
+        @JsonProperty("feeRate")
+        private String feeRate;
+        @JsonProperty("feeCoef")
+        private String feeCoef;
+        @JsonProperty("proposalStatus")
+        private String proposalStatus;
+        @JsonProperty("tgtObjCpkid")
+        private String tgtObjCpkid;
+        @JsonProperty("artificialFlag")
+        private String artificialFlag;
+        @JsonProperty("flatCarReinsuredMessage")
+        private String flatCarReinsuredMessage;
+        @JsonProperty("caclCode")
+        private String caclCode;
+        @JsonProperty("resultCode")
+        private String resultCode;
+        @JsonProperty("underwritingCode")
+        private String underwritingCode;
+        @JsonProperty("message")
+        private String message;
+        @JsonProperty("errorMessage")
+        private String errorMessage;
+        @JsonProperty("lastPolicyNo")
+        private String lastPolicyNo;
+        @JsonProperty("lastEndDate")
+        private String lastEndDate;
+        @JsonProperty("policyNo")
+        private String policyNo;
+        @JsonProperty("quotedNo")
+        private String quotedNo;
+        @JsonProperty("performanceRate")
+        private String performanceRate;
+        @JsonProperty("teamManageFeeRate")
+        private String teamManageFeeRate;
+        @JsonProperty("underWriteMessage")
+        private String underWriteMessage;
+        @JsonProperty("underWriteMessageRecord")
+        private String underWriteMessageRecord;
+        @JsonProperty("sumPremium")
+        private String sumPremium;
+        @JsonProperty("discount")
+        private String discount;
+        @JsonProperty("valueAddTax")
+        private String valueAddTax;
+        @JsonProperty("noTaxSumPremium")
+        private String noTaxSumPremium;
+        @JsonProperty("sumInsured")
+        private String sumInsured;
+        @JsonProperty("invoiceForm")
+        private String invoiceForm;
+        @JsonProperty("meal")
+        private String meal;
+        @JsonProperty("renewMark")
+        private String renewMark;
+        @JsonProperty("serviceCode")
+        private String serviceCode;
+        @JsonProperty("day")
+        private String day;
+        @JsonProperty("elProposal")
+        private String elProposal;
+        @JsonProperty("elPolicy")
+        private String elPolicy;
+        @JsonProperty("selfMark")
+        private String selfMark;
+        @JsonProperty("issueDate")
+        private String issueDate;
+        @JsonProperty("syAdjustRate")
+        private String syAdjustRate;
+        @JsonProperty("isReform")
+        private String isReform;
+        @JsonProperty("taxRate")
+        private String taxRate;
+        @JsonProperty("taxPrm")
+        private String taxPrm;
+        @JsonProperty("lastYearEndDateSy")
+        private String lastYearEndDateSy;
+        @JsonProperty("planId")
+        private String planId;
+        @JsonProperty("planName")
+        private String planName;
+        @JsonProperty("number")
+        private String number;
+        @JsonProperty("perPrmSum")
+        private String perPrmSum;
+        @JsonProperty("perAmtSum")
+        private String perAmtSum;
+        @JsonProperty("lastYearEndDateJq")
+        private String lastYearEndDateJq;
+        @JsonProperty("orginAppNo")
+        private String orginAppNo;
+        @JsonProperty("plyCrtTm")
+        private String plyCrtTm;
+        @JsonProperty("adjustProportion")
+        private String adjustProportion;
+        @JsonProperty("basePremium")
+        private String basePremium;
+        @JsonProperty("province")
+        private String province;
+        @JsonProperty("city")
+        private String city;
+        @JsonProperty("county")
+        private String county;
+        @JsonProperty("street")
+        private String street;
+        @JsonProperty("subAddress")
+        private String subAddress;
+        @JsonProperty("houseConstruction")
+        private String houseConstruction;
+        @JsonProperty("uncarPayMark")
+        private String uncarPayMark;
+        @JsonProperty("serialNo")
+        private String serialNo;
+        @JsonProperty("uncarDateMark")
+        private String uncarDateMark;
+        @JsonProperty("supFlag")
+        private String supFlag;
+
+        public ProductInfoDTO(RiskInfoVo ciRiskInfoVo) {
+            this.businessID = "KSCD";
+            this.day = "365";
+            this.effective = "0";
+            this.elPolicy = "";
+            this.endDate = TimeProcessing.minusOneSecondAfterYear(ciRiskInfoVo.getStartDate());;
+            this.feeCoef = "";
+            this.feeRate = "";
+            this.lastPolicyNo = "";
+            this.policyNo = "";
+            this.premium = "0.00";
+            this.productCode = "0320";
+            this.proposalNo = "";
+            this.proposalStatus = "";
+            this.proposalTime = "";
+            this.renewMark = "";
+            this.selfMark = "";
+            this.startDate = ciRiskInfoVo.getStartDate();
+            this.isReform = "1";
+            this.taxRate = "";
+            this.noTaxSumPremium = "";
+            this.taxPrm = "";
+        }
+    }
+
+    /**
+     * 车船税信息DTO
+     */
+    @NoArgsConstructor
+    @Data
+    public static class CarShipTaxDTO {
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("taxPayWay")
+        private String taxPayWay;
+        @JsonProperty("oldTaxPayWay")
+        private String oldTaxPayWay;
+        @JsonProperty("taxPayFlag")
+        private String taxPayFlag;
+        @JsonProperty("energyType")
+        private String energyType;
+        @JsonProperty("calculateWay")
+        private String calculateWay;
+        @JsonProperty("taxVehicleTypeCode")
+        private String taxVehicleTypeCode;
+        @JsonProperty("taxVhlType")
+        private String taxVhlType;
+        @JsonProperty("weight")
+        private String weight;
+        @JsonProperty("taxRegistryNumber")
+        private String taxRegistryNumber;
+        @JsonProperty("taxpayerIdentifier")
+        private String taxpayerIdentifier;
+        @JsonProperty("taxPayerName")
+        private String taxPayerName;
+        @JsonProperty("payerIdentifyType")
+        private String payerIdentifyType;
+        @JsonProperty("identifyNumber")
+        private String identifyNumber;
+        @JsonProperty("phone")
+        private String phone;
+        @JsonProperty("startDate")
+        private String startDate;
+        @JsonProperty("lastPayYear")
+        private String lastPayYear;
+        @JsonProperty("lastEndDate")
+        private String lastEndDate;
+        @JsonProperty("taxOfficeCode")
+        private String taxOfficeCode;
+        @JsonProperty("taxOfficeName")
+        private String taxOfficeName;
+        @JsonProperty("previousPay")
+        private String previousPay;
+        @JsonProperty("taxDue")
+        private String taxDue;
+        @JsonProperty("taxActual")
+        private String taxActual;
+        @JsonProperty("taxReliefPlan")
+        private String taxReliefPlan;
+        @JsonProperty("taxReductionReason")
+        private String taxReductionReason;
+        @JsonProperty("abateAmt")
+        private String abateAmt;
+        @JsonProperty("freeRate")
+        private String freeRate;
+        @JsonProperty("taxDocumentNumber")
+        private String taxDocumentNumber;
+        @JsonProperty("comDocumentNumber")
+        private String comDocumentNumber;
+        @JsonProperty("payStartTm")
+        private String payStartTm;
+        @JsonProperty("payEndTm")
+        private String payEndTm;
+        @JsonProperty("totalTax")
+        private String totalTax;
+        @JsonProperty("oldTotalTax")
+        private String oldTotalTax;
+        @JsonProperty("unitTaxAmt")
+        private String unitTaxAmt;
+        @JsonProperty("comTaxOrg")
+        private String comTaxOrg;
+        @JsonProperty("isCommissionTax")
+        private String isCommissionTax;
+        @JsonProperty("fuelType")
+        private String fuelType;
+        @JsonProperty("overDueAmt")
+        private String overDueAmt;
+        @JsonProperty("taxDocumentDate")
+        private String taxDocumentDate;
+        @JsonProperty("taxPaidAreaCode")
+        private String taxPaidAreaCode;
+        @JsonProperty("deptNonlocal")
+        private String deptNonlocal;
+        @JsonProperty("platformTaxType")
+        private String platformTaxType;
+        @JsonProperty("balanceTax")
+        private String balanceTax;
+        @JsonProperty("certificateDate")
+        private String certificateDate;
+        @JsonProperty("comTaxOrgCde")
+        private String comTaxOrgCde;
+        @JsonProperty("latestMrk")
+        private String latestMrk;
+        @JsonProperty("lastSaliBgnDate")
+        private String lastSaliBgnDate;
+        @JsonProperty("lastSaliEndDate")
+        private String lastSaliEndDate;
+        @JsonProperty("lastSaliInsurerCde")
+        private String lastSaliInsurerCde;
+        @JsonProperty("lastTaxYear")
+        private String lastTaxYear;
+        @JsonProperty("taxYear")
+        private String taxYear;
+        @JsonProperty("taxableTyp")
+        private String taxableTyp;
+        @JsonProperty("taxableMonths")
+        private String taxableMonths;
+        @JsonProperty("lastYearTaxableMonths")
+        private String lastYearTaxableMonths;
+        @JsonProperty("lastSaliPlyNo")
+        private String lastSaliPlyNo;
+        @JsonProperty("overdueDays")
+        private String overdueDays;
+        @JsonProperty("overdueFineProp")
+        private String overdueFineProp;
+        @JsonProperty("chargeProp")
+        private String chargeProp;
+        @JsonProperty("chargeAmt")
+        private String chargeAmt;
+        @JsonProperty("taxPayerAddr")
+        private String taxPayerAddr;
+        @JsonProperty("notPayNo")
+        private String notPayNo;
+        @JsonProperty("subTaxItemCde")
+        private String subTaxItemCde;
+        @JsonProperty("taxUnit")
+        private String taxUnit;
+        @JsonProperty("taxItemCde")
+        private String taxItemCde;
+        @JsonProperty("shortType")
+        private String shortType;
+        @JsonProperty("shortMon")
+        private String shortMon;
+        @JsonProperty("vehicleNumber")
+        private String vehicleNumber;
+        @JsonProperty("newCarMon")
+        private String newCarMon;
+        @JsonProperty("taxBelongTm")
+        private String taxBelongTm;
+        @JsonProperty("taxVchNo")
+        private String taxVchNo;
+        @JsonProperty("taxVchTyp")
+        private String taxVchTyp;
+        @JsonProperty("usage")
+        private String usage;
+        @JsonProperty("vhlAddr")
+        private String vhlAddr;
+        @JsonProperty("vhlAddrSub")
+        private String vhlAddrSub;
+        @JsonProperty("taxpayerComId")
+        private String taxpayerComId;
+        @JsonProperty("taxpayerCde")
+        private String taxpayerCde;
+        @JsonProperty("taxAuthCde")
+        private String taxAuthCde;
+        @JsonProperty("identifyType")
+        private String identifyType;
+        @JsonProperty("freeVhlBrand")
+        private String freeVhlBrand;
+        @JsonProperty("freeVhlNo")
+        private String freeVhlNo;
+        @JsonProperty("isMust")
+        private Integer isMust;
+        @JsonProperty("taxStartDate")
+        private String taxStartDate;
+        @JsonProperty("taxEndDate")
+        private String taxEndDate;
+
+        public CarShipTaxDTO(double vehicleExhaust, int seatCount, String completeKerbMass) {
+            String payCarType = PayCarType.getPayCarType(vehicleExhaust, seatCount);
+            this.comDocumentNumber = "";
+            this.comTaxOrg = "";
+            this.comTaxOrgCde = "";
+            this.deptNonlocal = "";
+            this.freeRate = "";
+            this.fuelType = "";
+            this.identifyType = "";
+            this.isCommissionTax = "";
+            this.overDueAmt = "";
+            int year = DateTime.now().year();
+            this.payEndTm = year + "-12-31";
+            this.payStartTm = year + "-01-01";
+            this.previousPay = "";
+            this.taxActual = "";
+            this.taxDocumentDate = "";
+            this.taxDocumentNumber = "";
+            this.taxPaidAreaCode = "";
+            this.taxPayWay = TaxTypeYn.TAX_TYPE_YN_3T5002.getCode();
+            this.taxReductionReason = "";
+            this.taxReliefPlan = "";
+            this.taxVhlType = payCarType;
+            this.taxpayerIdentifier = "";
+            this.taxPayerName = "";
+            this.totalTax = "";
+            this.unitTaxAmt = "";
+            this.weight = completeKerbMass;
+            this.usage = "200";
+            this.certificateDate = "";
+            this.abateAmt = "";
+        }
+    }
+
+    /**
+     * 交强险系数信息DTO
+     */
+    @Data
+    public static class CoefficientInfoDTO {
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("entireDiscount")
+        private String entireDiscount;
+        @JsonProperty("claimAdjustValue")
+        private String claimAdjustValue;
+        @JsonProperty("claimFlatReason")
+        private String claimFlatReason;
+        @JsonProperty("peccancyAdjustValue")
+        private String peccancyAdjustValue;
+        @JsonProperty("noFloatReason")
+        private String noFloatReason;
+        @JsonProperty("lastPolicyNum")
+        private String lastPolicyNum;
+        @JsonProperty("drunkFeeRateFlat")
+        private String drunkFeeRateFlat;
+        @JsonProperty("totalCoefNum")
+        private String totalCoefNum;
+        @JsonProperty("drunkTotalCoef")
+        private String drunkTotalCoef;
+        @JsonProperty("totalCoef")
+        private String totalCoef;
+        @JsonProperty("drinkFeeRateFlat")
+        private String drinkFeeRateFlat;
+        @JsonProperty("lossRatioCi")
+        private String lossRatioCi;
+        @JsonProperty("lossRatioBi")
+        private String lossRatioBi;
+        @JsonProperty("totalRatio")
+        private String totalRatio;
+        @JsonProperty("handFeeCi")
+        private String handFeeCi;
+        @JsonProperty("expDisCoef")
+        private String expDisCoef;
+        @JsonProperty("noComLastFlatRsn")
+        private String noComLastFlatRsn;
+        @JsonProperty("selfChannelRatio")
+        private String selfChannelRatio;
+        @JsonProperty("selfSubmitRatio")
+        private String selfSubmitRatio;
+        @JsonProperty("reason")
+        private String reason;
+        @JsonProperty("recordCoefCi")
+        private String recordCoefCi;
+        @JsonProperty("trafficFloatRes")
+        private String trafficFloatRes;
+        @JsonProperty("areaCoef")
+        private String areaCoef;
+        @JsonProperty("lastPayAmt")
+        private String lastPayAmt;
+        @JsonProperty("handFeeBi")
+        private String handFeeBi;
+        @JsonProperty("channelCoefRes")
+        private String channelCoefRes;
+        @JsonProperty("trafficRateFloat")
+        private String trafficRateFloat;
+        @JsonProperty("startTm")
+        private String startTm;
+        @JsonProperty("endTm")
+        private String endTm;
+        @JsonProperty("lowestCoef")
+        private String lowestCoef;
+        @JsonProperty("suggestCoef")
+        private String suggestCoef;
+        @JsonProperty("payoutRateCi")
+        private String payoutRateCi;
+        @JsonProperty("payoutRateBi")
+        private String payoutRateBi;
+        @JsonProperty("payoutRate")
+        private String payoutRate;
+        @JsonProperty("riskScore")
+        private String riskScore;
+        @JsonProperty("totalFeeRate")
+        private String totalFeeRate;
+        @JsonProperty("singlePaymentCi")
+        private String singlePaymentCi;
+        @JsonProperty("singlePaymentBi")
+        private String singlePaymentBi;
+        @JsonProperty("singlePayment")
+        private String singlePayment;
+        @JsonProperty("insureYears")
+        private String insureYears;
+        @JsonProperty("claimTimes")
+        private String claimTimes;
+        @JsonProperty("claimAdjustLvl")
+        private String claimAdjustLvl;
+        @JsonProperty("pricingAdjustValue")
+        private String pricingAdjustValue;
+        @JsonProperty("riskVar")
+        private String riskVar;
+        @JsonProperty("pricePlan")
+        private String pricePlan;
+        @JsonProperty("floatDown")
+        private String floatDown;
+        @JsonProperty("compensateFeeRate")
+        private String compensateFeeRate;
+        @JsonProperty("fixedDropDiscount")
+        private String fixedDropDiscount;
+        @JsonProperty("entireInitialDiscount")
+        private String entireInitialDiscount;
+        @JsonProperty("coefficientScore")
+        private String coefficientScore;
+        @JsonProperty("pubScores")
+        private String pubScores;
+        @JsonProperty("microDiscoverScore")
+        private String microDiscoverScore;
+        @JsonProperty("truckRiskMrk")
+        private String truckRiskMrk;
+        @JsonProperty("busRiskMrk")
+        private String busRiskMrk;
+        @JsonProperty("truckScore")
+        private String truckScore;
+        @JsonProperty("truckRiskWarning")
+        private String truckRiskWarning;
+        @JsonProperty("predictedNature")
+        private String predictedNature;
+        @JsonProperty("fullCoverageScore")
+        private String fullCoverageScore;
+        @JsonProperty("liabilityOnlyScore")
+        private String liabilityOnlyScore;
+        @JsonProperty("ctpOnlyScore")
+        private String ctpOnlyScore;
+        @JsonProperty("renewalFrequency")
+        private String renewalFrequency;
+        @JsonProperty("didScore")
+        private String didScore;
+        @JsonProperty("vhlPriceType")
+        private String vhlPriceType;
+        @JsonProperty("suggestedDiscount")
+        private String suggestedDiscount;
+        @JsonProperty("onlineCarScore")
+        private String onlineCarScore;
+        @JsonProperty("carIllegalScore")
+        private String carIllegalScore;
+        @JsonProperty("completeControlScore")
+        private String completeControlScore;
+        @JsonProperty("pingAnBillCOMELR")
+        private String pingAnBillCOMELR;
+        @JsonProperty("pingAnBillCTPELR")
+        private String pingAnBillCTPELR;
+        @JsonProperty("pingAnBillELR")
+        private String pingAnBillELR;
+
+        public CoefficientInfoDTO() {
+            this.proposalNo = "";
+            this.entireDiscount = "";
+            this.claimAdjustValue = "";
+            this.claimFlatReason = "";
+            this.peccancyAdjustValue = "";
+            this.noFloatReason = "";
+            this.lastPolicyNum = "";
+            this.drunkFeeRateFlat = "";
+            this.totalCoefNum = "";
+            this.drunkTotalCoef = "";
+            this.totalCoef = "";
+            this.drinkFeeRateFlat = "";
+            this.lossRatioCi = "";
+            this.lossRatioBi = "";
+            this.totalRatio = "";
+            this.handFeeCi = "";
+            this.expDisCoef = "";
+            this.noComLastFlatRsn = "";
+            this.selfChannelRatio = "";
+            this.selfSubmitRatio = "";
+            this.reason = "";
+            this.recordCoefCi = "";
+            this.trafficFloatRes = "";
+            this.areaCoef = "";
+            this.lastPayAmt = "";
+            this.handFeeBi = "";
+            this.channelCoefRes = "";
+            this.trafficRateFloat = "";
+            this.startTm = "";
+            this.endTm = "";
+            this.lowestCoef = "";
+            this.suggestCoef = "";
+            this.payoutRateCi = "";
+            this.payoutRateBi = "";
+            this.payoutRate = "";
+            this.riskScore = "";
+            this.totalFeeRate = "";
+            this.singlePaymentCi = "";
+            this.singlePaymentBi = "";
+            this.singlePayment = "";
+            this.insureYears = "";
+            this.claimTimes = "";
+            this.claimAdjustLvl = "";
+            this.pricingAdjustValue = "";
+            this.riskVar = "";
+            this.pricePlan = "";
+            this.floatDown = "";
+            this.compensateFeeRate = "";
+            this.fixedDropDiscount = "";
+            this.entireInitialDiscount = "";
+            this.coefficientScore = "";
+            this.pubScores = "";
+            this.microDiscoverScore = "";
+            this.truckRiskMrk = "";
+            this.busRiskMrk = "";
+            this.truckScore = "";
+            this.truckRiskWarning = "";
+            this.predictedNature = "";
+            this.fullCoverageScore = "";
+            this.liabilityOnlyScore = "";
+            this.ctpOnlyScore = "";
+            this.renewalFrequency = "";
+            this.didScore = "";
+            this.vhlPriceType = "";
+            this.suggestedDiscount = "";
+            this.onlineCarScore = "";
+            this.carIllegalScore = "";
+            this.completeControlScore = "";
+            this.pingAnBillCOMELR = "";
+            this.pingAnBillCTPELR = "";
+            this.pingAnBillELR = "";
+        }
+    }
+
+    /**
+     * 交强险险种明细DTO
+     */
+    @NoArgsConstructor
+    @Data
+    public static class ItemKindsDTO {
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("kindCode")
+        private String kindCode;
+        @JsonProperty("kindName")
+        private String kindName;
+        @JsonProperty("kindPackage")
+        private String kindPackage;
+        @JsonProperty("productName")
+        private String productName;
+        @JsonProperty("basePremium")
+        private String basePremium;
+        @JsonProperty("noTaxDiscountPremium")
+        private String noTaxDiscountPremium;
+        @JsonProperty("taxDiscountPremium")
+        private String taxDiscountPremium;
+        @JsonProperty("premium")
+        private String premium;
+        @JsonProperty("noDeductible")
+        private String noDeductible;
+        @JsonProperty("noDeductiblePremium")
+        private String noDeductiblePremium;
+        @JsonProperty("payPremium")
+        private String payPremium;
+        @JsonProperty("amount")
+        private String amount;
+        @JsonProperty("liabilityLevel")
+        private String liabilityLevel;
+        @JsonProperty("damageDeductible")
+        private String damageDeductible;
+        @JsonProperty("deductible")
+        private String deductible;
+        @JsonProperty("deductibleFlag")
+        private String deductibleFlag;
+        @JsonProperty("rate")
+        private String rate;
+        @JsonProperty("deductibleRatio")
+        private String deductibleRatio;
+        @JsonProperty("dutyDays")
+        private String dutyDays;
+        @JsonProperty("quantity")
+        private String quantity;
+        @JsonProperty("yearPayPremium")
+        private String yearPayPremium;
+        @JsonProperty("glassType")
+        private String glassType;
+        @JsonProperty("valueAddTax")
+        private String valueAddTax;
+        @JsonProperty("discount")
+        private String discount;
+        @JsonProperty("needCalculateAmount")
+        private String needCalculateAmount;
+        @JsonProperty("mainRiskFlag")
+        private String mainRiskFlag;
+        @JsonProperty("beginTime")
+        private String beginTime;
+        @JsonProperty("endTime")
+        private String endTime;
+        @JsonProperty("pkID")
+        private String pkID;
+        @JsonProperty("premiumYear")
+        private String premiumYear;
+        @JsonProperty("afterPremiumYear")
+        private String afterPremiumYear;
+        @JsonProperty("adjustRate")
+        private String adjustRate;
+        @JsonProperty("nindemlmt")
+        private String nindemlmt;
+        @JsonProperty("amtChange")
+        private String amtChange;
+        @JsonProperty("ductAmt")
+        private String ductAmt;
+        @JsonProperty("perAmt")
+        private String perAmt;
+        @JsonProperty("actPremium")
+        private String actPremium;
+        @JsonProperty("days")
+        private String days;
+        @JsonProperty("ductDiscount")
+        private String ductDiscount;
+        @JsonProperty("seqNo")
+        private String seqNo;
+        @JsonProperty("totalPremium")
+        private String totalPremium;
+        @JsonProperty("serviceTimes")
+        private String serviceTimes;
+        @JsonProperty("ductRate")
+        private String ductRate;
+        @JsonProperty("kindValueRate")
+        private String kindValueRate;
+        @JsonProperty("kindCost")
+        private String kindCost;
+        @JsonProperty("dutyCode")
+        private String dutyCode;
+        @JsonProperty("dutyName")
+        private String dutyName;
+        @JsonProperty("perPrm")
+        private String perPrm;
+        @JsonProperty("prodPlace")
+        private String prodPlace;
+        @JsonProperty("cancelMrk")
+        private String cancelMrk;
+        @JsonProperty("adjustProportion")
+        private String adjustProportion;
+        @JsonProperty("floatRate")
+        private String floatRate;
+        @JsonProperty("identifyNo")
+        private String identifyNo;
+        @JsonProperty("cvrgType")
+        private String cvrgType;
+        @JsonProperty("onceInjurLmt")
+        private String onceInjurLmt;
+        @JsonProperty("onceMedicalIndemLmt")
+        private String onceMedicalIndemLmt;
+        @JsonProperty("oncePropertyIndemLmt")
+        private String oncePropertyIndemLmt;
+        @JsonProperty("oncePerDeathLmt")
+        private String oncePerDeathLmt;
+        @JsonProperty("oncePerDisableLmt")
+        private String oncePerDisableLmt;
+        @JsonProperty("onceIndemLmt")
+        private String onceIndemLmt;
+
+        /**
+         * 构建险种明细DTO
+         * 
+         * @param amount 保险金额
+         * @param ciKind 交强险险种枚举
+         * @return 险种明细DTO
+         */
+        private static ItemKindsDTO buildItemKindsDTO(String amount, CIKind ciKind) {
+            ItemKindsDTO itemKindsDTO = new ItemKindsDTO();
+            itemKindsDTO.setProposalNo("");
+            itemKindsDTO.setKindCode(ciKind.getKindCode());
+            itemKindsDTO.setKindName(ciKind.getKindName());
+            itemKindsDTO.setKindPackage("");
+            itemKindsDTO.setProductName("");
+            itemKindsDTO.setBasePremium("0");
+            itemKindsDTO.setNoTaxDiscountPremium("");
+            itemKindsDTO.setTaxDiscountPremium("0");
+            itemKindsDTO.setPremium("");
+            itemKindsDTO.setNoDeductible("");
+            itemKindsDTO.setNoDeductiblePremium("");
+            itemKindsDTO.setPayPremium("0");
+            itemKindsDTO.setAmount(amount);
+            itemKindsDTO.setLiabilityLevel("");
+            itemKindsDTO.setDamageDeductible("0");
+            itemKindsDTO.setDeductible("");
+            itemKindsDTO.setDeductibleFlag("");
+            itemKindsDTO.setRate("0");
+            itemKindsDTO.setDeductibleRatio("");
+            itemKindsDTO.setDutyDays("");
+            itemKindsDTO.setQuantity("0");
+            itemKindsDTO.setYearPayPremium("0");
+            itemKindsDTO.setGlassType("");
+            itemKindsDTO.setValueAddTax("0");
+            itemKindsDTO.setDiscount("0");
+            itemKindsDTO.setNeedCalculateAmount("");
+            itemKindsDTO.setMainRiskFlag("");
+            itemKindsDTO.setBeginTime("");
+            itemKindsDTO.setEndTime("");
+            itemKindsDTO.setPkID("");
+            itemKindsDTO.setPremiumYear("0");
+            itemKindsDTO.setAfterPremiumYear("0");
+            itemKindsDTO.setAdjustRate("0");
+            itemKindsDTO.setNindemlmt("");
+            itemKindsDTO.setAmtChange("0");
+            itemKindsDTO.setDuctAmt("");
+            itemKindsDTO.setPerAmt("");
+            itemKindsDTO.setActPremium("0");
+            itemKindsDTO.setDays("");
+            itemKindsDTO.setDuctDiscount("");
+            itemKindsDTO.setSeqNo("");
+            itemKindsDTO.setTotalPremium("");
+            itemKindsDTO.setServiceTimes("");
+            itemKindsDTO.setDuctRate("");
+            itemKindsDTO.setKindValueRate("");
+            itemKindsDTO.setKindCost("");
+            itemKindsDTO.setDutyCode("");
+            itemKindsDTO.setDutyName("");
+            itemKindsDTO.setPerPrm("");
+            itemKindsDTO.setProdPlace("");
+            itemKindsDTO.setCancelMrk("");
+            itemKindsDTO.setAdjustProportion("");
+            itemKindsDTO.setFloatRate("");
+            itemKindsDTO.setIdentifyNo("");
+            itemKindsDTO.setCvrgType("");
+            itemKindsDTO.setOnceInjurLmt("");
+            itemKindsDTO.setOnceMedicalIndemLmt("");
+            itemKindsDTO.setOncePropertyIndemLmt("");
+            itemKindsDTO.setOncePerDeathLmt("");
+            itemKindsDTO.setOncePerDisableLmt("");
+            itemKindsDTO.setOnceIndemLmt("");
+            return itemKindsDTO;
+        }
+
+        /**
+         * 获取交强险标准险种列表
+         * 
+         * @return 交强险险种明细列表
+         */
+        public static List<ItemKindsDTO> getKinds() {
+            ItemKindsDTO kind030055 = buildItemKindsDTO("180000", CIKind.KIND_030055);
+            ItemKindsDTO kind030056 = buildItemKindsDTO("18000", CIKind.KIND_030056);
+            ItemKindsDTO kind030057 = buildItemKindsDTO("2000", CIKind.KIND_030057);
+            ItemKindsDTO kind030058 = buildItemKindsDTO("18000", CIKind.KIND_030058);
+            ItemKindsDTO kind030059 = buildItemKindsDTO("1800", CIKind.KIND_030059);
+            ItemKindsDTO kind030060 = buildItemKindsDTO("100", CIKind.KIND_030060);
+            return List.of(kind030055, kind030056, kind030057, kind030058, kind030059, kind030060);
+        }
+
+    }
+
+}

+ 323 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/DriveInsuranceDTO.java

@@ -0,0 +1,323 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.util.CollectionUtils;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@AllArgsConstructor
+@Data
+public class DriveInsuranceDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 3267712286988097245L;
+
+    @JsonProperty("productInfo")
+    private ProductInfoDTO productInfo;
+
+    @JsonProperty("itemKinds")
+    private List<ItemKindsDTO> itemKinds;
+
+    public DriveInsuranceDTO() {
+        this.productInfo = new ProductInfoDTO();
+        this.itemKinds = new ArrayList<>();
+    }
+
+    public DriveInsuranceDTO(List<AccidentalDrivingVo> accidentalDrivings) {
+        if (!CollectionUtils.isEmpty(accidentalDrivings)) {
+            AccidentalDrivingVo accidentalDrivingVo = accidentalDrivings.get(0);
+            this.productInfo = new ProductInfoDTO(accidentalDrivingVo);
+        }
+        this.itemKinds = new ArrayList<>();
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ProductInfoDTO {
+        @JsonProperty("businessID")
+        private String businessID;
+        @JsonProperty("effective")
+        private String effective;
+        @JsonProperty("startDate")
+        private String startDate;
+        @JsonProperty("endDate")
+        private String endDate;
+        @JsonProperty("productCode")
+        private String productCode;
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("proposalTime")
+        private String proposalTime;
+        @JsonProperty("premium")
+        private String premium;
+        @JsonProperty("feeRate")
+        private String feeRate;
+        @JsonProperty("feeCoef")
+        private String feeCoef;
+        @JsonProperty("proposalStatus")
+        private String proposalStatus;
+        @JsonProperty("tgtObjCpkid")
+        private String tgtObjCpkid;
+        @JsonProperty("artificialFlag")
+        private String artificialFlag;
+        @JsonProperty("flatCarReinsuredMessage")
+        private String flatCarReinsuredMessage;
+        @JsonProperty("caclCode")
+        private String caclCode;
+        @JsonProperty("resultCode")
+        private String resultCode;
+        @JsonProperty("underwritingCode")
+        private String underwritingCode;
+        @JsonProperty("message")
+        private String message;
+        @JsonProperty("errorMessage")
+        private String errorMessage;
+        @JsonProperty("lastPolicyNo")
+        private String lastPolicyNo;
+        @JsonProperty("lastEndDate")
+        private String lastEndDate;
+        @JsonProperty("policyNo")
+        private String policyNo;
+        @JsonProperty("quotedNo")
+        private String quotedNo;
+        @JsonProperty("performanceRate")
+        private String performanceRate;
+        @JsonProperty("teamManageFeeRate")
+        private String teamManageFeeRate;
+        @JsonProperty("underWriteMessage")
+        private String underWriteMessage;
+        @JsonProperty("underWriteMessageRecord")
+        private String underWriteMessageRecord;
+        @JsonProperty("sumPremium")
+        private String sumPremium;
+        @JsonProperty("discount")
+        private String discount;
+        @JsonProperty("valueAddTax")
+        private String valueAddTax;
+        @JsonProperty("noTaxSumPremium")
+        private String noTaxSumPremium;
+        @JsonProperty("sumInsured")
+        private String sumInsured;
+        @JsonProperty("invoiceForm")
+        private String invoiceForm;
+        @JsonProperty("meal")
+        private String meal;
+        @JsonProperty("renewMark")
+        private String renewMark;
+        @JsonProperty("serviceCode")
+        private String serviceCode;
+        @JsonProperty("day")
+        private String day;
+        @JsonProperty("elProposal")
+        private String elProposal;
+        @JsonProperty("elPolicy")
+        private String elPolicy;
+        @JsonProperty("selfMark")
+        private String selfMark;
+        @JsonProperty("issueDate")
+        private String issueDate;
+        @JsonProperty("syAdjustRate")
+        private String syAdjustRate;
+        @JsonProperty("isReform")
+        private String isReform;
+        @JsonProperty("taxRate")
+        private String taxRate;
+        @JsonProperty("taxPrm")
+        private String taxPrm;
+        @JsonProperty("lastYearEndDateSy")
+        private String lastYearEndDateSy;
+        @JsonProperty("planId")
+        private String planId;
+        @JsonProperty("planName")
+        private String planName;
+        @JsonProperty("number")
+        private Integer number;
+        @JsonProperty("perPrmSum")
+        private double perPrmSum;
+        @JsonProperty("perAmtSum")
+        private double perAmtSum;
+        @JsonProperty("lastYearEndDateJq")
+        private String lastYearEndDateJq;
+        @JsonProperty("orginAppNo")
+        private String orginAppNo;
+        @JsonProperty("plyCrtTm")
+        private String plyCrtTm;
+        @JsonProperty("adjustProportion")
+        private String adjustProportion;
+        @JsonProperty("basePremium")
+        private String basePremium;
+        @JsonProperty("province")
+        private String province;
+        @JsonProperty("city")
+        private String city;
+        @JsonProperty("county")
+        private String county;
+        @JsonProperty("street")
+        private String street;
+        @JsonProperty("subAddress")
+        private String subAddress;
+        @JsonProperty("houseConstruction")
+        private String houseConstruction;
+        @JsonProperty("uncarPayMark")
+        private String uncarPayMark;
+        @JsonProperty("serialNo")
+        private String serialNo;
+        @JsonProperty("uncarDateMark")
+        private String uncarDateMark;
+        @JsonProperty("supFlag")
+        private String supFlag;
+
+        public ProductInfoDTO(AccidentalDrivingVo accidentalDrivingVo) {
+            this.businessID = "";
+            this.day = "";
+            this.endDate = "";
+            this.policyNo = "";
+            this.productCode = "";
+            this.proposalNo = "";
+            this.proposalTime = "";
+            this.planId = "";
+            this.number = accidentalDrivingVo.getQuantity();
+            this.startDate = "";
+            this.premium = "";
+            this.sumInsured = "";
+            this.perPrmSum = 1;
+            this.perAmtSum = 1;
+            this.uncarDateMark = "";
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ItemKindsDTO {
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+        @JsonProperty("kindCode")
+        private String kindCode;
+        @JsonProperty("kindName")
+        private String kindName;
+        @JsonProperty("kindPackage")
+        private String kindPackage;
+        @JsonProperty("productName")
+        private String productName;
+        @JsonProperty("basePremium")
+        private String basePremium;
+        @JsonProperty("noTaxDiscountPremium")
+        private String noTaxDiscountPremium;
+        @JsonProperty("taxDiscountPremium")
+        private String taxDiscountPremium;
+        @JsonProperty("premium")
+        private String premium;
+        @JsonProperty("noDeductible")
+        private String noDeductible;
+        @JsonProperty("noDeductiblePremium")
+        private String noDeductiblePremium;
+        @JsonProperty("payPremium")
+        private String payPremium;
+        @JsonProperty("amount")
+        private String amount;
+        @JsonProperty("liabilityLevel")
+        private String liabilityLevel;
+        @JsonProperty("damageDeductible")
+        private String damageDeductible;
+        @JsonProperty("deductible")
+        private String deductible;
+        @JsonProperty("deductibleFlag")
+        private String deductibleFlag;
+        @JsonProperty("rate")
+        private String rate;
+        @JsonProperty("deductibleRatio")
+        private String deductibleRatio;
+        @JsonProperty("dutyDays")
+        private String dutyDays;
+        @JsonProperty("quantity")
+        private String quantity;
+        @JsonProperty("yearPayPremium")
+        private String yearPayPremium;
+        @JsonProperty("glassType")
+        private String glassType;
+        @JsonProperty("valueAddTax")
+        private String valueAddTax;
+        @JsonProperty("discount")
+        private String discount;
+        @JsonProperty("needCalculateAmount")
+        private String needCalculateAmount;
+        @JsonProperty("mainRiskFlag")
+        private String mainRiskFlag;
+        @JsonProperty("beginTime")
+        private String beginTime;
+        @JsonProperty("endTime")
+        private String endTime;
+        @JsonProperty("pkID")
+        private String pkID;
+        @JsonProperty("premiumYear")
+        private String premiumYear;
+        @JsonProperty("afterPremiumYear")
+        private String afterPremiumYear;
+        @JsonProperty("adjustRate")
+        private String adjustRate;
+        @JsonProperty("nindemlmt")
+        private String nindemlmt;
+        @JsonProperty("amtChange")
+        private String amtChange;
+        @JsonProperty("ductAmt")
+        private String ductAmt;
+        @JsonProperty("perAmt")
+        private String perAmt;
+        @JsonProperty("actPremium")
+        private String actPremium;
+        @JsonProperty("days")
+        private String days;
+        @JsonProperty("ductDiscount")
+        private String ductDiscount;
+        @JsonProperty("seqNo")
+        private String seqNo;
+        @JsonProperty("totalPremium")
+        private String totalPremium;
+        @JsonProperty("serviceTimes")
+        private String serviceTimes;
+        @JsonProperty("ductRate")
+        private String ductRate;
+        @JsonProperty("kindValueRate")
+        private String kindValueRate;
+        @JsonProperty("kindCost")
+        private String kindCost;
+        @JsonProperty("dutyCode")
+        private String dutyCode;
+        @JsonProperty("dutyName")
+        private String dutyName;
+        @JsonProperty("perPrm")
+        private String perPrm;
+        @JsonProperty("prodPlace")
+        private String prodPlace;
+        @JsonProperty("cancelMrk")
+        private String cancelMrk;
+        @JsonProperty("adjustProportion")
+        private String adjustProportion;
+        @JsonProperty("floatRate")
+        private String floatRate;
+        @JsonProperty("identifyNo")
+        private String identifyNo;
+        @JsonProperty("cvrgType")
+        private String cvrgType;
+        @JsonProperty("onceInjurLmt")
+        private String onceInjurLmt;
+        @JsonProperty("onceMedicalIndemLmt")
+        private String onceMedicalIndemLmt;
+        @JsonProperty("oncePropertyIndemLmt")
+        private String oncePropertyIndemLmt;
+        @JsonProperty("oncePerDeathLmt")
+        private String oncePerDeathLmt;
+        @JsonProperty("oncePerDisableLmt")
+        private String oncePerDisableLmt;
+        @JsonProperty("onceIndemLmt")
+        private String onceIndemLmt;
+    }
+
+}

+ 17 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/EmptyObjectDTO.java

@@ -0,0 +1,17 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class EmptyObjectDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 2766925425429553845L;
+
+    public EmptyObjectDTO() {
+    }
+
+}

+ 85 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/FlatvhlInfoDTO.java

@@ -0,0 +1,85 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class FlatvhlInfoDTO {
+
+    @JsonProperty("modelNo")
+    private String modelNo;
+    @JsonProperty("modelIDCode")
+    private String modelIDCode;
+    @JsonProperty("tradeName")
+    private String tradeName;
+    @JsonProperty("brand")
+    private String brand;
+    @JsonProperty("series")
+    private String series;
+    @JsonProperty("carName")
+    private String carName;
+    @JsonProperty("noticeType")
+    private String noticeType;
+    @JsonProperty("configType")
+    private String configType;
+    @JsonProperty("categoryName")
+    private String categoryName;
+    @JsonProperty("deptName")
+    private String deptName;
+    @JsonProperty("pureRiskPremium")
+    private String pureRiskPremium;
+    @JsonProperty("pureRiskPremiumFlag")
+    private String pureRiskPremiumFlag;
+    @JsonProperty("refcode2")
+    private String refcode2;
+    @JsonProperty("dataSource")
+    private String dataSource;
+    @JsonProperty("modelFlag")
+    private String modelFlag;
+    @JsonProperty("selection")
+    private String selection;
+    @JsonProperty("vehlcleCode")
+    private String vehlcleCode;
+    @JsonProperty("vehlcleModeCode")
+    private String vehlcleModeCode;
+    @JsonProperty("curbWt")
+    private String curbWt;
+    @JsonProperty("displacement")
+    private String displacement;
+    @JsonProperty("seatNum")
+    private String seatNum;
+    @JsonProperty("fuelType")
+    private String fuelType;
+    @JsonProperty("vehicleStyleUniqueId")
+    private String vehicleStyleUniqueId;
+    @JsonProperty("industryModelCode")
+    private String industryModelCode;
+
+
+    public FlatvhlInfoDTO() {
+        this.modelNo = "";
+        this.modelIDCode = "";
+        this.tradeName = "";
+        this.brand = "";
+        this.series = "";
+        this.carName = "";
+        this.noticeType = "";
+        this.configType = "";
+        this.categoryName = "";
+        this.deptName = "";
+        this.pureRiskPremium = "";
+        this.pureRiskPremiumFlag = "";
+        this.refcode2 = "";
+        this.dataSource = "";
+        this.modelFlag = "";
+        this.selection = "1";
+        this.vehlcleCode = "";
+        this.vehlcleModeCode = "";
+        this.curbWt = "";
+        this.displacement = "";
+        this.seatNum = "";
+        this.fuelType = "";
+        this.vehicleStyleUniqueId = "";
+        this.industryModelCode = "";
+    }
+}

+ 284 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/PersonnelInformation.java

@@ -0,0 +1,284 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.quotation.commons.utils.TimeProcessing;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class PersonnelInformation implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 3579802980130508072L;
+
+    @JsonProperty("personId")
+    private String personId;
+    @JsonProperty("personName")
+    private String personName;
+    @JsonProperty("clientType")
+    private String clientType;
+    @JsonProperty("identifyType")
+    private String identifyType;
+    @JsonProperty("identifyNo")
+    private String identifyNo;
+    @JsonProperty("gender")
+    private String gender;
+    @JsonProperty("birthday")
+    private String birthday;
+    @JsonProperty("companyNature")
+    private String companyNature;
+    @JsonProperty("province")
+    private String province;
+    @JsonProperty("city")
+    private String city;
+    @JsonProperty("county")
+    private String county;
+    @JsonProperty("suffixAddr")
+    private String suffixAddr;
+    @JsonProperty("address")
+    private String address;
+    @JsonProperty("agentCertNo")
+    private String agentCertNo;
+    @JsonProperty("agentCertType")
+    private String agentCertType;
+    @JsonProperty("agentEmail")
+    private String agentEmail;
+    @JsonProperty("agentMobile")
+    private String agentMobile;
+    @JsonProperty("agentName")
+    private String agentName;
+    @JsonProperty("agentType")
+    private String agentType;
+    @JsonProperty("antiRiskLevel")
+    private String antiRiskLevel;
+    @JsonProperty("bankAccount")
+    private String bankAccount;
+    @JsonProperty("bankName")
+    private String bankName;
+    @JsonProperty("businessLevel")
+    private String businessLevel;
+    @JsonProperty("clientLevel")
+    private String clientLevel;
+    @JsonProperty("companyName")
+    private String companyName;
+    @JsonProperty("contactName")
+    private String contactName;
+    @JsonProperty("country")
+    private String country;
+    @JsonProperty("customerSource")
+    private String customerSource;
+    @JsonProperty("driverNear")
+    private String driverNear;
+    @JsonProperty("email")
+    private String email;
+    @JsonProperty("identifyEndDate")
+    private String identifyEndDate;
+    @JsonProperty("identifyEndDateMrk")
+    private String identifyEndDateMrk;
+    @JsonProperty("invoiceType")
+    private String invoiceType;
+    @JsonProperty("marriageStatus")
+    private String marriageStatus;
+    @JsonProperty("middleMoneyRisk")
+    private String middleMoneyRisk;
+    @JsonProperty("bigMoneyRisk")
+    private String bigMoneyRisk;
+    @JsonProperty("mobile")
+    private String mobile;
+    @JsonProperty("mobileId")
+    private String mobileId;
+    @JsonProperty("mobileIdType")
+    private String mobileIdType;
+    @JsonProperty("mobileName")
+    private String mobileName;
+    @JsonProperty("mobileType")
+    private String mobileType;
+    @JsonProperty("nation")
+    private String nation;
+    @JsonProperty("occupation")
+    private String occupation;
+    @JsonProperty("payerRelation")
+    private String payerRelation;
+    @JsonProperty("postCode")
+    private String postCode;
+    @JsonProperty("remark")
+    private String remark;
+    @JsonProperty("taxPayerNumber")
+    private String taxPayerNumber;
+    @JsonProperty("taxPayerType")
+    private String taxPayerType;
+    @JsonProperty("taxRegisterAddress")
+    private String taxRegisterAddress;
+
+    @JsonProperty("telephone")
+    private String telephone;
+
+    @JsonProperty("authenticationNo")
+    private String authenticationNo;
+
+    @JsonProperty("ethnic")
+    private String ethnic;
+
+    @JsonProperty("identifyBeginDate")
+    private String identifyBeginDate;
+
+    @JsonProperty("issueOrg")
+    private String issueOrg;
+
+    @JsonProperty("idCardAddr")
+    private String idCardAddr;
+
+    @JsonProperty("clientMessagePower")
+    private String clientMessagePower;
+
+    @JsonProperty("authenticationStatus")
+    private String authenticationStatus;
+
+    @JsonProperty("relCode")
+    private String relCode;
+
+    @JsonProperty("isOcr")
+    private String isOcr;
+
+    @JsonProperty("relOwnerCode")
+    private String relOwnerCode;
+
+    @JsonProperty("agentAddress")
+    private String agentAddress;
+
+    @JsonProperty("customerId")
+    private String customerId;
+
+    @JsonProperty("supplementInfo")
+    private SupplementInfoDTO supplementInfo;
+
+    @JsonProperty("ocrTaskId")
+    private String ocrTaskId;
+
+    public PersonnelInformation(CustomerInfoVo customerInfoVo) {
+        this.personId = "";
+        this.personName = customerInfoVo.getName();
+        this.clientType = "1";
+        this.identifyType = "01";
+        this.identifyNo = customerInfoVo.getIdentifyNumber();
+        this.gender = customerInfoVo.getGender();
+        this.birthday = TimeProcessing.dateToDateTime(customerInfoVo.getBirthday());
+        this.companyNature = "9";
+        this.province = customerInfoVo.getProvinceCode();
+        this.city = customerInfoVo.getCityCode();
+        this.county = customerInfoVo.getCountyCode();
+        this.suffixAddr = customerInfoVo.getAddr();
+        this.address = customerInfoVo.getAddr();
+        this.agentCertNo = "";
+        this.agentCertType = "";
+        this.agentEmail = "";
+        this.agentMobile = "";
+        this.agentName = "";
+        this.agentType = "";
+        this.antiRiskLevel = "";
+        this.bankAccount = "";
+        this.bankName = "";
+        this.businessLevel = "";
+        this.clientLevel = "";
+        this.companyName = "";
+        this.contactName = "";
+        this.country = "";
+        this.customerSource = "";
+        this.driverNear = "";
+        this.email = "";
+        this.identifyEndDate = TimeProcessing.dateToDateTime(customerInfoVo.getIdentifyValidEndDate());
+        this.identifyEndDateMrk = "";
+        this.invoiceType = "";
+        this.marriageStatus = "";
+        this.middleMoneyRisk = "1801";
+        this.bigMoneyRisk = "1008";
+        this.mobile = customerInfoVo.getMobile();
+        this.mobileId = "";
+        this.mobileIdType = "";
+        this.mobileName = "";
+        this.mobileType = "";
+        this.nation = "1";
+        this.occupation = "1H";
+        this.payerRelation = "";
+        this.postCode = "";
+        this.remark = "";
+        this.taxPayerNumber = "";
+        this.taxPayerType = "";
+        this.taxRegisterAddress = "";
+        this.telephone = "";
+        this.authenticationNo = "";
+        this.ethnic = "";
+        this.identifyBeginDate = "";
+        this.issueOrg = "";
+        this.idCardAddr = "";
+        this.clientMessagePower = "1";
+        this.authenticationStatus = "B";
+        this.relCode = "";
+        this.isOcr = "";
+        this.relOwnerCode = "";
+        this.agentAddress = "";
+        this.customerId = "";
+        this.supplementInfo = new SupplementInfoDTO();
+        this.ocrTaskId = "";
+    }
+
+    @Data
+    public static class SupplementInfoDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -4052465180593119448L;
+
+        @JsonProperty("annIncome")
+        private String annIncome;
+        @JsonProperty("busScope")
+        private String busScope;
+        @JsonProperty("registerCapital")
+        private String registerCapital;
+        @JsonProperty("stockName")
+        private String stockName;
+        @JsonProperty("stockIdentifyType")
+        private String stockIdentifyType;
+        @JsonProperty("stockIdentifyNo")
+        private String stockIdentifyNo;
+        @JsonProperty("stockIdentifyEndDate")
+        private String stockIdentifyEndDate;
+        @JsonProperty("stockIdentifyEndDateMrk")
+        private String stockIdentifyEndDateMrk;
+        @JsonProperty("legalName")
+        private String legalName;
+        @JsonProperty("legalIdentifyType")
+        private String legalIdentifyType;
+        @JsonProperty("legalIdentifyNo")
+        private String legalIdentifyNo;
+        @JsonProperty("legalIdentifyEndDate")
+        private String legalIdentifyEndDate;
+        @JsonProperty("legalIdentifyEndDateMrk")
+        private String legalIdentifyEndDateMrk;
+        @JsonProperty("agentName")
+        private String agentName;
+        @JsonProperty("agentIdentifyType")
+        private String agentIdentifyType;
+        @JsonProperty("agentIdentifyNo")
+        private String agentIdentifyNo;
+        @JsonProperty("agentIdentifyEndDate")
+        private String agentIdentifyEndDate;
+        @JsonProperty("agentIdentifyEndDateMrk")
+        private String agentIdentifyEndDateMrk;
+        @JsonProperty("correlations")
+        private String correlations;
+        @JsonProperty("beneficiaryInfo")
+        private List<Object> beneficiaryInfo;
+
+        public SupplementInfoDTO() {
+            this.beneficiaryInfo = new ArrayList<>();
+        }
+    }
+
+}

+ 428 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/ProposalInfoDTO.java

@@ -0,0 +1,428 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerChannelPackagesResponse;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerCompaniesResponse;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerGetSaleInfoResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@NoArgsConstructor
+@Data
+public class ProposalInfoDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -607088232798809605L;
+
+    @JsonProperty("orderNo")
+    private String orderNo;
+    @JsonProperty("drivingsNo")
+    private String drivingsNo;
+    /**
+     * 联合出单类型 1 商业 2 单交
+     */
+    @JsonProperty("mark")
+    private String mark;
+    @JsonProperty("jyMark")
+    private String jyMark;
+    @JsonProperty("copdpt")
+    private String copdpt;
+    @JsonProperty("cityCode")
+    private String cityCode;
+    @JsonProperty("loginCompany")
+    private String loginCompany;
+    @JsonProperty("dptRelCde")
+    private String dptRelCde;
+    @JsonProperty("status")
+    private String status;
+    @JsonProperty("totalPremium")
+    private String totalPremium;
+    @JsonProperty("operateDate")
+    private String operateDate;
+    @JsonProperty("nessElectronic")
+    private String nessElectronic;
+    @JsonProperty("electronicFinish")
+    private String electronicFinish;
+    @JsonProperty("sendMessage")
+    private String sendMessage;
+    @JsonProperty("electronicPolicy")
+    private String electronicPolicy;
+    @JsonProperty("saleManagerId")
+    private String saleManagerId;
+    @JsonProperty("saleManagerName")
+    private String saleManagerName;
+    @JsonProperty("licenseNumber")
+    private String licenseNumber;
+    @JsonProperty("combinedProductCode")
+    private String combinedProductCode;
+    @JsonProperty("underWriteCompany")
+    private String underWriteCompany;
+    @JsonProperty("underwritingAgencyName")
+    private String underwritingAgencyName;
+    @JsonProperty("repairCode")
+    private String repairCode;
+    @JsonProperty("repairName")
+    private String repairName;
+    @JsonProperty("businessSource")
+    private String businessSource;
+    @JsonProperty("organizationCode")
+    private String organizationCode;
+    @JsonProperty("yearCode")
+    private String yearCode;
+    @JsonProperty("sequenceCode")
+    private String sequenceCode;
+    @JsonProperty("characterCode")
+    private String characterCode;
+    @JsonProperty("agent")
+    private String agent;
+    @JsonProperty("agentName")
+    private String agentName;
+    @JsonProperty("referrer")
+    private String referrer;
+    @JsonProperty("referrerIdentifyNo")
+    private String referrerIdentifyNo;
+    @JsonProperty("referrerName")
+    private String referrerName;
+    @JsonProperty("channelCode")
+    private String channelCode;
+    @JsonProperty("channelName")
+    private String channelName;
+    @JsonProperty("repairFactory")
+    private String repairFactory;
+    @JsonProperty("repairFactoryName")
+    private String repairFactoryName;
+    @JsonProperty("customeServiceCode")
+    private String customeServiceCode;
+    @JsonProperty("saleCode")
+    private String saleCode;
+    @JsonProperty("saleName")
+    private String saleName;
+    @JsonProperty("saleType")
+    private String saleType;
+    @JsonProperty("saleNo")
+    private String saleNo;
+    @JsonProperty("saleGroupCode")
+    private String saleGroupCode;
+    @JsonProperty("saleGroupName")
+    private String saleGroupName;
+    @JsonProperty("operatorCode")
+    private String operatorCode;
+    @JsonProperty("operatorName")
+    private String operatorName;
+    @JsonProperty("feeType")
+    private String feeType;
+    @JsonProperty("argueSolution")
+    private String argueSolution;
+    @JsonProperty("manageCompanyCode")
+    private String manageCompanyCode;
+    @JsonProperty("companyNature")
+    private String companyNature;
+    @JsonProperty("channelSource")
+    private String channelSource;
+    @JsonProperty("teamOrderNo")
+    private String teamOrderNo;
+    @JsonProperty("teamOrderName")
+    private String teamOrderName;
+    @JsonProperty("quotePriceId")
+    private String quotePriceId;
+    @JsonProperty("agentSales")
+    private String agentSales;
+    @JsonProperty("agentSaleName")
+    private String agentSaleName;
+    @JsonProperty("protocolNo")
+    private String protocolNo;
+    @JsonProperty("subProtocolNo")
+    private String subProtocolNo;
+    @JsonProperty("agricultureFlag")
+    private String agricultureFlag;
+    @JsonProperty("arbitrationName")
+    private String arbitrationName;
+    @JsonProperty("source")
+    private String source;
+    @JsonProperty("cmmProp")
+    private String cmmProp;
+    @JsonProperty("avtProp")
+    private String avtProp;
+    @JsonProperty("teamProp")
+    private String teamProp;
+    @JsonProperty("underWriteAdvice")
+    private String underWriteAdvice;
+    @JsonProperty("relPolicyNo")
+    private String relPolicyNo;
+    @JsonProperty("sumPremium")
+    private String sumPremium;
+    @JsonProperty("isElectronicInsurance")
+    private String isElectronicInsurance;
+    @JsonProperty("electronicInsuranceFinish")
+    private String electronicInsuranceFinish;
+    @JsonProperty("isIdentityColle")
+    private String isIdentityColle;
+    @JsonProperty("identityColleFinish")
+    private String identityColleFinish;
+    @JsonProperty("isCaptcha")
+    private String isCaptcha;
+    @JsonProperty("captchaFinish")
+    private String captchaFinish;
+    @JsonProperty("machineCode")
+    private String machineCode;
+    @JsonProperty("salesDisabled")
+    private String salesDisabled;
+    @JsonProperty("referrerDisabled")
+    private String referrerDisabled;
+    @JsonProperty("departmentCode")
+    private String departmentCode;
+    @JsonProperty("inform")
+    private String inform;
+    @JsonProperty("isDxProducts")
+    private String isDxProducts;
+    @JsonProperty("dataFlag")
+    private String dataFlag;
+    @JsonProperty("recommendCode")
+    private String recommendCode;
+    @JsonProperty("loadModel")
+    private String loadModel;
+    @JsonProperty("recSubChannel")
+    private String recSubChannel;
+    @JsonProperty("isNeedFaceRecognition")
+    private String isNeedFaceRecognition;
+    @JsonProperty("jsMark")
+    private String jsMark;
+    @JsonProperty("edrPrjNo")
+    private String edrPrjNo;
+    @JsonProperty("payPath")
+    private String payPath;
+    @JsonProperty("channelOrderNo")
+    private String channelOrderNo;
+    @JsonProperty("renewalCollaboration")
+    private String renewalCollaboration;
+    @JsonProperty("newChannelMajorCde")
+    private String newChannelMajorCde;
+    @JsonProperty("newChannelMinorCde")
+    private String newChannelMinorCde;
+    @JsonProperty("policySerialNo")
+    private String policySerialNo;
+    @JsonProperty("currencyType")
+    private String currencyType;
+    @JsonProperty("isInternet")
+    private String isInternet;
+    @JsonProperty("salesmanName")
+    private String salesmanName;
+    @JsonProperty("salesmanIdentifyNo")
+    private String salesmanIdentifyNo;
+    @JsonProperty("currencyPrm")
+    private String currencyPrm;
+    @JsonProperty("exchangeRate")
+    private String exchangeRate;
+    @JsonProperty("totalUncarPremium")
+    private String totalUncarPremium;
+    @JsonProperty("jabMark")
+    private String jabMark;
+    @JsonProperty("rqbMark")
+    private String rqbMark;
+    @JsonProperty("specMark")
+    private String specMark;
+    @JsonProperty("frontIntroduceCde")
+    private String frontIntroduceCde;
+    @JsonProperty("frontIntroduceNme")
+    private String frontIntroduceNme;
+    @JsonProperty("followWeChatFlag")
+    private String followWeChatFlag;
+    @JsonProperty("renewImageFlag")
+    private String renewImageFlag;
+    @JsonProperty("leadsId")
+    private String leadsId;
+    @JsonProperty("chaSalesCde")
+    private String chaSalesCde;
+    @JsonProperty("chaSalesType")
+    private String chaSalesType;
+    @JsonProperty("busiLabel")
+    private String busiLabel;
+    @JsonProperty("dualRecordCde")
+    private String dualRecordCde;
+    @JsonProperty("dualRecordType")
+    private String dualRecordType;
+    @JsonProperty("jkMark")
+    private String jkMark;
+    @JsonProperty("yyMark")
+    private String yyMark;
+    @JsonProperty("hyMark")
+    private String hyMark;
+    @JsonProperty("jkhosMark")
+    private String jkhosMark;
+    @JsonProperty("orderNoOrg")
+    private String orderNoOrg;
+    @JsonProperty("retrospectFlag")
+    private String retrospectFlag;
+    @JsonProperty("authenticateFlag")
+    private String authenticateFlag;
+    @JsonProperty("zkbsnsTyp")
+    private String zkbsnsTyp;
+    @JsonProperty("zkbsnsSubtyp")
+    private String zkbsnsSubtyp;
+    @JsonProperty("yxbsnsTyp")
+    private String yxbsnsTyp;
+    @JsonProperty("bankCde")
+    private String bankCde;
+    @JsonProperty("bankName")
+    private String bankName;
+    @JsonProperty("bankSubCde")
+    private String bankSubCde;
+    @JsonProperty("bankSubName")
+    private String bankSubName;
+    @JsonProperty("relDptCde")
+    private String relDptCde;
+    @JsonProperty("bankBsnsTyp")
+    private String bankBsnsTyp;
+    @JsonProperty("jyChargeMark")
+    private String jyChargeMark;
+    @JsonProperty("orderNoCore")
+    private String orderNoCore;
+    @JsonProperty("jqPlyNoOrg")
+    private String jqPlyNoOrg;
+    @JsonProperty("syPlyNoOrg")
+    private String syPlyNoOrg;
+
+    public ProposalInfoDTO(BoHaiCrawlerCompaniesResponse.ListDTO companies, BoHaiCrawlerChannelPackagesResponse response, BoHaiCrawlerGetSaleInfoResponse saleInfo, String loginCompany) {
+        this.orderNo = "";
+        this.drivingsNo = "";
+        this.mark = "2";
+        this.jyMark = "0";
+        this.copdpt = companies.getCDptCde();
+        String[] split = response.getDptRelCde().split(";");
+        if (split.length > 1) {
+            this.cityCode = split[1];
+        }
+        this.loginCompany = loginCompany;
+        this.dptRelCde = "";
+        this.status = "";
+        this.totalPremium = "";
+        this.operateDate = "";
+        this.nessElectronic = "1";
+        this.electronicFinish = "";
+        this.sendMessage = "";
+        this.electronicPolicy = "1";
+        this.saleManagerId = "";
+        this.saleManagerName = "";
+        this.licenseNumber = "";
+        this.combinedProductCode = response.getCombineProductCode();
+        this.underWriteCompany = companies.getCDptCde();
+        this.underwritingAgencyName = companies.getCDptNme();
+        this.repairCode = "";
+        this.repairName = "";
+        this.businessSource = response.getSource();
+        this.organizationCode = "";
+        this.yearCode = "";
+        this.sequenceCode = "";
+        this.characterCode = "";
+        this.agent = response.getAgencyCode();
+        this.agentName = response.getAgencyName();
+        this.referrer = response.getRecommend();
+        this.referrerIdentifyNo = "";
+        this.referrerName = "";
+        this.channelCode = response.getChannelCode();
+        this.channelName = "";
+        this.repairFactory = response.getReworkPlantCode();
+        this.repairFactoryName = "";
+        this.customeServiceCode = "";
+        this.saleCode = "";
+        this.saleName = "";
+        this.saleType = "";
+        this.saleNo = "";
+        this.saleGroupCode = "";
+        this.saleGroupName = "";
+        this.operatorCode = saleInfo.getRecommendCode();
+        this.operatorName = saleInfo.getRecommendName();
+        // 收费方式
+        this.feeType = "10";
+        this.argueSolution = "007001";
+        this.manageCompanyCode = companies.getManageCompanyCode();
+        this.companyNature = companies.getCompanyNature();
+        this.channelSource = "";
+        this.teamOrderNo = "";
+        this.teamOrderName = "";
+        this.quotePriceId = "";
+        this.agentSales = "";
+        this.agentSaleName = "";
+        this.protocolNo = "";
+        this.subProtocolNo = "";
+        this.agricultureFlag = "";
+        this.arbitrationName = "";
+        this.source = "";
+        this.cmmProp = "";
+        this.avtProp = "";
+        this.teamProp = "";
+        this.underWriteAdvice = "";
+        this.relPolicyNo = "";
+        this.sumPremium = "";
+        this.isElectronicInsurance = "0";
+        this.electronicInsuranceFinish = "";
+        this.isIdentityColle = "";
+        this.identityColleFinish = "";
+        this.isCaptcha = "1";
+        this.captchaFinish = "";
+        this.machineCode = "";
+        this.salesDisabled = "0";
+        this.referrerDisabled = "";
+        this.departmentCode = companies.getDepartmentCode();
+        this.inform = "";
+        this.isDxProducts = "0";
+        this.dataFlag = "";
+        this.recommendCode = "";
+        this.loadModel = response.getLoadModel();
+        // 推荐子渠道
+        this.recSubChannel = response.getRecSubChannel();
+        this.isNeedFaceRecognition = "";
+        this.jsMark = "0";
+        this.edrPrjNo = "";
+        this.payPath = "";
+        this.channelOrderNo = "";
+        this.renewalCollaboration = "0";
+        this.newChannelMajorCde = "";
+        this.newChannelMinorCde = "";
+        this.policySerialNo = "";
+        this.currencyType = "";
+        this.isInternet = "";
+        this.salesmanName = "";
+        this.salesmanIdentifyNo = "";
+        this.currencyPrm = "";
+        this.exchangeRate = "";
+        this.totalUncarPremium = "";
+        this.jabMark = "0";
+        this.rqbMark = "0";
+        this.specMark = "0";
+        this.frontIntroduceCde = "";
+        this.frontIntroduceNme = "";
+        this.followWeChatFlag = "0";
+        this.renewImageFlag = "0";
+        this.leadsId = "";
+        this.chaSalesCde = "";
+        this.chaSalesType = "";
+        this.busiLabel = "";
+        this.dualRecordCde = "";
+        this.dualRecordType = "";
+        this.jkMark = "0";
+        this.yyMark = "0";
+        this.hyMark = "0";
+        this.jkhosMark = "0";
+        this.orderNoOrg = "";
+        this.retrospectFlag = "";
+        this.authenticateFlag = "";
+        this.zkbsnsTyp = "";
+        this.zkbsnsSubtyp = "";
+        this.yxbsnsTyp = "";
+        this.bankCde = "";
+        this.bankName = "";
+        this.bankSubCde = "";
+        this.bankSubName = "";
+        this.relDptCde = "";
+        this.bankBsnsTyp = "";
+        this.jyChargeMark = "0";
+        this.orderNoCore = "";
+        this.jqPlyNoOrg = "";
+        this.syPlyNoOrg = "";
+    }
+
+}

+ 284 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/VehicleInfoDTO.java

@@ -0,0 +1,284 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.bohai.crawler.entity.response.BoHaiCrawlerCarResponse;
+import com.jzg.quotation.commons.utils.TimeProcessing;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+@NoArgsConstructor
+@Data
+public class VehicleInfoDTO {
+
+    @JsonProperty("vehicleCode")
+    private String vehicleCode;
+    @JsonProperty("jqQuestion")
+    private String jqQuestion;
+    @JsonProperty("jqAnswer")
+    private String jqAnswer;
+    @JsonProperty("syQuestion")
+    private String syQuestion;
+    @JsonProperty("syAnswer")
+    private String syAnswer;
+    @JsonProperty("premiumFlag")
+    private String premiumFlag;
+    @JsonProperty("pureRange")
+    private String pureRange;
+    @JsonProperty("plateNo")
+    private String plateNo;
+    @JsonProperty("isPlateNo")
+    private String isPlateNo;
+    @JsonProperty("vin")
+    private String vin;
+    @JsonProperty("engineNo")
+    private String engineNo;
+    @JsonProperty("plateType")
+    private String plateType;
+    @JsonProperty("isFieldCar")
+    private String isFieldCar;
+    @JsonProperty("registerDate")
+    private String registerDate;
+    @JsonProperty("certificationDate")
+    private String certificationDate;
+    @JsonProperty("brandName")
+    private String brandName;
+    @JsonProperty("brand")
+    private String brand;
+    @JsonProperty("motorType")
+    private String motorType;
+    @JsonProperty("useNatureShow")
+    private String useNatureShow;
+    @JsonProperty("vehicleType")
+    private String vehicleType;
+    @JsonProperty("seatCount")
+    private String seatCount;
+    @JsonProperty("purchasePrice")
+    private String purchasePrice;
+    @JsonProperty("negotiatedValue")
+    private String negotiatedValue;
+    @JsonProperty("displacement")
+    private String displacement;
+    @JsonProperty("fuelType")
+    private String fuelType;
+    @JsonProperty("approvedLoad")
+    private String approvedLoad;
+    @JsonProperty("isTransferCar")
+    private String isTransferCar;
+    @JsonProperty("specialMark")
+    private String specialMark;
+    @JsonProperty("loanVehicleFlag")
+    private String loanVehicleFlag;
+    @JsonProperty("buyCarDate")
+    private String buyCarDate;
+    @JsonProperty("newCarFlag")
+    private String newCarFlag;
+    @JsonProperty("weight")
+    private String weight;
+    @JsonProperty("negotiatedActulValue")
+    private String negotiatedActulValue;
+    @JsonProperty("colorCode")
+    private String colorCode;
+    @JsonProperty("power")
+    private String power;
+    @JsonProperty("teamCarId")
+    private String teamCarId;
+    @JsonProperty("vehicleCheckCode")
+    private String vehicleCheckCode;
+    @JsonProperty("vhlCertType")
+    private String vhlCertType;
+    @JsonProperty("vhlCertNo")
+    private String vhlCertNo;
+    @JsonProperty("vhlCertDate")
+    private String vhlCertDate;
+    @JsonProperty("tonnage")
+    private String tonnage;
+    @JsonProperty("carOwnerName")
+    private String carOwnerName;
+    @JsonProperty("transferDate")
+    private String transferDate;
+    @JsonProperty("plateColor")
+    private String plateColor;
+    @JsonProperty("enrollDate")
+    private String enrollDate;
+    @JsonProperty("countryNature")
+    private String countryNature;
+    @JsonProperty("carModelName")
+    private String carModelName;
+    @JsonProperty("carUserType")
+    private String carUserType;
+    @JsonProperty("actualValue")
+    private String actualValue;
+    @JsonProperty("relationWithInsured")
+    private String relationWithInsured;
+    @JsonProperty("frmNoError")
+    private String frmNoError;
+    @JsonProperty("innerCustomer")
+    private String innerCustomer;
+    @JsonProperty("productSystem")
+    private String productSystem;
+    @JsonProperty("mortgageMrk")
+    private String mortgageMrk;
+    @JsonProperty("transferRoll")
+    private String transferRoll;
+    @JsonProperty("transferRollTime")
+    private String transferRollTime;
+    @JsonProperty("vehCodeSH")
+    private String vehCodeSH;
+    @JsonProperty("carYear")
+    private String carYear;
+    @JsonProperty("queryCode")
+    private String queryCode;
+    @JsonProperty("jqQueryCode")
+    private String jqQueryCode;
+    @JsonProperty("lastPayNum")
+    private String lastPayNum;
+    @JsonProperty("lastYearNCD")
+    private String lastYearNCD;
+    @JsonProperty("rateNCD")
+    private String rateNCD;
+    @JsonProperty("predose")
+    private String predose;
+    @JsonProperty("isRepair")
+    private String isRepair;
+    @JsonProperty("repairCode")
+    private String repairCode;
+    @JsonProperty("repairName")
+    private String repairName;
+    @JsonProperty("useNatureJG")
+    private String useNatureJG;
+    @JsonProperty("haulge")
+    private String haulge;
+    @JsonProperty("isSuccess")
+    private String isSuccess;
+    @JsonProperty("glassType")
+    private String glassType;
+    @JsonProperty("ownerMessageType")
+    private String ownerMessageType;
+    @JsonProperty("traUsageCde")
+    private String traUsageCde;
+    @JsonProperty("newSalesName")
+    private String newSalesName;
+    @JsonProperty("newSalesAreaCode")
+    private String newSalesAreaCode;
+    @JsonProperty("saleShop")
+    private String saleShop;
+    @JsonProperty("specialRiskFlag")
+    private String specialRiskFlag;
+    @JsonProperty("vehicleTypeFirst")
+    private String vehicleTypeFirst;
+    @JsonProperty("vehicleTypeSecond")
+    private String vehicleTypeSecond;
+    @JsonProperty("newPower")
+    private String newPower;
+    @JsonProperty("teamOrderNo")
+    private String teamOrderNo;
+    @JsonProperty("teamOrderName")
+    private String teamOrderName;
+    @JsonProperty("affirmCde")
+    private String affirmCde;
+    @JsonProperty("modelEnergyType")
+    private String modelEnergyType;
+    @JsonProperty("topSpeed")
+    private String topSpeed;
+    @JsonProperty("isOcr")
+    private String isOcr;
+    @JsonProperty("vehicleStyleUniqueId")
+    private String vehicleStyleUniqueId;
+    @JsonProperty("industryModelCode")
+    private String industryModelCode;
+    @JsonProperty("hkPlateNo")
+    private String hkPlateNo;
+    @JsonProperty("drivingArea")
+    private String drivingArea;
+    @JsonProperty("historicalInformation")
+    private String historicalInformation;
+    @JsonProperty("carId")
+    private String carId;
+    @JsonProperty("vehicleTypeName")
+    private String vehicleTypeName;
+    @JsonProperty("ocrTaskId")
+    private String ocrTaskId;
+    @JsonProperty("vehicleTypeNew")
+    private String vehicleTypeNew;
+
+    public VehicleInfoDTO(CarInfoVo carInfoVo, BoHaiCrawlerCarResponse.ListDTO car, String ownerName) {
+        this.pureRange = "";
+        this.approvedLoad = carInfoVo.getLimitLoad();
+        this.brand = car.getVehicleName();
+        this.brandName = car.getVehicleId();
+        this.buyCarDate = "";
+        this.carOwnerName = ownerName;
+        /*UsedYearCode usedYearCode = UsedYearCode.getUsedYearCode(daJiaCrawlerActualValueResponse.getUsedYear());
+        this.carYear = usedYearCode.getCode();*/
+
+        this.certificationDate = TimeProcessing.dateToDateTime(carInfoVo.getIssueDate());
+        this.colorCode = "";
+        this.countryNature = car.getVehicleType();
+        this.displacement = car.getVehicleExhaust();
+        this.engineNo = carInfoVo.getEngineNo();
+        this.fuelType = carInfoVo.getEnergyTypeCode();
+        this.glassType = "";
+        // 外地车
+        this.isFieldCar = "0";
+        this.isPlateNo = "0";
+        this.isSuccess = "";
+        // 过户车
+        if (carInfoVo.isTransfer()) {
+            this.isTransferCar = "1";
+            this.specialMark = "1";
+            this.transferDate = carInfoVo.getTransferDate();
+            this.transferRoll = "1";
+            this.transferRollTime = carInfoVo.getTransferDate();
+        } else {
+            this.isTransferCar = "0";
+            this.specialMark = "0";
+            this.transferDate = carInfoVo.getTransferDate();
+            this.transferRoll = "0";
+            this.transferRollTime = carInfoVo.getTransferDate();
+        }
+        this.loanVehicleFlag = "0";
+        this.motorType = carInfoVo.getCarTypeCode();
+        /*this.negotiatedActulValue = daJiaCrawlerActualValueResponse.getActualValue();
+        this.negotiatedValue = daJiaCrawlerActualValueResponse.getActualValue();*/
+        // 新车编制
+        if (StringUtils.hasText(carInfoVo.getLicenseNo())) {
+            this.newCarFlag = "0";
+        } else {
+            this.newCarFlag = "1";
+        }
+        this.plateNo = carInfoVo.getLicenseNo();
+        this.plateType = carInfoVo.getLicenseKindCode();
+        this.power = car.getPower();
+        this.purchasePrice = car.getPurchasePrice();
+        this.queryCode = "";
+        this.jqQueryCode = "";
+        this.registerDate = carInfoVo.getRegisterDate();
+        this.seatCount = carInfoVo.getSeatCount();
+        this.useNatureShow = carInfoVo.getVehicleUseCode();
+        this.vehicleCheckCode = "";
+        this.vehicleCode = car.getBrandId();
+        this.vehicleType = carInfoVo.getCarKindDetailIdCode();
+        this.vhlCertDate = "";
+        this.vhlCertNo = "";
+        this.vhlCertType = "";
+        this.vin = carInfoVo.getVinNo();
+        // 整备质量
+        this.weight = carInfoVo.completeKerbMassToTonCount();
+        this.premiumFlag = "";
+        this.traUsageCde = "";
+        this.saleShop = "";
+        this.newSalesAreaCode = "";
+        this.newSalesName = "";
+        this.specialRiskFlag = "";
+        this.topSpeed = "";
+        this.newPower = car.getPower();
+        this.isOcr = "";
+        this.vehicleStyleUniqueId = "";
+        this.industryModelCode = "";
+        this.ocrTaskId = "";
+        this.vehicleTypeNew = car.getVehicleTypeNew();
+    }
+}

+ 133 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/request/quote/VehicleOwnerInfoDTO.java

@@ -0,0 +1,133 @@
+package com.jzg.quotation.bohai.crawler.entity.request.quote;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.quotation.commons.utils.TimeProcessing;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@Data
+public class VehicleOwnerInfoDTO {
+
+    @JsonProperty("ownerId")
+    private String ownerId;
+    @JsonProperty("personName")
+    private String personName;
+    @JsonProperty("clientType")
+    private String clientType;
+    @JsonProperty("identifyType")
+    private String identifyType;
+    @JsonProperty("identifyNo")
+    private String identifyNo;
+    @JsonProperty("gender")
+    private String gender;
+    @JsonProperty("birthday")
+    private String birthday;
+    @JsonProperty("companyNature")
+    private String companyNature;
+    @JsonProperty("province")
+    private String province;
+    @JsonProperty("city")
+    private String city;
+    @JsonProperty("county")
+    private String county;
+    @JsonProperty("suffixAddr")
+    private String suffixAddr;
+    @JsonProperty("address")
+    private String address;
+    @JsonProperty("postCode")
+    private String postCode;
+    @JsonProperty("contactName")
+    private String contactName;
+    @JsonProperty("telephone")
+    private String telephone;
+    @JsonProperty("identifyEndDate")
+    private String identifyEndDate;
+    @JsonProperty("identifyEndDateMrk")
+    private String identifyEndDateMrk;
+    @JsonProperty("country")
+    private String country;
+    @JsonProperty("mobile")
+    private String mobile;
+    @JsonProperty("tel")
+    private String tel;
+    @JsonProperty("cusLvl")
+    private String cusLvl;
+    @JsonProperty("business")
+    private String business;
+    @JsonProperty("resvTxt4")
+    private String resvTxt4;
+    @JsonProperty("resvTxt5")
+    private String resvTxt5;
+    @JsonProperty("resvTxt6")
+    private String resvTxt6;
+    @JsonProperty("nation")
+    private String nation;
+    @JsonProperty("expiredDate")
+    private String expiredDate;
+
+    @JsonProperty("email")
+    private String email;
+
+    @JsonProperty("cusRiskLvl")
+    private String cusRiskLvl;
+
+    @JsonProperty("resvTxt1")
+    private String resvTxt1;
+
+    @JsonProperty("isOcr")
+    private String isOcr;
+
+    @JsonProperty("agentCertNo")
+    private String agentCertNo;
+
+    @JsonProperty("agentCertType")
+    private String agentCertType;
+
+    @JsonProperty("agentEmail")
+    private String agentEmail;
+
+    @JsonProperty("agentMobile")
+    private String agentMobile;
+
+    @JsonProperty("agentName")
+    private String agentName;
+
+    @JsonProperty("agentType")
+    private String agentType;
+
+    @JsonProperty("agentAddress")
+    private String agentAddress;
+
+    @JsonProperty("antiRiskLevel")
+    private String antiRiskLevel;
+
+    @JsonProperty("ocrTaskId")
+    private String ocrTaskId;
+
+    @JsonProperty("samePerson")
+    private String samePerson;
+
+    public VehicleOwnerInfoDTO(CustomerInfoVo ownersInfo) {
+        this.address = ownersInfo.getAddr();
+        this.birthday = TimeProcessing.dateToDateTime(ownersInfo.getBirthday());
+        this.clientType = "1";
+        this.companyNature = "9";
+        this.gender = ownersInfo.getGender();
+        this.identifyEndDate = ownersInfo.getIdentifyValidEndDate();
+        this.identifyNo = ownersInfo.getIdentifyNumber();
+        this.identifyType = "01";
+        this.mobile = ownersInfo.getMobile();
+        this.personName = ownersInfo.getName();
+        this.postCode = "";
+        this.isOcr = "0";
+        this.province = ownersInfo.getProvince();
+        this.city = ownersInfo.getCity();
+        this.county = ownersInfo.getCounty();
+        this.province = ownersInfo.getProvinceCode();
+        this.city = ownersInfo.getCityCode();
+        this.county = ownersInfo.getCountyCode();
+        this.suffixAddr = ownersInfo.getAddr();
+    }
+}

+ 48 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerAuthenticateResponse.java

@@ -0,0 +1,48 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ *  渤海财险爬虫登录认证响应实体
+ * 
+ * @description: 渤海财险 【爬虫】 登陆响应
+ * @author: jinshihui
+ * @date: 2025年9月17日17:13:11
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerAuthenticateResponse {
+
+    /** 登录状态标识 */
+    @JsonProperty("flag")
+    private String flag;
+
+    /** HR编码 */
+    @JsonProperty("hrCode")
+    private String hrCode;
+
+    /** 身份令牌,用于后续API调用认证 */
+    @JsonProperty("idToken")
+    private String idToken;
+
+    /** 用户手机号 */
+    @JsonProperty("mobile")
+    private String mobile;
+
+    /** 用户编码,唯一标识用户身份 */
+    @JsonProperty("userCode")
+    private String userCode;
+
+    /** 用户角色类型 */
+    @JsonProperty("userRole")
+    private String userRole;
+
+    /** API版本号 */
+    @JsonProperty("version")
+    private String version;
+
+}

+ 32 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCaptchaResponse.java

@@ -0,0 +1,32 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 渤海财险【爬虫】【验证码】【响应体】
+ * @author: jinshihui
+ * @date: 2025年9月17日16:39:44
+ **/
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerCaptchaResponse implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 2057455674665599565L;
+
+    @JsonProperty("uuid")
+    private String uuid;
+
+    /**
+     * base64 影像
+     */
+    @JsonProperty("img")
+    private String img;
+
+
+}

+ 241 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCarResponse.java

@@ -0,0 +1,241 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.filter.CarModelsFilter;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerCarResponse implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 8290844541630850445L;
+
+    @JsonProperty("pageNum")
+    private Integer pageNum;
+
+    @JsonProperty("pageSize")
+    private Integer pageSize;
+
+    @JsonProperty("list")
+    private List<ListDTO> list;
+
+    @JsonProperty("total")
+    private Integer total;
+
+    @JsonProperty("channelOrderNo")
+    private String channelOrderNo;
+
+    @NoArgsConstructor
+    @Data
+    public static class ListDTO implements Serializable, CarModelsFilter {
+        @Serial
+        private static final long serialVersionUID = -9139048419262298709L;
+
+        /**
+         * 车型代码
+         */
+        @JsonProperty("vehicleId")
+        private String vehicleId;
+
+        @JsonProperty("brandId")
+        private String brandId;
+        /**
+         * 车型名称
+         */
+        @JsonProperty("vehicleName")
+        private String vehicleName;
+
+        /**
+         * 车型编码
+         */
+        @JsonProperty("vehicleModelCode")
+        private String vehicleModelCode;
+
+        @JsonProperty("vehicleAlias")
+        private String vehicleAlias;
+
+        @JsonProperty("vehicleMaker")
+        private String vehicleMaker;
+        /**
+         * 上市年份
+         */
+        @JsonProperty("yearPattern")
+        private String yearPattern;
+
+        @JsonProperty("brandName")
+        private String brandName;
+
+        @JsonProperty("familyName")
+        private String familyName;
+
+        @JsonProperty("vehicleClass")
+        private String vehicleClass;
+
+        @JsonProperty("vehicleType")
+        private String vehicleType;
+
+        @JsonProperty("syxClassname")
+        private String syxClassname;
+
+        @JsonProperty("jqxClassname")
+        private String jqxClassname;
+
+        @JsonProperty("searchCode")
+        private String searchCode;
+        /**
+         * 排量
+         */
+        @JsonProperty("vehicleExhaust")
+        private String vehicleExhaust;
+
+        @JsonProperty("vehicleTonnage")
+        private String vehicleTonnage;
+        /**
+         * 核定载客
+         */
+        @JsonProperty("vehicleSeat")
+        private Integer vehicleSeat;
+
+        @JsonProperty("vehiclePriceTax")
+        private Integer vehiclePriceTax;
+
+        @JsonProperty("antiTheft")
+        private String antiTheft;
+
+        @JsonProperty("airbag")
+        private String airbag;
+
+        @JsonProperty("absFlag")
+        private String absFlag;
+
+        @JsonProperty("transmissionType")
+        private String transmissionType;
+
+        @JsonProperty("remark")
+        private String remark;
+
+        @JsonProperty("qualityMax")
+        private Integer qualityMax;
+
+        @JsonProperty("qualityMin")
+        private Integer qualityMin;
+
+        /**
+         * 新车购置价
+         */
+        @JsonProperty("vehiclePrice")
+        private String vehiclePrice;
+
+        @JsonProperty("vehiclePriceTax1")
+        private String vehiclePriceTax1;
+
+        @JsonProperty("factoryId")
+        private String factoryId;
+
+        @JsonProperty("power")
+        private String power;
+        /**
+         * 功率
+         */
+        @JsonProperty("vehicleTypeNew")
+        private String vehicleTypeNew;
+        /**
+         * 燃料类型代码
+         */
+        @JsonProperty("powerTypeCode")
+        private String powerTypeCode;
+        /**
+         * 燃料类型名称
+         */
+        @JsonProperty("powerTypeName")
+        private String powerTypeName;
+
+        @JsonProperty("travelTaxMark")
+        private String travelTaxMark;
+
+        @JsonProperty("vehicleHyCode")
+        private String vehicleHyCode;
+
+        @JsonProperty("vehicleHyName")
+        private String vehicleHyName;
+
+        @JsonProperty("cfrmNo")
+        private String cfrmNo;
+
+        @JsonProperty("cengNo")
+        private String cengNo;
+
+        @JsonProperty("cplateNo")
+        private String cplateNo;
+
+        @JsonProperty("ncurbWt")
+        private String ncurbWt;
+
+        @JsonProperty("cplateTyp")
+        private String cplateTyp;
+
+        @JsonProperty("ttransferDate")
+        private String ttransferDate;
+
+        @JsonProperty("cregVhlTyp")
+        private String cregVhlTyp;
+
+        @JsonProperty("cvhlTyp")
+        private String cvhlTyp;
+
+        @JsonProperty("cusageCde")
+        private String cusageCde;
+
+        @JsonProperty("cfstRegYmBar")
+        private String cfstRegYmBar;
+
+        @JsonProperty("nseatNum")
+        private String nseatNum;
+
+        @JsonProperty("ntonage")
+        private String ntonage;
+
+        @JsonProperty("ndisplacement")
+        private String ndisplacement;
+
+        @JsonProperty("cregOwner")
+        private String cregOwner;
+
+        @JsonProperty("ctraUsageCde")
+        private String ctraUsageCde;
+
+        @JsonProperty("chaulge")
+        private String chaulge;
+
+        @JsonProperty("tcertificateDate")
+        private String tcertificateDate;
+
+        @JsonProperty("cfuelType")
+        private String cfuelType;
+
+        @JsonProperty("cmodelEnergyType")
+        private String cmodelEnergyType;
+
+        @JsonProperty("moldName")
+        private String moldName;
+
+        @JsonProperty("modelCode")
+        private String modelCode;
+
+        @Override
+        public String getCarYear() {
+            return yearPattern;
+        }
+
+        @Override
+        public String getPurchasePrice() {
+            return vehiclePrice;
+        }
+    }
+}

+ 102 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerChannelPackagesResponse.java

@@ -0,0 +1,102 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerChannelPackagesResponse {
+
+    @JsonProperty("id")
+    private Integer id;
+
+    @JsonProperty("name")
+    private String name;
+
+    @JsonProperty("coopCode")
+    private String coopCode;
+
+    @JsonProperty("coopName")
+    private String coopName;
+
+    @JsonProperty("serviceCode")
+    private String serviceCode;
+
+    @JsonProperty("source")
+    private String source;
+
+    @JsonProperty("recommend")
+    private String recommend;
+
+    @JsonProperty("channelCode")
+    private String channelCode;
+
+    @JsonProperty("salesCode")
+    private String salesCode;
+
+    @JsonProperty("salesType")
+    private String salesType;
+    @JsonProperty("salesId")
+    private String salesId;
+    @JsonProperty("salesGroupCode")
+    private String salesGroupCode;
+    @JsonProperty("reworkPlantCode")
+    private String reworkPlantCode;
+    @JsonProperty("clientServiceCode")
+    private String clientServiceCode;
+    @JsonProperty("isDefault")
+    private String isDefault;
+    @JsonProperty("loginCompany")
+    private String loginCompany;
+    @JsonProperty("agencyCode")
+    private String agencyCode;
+    @JsonProperty("agencyName")
+    private String agencyName;
+    @JsonProperty("recommendName")
+    private String recommendName;
+    @JsonProperty("salesGroupName")
+    private String salesGroupName;
+    @JsonProperty("reworkName")
+    private String reworkName;
+    @JsonProperty("companyCode")
+    private String companyCode;
+    @JsonProperty("companyName")
+    private String companyName;
+    @JsonProperty("salesName")
+    private String salesName;
+    @JsonProperty("loadModel")
+    private String loadModel;
+    @JsonProperty("saleManagerId")
+    private String saleManagerId;
+    @JsonProperty("saleManagerName")
+    private String saleManagerName;
+    @JsonProperty("licenseNumber")
+    private String licenseNumber;
+    @JsonProperty("salesDisabled")
+    private String salesDisabled;
+    @JsonProperty("referrerDisabled")
+    private String referrerDisabled;
+    @JsonProperty("dptCodeId")
+    private String dptCodeId;
+    @JsonProperty("dptCodeName")
+    private String dptCodeName;
+    @JsonProperty("departmentCode")
+    private String departmentCode;
+    @JsonProperty("recommendCode")
+    private String recommendCode;
+    @JsonProperty("recSubChannel")
+    private String recSubChannel;
+    @JsonProperty("combineProductCode")
+    private String combineProductCode;
+    @JsonProperty("toBQr")
+    private String toBQr;
+    @JsonProperty("url")
+    private String url;
+    @JsonProperty("busiLabel")
+    private String busiLabel;
+    @JsonProperty("feeType")
+    private String feeType;
+    @JsonProperty("dptRelCde")
+    private String dptRelCde;
+}

+ 41 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCheckTokenResponse.java

@@ -0,0 +1,41 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @version
+ * @description: 渤海财险【校验token】 响应
+ * @author: wenks
+ * @date: 2025/5/21 16:59
+ **/
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerCheckTokenResponse {
+
+    @JsonProperty("flag")
+    private String flag;
+
+    @JsonProperty("mobile")
+    private String mobile;
+
+    @JsonProperty("userRole")
+    private String userRole;
+
+    @JsonProperty("hrCode")
+    private String hrCode;
+
+    @JsonProperty("version")
+    private String version;
+
+    @JsonProperty("userName")
+    private String userName;
+
+    @JsonProperty("userCode")
+    private String userCode;
+
+    @JsonProperty("id_token")
+    private String idToken;
+
+}

+ 46 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerCompaniesResponse.java

@@ -0,0 +1,46 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerCompaniesResponse {
+
+    @JsonProperty("pageNum")
+    private Integer pageNum;
+
+    @JsonProperty("pageSize")
+    private Integer pageSize;
+
+    @JsonProperty("list")
+    private List<ListDTO> list;
+
+    @JsonProperty("total")
+    private Integer total;
+
+    @JsonProperty("channelOrderNo")
+    private String channelOrderNo;
+
+    @NoArgsConstructor
+    @Data
+    public static class ListDTO {
+        @JsonProperty("parentCode")
+        private String parentCode;
+        @JsonProperty("relationCode")
+        private String relationCode;
+        @JsonProperty("companyNature")
+        private String companyNature;
+        @JsonProperty("manageCompanyCode")
+        private String manageCompanyCode;
+        @JsonProperty("departmentCode")
+        private String departmentCode;
+        @JsonProperty("cDptCde")
+        private String cDptCde;
+        @JsonProperty("cDptNme")
+        private String cDptNme;
+    }
+}

+ 47 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerGetSaleInfoResponse.java

@@ -0,0 +1,47 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 渤海财险 获取渠道信息
+ * @author: wenks
+ * @date: 2025/5/28 11:51
+ **/
+
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerGetSaleInfoResponse implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 7463222522106608016L;
+    
+    @JsonProperty("recommendCode")
+    private String recommendCode;
+
+    @JsonProperty("recommendName")
+    private String recommendName;
+
+    @JsonProperty("idCard")
+    private String idCard;
+
+    @JsonProperty("employeeNo")
+    private String employeeNo;
+
+    @JsonProperty("telphone")
+    private String telphone;
+
+    @JsonProperty("bankAccount")
+    private String bankAccount;
+
+    @JsonProperty("accountName")
+    private String accountName;
+
+    @JsonProperty("userRole")
+    private String userRole;
+
+}

+ 511 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerQuotationResponse.java

@@ -0,0 +1,511 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.bohai.api.entity.response.BoHaiBaseResponse;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/4 08:41
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerQuotationResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -7074383106771349265L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 2443156483138444305L;
+        /**
+         * 保额
+         */
+        @JsonProperty("sumInsurd")
+        private String sumInsurd;
+
+        /**
+         * 总保费
+         */
+        @JsonProperty("premium")
+        private String premium;
+
+        /**
+         * 车辆信息
+         */
+        @JsonProperty("vehicle")
+        private VehicleDTO vehicle;
+
+        /**
+         * 车主信息
+         */
+        @JsonProperty("carOwner")
+        private CarOwnerDTO carOwner;
+
+        /**
+         * 投保人信息
+         */
+        @JsonProperty("holder")
+        private HolderDTO holder;
+
+        /**
+         * 被保人信息
+         */
+        @JsonProperty("insureder")
+        private InsurederDTO insureder;
+
+        /**
+         * 商业险信息
+         */
+        @JsonProperty("businessPolicy")
+        private BusinessPolicyDTO businessPolicy;
+
+        /**
+         * 交强险信息
+         */
+        @JsonProperty("trafficPolicy")
+        private TrafficPolicyDTO trafficPolicy;
+
+        /**
+         * 订单业务唯一标识
+         */
+        @JsonProperty("busUniqueId")
+        private String busUniqueId;
+
+        /**
+         * 转保问题回答
+         */
+        @JsonProperty("checkInfoList")
+        private List<CheckInfoDTO> checkInfoList;
+
+        /**
+         * 财意险保费
+         */
+        @JsonProperty("unAutoPremium")
+        private UnAutoPremiumDTO unAutoPremium;
+
+        @NoArgsConstructor
+        @Data
+        public static class VehicleDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -806570876742330810L;
+            /**
+             * 参考实际价值
+             */
+            @JsonProperty("currentValue")
+            private String currentValue;
+
+            /**
+             * 车辆识别代号/车架号
+             */
+            @JsonProperty("carVin")
+            private String carVin;
+
+            /**
+             * 车型编码
+             */
+            @JsonProperty("vehicleModelCode")
+            private String vehicleModelCode;
+
+            /**
+             * 发动机号
+             */
+            @JsonProperty("engineNo")
+            private String engineNo;
+
+            /**
+             * 车牌号码
+             */
+            @JsonProperty("plateNo")
+            private String plateNo;
+
+            @JsonProperty("plateColor")
+            private String plateColor;
+
+            /**
+             * 初登日期
+             */
+            @JsonProperty("registerDate")
+            private String registerDate;
+
+            /**
+             * 新车指导价
+             */
+            @JsonProperty("purchasePrice")
+            private String purchasePrice;
+
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class CarOwnerDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -4953589376949080420L;
+            @JsonProperty("ownerName")
+            private String ownerName;
+
+            /**
+             * 证件类型
+             */
+            @JsonProperty("certType")
+            private String certType;
+
+            /**
+             * 证件号码
+             */
+            @JsonProperty("certNo")
+            private String certNo;
+            @JsonProperty("phoneNumber")
+            private String phoneNumber;
+            @JsonProperty("email")
+            private String email;
+            @JsonProperty("address")
+            private String address;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class HolderDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -8424986900592324029L;
+            @JsonProperty("holderName")
+            private String holderName;
+            @JsonProperty("certType")
+            private String certType;
+            @JsonProperty("certNo")
+            private String certNo;
+            @JsonProperty("phoneNumber")
+            private String phoneNumber;
+            @JsonProperty("email")
+            private String email;
+            @JsonProperty("address")
+            private String address;
+
+            /**
+             * 发票类型
+             */
+            @JsonProperty("invoiceType")
+            private String invoiceType;
+
+            /**
+             * 商业险保单格式
+             */
+            @JsonProperty("bizFormatType")
+            private String bizFormatType;
+
+            /**
+             * 交强险保单格式
+             */
+            @JsonProperty("forceFormatType")
+            private String forceFormatType;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class InsurederDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = 8204617214215277369L;
+            @JsonProperty("insuredName")
+            private String insuredName;
+            @JsonProperty("certType")
+            private String certType;
+            @JsonProperty("certNo")
+            private String certNo;
+            @JsonProperty("phoneNumber")
+            private String phoneNumber;
+            @JsonProperty("email")
+            private String email;
+            @JsonProperty("address")
+            private String address;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class BusinessPolicyDTO implements Serializable {
+            @Serial
+            private static final long serialVersionUID = 5450064515568215998L;
+            /**
+             * 险别列表
+             */
+            @JsonProperty("coverages")
+            private List<CoveragesDTO> coverages;
+
+            /**
+             * 特别约定条款
+             */
+            @JsonProperty("specialTermItems")
+            private List<SpecialTermItemsDTO> specialTermItems;
+
+            /**
+             * 商业险投保单号
+             */
+            @JsonProperty("applicationNo")
+            private String applicationNo;
+
+            /**
+             * 商业险保单号
+             */
+            @JsonProperty("policyNo")
+            private String policyNo;
+
+            /**
+             * 商业险保费
+             */
+            @JsonProperty("premium")
+            private String premium;
+
+            /**
+             * 商业险保额
+             */
+            @JsonProperty("sumInsurd")
+            private String sumInsurd;
+            @JsonProperty("startDate")
+            private String startDate;
+            @JsonProperty("endDate")
+            private String endDate;
+
+            // 2024-11-18 新增商业险维度编码
+            @JsonProperty("dimenSionCode")
+            private String dimenSionCode;
+
+            //  add by hxl  2024-04-07
+            @JsonProperty("errorMsg")
+            private String errorMsg;
+
+            @JsonProperty("floatingRateOption")
+            private FloatingRateOptionDTO floatingRateOption;
+
+
+            @NoArgsConstructor
+            @Data
+            public static class FloatingRateOptionDTO implements Serializable {
+
+                @Serial
+                private static final long serialVersionUID = 4212441794484941902L;
+                @JsonProperty("maxFloatingRate")
+                private String maxFloatingRate;
+
+                @JsonProperty("minFloatingRate")
+                private String minFloatingRate;
+
+                @JsonProperty("floatingRate")
+                private String floatingRate;
+
+                @JsonProperty("nonClaimDiscountRate")
+                private String nonClaimDiscountRate	;
+
+                @JsonProperty("trafficTransgressRate")
+                private String trafficTransgressRate;
+
+                @JsonProperty("adjustFactor")
+                private String adjustFactor;
+            }
+
+
+            @NoArgsConstructor
+            @Data
+            public static class CoveragesDTO implements Serializable {
+
+                @Serial
+                private static final long serialVersionUID = 4184476442463160091L;
+                /**
+                 * 险别代码
+                 */
+                @JsonProperty("coverageCode")
+                private String coverageCode;
+
+                /**
+                 * 险别名称
+                 */
+                @JsonProperty("coverageName")
+                private String coverageName;
+                @JsonProperty("isNonDeductionCovered")
+                private String isNonDeductionCovered;
+
+                /**
+                 * 保额
+                 */
+                @JsonProperty("sumInsurd")
+                private String sumInsurd;
+
+                /**
+                 * 保费
+                 */
+                @JsonProperty("premium")
+                private String premium;
+                @JsonProperty("floatingRate")
+                private String floatingRate;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class SpecialTermItemsDTO implements Serializable {
+
+                @Serial
+                private static final long serialVersionUID = -696978603455134076L;
+                @JsonProperty("specialTermCode")
+                private String specialTermCode;
+
+                @JsonProperty("specialTermText")
+                private String specialTermText;
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class TrafficPolicyDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -8649307668401416001L;
+            /**
+             * 交强险投保单号
+             */
+            @JsonProperty("applicationNo")
+            private String applicationNo;
+
+            /**
+             * 交强险保单号
+             */
+            @JsonProperty("policyNo")
+            private String policyNo;
+
+            /**
+             * 交强险保额
+             */
+            @JsonProperty("sumInsurd")
+            private String sumInsurd;
+
+            /**
+             * 交强险保费
+             */
+            @JsonProperty("premium")
+            private String premium;
+
+            /**
+             * 车船税
+             */
+            @JsonProperty("vehicleTax")
+            private VehicleTaxDTO vehicleTax;
+
+            @JsonProperty("startDate")
+            private String startDate;
+
+            @JsonProperty("endDate")
+            private String endDate;
+
+            // 2024-11-18 新增交强险维度编码
+            @JsonProperty("dimenSionCode")
+            private String dimenSionCode;
+
+            @NoArgsConstructor
+            @Data
+            public static class VehicleTaxDTO implements Serializable {
+
+                @Serial
+                private static final long serialVersionUID = 5184120330503187940L;
+                /**
+                 * 总额
+                 */
+                @JsonProperty("totalAmount")
+                private String totalAmount;
+
+                /**
+                 * 纳税类型
+                 */
+                @JsonProperty("taxType")
+                private String taxType;
+
+                /**
+                 * 欠税总额(含滞纳金)
+                 */
+                @JsonProperty("overdueTaxAmount")
+                private String overdueTaxAmount;
+
+                /**
+                 * 滞纳金
+                 */
+                @JsonProperty("lateFee")
+                private String lateFee;
+
+                /**
+                 * 补缴所属开始日期
+                 */
+                @JsonProperty("overdueTaxStartDate")
+                private String overdueTaxStartDate;
+
+                /**
+                 * 补缴所属结束日期
+                 */
+                @JsonProperty("overdueTaxEndDate")
+                private String overdueTaxEndDate;
+
+                /**
+                 * 申报状态
+                 * 0: 未申报
+                 * 1: 已申报
+                 * 2: 已完税
+                 * 9: 未知
+                 */
+                @JsonProperty("declareStatus")
+                private String declareStatus;
+
+            }
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class CheckInfoDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -7310260036900373077L;
+            @JsonProperty("answerFlag")
+            private String answerFlag;
+
+            @JsonProperty("checkCode")
+            private String checkCode;
+
+            @JsonProperty("question")
+            private String question;
+
+            @JsonProperty("isTrafficQuestion")
+            private String isTrafficQuestion;
+
+        }
+
+
+        @NoArgsConstructor
+        @Data
+        public static class UnAutoPremiumDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -6416113416581494822L;
+            @JsonProperty("premium")
+            private String premium;
+
+            @JsonProperty("propertyPremium")
+            private String propertyPremium;
+
+            @JsonProperty("casualtyPremium")
+            private String casualtyPremium;
+
+        }
+
+    }
+}

+ 211 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerSaveResponse.java

@@ -0,0 +1,211 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.bohai.crawler.entity.request.quote.*;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerSaveResponse implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 219172726271491872L;
+
+    @JsonProperty("proposalInfo")
+    private ProposalInfoDTO proposalInfo;
+
+    @JsonProperty("applicantInfo")
+    private PersonnelInformation applicantInfo;
+
+    @JsonProperty("insuredInfos")
+    private List<PersonnelInformation> insuredInfos;
+
+    @JsonProperty("vehicleOwnerInfo")
+    private VehicleOwnerInfoDTO vehicleOwnerInfo;
+
+    @JsonProperty("vehicleInfo")
+    private VehicleInfoDTO vehicleInfo;
+
+    @JsonProperty("compulsoryInsurance")
+    private CompulsoryInsuranceDTO compulsoryInsurance;
+
+    @JsonProperty("businessInsurance")
+    private BusinessInsuranceDTO businessInsurance;
+
+    @JsonProperty("driveInsurance")
+    private DriveInsuranceDTO driveInsurance;
+
+    @JsonProperty("motorDriveInsurance")
+    private MotorDriveInsuranceDTO motorDriveInsurance;
+
+    @JsonProperty("checkCarInfomation")
+    private CheckCarInfomationDTO checkCarInfomation;
+
+    @JsonProperty("flatvhlInfo")
+    private FlatvhlInfoDTO flatvhlInfo;
+
+    @JsonProperty("flatvhlInfoList")
+    private String flatvhlInfoList;
+
+    @JsonProperty("acctinfo")
+    private AcctinfoDTO acctinfo;
+
+    @JsonProperty("productInformation")
+    private String productInformation;
+
+    @JsonProperty("exceptionCode")
+    private String exceptionCode;
+
+    @JsonProperty("deliveryVO")
+    private DeliveryVODTO deliveryVO;
+
+    @JsonProperty("incrementVO")
+    private IncrementVODTO incrementVO;
+
+    @JsonProperty("increasedValueMsg")
+    private String increasedValueMsg;
+    @JsonProperty("jabFamilyDriveInsurance")
+    private JabFamilyDriveInsuranceDTO jabFamilyDriveInsurance;
+    @JsonProperty("rqbFamilyDriveInsurance")
+    private RqbFamilyDriveInsuranceDTO rqbFamilyDriveInsurance;
+    @JsonProperty("reInsureVo")
+    private String reInsureVo;
+    @JsonProperty("chdDivisorVoList")
+    private String chdDivisorVoList;
+    @JsonProperty("jkFamilyDriveInsurance")
+    private JkFamilyDriveInsuranceDTO jkFamilyDriveInsurance;
+    @JsonProperty("yyDriveInsurance")
+    private YyDriveInsuranceDTO yyDriveInsurance;
+    @JsonProperty("hyDriveInsurance")
+    private HyDriveInsuranceDTO hyDriveInsurance;
+    @JsonProperty("jkhosDriveInsurance")
+    private JkhosDriveInsuranceDTO jkhosDriveInsurance;
+    @JsonProperty("jyChargeDriveInsurance")
+    private JyChargeDriveInsuranceDTO jyChargeDriveInsurance;
+
+
+    @NoArgsConstructor
+    @Data
+    public static class MotorDriveInsuranceDTO {
+        @JsonProperty("productInfo")
+        private String productInfo;
+        @JsonProperty("itemKinds")
+        private String itemKinds;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class DeliveryVODTO {
+        @JsonProperty("vin")
+        private String vin;
+        @JsonProperty("ciAppNo")
+        private String ciAppNo;
+        @JsonProperty("biAppNo")
+        private String biAppNo;
+        @JsonProperty("dptCde")
+        private String dptCde;
+        @JsonProperty("custName")
+        private String custName;
+        @JsonProperty("appDate")
+        private String appDate;
+        @JsonProperty("custMobile")
+        private String custMobile;
+        @JsonProperty("epolicyMark")
+        private String epolicyMark;
+        @JsonProperty("custProvince")
+        private String custProvince;
+        @JsonProperty("custCity")
+        private String custCity;
+        @JsonProperty("custQuxian")
+        private String custQuxian;
+        @JsonProperty("custAddress")
+        private String custAddress;
+        @JsonProperty("completeAddress")
+        private String completeAddress;
+        @JsonProperty("backMark")
+        private String backMark;
+        @JsonProperty("deliveryDate")
+        private String deliveryDate;
+        @JsonProperty("deliverType")
+        private String deliverType;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class IncrementVODTO {
+        @JsonProperty("incrementList")
+        private String incrementList;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class JabFamilyDriveInsuranceDTO {
+        @JsonProperty("productInfo")
+        private String productInfo;
+        @JsonProperty("itemKinds")
+        private String itemKinds;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class RqbFamilyDriveInsuranceDTO {
+        @JsonProperty("productInfo")
+        private String productInfo;
+        @JsonProperty("itemKinds")
+        private String itemKinds;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class JkFamilyDriveInsuranceDTO {
+        @JsonProperty("productInfo")
+        private String productInfo;
+        @JsonProperty("itemKinds")
+        private String itemKinds;
+        @JsonProperty("uncarInsuredInfos")
+        private String uncarInsuredInfos;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class YyDriveInsuranceDTO {
+        @JsonProperty("productInfo")
+        private String productInfo;
+        @JsonProperty("itemKinds")
+        private String itemKinds;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class HyDriveInsuranceDTO {
+        @JsonProperty("productInfo")
+        private String productInfo;
+        @JsonProperty("itemKinds")
+        private String itemKinds;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class JkhosDriveInsuranceDTO {
+        @JsonProperty("productInfo")
+        private String productInfo;
+        @JsonProperty("itemKinds")
+        private String itemKinds;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class JyChargeDriveInsuranceDTO {
+        @JsonProperty("productInfo")
+        private String productInfo;
+        @JsonProperty("itemKinds")
+        private String itemKinds;
+    }
+
+}

+ 68 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/entity/response/BoHaiCrawlerVehicleConfirmationResponse.java

@@ -0,0 +1,68 @@
+package com.jzg.quotation.bohai.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.bohai.api.entity.response.BoHaiBaseResponse;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * @description: 车辆确认 返回数据
+ * @author: shenwd
+ * @date: 2025/3/3 16:52
+ **/
+@NoArgsConstructor
+@Data
+public class BoHaiCrawlerVehicleConfirmationResponse extends BoHaiBaseResponse {
+
+    @Serial
+    private static final long serialVersionUID = -1117358781373926565L;
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @NoArgsConstructor
+    @Data
+    public static class DataDTO {
+        @JsonProperty("vehicleModels")
+        private List<VehicleModelsDTO> vehicleModels;
+
+        @NoArgsConstructor
+        @Data
+        public static class VehicleModelsDTO {
+            @JsonProperty("familyCode")
+            private String familyCode;
+            @JsonProperty("familyName")
+            private String familyName;
+            @JsonProperty("engineCapacity")
+            private String engineCapacity;
+            @JsonProperty("vehicleAlias")
+            private String vehicleAlias;
+            @JsonProperty("purchasePrice")
+            private String purchasePrice;
+            @JsonProperty("moldName")
+            private String moldName;
+            @JsonProperty("seatCount")
+            private String seatCount;
+            @JsonProperty("moldCharacterCode")
+            private String moldCharacterCode;
+            @JsonProperty("producingArea")
+            private String producingArea;
+            @JsonProperty("vehicleBrand")
+            private String vehicleBrand;
+            @JsonProperty("yearPattern")
+            private String yearPattern;
+            @JsonProperty("emptyWeight")
+            private String emptyWeight;
+            @JsonProperty("carryingCapacity")
+            private Object carryingCapacity;
+            @JsonProperty("deductionDueCodeJY")
+            private String deductionDueCodeJY;
+            @JsonProperty("fuelType")
+            private String fuelType;
+            @JsonProperty("currentValue")
+            private String currentValue;
+        }
+    }
+}

+ 107 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/crawler/util/DESEncryption.java

@@ -0,0 +1,107 @@
+package com.jzg.quotation.bohai.crawler.util;
+
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.crypto.Mode;
+import cn.hutool.crypto.Padding;
+import cn.hutool.crypto.symmetric.DES;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.tomcat.util.buf.HexUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+/**
+ * @description: 渤海财险 DES ECB 加密解密
+ * @author: wenks
+ * @date: 2025/2/11 15:36
+ **/
+@Slf4j
+public final class DESEncryption {
+
+    private DESEncryption() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    private static final String SIGN = "DJCX";
+
+    public static DES DES = null;
+
+    private static void init() {
+        LocalDate localDate = LocalDate.now();
+        int dayOfMonth = localDate.getDayOfMonth();
+        String now = localDate
+                .plusMonths(dayOfMonth)
+                .format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+        String key = now + SIGN;
+        String encode = Base64.encode(key);
+        DES = new DES(Mode.ECB, Padding.PKCS5Padding, encode.getBytes());
+    }
+
+    /**
+     * 加密
+     *
+     * @param data 需要加密的报文
+     * @return 加密参数
+     */
+    public static String encrypt(String data) {
+        log.info("加密前参数:{}", data);
+        init();
+        return DES.encryptHex(data);
+    }
+
+    /**
+     * 解密
+     *
+     * @param data 加密参数
+     * @return 加密后的参数
+     */
+    public static String decrypt(String data) {
+        init();
+        byte[] bytes = HexUtils.fromHexString(data);
+        String decrypt = DES.decryptStr(bytes);
+        log.info("解密后参数:{}", decrypt);
+        return decrypt;
+    }
+
+    /**
+     * 解密并且转码
+     *
+     * @param data   加密参数
+     * @param tClass json转换后的类型
+     * @param <T>    json转换后的泛型
+     * @return 解密后的类
+     */
+    public static <T> T decryptStrToObject(String data, Class<T> tClass) {
+        String decrypt = decrypt(data);
+        return JSON.parseObject(decrypt, tClass);
+    }
+
+    /**
+     * 解密并且转码
+     *
+     * @param data   加密参数
+     * @param tClass json转换后的类型
+     * @param <T>    json转换后的泛型
+     * @return 解密后的类
+     */
+    public static <T> List<T> decryptStrToObjectList(String data, Class<T> tClass) {
+        String decrypt = decrypt(data);
+        return JSON.parseArray(decrypt, tClass);
+    }
+
+    /**
+     * 将对象转为json并加密
+     *
+     * @param data Object 对象
+     * @return 加密字符串
+     */
+    public static String encryptObjectToStr(Object data) {
+        String jsonString = JSONObject.toJSONString(data);
+        return encrypt(jsonString);
+    }
+
+}

+ 28 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/CIKind.java

@@ -0,0 +1,28 @@
+package com.jzg.quotation.bohai.enums.dictionary;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+
+/**
+ * @description: 大家财险 交强险
+ * @author: wenks
+ * @date: 2025/2/13 15:39
+ **/
+@Getter
+@AllArgsConstructor
+public enum CIKind {
+
+    KIND_030055("030055", "每次事故死亡伤残"),
+    KIND_030056("030056", "每次事故医疗费用"),
+    KIND_030057("030057", "每次事故财产损失"),
+    KIND_030058("030058", "每次事故无责任死亡伤残"),
+    KIND_030059("030059", "每次事故无责任医疗费用"),
+    KIND_030060("030060", "每次事故无责任财产损失");
+
+    private final String kindCode;
+
+    private final String kindName;
+
+
+}

+ 39 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/Deductible.java

@@ -0,0 +1,39 @@
+package com.jzg.quotation.bohai.enums.dictionary;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+@Getter
+@AllArgsConstructor
+public enum Deductible {
+
+    N03001001("N03001001", "2000"),
+    N03001002("N03001002", "5000"),
+    N03001003("N03001003", "10000"),
+    N03001004("N03001004", "20000");
+
+    private final String code;
+
+    private final String description;
+
+    private static final Map<String, String> DEDUCTIBLE_LIST;
+
+    public static final String DEDUCTIBLE = "032601";
+
+    static {
+        Map<String, String> tempMap = new HashMap<>();
+        for (TicketNoType ticketNoType : TicketNoType.values()) {
+            tempMap.put(ticketNoType.getDescription(), ticketNoType.getCode());
+        }
+        DEDUCTIBLE_LIST = Collections.unmodifiableMap(tempMap);
+    }
+
+    public static Map<String, String> getDeductible() {
+        return DEDUCTIBLE_LIST;
+    }
+
+}

+ 54 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/PayCarType.java

@@ -0,0 +1,54 @@
+package com.jzg.quotation.bohai.enums.dictionary;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum PayCarType {
+
+    PAY_CAR_TYPE_3T10111("3T10111", "1.0升(含)以下,载客人数9人(含)以下"),
+    PAY_CAR_TYPE_3T10121("3T10121", "1.0升以上至1.6升(含)以下,载客人数9人(含)以下"),
+    PAY_CAR_TYPE_3T10131("3T10131", "1.6升以上至2.0升(含)以下,载客人数9人(含)以下"),
+    PAY_CAR_TYPE_3T10141("3T10141", "2.0升以上至2.5升(含)以下,载客人数9人(含)以下"),
+    PAY_CAR_TYPE_3T10151("3T10151", "2.5升以上至3.0升(含)以下,载客人数9人(含)以下,"),
+    PAY_CAR_TYPE_3T10161("3T10161", "3.0升以上至4.0升(含)以下,载客人数9人(含)以下"),
+    PAY_CAR_TYPE_3T10171("3T10171", "4.0升以上的,载客人数9人(含)以下"),
+    PAY_CAR_TYPE_3T10181("3T10181", "中型客车,核定载客人数9人以上至20人以下"),
+    PAY_CAR_TYPE_3T10191("3T10191", "大型客车,核定载客人数20人(含)以上"),
+    PAY_CAR_TYPE_3T10201("3T10201", "货  车,包括半挂牵引车等"),
+    PAY_CAR_TYPE_3T10211("3T10211", "专用作业车轮式、专用机械车"),
+    PAY_CAR_TYPE_3T10221("3T10221", "挂   车"),
+    PAY_CAR_TYPE_3T10231("3T10231", "摩托车"),
+    PAY_CAR_TYPE_3T1025("3T1025", "三轮汽车"),
+    PAY_CAR_TYPE_3T1026("3T1026", "低速载货汽车");
+
+    private final String code;
+
+    private final String description;
+
+    public static String getPayCarType(double vehicleExhaust, int seatCount) {
+        if (seatCount <= 9) {
+            if (vehicleExhaust <= 1.0) {
+                return PAY_CAR_TYPE_3T10111.getCode();
+            } else if (vehicleExhaust <= 1.60) {
+                return PAY_CAR_TYPE_3T10121.getCode();
+            } else if (vehicleExhaust <= 2.00) {
+                return PAY_CAR_TYPE_3T10131.getCode();
+            } else if (vehicleExhaust <= 2.50) {
+                return PAY_CAR_TYPE_3T10121.getCode();
+            } else if (vehicleExhaust <= 3.00) {
+                return PAY_CAR_TYPE_3T10151.getCode();
+            } else if (vehicleExhaust <= 4.00) {
+                return PAY_CAR_TYPE_3T10161.getCode();
+            } else {
+                return PAY_CAR_TYPE_3T10171.getCode();
+            }
+        } else if (seatCount < 20) {
+            return PAY_CAR_TYPE_3T10111.getCode();
+        } else {
+            return PAY_CAR_TYPE_3T10181.getCode();
+        }
+    }
+
+}

+ 33 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/ProductCode.java

@@ -0,0 +1,33 @@
+package com.jzg.quotation.bohai.enums.dictionary;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 产品代码
+ * @author: wenks
+ * @date: 2025/3/5 15:46
+ **/
+@AllArgsConstructor
+@Getter
+public enum ProductCode {
+
+    PRODUCT_CODE_0320("0320", "汽车交通事故责任强制保险"),
+    PRODUCT_CODE_0336("0336", "机动车综合商业保险"),
+    PRODUCT_CODE_0316("0316", "交通事故强制保险摩托车(拖拉机)定额保险"),
+    PRODUCT_CODE_0325("0325", "摩托车、拖拉机综合商业保险"),
+    PRODUCT_CODE_0327("0327", "机动车单程提车保险"),
+    PRODUCT_CODE_0356("0356", "机动/特种车辆商业保险(2020版)"),
+    PRODUCT_CODE_0355("0355", "摩托车、拖拉机商业保险(2020版)"),
+    PRODUCT_CODE_0357("0357", "机动车单程提车保险(2020版)"),
+    PRODUCT_CODE_0679("0679", "驾乘意外险"),
+    PRODUCT_CODE_0358("0358", "新能源汽车商业保险(2021版)"),
+    PRODUCT_CODE_0359("0359", "粤港两地车商业险"),
+    PRODUCT_CODE_0321("0321", "粤港两地车交强险");
+
+    private final String code;
+
+    private final String description;
+
+}

+ 23 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/Risk.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.bohai.enums.dictionary;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 大家财险 险种
+ * @author: wenks
+ * @date: 2025/2/13 14:38
+ **/
+@Getter
+@AllArgsConstructor
+public enum Risk {
+
+    CI_0320("0320", "交强险"),
+    BI_0356("0356", "商业险");
+
+    private final String riskCode;
+
+    private final String riskName;
+
+}

+ 23 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/TaxTypeYn.java

@@ -0,0 +1,23 @@
+package com.jzg.quotation.bohai.enums.dictionary;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum TaxTypeYn {
+
+    TAX_TYPE_YN_3T5001("3T5001", "暂不缴税"),
+    TAX_TYPE_YN_3T5002("3T5002", "缴税"),
+    TAX_TYPE_YN_3T5003("3T5003", "减税"),
+    TAX_TYPE_YN_3T5004("3T5004", "免税"),
+    TAX_TYPE_YN_3T5005("3T5005", "完税"),
+    TAX_TYPE_YN_3T5006("3T5006", "不征"),
+    TAX_TYPE_YN_3T5007("3T5007", "未代收"),
+    TAX_TYPE_YN_3T5008("3T5008", "补税");
+
+    private final String code;
+
+    private final String description;
+
+}

+ 67 - 0
tenant/insurance/quotation-bohai/src/main/java/com/jzg/quotation/bohai/enums/dictionary/TicketNoType.java

@@ -0,0 +1,67 @@
+package com.jzg.quotation.bohai.enums.dictionary;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@AllArgsConstructor
+@Getter
+public enum TicketNoType {
+
+    TIER_1W("306006001", "10000"),
+    TIER_2W("306006002", "20000"),
+    TIER_4W("306006003", "40000"),
+    TIER_5W("306006004", "50000"),
+    TIER_10W("306006005", "100000"),
+    TIER_15W("306006010", "150000"),
+    TIER_20W("306006006", "200000"),
+    TIER_30W("306006007", "300000"),
+    TIER_40W("306006008", "400000"),
+    TIER_50W("306006009", "500000"),
+    TIER_70W("306006011", "700000"),
+    TIER_80W("306006012", "800000"),
+    TIER_90W("306006013", "900000"),
+    TIER_100W("306006014", "1000000"),
+    TIER_ABOVE_100W("306006015", "100万元以上"),
+    TIER_150W("306006016", "1500000"),
+    TIER_200W("306006017", "2000000"),
+    TIER_250W("306006020", "2500000"),
+    TIER_300W("306006018", "3000000"),
+    TIER_350W("306006021", "3500000"),
+    TIER_400W("306006022", "4000000"),
+    TIER_450W("306006023", "4500000"),
+    TIER_500W("306006019", "5000000"),
+    TIER_600W("306006025", "6000000");
+
+    private static final Map<String, String> TICKET_NO_TYPE_MAP;
+
+    private static final List<String> THIRD_INSURANCE;
+
+    static {
+        Map<String, String> tempMap = new HashMap<>();
+        for (TicketNoType ticketNoType : TicketNoType.values()) {
+            tempMap.put(ticketNoType.getDescription(), ticketNoType.getCode());
+        }
+        TICKET_NO_TYPE_MAP = Collections.unmodifiableMap(tempMap);
+    }
+
+    static {
+        THIRD_INSURANCE = List.of("030018", "035802");
+    }
+
+    public static Map<String, String> getTicketNoTypeCode() {
+        return TICKET_NO_TYPE_MAP;
+    }
+
+    public static List<String> getThirdInsurance() {
+        return THIRD_INSURANCE;
+    }
+
+    private final String code;
+
+    private final String description;
+}

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

@@ -218,6 +218,7 @@ public class RequestComponent {
     /**
      * @param url           请求地址
      * @param param         拼接的请求参数
+     * @param description  描述信息
      * @param responseClass 响应返回类
      * @param <Response>    响应实体
      * @return 响应

+ 4 - 2
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/compoment/DaJiaApiRequestComponent.java

@@ -39,12 +39,14 @@ public class DaJiaApiRequestComponent {
                     +url+"} \n---------> 保险公司:{"
                     + InsuranceEnum.DJPC.getName()+"}\n---------> 请求参数:{"
                     +JSON.toJSONString(requestBody)+"}");
+
             String encrypt = AESEncrypt.encrypt(JSON.toJSONString(requestBody), daJiaApiProperties.getEncryptKey());
             System.out.println(encrypt);
             HttpEntity<String> httpEntity = new HttpEntity<>(encrypt, httpHeaders);
             ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST,  httpEntity, String.class);
             String body = response.getBody();
             System.out.println("\n\n---------> 响应参数:{"+body+"}");
+
             B res = JSON.parseObject(body).toJavaObject(responseType);
             if(ObjectUtils.isEmpty(body)){
                 throw new SystemException("请求失败");
@@ -70,7 +72,7 @@ public class DaJiaApiRequestComponent {
     /**
      * 获取业务订单号
      * @param odr1007Request
-     * @return
+     * @return ODR1007Response
      */
     public ODR1007Response queryBusinessOrders(ODR1007Request odr1007Request,String url) {
         return requestRequestUrl(RequestUrl.DJ_TQBD_100007, odr1007Request, ODR1007Response.class, url);
@@ -106,7 +108,7 @@ public class DaJiaApiRequestComponent {
     /**
      * 报价
      * @param odr1009Request
-     * @return
+     * @return ODR1009Response
      */
     public ODR1009Response newPremiumXnyCalculation(ODR1009Request odr1009Request,String url) {
         return requestRequestUrl(RequestUrl.DJ_TQBD_100009, odr1009Request, ODR1009Response.class,url);

+ 21 - 18
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/DaJiaApiConfigureParameters.java

@@ -6,6 +6,9 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+/**
+ * 大家保险API调用时的配置参数类,包含了与保险业务相关的各种机构、人员和渠道信息。
+ */
 @AllArgsConstructor
 @NoArgsConstructor
 @Data
@@ -13,109 +16,109 @@ public class DaJiaApiConfigureParameters implements ConfigureParameters {
 
 
     /**
-     *
+     *出单地区
      */
     @JsonProperty("IssuingRegion")
     private String issuingRegion;
 
     /**
-     *
+     *登录机构
      */
     @JsonProperty("LoginInstitution")
     private String loginInstitution;
 
     /**
-     *
+     *操作员代码
      */
     @JsonProperty("OperatorCode")
     private String operatorCode;
 
     /**
-     *
+     *操作员姓名
      */
     @JsonProperty("OperatorName")
     private String operatorName;
 
     /**
-     *
+     *业务来源
      */
     @JsonProperty("BusinessSource")
     private String businessSource;
 
     /**
-     *
+     *代理人代码
      */
     @JsonProperty("AgentCode")
     private String agentCode;
 
     /**
-     *
+     *出单机构
      */
     @JsonProperty("IssuingInstitution")
     private String issuingInstitution;
 
     /**
-     *
+     *销售人员代码
      */
     @JsonProperty("SalespersonCode")
     private String salespersonCode;
 
     /**
-     *
+     *销售人员身份证号
      */
     @JsonProperty("SalespersonIDNumber")
     private String salespersonIDNumber;
 
     /**
-     *
+     *销售人员姓名
      */
     @JsonProperty("SalespersonName")
     private String salespersonName;
 
     /**
-     *
+     *业务单元代码
      */
     @JsonProperty("BusinessUnit")
     private String businessUnit;
 
     /**
-     *
+     *业务单元名称
      */
     @JsonProperty("BusinessUnitName")
     private String businessUnitName;
 
     /**
-     *
+     *登录人员身份证号
      */
     @JsonProperty("LoginPersonnelIDNumber")
     private String loginPersonnelIDNumber;
 
     /**
-     *
+     *推荐人
      */
     @JsonProperty("RecommendedBy")
     private String recommendedBy;
 
     /**
-     *
+     *渠道
      */
     @JsonProperty("Channel")
     private String channel;
 
     /**
-     *
+     *推荐子渠道
      */
     @JsonProperty("RecommendedSubChannels")
     private String recommendedSubChannels;
 
     /**
-     *
+     *渠道代码
      */
     @JsonProperty("ChannelCode")
     private String channelCode;
 
     /**
-     *
+     *推荐代码
      */
     @JsonProperty("RecommendedCode")
     private String recommendedCode;

+ 42 - 3
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/DaJiaBaseRequest.java

@@ -9,32 +9,71 @@ import lombok.NoArgsConstructor;
 import java.io.Serializable;
 import java.util.Date;
 
+/**
+ * 大家保险API请求基础类
+ * 包含所有API请求都需要的通用字段,用于标识请求来源、接口类型和请求元数据
+ * 
+ * @author system
+ * @date 2024-03-15
+ */
 @Data
 @NoArgsConstructor
 public class DaJiaBaseRequest implements Serializable {
 
     private static final long serialVersionUID = 0432443271071471444742L;
 
+    /**
+     * 渠道代码
+     * 标识请求来源的业务渠道,用于区分不同的销售渠道
+     * 如:WEB(网销)、TEL(电销)、AGENT(代理)等
+     */
     @JsonProperty("channelCode")
     private String channelCode;
 
+    /**
+     * 接口代码
+     * 标识具体调用的API接口,用于接口路由和权限控制
+     * 如:ODR1007(获取订单号)、ODR1009(报价计算)、ODR1010(核保)等
+     */
     @JsonProperty("interCode")
     private String interCode;
 
+    /**
+     * 模块代码
+     * 标识请求所属的业务模块,用于系统内部的模块划分和管理
+     * 默认值为"test",可根据实际业务环境调整
+     */
     @JsonProperty("moduleCode")
     private String moduleCode;
 
+    /**
+     * 请求序列号
+     * 每个请求的唯一标识符,用于请求追踪、日志记录和问题排查
+     * 格式:test + 雪花算法生成的唯一ID
+     */
     @JsonProperty("serialNo")
     private String serialNo;
 
+    /**
+     * 交易时间
+     * 记录请求发起的时间戳,用于请求时效性控制和业务审计
+     * 格式:yyyy-MM-dd HH:mm:ss
+     */
     @JsonProperty("transTime")
     private String transTime;
 
+    /**
+     * 构造函数
+     * 创建大家保险API请求基础对象,自动生成序列号和时间戳
+     * 
+     * @param channelCode 渠道代码,标识请求来源渠道
+     * @param interCode   接口代码,标识具体调用的API接口
+     */
     public DaJiaBaseRequest(String channelCode, String interCode){
         this.channelCode = channelCode;
         this.interCode = interCode;
-        this.moduleCode = "test";
-        this.serialNo = "test" + IdGenerate.nextId();
-        this.transTime = DateUtil.formatDateTime(new Date());
+        this.moduleCode = "test";  // 默认模块代码
+        this.serialNo = "test" + IdGenerate.nextId();  // 生成唯一序列号
+        this.transTime = DateUtil.formatDateTime(new Date());  // 设置当前时间
     }
 }

+ 1 - 1
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/po/DaJiaApiOrder.java

@@ -30,7 +30,7 @@ public class DaJiaApiOrder {
     private String reptxt;
 
     /**
-     * 交叉销售保单信息
+     * 交叉销售保单信息(驾意险信息)
      */
     private String crossInsurance;
 

+ 3 - 1
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/request/ODR1016Request.java

@@ -6,10 +6,12 @@ import com.jzg.quotation.dajia.api.entity.DaJiaBaseRequest;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
-
 import java.io.Serializable;
 import java.util.Objects;
 
+/**
+ * 大家保险API中用于车辆实际价值计算的请求对象。
+ */
 @EqualsAndHashCode(callSuper = true)
 //@NoArgsConstructor
 @Data

+ 98 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/response/ODR1009Response.java

@@ -23,18 +23,40 @@ public class ODR1009Response extends DaJiaBaseResponse {
     @NoArgsConstructor
     @Data
     public static class ResultDTO {
+
+        /**
+         * 交强险核保状态
+         */
         @JsonProperty("jqAppStatus")
         private Object jqAppStatus;
+
+        /**
+         * 交强险核保状态消息
+         */
         @JsonProperty("jqAppStatusMessage")
         private Object jqAppStatusMessage;
+
+        /**
+         * 商业险核保状态(同交强险)
+         */
         @JsonProperty("syAppStatus")
         private Object syAppStatus;
+
+        /**
+         * 商业险核保状态消息
+         */
         @JsonProperty("syAppStatusMessage")
         private Object syAppStatusMessage;
+
+
         @JsonProperty("basePart")
         private BasePartDTO basePart;
         @JsonProperty("riskRatio")
         private RiskRatioDTO riskRatio;
+
+        /**
+         * 重复投保的详细信息
+         */
         @JsonProperty("reInsuredInfo")
         private String reInsuredInfo;
         @JsonProperty("vehicleTaxation")
@@ -54,43 +76,118 @@ public class ODR1009Response extends DaJiaBaseResponse {
         @JsonProperty("nvhPolicyList")
         private Object nvhPolicyList;
 
+
+        /**
+         * 基础保费信息
+         */
         @NoArgsConstructor
         @Data
         public static class BasePartDTO {
+            /**
+             * 总保费(含税)
+             */
             @JsonProperty("totalPremium")
             private Double totalPremium;
+
+            /**
+             * 总保费(不含税)
+             */
             @JsonProperty("totalPremiumExclud")
             private Double totalPremiumExclud;
+
+            /**
+             * 总保费税额
+             */
             @JsonProperty("totalPremiumVat")
             private Double totalPremiumVat;
+
+            /**
+             * 保险费
+             */
             @JsonProperty("insurancePremium")
             private Double insurancePremium;
+
+            /**
+             * 交强险投保单号
+             */
             @JsonProperty("jqProposalNo")
             private String jqProposalNo;
+
+            /**
+             * 交强险生效日期
+             */
             @JsonProperty("jqEffectiveDate")
             private Object jqEffectiveDate;
+
+            /**
+             * 交强险到期日期
+             */
             @JsonProperty("jqExpireDate")
             private Object jqExpireDate;
+
+            /**
+             * 交强险保费(含税)
+             */
             @JsonProperty("jqPremium")
             private Object jqPremium;
+
+            /**
+             * 交强险保费(不含税)
+             */
             @JsonProperty("jqPremiumExclud")
             private Object jqPremiumExclud;
+
+            /**
+             * 交强险税额
+             */
             @JsonProperty("jqPremiumVat")
             private Object jqPremiumVat;
+
+            /**
+             * 交强险税费
+             */
             @JsonProperty("jqTaxPremium")
             private Object jqTaxPremium;
+
+            /**
+             * 商业险投保单号
+             */
             @JsonProperty("syProposalNo")
             private String syProposalNo;
+
+            /**
+             * 商业险生效日期
+             */
             @JsonProperty("syEffectiveDate")
             private String syEffectiveDate;
+
+            /**
+             * 商业险生效日期
+             */
             @JsonProperty("syExpireDate")
             private String syExpireDate;
+
+            /**
+             * 商业险保费(含税)
+             */
             @JsonProperty("syPremium")
             private Double syPremium;
+
+            /**
+             *商业险保费(不含税)
+             */
             @JsonProperty("syPremiumExclud")
             private Double syPremiumExclud;
+
+            /**
+             *商业险税额
+             */
             @JsonProperty("syPremiumVat")
             private Double syPremiumVat;
+
+            /**
+             * 商业险短期费率
+             */
             @JsonProperty("syShortRate")
             private Integer syShortRate;
         }
@@ -98,6 +195,7 @@ public class ODR1009Response extends DaJiaBaseResponse {
         @NoArgsConstructor
         @Data
         public static class RiskRatioDTO {
+
             @JsonProperty("jqResvNum2")
             private Object jqResvNum2;
             @JsonProperty("syResvNum2")

+ 27 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/response/ODR1016Response.java

@@ -24,12 +24,39 @@ public class ODR1016Response extends DaJiaBaseResponse {
 
         private static final long serialVersionUID = 2420666839215689701L;
 
+        /**
+         * 综合折旧率
+         * 通常在0.0到1.0之间
+         * 示例值:
+         * 0.15 表示折旧率为15%
+         * 0.25 表示折旧率为25%
+         * 0.40 表示折旧率为40%
+         */
         @JsonProperty("sumDepreciationRate")
         private Double sumDepreciationRate;
+
+        /**
+         * 实际价值
+         *
+         * 价值区间关系:
+         * fairMarketValueDown ≤ actualValue ≤ fairMarketValueUp
+         *
+         * 折旧计算关系
+         * actualValue = 新车价格 × (1 - sumDepreciationRate)
+         *
+         */
         @JsonProperty("actualValue")
         private Double actualValue;
+
+        /**
+         * 公允市场价值上限
+         */
         @JsonProperty("fairMarketValueUp")
         private Integer fairMarketValueUp;
+
+        /**
+         * 公允市场价值下限
+         */
         @JsonProperty("fairMarketValueDown")
         private Integer fairMarketValueDown;
     }

+ 61 - 15
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/entity/vo/PersonAreaVo.java

@@ -8,9 +8,13 @@ import java.io.Serial;
 import java.io.Serializable;
 
 /**
- * @description: todo
- * @author: shenwd
- * @date: 2025/3/3 17:09
+ * 人员地区信息值对象
+ * 用于封装客户(车主、被保人、投保人)的地区信息,包含省市区三级行政区划
+ * 主要用于大家保险API调用中的地区信息传递和风险评估
+ * 
+ * @description 地区信息VO,支持省市区三级地区编码和名称
+ * @author shenwd
+ * @date 2025/3/3 17:09
  **/
 @Data
 @NoArgsConstructor
@@ -18,27 +22,69 @@ public class PersonAreaVo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = -3920242388874610188L;
-    //省
+    
+    /**
+     * 省份代码
+     * 标准的省级行政区划代码,通常为2位数字
+     * 如:11-北京市, 31-上海市, 44-广东省, 32-江苏省
+     * 用于保险系统的地区识别和费率计算
+     */
     private String provinceCode;
+    
+    /**
+     * 省份名称
+     * 省级行政区划的标准中文名称
+     * 如:北京市, 上海市, 广东省, 江苏省
+     * 用于用户界面显示和业务识别
+     */
     private String provinceName;
 
-
-    //市
+    /**
+     * 城市代码
+     * 标准的地级行政区划代码,通常为4位数字
+     * 如:1101-北京市市辖区, 3101-上海市市辖区, 4401-广州市, 4403-深圳市
+     * 用于精确定位城市,影响保险费率和政策
+     */
     private String cityCode;
+    
+    /**
+     * 城市名称
+     * 地级行政区划的标准中文名称
+     * 如:北京市, 上海市, 广州市, 深圳市
+     * 用于用户界面显示和业务识别
+     */
     private String cityName;
 
-    //区
+    /**
+     * 区县代码
+     * 标准的县级行政区划代码,通常为6位数字
+     * 如:110101-北京市东城区, 110102-北京市西城区, 440103-广州市荔湾区
+     * 用于最精确的地区定位,支持详细的风险评估和费率计算
+     */
     private String countyCode;
+    
+    /**
+     * 区县名称
+     * 县级行政区划的标准中文名称
+     * 如:东城区, 西城区, 荔湾区, 越秀区
+     * 用于用户界面显示和地区识别
+     */
     private String countyName;
 
-
-
+    /**
+     * 构造函数
+     * 从通用的客户信息对象中提取地区信息,转换为专门的地区信息对象
+     * 用于在大家保险API调用中传递标准化的地区数据
+     * 
+     * @param customerInfoVo 客户信息对象,包含完整的客户基础信息
+     *                      可以是车主信息、被保人信息或投保人信息
+     */
     public PersonAreaVo(CustomerInfoVo customerInfoVo) {
-        this.provinceCode = customerInfoVo.getProvinceCode();
-        this.provinceName = customerInfoVo.getProvince();
-        this.cityCode = customerInfoVo.getCityCode();
-        this.cityName = customerInfoVo.getCity();
-        this.countyCode = customerInfoVo.getCountyCode();
-        this.countyName = customerInfoVo.getCounty();
+        this.provinceCode = customerInfoVo.getProvinceCode();    // 提取省份代码
+        this.provinceName = customerInfoVo.getProvince();        // 提取省份名称
+        this.cityCode = customerInfoVo.getCityCode();            // 提取城市代码
+        this.cityName = customerInfoVo.getCity();                // 提取城市名称
+        this.countyCode = customerInfoVo.getCountyCode();        // 提取区县代码
+        this.countyName = customerInfoVo.getCounty();            // 提取区县名称
     }
 }

+ 1 - 1
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/properties/DaJiaApiProperties.java

@@ -12,7 +12,7 @@ public class DaJiaApiProperties {
     // 请求地址
     private String url;
 
-    // 请求地址
+    // 加密密钥
     private String encryptKey;
 
 

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

@@ -17,6 +17,7 @@ import java.util.Objects;
 public class DaJiaApiOrderServiceImpl implements DaJiaApiOrderService {
 
     private final DaJiaApiOrderRepository daJiaApiOrderRepository;
+
     @Override
     public void saveOrderInfo(QuoteVo quoteVo, ODR1009Response odr1009Response, NVHLODR1001Response nvhlodr1001Response) {
         // 存储信息

+ 6 - 1
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/api/service/impl/DaJiaApiRequestImpl.java

@@ -67,12 +67,16 @@ public class DaJiaApiRequestImpl implements DaJiaApiRequest {
 
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
+        //获取订单交互信息
         OrderBase order = quoteVo.getOrder();
+        //获取归属信息
         AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
+
         // 配置信息
         String url = getApiUrl(order.getInsuranceCompanyId());
         DaJiaApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaJiaApiConfigureParameters.class,
                 attributionInformationVo.getConfigInfo());
+
         // 获取业务订单号
         String orderNo = getOrderNo(parameters,url);
         String busiId = IdGenerate.nextId();
@@ -89,6 +93,7 @@ public class DaJiaApiRequestImpl implements DaJiaApiRequest {
         // 投保人信息
         CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();
         PersonAreaVo policyHolderArea = new PersonAreaVo(policyHolderInfo);
+
         ODR1008Response odr1008Response = confirmationVehicleCustomerInformation(orderNo, busiId, quoteVo, parameters, odr2009Response, ownerInfoArea, insuredPersonArea, policyHolderArea,url);
 
         // 车辆实际价值计算接口
@@ -260,7 +265,7 @@ public class DaJiaApiRequestImpl implements DaJiaApiRequest {
     /**
      * 获取业务订单号接口
      * @param parameters
-     * @return
+     * @return String
      */
     private String getOrderNo(DaJiaApiConfigureParameters parameters,String url) {
         ODR1007Request odr1007Request = new ODR1007Request(parameters);

+ 16 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/DaJiaCrawlerActualValueRequest.java

@@ -35,31 +35,47 @@ public class DaJiaCrawlerActualValueRequest {
     @JsonProperty("rideKind")
     private String rideKind;
 
+    /** 保险起期 */
     @JsonProperty("startDate")
     private String startDate;
 
+    /** 车辆用途代码 */
     @JsonProperty("usage")
     private String usage;
 
+    /** 车辆名称 */
     @JsonProperty("vehicleName")
     private String vehicleName;
 
+    /** 燃料类型代码 */
     @JsonProperty("fuelType")
     private String fuelType;
 
+    /** 组合产品代码 */
     @JsonProperty("combineProductCode")
     private String combineProductCode;
 
+    /** 座位数 */
     @JsonProperty("seatNumber")
     private String seatNumber;
 
+    /** 车型能源类型 */
     @JsonProperty("modelEnergyType")
     private String modelEnergyType;
 
+    /** 操作员代码 */
     @JsonProperty("operatorCode")
     private String operatorCode;
 
 
+    /**
+     * 构造折旧价计算请求
+     * 
+     * @param listDTO 车型查询结果
+     * @param carInfoVo 车辆信息
+     * @param operatorCode 操作员代码
+     * @param combineProductCode 组合产品代码
+     */
     public DaJiaCrawlerActualValueRequest(DaJiaCrawlerCarResponse.ListDTO listDTO, CarInfoVo carInfoVo, String operatorCode, String combineProductCode) {
         this.purchaseValue = listDTO.getPurchasePrice();
         // 注册日期

+ 13 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/DaJiaCrawlerChannelPackagesRequest.java

@@ -5,6 +5,13 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+/**
+ * 大家保险爬虫渠道套餐查询请求实体
+ * 用于查询指定机构和产品组合的可用套餐信息
+ * 
+ * @author system
+ * @date 2025/9/18
+ */
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
@@ -27,6 +34,12 @@ public class DaJiaCrawlerChannelPackagesRequest {
      */
     private String operatorCode;
 
+    /**
+     * 构造方法:基于配置参数和操作员代码创建请求对象
+     * 
+     * @param parameters 大家保险爬虫配置参数
+     * @param operatorCode 操作员代码
+     */
     public DaJiaCrawlerChannelPackagesRequest(DaJiaCrawlerConfigureParameters parameters, String operatorCode) {
         this.loginCompany = parameters.getLoginCompany();
         this.companyCode = parameters.getCDptCde();

+ 34 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/DaJiaCrawlerPriceRequest.java

@@ -15,6 +15,8 @@ import java.util.List;
 
 
 /**
+ * 大家财险保费计算请求实体
+ * 
  * @description: 大家财险 【报价】【请求体】
  * @author: wenks
  * @date: 2025/2/13 16:13
@@ -26,72 +28,104 @@ public class DaJiaCrawlerPriceRequest implements Serializable {
     @Serial
     private static final long serialVersionUID = -4372992959341088406L;
 
+    /** 投保人信息 */
     @JsonProperty("applicantInfo")
     private PersonnelInformation applicantInfo;
 
+    /** 商业险信息 */
     @JsonProperty("businessInsurance")
     private BusinessInsuranceDTO businessInsurance;
 
+    /** 验车信息 */
     @JsonProperty("checkCarInfomation")
     private CheckCarInfomationDTO checkCarInformationDTO;
 
+    /** 交强险信息 */
     @JsonProperty("compulsoryInsurance")
     private CompulsoryInsuranceDTO compulsoryInsurance;
 
+    /** 驾乘险信息 */
     @JsonProperty("driveInsurance")
     private DriveInsuranceDTO driveInsurance;
 
+    /** 家庭驾乘险 */
     @JsonProperty("jabFamilyDriveInsurance")
     private Object jabFamilyDriveInsurance;
 
+    /** 人身意外驾乘险 */
     @JsonProperty("rqbFamilyDriveInsurance")
     private Object rqbFamilyDriveInsurance;
 
+    /** 健康驾乘险 */
     @JsonProperty("jkFamilyDriveInsurance")
     private Object jkFamilyDriveInsurance;
 
+    /** 营运驾乘险 */
     @JsonProperty("yyDriveInsurance")
     private Object yyDriveInsurance;
 
+    /** 货运驾乘险 */
     @JsonProperty("hyDriveInsurance")
     private Object hyDriveInsurance;
 
+    /** 健康住院驾乘险 */
     @JsonProperty("jkhosDriveInsurance")
     private Object jkhosDriveInsurance;
 
+    /** 驾乘人员意外险 */
     @JsonProperty("jyChargeDriveInsurance")
     private Object jyChargeDriveInsurance;
 
+    /** 摩托车驾乘险 */
     @JsonProperty("motorDriveInsurance")
     private Object motorDriveInsurance;
 
+    /** 被保险人信息列表 */
     @JsonProperty("insuredInfos")
     private List<PersonnelInformation> insuredInfos;
 
+    /** 投保单信息 */
     @JsonProperty("proposalInfo")
     private ProposalInfoDTO proposalInfo;
 
+    /** 车辆信息 */
     @JsonProperty("vehicleInfo")
     private VehicleInfoDTO vehicleInfo;
 
+    /** 车主信息 */
     @JsonProperty("vehicleOwnerInfo")
     private VehicleOwnerInfoDTO vehicleOwnerInfo;
 
+    /** 平台车辆信息 */
     @JsonProperty("flatvhlInfo")
     private FlatvhlInfoDTO flatvhlInfo;
 
+    /** 账户信息 */
     @JsonProperty("acctinfo")
     private AcctinfoDTO acctinfo;
 
+    /** 配送信息 */
     @JsonProperty("deliveryVO")
     private Object deliveryVO;
 
+    /** 增值服务信息 */
     @JsonProperty("incrementVO")
     private Object incrementVO;
 
+    /** 操作员代码 */
     @JsonProperty("operatorCode")
     private String operatorCode;
 
+    /**
+     * 构造保费计算请求
+     * 
+     * @param quoteVo 报价请求参数
+     * @param car 车型信息
+     * @param daJiaCrawlerActualValueResponse 折旧价响应
+     * @param proposalInfo 投保单信息
+     * @param userCode 用户代码
+     * @param channelOrderNo 渠道订单号
+     */
     public DaJiaCrawlerPriceRequest(QuoteVo quoteVo,
                                     DaJiaCrawlerCarResponse.ListDTO car,
                                     DaJiaCrawlerActualValueResponse daJiaCrawlerActualValueResponse,

+ 46 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/quote/CompulsoryInsuranceDTO.java

@@ -12,33 +12,52 @@ import lombok.NoArgsConstructor;
 
 import java.util.List;
 
+/**
+ * 大家财险交强险信息DTO
+ */
 @Data
 public class CompulsoryInsuranceDTO {
 
+    /** 产品信息 */
     @JsonProperty("productInfo")
     private ProductInfoDTO productInfo;
 
+    /** 险种明细列表 */
     @JsonProperty("itemKinds")
     private List<ItemKindsDTO> itemKinds;
 
+    /** 车船税信息 */
     @JsonProperty("carShipTax")
     private CarShipTaxDTO carShipTax;
 
+    /** 系数信息 */
     @JsonProperty("coefficientInfo")
     private CoefficientInfoDTO coefficientInfo;
 
+    /** 平台信息 */
     @JsonProperty("platformInfo")
     private String platformInfo;
 
+    /** UBI信息 */
     @JsonProperty("ubiMessage")
     private String ubiMessage;
 
+    /** 费用信息 */
     @JsonProperty("feeInfos")
     private String feeInfos;
 
+    /** 特殊信息列表 */
     @JsonProperty("specialInfos")
     private List<Object> specialInfos;
 
+    /**
+     * 构造交强险信息
+     * 
+     * @param ciRiskInfoVo 交强险风险信息
+     * @param vehicleExhaust 车辆排量
+     * @param seatCount 座位数
+     * @param completeKerbMass 整备质量
+     */
     public CompulsoryInsuranceDTO(RiskInfoVo ciRiskInfoVo, double vehicleExhaust, int seatCount, String completeKerbMass) {
         this.productInfo = new ProductInfoDTO(ciRiskInfoVo);
         this.itemKinds = ItemKindsDTO.getKinds();
@@ -47,6 +66,9 @@ public class CompulsoryInsuranceDTO {
         this.specialInfos = List.of();
     }
 
+    /**
+     * 默认构造函数
+     */
     public CompulsoryInsuranceDTO() {
         this.coefficientInfo = new CoefficientInfoDTO();
         this.carShipTax = new CarShipTaxDTO();
@@ -55,6 +77,9 @@ public class CompulsoryInsuranceDTO {
         this.specialInfos = List.of();
     }
 
+    /**
+     * 交强险产品信息DTO
+     */
     @NoArgsConstructor
     @Data
     public static class ProductInfoDTO {
@@ -217,6 +242,9 @@ public class CompulsoryInsuranceDTO {
         }
     }
 
+    /**
+     * 车船税信息DTO
+     */
     @NoArgsConstructor
     @Data
     public static class CarShipTaxDTO {
@@ -421,6 +449,9 @@ public class CompulsoryInsuranceDTO {
         }
     }
 
+    /**
+     * 交强险系数信息DTO
+     */
     @Data
     public static class CoefficientInfoDTO {
         @JsonProperty("proposalNo")
@@ -641,6 +672,9 @@ public class CompulsoryInsuranceDTO {
         }
     }
 
+    /**
+     * 交强险险种明细DTO
+     */
     @NoArgsConstructor
     @Data
     public static class ItemKindsDTO {
@@ -767,6 +801,13 @@ public class CompulsoryInsuranceDTO {
         @JsonProperty("onceIndemLmt")
         private String onceIndemLmt;
 
+        /**
+         * 构建险种明细DTO
+         * 
+         * @param amount 保险金额
+         * @param ciKind 交强险险种枚举
+         * @return 险种明细DTO
+         */
         private static ItemKindsDTO buildItemKindsDTO(String amount, CIKind ciKind) {
             ItemKindsDTO itemKindsDTO = new ItemKindsDTO();
             itemKindsDTO.setProposalNo("");
@@ -833,6 +874,11 @@ public class CompulsoryInsuranceDTO {
             return itemKindsDTO;
         }
 
+        /**
+         * 获取交强险标准险种列表
+         * 
+         * @return 交强险险种明细列表
+         */
         public static List<ItemKindsDTO> getKinds() {
             ItemKindsDTO kind030055 = buildItemKindsDTO("180000", CIKind.KIND_030055);
             ItemKindsDTO kind030056 = buildItemKindsDTO("18000", CIKind.KIND_030056);

+ 150 - 5
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/quote/ProposalInfoDTO.java

@@ -10,6 +10,13 @@ import lombok.NoArgsConstructor;
 import java.io.Serial;
 import java.io.Serializable;
 
+/**
+ * 大家保险投保信息DTO
+ * 包含投保单的完整业务信息,包括订单、渠道、销售、承保机构等详细数据
+ * 
+ * @author system
+ * @date 2025/9/18
+ */
 @NoArgsConstructor
 @Data
 public class ProposalInfoDTO implements Serializable {
@@ -17,274 +24,414 @@ public class ProposalInfoDTO implements Serializable {
     @Serial
     private static final long serialVersionUID = -607088232798809605L;
 
+    /** 订单号 */
     @JsonProperty("orderNo")
     private String orderNo;
+    /** 行驶证号 */
     @JsonProperty("drivingsNo")
     private String drivingsNo;
     /**
-     * 联合出单类型 1 商业 2 单交
+     * 联合出单类型:1-商业险 2-单交强险
      */
     @JsonProperty("mark")
     private String mark;
+    /** 驾意险标识 */
     @JsonProperty("jyMark")
     private String jyMark;
+    /** 承保部门代码 */
     @JsonProperty("copdpt")
     private String copdpt;
+    /** 城市代码 */
     @JsonProperty("cityCode")
     private String cityCode;
+    /** 登录公司 */
     @JsonProperty("loginCompany")
     private String loginCompany;
+    /** 部门关联代码 */
     @JsonProperty("dptRelCde")
     private String dptRelCde;
+    /** 状态 */
     @JsonProperty("status")
     private String status;
+    /** 总保费 */
     @JsonProperty("totalPremium")
     private String totalPremium;
+    /** 操作日期 */
     @JsonProperty("operateDate")
     private String operateDate;
+    /** 是否需要电子化 */
     @JsonProperty("nessElectronic")
     private String nessElectronic;
+    /** 电子化完成标识 */
     @JsonProperty("electronicFinish")
     private String electronicFinish;
+    /** 发送短信标识 */
     @JsonProperty("sendMessage")
     private String sendMessage;
+    /** 电子保单标识 */
     @JsonProperty("electronicPolicy")
     private String electronicPolicy;
+    /** 销售经理ID */
     @JsonProperty("saleManagerId")
     private String saleManagerId;
+    /** 销售经理姓名 */
     @JsonProperty("saleManagerName")
     private String saleManagerName;
+    /** 车牌号 */
     @JsonProperty("licenseNumber")
     private String licenseNumber;
+    /** 组合产品代码 */
     @JsonProperty("combinedProductCode")
     private String combinedProductCode;
+    /** 承保公司 */
     @JsonProperty("underWriteCompany")
     private String underWriteCompany;
+    /** 承保机构名称 */
     @JsonProperty("underwritingAgencyName")
     private String underwritingAgencyName;
+    /** 修理厂代码 */
     @JsonProperty("repairCode")
     private String repairCode;
+    /** 修理厂名称 */
     @JsonProperty("repairName")
     private String repairName;
+    /** 业务来源 */
     @JsonProperty("businessSource")
     private String businessSource;
+    /** 机构代码 */
     @JsonProperty("organizationCode")
     private String organizationCode;
+    /** 年度代码 */
     @JsonProperty("yearCode")
     private String yearCode;
+    /** 序列代码 */
     @JsonProperty("sequenceCode")
     private String sequenceCode;
+    /** 字符代码 */
     @JsonProperty("characterCode")
     private String characterCode;
+    /** 代理人代码 */
     @JsonProperty("agent")
     private String agent;
+    /** 代理人姓名 */
     @JsonProperty("agentName")
     private String agentName;
+    /** 推荐人代码 */
     @JsonProperty("referrer")
     private String referrer;
+    /** 推荐人身份证号 */
     @JsonProperty("referrerIdentifyNo")
     private String referrerIdentifyNo;
+    /** 推荐人姓名 */
     @JsonProperty("referrerName")
     private String referrerName;
+    /** 渠道代码 */
     @JsonProperty("channelCode")
     private String channelCode;
+    /** 渠道名称 */
     @JsonProperty("channelName")
     private String channelName;
+    /** 维修厂代码 */
     @JsonProperty("repairFactory")
     private String repairFactory;
+    /** 维修厂名称 */
     @JsonProperty("repairFactoryName")
     private String repairFactoryName;
+    /** 客服代码 */
     @JsonProperty("customeServiceCode")
     private String customeServiceCode;
+    /** 销售代码 */
     @JsonProperty("saleCode")
     private String saleCode;
+    /** 销售姓名 */
     @JsonProperty("saleName")
     private String saleName;
+    /** 销售类型 */
     @JsonProperty("saleType")
     private String saleType;
+    /** 销售编号 */
     @JsonProperty("saleNo")
     private String saleNo;
+    /** 销售组代码 */
     @JsonProperty("saleGroupCode")
     private String saleGroupCode;
+    /** 销售组名称 */
     @JsonProperty("saleGroupName")
     private String saleGroupName;
+    /** 操作员代码 */
     @JsonProperty("operatorCode")
     private String operatorCode;
+    /** 操作员姓名 */
     @JsonProperty("operatorName")
     private String operatorName;
+    /** 收费类型 */
     @JsonProperty("feeType")
     private String feeType;
+    /** 争议解决方案 */
     @JsonProperty("argueSolution")
     private String argueSolution;
+    /** 管理公司代码 */
     @JsonProperty("manageCompanyCode")
     private String manageCompanyCode;
+    /** 公司性质 */
     @JsonProperty("companyNature")
     private String companyNature;
+    /** 渠道来源 */
     @JsonProperty("channelSource")
     private String channelSource;
+    /** 团队订单号 */
     @JsonProperty("teamOrderNo")
     private String teamOrderNo;
+    /** 团队订单名称 */
     @JsonProperty("teamOrderName")
     private String teamOrderName;
+    /** 报价ID */
     @JsonProperty("quotePriceId")
     private String quotePriceId;
+    /** 代理销售 */
     @JsonProperty("agentSales")
     private String agentSales;
+    /** 代理销售姓名 */
     @JsonProperty("agentSaleName")
     private String agentSaleName;
+    /** 协议号 */
     @JsonProperty("protocolNo")
     private String protocolNo;
+    /** 子协议号 */
     @JsonProperty("subProtocolNo")
     private String subProtocolNo;
+    /** 农业标识 */
     @JsonProperty("agricultureFlag")
     private String agricultureFlag;
+    /** 仲裁机构名称 */
     @JsonProperty("arbitrationName")
     private String arbitrationName;
+    /** 来源 */
     @JsonProperty("source")
     private String source;
+    /** 佣金比例 */
     @JsonProperty("cmmProp")
     private String cmmProp;
+    /** 车辆比例 */
     @JsonProperty("avtProp")
     private String avtProp;
+    /** 团队比例 */
     @JsonProperty("teamProp")
     private String teamProp;
+    /** 核保建议 */
     @JsonProperty("underWriteAdvice")
     private String underWriteAdvice;
+    /** 关联保单号 */
     @JsonProperty("relPolicyNo")
     private String relPolicyNo;
+    /** 总保费 */
     @JsonProperty("sumPremium")
     private String sumPremium;
+    /** 是否电子保险 */
     @JsonProperty("isElectronicInsurance")
     private String isElectronicInsurance;
+    /** 电子保险完成标识 */
     @JsonProperty("electronicInsuranceFinish")
     private String electronicInsuranceFinish;
+    /** 是否身份采集 */
     @JsonProperty("isIdentityColle")
     private String isIdentityColle;
+    /** 身份采集完成标识 */
     @JsonProperty("identityColleFinish")
     private String identityColleFinish;
+    /** 是否验证码 */
     @JsonProperty("isCaptcha")
     private String isCaptcha;
+    /** 验证码完成标识 */
     @JsonProperty("captchaFinish")
     private String captchaFinish;
+    /** 机器码 */
     @JsonProperty("machineCode")
     private String machineCode;
+    /** 销售禁用标识 */
     @JsonProperty("salesDisabled")
     private String salesDisabled;
+    /** 推荐人禁用标识 */
     @JsonProperty("referrerDisabled")
     private String referrerDisabled;
+    /** 部门代码 */
     @JsonProperty("departmentCode")
     private String departmentCode;
+    /** 告知事项 */
     @JsonProperty("inform")
     private String inform;
+    /** 是否大修产品 */
     @JsonProperty("isDxProducts")
     private String isDxProducts;
+    /** 数据标识 */
     @JsonProperty("dataFlag")
     private String dataFlag;
+    /** 推荐代码 */
     @JsonProperty("recommendCode")
     private String recommendCode;
+    /** 加载模式 */
     @JsonProperty("loadModel")
     private String loadModel;
+    /** 推荐子渠道 */
     @JsonProperty("recSubChannel")
     private String recSubChannel;
+    /** 是否需要人脸识别 */
     @JsonProperty("isNeedFaceRecognition")
     private String isNeedFaceRecognition;
+    /** 驾驶员标识 */
     @JsonProperty("jsMark")
     private String jsMark;
+    /** EDR项目号 */
     @JsonProperty("edrPrjNo")
     private String edrPrjNo;
+    /** 支付路径 */
     @JsonProperty("payPath")
     private String payPath;
+    /** 渠道订单号 */
     @JsonProperty("channelOrderNo")
     private String channelOrderNo;
+    /** 续保合作标识 */
     @JsonProperty("renewalCollaboration")
     private String renewalCollaboration;
+    /** 新渠道主代码 */
     @JsonProperty("newChannelMajorCde")
     private String newChannelMajorCde;
+    /** 新渠道次代码 */
     @JsonProperty("newChannelMinorCde")
     private String newChannelMinorCde;
+    /** 保单序列号 */
     @JsonProperty("policySerialNo")
     private String policySerialNo;
+    /** 币种类型 */
     @JsonProperty("currencyType")
     private String currencyType;
+    /** 是否网络渠道 */
     @JsonProperty("isInternet")
     private String isInternet;
+    /** 销售员姓名 */
     @JsonProperty("salesmanName")
     private String salesmanName;
+    /** 销售员身份证号 */
     @JsonProperty("salesmanIdentifyNo")
     private String salesmanIdentifyNo;
+    /** 币种保费 */
     @JsonProperty("currencyPrm")
     private String currencyPrm;
+    /** 汇率 */
     @JsonProperty("exchangeRate")
     private String exchangeRate;
+    /** 非车险总保费 */
     @JsonProperty("totalUncarPremium")
     private String totalUncarPremium;
+    /** 驾乘意外险标识 */
     @JsonProperty("jabMark")
     private String jabMark;
+    /** 人身意外险标识 */
     @JsonProperty("rqbMark")
     private String rqbMark;
+    /** 特殊标识 */
     @JsonProperty("specMark")
     private String specMark;
+    /** 前端介绍人代码 */
     @JsonProperty("frontIntroduceCde")
     private String frontIntroduceCde;
+    /** 前端介绍人姓名 */
     @JsonProperty("frontIntroduceNme")
     private String frontIntroduceNme;
+    /** 关注微信标识 */
     @JsonProperty("followWeChatFlag")
     private String followWeChatFlag;
+    /** 续保影像标识 */
     @JsonProperty("renewImageFlag")
     private String renewImageFlag;
+    /** 线索ID */
     @JsonProperty("leadsId")
     private String leadsId;
+    /** 渠道销售代码 */
     @JsonProperty("chaSalesCde")
     private String chaSalesCde;
+    /** 渠道销售类型 */
     @JsonProperty("chaSalesType")
     private String chaSalesType;
+    /** 业务标签 */
     @JsonProperty("busiLabel")
     private String busiLabel;
+    /** 双录代码 */
     @JsonProperty("dualRecordCde")
     private String dualRecordCde;
+    /** 双录类型 */
     @JsonProperty("dualRecordType")
     private String dualRecordType;
+    /** 健康险标识 */
     @JsonProperty("jkMark")
     private String jkMark;
+    /** 意外险标识 */
     @JsonProperty("yyMark")
     private String yyMark;
+    /** 货运险标识 */
     @JsonProperty("hyMark")
     private String hyMark;
+    /** 健康住院险标识 */
     @JsonProperty("jkhosMark")
     private String jkhosMark;
+    /** 原始订单号 */
     @JsonProperty("orderNoOrg")
     private String orderNoOrg;
+    /** 回溯标识 */
     @JsonProperty("retrospectFlag")
     private String retrospectFlag;
+    /** 认证标识 */
     @JsonProperty("authenticateFlag")
     private String authenticateFlag;
+    /** 自开业务类型 */
     @JsonProperty("zkbsnsTyp")
     private String zkbsnsTyp;
+    /** 自开业务子类型 */
     @JsonProperty("zkbsnsSubtyp")
     private String zkbsnsSubtyp;
+    /** 营销业务类型 */
     @JsonProperty("yxbsnsTyp")
     private String yxbsnsTyp;
+    /** 银行代码 */
     @JsonProperty("bankCde")
     private String bankCde;
+    /** 银行名称 */
     @JsonProperty("bankName")
     private String bankName;
+    /** 银行子代码 */
     @JsonProperty("bankSubCde")
     private String bankSubCde;
+    /** 银行子名称 */
     @JsonProperty("bankSubName")
     private String bankSubName;
+    /** 关联部门代码 */
     @JsonProperty("relDptCde")
     private String relDptCde;
+    /** 银行业务类型 */
     @JsonProperty("bankBsnsTyp")
     private String bankBsnsTyp;
+    /** 驾意险收费标识 */
     @JsonProperty("jyChargeMark")
     private String jyChargeMark;
+    /** 核心订单号 */
     @JsonProperty("orderNoCore")
     private String orderNoCore;
+    /** 交强险原保单号 */
     @JsonProperty("jqPlyNoOrg")
     private String jqPlyNoOrg;
+    /** 商业险原保单号 */
     @JsonProperty("syPlyNoOrg")
     private String syPlyNoOrg;
 
+    /**
+     * 构造投保信息DTO
+     * 基于公司信息、渠道套餐、销售信息和登录公司构建完整的投保单信息
+     * 
+     * @param companies 公司信息
+     * @param response 渠道套餐响应
+     * @param saleInfo 销售信息
+     * @param loginCompany 登录公司代码
+     */
     public ProposalInfoDTO(DaJiaCrawlerCompaniesResponse.ListDTO companies, DaJiaCrawlerChannelPackagesResponse response, DaJiaCrawlerGetSaleInfoResponse saleInfo, String loginCompany) {
         this.orderNo = "";
         this.drivingsNo = "";
@@ -335,8 +482,7 @@ public class ProposalInfoDTO implements Serializable {
         this.saleGroupName = "";
         this.operatorCode = saleInfo.getRecommendCode();
         this.operatorName = saleInfo.getRecommendName();
-        // 收费方式
-        this.feeType = "10";
+        this.feeType = "10"; // 收费方式:10-现金
         this.argueSolution = "007001";
         this.manageCompanyCode = companies.getManageCompanyCode();
         this.companyNature = companies.getCompanyNature();
@@ -372,8 +518,7 @@ public class ProposalInfoDTO implements Serializable {
         this.dataFlag = "";
         this.recommendCode = "";
         this.loadModel = response.getLoadModel();
-        // 推荐子渠道
-        this.recSubChannel = response.getRecSubChannel();
+        this.recSubChannel = response.getRecSubChannel(); // 推荐子渠道
         this.isNeedFaceRecognition = "";
         this.jsMark = "0";
         this.edrPrjNo = "";

+ 9 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/response/DaJiaCrawlerAuthenticateResponse.java

@@ -6,6 +6,8 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 /**
+ * 大家财险爬虫登录认证响应实体
+ * 
  * @description: 大家财险 【爬虫】 登陆响应
  * @author: wenks
  * @date: 2025/2/27 16:55
@@ -15,24 +17,31 @@ import lombok.NoArgsConstructor;
 @Data
 public class DaJiaCrawlerAuthenticateResponse {
 
+    /** 登录状态标识 */
     @JsonProperty("flag")
     private String flag;
 
+    /** HR编码 */
     @JsonProperty("hrCode")
     private String hrCode;
 
+    /** 身份令牌,用于后续API调用认证 */
     @JsonProperty("idToken")
     private String idToken;
 
+    /** 用户手机号 */
     @JsonProperty("mobile")
     private String mobile;
 
+    /** 用户编码,唯一标识用户身份 */
     @JsonProperty("userCode")
     private String userCode;
 
+    /** 用户角色类型 */
     @JsonProperty("userRole")
     private String userRole;
 
+    /** API版本号 */
     @JsonProperty("version")
     private String version;
 

+ 55 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/response/DaJiaCrawlerCarResponse.java

@@ -9,6 +9,9 @@ import java.io.Serial;
 import java.io.Serializable;
 import java.util.List;
 
+/**
+ * 大家保险爬虫车辆查询响应实体
+ */
 @NoArgsConstructor
 @Data
 public class DaJiaCrawlerCarResponse implements Serializable {
@@ -16,21 +19,29 @@ public class DaJiaCrawlerCarResponse implements Serializable {
     @Serial
     private static final long serialVersionUID = 8290844541630850445L;
 
+    /** 页码 */
     @JsonProperty("pageNum")
     private Integer pageNum;
 
+    /** 每页大小 */
     @JsonProperty("pageSize")
     private Integer pageSize;
 
+    /** 车辆信息列表 */
     @JsonProperty("list")
     private List<ListDTO> list;
 
+    /** 总数量 */
     @JsonProperty("total")
     private Integer total;
 
+    /** 渠道订单号 */
     @JsonProperty("channelOrderNo")
     private String channelOrderNo;
 
+    /**
+     * 车辆信息数据传输对象
+     */
     @NoArgsConstructor
     @Data
     public static class ListDTO implements Serializable, CarModelsFilter {
@@ -43,6 +54,7 @@ public class DaJiaCrawlerCarResponse implements Serializable {
         @JsonProperty("vehicleId")
         private String vehicleId;
 
+        /** 品牌ID */
         @JsonProperty("brandId")
         private String brandId;
         /**
@@ -51,9 +63,11 @@ public class DaJiaCrawlerCarResponse implements Serializable {
         @JsonProperty("vehicleName")
         private String vehicleName;
 
+        /** 车型别名 */
         @JsonProperty("vehicleAlias")
         private String vehicleAlias;
 
+        /** 车辆制造商 */
         @JsonProperty("vehicleMaker")
         private String vehicleMaker;
         /**
@@ -62,24 +76,31 @@ public class DaJiaCrawlerCarResponse implements Serializable {
         @JsonProperty("yearPattern")
         private String yearPattern;
 
+        /** 品牌名称 */
         @JsonProperty("brandName")
         private String brandName;
 
+        /** 车系名称 */
         @JsonProperty("familyName")
         private String familyName;
 
+        /** 车辆级别 */
         @JsonProperty("vehicleClass")
         private String vehicleClass;
 
+        /** 车辆类型 */
         @JsonProperty("vehicleType")
         private String vehicleType;
 
+        /** 商业险分类名称 */
         @JsonProperty("syxClassname")
         private String syxClassname;
 
+        /** 交强险分类名称 */
         @JsonProperty("jqxClassname")
         private String jqxClassname;
 
+        /** 搜索代码 */
         @JsonProperty("searchCode")
         private String searchCode;
         /**
@@ -88,6 +109,7 @@ public class DaJiaCrawlerCarResponse implements Serializable {
         @JsonProperty("vehicleExhaust")
         private String vehicleExhaust;
 
+        /** 车辆吨位 */
         @JsonProperty("vehicleTonnage")
         private String vehicleTonnage;
         /**
@@ -96,27 +118,35 @@ public class DaJiaCrawlerCarResponse implements Serializable {
         @JsonProperty("vehicleSeat")
         private Integer vehicleSeat;
 
+        /** 含税车价 */
         @JsonProperty("vehiclePriceTax")
         private Integer vehiclePriceTax;
 
+        /** 防盗装置 */
         @JsonProperty("antiTheft")
         private String antiTheft;
 
+        /** 安全气囊 */
         @JsonProperty("airbag")
         private String airbag;
 
+        /** ABS标识 */
         @JsonProperty("absFlag")
         private String absFlag;
 
+        /** 变速器类型 */
         @JsonProperty("transmissionType")
         private String transmissionType;
 
+        /** 备注 */
         @JsonProperty("remark")
         private String remark;
 
+        /** 最大质量 */
         @JsonProperty("qualityMax")
         private Integer qualityMax;
 
+        /** 最小质量 */
         @JsonProperty("qualityMin")
         private Integer qualityMin;
 
@@ -126,12 +156,15 @@ public class DaJiaCrawlerCarResponse implements Serializable {
         @JsonProperty("vehiclePrice")
         private String vehiclePrice;
 
+        /** 含税车价1 */
         @JsonProperty("vehiclePriceTax1")
         private String vehiclePriceTax1;
 
+        /** 厂家ID */
         @JsonProperty("factoryId")
         private String factoryId;
 
+        /** 动力 */
         @JsonProperty("power")
         private String power;
         /**
@@ -150,69 +183,91 @@ public class DaJiaCrawlerCarResponse implements Serializable {
         @JsonProperty("powerTypeName")
         private String powerTypeName;
 
+        /** 车船税标识 */
         @JsonProperty("travelTaxMark")
         private String travelTaxMark;
 
+        /** 车辆行业代码 */
         @JsonProperty("vehicleHyCode")
         private String vehicleHyCode;
 
+        /** 车辆行业名称 */
         @JsonProperty("vehicleHyName")
         private String vehicleHyName;
 
+        /** 车架号 */
         @JsonProperty("cfrmNo")
         private String cfrmNo;
 
+        /** 发动机号 */
         @JsonProperty("cengNo")
         private String cengNo;
 
+        /** 车牌号 */
         @JsonProperty("cplateNo")
         private String cplateNo;
 
+        /** 整备质量 */
         @JsonProperty("ncurbWt")
         private String ncurbWt;
 
+        /** 号牌种类 */
         @JsonProperty("cplateTyp")
         private String cplateTyp;
 
+        /** 过户日期 */
         @JsonProperty("ttransferDate")
         private String ttransferDate;
 
+        /** 注册车辆类型 */
         @JsonProperty("cregVhlTyp")
         private String cregVhlTyp;
 
+        /** 车辆类型 */
         @JsonProperty("cvhlTyp")
         private String cvhlTyp;
 
+        /** 使用性质代码 */
         @JsonProperty("cusageCde")
         private String cusageCde;
 
+        /** 初次登记年月 */
         @JsonProperty("cfstRegYmBar")
         private String cfstRegYmBar;
 
+        /** 座位数 */
         @JsonProperty("nseatNum")
         private String nseatNum;
 
+        /** 吨位 */
         @JsonProperty("ntonage")
         private String ntonage;
 
+        /** 排量 */
         @JsonProperty("ndisplacement")
         private String ndisplacement;
 
+        /** 注册车主 */
         @JsonProperty("cregOwner")
         private String cregOwner;
 
+        /** 交通使用性质代码 */
         @JsonProperty("ctraUsageCde")
         private String ctraUsageCde;
 
+        /** 拖挂 */
         @JsonProperty("chaulge")
         private String chaulge;
 
+        /** 合格证日期 */
         @JsonProperty("tcertificateDate")
         private String tcertificateDate;
 
+        /** 燃料类型 */
         @JsonProperty("cfuelType")
         private String cfuelType;
 
+        /** 车型能源类型 */
         @JsonProperty("cmodelEnergyType")
         private String cmodelEnergyType;
 

+ 12 - 0
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerQuoteProcessServiceImpl.java

@@ -28,6 +28,12 @@ public class DaJiaCrawlerQuoteProcessServiceImpl implements DaJiaCrawlerQuotePro
     // 登陆次数
     public static final int LOGINS_NUMBER = 3;
 
+    /**
+     * 登录
+     * @param username 用户名
+     * @param password 密码
+     * @return String
+     */
     @Override
     public String login(String username, String password) {
         for (int i = 0; i < LOGINS_NUMBER; i++) {
@@ -68,6 +74,12 @@ public class DaJiaCrawlerQuoteProcessServiceImpl implements DaJiaCrawlerQuotePro
         return headers;
     }
 
+    /**
+     * 校验token
+     * @param userCode
+     * @param token
+     * @return String
+     */
     public String checkToken(String userCode, String token) {
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.set(HttpHeaders.AUTHORIZATION, "Bearer " + token);

+ 131 - 25
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerRequestImpl.java

@@ -34,88 +34,166 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+/**
+ * 大家财险爬虫报价服务实现类
+ * 
+ * <p>通过模拟浏览器操作的方式实现大家财险的完整报价流程,包括:</p>
+ * <ul>
+ *   <li>用户登录认证</li>
+ *   <li>车险报价计算</li>
+ *   <li>订单核保处理</li>
+ *   <li>支付链接生成</li>
+ *   <li>影像资料上传</li>
+ *   <li>保单下载</li>
+ *   <li>订单状态查询</li>
+ * </ul>
+ * 
+ * @author wenks
+ * @since 2025/2/12
+ */
 @QuoteCrawlerService(value = InsuranceCode.INSURANCE_DJPC)
 @RequiredArgsConstructor
 public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
 
+    /** 大家财险爬虫请求组件,负责与保险公司API的交互 */
     private final DaJiaCrawlerRequestComponent daJiaCrawlerRequestComponent;
 
+    /** 归属信息构建组件,用于构建机构、套餐、渠道等归属信息 */
     private final BuildingAttributionInformation buildingAttributionInformation;
 
+    /** 大家财险缓存组件,负责认证信息和订单数据的缓存管理 */
     private final DaJiaCrawlerCacheComponent daJiaCrawlerCacheComponent;
 
+    /** 大家财险订单服务,负责订单数据的持久化操作 */
     private final DaJiaCrawlerOrderService daJiaCrawlerOrderService;
 
+    /** 大家财险爬虫报价流程服务,负责登录认证和请求头管理 */
     private final DaJiaCrawlerQuoteProcessService daJiaCrawlerQuoteProcessService;
 
+    /**
+     * 用户登录认证
+     * 
+     * @param loginBase 登录基础信息,包含用户名和密码
+     */
     @Override
     public void login(LoginBase loginBase) {
         daJiaCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    /**
+     * 车险报价核心流程
+     * 
+     * <p>完整的报价流程包括以下步骤:</p>
+     * <ol>
+     *   <li>获取认证信息和配置参数</li>
+     *   <li>构建归属信息(机构、套餐、渠道)</li>
+     *   <li>车型查询和匹配</li>
+     *   <li>计算车辆折旧价格</li>
+     *   <li>保费计算</li>
+     *   <li>订单保存和数据初始化</li>
+     *   <li>缓存订单数据</li>
+     *   <li>持久化订单信息</li>
+     * </ol>
+     * 
+     * @param quoteVo 报价请求参数,包含车辆信息、投保人信息等
+     * @return QuoteResultsVo 报价结果,包含保费明细、订单号等信息
+     */
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) {
-        // 1.0获取token的请求头
+        // 1.0 获取认证信息和用户配置
         AttributionInformationVo attributionInformationVo = quoteVo.getOrder().getAttributionInformationVo();
         HttpHeaders headers = daJiaCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         String userCode = daJiaCrawlerCacheComponent.getUserCode(attributionInformationVo.getUsername());
-        // 1.1 配置信息
+
+        // 1.1 解析配置参数
         DaJiaCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaJiaCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
-        // 1.2 获取归属信息
+        // 1.2 构建归属信息(机构、套餐、渠道信息)
         ProposalInfoDTO proposalInfoDTO = buildingAttributionInformation.build(parameters, userCode, headers);
 
         // 2.0 车型查询
         DaJiaCrawlerCarRequest daJiaCrawlerCarRequest = new DaJiaCrawlerCarRequest(quoteVo.getCarInfoVo(), parameters.getLoginCompany(), parameters.getCDptCde(), userCode);
         DaJiaCrawlerCarResponse daJiaCrawlerCarResponse = daJiaCrawlerRequestComponent.car(daJiaCrawlerCarRequest, headers);
-        // 2.1 获取相同的车型
+
+        // 2.1 匹配最符合的车型
         DaJiaCrawlerCarResponse.ListDTO listDTO = CarModelsFilterUtils.to(daJiaCrawlerCarResponse.getList(), quoteVo.getCarInfoVo());
-        // 2.2 计算折旧价格
+        // 2.2 计算车辆折旧价格
         DaJiaCrawlerActualValueRequest daJiaCrawlerActualValueRequest = new DaJiaCrawlerActualValueRequest(listDTO, quoteVo.getCarInfoVo(), userCode, parameters.getCombineProductCode());
         DaJiaCrawlerActualValueResponse daJiaCrawlerActualValueResponse = daJiaCrawlerRequestComponent.actualValue(daJiaCrawlerActualValueRequest, headers);
 
         // 3.0 保费计算
         DaJiaCrawlerPriceRequest daJiaCrawlerPriceRequest = new DaJiaCrawlerPriceRequest(quoteVo, listDTO, daJiaCrawlerActualValueResponse, proposalInfoDTO, userCode, daJiaCrawlerCarResponse.getChannelOrderNo());
         DaJiaCrawlerPriceResponse crawlerPriceResponse = daJiaCrawlerRequestComponent.price(daJiaCrawlerPriceRequest, headers);
-        // 3.1 订单保存
+
+        // 3.1 保存订单到保险公司系统
         DaJiaCrawlerSaveRequest daJiaCrawlerSaveRequest = new DaJiaCrawlerSaveRequest(crawlerPriceResponse, userCode, quoteVo);
         DaJiaCrawlerSaveResponse daJiaCrawlerSaveResponse = daJiaCrawlerRequestComponent.save(daJiaCrawlerSaveRequest, headers);
-        // 3.2 初始化数据
+        // 3.2 初始化订单数据
         DaJiaCrawlerInitDataRequest daJiaCrawlerInitDataRequest = new DaJiaCrawlerInitDataRequest(daJiaCrawlerSaveResponse.getCompulsoryInsurance(), daJiaCrawlerSaveResponse.getBusinessInsurance());
         daJiaCrawlerRequestComponent.initData(daJiaCrawlerInitDataRequest, headers);
 
-        // 3.2 缓存数据
+        // 4.0 缓存订单数据供后续操作使用
         daJiaCrawlerCacheComponent.cacheDaJiaCrawlerSaveResponse(daJiaCrawlerSaveResponse, daJiaCrawlerSaveResponse.getProposalInfo().getOrderNo());
 
-        // 4.0 保存数据
+        // 4.1 持久化订单信息到本地数据库
         daJiaCrawlerOrderService.saveOrderInfo(quoteVo, daJiaCrawlerSaveResponse, daJiaCrawlerInitDataRequest.getBusinessNo());
-        // 返回报价信息
-        return DaJiaCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo.getOrder()
-                .getOrdersNo(), quoteVo, daJiaCrawlerSaveResponse);
+        // 4.2 构建并返回报价结果
+        return DaJiaCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo.getOrder().getOrdersNo(), quoteVo, daJiaCrawlerSaveResponse);
     }
 
+    /**
+     * 订单核保处理
+     * 
+     * <p>将已报价的订单提交给保险公司进行核保审核</p>
+     * 
+     * @param underwritingVo 核保请求参数,包含订单号等信息
+     * @return UnderwritingResultsVo 核保结果
+     */
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
         AttributionInformationVo attributionInformationVo = underwritingVo.getOrder().getAttributionInformationVo();
         DaJiaCrawlerOrder daJiaCrawlerOrder = daJiaCrawlerOrderService.getById(underwritingVo.getOrder().getOrdersNo());
-        // 获取请求头
+        // 获取认证请求头
         HttpHeaders headers = daJiaCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+        // 从缓存中获取订单保存响应数据
         DaJiaCrawlerSaveResponse daJiaCrawlerSaveResponse = daJiaCrawlerCacheComponent.getDaJiaCrawlerSaveResponse(daJiaCrawlerOrder.getOrdersNo());
-        // 提交核保
+        // 提交核保申请
         DaJiaCrawlerGenerateResponse response = daJiaCrawlerRequestComponent.generate(daJiaCrawlerSaveResponse, headers);
 
         return new UnderwritingResultsVo();
     }
 
+    /**
+     * 获取支付链接
+     * 
+     * <p>为已核保通过的订单生成支付二维码链接</p>
+     * 
+     * @param paymentLinkVo 支付链接请求参数
+     * @return PaymentLinkResultsVo 支付链接结果,包含二维码URL
+     */
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
         AttributionInformationVo attributionInformationVo = paymentLinkVo.getOrder().getAttributionInformationVo();
         DaJiaCrawlerOrder daJiaCrawlerOrder = daJiaCrawlerOrderService.getById(paymentLinkVo.getOrder().getOrdersNo());
         HttpHeaders headers = daJiaCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         String userCode = daJiaCrawlerCacheComponent.getUserCode(attributionInformationVo.getUsername());
+        // 生成支付二维码
         DaJiaCrawlerQrcodeResponse daJiaCrawlerQrcodeResponse = daJiaCrawlerRequestComponent.qrcode(daJiaCrawlerOrder.getOrdersNo(), userCode, headers);
         return new PaymentLinkResultsVo(true, daJiaCrawlerQrcodeResponse.getUrl(), "");
     }
 
+    /**
+     * 上传保险影像资料
+     * 
+     * <p>上传车险相关的影像资料,如行驶证、驾驶证等。流程包括:</p>
+     * <ol>
+     *   <li>获取上传文件标志和URL</li>
+     *   <li>计算文件MD5校验值</li>
+     *   <li>批量上传文件到对象存储</li>
+     *   <li>统一提交文件信息到保险系统</li>
+     * </ol>
+     * 
+     * @param insuranceUploadImageVo 影像上传请求参数,包含图片列表和分类信息
+     */
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         AttributionInformationVo attributionInformationVo = insuranceUploadImageVo.getOrder()
@@ -125,32 +203,50 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         DaJiaCrawlerOrder daJiaCrawlerOrder = daJiaCrawlerOrderService.getById(insuranceUploadImageVo.getOrder()
                 .getOrdersNo());
         List<InsuranceImageVo> imageVoList = insuranceUploadImageVo.getImageVoList();
+        
+        // 按影像类型分组处理
         imageVoList.forEach(imageVo -> {
-            // 上传文件标志
+            // 1. 获取上传文件标志和预签名URL
             DaJiaCrawlerUploadSignsRequest daJiaCrawlerUploadSignsRequest = new DaJiaCrawlerUploadSignsRequest(daJiaCrawlerOrder.getBusinessNo(), imageVo.getInsuranceImageCode(), imageVo.getImageBase64List());
             DaJiaCrawlerUploadSignsResponse daJiaCrawlerUploadSignsResponse = daJiaCrawlerRequestComponent.uploadSigns(daJiaCrawlerUploadSignsRequest, headers);
+            // 2. 构建文件名到上传信息的映射
             Map<String, DaJiaCrawlerUploadSignsResponse.DataDTO> dataDTOMap = daJiaCrawlerUploadSignsResponse.getData()
                     .stream()
                     .collect(Collectors.toMap(DaJiaCrawlerUploadSignsResponse.DataDTO::getFileName, x -> x));
 
             DaJiaCrawlerUploadRequest daJiaCrawlerUploadRequest = new DaJiaCrawlerUploadRequest(daJiaCrawlerOrder.getBusinessNo(), imageVo.getInsuranceImageCode(), userCode, daJiaCrawlerOrder.getCiPolicyNumber(), daJiaCrawlerOrder.getBiPolicyNumber());
-            // 上传文件
+            // 3. 批量上传文件
             imageVo.getImageBase64List().forEach(imageBase64 -> {
+                // 计算文件MD5校验值
                 String contentMD5 = ImagesEncrypt.encrypt(imageBase64.getImageBase64Str());
                 DaJiaCrawlerUploadSignsResponse.DataDTO dataDTO = dataDTOMap.get(imageBase64.getImageName());
+                // 上传文件到对象存储
                 DaJiaCrawlerUploadRequest.FileListDTO fileListDTO = daJiaCrawlerRequestComponent.uploadFile(dataDTO.getFileURL(), imageBase64.getImageByte(), contentMD5);
+                // 设置文件元信息
                 fileListDTO.setName(dataDTO.getFileName());
                 fileListDTO.setPath(dataDTO.getFilePath());
                 fileListDTO.setSize(Integer.valueOf(imageBase64.getImageSize()));
                 daJiaCrawlerUploadRequest.getFileList().add(fileListDTO);
             });
-            // 统一上传文件信息
+            // 4. 统一提交文件信息到保险系统
             daJiaCrawlerRequestComponent.upload(daJiaCrawlerUploadRequest, headers);
         });
-
     }
 
 
+    /**
+     * 下载电子保单
+     * 
+     * <p>根据订单信息下载对应的电子保单文件,支持:</p>
+     * <ul>
+     *   <li>交强险保单</li>
+     *   <li>商业险保单</li>
+     *   <li>非车险保单</li>
+     * </ul>
+     * 
+     * @param downloadPolicyVo 保单下载请求参数
+     * @return DownloadPolicyResultVo 保单下载结果,包含各类保单的下载链接
+     */
     @Override
     public DownloadPolicyResultVo downloadPolicy(DownloadPolicyVo downloadPolicyVo) {
         AttributionInformationVo attributionInformationVo = downloadPolicyVo.getOrder().getAttributionInformationVo();
@@ -163,21 +259,22 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         DaJiaCrawlerDownloadRequest daJiaCrawlerDownloadRequest = new DaJiaCrawlerDownloadRequest(daJiaCrawlerOrder, userCode);
         DownloadPolicyResultVo downloadPolicyResultVo = new DownloadPolicyResultVo();
         DaJiaCrawlerDownloadResponse response;
-        // 交强保单
+        
+        // 下载交强险保单
         if (StringUtils.hasLength(daJiaCrawlerOrder.getCiPolicyNo())) {
             daJiaCrawlerDownloadRequest.setPlyNo(daJiaCrawlerOrder.getCiPolicyNo());
             response = daJiaCrawlerRequestComponent.electronPolicyIODownload(daJiaCrawlerDownloadRequest, headers);
             downloadPolicyResultVo.setJqUrl(response.getFile());
         }
 
-        // 商业保单
+        // 下载商业险保单
         if (StringUtils.hasLength(daJiaCrawlerOrder.getBiPolicyNo())) {
-            daJiaCrawlerDownloadRequest.setPlyNo(daJiaCrawlerOrder.getCiPolicyNo());
+            daJiaCrawlerDownloadRequest.setPlyNo(daJiaCrawlerOrder.getBiPolicyNo());
             response = daJiaCrawlerRequestComponent.electronPolicyIODownload(daJiaCrawlerDownloadRequest, headers);
             downloadPolicyResultVo.setSyUrl(response.getFile());
         }
 
-        // 非车保单
+        // 下载非车险保单
         if (StringUtils.hasLength(daJiaCrawlerOrder.getCiPolicyNo())) {
             daJiaCrawlerDownloadRequest.setPlyNo(daJiaCrawlerOrder.getCiPolicyNo());
             response = daJiaCrawlerRequestComponent.electronPolicyIODownload(daJiaCrawlerDownloadRequest, headers);
@@ -186,19 +283,28 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         return downloadPolicyResultVo;
     }
 
+    /**
+     * 查询订单状态
+     * 
+     * <p>查询订单在保险公司系统中的最新状态,包括核保状态、支付状态等</p>
+     * 
+     * @param orderStatusVo 订单状态查询请求参数
+     * @return OrderStatusResultVo 订单状态结果,包含订单当前状态信息
+     */
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         AttributionInformationVo attributionInformationVo = orderStatusVo.getOrder().getAttributionInformationVo();
         HttpHeaders headers = daJiaCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
-        // 1.1 配置信息
+        // 解析配置参数
         DaJiaCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(DaJiaCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
-        // 获取订单信息
+        // 获取本地订单信息
         DaJiaCrawlerOrder daJiaCrawlerOrder = daJiaCrawlerOrderService.getById(orderStatusVo.getOrder()
                 .getOrdersNo());
         String userCode = daJiaCrawlerCacheComponent.getUserCode(attributionInformationVo.getUsername());
-        // 订单状态
+        // 查询保险公司系统中的订单状态
         DaJiaCrawlerOrderListRevisedRequest daJiaCrawlerOrderListRevisedRequest = new DaJiaCrawlerOrderListRevisedRequest(parameters.getLoginCompany(), daJiaCrawlerOrder.getOrdersNo(), userCode, daJiaCrawlerOrder.getCreateTime());
         DaJiaCrawlerOrderListRevisedResponse.ListDTO listDTO = daJiaCrawlerRequestComponent.orderListRevised(daJiaCrawlerOrderListRevisedRequest, headers);
+        // 构建并返回订单状态结果
         return DaJiaCrawlerQuoteResultsVoBuild.buildOrderStatusResultVo(listDTO);
     }
 

+ 2 - 2
tenant/insurance/quotation-summary/src/main/resources/application-dev.yaml

@@ -6,10 +6,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
         group: DEFAULT_GROUP
       discovery:
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
   config:
     import:
       - nacos:mysql

+ 1 - 0
tenant/insurance/quotation-taikang/pom.xml

@@ -5,6 +5,7 @@
         <groupId>com.jzg</groupId>
         <artifactId>tenant</artifactId>
         <version>1.0-SNAPSHOT</version>
+        <relativePath>../../pom.xml</relativePath>
     </parent>
     <artifactId>quotation-taikang</artifactId>
     <packaging>jar</packaging>

+ 2 - 2
tenant/insurance/quotation-taikang/src/test/java/com/jzg/quotation/taikang/crawler/TKHttpAPIServiceTest1.java

@@ -86,8 +86,8 @@ public class TKHttpAPIServiceTest1 {
                 .build();
 
 
-        RequestComponent requestComponent = new RequestComponent(webClient);
-
+//        RequestComponent requestComponent = new RequestComponent(webClient);
+        RequestComponent requestComponent = null;
         TKHttpClient client = new TKHttpClient();
 
         client.setRequestComponent(requestComponent);

+ 2 - 0
tenant/insurance/quotation-yangguang/pom.xml

@@ -23,11 +23,13 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+
         <dependency>
             <groupId>com.sunecm</groupId>
             <artifactId>sunecm-url-encode-1</artifactId>
             <version>1.0.0</version>
         </dependency>
+
         <dependency>
             <groupId>commons-httpclient</groupId>
             <artifactId>commons-httpclient</artifactId>

+ 1 - 0
tenant/insurance/quotation-zhongan/pom.xml

@@ -5,6 +5,7 @@
         <groupId>com.jzg</groupId>
         <artifactId>tenant</artifactId>
         <version>1.0-SNAPSHOT</version>
+        <relativePath>../../pom.xml</relativePath>
     </parent>
     <artifactId>quotation-zhongan</artifactId>
     <name>众安保险</name>

+ 3 - 1
tenant/insurance/quotation-zhongan/src/test/java/com/jzg/quotation/zhongan/crawler/service/ZhongAnAPIServiceTest.java

@@ -83,7 +83,9 @@ public class ZhongAnAPIServiceTest {
                 .build();
 
 
-        RequestComponent requestComponent = new RequestComponent(webClient);
+//        RequestComponent requestComponent = new RequestComponent(webClient);
+
+        RequestComponent requestComponent = null;
 
         zhongAnAPIService = new ZhongAnAPIService();
         zhongAnAPIService.setRequestComponent(requestComponent);

+ 4 - 1
tenant/openfeign/pom.xml

@@ -10,6 +10,7 @@
     <packaging>jar</packaging>
     <name>openfeign Maven Webapp</name>
     <url>http://maven.apache.org</url>
+
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -21,8 +22,8 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-openfeign</artifactId>
         </dependency>
-
     </dependencies>
+
     <build>
         <plugins>
             <plugin>
@@ -54,6 +55,7 @@
                     </execution>
                 </executions>
             </plugin>
+
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
@@ -71,6 +73,7 @@
                     </archive>
                 </configuration>
             </plugin>
+
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-resources-plugin</artifactId>

+ 4 - 0
tenant/openfeign/src/main/resources/application.yml

@@ -12,6 +12,10 @@ spring:
       username: root
       password: '@RqGHG#KZ*C9ytkQ'
       driverClassName: com.mysql.cj.jdbc.Driver
+  cloud:
+    nacos:
+      config:
+        import-check.enabled: false
 
 mybatis-plus:
   mapper-locations: classpath*:/mapper/*Mapper.xml

+ 2 - 2
tenant/organization/src/main/resources/application-dev.yml

@@ -8,10 +8,10 @@ spring:
       password: nacos
       config:
         file-extension: yaml
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
         group: DEFAULT_GROUP
       discovery:
-        namespace: 1096345e-2a2d-4307-8025-ee1b669e127b
+        namespace: bf63c033-4d4b-4aef-85be-1d0499c261d4
   config:
     import:
       - nacos:mysql

+ 4 - 4
tenant/pom.xml

@@ -6,16 +6,19 @@
         <artifactId>jzg</artifactId>
         <version>1.0-SNAPSHOT</version>
     </parent>
+
     <artifactId>tenant</artifactId>
     <packaging>pom</packaging>
     <name>tenant Maven Webapp</name>
     <url>http://maven.apache.org</url>
+
     <modules>
         <module>organization</module>
         <module>openfeign</module>
         <module>insurance</module>
         <module>costsorrule</module>
     </modules>
+
     <dependencies>
         <dependency>
             <groupId>mysql</groupId>
@@ -58,16 +61,14 @@
             <groupId>com.jzg</groupId>
             <artifactId>rocketmq</artifactId>
         </dependency>
-
     </dependencies>
 
     <dependencyManagement>
 
-
     </dependencyManagement>
+
     <build>
         <plugins>
-
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
@@ -78,7 +79,6 @@
                     <encoding>UTF-8</encoding>
                 </configuration>
             </plugin>
-
         </plugins>
     </build>
 </project>