Bläddra i källkod

Merge branch 'test' into test-wks1

wks 1 år sedan
förälder
incheckning
44307c73a8
100 ändrade filer med 3880 tillägg och 396 borttagningar
  1. 3 1
      src/main/java/com/ydtech/modules/admin/constants/SwitchConfig.java
  2. 10 6
      src/main/java/com/ydtech/modules/admin/controller/SysLoginController.java
  3. 6 0
      src/main/java/com/ydtech/modules/admin/controller/SysSwitchConfigController.java
  4. 18 2
      src/main/java/com/ydtech/modules/admin/controller/SysUserController.java
  5. 175 0
      src/main/java/com/ydtech/modules/admin/model/po/CustVehiclePolicyInfo.java
  6. 4 0
      src/main/java/com/ydtech/modules/admin/model/vo/SysPremiumDetailsVo.java
  7. 5 1
      src/main/java/com/ydtech/modules/admin/service/SysSwitchConfigService.java
  8. 4 0
      src/main/java/com/ydtech/modules/admin/service/SysUserService.java
  9. 4 1
      src/main/java/com/ydtech/modules/admin/service/impl/SysPartnerServiceImpl.java
  10. 6 0
      src/main/java/com/ydtech/modules/admin/service/impl/SysSwitchConfigServiceImpl.java
  11. 156 9
      src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java
  12. 12 0
      src/main/java/com/ydtech/modules/admin/service/impl/TaskStatisticsServiceImpl.java
  13. 8 0
      src/main/java/com/ydtech/modules/esm/controller/EsmInsCompanyController.java
  14. 4 0
      src/main/java/com/ydtech/modules/esm/dao/EsmInsCompanyMapper.java
  15. 3 1
      src/main/java/com/ydtech/modules/esm/model/vo/EsmUserCountVO.java
  16. 6 0
      src/main/java/com/ydtech/modules/esm/service/EsmInsCompanyService.java
  17. 9 0
      src/main/java/com/ydtech/modules/esm/service/impl/EsmInsCompanyServiceImpl.java
  18. 4 4
      src/main/java/com/ydtech/modules/esm/service/impl/EsmUserReferrerServiceImpl.java
  19. 69 30
      src/main/java/com/ydtech/modules/fee/dto/vo/RuleAttrMappingVo.java
  20. 4 2
      src/main/java/com/ydtech/modules/fee/service/impl/FeeRuleSchemeServiceNewImpl.java
  21. 49 12
      src/main/java/com/ydtech/modules/fnc/entity/InsPlyIncome.java
  22. 2 4
      src/main/java/com/ydtech/modules/fnc/service/impl/InsPlyIncomeServiceImpl.java
  23. 5 2
      src/main/java/com/ydtech/modules/ins/model/vo/CustomerInfoVo.java
  24. 6 2
      src/main/java/com/ydtech/modules/ins/model/vo/QuoteRespVo.java
  25. 28 8
      src/main/java/com/ydtech/modules/ins/model/yc/audit/Audit.java
  26. 5 2
      src/main/java/com/ydtech/modules/ins/model/yc/ruote/Applicant.java
  27. 9 2
      src/main/java/com/ydtech/modules/ins/model/yc/ruote/Insured.java
  28. 15 3
      src/main/java/com/ydtech/modules/ins/model/yc/ruote/Tax.java
  29. 5 0
      src/main/java/com/ydtech/modules/ins/model/yc/ruote/Vhlowner.java
  30. 9 2
      src/main/java/com/ydtech/modules/inv/model/excel/AddTypeCXGDExcel.java
  31. 8 2
      src/main/java/com/ydtech/modules/inv/model/excel/AddTypeCXSXFExcel.java
  32. 6 1
      src/main/java/com/ydtech/modules/inv/model/excel/AddTypeFCGDExcel.java
  33. 5 1
      src/main/java/com/ydtech/modules/inv/model/excel/AddTypeFCSXFExcel.java
  34. 85 37
      src/main/java/com/ydtech/modules/inv/utils/CheckInsPlyComeUtils.java
  35. 1 1
      src/main/java/com/ydtech/modules/inv/utils/EasyExcelUtils.java
  36. 14 0
      src/main/java/com/ydtech/modules/order/aop/QuoteNumberVerification.java
  37. 42 4
      src/main/java/com/ydtech/modules/order/aop/aspect/QuoteVerificationAspect.java
  38. 1 1
      src/main/java/com/ydtech/modules/order/components/chengtai/ChengTaiRequestApiComponents.java
  39. 46 0
      src/main/java/com/ydtech/modules/order/components/gouren/GuorenDuplicateInsuranceComponent.java
  40. 37 5
      src/main/java/com/ydtech/modules/order/components/huatai/HuaTaiQuotationProcessorComponent.java
  41. 3 1
      src/main/java/com/ydtech/modules/order/components/zhongmei/ZhongmeiRepeatInsuranceComponents.java
  42. 11 3
      src/main/java/com/ydtech/modules/order/components/zijin/ZijinDuplicateInsuranceComponents.java
  43. 8 2
      src/main/java/com/ydtech/modules/order/components/zijin/ZijinRequestApiComponents.java
  44. 89 0
      src/main/java/com/ydtech/modules/order/constants/QuoteNumberConstant.java
  45. 31 0
      src/main/java/com/ydtech/modules/order/controller/ExternalOrderController.java
  46. 151 0
      src/main/java/com/ydtech/modules/order/controller/QuoteConfigController.java
  47. 1 1
      src/main/java/com/ydtech/modules/order/controller/YangGuangOrderApiController.java
  48. 8 0
      src/main/java/com/ydtech/modules/order/dao/InsOrdersMapper.java
  49. 15 0
      src/main/java/com/ydtech/modules/order/dao/SysQuoteConfigMapper.java
  50. 30 0
      src/main/java/com/ydtech/modules/order/dao/SysQuoteRecordMapper.java
  51. 21 0
      src/main/java/com/ydtech/modules/order/dao/SysQuoteUserConfigAppendMapper.java
  52. 19 0
      src/main/java/com/ydtech/modules/order/dao/SysQuoteUserMapper.java
  53. 1 1
      src/main/java/com/ydtech/modules/order/entity/InsAreaCompany.java
  54. 6 0
      src/main/java/com/ydtech/modules/order/entity/InsAreaCompanyExternalFee.java
  55. 1 1
      src/main/java/com/ydtech/modules/order/entity/api/bohai/response/UnderwritingResponse.java
  56. 3 3
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/ImageTypeEnum.java
  57. 26 4
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java
  58. 4 4
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/SubmitVerifyRequest.java
  59. 17 9
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/UploadFileRequest.java
  60. 1 1
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/constants/KindListEnum.java
  61. 5 1
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangGetNonVehicleProductsRequest.java
  62. 4 0
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangSubmitRequest.java
  63. 17 17
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/response/YangGuangBaseResponse.java
  64. 8 0
      src/main/java/com/ydtech/modules/order/entity/crawler/request/CrawlerQuoteRequest.java
  65. 15 0
      src/main/java/com/ydtech/modules/order/entity/crawler/response/CrawlerQuoteResponse.java
  66. 91 0
      src/main/java/com/ydtech/modules/order/entity/po/SysQuoteConfig.java
  67. 80 0
      src/main/java/com/ydtech/modules/order/entity/po/SysQuoteRecord.java
  68. 55 0
      src/main/java/com/ydtech/modules/order/entity/po/SysQuoteUser.java
  69. 80 0
      src/main/java/com/ydtech/modules/order/entity/po/SysQuoteUserConfigAppend.java
  70. 12 0
      src/main/java/com/ydtech/modules/order/entity/vo/AuditExportVo.java
  71. 12 1
      src/main/java/com/ydtech/modules/order/entity/vo/BaseQuoteVo.java
  72. 8 0
      src/main/java/com/ydtech/modules/order/entity/vo/ExternalOrderFeeVo.java
  73. 21 8
      src/main/java/com/ydtech/modules/order/entity/vo/InsOrdersEditingVo.java
  74. 5 1
      src/main/java/com/ydtech/modules/order/entity/vo/OrderQueryVo.java
  75. 3 0
      src/main/java/com/ydtech/modules/order/entity/vo/OrderVo.java
  76. 56 0
      src/main/java/com/ydtech/modules/order/entity/vo/QuoteDetailsQueryVo.java
  77. 80 0
      src/main/java/com/ydtech/modules/order/entity/vo/QuoteDetailsVo.java
  78. 92 0
      src/main/java/com/ydtech/modules/order/entity/vo/QuoteNumRedisVo.java
  79. 3 0
      src/main/java/com/ydtech/modules/order/entity/vo/VehicleAndVesselTax.java
  80. 1 1
      src/main/java/com/ydtech/modules/order/entity/vo/ya/YaExtendInfoDto.java
  81. 4 1
      src/main/java/com/ydtech/modules/order/service/InsAreaCompanyService.java
  82. 4 1
      src/main/java/com/ydtech/modules/order/service/InsOrdersService.java
  83. 89 0
      src/main/java/com/ydtech/modules/order/service/SysQuoteConfigService.java
  84. 100 0
      src/main/java/com/ydtech/modules/order/service/SysQuoteRedisService.java
  85. 3 1
      src/main/java/com/ydtech/modules/order/service/YangGuangOrderApiService.java
  86. 159 57
      src/main/java/com/ydtech/modules/order/service/impl/BoHaiOrderApiServiceImpl.java
  87. 55 5
      src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java
  88. 53 4
      src/main/java/com/ydtech/modules/order/service/impl/DaJiaOrderServiceImpl.java
  89. 62 12
      src/main/java/com/ydtech/modules/order/service/impl/GuorenOrderApiServiceImpl.java
  90. 35 1
      src/main/java/com/ydtech/modules/order/service/impl/HuaTaiOrderApiServiceImpl.java
  91. 61 8
      src/main/java/com/ydtech/modules/order/service/impl/InsAreaCompanyServiceImpl.java
  92. 52 3
      src/main/java/com/ydtech/modules/order/service/impl/InsCrawlerOrderServiceImpl.java
  93. 32 7
      src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java
  94. 1 1
      src/main/java/com/ydtech/modules/order/service/impl/InsuranceCompanyPolymerizationServiceImpl.java
  95. 349 0
      src/main/java/com/ydtech/modules/order/service/impl/SysQuoteConfigServiceImpl.java
  96. 423 0
      src/main/java/com/ydtech/modules/order/service/impl/SysQuoteRedisServiceImpl.java
  97. 233 57
      src/main/java/com/ydtech/modules/order/service/impl/YangGuangOrderApiServiceImpl.java
  98. 104 30
      src/main/java/com/ydtech/modules/order/service/impl/YongchengOrderApiServiceImpl.java
  99. 48 1
      src/main/java/com/ydtech/modules/order/service/impl/ZhongMeiOrderApiServiceImpl.java
  100. 31 2
      src/main/java/com/ydtech/modules/order/service/impl/ZijinOrderApiServiceImpl.java

+ 3 - 1
src/main/java/com/ydtech/modules/admin/constants/SwitchConfig.java

@@ -34,7 +34,9 @@ public enum SwitchConfig {
     WCQCA_02("weComQRCodeChannel", "企业微信二维码显示(渠道)"),
     WCQCA_03("weComQRCodeOther", "企业微信二维码显示(其他)"),
     //余额提现控制
-    YETX_01("balanceExtract","提现控制(线上或线下)")
+    YETX_01("balanceExtract","提现控制(线上或线下)"),
+
+    APP_UNDEVELOPED("appUndeveloped", "app未开发完功能隐藏"),
     ;
 
 

+ 10 - 6
src/main/java/com/ydtech/modules/admin/controller/SysLoginController.java

@@ -398,6 +398,10 @@ public class SysLoginController {
         String phone = phoneLoginVo.getPhone();
         String phoneMsg = phoneLoginVo.getPhoneMsg();
         SysUser user = sysUserService.findByPhone(phone);
+        if (user == null) {
+            //手机号不存在注册用户:上线测试团队
+            user = sysUserService.registerAPPUser(phone);
+        }
         //验证用户
         SysUser sysUser = sysUserService.getByUserId(user.getId());
         if ("2".equals(sysUser.getManagementSource())){
@@ -427,12 +431,12 @@ public class SysLoginController {
         if (StringUtils.isEmpty(phone)) {
             return HttpResult.error("手机号不能为空");
         }
-        if ("0".equals(type)) {  // 0 登录 1 注册
-            SysUser sysUser = sysUserService.findByPhone(phone);
-            if (sysUser == null) {
-                return HttpResult.error("手机号不存在!");
-            }
-        }
+//        if ("0".equals(type)) {  // 0 登录 1 注册
+//            SysUser sysUser = sysUserService.findByPhone(phone);
+//            if (sysUser == null) {
+//                return HttpResult.error("手机号不存在!");
+//            }
+//        }
 
         Random rand = new Random();
         // randNumber 将被赋值为一个 MIN 和 MAX 范围内的随机数

+ 6 - 0
src/main/java/com/ydtech/modules/admin/controller/SysSwitchConfigController.java

@@ -50,5 +50,11 @@ public class SysSwitchConfigController {
         return HttpResult.ok();
     }
 
+    @GetMapping("/appUndeveloped/display")
+    @ApiOperation(value = "app未开发完功能隐藏")
+    public HttpResult<Boolean> appUndeveloped() {
+        boolean display = sysSwitchConfigService.appUndeveloped();
+        return HttpResult.ok(display);
+    }
 
 }

+ 18 - 2
src/main/java/com/ydtech/modules/admin/controller/SysUserController.java

@@ -148,18 +148,20 @@ public class SysUserController extends BaseController {
      */
     @PostMapping(value = "/queryPage")
     public HttpResult queryPage(@RequestBody PageRequest pageRequest) {
-        String deptid = pageRequest.getColumnFilterValue(pageRequest, "deptid");
+        String deptId = pageRequest.getColumnFilterValue(pageRequest, "deptId");
         String name = pageRequest.getColumnFilterValue(pageRequest, "name");
         String containsSubDept = pageRequest.getColumnFilterValue(pageRequest, "containsSubDept");
         String mobile = pageRequest.getColumnFilterValue(pageRequest, "mobile");
         String roleId = pageRequest.getColumnFilterValue(pageRequest, "roleId");
         String deptName = pageRequest.getColumnFilterValue(pageRequest, "deptName");
+        String id = pageRequest.getColumnFilterValue(pageRequest,"id");
         SysUser sysUser = new SysUser();
-        sysUser.setDeptId(deptid);
+        sysUser.setDeptId(deptId);
         sysUser.setName(name);
         sysUser.setMobile(mobile);
         sysUser.setRoleId(roleId);
         sysUser.setDeptName(deptName);
+        sysUser.setId(id);
         Page page = PageRequest.buildPageRequest(pageRequest);
         IPage<SysUser> pResult = sysUserService.selectUserPage(page, sysUser, containsSubDept);
         //传入查询条件
@@ -1057,6 +1059,20 @@ public class SysUserController extends BaseController {
         return HttpResult.ok(list);
     }
 
+
+    /**
+     *
+     *
+     * @return 获取用户下级是否有  电销  代理人 渠道   如果有则返回  没有则 不返回
+     */
+    @ApiOperation(value = "获取当前用户的下级")
+    @GetMapping(value = "/findNextTreeContain")
+    public HttpResult<List<SysUser>> findNextTreeContain(String managementSource) {
+        List<SysUser> list = sysUserService.findNextTreeContain(managementSource);
+        return HttpResult.ok(list);
+    }
+
+
     /**
      * 获取当前用户的所有代理人
      *

+ 175 - 0
src/main/java/com/ydtech/modules/admin/model/po/CustVehiclePolicyInfo.java

@@ -250,6 +250,141 @@ public class CustVehiclePolicyInfo implements Serializable {
      */
     private Integer delFlag;
 
+    //企业车新增
+    /**
+     *   固定电话
+     */
+    private String applyTel;
+
+    /**
+     *  省
+     */
+    private String applyProvince;
+
+    /**
+     *  市
+     */
+    private String applyCity;
+
+    /**
+     *  县
+     */
+    private String  applyCounty;
+
+    /***
+     * 车主类型(0:法人 1:个人(中国籍) 2: 个人(非中国籍))
+     */
+    private String applyProperty;
+
+    /***
+     * 注册资本金
+     */
+    private String applyRegisteredCapital;
+
+    /***
+     * 经营范围
+     */
+    private String applyScope;
+    /***
+     * 联系人
+     */
+    private String applyLegalPerson;
+
+    /***
+     * 组织机构代码
+     */
+    private String applyOrganizationCode;
+
+
+    /**
+     *   固定电话
+     */
+    private String insureTel;
+
+    /**
+     *  省
+     */
+    private String insureProvince;
+
+    /**
+     *  市
+     */
+    private String insureCity;
+
+    /**
+     *  县
+     */
+    private String  insureCounty;
+
+    /***
+     * 车主类型(0:法人 1:个人(中国籍) 2: 个人(非中国籍))
+     */
+    private String insureProperty;
+
+    /***
+     * 注册资本金
+     */
+    private String insureRegisteredCapital;
+
+    /***
+     * 经营范围
+     */
+    private String insureScope;
+    /***
+     * 联系人
+     */
+    private String insureLegalPerson;
+
+    /***
+     * 组织机构代码
+     */
+    private String insureOrganizationCode;
+
+
+    /**
+     *   固定电话
+     */
+    private String ownerTel;
+
+    /**
+     *  省
+     */
+    private String ownerProvince;
+
+    /**
+     *  市
+     */
+    private String ownerCity;
+
+    /**
+     *  县
+     */
+    private String  ownerCounty;
+
+    /***
+     * 车主类型(0:法人 1:个人(中国籍) 2: 个人(非中国籍))
+     */
+    private String ownerProperty;
+
+    /***
+     * 注册资本金
+     */
+    private String ownerRegisteredCapital;
+
+    /***
+     * 经营范围
+     */
+    private String ownerScope;
+    /***
+     * 联系人
+     */
+    private String ownerLegalPerson;
+
+    /***
+     * 组织机构代码
+     */
+    private String ownerOrganizationCode;
+
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;
 
@@ -291,6 +426,16 @@ public class CustVehiclePolicyInfo implements Serializable {
             customerInfoVo.setOwner(custVehiclePolicyInfo.getOwnerOwnerFlag() != null && custVehiclePolicyInfo.getOwnerOwnerFlag());
             //同投保人
             customerInfoVo.setInsuranceHolder(custVehiclePolicyInfo.getOwnerInsuranceHolderFlag() != null && custVehiclePolicyInfo.getOwnerInsuranceHolderFlag());
+            //车主相关信息   add  hxl   2024-12-20
+            customerInfoVo.setTel(custVehiclePolicyInfo.getOwnerTel());
+            customerInfoVo.setOrganizationCode(custVehiclePolicyInfo.getOwnerOrganizationCode());
+            customerInfoVo.setProvince(custVehiclePolicyInfo.getOwnerProvince());
+            customerInfoVo.setCity(custVehiclePolicyInfo.getOwnerCity());
+            customerInfoVo.setCounty(custVehiclePolicyInfo.getOwnerCounty());
+            customerInfoVo.setProperty(custVehiclePolicyInfo.getOwnerProperty());
+            customerInfoVo.setRegisteredCapital(custVehiclePolicyInfo.getOwnerRegisteredCapital());
+            customerInfoVo.setScope(custVehiclePolicyInfo.getOwnerScope());
+            customerInfoVo.setLegalPerson(custVehiclePolicyInfo.getOwnerLegalPerson());
 
         }else if(type ==2){
             //姓名
@@ -328,6 +473,16 @@ public class CustVehiclePolicyInfo implements Serializable {
             customerInfoVo.setOwner(custVehiclePolicyInfo.getInsureOwnerFlag() != null && custVehiclePolicyInfo.getInsureOwnerFlag());
             //同投保人
             customerInfoVo.setInsuranceHolder(custVehiclePolicyInfo.getInsureInsuranceHolderFlag() != null && custVehiclePolicyInfo.getInsureInsuranceHolderFlag());
+            //车主相关信息   add  hxl   2024-12-20
+            customerInfoVo.setTel(custVehiclePolicyInfo.getInsureTel());
+            customerInfoVo.setOrganizationCode(custVehiclePolicyInfo.getInsureOrganizationCode());
+            customerInfoVo.setProvince(custVehiclePolicyInfo.getInsureProvince());
+            customerInfoVo.setCity(custVehiclePolicyInfo.getInsureCity());
+            customerInfoVo.setCounty(custVehiclePolicyInfo.getInsureCounty());
+            customerInfoVo.setProperty(custVehiclePolicyInfo.getInsureProperty());
+            customerInfoVo.setRegisteredCapital(custVehiclePolicyInfo.getInsureRegisteredCapital());
+            customerInfoVo.setScope(custVehiclePolicyInfo.getInsureScope());
+            customerInfoVo.setLegalPerson(custVehiclePolicyInfo.getInsureLegalPerson());
 
         }else if(type ==3){
             //姓名
@@ -365,6 +520,26 @@ public class CustVehiclePolicyInfo implements Serializable {
             customerInfoVo.setOwner(custVehiclePolicyInfo.getApplyOwnerFlag() != null && custVehiclePolicyInfo.getApplyOwnerFlag());
             //同投保人
             customerInfoVo.setInsuranceHolder(custVehiclePolicyInfo.getApplyInsuranceHolderFlag() != null && custVehiclePolicyInfo.getApplyInsuranceHolderFlag());
+            //车主相关信息   add  hxl   2024-12-20
+            customerInfoVo.setTel(custVehiclePolicyInfo.getOwnerTel());
+            customerInfoVo.setOrganizationCode(custVehiclePolicyInfo.getOwnerOrganizationCode());
+            customerInfoVo.setProvince(custVehiclePolicyInfo.getOwnerProvince());
+            customerInfoVo.setCity(custVehiclePolicyInfo.getOwnerCity());
+            customerInfoVo.setCounty(custVehiclePolicyInfo.getOwnerCounty());
+            customerInfoVo.setProperty(custVehiclePolicyInfo.getOwnerProperty());
+            customerInfoVo.setRegisteredCapital(custVehiclePolicyInfo.getOwnerRegisteredCapital());
+            customerInfoVo.setScope(custVehiclePolicyInfo.getOwnerScope());
+
+            //车主相关信息   add  hxl   2024-12-20
+            customerInfoVo.setTel(custVehiclePolicyInfo.getOwnerTel());
+            customerInfoVo.setOrganizationCode(custVehiclePolicyInfo.getOwnerOrganizationCode());
+            customerInfoVo.setProvince(custVehiclePolicyInfo.getOwnerProvince());
+            customerInfoVo.setCity(custVehiclePolicyInfo.getOwnerCity());
+            customerInfoVo.setCounty(custVehiclePolicyInfo.getOwnerCounty());
+            customerInfoVo.setProperty(custVehiclePolicyInfo.getOwnerProperty());
+            customerInfoVo.setRegisteredCapital(custVehiclePolicyInfo.getOwnerRegisteredCapital());
+            customerInfoVo.setScope(custVehiclePolicyInfo.getOwnerScope());
+            customerInfoVo.setLegalPerson(custVehiclePolicyInfo.getOwnerLegalPerson());
         }
         return customerInfoVo;
     }

+ 4 - 0
src/main/java/com/ydtech/modules/admin/model/vo/SysPremiumDetailsVo.java

@@ -69,6 +69,10 @@ public class SysPremiumDetailsVo {
     @ApiModelProperty(value = "贡献合伙人名称")
     private String profferName;
 
+    @ApiModelProperty(value = "贡献人名称")
+    private String workName;
+
+
     /**
      * 存放贡献费用每集合伙人的等级和比例
      */

+ 5 - 1
src/main/java/com/ydtech/modules/admin/service/SysSwitchConfigService.java

@@ -105,5 +105,9 @@ public interface SysSwitchConfigService extends BaseIService<SysSwitchConfig> {
      */
     boolean getBalanceExtractStatus();
 
-
+    /**
+     * app未开发完功能隐藏
+     * @return
+     */
+    boolean appUndeveloped();
 }

+ 4 - 0
src/main/java/com/ydtech/modules/admin/service/SysUserService.java

@@ -126,6 +126,7 @@ public interface SysUserService extends BaseIService<SysUser> {
     boolean saveUser(SysUser sysUser);
 
     HttpResult saveUserInfo(SysUser2Vo sysUserVo);
+    SysUser saveUserJzgInfo(SysUser2Vo sysUserVo);
 
     HttpResult saveUserInfoByPartner(SysUser2Vo sysUserVo);
 
@@ -343,6 +344,9 @@ public interface SysUserService extends BaseIService<SysUser> {
      */
     SysUser getByRoleIdAndDeptId(String roleId, String deptId);
 
+    List<SysUser> findNextTreeContain(String managementSource);
+
+    SysUser registerAPPUser(String phone);
 }
 
 

+ 4 - 1
src/main/java/com/ydtech/modules/admin/service/impl/SysPartnerServiceImpl.java

@@ -1448,6 +1448,9 @@ public class SysPartnerServiceImpl extends ServiceImpl<SysPartnerMapper, SysPart
                 sysPremiumDetailsVo.setProfferLevel(sysPartner.getType());
                 SysUser sysUser = sysUserMapper.selectById(sysPartner.getUserId());
                 sysPremiumDetailsVo.setProfferName(sysUser.getName());
+                //直接工作室产生费用,显示工作室名称
+                SysDept sysDept1 = sysDeptMapper.selectById(sysAgencyLeader.getDeptId());
+                sysPremiumDetailsVo.setWorkName(sysDept1.getName());
             }
             sysPremiumDetailsVo.setSumpremium(sysPremiumDetails1.getSumpremium());
             SysUser sysUser = sysUserMapper.selectById(sysPremiumDetails1.getIssuerId());
@@ -1866,7 +1869,7 @@ public class SysPartnerServiceImpl extends ServiceImpl<SysPartnerMapper, SysPart
     @Override
     public List<SysPartnerVo> getRelationInfo(String userId) {
         List<SysPartnerVo> sysPartners = new ArrayList<>();
-        //登陆人的上级合伙人信息
+        //登陆人的上级合伙人信息
         SysPartner sysPartner = sysPartnerMapper.selectOne(new LambdaQueryWrapper<SysPartner>()
                 .eq(SysPartner::getUserId, userId).eq(SysPartner::getDelFlag, 1));
         SysPartnerVo sysPartnerVo = BeanUtil.copyProperties(sysPartner, SysPartnerVo.class);

+ 6 - 0
src/main/java/com/ydtech/modules/admin/service/impl/SysSwitchConfigServiceImpl.java

@@ -197,6 +197,12 @@ public class SysSwitchConfigServiceImpl extends ServiceImpl<SysSwitchConfigMappe
         }
         return false;
     }
+
+    @Override
+    public boolean appUndeveloped() {
+        return isEnabled(SwitchConfig.APP_UNDEVELOPED.getCode());
+    }
+
 }
 
 

+ 156 - 9
src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java

@@ -144,6 +144,14 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
     @Value("${httpUrl}")
     private String httpUrl;
+    //晋掌柜APP: 未注册的手机号登录时创建新账户使用 -deptId -referrerId
+    @Value("${jzg.deptId}")
+    private String deptId;
+
+    @Value("${jzg.referrerId}")
+    private String referrerId;
+
+
 
     @Override
     public IPage<SysUserBaseVO> findUserList(PageDto<SysUserDto> pageDto) {
@@ -160,15 +168,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         List<SysUserBaseVO> records = userList.getRecords();
         if (!CollectionUtils.isEmpty(records)) {
             for (SysUserBaseVO record : records) {
-                //合伙人APP邀请团队长查询推介人
-//                if (record.getType() != 0) {
-//                    String referrerId = record.getReferrerId();
-//                    if (StringUtils.isNotEmpty(referrerId)) {
-//                        record.setReferrerId(referrerId);
-//                        SysUser sysUser = sysUserMapper.selectById(record.getReferrerId());
-//                        record.setReferrerName(sysUser.getName());
-//                    }
-//                }
                 // 查询推荐人
                 EsmUserReferrer referrer = esmUserReferrerService.getById(record.getUserId());
                 if (ObjectUtils.isEmpty(referrer)) {
@@ -915,6 +914,45 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         return HttpResult.ok("新增成功");
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public SysUser saveUserJzgInfo(SysUser2Vo sysUserVo) {
+        SysUser sysUser = sysUserVo.getSysUser();
+        //处理密码
+        if (StringUtils.isNotEmpty(sysUser.getPassword())) {
+            String salt = PasswordUtils.getSalt();
+            String pwd = PasswordUtils.encode(sysUser.getPassword(), salt);
+            sysUser.setPassword(pwd);
+            sysUser.setSalt(salt);
+        } else {
+            throw new SystemException("密码不能为空");
+        }
+        String userId = gainNextUserId(sysUser.getDeptId());
+
+        sysUser.setId(userId);
+        save(sysUser);
+
+        //角色配置
+        SysUserRole userRole = new SysUserRole();
+        userRole.setUserId(sysUser.getId());
+        userRole.setRoleId(StringUtils.toLong(sysUser.getRoleId()));
+        sysUserRoleService.save(userRole);
+        if (StringUtils.isNotEmpty(sysUser.getReferrerId())) {
+            //推荐人
+            esmUserReferrerService.addReferrer(sysUser.getReferrerId(), userId);
+        } else if ("20".equals(sysUser.getRoleId()) || "21".equals(sysUser.getRoleId())) {
+            //如果是 团队长或代理人 并且没有推荐人 则默认推荐人为自己
+            esmUserReferrerService.addReferrer(sysUser.getId(), userId);
+        }
+        SysUserInfo userInfo = sysUserVo.getSysUserInfo();
+        userInfo.setId(sysUser.getId());
+        sysUserInfoService.save(userInfo);
+
+        SysUser sysUser1 = sysUserMapper.selectById(sysUser.getReferrerId());
+        SpringUtil.getBean(RecordUserUtils.class).addRecord(userId, sysUser1.getName());
+        return sysUserMapper.selectById(userId);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public HttpResult saveUserInfoByPartner(SysUser2Vo sysUserVo) {
@@ -2795,4 +2833,113 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     public SysUser getByRoleIdAndDeptId(String roleId, String deptId) {
         return baseMapper.getByRoleIdAndDeptId(roleId, deptId);
     }
+
+    /**
+     *
+     * @param managementSource
+     * @return  该人员下 的子集如果是电销 或者 代理人 或者 渠道则 显示
+     */
+    @Override
+    public List<SysUser> findNextTreeContain(String managementSource) {
+
+        String userId = BaseController.getUserId();
+        SysUser sysUser = sysUserMapper.getByUserId(userId);
+
+        //获取领导字段不为空的人的ID
+        QueryWrapper<SysUser> queryWrapper = new QueryWrapper<>();
+        queryWrapper.isNotNull("leader_id");
+
+        HashMap<String, Object> params = new HashMap<>();
+        params.put("managementSource",managementSource);
+        List<SysUser> users = sysUserMapper.selectByParams(params);
+
+        for (SysUser user : users) {
+            this.appendName(user);
+        }
+        if (users == null || users.isEmpty()) {
+            return new ArrayList<>();
+        }
+        List<SysUser> topUsers = new ArrayList<>(); //存放1级用户,即没有直接上级的用户
+        // 根据组织结构展示级别,筛选顶层节点并构建组织结构树
+        if("admin".equals(sysUser.getName())){
+            topUsers.add(sysUserMapper.selectById("99D1501"));
+        }else {
+            this.appendName(sysUser);
+            topUsers.add(sysUser);
+        }
+        // 递归构建用户树结构
+        buildUserTreeContain(topUsers, users,managementSource);
+        return topUsers;
+
+    }
+
+    @Override
+    public SysUser registerAPPUser(String phone) {
+
+        SysUser2Vo sysUser2Vo = new SysUser2Vo();
+        SysUser sysUser = new SysUser();
+        SysUserInfo sysUserInfo = new SysUserInfo();
+        sysUser.setMobile(phone);
+        sysUser.setReferrerId(referrerId);
+        sysUser.setDeptId(deptId);
+        sysUser.setStatus(2);
+        sysUser.setPassword("123456");
+        sysUser.setRoleId("20");
+        sysUser.setRoleName("代理人");
+        sysUser.setName("新增用户"+phone);
+        sysUser2Vo.setSysUser(sysUser);
+        sysUserInfo.setSex("U");
+        sysUser2Vo.setSysUserInfo(sysUserInfo);
+
+        return this.saveUserJzgInfo(sysUser2Vo);
+
+    }
+
+    /**
+     * 拼接机构来源
+     * @param user
+     */
+    private void appendName(SysUser user) {
+        StringBuilder stringBuilder = new StringBuilder();
+        String deptId = user.getDeptId();
+        if (StringUtils.isNotEmpty(deptId)) {
+            int length = deptId.length();
+            if (length > 0) {
+                if (length <= 5) {
+                    String dept = deptId.replaceAll("[^\\d]*(\\d+).*", "$1");
+                    SysDept cityName = sysDeptMapper.selectById(dept);
+                    String name = cityName.getName();
+                    stringBuilder.append("(").append(name).append(")");
+                } else if (length > 5) {
+                    String dept = deptId.replaceAll("[^\\d]*(\\d+).*", "$1");
+                    if (dept.length() < 5) {
+                        SysDept dept1 = sysDeptMapper.selectById(dept);
+                        SysDept cityName = sysDeptMapper.selectById(deptId);
+                        stringBuilder.append("(").append(dept1.getName()).append(cityName.getName()).append(")");
+                    } else {
+                        String deptIdTwo = dept.substring(0, 4);
+
+                        SysDept dept1 = sysDeptMapper.selectById(deptIdTwo);
+                        SysDept dept2 = sysDeptMapper.selectById(dept);
+                        stringBuilder.append("(").append(dept1.getName()).append(dept2.getName()).append(")");
+                    }
+                }
+                user.setName(user.getName()+stringBuilder.toString());
+            }
+        }
+    }
+    private void buildUserTreeContain(List<SysUser> topUsers, List<SysUser> users, String managementSource) {
+        for (SysUser user : topUsers) {
+            List<SysUser> children = new ArrayList<>();
+            for (SysUser childUser : users) {
+                if (user.getId().equals(childUser.getLeaderId())) {
+                    children.add(childUser);
+                    // 递归查找下一级
+                    buildUserTreeContain(children, users,managementSource);
+                }
+            }
+            user.setChildren(children);
+        }
+    }
+
 }

+ 12 - 0
src/main/java/com/ydtech/modules/admin/service/impl/TaskStatisticsServiceImpl.java

@@ -594,6 +594,18 @@ public class TaskStatisticsServiceImpl  implements TaskStatisticsService {
      **/
     @Override
     public List<TaskStatisticsDto> getDistribution(TaskStatisticsVo taskStatisticsVo) {
+        if(StringUtils.isNotEmpty(taskStatisticsVo.getDays())){
+            if("7".equals(taskStatisticsVo.getDays())){
+                taskStatisticsVo.setDateType("2");
+            } else if ("30".equals(taskStatisticsVo.getDays())) {
+                taskStatisticsVo.setDateType("3");
+            } else if ("1".equals(taskStatisticsVo.getDays())){
+                taskStatisticsVo.setDateType("1");
+            }
+        }
+        HashMap<String, String> dateMapByType = getDateMapByTypeNew(taskStatisticsVo.getDateType(), taskStatisticsVo.getCreatetimeStart(), taskStatisticsVo.getCreatetimeEnd());
+        taskStatisticsVo.setCreatetimeStart(dateMapByType.get("startDate"));
+        taskStatisticsVo.setCreatetimeEnd(dateMapByType.get("endDate"));
         List<TaskStatisticsDto> result = new ArrayList<>();
          //0 报价中 1 待核保  2 已核保代缴费  3 已承保  4  核保退回
         for (int i = 0; i < 5; i++) {

+ 8 - 0
src/main/java/com/ydtech/modules/esm/controller/EsmInsCompanyController.java

@@ -300,4 +300,12 @@ public class EsmInsCompanyController extends BaseController {
         List<EsmInsCompanyResVo> lst = esmInsCompanyService.getExternalAgreementCompanyList(name);
         return HttpResult.ok(lst);
     }
+
+
+    @ApiOperation(value = "查找存在协议的保险公司列表")
+    @GetMapping(value = "/liveCompanyList")
+    public HttpResult liveCompanyList(){
+        List<EsmInsCompanyResVo> list = esmInsCompanyService.liveCompanyList();
+        return HttpResult.ok(list);
+    }
 }

+ 4 - 0
src/main/java/com/ydtech/modules/esm/dao/EsmInsCompanyMapper.java

@@ -43,4 +43,8 @@ public interface EsmInsCompanyMapper extends BaseMapper<EsmInsCompany> {
      *  @Description:  获取外部协议的公司列表
      */
     List<EsmInsCompanyResVo> getExternalAgreementCompanyList( @Param("name")  String name);
+
+
+    List<EsmInsCompanyResVo> liveCompanyList();
+
 }

+ 3 - 1
src/main/java/com/ydtech/modules/esm/model/vo/EsmUserCountVO.java

@@ -1,5 +1,6 @@
 package com.ydtech.modules.esm.model.vo;
 
+import com.ydtech.utils.BigDecimalUtils;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -53,7 +54,8 @@ public class EsmUserCountVO implements Serializable {
             userPolicyList.forEach(x->{
                 aggregateDataO.setOrdernum(aggregateDataO.getOrdernum() + x.getOrdernum());
                 aggregateDataO.setPolicynum(aggregateDataO.getPolicynum() + x.getPolicynum());
-                aggregateDataO.setSumpremium(aggregateDataO.getSumpremium() + x.getSumpremium());
+                double sumPremium = BigDecimalUtils.addDouble(aggregateDataO.getSumpremium(), x.getSumpremium());
+                aggregateDataO.setSumpremium(sumPremium);
                 aggregateDataO.setBjpolicynum(aggregateDataO.getBjpolicynum() + x.getBjpolicynum());
                 aggregateDataO.setBjsumpremium(aggregateDataO.getBjsumpremium() + x.getBjpolicynum());
             });

+ 6 - 0
src/main/java/com/ydtech/modules/esm/service/EsmInsCompanyService.java

@@ -91,6 +91,12 @@ public interface EsmInsCompanyService extends IService<EsmInsCompany> {
      *  @Description:  获取外部协议的保险公司列表
      */
     List<EsmInsCompanyResVo> getExternalAgreementCompanyList(String name);
+
+    /**
+     * 获取已经存在协议的保险公司列表
+     * @return
+     */
+    public List<EsmInsCompanyResVo> liveCompanyList();
 }
 
 

+ 9 - 0
src/main/java/com/ydtech/modules/esm/service/impl/EsmInsCompanyServiceImpl.java

@@ -207,6 +207,15 @@ public class EsmInsCompanyServiceImpl extends ServiceImpl<EsmInsCompanyMapper, E
     public List<EsmInsCompanyResVo> getExternalAgreementCompanyList(String name) {
         return baseMapper.getExternalAgreementCompanyList(name);
     }
+
+    /**
+     * 获取已经存在协议的保险公司列表
+     * @return
+     */
+    @Override
+    public List<EsmInsCompanyResVo> liveCompanyList() {
+        return baseMapper.liveCompanyList();
+    }
 }
 
 

+ 4 - 4
src/main/java/com/ydtech/modules/esm/service/impl/EsmUserReferrerServiceImpl.java

@@ -380,7 +380,7 @@ public class EsmUserReferrerServiceImpl extends ServiceImpl<EsmUserReferrerMappe
                 EsmTeamPolicyVO esmTeamPolicyVO1_t = this.baseMapper.queryOrderCountHz(userList1, record.getStartdate(),
                         record.getEnddate());
                 if (esmTeamPolicyVO1_t != null) {
-                    esmTeamPolicyVO1.setSumpremium(Double.parseDouble(String.format("%.2f",esmTeamPolicyVO1_t.getSumpremium())));
+                    esmTeamPolicyVO1.setSumpremium(esmTeamPolicyVO1_t.getSumpremium());
                     esmTeamPolicyVO1.setUsernum(userPolicyList1.size());//出单人力
                 }
                 esmTeamPolicyVO1.setTeamnum(userList1.size());//团队人数
@@ -393,7 +393,7 @@ public class EsmUserReferrerServiceImpl extends ServiceImpl<EsmUserReferrerMappe
                     EsmTeamPolicyVO esmTeamPolicyVO2_t = this.baseMapper.queryOrderCountHz(userList2, record.getStartdate(),
                             record.getEnddate());
                     if (esmTeamPolicyVO2_t != null) {
-                        esmTeamPolicyVO2.setSumpremium(Double.parseDouble(String.format("%.2f",esmTeamPolicyVO2_t.getSumpremium())));
+                        esmTeamPolicyVO2.setSumpremium(esmTeamPolicyVO2_t.getSumpremium());
                         esmTeamPolicyVO2.setUsernum(userPolicyList2.size());
                     }
                     esmTeamPolicyVO2.setTeamnum(userList2.size());
@@ -405,7 +405,7 @@ public class EsmUserReferrerServiceImpl extends ServiceImpl<EsmUserReferrerMappe
                         esmTeamPolicyVO3.setTeamlevel("三级会员");
                         esmTeamPolicyVO3.setTeamnum(userList3.size());
                         if (esmTeamPolicyVO3_t != null) {
-                            esmTeamPolicyVO3.setSumpremium(Double.parseDouble(String.format("%.2f",esmTeamPolicyVO3_t.getSumpremium())));
+                            esmTeamPolicyVO3.setSumpremium(esmTeamPolicyVO3_t.getSumpremium());
                             esmTeamPolicyVO3.setUsernum(userPolicyList3.size());
                         }
 
@@ -434,7 +434,7 @@ public class EsmUserReferrerServiceImpl extends ServiceImpl<EsmUserReferrerMappe
             EsmTeamPolicyVO esmTeamPolicyVO = new EsmTeamPolicyVO();
             EsmTeamPolicyVO esmTeamPolicyVO_t = this.baseMapper.queryOrderCountHz(userList, record.getStartdate(), record.getEnddate());
             if (esmTeamPolicyVO_t != null) {
-                esmTeamPolicyVO.setSumpremium(Double.parseDouble(String.format("%.2f",esmTeamPolicyVO_t.getSumpremium())));
+                esmTeamPolicyVO.setSumpremium(esmTeamPolicyVO_t.getSumpremium());
                 esmTeamPolicyVO.setUsernum(userPolicyList.size());
             }
             esmTeamPolicyVO.setTeamlevel("汇总");

+ 69 - 30
src/main/java/com/ydtech/modules/fee/dto/vo/RuleAttrMappingVo.java

@@ -11,6 +11,7 @@ import com.ydtech.modules.order.entity.api.bohai.constants.VehicleUsage;
 import com.ydtech.modules.order.entity.api.dajia.constants.TypeVehicleMapping;
 import com.ydtech.modules.protocol.entity.po.PtlNewCarJudgeRules;
 import com.ydtech.modules.protocols.entity.po.PtlAgreementUndwrtRulesAttr;
+import com.ydtech.utils.StringUtils;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -113,45 +114,83 @@ public class RuleAttrMappingVo {
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("SyRenewalOfInsurance", insAreaCompany.getSyRenewal()));
 
         CustomerInfoVo ownerInfo = insOrders.getOwnerinfo().toJavaObject(CustomerInfoVo.class);
-        //车主 证件号码(前6位)
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersIDNumber", ownerInfo.getIdentifyNumber()));
-        //车主 年龄
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersAge", ownerInfo.getAge()));
-        //车主 性别
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersSex", ownerInfo.getGender().equals("男") ? "1" : "2"));
+        if(StringUtils.isBlank(ownerInfo.getProperty()) || !"0".equals(ownerInfo.getProperty())) {
+            //车主 证件号码(前6位)
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersIDNumber", ownerInfo.getIdentifyNumber()));
+            //车主 年龄
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersAge", ownerInfo.getAge()));
+            //车主 性别
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnersSex", ownerInfo.getGender().equals("男") ? "1" : "2"));
+        }
         //车主 姓名
         ruleAttrMappingVoList.add(new RuleAttrMappingVo("CarOwnerName", ownerInfo.getName()));
 
         CustomerInfoVo policyHolderInfo = insOrders.getApplyinfo().toJavaObject(CustomerInfoVo.class);
-        //投保人 证件号码(前6位)
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantIDNumber", policyHolderInfo.getIdentifyNumber()));
-        //投保人 年龄
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantAge", policyHolderInfo.getAge()));
-        //投保人 性别
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantSex", policyHolderInfo.getGender().equals("男") ? "1" : "2"));
+        if(StringUtils.isBlank(policyHolderInfo.getProperty()) || !"0".equals(policyHolderInfo.getProperty())) {
+            //投保人 证件号码(前6位)
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantIDNumber", policyHolderInfo.getIdentifyNumber()));
+            //投保人 年龄
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantAge", policyHolderInfo.getAge()));
+            //投保人 性别
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("ApplicantSex", policyHolderInfo.getGender().equals("男") ? "1" : "2"));
+        }
 
         CustomerInfoVo insuredPersonInfo = insOrders.getInsureinfo().toJavaObject(CustomerInfoVo.class);
-        //被保人 证件号码(前6位)
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredIDNumber", insuredPersonInfo.getIdentifyNumber()));
-        //被保人 年龄
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredAge", insuredPersonInfo.getAge()));
-        //被保人 性别
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredSex", insuredPersonInfo.getGender().equals("男") ? "1" : "2"));
-
+        if(StringUtils.isBlank(insuredPersonInfo.getProperty()) || !"0".equals(insuredPersonInfo.getProperty())) {
+            //被保人 证件号码(前6位)
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredIDNumber", insuredPersonInfo.getIdentifyNumber()));
+            //被保人 年龄
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredAge", insuredPersonInfo.getAge()));
+            //被保人 性别
+            ruleAttrMappingVoList.add(new RuleAttrMappingVo("InsuredSex", insuredPersonInfo.getGender().equals("男") ? "1" : "2"));
+        }
         String OPIConsistent = "0";
-        //车主 投被保人是否一致
-        if ((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName().equals(policyHolderInfo.getName())) &&
-                (ownerInfo.getIdentifyNumber().equals(insuredPersonInfo.getIdentifyNumber()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber()))) {
-            OPIConsistent = "1";
+        if(StringUtils.isNotBlank(ownerInfo.getProperty())){
+            boolean boo = ownerInfo.getProperty().equals(insuredPersonInfo.getProperty()) && insuredPersonInfo.getProperty().equals(policyHolderInfo.getProperty());
+            if(boo){
+                if("0".equals(ownerInfo.getProperty())){
+                    if((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName().equals(policyHolderInfo.getName())) &&
+                            (ownerInfo.getOrganizationCode().equals(insuredPersonInfo.getOrganizationCode()) && insuredPersonInfo.getOrganizationCode().equals(policyHolderInfo.getOrganizationCode()))){
+                        OPIConsistent = "1";
+                    }
+                }else{
+                    if((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName().equals(policyHolderInfo.getName())) &&
+                            (ownerInfo.getIdentifyNumber().equals(insuredPersonInfo.getIdentifyNumber()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber()))){
+                        OPIConsistent = "1";
+                    }
+                }
+            }
+        }else {
+            if ((ownerInfo.getName().equals(insuredPersonInfo.getName()) && insuredPersonInfo.getName().equals(policyHolderInfo.getName())) &&
+                    (ownerInfo.getIdentifyNumber().equals(insuredPersonInfo.getIdentifyNumber()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber()))) {
+                OPIConsistent = "1";
+            }
         }
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("OPIConsistent", OPIConsistent));
-
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("OPIConsistent",OPIConsistent));
         String PIConsistent = "0";
-        //投被保人是否一致
-        if (insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber())) {
-            PIConsistent = "1";
-        }
-        ruleAttrMappingVoList.add(new RuleAttrMappingVo("PIConsistent", PIConsistent));
+
+        if(StringUtils.isNotBlank(insuredPersonInfo.getProperty())){
+            boolean boo = insuredPersonInfo.getProperty().equals(policyHolderInfo.getProperty());
+            if(boo){
+                if("0".equals(insuredPersonInfo.getProperty())){
+                    //投被保人是否一致
+                    if(insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getOrganizationCode().equals(policyHolderInfo.getOrganizationCode())){
+                        PIConsistent = "1";
+                    }
+                }else{
+                    //投被保人是否一致
+                    if(insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber())){
+                        PIConsistent = "1";
+                    }
+                }
+            }
+        }else{
+            //投被保人是否一致
+            if(insuredPersonInfo.getName().equals(policyHolderInfo.getName()) && insuredPersonInfo.getIdentifyNumber().equals(policyHolderInfo.getIdentifyNumber())){
+                PIConsistent = "1";
+            }
+       }
+        ruleAttrMappingVoList.add(new RuleAttrMappingVo("PIConsistent",PIConsistent));
 
         //2024-06-20 起保日期 月份判断
         if (insAreaCompany.getJqStartDate() != null && !insAreaCompany.getJqStartDate().equals("")) {

+ 4 - 2
src/main/java/com/ydtech/modules/fee/service/impl/FeeRuleSchemeServiceNewImpl.java

@@ -2,7 +2,6 @@ package com.ydtech.modules.fee.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ydtech.constants.enums.dict.insurance.EnergyType;
-import com.ydtech.constants.enums.dict.insurance.NatureOfVehicleUse;
 import com.ydtech.constants.enums.dict.insurance.VehicleType;
 import com.ydtech.exception.SystemException;
 import com.ydtech.modules.admin.model.SysUser;
@@ -47,7 +46,6 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -1623,6 +1621,10 @@ public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
         //默认分销比例设置
         RetailProportion retailProportion = new RetailProportion();
         if (!Objects.isNull(esmRetailList) && !esmRetailList.isEmpty()) {
+            //处理数据空指针异常   add by hxl  2024-12-19
+            if(esmRetailList.get(0).getRetailtype()==null){
+                esmRetailList.get(0).setRetailtype("0");
+            }
             retailLevel = Integer.parseInt(esmRetailList.get(0).getRetailtype());
             //赋值默认的分销比例
             retailProportion.setProportion(esmRetailList.get(0).getDisrate1(), esmRetailList.get(0).getDisrate2(), esmRetailList.get(0).getDisrate3());

+ 49 - 12
src/main/java/com/ydtech/modules/fnc/entity/InsPlyIncome.java

@@ -9,6 +9,7 @@ import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.format.DateTimeFormatter;
 
+import com.ydtech.utils.StringUtils;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
@@ -545,12 +546,30 @@ public class InsPlyIncome implements Serializable {
         this.insuredName = insuredName;
         this.policyno  = policyno;
         this.syPolicyno = syPolicyno;
-        this.jqPremium = new BigDecimal(jqPremium);
-        this.syPremium = new BigDecimal(syPremium);
-        this.taxamount = new BigDecimal(taxamount);
-        this.jqSuperviseCostsProportion = new BigDecimal(jqSuperviseCostsProportion);
-        this.sySuperviseCostsProportion = new BigDecimal(sySuperviseCostsProportion);
-        this.commissionFeevalue =  new BigDecimal(commissionFeevalue);;
+        if(StringUtils.isNotEmpty(jqPremium)){
+            this.jqPremium = new BigDecimal(jqPremium);
+        }
+        if(StringUtils.isNotEmpty(syPremium)){
+            this.syPremium = new BigDecimal(syPremium);
+        }
+
+        if(StringUtils.isNotEmpty(taxamount)){
+            this.taxamount = new BigDecimal(taxamount);
+        }
+
+        if(StringUtils.isNotEmpty(jqSuperviseCostsProportion)){
+            this.jqSuperviseCostsProportion = new BigDecimal(jqSuperviseCostsProportion);
+        }
+
+        if(StringUtils.isNotEmpty(sySuperviseCostsProportion)){
+            this.sySuperviseCostsProportion = new BigDecimal(sySuperviseCostsProportion);
+        }
+
+
+        if(StringUtils.isNotEmpty(commissionFeevalue)){
+            this.commissionFeevalue =  new BigDecimal(commissionFeevalue);
+        }
+
         this.addType  = addType;
         this.createTime = LocalDateTime.now();
         this.handlingFeesStatus = "0";
@@ -579,12 +598,30 @@ public class InsPlyIncome implements Serializable {
         this.insuredName = insuredName;
         this.policyno  = policyno;
         this.syPolicyno = syPolicyno;
-        this.jqPremium = new BigDecimal(jqPremium);
-        this.syPremium = new BigDecimal(syPremium);
-        this.taxamount = new BigDecimal(taxamount);
-        this.jqOtherCostsProportion = new BigDecimal(jqOtherCostsProportion);
-        this.syOtherCostsProportion = new BigDecimal(syOtherCostsProportion);
-        this.otherFeevalue =  new BigDecimal(otherFeevalue);;
+        if(StringUtils.isNotEmpty(jqPremium)){
+            this.jqPremium = new BigDecimal(jqPremium);
+        }
+
+        if(StringUtils.isNotEmpty(syPremium)){
+            this.syPremium = new BigDecimal(syPremium);
+        }
+
+        if(StringUtils.isNotEmpty(taxamount)){
+            this.taxamount = new BigDecimal(taxamount);
+        }
+
+        if(StringUtils.isNotEmpty(jqOtherCostsProportion)){
+            this.jqOtherCostsProportion = new BigDecimal(jqOtherCostsProportion);
+        }
+
+        if(StringUtils.isNotEmpty(syOtherCostsProportion)){
+            this.syOtherCostsProportion = new BigDecimal(syOtherCostsProportion);
+        }
+
+        if(StringUtils.isNotEmpty(otherFeevalue)){
+            this.otherFeevalue =  new BigDecimal(otherFeevalue);
+        }
+
         this.addType  = addType;
         this.createTime = LocalDateTime.now();
         this.handlingFeesStatus = "0";

+ 2 - 4
src/main/java/com/ydtech/modules/fnc/service/impl/InsPlyIncomeServiceImpl.java

@@ -80,10 +80,7 @@ import java.math.RoundingMode;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.YearMonth;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.function.BinaryOperator;
@@ -3952,6 +3949,7 @@ public class InsPlyIncomeServiceImpl extends ServiceImpl<InsPlyIncomeMapper, Ins
                 }
             }
         }else if("2".equals(type)){
+
             int index=1;
             //车险跟单
             if(cxgdList!=null && cxgdList.size()>0){

+ 5 - 2
src/main/java/com/ydtech/modules/ins/model/vo/CustomerInfoVo.java

@@ -23,8 +23,8 @@ import javax.validation.constraints.NotNull;
 @NoArgsConstructor
 @AllArgsConstructor
 @ApiModel(value = "人员信息")
-@CodeNotNull()
-@CheckIdentifyNumberClass()
+@CodeNotNull
+@CheckIdentifyNumberClass
 public class CustomerInfoVo {
 
     @NotNull(message = "车主、投保人、被保人姓名不能为空")
@@ -58,6 +58,9 @@ public class CustomerInfoVo {
     @ApiModelProperty("手机号")
     private String mobile;
 
+    @ApiModelProperty("固定电话")
+    private String tel;
+
     @ApiModelProperty(value = "有效时间开始")
     @CheckDateTime(format = "yyyy-MM-dd", message = "请检查身份证的开始有效时间")
     @NotBlank(message = "请检车有效时间开始是否填写")

+ 6 - 2
src/main/java/com/ydtech/modules/ins/model/vo/QuoteRespVo.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ydtech.modules.order.entity.TaxArrears;
 import com.ydtech.modules.order.entity.crawler.response.CrawlerQuoteResponse;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.CoreModelsVo;
 import com.ydtech.utils.BigDecimalUtils;
 import com.ydtech.utils.StringUtils;
@@ -129,7 +130,7 @@ public class QuoteRespVo {
     private double syLossRation;
 
     @ApiModelProperty("阳光 交商含增值服务合并经营成本率")
-    private double mergeCostRate;
+    private String mergeCostRate;
 
     @ApiModelProperty("核心返回车型")
     private CoreModelsVo coreModels;
@@ -216,12 +217,15 @@ public class QuoteRespVo {
     @TableField(value = "syappoint")
     private String syappoint;
 
+    @ApiModelProperty("报价记录")
+    private List<SysQuoteRecord> quoteRecords;
+
     public void setJqClaims(String jqClaims) {
         this.jqClaims = StringUtils.isEmpty(jqClaims) ? null : jqClaims;
     }
 
     public void setSyClaims(String syClaims) {
-        this.syClaims = StringUtils.isEmpty(jqClaims) ? null : syClaims;
+        this.syClaims = StringUtils.isEmpty(syClaims) ? null : syClaims;
     }
 
     public List<AccidentResponseVo> getAccidentInfo() {

+ 28 - 8
src/main/java/com/ydtech/modules/ins/model/yc/audit/Audit.java

@@ -10,6 +10,7 @@ import com.ydtech.modules.ins.model.yc.YcConfigureParameters;
 import com.ydtech.modules.order.entity.InsAreaCompany;
 import com.ydtech.modules.order.entity.InsOrders;
 import com.ydtech.utils.IDCardUtils;
+import com.ydtech.utils.StringUtils;
 import lombok.Data;
 
 import javax.validation.Valid;
@@ -260,12 +261,21 @@ public class Audit {
         customer.setOwnerAddress(ownerInfo.getAddr());
         customer.setAppcIncome("0");
         customer.setInsuredcIncome("0");
-        customer.setBenefitCustType("1");
-        customer.setBenefitCertiType("120001");
-        customer.setBenefitCertiCode(insureInfo.getIdentifyNumber());
-        customer.setBenefitAge(IDCardUtils.GetBirthday(insureInfo.getIdentifyNumber()));
-        customer.setBenefitSex(IDCardUtils.GetYcSex(insureInfo.getIdentifyNumber()));
-        customer.setBenefitName(insureInfo.getName());
+        String property1 = insureInfo.getProperty();
+        if (StringUtils.isNotEmpty(property1) && "0".equals(property1)) {
+            customer.setBenefitCustType("0");
+            customer.setBenefitCertiType("110004");
+            customer.setBenefitCertiCode(insureInfo.getOrganizationCode());
+            customer.setBenefitName(insureInfo.getName());
+        }else {
+
+            customer.setBenefitCustType("1");
+            customer.setBenefitCertiType("120001");
+            customer.setBenefitCertiCode(insureInfo.getIdentifyNumber());
+            customer.setBenefitAge(IDCardUtils.GetBirthday(insureInfo.getIdentifyNumber()));
+            customer.setBenefitSex(IDCardUtils.GetYcSex(insureInfo.getIdentifyNumber()));
+            customer.setBenefitName(insureInfo.getName());
+        }
         customer.setBnfctcertfclsvalidate(YcBuildData.ID_CARD_INDATE);
 //        customer.setCProvince(Province.buildProvince(insureInfo.getAddr()));
 //        customer.setCCity(City.buildCity(insureInfo.getAddr()));
@@ -274,10 +284,20 @@ public class Audit {
 
         //<taxATion>
         TaxATion taxATion = new TaxATion();
-        taxATion.setCTaxType("338001");
+        //0:法人 1个人
+        String property = applyInfo.getProperty();
+        if (StringUtils.isNotEmpty(property) && "0".equals(property)) {
+            taxATion.setCTaxType("338003");
+            taxATion.setTaxpayerComid(applyInfo.getOrganizationCode());
+        }else {
+            taxATion.setCTaxType("338001");
+            taxATion.setTaxpayerComid(applyInfo.getIdentifyNumber());
+        }
+        //ceshi
+//        taxATion.setCTaxType("338001");
 //        taxATion.setClntMark("1");
         taxATion.setClntMark("3");
-        taxATion.setTaxpayerComid(applyInfo.getIdentifyNumber());
+//        taxATion.setTaxpayerComid(applyInfo.getIdentifyNumber());
         taxATion.setTaxName(applyInfo.getName());
         taxATion.setClntAddress(applyInfo.getAddr());
         taxATion.setMobile(applyInfo.getMobile());

+ 5 - 2
src/main/java/com/ydtech/modules/ins/model/yc/ruote/Applicant.java

@@ -1,6 +1,7 @@
 package com.ydtech.modules.ins.model.yc.ruote;
 
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.ydtech.exception.SystemException;
 import com.ydtech.modules.ins.model.vo.CustomerInfoVo;
 import com.ydtech.modules.ins.model.yc.YcConfigureParameters;
 import com.ydtech.utils.IDCardUtils;
@@ -245,13 +246,15 @@ public class Applicant {
             //投保人证件号
             applicant.setCCertfCde(policyHolderInfo.getOrganizationCode());
             applicant.setCClntAddr(policyHolderInfo.getAddr());
-
+            if (StringUtils.isEmpty(ownerInfo.getProvince()) || StringUtils.isEmpty(ownerInfo.getCity()) || StringUtils.isEmpty(ownerInfo.getCounty())) {
+                throw new SystemException("企业车省市区必填");
+            }
             applicant.setCProvince(policyHolderInfo.getProvince());
             applicant.setCCity(policyHolderInfo.getCity());
             applicant.setCCounty(policyHolderInfo.getCounty());
             //行业
             applicant.setCTrdCde("201799");
-            applicant.setCOccupation(policyHolderInfo.getScope());
+//            applicant.setCOccupation(policyHolderInfo.getScope());
             applicant.setNResvNum3(policyHolderInfo.getRegisteredCapital());
             applicant.setNResvNum3Cur("01");
             applicant.setCWorkDpt("900");

+ 9 - 2
src/main/java/com/ydtech/modules/ins/model/yc/ruote/Insured.java

@@ -1,8 +1,10 @@
 package com.ydtech.modules.ins.model.yc.ruote;
 
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.ydtech.exception.SystemException;
 import com.ydtech.modules.ins.model.vo.CustomerInfoVo;
 import com.ydtech.utils.IDCardUtils;
+import com.ydtech.utils.StringUtils;
 import lombok.Data;
 
 
@@ -267,19 +269,24 @@ public class Insured {
         if ("0".equals(property)) {
             insured.setCCertfCls("110004");
             insured.setCCertfCde(insuredPersonInfo.getOrganizationCode());
+            if (StringUtils.isEmpty(ownerInfo.getProvince()) || StringUtils.isEmpty(ownerInfo.getCity()) || StringUtils.isEmpty(ownerInfo.getCounty())) {
+                throw new SystemException("企业车省市区必填");
+            }
             insured.setCProvince(insuredPersonInfo.getProvince());
             insured.setCCity(insuredPersonInfo.getCity());
             insured.setCCounty(insuredPersonInfo.getCounty());
             //经营范围
-            insured.setCWorkCtt(insuredPersonInfo.getScope());
+//            insured.setCWorkCtt(insuredPersonInfo.getScope());
             insured.setNResvNum3(insuredPersonInfo.getRegisteredCapital());
             insured.setNResvNum3Cur("01");
+            insured.setCCntrNme(insuredPersonInfo.getLegalPerson());
             insured.setCClntMrk("0");
         } else {
             insured.setCCertfCls("120001");
             insured.setCCertfCde(insuredPersonInfo.getIdentifyNumber());
             insured.setTBirthday(IDCardUtils.GetBirthday(insuredPersonInfo.getIdentifyNumber()));
             insured.setCSex(IDCardUtils.GetYcSex(insuredPersonInfo.getIdentifyNumber()));
+            insured.setCCntrNme(insuredPersonInfo.getName());
             insured.setCClntMrk("1");
         }
 
@@ -292,7 +299,7 @@ public class Insured {
         insured.setCAreaCde("103132");
 
         insured.setTCertfClsValiDate(insuredPersonInfo.getIdentifyValidEndDate());
-        insured.setCCntrNme(insuredPersonInfo.getName());
+//        insured.setCCntrNme(insuredPersonInfo.getName());
         insured.setCRelCdes(ownerInfo.getName().equals(insuredPersonInfo.getName()) ? "601005" : "601008");
 
 

+ 15 - 3
src/main/java/com/ydtech/modules/ins/model/yc/ruote/Tax.java

@@ -139,16 +139,28 @@ public class Tax {
         tax.setTaxPayerName(policyHolderInfo.getName());
         //补交上年
         tax.setPayLastYear("0");
-        tax.setIdType("120001");
+        //0:法人 1:个人(中国籍) 2: 个人(非中国籍)
+        String property = policyHolderInfo.getProperty();
+        if (property.equals("0")) {
+            tax.setIdType("110004");
+            tax.setTaxpayerType("338003");
+            tax.setTaxpayerNO(policyHolderInfo.getOrganizationCode());
+        }else {
+            tax.setIdType("120001");
+            tax.setTaxpayerType("338001");
+            //纳税人识别号 =  投保人身份证号
+            tax.setTaxpayerNO(policyHolderInfo.getIdentifyNumber());
+        }
+//        tax.setIdType("120001");
         tax.setCalculatedType("349003001");
         tax.setVehecleTypeDetail("3490010013");
         tax.setTaxpayerAddress(policyHolderInfo.getAddr());
         tax.setVehicleQuality(extracted(carInfo.getCompleteKerbMass()));
         //纳税人识别号 =  投保人身份证号
-        tax.setTaxpayerNO(policyHolderInfo.getIdentifyNumber());
+//        tax.setTaxpayerNO(policyHolderInfo.getIdentifyNumber());
 
         tax.setVehicleType("349001001");
-        tax.setTaxpayerType("338001");
+//        tax.setTaxpayerType("338001");
         tax.setConruty("156");
         tax.setTel(policyHolderInfo.getMobile());
         tax.setExhaust(carInfo.getEnginedesc());

+ 5 - 0
src/main/java/com/ydtech/modules/ins/model/yc/ruote/Vhlowner.java

@@ -1,8 +1,10 @@
 package com.ydtech.modules.ins.model.yc.ruote;
 
 import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.ydtech.exception.SystemException;
 import com.ydtech.modules.ins.model.vo.CustomerInfoVo;
 import com.ydtech.utils.IDCardUtils;
+import com.ydtech.utils.StringUtils;
 import lombok.Data;
 
 
@@ -112,6 +114,9 @@ public class Vhlowner {
         if ("0".equals(property)) {
             vhlowner.setDrvOwnerCeritType("110004");
             vhlowner.setDrvOwnerCertiCode(ownerInfo.getOrganizationCode());
+            if (StringUtils.isEmpty(ownerInfo.getProvince()) || StringUtils.isEmpty(ownerInfo.getCity()) || StringUtils.isEmpty(ownerInfo.getCounty())) {
+                throw new SystemException("企业车省市区必填");
+            }
             vhlowner.setCProvince(ownerInfo.getProvince());
             vhlowner.setCCity(ownerInfo.getCity());
             vhlowner.setCCounty(ownerInfo.getCounty());

+ 9 - 2
src/main/java/com/ydtech/modules/inv/model/excel/AddTypeCXGDExcel.java

@@ -1,6 +1,7 @@
 package com.ydtech.modules.inv.model.excel;
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
@@ -8,6 +9,7 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  *  @version
@@ -18,8 +20,9 @@ import java.math.BigDecimal;
 @Data
 public class AddTypeCXGDExcel implements Serializable {
 
-    @Excel(name = "签单日期",isImportField = "true")
-    private String signDate;
+
+    @Excel(name = "签单日期",isImportField = "true", databaseFormat = "yyyy/MM/dd")
+    private Date signDateNew;
 
     @Excel(name = "车牌号",isImportField = "true")
     private String licenseno;
@@ -68,4 +71,8 @@ public class AddTypeCXGDExcel implements Serializable {
     @Excel(name = "类型",isImportField = "true")
     private String addType;
 
+
+    @ExcelIgnore
+    private String signDate;
+
 }

+ 8 - 2
src/main/java/com/ydtech/modules/inv/model/excel/AddTypeCXSXFExcel.java

@@ -1,6 +1,7 @@
 package com.ydtech.modules.inv.model.excel;
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
@@ -10,6 +11,7 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 /**
  *  @version
@@ -21,8 +23,8 @@ import java.time.LocalDateTime;
 public class AddTypeCXSXFExcel implements Serializable {
 
 
-    @Excel(name = "签单日期",isImportField = "true")
-    private String signDate;
+    @Excel(name = "签单日期",isImportField = "true", databaseFormat = "yyyy/MM/dd")
+    private Date signDateNew;
 
     @Excel(name = "车牌号",isImportField = "true")
     private String licenseno;
@@ -71,4 +73,8 @@ public class AddTypeCXSXFExcel implements Serializable {
     @Excel(name = "类型",isImportField = "true")
     private String addType;
 
+
+    @ExcelIgnore
+    private String signDate;
+
 }

+ 6 - 1
src/main/java/com/ydtech/modules/inv/model/excel/AddTypeFCGDExcel.java

@@ -1,6 +1,7 @@
 package com.ydtech.modules.inv.model.excel;
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
@@ -8,6 +9,7 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  *  @version
@@ -19,7 +21,7 @@ import java.math.BigDecimal;
 public class AddTypeFCGDExcel implements Serializable {
 
     @Excel(name = "签单日期",isImportField = "true")
-    private String signDate;
+    private Date signDateNew;
 
     @Excel(name = "车牌号",isImportField = "true")
     private String licenseno;
@@ -53,4 +55,7 @@ public class AddTypeFCGDExcel implements Serializable {
 
     @Excel(name = "类型",isImportField = "true")
     private String addType;
+
+    @ExcelIgnore
+    private String signDate;
 }

+ 5 - 1
src/main/java/com/ydtech/modules/inv/model/excel/AddTypeFCSXFExcel.java

@@ -1,6 +1,7 @@
 package com.ydtech.modules.inv.model.excel;
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModelProperty;
@@ -8,6 +9,7 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  *  @version
@@ -19,7 +21,7 @@ import java.math.BigDecimal;
 public class AddTypeFCSXFExcel implements Serializable {
 
     @Excel(name = "签单日期",isImportField = "true")
-    private String signDate;
+    private Date signDateNew;
 
     @Excel(name = "车牌号",isImportField = "true")
     private String licenseno;
@@ -57,4 +59,6 @@ public class AddTypeFCSXFExcel implements Serializable {
     @Excel(name = "类型",isImportField = "true")
     private String addType;
 
+    @ExcelIgnore
+    private String signDate;
 }

+ 85 - 37
src/main/java/com/ydtech/modules/inv/utils/CheckInsPlyComeUtils.java

@@ -18,10 +18,9 @@ import java.math.BigDecimal;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -184,16 +183,16 @@ public class CheckInsPlyComeUtils {
 
         Map<String,Object>  map =new HashMap<String,Object>();
         String errorMsg ="";
-        if(checkSignDate(dto.getSignDate(), "签单时间")!=null){
-            errorMsg+=checkSignDate(dto.getSignDate(), "签单时间")+"; ";
+//        if(checkSignDate(dto.getSignDate(), "签单时间")!=null){
+//            errorMsg+=checkSignDate(dto.getSignDate(), "签单时间")+"; ";
+//        }
+        if(dto.getSignDateNew()==null){
+            errorMsg+="签单日期 不能为空或格式错误,格式为yyyy-MM-dd";
         }
         //签单日期转换为 yyyy-MM-dd HH:mm:ss
-        if(StringUtils.isNotEmpty(dto.getSignDate())){
-            String singTime = pareTimeLocalDate(dto.getSignDate());
-            dto.setSignDate(singTime);
+        if(dto.getSignDateNew()!=null){
+            dto.setSignDate( pareDateToLocalTime(dto.getSignDateNew()));
         }
-
-
         if(checkIsNull(dto.getLicenseno(), "车牌号")!=null){
             errorMsg+=checkIsNull(dto.getSignDate(), "车牌号")+"; ";
         }
@@ -245,18 +244,18 @@ public class CheckInsPlyComeUtils {
         if(isNumeric(dto.getJqPremium(), "交强险保费")!=null){
             errorMsg+=isNumeric(dto.getJqPremium(), "交强险保费")+"; ";
         }
-        if(isNumeric(dto.getSyPremium(), "商业险保费")!=null){
-            errorMsg+=isNumeric(dto.getSyPremium(), "商业险保费")+"; ";
-        }
+//        if(isNumeric(dto.getSyPremium(), "商业险保费")!=null){
+//            errorMsg+=isNumeric(dto.getSyPremium(), "商业险保费")+"; ";
+//        }
         if(isNumeric(dto.getTaxamount(), "车船税")!=null){
             errorMsg+=isNumeric(dto.getTaxamount(), "车船税")+"; ";
         }
         if(isNumeric(dto.getJqSuperviseCostsProportion(), "交强手续费比例")!=null){
             errorMsg+=isNumeric(dto.getJqSuperviseCostsProportion(), "交强手续费比例")+"; ";
         }
-        if(isNumeric(dto.getSySuperviseCostsProportion(), "商业手续费比例")!=null){
-            errorMsg+=isNumeric(dto.getSySuperviseCostsProportion(), "商业手续费比例")+"; ";
-        }
+//        if(isNumeric(dto.getSySuperviseCostsProportion(), "商业手续费比例")!=null){
+//            errorMsg+=isNumeric(dto.getSySuperviseCostsProportion(), "商业手续费比例")+"; ";
+//        }
         if(isNumeric(dto.getCommissionFeevalue(), "手续费金额")!=null){
             errorMsg+=isNumeric(dto.getCommissionFeevalue(), "手续费金额")+"; ";
         }
@@ -284,6 +283,29 @@ public class CheckInsPlyComeUtils {
         return map;
     }
 
+    private static String pareDateToLocalTime(Date getSignDateNew) {
+        if (getSignDateNew == null) {
+            // 对传入的Date对象做判空处理,避免空指针异常,这里简单返回null,可根据实际需求调整
+            return null;
+        }
+        Instant instant = getSignDateNew.toInstant();
+        ZoneId zoneId = ZoneId.systemDefault();
+        LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
+        // 通过判断LocalDateTime的时间部分是否都是0来确定是否只包含日期(即没有时分秒)
+        boolean isOnlyDate = localDateTime.toLocalTime().equals(java.time.LocalTime.of(0, 0, 0));
+
+        if (isOnlyDate) {
+            // 说明没有时分秒,只有日期部分,按原逻辑格式化日期
+            DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            String formattedDate = localDateTime.toLocalDate().format(dateFormatter);
+            return pareTimeLocalDate(formattedDate);
+        } else {
+            // 带有时分秒,使用包含时分秒的格式化方式,这里可以根据需求调整格式,比如"yyyy-MM-dd HH:mm:ss"
+            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            return localDateTime.format(dateTimeFormatter);
+        }
+    }
+
     private static String pareTimeLocalDate(String signDate) {
         // 定义输入格式(仅日期)
         DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -315,13 +337,21 @@ public class CheckInsPlyComeUtils {
 
         Map<String,Object>  map =new HashMap<String,Object>();
         String errorMsg ="";
-        if(checkSignDate(dto.getSignDate(), "签单时间")!=null){
-            errorMsg+=checkSignDate(dto.getSignDate(), "签单时间")+"; ";
+//        if(checkSignDate(dto.getSignDate(), "签单时间")!=null){
+//            errorMsg+=checkSignDate(dto.getSignDate(), "签单时间")+"; ";
+//        }
+//        //签单日期转换为 yyyy-MM-dd HH:mm:ss
+//        if(StringUtils.isNotEmpty(dto.getSignDate())){
+//            String singTime = pareTimeLocalDate(dto.getSignDate());
+//            dto.setSignDate(singTime);
+//        }
+
+        if(dto.getSignDateNew()==null){
+            errorMsg+="签单日期 不能为空或格式错误,格式为yyyy-MM-dd";
         }
         //签单日期转换为 yyyy-MM-dd HH:mm:ss
-        if(StringUtils.isNotEmpty(dto.getSignDate())){
-            String singTime = pareTimeLocalDate(dto.getSignDate());
-            dto.setSignDate(singTime);
+        if(dto.getSignDateNew()!=null){
+            dto.setSignDate( pareDateToLocalTime(dto.getSignDateNew()));
         }
 
         if(checkIsNull(dto.getLicenseno(), "车牌号")!=null){
@@ -376,18 +406,18 @@ public class CheckInsPlyComeUtils {
         if(isNumeric(dto.getJqPremium(), "交强险保费")!=null){
             errorMsg+=isNumeric(dto.getJqPremium(), "交强险保费")+"; ";
         }
-        if(isNumeric(dto.getSyPremium(), "商业险保费")!=null){
-            errorMsg+=isNumeric(dto.getSyPremium(), "商业险保费")+"; ";
-        }
+//        if(isNumeric(dto.getSyPremium(), "商业险保费")!=null){
+//            errorMsg+=isNumeric(dto.getSyPremium(), "商业险保费")+"; ";
+//        }
         if(isNumeric(dto.getTaxamount(), "车船税")!=null){
             errorMsg+=isNumeric(dto.getTaxamount(), "车船税")+"; ";
         }
         if(isNumeric(dto.getJqOtherCostsProportion(), "交强跟单比例")!=null){
             errorMsg+=isNumeric(dto.getJqOtherCostsProportion(), "交强跟单比例")+"; ";
         }
-        if(isNumeric(dto.getSyOtherCostsProportion(), "商业跟单比例")!=null){
-            errorMsg+=isNumeric(dto.getSyOtherCostsProportion(), "商业跟单比例")+"; ";
-        }
+//        if(isNumeric(dto.getSyOtherCostsProportion(), "商业跟单比例")!=null){
+//            errorMsg+=isNumeric(dto.getSyOtherCostsProportion(), "商业跟单比例")+"; ";
+//        }
         if(isNumeric(dto.getOtherFeevalue(), "跟单费金额")!=null){
             errorMsg+=isNumeric(dto.getOtherFeevalue(), "跟单费金额")+"; ";
         }
@@ -422,15 +452,24 @@ public class CheckInsPlyComeUtils {
      */
     public static Map<String, Object> checkDataDto3(AddTypeFCSXFExcel dto) {
 
+
         Map<String,Object>  map =new HashMap<String,Object>();
         String errorMsg ="";
-        if(checkSignDate(dto.getSignDate(), "签单时间")!=null){
-            errorMsg+=checkSignDate(dto.getSignDate(), "签单时间")+"; ";
+//        if(checkSignDate(dto.getSignDate(), "签单时间")!=null){
+//            errorMsg+=checkSignDate(dto.getSignDate(), "签单时间")+"; ";
+//        }
+//        //签单日期转换为 yyyy-MM-dd HH:mm:ss
+//        if(StringUtils.isNotEmpty(dto.getSignDate())){
+//            String singTime = pareTimeLocalDate(dto.getSignDate());
+//            dto.setSignDate(singTime);
+//        }
+
+        if(dto.getSignDateNew()==null){
+            errorMsg+="签单日期 不能为空或格式错误,格式为yyyy-MM-dd";
         }
         //签单日期转换为 yyyy-MM-dd HH:mm:ss
-        if(StringUtils.isNotEmpty(dto.getSignDate())){
-            String singTime = pareTimeLocalDate(dto.getSignDate());
-            dto.setSignDate(singTime);
+        if(dto.getSignDateNew()!=null){
+            dto.setSignDate( pareDateToLocalTime(dto.getSignDateNew()));
         }
 
         if(checkIsNull(dto.getLicenseno(), "车牌号")!=null){
@@ -517,14 +556,23 @@ public class CheckInsPlyComeUtils {
     public static Map<String, Object> checkDataDto4(AddTypeFCGDExcel dto) {
         Map<String,Object>  map =new HashMap<String,Object>();
         String errorMsg ="";
-        if(checkSignDate(dto.getSignDate(), "签单时间")!=null){
-            errorMsg+=checkSignDate(dto.getSignDate(), "签单时间")+"; ";
+//        if(checkSignDate(dto.getSignDate(), "签单时间")!=null){
+//            errorMsg+=checkSignDate(dto.getSignDate(), "签单时间")+"; ";
+//        }
+//
+//        //签单日期转换为 yyyy-MM-dd HH:mm:ss
+//        if(StringUtils.isNotEmpty(dto.getSignDate())){
+//            String singTime = pareTimeLocalDate(dto.getSignDate());
+//            dto.setSignDate(singTime);
+//        }
+        if(dto.getSignDateNew()==null){
+            errorMsg+="签单日期 不能为空或格式错误,格式为yyyy-MM-dd";
         }
         //签单日期转换为 yyyy-MM-dd HH:mm:ss
-        if(StringUtils.isNotEmpty(dto.getSignDate())){
-            String singTime = pareTimeLocalDate(dto.getSignDate());
-            dto.setSignDate(singTime);
+        if(dto.getSignDateNew()!=null){
+            dto.setSignDate( pareDateToLocalTime(dto.getSignDateNew()));
         }
+
         if(checkIsNull(dto.getLicenseno(), "车牌号")!=null){
             errorMsg+=checkIsNull(dto.getSignDate(), "车牌号")+"; ";
         }

+ 1 - 1
src/main/java/com/ydtech/modules/inv/utils/EasyExcelUtils.java

@@ -57,7 +57,7 @@ public class EasyExcelUtils {
      */
     public static String downExcel(String uploadFilePath, String fileName, String sheetName, Class<?> clz, List<?> list) {
         File f = new File(uploadFilePath);
-        if(f.exists()) {
+        if(!f.exists()) {
             f.mkdirs();
         }
 

+ 14 - 0
src/main/java/com/ydtech/modules/order/aop/QuoteNumberVerification.java

@@ -0,0 +1,14 @@
+package com.ydtech.modules.order.aop;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface QuoteNumberVerification {
+
+    String value() default "";
+
+}
+
+
+

+ 42 - 4
src/main/java/com/ydtech/modules/order/aop/aspect/QuoteVerificationAspect.java

@@ -6,6 +6,7 @@ import com.ydtech.constants.enums.InsuranceRisk;
 import com.ydtech.constants.enums.dict.agreement.ProductsType;
 import com.ydtech.constants.sys.SystemConstant;
 import com.ydtech.core.page.HttpResult;
+import com.ydtech.exception.SystemException;
 import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.SysUserRole;
 import com.ydtech.modules.admin.service.SysSwitchConfigService;
@@ -21,17 +22,16 @@ import com.ydtech.modules.ins.model.vo.KindInfoVo;
 import com.ydtech.modules.ins.model.vo.QuoteRespVo;
 import com.ydtech.modules.ins.model.vo.RiskInfoVo;
 import com.ydtech.modules.order.components.InsOrdersComponents;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.entity.InsAreaCompany;
 import com.ydtech.modules.order.entity.InsAreaCompanyAccidentalDriving;
 import com.ydtech.modules.order.entity.InsOrders;
 import com.ydtech.modules.order.entity.po.InsAreaCompanyError;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
+import com.ydtech.modules.order.entity.vo.QuoteNumRedisVo;
 import com.ydtech.modules.order.entity.vo.SubOrderExportFeeVo;
-import com.ydtech.modules.order.service.InsAreaCompanyAccidentalDrivingService;
-import com.ydtech.modules.order.service.InsAreaCompanyErrorService;
-import com.ydtech.modules.order.service.InsAreaCompanyService;
-import com.ydtech.modules.order.service.InsOrdersService;
+import com.ydtech.modules.order.service.*;
 import com.ydtech.modules.protocol.constants.TaxSourceStatusConstants;
 import com.ydtech.modules.protocol.dao.PtlTaxSourceNewMapper;
 import com.ydtech.modules.protocol.entity.dto.TaxSourceExcludeDto;
@@ -54,8 +54,11 @@ import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Before;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.util.*;
 
 @Aspect
@@ -103,6 +106,12 @@ public class QuoteVerificationAspect {
 
     private  final SysSwitchConfigService sysSwitchConfigService;
 
+    private final StringRedisTemplate redisTemplate;
+
+    private final SysQuoteConfigService sysQuoteConfigService;
+
+    private final SysQuoteRedisService sysQuoteRedisService;
+
     @AfterReturning(pointcut = "@annotation(com.ydtech.modules.order.aop.QuoteVerification)", returning = "result")
     public void doAfter(HttpResult<QuoteRespVo> result) {
         //计算费用因子
@@ -164,6 +173,35 @@ public class QuoteVerificationAspect {
                 String companyId = ((BaseQuoteVo<?>) arg).getCompanyId();
                 String agreementId = ((BaseQuoteVo<?>) arg).getAgreementId();
                 String orderno = ((BaseQuoteVo<?>) arg).getOrderNo();
+                InsOrders insOrders = insOrdersService.getById(orderno);
+                //获取用户在保险公司的报价次数
+                boolean checkQuoteLimitation = sysQuoteConfigService.checkQuoteLimitation(insOrders.getUserid(), companyId, insOrders.getLicenseno());
+                BigDecimal quoteRatio = sysQuoteRedisService.getQuoteRatio(companyId, insOrders.getUserid());
+                if(Objects.isNull(quoteRatio)){
+                    quoteRatio = new BigDecimal(BigInteger.ZERO);
+                }
+                if(checkQuoteLimitation){
+                    Integer maxQuoteNum = sysQuoteRedisService.getMaxQuoteNum(companyId, insOrders.getUserid(), insOrders.getLicenseno());
+                    System.out.printf("返回可报价次数:" + maxQuoteNum.toString());
+                    //设置最大报价次数
+                    ((BaseQuoteVo<?>) arg).setMaxQuoteNum(maxQuoteNum);
+                    ((BaseQuoteVo<?>) arg).setQuoteRatio(quoteRatio);
+                }else{
+                    //如果次数为0 则 获取出单比
+                    QuoteNumRedisVo quoteNumberRedisData = sysQuoteRedisService.getQuoteNumberRedisData(insOrders.getUserid());
+                    QuoteNumRedisVo.QuoteNumberCompanyVo quoteNumberCompanyVo = quoteNumberRedisData.getOriginalCompanyList().stream().filter(item -> item.getCompanyId().equals(companyId)).findFirst().orElse(null);
+                    if(!Objects.isNull(quoteNumberCompanyVo) && (quoteRatio.equals(BigDecimal.ZERO) || quoteNumberCompanyVo.getOrderRatio().compareTo(quoteRatio) < 0))
+                    {
+                        System.out.printf("报价比例成功:");
+                        //还可以报价 设置最大报价次数为5  报价比例为100%
+                        ((BaseQuoteVo<?>) arg).setMaxQuoteNum(5);
+                        ((BaseQuoteVo<?>) arg).setQuoteRatio(new BigDecimal(100));
+                    }else{
+                        throw new SystemException("报价次数限制!");
+                    }
+                }
+
+
                 //由于前台未传userid判断不了,从主订单表获取用户id和机构id保证待客录单和录单员录单的信息一致
                 /**
                  String deptId = ((BaseQuoteVo<?>) arg).getDeptId();

+ 1 - 1
src/main/java/com/ydtech/modules/order/components/chengtai/ChengTaiRequestApiComponents.java

@@ -211,7 +211,7 @@ public class ChengTaiRequestApiComponents {
      */
     private void verificationResponseCode(String responseCode, boolean flag, String responseMsg) {
         if (!flag){
-            throw new SystemException("验签失败");
+            throw new SystemException(responseMsg);
         }
         if (!ResponseCode.R_000.getCode().equals(responseCode) && !responseMsg.contains("重复投保") && !responseMsg.contains("录入的校验码有误")) {
             throw new SystemException(responseMsg);

+ 46 - 0
src/main/java/com/ydtech/modules/order/components/gouren/GuorenDuplicateInsuranceComponent.java

@@ -63,6 +63,14 @@ public class GuorenDuplicateInsuranceComponent {
         return "";
     }
 
+    public static String getTimelyEndDate(String rtnMsg, String regex) {
+        String endDate = getTimelyTheExpiryDate(rtnMsg, regex);
+        if (!endDate.isEmpty()) {
+            return endDate;
+        }
+        return "";
+    }
+
     /**
      * 获取终保日期
      *
@@ -84,6 +92,7 @@ public class GuorenDuplicateInsuranceComponent {
                 SimpleDateFormat dateFormat = new SimpleDateFormat(string);
                 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                 Date parse = dateFormat.parse(startDate);
+
                 return simpleDateFormat.format(parse);
 
             } catch (Exception e) {
@@ -93,6 +102,43 @@ public class GuorenDuplicateInsuranceComponent {
         return "";
     }
 
+
+    public static String getTimelyTheExpiryDate(String message, String regex) {
+        Pattern pattern = Pattern.compile(regex);
+        String replace = message.replace("\r", ";").replace("\n", ";").replace(" ", "");
+        Matcher m = pattern.matcher(replace);
+
+        boolean b = m.find();
+        if (b) {
+            try {
+                String startDate = "";
+                String group = m.group(2);
+                String groupRegex = "终保日期(\\d{4}-\\d{2}-\\d{2})";
+                Pattern groupPattern = Pattern.compile(groupRegex);
+                Matcher groupMatcher = groupPattern.matcher(group);
+                if(groupMatcher.find()) {
+                    startDate = groupMatcher.group(1);
+                }else{
+                    return "";
+                }
+                String string = "yyyy-MM-dd";
+                SimpleDateFormat dateFormat = new SimpleDateFormat(string);
+                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                Date parse = dateFormat.parse(startDate);
+                Calendar calendar = Calendar.getInstance();
+                calendar.setTime(parse);
+                calendar.add(Calendar.DAY_OF_MONTH, 1); // 加一天
+                // 获取增加一天后的日期
+                Date newDate = calendar.getTime();
+                return simpleDateFormat.format(newDate);
+
+            } catch (Exception e) {
+                throw new SystemException(message);
+            }
+        }
+        return "";
+    }
+
     /**
      * 重复投保
      *

+ 37 - 5
src/main/java/com/ydtech/modules/order/components/huatai/HuaTaiQuotationProcessorComponent.java

@@ -1,8 +1,12 @@
 package com.ydtech.modules.order.components.huatai;
 
 
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.entity.api.huatai.request.HuaTaiQuotedPriceRequest;
 import com.ydtech.modules.order.entity.api.huatai.response.HuaTaiQuotedPriceResponse;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
+import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
+import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
 
@@ -25,10 +29,12 @@ public class HuaTaiQuotationProcessorComponent {
 
     private final HuaTaiRepeatInsuranceComponents huaTaiRepeatInsuranceComponents;
 
-    public HuaTaiQuotedPriceResponse handler(HuaTaiQuotedPriceRequest quotedPriceRequest, List<String> warnMessageList, String insuredCode) {
+    public HuaTaiQuotedPriceResponse handler(BaseQuoteInfoVo quoteInfoVo, HuaTaiQuotedPriceRequest quotedPriceRequest, List<String> warnMessageList, String insuredCode,
+                                             String companyId,Integer maxQuoteNum, List<SysQuoteRecord> sysQuoteRecords) {
         boolean b;
         HuaTaiQuotedPriceResponse quotedPriceResponse = huaTaiRequestApiComponents.quotedPrice(quotedPriceRequest,
                 HuaTaiQuotedPriceResponse.class,  insuredCode);
+        maxQuoteNum--;
 
         // 将报价号和校验码置空
         List<HuaTaiQuotedPriceRequest.ContractDto> contract1 = quotedPriceRequest.getBusinessData().getContract();
@@ -40,25 +46,51 @@ public class HuaTaiQuotationProcessorComponent {
         // 交强险重复投保
         b = huaTaiRepeatInsuranceComponents.compulsoryInsurance(quotedPriceRequest, quotedPriceResponse, warnMessageList);
         if (b) {
-            quotedPriceResponse = handler(quotedPriceRequest, warnMessageList, insuredCode);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),companyId ,quoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            if(maxQuoteNum <= 0){
+                return quotedPriceResponse;
+            }
+            quotedPriceResponse = handler(quoteInfoVo,quotedPriceRequest, warnMessageList, insuredCode, companyId,maxQuoteNum, sysQuoteRecords);
+
         }
 
         // 商业险重复投保
         b = huaTaiRepeatInsuranceComponents.commercialInsurance(quotedPriceRequest, quotedPriceResponse, warnMessageList);
         if (b) {
-            quotedPriceResponse = handler(quotedPriceRequest, warnMessageList, insuredCode);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),companyId ,quoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            if(maxQuoteNum <= 0){
+                return quotedPriceResponse;
+            }
+            quotedPriceResponse = handler(quoteInfoVo,quotedPriceRequest, warnMessageList, insuredCode,companyId, maxQuoteNum, sysQuoteRecords);
         }
 
         // 校验码
         b = huaTaiReinsuranceComponents.processor(quotedPriceResponse, quotedPriceRequest);
         if (b) {
-            quotedPriceResponse = handler(quotedPriceRequest, warnMessageList, insuredCode);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),companyId ,quoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.TRANSFER_INSRUANCE.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            if(maxQuoteNum <= 0){
+                return quotedPriceResponse;
+            }
+            quotedPriceResponse = handler(quoteInfoVo,quotedPriceRequest, warnMessageList, insuredCode, companyId,maxQuoteNum, sysQuoteRecords);
         }
 
         // 校验码有误
         b = huaTaiReinsuranceComponents.processor(quotedPriceResponse);
         if (b) {
-            quotedPriceResponse = handler(quotedPriceRequest, warnMessageList, insuredCode);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),companyId ,quoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.TRANSFER_INSRUANCE.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            if(maxQuoteNum <= 0){
+                return quotedPriceResponse;
+            }
+            quotedPriceResponse = handler(quoteInfoVo,quotedPriceRequest, warnMessageList, insuredCode, companyId,maxQuoteNum, sysQuoteRecords);
+
         }
 
 

+ 3 - 1
src/main/java/com/ydtech/modules/order/components/zhongmei/ZhongmeiRepeatInsuranceComponents.java

@@ -202,7 +202,9 @@ public class ZhongmeiRepeatInsuranceComponents {
             }
         }
 
-        return zhongmeiRequestApiComponents.quotedPrice(quotedPriceRequest, QuotedPriceResponse.class);
+        quotedPriceResponse = zhongmeiRequestApiComponents.quotedPrice(quotedPriceRequest, QuotedPriceResponse.class);
+
+        return quotedPriceResponse;
     }
 
     private QuotedPriceRequest.ContractDTO.ContractMainDTO getPeriodDate(String startDate,

+ 11 - 3
src/main/java/com/ydtech/modules/order/components/zijin/ZijinDuplicateInsuranceComponents.java

@@ -39,6 +39,8 @@ public class ZijinDuplicateInsuranceComponents extends ResponseMessageAbstractHa
 
     public static final String SY = "商业险";
 
+    public static final String TIMELY_JQ_REGEX = "(终保日期[::\\\\s]?[0-9\\\\-]+).*?(终保日期[::\\\\s]?([0-9\\\\-]+))";
+
     private final ZijinRequestApiComponents zijinRequestApiComponents;
 
 
@@ -74,10 +76,16 @@ public class ZijinDuplicateInsuranceComponents extends ResponseMessageAbstractHa
         // 关联单标识
         String calculateFlag = calculatePremiumRequest.getBaseInfo().getCalculateFlag();
 
-        // 单交强
-        if (CalculateFlagEnum.CF_2.getCode().equals(calculateFlag)) {
-            jqEndDate = GuorenDuplicateInsuranceComponent.getEndDate(rtnMsg, DAN_JQ_REGEX);
+        //及时起保的
+        if(CalculateFlagEnum.CF_2.getCode().equals(calculateFlag)){
+            jqEndDate = GuorenDuplicateInsuranceComponent.getTimelyEndDate(rtnMsg, TIMELY_JQ_REGEX);
+            if(jqEndDate.equals("")){
+                //正常的日期
+                jqEndDate = GuorenDuplicateInsuranceComponent.getEndDate(rtnMsg, DAN_JQ_REGEX);
+
+            }
         }
+
         // 交强险
         else if (rtnMsg.contains(JQ)) {
             jqEndDate = GuorenDuplicateInsuranceComponent.getEndDate(rtnMsg, JQ_REGEX);

+ 8 - 2
src/main/java/com/ydtech/modules/order/components/zijin/ZijinRequestApiComponents.java

@@ -83,7 +83,7 @@ public class ZijinRequestApiComponents {
                                                           HttpHeaders httpHeaders) {
         String url = zijinApiConfigurationProperties.getUrl() + requestUrl.getUri();
         B b = insCrawlerOrderComponents.request(url, InsuranceEnum.ZKIC, requestUrl.getDesc(), requestBody, responseType, httpHeaders);
-        ResultEnum.verifyQuotation(b.getRtnCode(), b.getRtnMsg());
+//        ResultEnum.verifyQuotation(b.getRtnCode(), b.getRtnMsg());
         return b;
     }
 
@@ -137,6 +137,11 @@ public class ZijinRequestApiComponents {
         if (!ObjectUtils.isEmpty(entries)) {
             String authorization = (String) entries.get(AUTHORIZATION);
             String zKIApiAuthorization = (String) entries.get(ZKI_API_AUTHORIZATION);
+
+            System.out.printf("---------------\n--------------\n---------------\n--------------\n---------------\n--------------\n---------------\n--------------\n---------------\n--------------\n");
+            System.out.printf("authorization:" + authorization);
+            System.out.printf("zKIApiAuthorization:" + zKIApiAuthorization);
+            System.out.printf("---------------\n--------------\n---------------\n--------------\n---------------\n--------------\n---------------\n--------------\n---------------\n--------------\n");
             httpHeaders.set(AUTHORIZATION, authorization);
             httpHeaders.set(ZKI_API_AUTHORIZATION, zKIApiAuthorization);
             return httpHeaders;
@@ -265,7 +270,8 @@ public class ZijinRequestApiComponents {
                 Optional.ofNullable(calculatePremiumResponse.getBasePart()).map(CalculatePremiumResponse.BasePartDTO::getReinsureMessage).orElse("");
 
         if (calculatePremiumResponse.getRtnMsg().contains(HOUR_RULE) && calculatePremiumResponse.getRtnMsg().contains(MINUTE_RULE)) {
-            throw new SystemException(calculatePremiumResponse.getRtnMsg());
+            calculatePremiumResponse.setRtnCode(ResultEnum.C_4001);
+            calculatePremiumResponse.setRtnMsg(calculatePremiumResponse.getRtnMsg());
         }
 
         if (StringUtils.isNotEmpty(reinsureMessage) && !(reinsureMessage.contains(HOUR_RULE) && reinsureMessage.contains(MINUTE_RULE))) {

+ 89 - 0
src/main/java/com/ydtech/modules/order/constants/QuoteNumberConstant.java

@@ -0,0 +1,89 @@
+package com.ydtech.modules.order.constants;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import com.ydtech.modules.order.entity.vo.QuoteNumRedisVo;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.var;
+import net.minidev.json.JSONArray;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ScanOptions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class QuoteNumberConstant {
+    public static final String QUOTE_NUMBER_KEY = "QUOTE_NUMBER_";
+
+
+    //region 维护redis中的用户报价次数数据
+
+    @AllArgsConstructor
+    @Getter
+    public enum QuoteAuthorizeType{
+        ALL(0,"全部代理人"),
+        PART(1,"部分代理人");
+        private Integer code;
+        private String desc;
+    }
+
+
+    @AllArgsConstructor
+    @Getter
+    public enum QuoteAction{
+        QUOTE_FAILED(0,"报价失败"),
+        QUOTE_SUCCESS(1,"报价成功"),
+        DATE_DEAL(2,"重复投保处理"),
+        TRANSFER_INSRUANCE(3,"转投保");
+        private Integer code;
+        private String desc;
+
+        public static String getByCode(String code){
+            for(var item : values()){
+                if(item.getCode().toString().equals(code)){
+                    return item.desc;
+                }
+            }
+            return "";
+        }
+    }
+
+    @AllArgsConstructor
+    @Getter
+    public enum QuoteResult{
+        FAIL(0,"报价失败"),
+        SUCCESS(1,"报价成功"),
+        QUOTE_NUM_NOT_ENOUGH(2,"次数不足"),;
+        private Integer code;
+        private String desc;
+        public static String getByCode(String code){
+            for(var item : values()){
+                if(item.getCode().toString().equals(code)){
+                    return item.desc;
+                }
+            }
+            return "";
+        }
+    }
+
+    @AllArgsConstructor
+    @Getter
+    public enum QuoteStatus{
+        FAIL(0,"报价失败"),
+        SUCCESS(1,"重复投保"),
+        QUOTE_NUM_NOT_ENOUGH(2,"次数不足"),;
+        private Integer code;
+        private String desc;
+        public static String getByCode(String code){
+            for(var item : values()){
+                if(item.getCode().toString().equals(code)){
+                    return item.desc;
+                }
+            }
+            return "";
+        }
+    }
+
+}

+ 31 - 0
src/main/java/com/ydtech/modules/order/controller/ExternalOrderController.java

@@ -20,6 +20,7 @@ import com.ydtech.modules.order.service.InsTaskImagesService;
 import com.ydtech.modules.protocol.entity.po.PtlAgreement;
 import com.ydtech.modules.protocol.service.PtlAgreementService;
 import com.ydtech.modules.protocols.entity.po.PtlAgreementProductCostsNew;
+import com.ydtech.modules.protocols.entity.vo.InquiryNowFeeQueryVo;
 import com.ydtech.modules.protocols.service.PtlAgreementProductCostsNewService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -28,6 +29,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
 import java.util.Objects;
 
 import static com.ydtech.modules.base.model.vo.PageVo.buildPageRequest;
@@ -205,6 +207,8 @@ public class ExternalOrderController {
         externalOrderFeeVo.blank();
         ExternalOrderFeeVo resultExternalOrderFeeVo = feeRuleSchemeNewService.calcCostsExternalExportData(ptlAgreement, noInquiryNowFee, externalOrderFeeVo);
 
+        resultExternalOrderFeeVo.setCostId(noInquiryNowFee!=null?noInquiryNowFee.getId():"");
+
         return HttpResult.ok(resultExternalOrderFeeVo);
     }
 
@@ -214,4 +218,31 @@ public class ExternalOrderController {
 
         return insOrdersService.delExternalOrder(insOrdersEditingVo)? HttpResult.ok("删除成功") : HttpResult.error("删除失败");
     }
+
+    /**
+     * 外部订单非现询费用
+     */
+    @PostMapping("/externalInquiryNowFeeOrderFee")
+    @ApiOperation("外部订单非现询费用")
+    public HttpResult<Object> externalInquiryNowFeeOrderFee(@RequestBody ExternalOrderFeeVo externalOrderFeeVo){
+        PtlAgreement ptlAgreement = ptlAgreementService.getById(externalOrderFeeVo.getAgreementId());
+        ProductsType productsType = InsuranceRisk.determineInsuranceInformation(externalOrderFeeVo.getKinds(), externalOrderFeeVo.getRisks());
+        externalOrderFeeVo.setProductCode(productsType.getCode());
+        InquiryNowFeeQueryVo inquiryNowFeeQueryVo =new InquiryNowFeeQueryVo();
+        inquiryNowFeeQueryVo.setAgreementId(externalOrderFeeVo.getAgreementId());
+        inquiryNowFeeQueryVo.setProductId(productsType.getCode());
+        List<PtlAgreementProductCostsNew> inquiryNowFeeList = ptlAgreementProductCostsNewService.getInquiryNowFee(inquiryNowFeeQueryVo);
+        PtlAgreementProductCostsNew noInquiryNowFee =  new PtlAgreementProductCostsNew();
+        if(inquiryNowFeeList == null || inquiryNowFeeList.size()==0){
+            throw new SystemException("不存在非现询费用");
+        }else{
+            noInquiryNowFee = inquiryNowFeeList.get(0);
+        }
+        externalOrderFeeVo.blank();
+        ExternalOrderFeeVo resultExternalOrderFeeVo = feeRuleSchemeNewService.calcCostsExternalExportData(ptlAgreement, noInquiryNowFee, externalOrderFeeVo);
+
+        resultExternalOrderFeeVo.setCostId(noInquiryNowFee!=null?noInquiryNowFee.getId():"");
+
+        return HttpResult.ok(resultExternalOrderFeeVo);
+    }
 }

+ 151 - 0
src/main/java/com/ydtech/modules/order/controller/QuoteConfigController.java

@@ -0,0 +1,151 @@
+package com.ydtech.modules.order.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.esm.model.vo.res.EsmInsCompanyResVo;
+import com.ydtech.modules.esm.service.EsmInsCompanyService;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
+import com.ydtech.modules.order.entity.po.SysQuoteUserConfigAppend;
+import com.ydtech.modules.order.entity.vo.QuoteDetailsQueryVo;
+import com.ydtech.modules.order.entity.vo.QuoteDetailsVo;
+import com.ydtech.modules.order.entity.vo.QuoteNumRedisVo;
+import com.ydtech.modules.order.service.SysQuoteConfigService;
+import com.ydtech.modules.order.service.SysQuoteRedisService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+
+@Api(tags = "报价次数配置")
+@RestController
+@RequestMapping(value = "/quoteConfig")
+public class QuoteConfigController extends BaseController {
+
+    @Autowired
+    SysQuoteConfigService sysQuoteConfigService;
+
+    @Autowired
+    SysQuoteRedisService sysQuoteRedisService;
+
+    @Autowired
+    EsmInsCompanyService esmInsCompanyService;
+
+    @GetMapping(value = "/getQuoteConfigInfo")
+    @ApiOperation(value = "获取报价配置信息")
+    public HttpResult getQuoteConfigInfo(String companyId){
+        SysQuoteConfig quoteConfigInfo = sysQuoteConfigService.getQuoteConfigInfo(companyId);
+        return HttpResult.ok(quoteConfigInfo);
+    }
+
+    @PostMapping(value = "setQuoteInfo")
+    @ApiOperation(value = "设置报价配置信息")
+    public HttpResult setQuoteInfo(@RequestBody SysQuoteConfig sysQuoteConfig){
+
+        return sysQuoteConfigService.setQuoteInfo(sysQuoteConfig) ? HttpResult.ok("设置报价配置成功") : HttpResult.error("设置报价配置失败");
+    }
+
+    @PostMapping(value = "syncQuoteInfo")
+    @ApiOperation(value = "同步报价配置信息")
+    public HttpResult syncQuoteInfo(@RequestBody SysQuoteConfig sysQuoteConfig){
+        List<EsmInsCompanyResVo> esmInsCompanyResVos = esmInsCompanyService.liveCompanyList();
+        esmInsCompanyResVos.forEach(item->{
+            sysQuoteConfig.setCompanyId(item.getId());
+            sysQuoteConfigService.setQuoteInfo(sysQuoteConfig);
+        });
+        return HttpResult.ok("同步配置成功");
+    }
+
+    @PostMapping(value = "appendUserConfig")
+    @ApiOperation(value = "用户配置追加配置信息")
+    public HttpResult appendUserCOnfig(@RequestBody SysQuoteUserConfigAppend sysQuoteUserConfigAppend){
+        return sysQuoteConfigService.quoteConfigAppend(sysQuoteUserConfigAppend)? HttpResult.ok("设置用户配置成功") : HttpResult.error("设置用户配置失败");
+    }
+
+    @PostMapping(value = "quoteDetails")
+    @ApiOperation(value = "报价明细")
+    public HttpResult quoteDetails(@RequestBody QuoteDetailsQueryVo quoteDetailsQueryVo){
+        Page page = buildPageRequest(quoteDetailsQueryVo.getPageDto());
+        Page<QuoteDetailsVo> quoteRecordPage = sysQuoteConfigService.getQuoteRecordPage(page, quoteDetailsQueryVo);
+        return HttpResult.ok(quoteRecordPage);
+    }
+
+    @PostMapping(value = "quoteUserDetails")
+    @ApiOperation(value = "报价信息")
+    public HttpResult quoteUserDetails(@RequestBody QuoteDetailsQueryVo quoteDetailsQueryVo){
+        Page page = buildPageRequest(quoteDetailsQueryVo.getPageDto());
+        Page<QuoteDetailsVo> quoteDetails = sysQuoteConfigService.getQuoteDetails(page, quoteDetailsQueryVo);
+        return HttpResult.ok(quoteDetails);
+    }
+
+    @PostMapping(value = "quoteRequestDetail")
+    @ApiOperation(value = "报价请求明细")
+    public HttpResult quoteRequestDetail(@RequestBody QuoteDetailsQueryVo quoteDetailsQueryVo){
+        Page page = buildPageRequest(quoteDetailsQueryVo.getPageDto());
+        Page<QuoteDetailsVo> quoteRecordPage = sysQuoteConfigService.getQuoteRecordPage(page, quoteDetailsQueryVo);
+        return HttpResult.ok(quoteRecordPage);
+    }
+
+    @PostMapping(value = "getAppendUserQuotePage")
+    @ApiOperation(value = "用户追加报价次数信息")
+    public HttpResult getAppendUserQuotePage(@RequestBody QuoteDetailsQueryVo quoteDetailsQueryVo){
+        Page page = buildPageRequest(quoteDetailsQueryVo.getPageDto());
+        Page<QuoteDetailsVo> quoteDetails = sysQuoteConfigService.getAppendUserQuote(page, quoteDetailsQueryVo);
+        return HttpResult.ok(quoteDetails);
+    }
+
+    @GetMapping(value = "getQuoteAction")
+    @ApiModelProperty(value = "获取报价动作字典")
+    public HttpResult getQuoteAction(){
+        JSONArray resultArray = new JSONArray();
+        for (QuoteNumberConstant.QuoteAction value : QuoteNumberConstant.QuoteAction.values()) {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("code",value.getCode());
+            jsonObject.put("desc",value.getDesc());
+            resultArray.add(jsonObject);
+        }
+        return HttpResult.ok(resultArray);
+    }
+
+    @GetMapping(value = "getQuoteResult")
+    @ApiModelProperty(value = "获取报价结果字典")
+    public HttpResult getQuoteResult(){
+        JSONArray resultArray = new JSONArray();
+        for (QuoteNumberConstant.QuoteResult value : QuoteNumberConstant.QuoteResult.values()) {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("code",value.getCode());
+            jsonObject.put("desc",value.getDesc());
+            resultArray.add(jsonObject);
+        }
+        return HttpResult.ok(resultArray);
+    }
+
+    @GetMapping(value = "getRedisData")
+    public HttpResult getRedisData(String userId) {
+        QuoteNumRedisVo quoteNumberRedisData = sysQuoteRedisService.getQuoteNumberRedisData(userId);
+        return HttpResult.ok(JSONObject.toJSON(quoteNumberRedisData));
+    }
+
+    @PostMapping(value = "setRedisData")
+    public HttpResult setRedisData(@RequestBody JSONObject jsonObject) {
+        String userId = jsonObject.getString("userId");
+        QuoteNumRedisVo data = jsonObject.getJSONObject("data").toJavaObject(QuoteNumRedisVo.class);
+        sysQuoteRedisService.setQuoteRecordRedis(userId,data);
+        return HttpResult.ok("设置成功");
+    }
+
+    @GetMapping(value = "delRedisData")
+    public HttpResult delRedisData(String userId){
+        sysQuoteRedisService.delQuoteRedis(userId);
+        return HttpResult.ok("");
+    }
+
+}

+ 1 - 1
src/main/java/com/ydtech/modules/order/controller/YangGuangOrderApiController.java

@@ -87,7 +87,7 @@ public class YangGuangOrderApiController {
 
     @PostMapping("/autoWriteOff")
     @ApiOperation("投保单撤销")
-    public boolean autoWriteOff(@RequestSingleParam(value = "companyId") String companyId) throws Exception {
+    public HttpResult<Object> autoWriteOff(@RequestSingleParam(value = "companyId") String companyId) throws Exception {
         return this.yangGuangOrderApiService.autoWriteOff(companyId);
     }
 

+ 8 - 0
src/main/java/com/ydtech/modules/order/dao/InsOrdersMapper.java

@@ -183,4 +183,12 @@ public interface InsOrdersMapper extends BaseMapper<InsOrders> {
             @Param("type") Integer code,
             @Param("flag") Boolean flag
     );
+
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/12/16 10:34
+     *  @Description: 更新空值
+     */
+    boolean updateWithNull(InsOrders insOrders);
 }

+ 15 - 0
src/main/java/com/ydtech/modules/order/dao/SysQuoteConfigMapper.java

@@ -0,0 +1,15 @@
+package com.ydtech.modules.order.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import com.ydtech.modules.order.entity.vo.dajia.InsAccidentalDrivingDajia;
+
+/**
+ * @author Administrator
+ * @description 针对表【ins_accidental_driving(驾意险)】的数据库操作Mapper
+ * @createDate 2023-03-09 14:45:58
+ * @Entity generator.domain.InsAccidentalDriving
+ */
+public interface SysQuoteConfigMapper extends BaseMapper<SysQuoteConfig> {
+
+}

+ 30 - 0
src/main/java/com/ydtech/modules/order/dao/SysQuoteRecordMapper.java

@@ -0,0 +1,30 @@
+package com.ydtech.modules.order.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
+import com.ydtech.modules.order.entity.po.SysQuoteUser;
+import com.ydtech.modules.order.entity.vo.QuoteDetailsQueryVo;
+import com.ydtech.modules.order.entity.vo.QuoteDetailsVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author Administrator
+ * @description 针对表【ins_accidental_driving(驾意险)】的数据库操作Mapper
+ * @createDate 2023-03-09 14:45:58
+ * @Entity generator.domain.InsAccidentalDriving
+ */
+public interface SysQuoteRecordMapper extends BaseMapper<SysQuoteRecord> {
+    public boolean insertBatch(List<SysQuoteRecord> list);
+
+    public Page<QuoteDetailsVo> getQuoteRecordPage(Page page, @Param("param") QuoteDetailsQueryVo quoteDetailsQueryVo);
+
+    public Page<QuoteDetailsVo> getQuoteRequestRecordPage(Page page,@Param("param") QuoteDetailsQueryVo quoteDetailsQueryVo);
+
+    public Page<QuoteDetailsVo> getQuoteDetails(Page page, @Param("param") QuoteDetailsQueryVo quoteDetailsQueryVo);
+
+    public BigDecimal getQuoteRatio(@Param("userId") String userId, @Param("companyId") String companyId);
+}

+ 21 - 0
src/main/java/com/ydtech/modules/order/dao/SysQuoteUserConfigAppendMapper.java

@@ -0,0 +1,21 @@
+package com.ydtech.modules.order.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import com.ydtech.modules.order.entity.po.SysQuoteUserConfigAppend;
+import com.ydtech.modules.order.entity.vo.QuoteDetailsQueryVo;
+import com.ydtech.modules.order.entity.vo.QuoteDetailsVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author Administrator
+ * @description 针对表【ins_accidental_driving(驾意险)】的数据库操作Mapper
+ * @createDate 2023-03-09 14:45:58
+ * @Entity generator.domain.InsAccidentalDriving
+ */
+public interface SysQuoteUserConfigAppendMapper extends BaseMapper<SysQuoteUserConfigAppend> {
+    public Page<QuoteDetailsVo> getAppendUserQuote(Page page,@Param("param") QuoteDetailsQueryVo quoteDetailsQueryVo);
+}

+ 19 - 0
src/main/java/com/ydtech/modules/order/dao/SysQuoteUserMapper.java

@@ -0,0 +1,19 @@
+package com.ydtech.modules.order.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import com.ydtech.modules.order.entity.po.SysQuoteUser;
+
+import java.util.List;
+
+/**
+ * @author Administrator
+ * @description 针对表【ins_accidental_driving(驾意险)】的数据库操作Mapper
+ * @createDate 2023-03-09 14:45:58
+ * @Entity generator.domain.InsAccidentalDriving
+ */
+public interface SysQuoteUserMapper extends BaseMapper<SysQuoteUser> {
+    public boolean insertBatch(List<SysQuoteUser> list);
+
+    public List<SysQuoteConfig> getQuoteUserConfig(String userId);
+}

+ 1 - 1
src/main/java/com/ydtech/modules/order/entity/InsAreaCompany.java

@@ -582,7 +582,7 @@ public class InsAreaCompany implements Serializable {
      * 交商含增值服务合并经营成本率 阳光使用
      */
     @TableField(value = "merge_cost_rate")
-    private Double mergeCostRate;
+    private String mergeCostRate;
 
     //入口总金额
     @TableField(exist = false)

+ 6 - 0
src/main/java/com/ydtech/modules/order/entity/InsAreaCompanyExternalFee.java

@@ -49,6 +49,12 @@ public class InsAreaCompanyExternalFee implements Serializable {
     @TableField(value = "no_other_costs_proportion")
     private BigDecimal noOtherCostsProportion;
 
+    @TableField(value = "cost_id")
+    private String  costId;
+
+    @TableField(value = "cost_flag")
+    private String  costFlag;
+
 
     public BigDecimal getJqSuperviseCostsProportion() {
         return jqSuperviseCostsProportion == null ? BigDecimal.ZERO : jqSuperviseCostsProportion;

+ 1 - 1
src/main/java/com/ydtech/modules/order/entity/api/bohai/response/UnderwritingResponse.java

@@ -186,7 +186,7 @@ public class UnderwritingResponse extends BoHaiBaseResponse {
             private static final String MESSAGES = "核保成功";
 
             public DrivingInsuranceDto toDrivingInsuranceDto() {
-                if (!MESSAGES.equals(this.getResultMsg())) {
+                if (StringUtils.isEmpty(this.getApplicationNo())) {
                     throw new SystemException(this.getResultMsg());
                 }
 

+ 3 - 3
src/main/java/com/ydtech/modules/order/entity/api/chengtai/constants/ImageTypeEnum.java

@@ -19,21 +19,21 @@ public enum ImageTypeEnum {
     }),
 
     IT_2("2", "车主身份证正面",new String[]{
-            InsuranceImageEnum.C02.getCode(),
+            InsuranceImageEnum.C02.getCode(), InsuranceImageEnum.Y02.getCode()
     }),
     IT_3("3", "车主身份证反面",new String[]{
             InsuranceImageEnum.D02.getCode(),
     }),
 
     IT_4("4", "投保人身份证正面",new String[]{
-            InsuranceImageEnum.C03.getCode(),
+            InsuranceImageEnum.C03.getCode(), InsuranceImageEnum.Y03.getCode()
     }),
     IT_5("5", "投保人身份证反面",new String[]{
             InsuranceImageEnum.D03.getCode(),
     }),
 
     IT_6("6", "被保人身份证正面",new String[]{
-            InsuranceImageEnum.C04.getCode(),
+            InsuranceImageEnum.C04.getCode(), InsuranceImageEnum.Y04.getCode()
     }),
     IT_7("7", "被保人身份证反面",new String[]{
             InsuranceImageEnum.D04.getCode(),

+ 26 - 4
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ArrayUtil;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ydtech.constants.enums.InsuranceRisk;
+import com.ydtech.exception.SystemException;
 import com.ydtech.modules.admin.model.vo.PersonAreaVo;
 import com.ydtech.modules.ins.model.vo.CarInfoVo;
 import com.ydtech.modules.ins.model.vo.CustomerInfoVo;
@@ -63,6 +64,18 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
         // 客户信息
         OwnerDTO owner = new OwnerDTO(quoteInfoVo.getOwnerInfo());
         this.owner = owner;
+        CustomerInfoVo policyHolderInfo = quoteInfoVo.getPolicyHolderInfo();
+        CustomerInfoVo insuredPersonInfo = quoteInfoVo.getInsuredPersonInfo();
+        if ("0".equals(policyHolderInfo.getProperty())){
+            if (StringUtils.isBlank(policyHolderInfo.getTel())){
+                throw new SystemException("诚泰公司企业报价固定电话必填!");
+            }
+        }
+        if ("0".equals(insuredPersonInfo.getProperty())){
+            if (StringUtils.isBlank(insuredPersonInfo.getTel())){
+                throw new SystemException("诚泰公司企业报价固定电话必填!");
+            }
+        }
         // 交强险
         Boolean isJq = InsuranceRisk.getFlagByTRAFFIC(quoteInfoVo.getRiskList());
         if (isJq){
@@ -658,9 +671,12 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
                 this.identifyValidEndDate = ownerInfo.getIdentifyValidEndDate();
                 this.longTerm = "0";
             }else{
+                if (StringUtils.isBlank(ownerInfo.getTel())){
+                    throw new SystemException("诚泰公司企业报价固定电话必填!");
+                }
                 this.type = "2"; // 机构
-                this.identifyTypeCode = "3";
-                this.identifyTypeName = "营业执照";
+                this.identifyTypeCode = "4";
+                this.identifyTypeName = "统一社会信用代码";
                 this.identifyNumber = ownerInfo.getOrganizationCode();
             }
             this.isTerror = "0";
@@ -826,6 +842,7 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
 
             public TaxDTO(BaseQuoteInfoVo quoteInfoVo){
 
+                CustomerInfoVo ownerInfo = quoteInfoVo.getOwnerInfo();
                 VehicleAndVesselTax vehicleAndVesselTax = quoteInfoVo.getVehicleAndVesselTax();
                 TaxConditionCodeEnum taxConditionCodeEnum = Enum.valueOf(TaxConditionCodeEnum.class, "T_" + vehicleAndVesselTax.getTaxRelifFlag());
                 this.taxConditionCode = taxConditionCodeEnum.getCode();
@@ -837,8 +854,13 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
                     }
                 }
                 this.calculateMode = "1";
-                this.taxPayerIdentityNo = vehicleAndVesselTax.getIdentifyNumber();
-                this.taxPayerIdentificationCode = vehicleAndVesselTax.getIdentifyNumber();
+                if(StringUtils.isBlank(ownerInfo.getProperty()) || !"0".equals(ownerInfo.getProperty())){
+                    this.taxPayerIdentityNo = vehicleAndVesselTax.getIdentifyNumber();
+                    this.taxPayerIdentificationCode = vehicleAndVesselTax.getIdentifyNumber();
+                }else{
+                    this.taxPayerIdentityNo = vehicleAndVesselTax.getOrganizationCode();
+                    this.taxPayerIdentificationCode = vehicleAndVesselTax.getOrganizationCode();
+                }
                 this.taxPayerName = vehicleAndVesselTax.getTaxpayerName();
                 Calendar calendar = Calendar.getInstance();
                 int year = calendar.get(Calendar.YEAR);

+ 4 - 4
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/SubmitVerifyRequest.java

@@ -100,10 +100,10 @@ public class SubmitVerifyRequest extends ChengTaiBaseRequest{
             CustomerInfoVo applyInfo = JSON.toJavaObject(insOrders.getApplyinfo(),CustomerInfoVo.class);
             if("0".equals(applyInfo.getProperty())){
                 this.type = "2";
-                this.identifyTypeCode = "1";
+                this.identifyTypeCode = "4";
                 this.identifyNumber = applyInfo.getOrganizationCode();
                 this.organizationCode = applyInfo.getOrganizationCode();
-                this.tel = applyInfo.getMobile();
+                this.tel = applyInfo.getTel();
                 this.linkerName = applyInfo.getName();
                 this.unitTypeCode = "900"; // 单位性质 900:其他
             }else{
@@ -177,10 +177,10 @@ public class SubmitVerifyRequest extends ChengTaiBaseRequest{
             CustomerInfoVo insureInfo = JSON.toJavaObject(insOrders.getInsureinfo(),CustomerInfoVo.class);
             if("0".equals(insureInfo.getProperty())){
                 this.type = "2";
-                this.identifyTypeCode = "1";
+                this.identifyTypeCode = "4";
                 this.identifyNumber = insureInfo.getOrganizationCode();
                 this.organizationCode = insureInfo.getOrganizationCode();
-                this.tel = insureInfo.getMobile();
+                this.tel = insureInfo.getTel();
                 this.linkerName = insureInfo.getName();
                 this.unitTypeCode = "900"; // 单位性质 900:其他
             }else{

+ 17 - 9
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/UploadFileRequest.java

@@ -46,20 +46,28 @@ public class UploadFileRequest extends ChengTaiBaseRequest{
             if(contains){
                 this.imageType = imageTypeEnum.getCode();
                 this.fileList = Arrays.asList(new FileListDTO(insTaskImagesBase64, imageTypeEnum));
-                if(InsuranceImageEnum.C01.getCode().equals(this.imageType)
-                        || InsuranceImageEnum.D01.getCode().equals(this.imageType)
-                        || InsuranceImageEnum.C02.getCode().equals(this.imageType)
-                        || InsuranceImageEnum.D02.getCode().equals(this.imageType)
-                ){
+                if(InsuranceImageEnum.C01.getCode().equals(this.imageType)){
                     this.imageObjType = "1";
-                }else if(InsuranceImageEnum.C03.getCode().equals(this.imageType)
-                        || InsuranceImageEnum.D03.getCode().equals(this.imageType)
+                }else if(InsuranceImageEnum.D01.getCode().equals(this.imageType)){
+                    this.imageObjType = "11";
+                }else if(InsuranceImageEnum.C02.getCode().equals(this.imageType)
+                    || InsuranceImageEnum.Y02.getCode().equals(this.imageType)
                 ){
                     this.imageObjType = "2";
+                } else if(InsuranceImageEnum.D02.getCode().equals(this.imageType)){
+                    this.imageObjType = "3";
+                } else if(InsuranceImageEnum.C03.getCode().equals(this.imageType)
+                        || InsuranceImageEnum.Y03.getCode().equals(this.imageType)
+                ){
+                    this.imageObjType = "4";
+                } else if(InsuranceImageEnum.D03.getCode().equals(this.imageType)){
+                    this.imageObjType = "5";
                 } else if(InsuranceImageEnum.C04.getCode().equals(this.imageType)
-                        || InsuranceImageEnum.D04.getCode().equals(this.imageType)
+                        || InsuranceImageEnum.Y04.getCode().equals(this.imageType)
                 ){
-                    this.imageObjType = "3";
+                    this.imageObjType = "6";
+                } else if(InsuranceImageEnum.D04.getCode().equals(this.imageType)){
+                    this.imageObjType = "7";
                 }
                 break;
             }

+ 1 - 1
src/main/java/com/ydtech/modules/order/entity/api/yangguang/constants/KindListEnum.java

@@ -11,7 +11,7 @@ public enum KindListEnum {
     KIND_LIST_20B("20B", "商业第三者责任险","主险。固定值:5万/10万/15万/20万/30万/50万/100万/150万/200万/300万/500万"),
     KIND_LIST_20C1("20C1", "司机座位责任险","主险。总保额=单位保额数"),
     KIND_LIST_20C2("20C2", "乘客座位责任险","主险。总保额=单位保额数*座位数"),
-    KIND_LIST_20F6("20FD", "车损险事故免赔率特约条款 (2020条款)","附加险,绝对免赔率在5%、10%、15%、20%,(主险:20A);传值:0.05,0.1,0.15,0.2"),
+    KIND_LIST_20FD("20FD", "车损险事故免赔率特约条款 (2020条款)","附加险,绝对免赔率在5%、10%、15%、20%,(主险:20A);传值:0.05,0.1,0.15,0.2"),
     KIND_LIST_20FE("20FE", "三者险事故免赔率特约条款 (2020条款)","附加险,绝对免赔率在5%、10%、15%、20%(主险:20B);传值:0.05,0.1,0.15,0.2"),
     KIND_LIST_20FF("20FF", "司机车上人员事故免赔率特约条款 (2020条款)","附加险,绝对免赔率在5%、10%、15%、20%(主险:20C1);传值:0.05,0.1,0.15,0.2"),
     KIND_LIST_20FG("20FG", "乘客车上人员事故免赔率特约条款 (2020条款)","附加险,绝对免赔率在5%、10%、15%、20%(主险:20C1);传值:0.05,0.1,0.15,0.2"),

+ 5 - 1
src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangGetNonVehicleProductsRequest.java

@@ -3,6 +3,7 @@ package com.ydtech.modules.order.entity.api.yangguang.request;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.annotation.JSONField;
 import com.ydtech.modules.order.entity.InsOrders;
+import com.ydtech.modules.order.entity.api.yangguang.constants.YangGuangCarType;
 import com.ydtech.modules.order.entity.api.yangguang.constants.YgUseNatureCodeMapping;
 import com.ydtech.modules.order.entity.config.YangGuangConfigureParameters;
 import lombok.Data;
@@ -105,7 +106,10 @@ public class YangGuangGetNonVehicleProductsRequest extends YangGuangBaseRequest
         if (useNatureCode != null) {
             this.UseNatureCode = YgUseNatureCodeMapping.getYgUseNatureCode(useNatureCode);
         }
-        this.VehicleType = jsonObject.getString("cimodelclass");
+        String cartype = jsonObject.getString("cartype");
+        //车辆种类
+        YangGuangCarType yangGuangCarType = Enum.valueOf(YangGuangCarType.class,cartype);
+        this.VehicleType = yangGuangCarType.getCode();
         this.LicenseCategory = jsonObject.getString("cartype");
         this.Toncount = jsonObject.getString("seatCount");
     }

+ 4 - 0
src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangSubmitRequest.java

@@ -243,12 +243,15 @@ public class YangGuangSubmitRequest extends YangGuangBaseRequest{
          public CustomerList(InsOrders insOrders,boolean flag) {
             String addrapply= insOrders.getApplyinfo().getString("addr");
             String addrinsurer = insOrders.getInsureinfo().getString("addr");
+            String codeapply = insOrders.getApplyinfo().getString("organizationCode");
+            String codeinsurer = insOrders.getInsureinfo().getString("organizationCode");
              if (flag) {
                     this.customerFlag = "1";
                     this.Taxpayertype = "2";
                     this.Vatinvoiceflag = "0";
                     this.Revenueaddress = addrapply;
                     this.InsuredFlag = "2";
+                    this.Taxpayernumber = codeapply;
              }
              if (!flag) {
                     this.customerFlag = "0";
@@ -256,6 +259,7 @@ public class YangGuangSubmitRequest extends YangGuangBaseRequest{
                     this.Vatinvoiceflag = "0";
                     this.Revenueaddress = addrinsurer;
                     this.InsuredFlag = "1";
+                    this.Taxpayernumber = codeinsurer;
              }
         }
         public static List<YangGuangSubmitRequest.CustomerList> toCustomerList(InsOrders insOrders) {

+ 17 - 17
src/main/java/com/ydtech/modules/order/entity/api/yangguang/response/YangGuangBaseResponse.java

@@ -20,21 +20,21 @@ public class YangGuangBaseResponse {
     @JsonProperty("ResponseDate")
     private String ResponseDate;
 
-    public String message(String ErrorMessage) {
-        try {
-            ObjectMapper objectMapper = new ObjectMapper();
-            JsonNode rootNode = objectMapper.readTree(ErrorMessage);
-            JsonNode hintNode = rootNode.get("hint");
-            if (hintNode != null) {
-                JsonNode systemMsgNode = hintNode.get("systemMsg");
-                if (systemMsgNode.isArray() && systemMsgNode.size() > 0) {
-                    JsonNode firstSystemMsg = systemMsgNode.get(0);
-                    return firstSystemMsg.get("info").asText();
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
+//    public String message(String ErrorMessage) {
+//        try {
+//            ObjectMapper objectMapper = new ObjectMapper();
+//            JsonNode rootNode = objectMapper.readTree(ErrorMessage);
+//            JsonNode hintNode = rootNode.get("hint");
+//            if (hintNode != null) {
+//                JsonNode systemMsgNode = hintNode.get("systemMsg");
+//                if (systemMsgNode.isArray() && systemMsgNode.size() > 0) {
+//                    JsonNode firstSystemMsg = systemMsgNode.get(0);
+//                    return firstSystemMsg.get("info").asText();
+//                }
+//            }
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//        return null;
+//    }
 }

+ 8 - 0
src/main/java/com/ydtech/modules/order/entity/crawler/request/CrawlerQuoteRequest.java

@@ -4,6 +4,8 @@ import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 @EqualsAndHashCode(callSuper = true)
 @Data
 public class CrawlerQuoteRequest extends BaseQuoteInfoVo {
@@ -47,4 +49,10 @@ public class CrawlerQuoteRequest extends BaseQuoteInfoVo {
      * 是否需要验车
      */
     private Boolean isInspect;
+
+    /**
+     * 最大报价次数
+     */
+    private Integer maxQuoteNum;
+
 }

+ 15 - 0
src/main/java/com/ydtech/modules/order/entity/crawler/response/CrawlerQuoteResponse.java

@@ -142,6 +142,18 @@ public class CrawlerQuoteResponse extends CrawlerBaseResponse {
         @JsonProperty("price")
         private String price;
 
+        /**
+         * 非车险起保时间
+         */
+        @JsonProperty("fcx_startDate")
+        private String divingInsurancesStartDate;
+
+        /**
+         * 非车险终保时间
+         */
+        @JsonProperty("fcx_endDate")
+        private String divingInsurancesEndDate;
+
         public static List<AccidentResponseVo> toAccidentResponseVoList(List<DivingInsurancesDto> drivingInsurances) {
             return drivingInsurances.stream().map(DivingInsurancesDto::toAccidentResponseVo).collect(Collectors.toList());
         }
@@ -314,6 +326,9 @@ public class CrawlerQuoteResponse extends CrawlerBaseResponse {
         @JsonProperty("upimage_url")
         private String upimageUrl;
 
+        @JsonProperty("maxQuoteNum")
+        private String maxQuoteNum;
+
         public String getDiscount() {
             return StringUtils.isEmpty(discount) ? "0" : discount;
         }

+ 91 - 0
src/main/java/com/ydtech/modules/order/entity/po/SysQuoteConfig.java

@@ -0,0 +1,91 @@
+package com.ydtech.modules.order.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.order.entity.api.pingan.response.QuoteResponse;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * 
+ * @TableName sys_quote_config
+ */
+@TableName(value ="sys_quote_config")
+@Data
+public class SysQuoteConfig implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId
+    private String id;
+
+    /**
+     * 保险公司id
+     */
+    @TableField(value = "company_id")
+    private String companyId;
+
+    /**
+     * 是否开启
+     */
+    @TableField(value = "is_enabled")
+    private Integer isEnabled;
+
+    /**
+     * 每天最大报价次数
+     */
+    @TableField(value = "day_max_quote_num")
+    private Integer dayMaxQuoteNum;
+
+    /**
+     * 每车最大报价次数
+     */
+    @TableField(value = "car_max_quote_num")
+    private Integer carMaxQuoteNum;
+
+    /**
+     * 订单比率
+     */
+    @TableField(value = "order_ratio")
+    private BigDecimal orderRatio;
+
+    /**
+     * 授权类型 0 全部代理人  1部分代理人
+     */
+    @TableField(value = "authorize")
+    private Integer authorize;
+
+    @TableField(value = "create_time")
+    private LocalDateTime createTime;
+
+    @TableField(value = "create_by")
+    private String createBy;
+
+    @TableField(value = "update_time")
+    private LocalDateTime updateTime;
+
+    @TableField(value = "update_by")
+    private String updateBy;
+
+    /**
+     * 代理人id list
+     */
+    @TableField(exist = false)
+    List<SysUser> proxyList;
+
+    public SysQuoteConfig(){
+        if(Objects.isNull(proxyList)){
+            this.proxyList = new ArrayList<>();
+        }
+    }
+
+}

+ 80 - 0
src/main/java/com/ydtech/modules/order/entity/po/SysQuoteRecord.java

@@ -0,0 +1,80 @@
+package com.ydtech.modules.order.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
+import com.ydtech.utils.idgen.IdGenerate;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 
+ * @TableName sys_quote_user
+ */
+@TableName(value ="sys_quote_record")
+@Data
+@NoArgsConstructor
+public class SysQuoteRecord implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId
+    private String id;
+
+    @TableField(value = "user_id")
+    private String userId;
+
+    @TableField(value = "company_id")
+    private String companyId;
+
+    @TableField(value = "sub_order_no")
+    private String subOrderNo;
+
+    @TableField(value = "license_no")
+    private String licenseNo;
+
+    @TableField(value = "action")
+    private String action;
+
+    @TableField(value = "result")
+    private String result;
+
+    @TableField(value = "status")
+    private Integer status;
+
+    @TableField(value = "agent")
+    private String agent;
+
+    @TableField(value = "operator")
+    private String operator;
+
+    @TableField(value = "create_time")
+    private LocalDateTime createTime;
+
+    public SysQuoteRecord(BaseQuoteInfoVo quoteInfoVo,String action,String result){
+        this.id = IdGenerate.nextId();
+        this.userId = quoteInfoVo.getUserid();
+        this.companyId = quoteInfoVo.getOrderCompanyId();
+        this.licenseNo = quoteInfoVo.getCarInfo().getLicenseNo();
+
+
+    }
+
+    public SysQuoteRecord(String userId,String companyId,String licenseNo,String action,String result){
+        this.id = IdGenerate.nextId();
+        this.userId = userId;
+        this.companyId = companyId;
+        this.licenseNo = licenseNo;
+        this.action = action;
+        this.result = result;
+        this.operator = BaseController.getUserId();
+        this.createTime = LocalDateTime.now();
+
+    }
+}

+ 55 - 0
src/main/java/com/ydtech/modules/order/entity/po/SysQuoteUser.java

@@ -0,0 +1,55 @@
+package com.ydtech.modules.order.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ydtech.modules.order.entity.api.pingan.response.QuoteResponse;
+import com.ydtech.utils.idgen.IdGenerate;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 
+ * @TableName sys_quote_user
+ */
+@TableName(value ="sys_quote_user")
+@Data
+public class SysQuoteUser implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId
+    private String id;
+
+    @TableField(value = "config_id")
+    private String configId;
+
+    @TableField(value = "user_id")
+    private String userId;
+
+    public SysQuoteUser(String configId,String userId){
+        this.id = IdGenerate.nextId();
+        this.configId = configId;
+        this.userId = userId;
+    }
+
+    public SysQuoteUser(){
+
+    }
+
+
+
+    public static List<SysQuoteUser> getSysQuoteUserList(String configId,List<String> userIds){
+        List<SysQuoteUser> sysQuoteConfigs = new ArrayList<>();
+        userIds.forEach(user->{
+            SysQuoteUser sysQuoteUser = new SysQuoteUser(configId,user);
+            sysQuoteConfigs.add(sysQuoteUser);
+        });
+        return sysQuoteConfigs;
+    }
+}

+ 80 - 0
src/main/java/com/ydtech/modules/order/entity/po/SysQuoteUserConfigAppend.java

@@ -0,0 +1,80 @@
+package com.ydtech.modules.order.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 
+ * @TableName sys_quote_user_config_append
+ */
+@TableName(value ="sys_quote_user_config_append")
+@Data
+public class SysQuoteUserConfigAppend implements Serializable {
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+
+    @TableField(value = "user_id")
+    private String userId;
+
+    /**
+     * 保险公司id
+     */
+    @TableField(value = "company_id")
+    private String companyId;
+
+    /**
+     * 每天最大报价次数
+     */
+    @TableField(value = "day_max_quote_num")
+    private Integer dayMaxQuoteNum;
+
+    /**
+     * 每车最大报价次数
+     */
+    @TableField(value = "car_max_quote_num")
+    private Integer carMaxQuoteNum;
+
+    @TableField(exist = false)
+    private Integer quoteNumber;
+
+    /**
+     * 订单比率
+     */
+    @TableField(value = "order_ratio")
+    private BigDecimal orderRatio;
+
+    /**
+     * 备注
+     */
+    @TableField(value = "remark")
+    private String remark;
+
+    @TableField(value = "start_time")
+    private LocalDateTime startTime;
+
+    @TableField(value = "end_time")
+    private LocalDateTime endTime;
+
+    @TableField(value = "create_time")
+    private LocalDateTime createTime;
+
+    @TableField(value = "create_by")
+    private String createBy;
+
+
+    public SysQuoteUserConfigAppend(){
+        dayMaxQuoteNum = 0;
+        carMaxQuoteNum = 0;
+        orderRatio = new BigDecimal(0);
+    }
+
+}

+ 12 - 0
src/main/java/com/ydtech/modules/order/entity/vo/AuditExportVo.java

@@ -79,6 +79,18 @@ public class AuditExportVo {
     @ExcelProperty("非车保费")
     private String jypremium;
 
+    @ExcelProperty(value = "协议号")
+    private String agreementCode;
+
+    @ExcelProperty(value = "工号描述")
+    private String jobDescription;
+
+    @ExcelProperty(value = "对接人")
+    private String dockingPerson;
+
+    @ExcelProperty(value = "联系方式")
+    private String dockingPhone;
+
     @ApiModelProperty("交强出口比例")
     @ExcelProperty("交强出口比例")
     private String jqExportProportion;

+ 12 - 1
src/main/java/com/ydtech/modules/order/entity/vo/BaseQuoteVo.java

@@ -1,6 +1,5 @@
 package com.ydtech.modules.order.entity.vo;
 
-import com.alibaba.fastjson.JSONArray;
 import com.ydtech.modules.ins.model.vo.KindInfoVo;
 import com.ydtech.modules.ins.model.vo.RiskInfoVo;
 import com.ydtech.modules.order.entity.vo.guoren.GuoRenSpecialAgreementVo;
@@ -169,4 +168,16 @@ public class BaseQuoteVo<T> {
 
     @ApiModelProperty("特别约定")
     private List<GuoRenSpecialAgreementVo> guoRenSpecialAgreementVo;
+
+    //2024-11-29 新增 本次的最大报价次数
+    @ApiModelProperty("报价次数")
+    private Integer maxQuoteNum;
+
+    @ApiModelProperty("报价比例")
+    private BigDecimal quoteRatio;
+
+    // add by hxl
+    @ApiModelProperty("是否现询 1.是 2.否")
+    private String costFlag;
+
 }

+ 8 - 0
src/main/java/com/ydtech/modules/order/entity/vo/ExternalOrderFeeVo.java

@@ -91,6 +91,14 @@ public class ExternalOrderFeeVo {
     @ApiModelProperty(value = "计算的非车入口比例")
     private BigDecimal NoCostsProportion;
 
+    /**
+     *  @version
+     *  @author: hxl
+     *  @Date: 2024/12/16 12:07
+     *  @Description: 费用id
+     */
+    private String  costId;
+
 
     public void blank(){
         if(Objects.isNull(this.jqPremium)){

+ 21 - 8
src/main/java/com/ydtech/modules/order/entity/vo/InsOrdersEditingVo.java

@@ -13,15 +13,14 @@ import com.ydtech.modules.order.entity.InsBusinessInsurance;
 import com.ydtech.modules.order.entity.InsOrders;
 import com.ydtech.modules.order.entity.TaxArrears;
 import com.ydtech.modules.order.entity.dto.InsAreaCompanyQueryDto;
-import com.ydtech.utils.BigDecimalUtils;
 import com.ydtech.modules.protocol.entity.dto.PtlAgreementInsCompanyDto;
+import com.ydtech.utils.BigDecimalUtils;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
 
-import javax.persistence.NamedQueries;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -93,6 +92,22 @@ public class InsOrdersEditingVo extends InsOrders implements Serializable {
     @ApiModelProperty("现询费用id")
     private String nowCostsId;
 
+    // add  by  2024-12-16
+    @ApiModelProperty("是否现询 1.是 2.否")
+    private String costFlag;
+
+    // add  by  2024-12-17
+    @ApiModelProperty("交强出口比例")
+    private String  jqExportFee;
+
+    // add  by  2024-12-17
+    @ApiModelProperty("商业出口比例")
+    private String  syExportFee;
+
+    // add  by  2024-12-17
+    @ApiModelProperty("非车出口比例")
+    private String  noExportFee;
+
     @Data
     @AllArgsConstructor
     @NoArgsConstructor
@@ -217,9 +232,6 @@ public class InsOrdersEditingVo extends InsOrders implements Serializable {
         @ApiModelProperty("商业赔付率")
         private double syLossRation;
 
-        @ApiModelProperty("交商合并经营成本率")
-        private double mergeCostRate;
-
 
         /**
          * 紫金能源车(鼎然-车辆风险评分  add by hxl 2024-04-09
@@ -227,6 +239,9 @@ public class InsOrdersEditingVo extends InsOrders implements Serializable {
         @TableField(value = "紫金能源车(鼎然-车辆风险评分)")
         private String ubiPredictedInfoScore;
 
+        @ApiModelProperty("交商合并经营成本率")
+        private String mergeCostRate;
+
         @ApiModelProperty("交强出口费用")
         private BigDecimal jqExportFee;
 
@@ -317,15 +332,13 @@ public class InsOrdersEditingVo extends InsOrders implements Serializable {
             this.jqLossRation = insAreaCompany.getJqLossRation();
             this.syLossRation = insAreaCompany.getSyLossRation();
             this.ubiPredictedInfoScore = insAreaCompany.getUbiPredictedInfoScore();
+            this.mergeCostRate = insAreaCompany.getMergeCostRate();
             this.feeMatchErrMsg = insAreaCompany.getFeeMatchErrMsg();
             this.quoteErrMsg = insAreaCompany.getQuoteErrMsg();
             this.orderStatusInfo = InsOrderStatusEnum.matchKey(insAreaCompany.getOrderstatus()).getDesc();
             if(!Objects.isNull(insAreaCompany.getApiType())) {
                 this.apiType = insAreaCompany.getApiType().toString();
             }
-            if (insAreaCompany.getMergeCostRate() != null) {
-                this.mergeCostRate = insAreaCompany.getMergeCostRate();
-            }
         }
     }
 

+ 5 - 1
src/main/java/com/ydtech/modules/order/entity/vo/OrderQueryVo.java

@@ -11,6 +11,7 @@ import org.springframework.util.ObjectUtils;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotEmpty;
 import java.time.LocalDate;
+import java.util.List;
 
 @Data
 @ApiModel("订单查询Vo")
@@ -130,8 +131,11 @@ public class OrderQueryVo {
     @ApiModelProperty(value = "起保结束时间")
     private String attachEndDateStr;
 
+    /**
+     * @see com.ydtech.modules.admin.constants.ManagementSource
+     */
     @ApiModelProperty(value = "机构来源")
-    private String managementSource;
+    private List<String> managementSource;
 
     @ApiModelProperty(value = "签单开始时间")
     private String signStartDateStr;

+ 3 - 0
src/main/java/com/ydtech/modules/order/entity/vo/OrderVo.java

@@ -393,6 +393,9 @@ public class OrderVo implements Serializable {
     @TableField(value = "ubi_predicted_info_score")
     private String ubiPredictedInfoScore;
 
+    @TableField(value = "merge_cost_rate")
+    private String mergeCostRate;
+
 
     /**
      * 推荐人工号

+ 56 - 0
src/main/java/com/ydtech/modules/order/entity/vo/QuoteDetailsQueryVo.java

@@ -0,0 +1,56 @@
+package com.ydtech.modules.order.entity.vo;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ydtech.core.page.PageRequest;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 报价次数的redis缓存数据实体
+ */
+@Data
+public class QuoteDetailsQueryVo extends PageRequest {
+    @ApiModelProperty(value = "子订单号")
+    private String subOrderNo;
+
+    @ApiModelProperty(value = "动作")
+    private String action;
+
+    @ApiModelProperty(value = "车牌")
+    private String licenseNo;
+
+    @ApiModelProperty(value = "结果")
+    private String result;
+
+    @ApiModelProperty(value = "起始时间")
+    private String startTime;
+
+    @ApiModelProperty(value = "止期时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "保险公司id")
+    private String companyId;
+
+    @ApiModelProperty(value = "工号id")
+    private String agentId;
+
+    @ApiModelProperty(value = "代理人")
+    private String agent;
+
+    @ApiModelProperty(value = "操作人")
+    private String operator;
+
+    @ApiModelProperty(value = "部门id")
+    private String deptId;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+}

+ 80 - 0
src/main/java/com/ydtech/modules/order/entity/vo/QuoteDetailsVo.java

@@ -0,0 +1,80 @@
+package com.ydtech.modules.order.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 报价次数的redis缓存数据实体
+ */
+@Data
+public class QuoteDetailsVo {
+    @ApiModelProperty(value = "子订单号")
+    private String subOrderNo;
+
+    @ApiModelProperty(value = "动作")
+    private String action;
+
+    @ApiModelProperty(value = "车牌")
+    private String licenseNo;
+
+    @ApiModelProperty(value = "保险公司Id")
+    private String companyId;
+
+    @ApiModelProperty(value = "保险公司")
+    private String company;
+
+    @ApiModelProperty(value = "部门id")
+    private String deptId;
+
+    @ApiModelProperty(value = "部门名称")
+    private String deptName;
+
+    @ApiModelProperty(value = "工号")
+    private String userId;
+
+    @ApiModelProperty(value = "姓名")
+    private String name;
+
+    @ApiModelProperty(value = "联系电话")
+    private String mobile;
+
+    @ApiModelProperty(value = "结果")
+    private String result;
+
+    @ApiModelProperty(value = "报价时间")
+    private String createTime;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "报价失败次数")
+    private String failedCount;
+
+    @ApiModelProperty(value = "报价成功次数")
+    private String successCount;
+
+    @ApiModelProperty(value = "报价比例")
+    private String rate;
+
+    @ApiModelProperty(value = "最大报价次数")
+    private String dayMaxQuoteNum;
+
+    @ApiModelProperty(value = "最大车辆报价次数")
+    private String carMaxQuoteNum;
+
+    @ApiModelProperty(value = "今日报价次数")
+    private Integer numCount;
+
+    @ApiModelProperty(value = "今日报价单数")
+    private Integer dayAllOrder;
+
+    @ApiModelProperty(value = "今日承保单数")
+    private Integer dayCoverOrder;
+
+    @ApiModelProperty(value = "累计报价单数")
+    private Integer wholeAllOrder;
+
+    @ApiModelProperty(value = "累计承保单数")
+    private Integer wholeCoverOrder;
+
+}

+ 92 - 0
src/main/java/com/ydtech/modules/order/entity/vo/QuoteNumRedisVo.java

@@ -0,0 +1,92 @@
+package com.ydtech.modules.order.entity.vo;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.poi.hpsf.Decimal;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 报价次数的redis缓存数据实体
+ */
+@Data
+public class QuoteNumRedisVo {
+
+    //用户id
+    private String userId;
+
+    //标准的保险公司报价次数列表
+    private List<QuoteNumberCompanyVo> originalCompanyList;
+
+    //保险公司报价的列表次数
+    private List<QuoteNumberCompanyVo> quoteCompanyList;
+
+    //车辆的报价次数列表
+    private List<CarQuoteNumberVo> carList;
+
+
+    @Data
+    @AllArgsConstructor
+    public static class QuoteNumberCompanyVo{
+        private String companyId;
+
+        private Integer dayMaxQuoteNum;
+
+        private Integer carMaxQuoteNum;
+
+        private BigDecimal orderRatio;
+
+        public QuoteNumberCompanyVo(){
+
+        }
+
+        public QuoteNumberCompanyVo(SysQuoteConfig sysQuoteConfig){
+            this.companyId = sysQuoteConfig.getCompanyId();
+            this.dayMaxQuoteNum = sysQuoteConfig.getDayMaxQuoteNum();
+            this.carMaxQuoteNum = sysQuoteConfig.getCarMaxQuoteNum();
+            this.orderRatio = sysQuoteConfig.getOrderRatio();
+        }
+
+
+    }
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class CarQuoteNumberVo{
+
+        private String companyId;
+
+        private String licenseNo;
+
+        private Integer quoteNum;
+    }
+
+    public String toJsonString(QuoteNumRedisVo vo){
+        return JSONObject.toJSONString(this);
+    }
+
+    public QuoteNumRedisVo(){
+
+    }
+
+
+
+    public QuoteNumRedisVo(String json){
+        //反序列化
+        JSONObject jsonObject = JSONObject.parseObject(json);
+        this.originalCompanyList = JSONArray.parseArray(jsonObject.getString("originalCompanyList"),QuoteNumberCompanyVo.class);
+        this.quoteCompanyList = JSONArray.parseArray(jsonObject.getString("quoteCompanyList"),QuoteNumberCompanyVo.class);
+        this.carList = JSONArray.parseArray(jsonObject.getString("carList"),CarQuoteNumberVo.class);
+    }
+
+    public QuoteNumRedisVo toObject(String json){
+        return JSONObject.parseObject(json,QuoteNumRedisVo.class);
+    }
+
+}

+ 3 - 0
src/main/java/com/ydtech/modules/order/entity/vo/VehicleAndVesselTax.java

@@ -48,4 +48,7 @@ public class VehicleAndVesselTax implements Serializable {
     @ApiModelProperty("车船税标志 1-正常交税; 2-免税; 3-减税; 4-完税")
     private String taxRelifFlag;
 
+    @ApiModelProperty("组织机构代码")
+    private String organizationCode;
+
 }

+ 1 - 1
src/main/java/com/ydtech/modules/order/entity/vo/ya/YaExtendInfoDto.java

@@ -84,7 +84,7 @@ public class YaExtendInfoDto implements Serializable {
     private String syClaims;
 
     @ApiModelProperty("交商合并经营成本率")
-    private Double mergeCostRate;
+    private String mergeCostRate;
 
     /**
      * 临时增加

+ 4 - 1
src/main/java/com/ydtech/modules/order/service/InsAreaCompanyService.java

@@ -76,7 +76,10 @@ public interface InsAreaCompanyService extends IService<InsAreaCompany> {
      * @param insAreaCompany
      * @param insAreaCompanyAccidentalDriving 驾意险信息
      */
-    void insertCompanyAndOrders(InsAreaCompany insAreaCompany, InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving);
+    String insertCompanyAndOrders(InsAreaCompany insAreaCompany, InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving);
+
+    String insertCompanyAndOrders(String subOrderNo,InsAreaCompany insAreaCompany, InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving);
+
 
     void insertCompanyAndOrders(InsAreaCompany insAreaCompany, List<InsAreaCompanyAccidentalDriving> insAreaCompanyAccidentalDriving);
 

+ 4 - 1
src/main/java/com/ydtech/modules/order/service/InsOrdersService.java

@@ -281,7 +281,10 @@ public interface InsOrdersService extends IService<InsOrders> {
      * 生成失败订单数据
      * @return
      */
-    boolean responseFailedOrder(BaseQuoteVo quoteVo, PtlAgreementAttribution ptlAgreementAttribution, InsOrders insOrder, String errorMessage, InsOrderStatusEnum statusEnum);
+    String responseFailedOrder(BaseQuoteVo quoteVo, PtlAgreementAttribution ptlAgreementAttribution, InsOrders insOrder, String errorMessage, InsOrderStatusEnum statusEnum);
+
+    String responseFailedOrder(String subOrderNo,BaseQuoteVo quoteVo, PtlAgreementAttribution ptlAgreementAttribution, InsOrders insOrder, String errorMessage, InsOrderStatusEnum statusEnum);
+
     /**
      *  @version
      *  @author: hxl

+ 89 - 0
src/main/java/com/ydtech/modules/order/service/SysQuoteConfigService.java

@@ -0,0 +1,89 @@
+package com.ydtech.modules.order.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydtech.modules.order.entity.InsAreaCompany;
+import com.ydtech.modules.order.entity.InsDrivingIntentionInsuranceType;
+import com.ydtech.modules.order.entity.InsOrders;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
+import com.ydtech.modules.order.entity.po.SysQuoteUserConfigAppend;
+import com.ydtech.modules.order.entity.vo.QuoteDetailsQueryVo;
+import com.ydtech.modules.order.entity.vo.QuoteDetailsVo;
+import com.ydtech.modules.order.entity.vo.QuoteNumRedisVo;
+
+import java.util.List;
+
+/**
+ * 针对表【SysQuoteConfig】的数据库操作Service
+ */
+public interface SysQuoteConfigService extends IService<SysQuoteConfig> {
+
+
+
+
+    /**
+     * 检查报价限制
+     * @return
+     */
+    public boolean checkQuoteLimitation(String userId,String companyId,String licenseNo);
+
+    /**
+     * 获取保险公司的报价次数
+     * @param userId
+     * @param companyId
+     * @return
+     */
+    public QuoteNumRedisVo.QuoteNumberCompanyVo getUserQuoteNumber(String userId, String companyId);
+
+    /**
+     * 获取保险公司的报价次数
+     * @param userId
+     * @return
+     */
+    public List<SysQuoteConfig> getUserQuoteNumber(String userId);
+
+    /**
+     * 设置配置信息
+     */
+    public boolean setQuoteInfo(SysQuoteConfig sysQuoteConfig);
+
+    /**
+     * 获取报价次数配置信息
+     */
+    public SysQuoteConfig getQuoteConfigInfo(String companyId);
+
+    /**
+     * 关联用户
+     */
+    public boolean connectUser(String configId,List<String> userIds);
+
+    /**
+     * 追加配置
+     */
+    public boolean quoteConfigAppend(SysQuoteUserConfigAppend sysQuoteUserConfigAppend);
+
+    /**
+     * 获取用户追加报价的列表
+     * @param quoteDetailsQueryVo
+     * @return
+     */
+    public Page<QuoteDetailsVo> getAppendUserQuote(Page page,QuoteDetailsQueryVo quoteDetailsQueryVo);
+
+    /**
+     * 根据保险公司获取今天用户追加的数据
+     */
+    public List<SysQuoteUserConfigAppend> getTodayAppendData(String companyId);
+
+    /**
+     * 获取报价历史分页
+     * @param page
+     * @param quoteDetailsQueryVo
+     * @return
+     */
+    public Page<QuoteDetailsVo> getQuoteRecordPage(Page page, QuoteDetailsQueryVo quoteDetailsQueryVo);
+
+    public Page<QuoteDetailsVo> getQuoteRequestRecordPage(Page page, QuoteDetailsQueryVo quoteDetailsQueryVo);
+
+    public Page<QuoteDetailsVo> getQuoteDetails(Page page, QuoteDetailsQueryVo quoteDetailsQueryVo);
+}

+ 100 - 0
src/main/java/com/ydtech/modules/order/service/SysQuoteRedisService.java

@@ -0,0 +1,100 @@
+package com.ydtech.modules.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
+import com.ydtech.modules.order.entity.po.SysQuoteUserConfigAppend;
+import com.ydtech.modules.order.entity.vo.QuoteNumRedisVo;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 针对表【SysQuoteConfig】的数据库操作Service
+ */
+public interface SysQuoteRedisService {
+
+    /**
+     * 模糊搜索报价次数的keys
+     * @param pattern
+     * @return
+     */
+    public List<String> searchKeysWithScan(String pattern);
+
+
+    /**
+     * 组装报价次数的redis数据
+     * @return
+     */
+    public QuoteNumRedisVo assembleQuoteRedisData(String userId,List<SysQuoteConfig> sysQuoteConfigs);
+
+    /**
+     * 保存redis数据
+     * @param quoteNumberRedis
+     */
+    public void saveRedisData(QuoteNumRedisVo quoteNumberRedis);
+
+    /**
+     * 获取报价次数缓存key
+     * @param userId
+     * @return
+     */
+    public String getQuoteNumberRedisKey(String userId);
+
+    /**
+     * 从redis获取用户报价次数的数据
+     * @param userId
+     * @return
+     */
+    public QuoteNumRedisVo getQuoteNumberRedisData(String userId);
+
+    public void setQuoteRecordRedis(String userId, QuoteNumRedisVo quoteNumRedisVo);
+
+    public void delQuoteRedis(String userId);
+
+    /**
+     * 更新所有的缓存数据
+     * @param sysQuoteConfig
+     * @return
+     */
+    public boolean updateAllQuoteRedis(SysQuoteConfig sysQuoteConfig);
+
+    /**
+     * 更新用户追加的缓存数据
+     * @param sysQuoteUserConfigAppend
+     * @return
+     */
+    public boolean updateUserQuoteAppendRedis(SysQuoteUserConfigAppend sysQuoteUserConfigAppend);
+
+    /**
+     * 报价之后redis数据更新
+     * @param companyId
+     * @param userId
+     * @param licenseNo
+     * @param num
+     * @return
+     */
+    public void quoteAfterRedisData(String companyId,String userId,String licenseNo,Integer num);
+
+    /**
+     * 根据车辆信息获取最大的报价次数
+     */
+    public Integer getMaxQuoteNum(String companyId,String userId,String licenseNo);
+
+    /**
+     * 获取出单比例
+     * @param companyId
+     * @param userId
+     * @return
+     */
+    public BigDecimal getQuoteRatio(String companyId, String userId);
+
+    /**
+     * 刷新报价次数
+     * @param companyId
+     * @param userId
+     * @return
+     */
+    public void refreshQuoteNum(String companyId, String userId, List<SysQuoteRecord> sysQuoteRecords);
+}

+ 3 - 1
src/main/java/com/ydtech/modules/order/service/YangGuangOrderApiService.java

@@ -60,7 +60,9 @@ public interface YangGuangOrderApiService {
     /**
      *  投保单撤销
      */
-    boolean autoWriteOff(String companyId) throws Exception;
+    HttpResult<Object> autoWriteOff(String companyId) throws Exception;
+
+    boolean autoWriteOffOrder(String companyId) throws Exception;
 
     /**
      * 获取保单信息

+ 159 - 57
src/main/java/com/ydtech/modules/order/service/impl/BoHaiOrderApiServiceImpl.java

@@ -13,7 +13,9 @@ import com.ydtech.modules.ins.model.vo.*;
 import com.ydtech.modules.order.components.ConfigureParametersComponents;
 import com.ydtech.modules.order.components.FileComponents;
 import com.ydtech.modules.order.components.bohai.BoHaiRequestApiComponent;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.*;
 import com.ydtech.modules.order.entity.api.bohai.constants.*;
 import com.ydtech.modules.order.entity.api.bohai.request.*;
@@ -23,6 +25,7 @@ import com.ydtech.modules.order.entity.crawler.vo.CrawlerPolicyPrintVo;
 import com.ydtech.modules.order.entity.dto.DrivingInsuranceDto;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import com.ydtech.modules.order.entity.vo.bohai.BoHaiQuoteAccidentVo;
@@ -82,6 +85,12 @@ public class BoHaiOrderApiServiceImpl implements BoHaiOrderApiService {
     @Value("${api.url}")
     private String apiUrl;
 
+    @Autowired
+    private SysQuoteRecordMapper sysQuoteRecordMapper;
+
+    @Autowired
+    private SysQuoteRedisService sysQuoteRedisService;
+
     @Override
     public HttpResult<List<NonAutomotiveProductsResponse.DataDTO.ProductsDTO>> productQuery(ProductQueryVo productQueryVo) throws Exception {
         // 账号信息
@@ -111,8 +120,119 @@ public class BoHaiOrderApiServiceImpl implements BoHaiOrderApiService {
         return HttpResult.ok(coverages);
     }
 
+    /**
+     * 重复投保 获取新的报价对象
+     * @param response
+     * @return
+     */
+    private QuotationRequest getQuotationRequest(QuotationResponse response,QuotationRequest quotationRequest,String businessPolicyEndDateStr){
+
+        //结束投保日期为开始日期,结束日期为结束投保日期后一年的日期
+        businessPolicyEndDateStr = businessPolicyEndDateStr + "00";
+        String beginDateStr = DateUtil_N.strAllToDateToStr(businessPolicyEndDateStr, "yyyyMMddHHmmss", "yyyy-MM-dd HH:mm:ss");
+        // 结束日期为59:59:59
+        String endDateStr = DateUtil_N.getNextYearDateStrTranfer(businessPolicyEndDateStr);
+        QuotationRequest.BusinessPolicyDTO businessPolicy = quotationRequest.getBusinessPolicy();
+        businessPolicy.setStartDate(beginDateStr);
+        businessPolicy.setEndDate(endDateStr);
+        quotationRequest.setBusinessPolicy(businessPolicy);
+        return quotationRequest;
+    }
+
+    /**
+     * 重复报价
+     * @return
+     */
+    private QuotationResponse repeatQuote(QuotationRequest quotationRequest,String sysSourceCode,BaseQuoteInfoVo quoteInfoVo,String companyId,Integer maxQuoteNum,
+                                          List<SysQuoteRecord> records,QuotationResponse response) throws Exception {
+
+        if(maxQuoteNum <= 0)
+        {
+            return response;
+        }
+        //报价接口调用
+        response = boHaiRequestApiComponent.quotation(quotationRequest, sysSourceCode);
+        maxQuoteNum--;
+
+        //商业险重复投保  重复投保保单信息 :保单号:314042303060007485车牌号:晋A881SR车架号:LMGAC1381K1535834发动机号:F699317保险公司代码:YAIC签单日期:20230414起保日期:202305030000
+        // 终保日期:202405030000险别:机动车第三者责任保险,附加医保外用药责任险(机动车第三者责任保险)
+
+        List<RiskInfoVo> collect =
+                quoteInfoVo.getRiskList().stream().filter(x -> InsuranceRisk.BUSINESS.getCode().equals(x.getRiskCode())).collect(Collectors.toList());
+        //商业险重复投保处理
+        if (!collect.isEmpty()) {
+            if (ResponseCode.R_Z00001.getCode().equals(response.getResponseCode()) && response.getData().getBusinessPolicy().getErrorMsg() != null) {
+                String errorMsg = response.getData().getBusinessPolicy().getErrorMsg();
+                if (errorMsg.contains("重复投保")) {
+                    //重新给商业险的开始和结束时间赋值赋值重新填报
+                    String businessPolicyEndDateStr = StringSubStringUtils.subjectStringContentByBusinessPolicyEndDate(errorMsg, "终保日期:");
+                    if (!StringUtils.isEmpty(businessPolicyEndDateStr) && !StringUtils.isEmpty((businessPolicyEndDateStr))) {
+                        //结束投保日期为开始日期,结束日期为结束投保日期后一年的日期
+                        businessPolicyEndDateStr = businessPolicyEndDateStr + "00";
+                        String beginDateStr = DateUtil_N.strAllToDateToStr(businessPolicyEndDateStr, "yyyyMMddHHmmss", "yyyy-MM-dd HH:mm:ss");
+                        // 结束日期为59:59:59
+                        String endDateStr = DateUtil_N.getNextYearDateStrTranfer(businessPolicyEndDateStr);
+                        QuotationRequest.BusinessPolicyDTO businessPolicy = quotationRequest.getBusinessPolicy();
+                        businessPolicy.setStartDate(beginDateStr);
+                        businessPolicy.setEndDate(endDateStr);
+                        quotationRequest.setBusinessPolicy(businessPolicy);
+                        SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),companyId,quoteInfoVo.getCarInfo().getLicenseNo(),
+                                QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                        records.add(sysQuoteRecord);
+                        response = repeatQuote(quotationRequest, sysSourceCode, quoteInfoVo, companyId, maxQuoteNum, records,response);
+                    }
+                }
+            }
+        }
+
+        //add by  2024-04-03  会发生重复投保   算费微服务返回报错信息_保信返回错误信息:
+        // 平台返回错误信息号牌号码“晋J60L55”的保单发生重复投保,与其重复投保的其它公司的保单信息如下:投保确认码 02PAIC140023031919549498257741;保单号 13312993901973801278;起保日期
+        // 2023-04-11 00:00;终保日期 2024-04-11 00:00;号牌号码 晋J60L55;号牌种类 02;车架号 LZWADAGA5LG477030;发动机号 8LB1921291;地区 山西。
+        //重新赋值交强的投保开始日期
+        if (ResponseCode.R_Z00004.getCode().equals(response.getResponseCode())) {
+            String responseMsg = response.getResponseMsg();
+            if (responseMsg.contains("发生重复投保")) {
+                //交强重复投保
+                String trafficPolicyDTOBenginDateStr = StringSubStringUtils.subjectStringContentByTrafficPolicyDTOBenginDate(responseMsg,
+                        ":", "起保日期");
+                String trafficPolicyDTOEndDateStr = StringSubStringUtils.subjectStringContentByTrafficPolicyDTOBenginDate(responseMsg,
+                        ":", "终保日期");
+                if (!StringUtils.isEmpty(trafficPolicyDTOBenginDateStr) && !StringUtils.isEmpty(trafficPolicyDTOEndDateStr)) {
+                    //结束投保日期为开始日期,结束日期为结束投保日期后一年的日期
+                    trafficPolicyDTOEndDateStr = trafficPolicyDTOEndDateStr + ":00";
+                    // 结束日期为59:59:59
+                    String endDateStr = DateUtil_N.getNextYearDateStr(trafficPolicyDTOEndDateStr);
+                    QuotationRequest.TrafficPolicyDTO trafficPolicy = quotationRequest.getTrafficPolicy();
+                    trafficPolicy.setStartDate(trafficPolicyDTOEndDateStr);
+                    trafficPolicy.setEndDate(endDateStr);
+                    quotationRequest.setTrafficPolicy(trafficPolicy);
+                    SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),companyId,quoteInfoVo.getCarInfo().getLicenseNo(),
+                            QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                    records.add(sysQuoteRecord);
+                    response = repeatQuote(quotationRequest, sysSourceCode, quoteInfoVo, companyId, maxQuoteNum, records,response);
+                }
+            }
+        }
+        SysQuoteRecord sysQuoteRecord = null;
+        if(!ResponseCode.R_Z00001.getCode().equals(response.getResponseCode())) {
+            sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),companyId,quoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+
+        }else{
+            sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),companyId,quoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+        }
+        records.add(sysQuoteRecord);
+        return response;
+
+    }
+
     @Override
     public HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<List<BoHaiQuoteAccidentVo>> quoteVo) throws Exception {
+        //获取最大报价次数
+        Integer maxQuoteNum = quoteVo.getMaxQuoteNum();
+        List<SysQuoteRecord> quoteRecords = new ArrayList<>();
+
         // 协议id获取配置实体
         String agreementId = quoteVo.getAgreementId();
         // 账号信息
@@ -160,68 +280,44 @@ public class BoHaiOrderApiServiceImpl implements BoHaiOrderApiService {
 
         QuotationRequest quotationRequest = new QuotationRequest(parameters, quoteInfoVo.getRiskList(), quoteInfoVo.getKindList(),
                 currentValue, orderNo, carInfo, quoteVo.getAccidentalDrivingVo(), discount);
-        QuotationResponse response = boHaiRequestApiComponent.quotation(quotationRequest, parameters.getSysSourceCode());
-        //商业险重复投保  重复投保保单信息 :保单号:314042303060007485车牌号:晋A881SR车架号:LMGAC1381K1535834发动机号:F699317保险公司代码:YAIC签单日期:20230414起保日期:202305030000
-        // 终保日期:202405030000险别:机动车第三者责任保险,附加医保外用药责任险(机动车第三者责任保险)
 
-        List<RiskInfoVo> collect =
-                quoteInfoVo.getRiskList().stream().filter(x -> InsuranceRisk.BUSINESS.getCode().equals(x.getRiskCode())).collect(Collectors.toList());
+        //报价接口调用
+        QuotationResponse quotationResponse = repeatQuote(quotationRequest, parameters.getSysSourceCode(), quoteInfoVo, quoteVo.getCompanyId(),
+                maxQuoteNum,quoteRecords,null);
 
-        if (!collect.isEmpty()) {
-            response = getQuotationResponse(response, quotationRequest, parameters.getSysSourceCode());
-        }
 
-        //response = getQuotationResponseNew(quoteInfoVo, quoteVo, parameters, orderNo, carInfo, currentValue, response);
-        //add by  2024-04-03  会发生重复投保   算费微服务返回报错信息_保信返回错误信息:
-        // 平台返回错误信息号牌号码“晋J60L55”的保单发生重复投保,与其重复投保的其它公司的保单信息如下:投保确认码 02PAIC140023031919549498257741;保单号 13312993901973801278;起保日期
-        // 2023-04-11 00:00;终保日期 2024-04-11 00:00;号牌号码 晋J60L55;号牌种类 02;车架号 LZWADAGA5LG477030;发动机号 8LB1921291;地区 山西。
-        //重新赋值交强的投保开始日期
-        if (ResponseCode.R_Z00004.getCode().equals(response.getResponseCode())) {
-            String responseMsg = response.getResponseMsg();
-            if (responseMsg.contains("发生重复投保")) {
-                //交强重复投保
-                String trafficPolicyDTOBenginDateStr = StringSubStringUtils.subjectStringContentByTrafficPolicyDTOBenginDate(responseMsg,
-                        ":", "起保日期");
-                String trafficPolicyDTOEndDateStr = StringSubStringUtils.subjectStringContentByTrafficPolicyDTOBenginDate(responseMsg,
-                        ":", "终保日期");
-                if (!StringUtils.isEmpty(trafficPolicyDTOBenginDateStr) && !StringUtils.isEmpty(trafficPolicyDTOEndDateStr)) {
-                    //结束投保日期为开始日期,结束日期为结束投保日期后一年的日期
-                    trafficPolicyDTOEndDateStr = trafficPolicyDTOEndDateStr + ":00";
-                    // 结束日期为59:59:59
-                    String endDateStr = DateUtil_N.getNextYearDateStr(trafficPolicyDTOEndDateStr);
-                    QuotationRequest.TrafficPolicyDTO trafficPolicy = quotationRequest.getTrafficPolicy();
-                    trafficPolicy.setStartDate(trafficPolicyDTOEndDateStr);
-                    trafficPolicy.setEndDate(endDateStr);
-                    quotationRequest.setTrafficPolicy(trafficPolicy);
-                    response = boHaiRequestApiComponent.quotation(quotationRequest, parameters.getSysSourceCode());
-                    // 判断是否商业险重复投保
-                    if (!collect.isEmpty()) {
-                        response = getQuotationResponse(response, quotationRequest, parameters.getSysSourceCode());
-                    }
-                    if (!ResponseCode.R_Z00001.getCode().equals(response.getResponseCode())) {
-                        throw new SystemException(response.getResponseMsg());
-                    }
-                } else {
-                    InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
-                    InsOrders byId = insOrdersService.getById(quoteVo.getOrderNo());
-                    if(responseMsg.contains("重复投保")){
-                        insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
-                    }
-                    insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution,byId,responseMsg,insOrderStatusEnum);
-                    throw new SystemException(responseMsg);
-                }
-                // add by hxl  2024-04-07  报价接口报错  算费微服务返回报错信息_保信返回错误信息:录入的校验码有误
-                // 需要调用 获取交管查询校验码接口   传入到报价参数中  暂未复现不处理 注释掉
-            } else if (responseMsg.contains("录入的校验码有误")) {
-                //response = getQuotationResponseNew(quoteInfoVo, quoteVo, parameters, orderNo, carInfo, currentValue, response);
-            } else {
-                throw new SystemException(responseMsg);
+        //处理报价失败
+        if(!ResponseCode.R_Z00001.getCode().equals(quotationResponse.getResponseCode())) {
+            InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
+            InsOrders byId = insOrdersService.getById(quoteInfoVo.getOrderNo());
+            String responseMsg = quotationResponse.getResponseMsg();
+            if(responseMsg.contains("重复投保")){
+                insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
             }
+            String subOrderNo = insOrdersService.responseFailedOrder(quoteVo, ptlAgreementAttribution, byId, responseMsg, insOrderStatusEnum);
+
+            //存储报价记录
+            quoteRecords.forEach(item->{
+                item.setSubOrderNo(subOrderNo);
+            });
+            sysQuoteRecordMapper.insertBatch(quoteRecords);
+            //刷新redis中的报价次数
+            sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),quoteRecords);
+            throw new SystemException(responseMsg);
         }
+
         List<BoHaiQuoteAccidentVo> accidentalDrivingVo = Optional.ofNullable(quoteVo.getAccidentalDrivingVo()).orElse(new ArrayList<>());
-//        InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving = new InsAreaCompanyAccidentalDriving();
-//        insAreaCompanyAccidentalDriving.setQuantity(quoteVo.getAccidentalDrivingVo());
-        return getQuoteRespVo(response, quoteInfoVo, vehicleModelsDTO, ptlAgreementAttribution, orderNo, accidentalDrivingVo);
+
+
+        HttpResult<QuoteRespVo> quoteRespVo = getQuoteRespVo(quotationResponse, quoteInfoVo, vehicleModelsDTO, ptlAgreementAttribution, orderNo, accidentalDrivingVo);
+        //存储报价记录
+        quoteRecords.forEach(item->{
+            item.setSubOrderNo(quoteRespVo.getData().getCompanyId());
+        });
+        sysQuoteRecordMapper.insertBatch(quoteRecords);
+        //刷新redis中的报价次数
+        sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),quoteRecords);
+        return quoteRespVo;
     }
 
     /**
@@ -260,13 +356,17 @@ public class BoHaiOrderApiServiceImpl implements BoHaiOrderApiService {
      * @Date: 2024/4/7 16:07
      * @Description:
      */
-    private QuotationResponse getQuotationResponse(QuotationResponse response, QuotationRequest quotationRequest, String sysSourCode) throws Exception {
+    private QuotationResponse getQuotationResponse(QuotationResponse response, QuotationRequest quotationRequest, String sysSourCode,
+                                                   List<SysQuoteRecord> records,Integer maxQuoteNum) throws Exception {
         if (ResponseCode.R_Z00001.getCode().equals(response.getResponseCode()) && response.getData().getBusinessPolicy().getErrorMsg() != null) {
             String errorMsg = response.getData().getBusinessPolicy().getErrorMsg();
             if (errorMsg.contains("重复投保")) {
                 //重新给商业险的开始和结束时间赋值赋值重新填报
                 String businessPolicyEndDateStr = StringSubStringUtils.subjectStringContentByBusinessPolicyEndDate(errorMsg, "终保日期:");
                 if (!StringUtils.isEmpty(businessPolicyEndDateStr) && !StringUtils.isEmpty((businessPolicyEndDateStr))) {
+                    if(maxQuoteNum <= 0){
+                        return response;
+                    }
                     //结束投保日期为开始日期,结束日期为结束投保日期后一年的日期
                     businessPolicyEndDateStr = businessPolicyEndDateStr + "00";
                     String beginDateStr = DateUtil_N.strAllToDateToStr(businessPolicyEndDateStr, "yyyyMMddHHmmss", "yyyy-MM-dd HH:mm:ss");
@@ -277,6 +377,8 @@ public class BoHaiOrderApiServiceImpl implements BoHaiOrderApiService {
                     businessPolicy.setEndDate(endDateStr);
                     quotationRequest.setBusinessPolicy(businessPolicy);
                     response = boHaiRequestApiComponent.quotation(quotationRequest, sysSourCode);
+                    SysQuoteRecord record = new SysQuoteRecord();
+                    records.add(record);
                     if (!ResponseCode.R_Z00001.getCode().equals(response.getResponseCode())) {
                         throw new SystemException(response.getResponseMsg());
                     }

+ 55 - 5
src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java

@@ -20,8 +20,10 @@ import com.ydtech.modules.order.components.ConfigureParametersComponents;
 import com.ydtech.modules.order.components.InsImagesUploadCacheComponents;
 import com.ydtech.modules.order.components.VerificationCodeIdentification;
 import com.ydtech.modules.order.components.chengtai.ChengTaiRequestApiComponents;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.components.gouren.GuorenDuplicateInsuranceComponent;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.*;
 import com.ydtech.modules.order.entity.api.chengtai.constants.CtKindCodeEnum;
 import com.ydtech.modules.order.entity.api.chengtai.constants.OrderStatusEnum;
@@ -36,6 +38,7 @@ import com.ydtech.modules.order.entity.crawler.response.RecognitionResponse;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.filter.CarModelsFilterUtils;
 import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import com.ydtech.modules.order.entity.vo.PolicyPrintVo;
@@ -90,6 +93,12 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
     @Autowired
     private InsSubOrderUpdateDetailService insSubOrderUpdateDetailService;
 
+    @Autowired
+    private SysQuoteRecordMapper sysQuoteRecordMapper;
+
+    @Autowired
+    private SysQuoteRedisService sysQuoteRedisService;
+
     @Value("${upload.file.path}")
     private String uploadFilePath;
 
@@ -101,6 +110,10 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
 
     @Override
     public HttpResult<QuoteRespVo> quoteApi(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo) throws Exception {
+        Integer maxQuoteNum = quoteVo.getMaxQuoteNum();
+
+        List<SysQuoteRecord> sysQuoteRecords = new ArrayList<>();
+
         /** 1. 协议id获取配置实体 */
         String agreementId = quoteVo.getAgreementId();
         // 1.1 账号信息
@@ -123,7 +136,7 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         /** 4. 报价 */
         InsurePremiumRequest insurePremiumRequest = new InsurePremiumRequest(quoteInfoVo,carModelListDTO, carActualValueResponse,parameters,quoteVo);
         // 重复报价
-        InsurePremiumResponse insurePremiumResponse = this.getResponse(insurePremiumRequest, httpHeaders);
+        InsurePremiumResponse insurePremiumResponse = this.getResponse(insurePremiumRequest, httpHeaders,quoteInfoVo, quoteVo.getCompanyId(),maxQuoteNum,sysQuoteRecords);
 
         String message = "";
         if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode())){
@@ -134,7 +147,18 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
             {
                 insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
             }
-            insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order,insurePremiumResponse.getMessage(),insOrderStatusEnum);
+            String subOrderNo = insOrdersService.responseFailedOrder(quoteVo, ptlAgreementAttribution, order, insurePremiumResponse.getMessage(), insOrderStatusEnum);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            //存储报价记录
+            sysQuoteRecords.forEach(item->{
+                item.setSubOrderNo(subOrderNo);
+            });
+
+            sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+            //刷新redis中的报价次数
+            sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
             throw new SystemException(insurePremiumResponse.getMessage());
         }
 
@@ -156,7 +180,19 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
 
         // 设置核心报价车型
         quoteRespVo.setCoreModels(carModelListDTO.toCoreModelsVo());
-        return responseOrder(insurePremiumResponse, quoteRespVo, ptlAgreementAttribution, insurePremiumResponse.getOrderId());
+        HttpResult<QuoteRespVo> quoteRespVoHttpResult = responseOrder(insurePremiumResponse, quoteRespVo, ptlAgreementAttribution, insurePremiumResponse.getOrderId());
+        SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+        sysQuoteRecords.add(sysQuoteRecord);
+        //存储报价记录
+        sysQuoteRecords.forEach(item->{
+            item.setSubOrderNo(quoteRespVoHttpResult.getData().getCompanyId());
+        });
+        sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+
+        sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
+
+        return quoteRespVoHttpResult;
     }
 
     /**
@@ -165,11 +201,20 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
      * @param httpHeaders
      * @return
      */
-    private InsurePremiumResponse getResponse(InsurePremiumRequest insurePremiumRequest, HttpHeaders httpHeaders) throws Exception {
+    private InsurePremiumResponse getResponse(InsurePremiumRequest insurePremiumRequest, HttpHeaders httpHeaders,BaseQuoteInfoVo quoteInfoVo,
+                                              String companyId,Integer maxQuoteNum,List<SysQuoteRecord> sysQuoteRecords) throws Exception {
+
         InsurePremiumResponse insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+        maxQuoteNum--;
         if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode()) && insurePremiumResponse.getMessage().contains("重复投保")){
             // 交强险 商业险 重复投保处理
             this.repetitionInsure(insurePremiumResponse,insurePremiumRequest);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),companyId,quoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            if(maxQuoteNum <= 0){
+                return insurePremiumResponse;
+            }
             insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
         }
 
@@ -697,7 +742,12 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
                 insAreaCompanyService.updateCompanyAndOrders(insAreaCompany);
                 return HttpResult.ok("核保成功");
             }else{
-                throw new SystemException(underwritingResponse.getData().get(0).getReasondescription());
+                if(CollUtil.isNotEmpty(underwritingResponse.getData())){
+                    throw new SystemException(underwritingResponse.getData().get(0).getReasondescription());
+                }else{
+                    throw new SystemException("核保异常!");
+                }
+
             }
         }catch (SystemException systemException){
             // 查询核保结果

+ 53 - 4
src/main/java/com/ydtech/modules/order/service/impl/DaJiaOrderServiceImpl.java

@@ -18,7 +18,9 @@ import com.ydtech.modules.ins.model.vo.*;
 import com.ydtech.modules.order.components.ConfigureParametersComponents;
 import com.ydtech.modules.order.components.InsImagesUploadCacheComponents;
 import com.ydtech.modules.order.components.dajia.DaJiaRequestApiComponents;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.*;
 import com.ydtech.modules.order.entity.api.dajia.DaJiaConfigureParameters;
 import com.ydtech.modules.order.entity.api.dajia.constants.CCvrgNo;
@@ -28,6 +30,7 @@ import com.ydtech.modules.order.entity.api.dajia.request.*;
 import com.ydtech.modules.order.entity.api.dajia.response.*;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import com.ydtech.modules.order.entity.vo.CoreModelsVo;
@@ -115,6 +118,12 @@ public class DaJiaOrderServiceImpl implements DaJiaOrderService {
     @Autowired
     private InsSubOrderUpdateDetailService insSubOrderUpdateDetailService;
 
+    @Autowired
+    private SysQuoteRedisService sysQuoteRedisService;
+
+    @Autowired
+    private SysQuoteRecordMapper sysQuoteRecordMapper;
+
     //region 报价
 
     /**
@@ -167,6 +176,10 @@ public class DaJiaOrderServiceImpl implements DaJiaOrderService {
     @Override
     public HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<Object> t) {
         try {
+            //获取报价次数
+            Integer maxQuoteNum = t.getMaxQuoteNum();
+            List<SysQuoteRecord> sysQuoteRecords = new ArrayList<>();
+
             //获取公司配置信息
             DaJiaConfigureParameters daJiaConfigureParameters = new DaJiaConfigureParameters();
             configureParametersComponents.toEntity(daJiaConfigureParameters, t.getAgreementId());
@@ -237,7 +250,9 @@ public class DaJiaOrderServiceImpl implements DaJiaOrderService {
                 listByAccId = insAccidentalDrivingSubDaJiaService.getListByAccId(accidentalDriving.getId());
             }
             //6.报价
-            ODR1009Response odr1009Response = quotation(orderNo, kindList, riskList, quoteInfoVo, odr1016Response, accidentalDriving, listByAccId, daJiaConfigureParameters, isEnergy);
+            ODR1009Response odr1009Response = quotation(orderNo, kindList, riskList, quoteInfoVo, odr1016Response, accidentalDriving, listByAccId,
+                    daJiaConfigureParameters, isEnergy, t.getCompanyId(), maxQuoteNum, sysQuoteRecords);
+
 
             NVHLODR1001Response nvhlodr1001Response = null;
 
@@ -258,7 +273,18 @@ public class DaJiaOrderServiceImpl implements DaJiaOrderService {
 
                 // 设置报价车型
                 quoteRespVo.setCoreModels(coreModelsVo);
+                SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),t.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord);
+
                 HttpResult<QuoteRespVo> quoteRespVoHttpResult = responseOrder(odr1009Response, quoteRespVo, ptlAgreementAttribution, orderNo, quoteInfoVo, busiId, nvhlodr1001Response, insAreaCompanyAccidentalDriving);
+
+                sysQuoteRecords.forEach(item->{
+                    sysQuoteRecord.setSubOrderNo(quoteRespVoHttpResult.getData().getCompanyId());
+                });
+                sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                //刷新redis中的报价次数
+                sysQuoteRedisService.refreshQuoteNum(t.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
                 return quoteRespVoHttpResult;
             } else {
                 String errorMessage = odr1009Response.getResult().getJqAppStatusMessage().toString() + odr1009Response.getResult().getSyAppStatusMessage().toString();
@@ -267,7 +293,7 @@ public class DaJiaOrderServiceImpl implements DaJiaOrderService {
                 if(odr1009Response.getResult().getJqAppStatusMessage().toString().contains("重复投保")) {
                     orderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
                 }
-                insOrdersService.responseFailedOrder(t,ptlAgreementAttribution, insOrders, errorMessage, orderStatusEnum);
+                String subOrderNo = insOrdersService.responseFailedOrder(t, ptlAgreementAttribution, insOrders, errorMessage, orderStatusEnum);
 
                 if (Message.M0003.getCode().equals(odr1009Response.getStatus())) {
                     return HttpResult.error("报价失败,原因:" + odr1009Response.getMessage());
@@ -277,6 +303,16 @@ public class DaJiaOrderServiceImpl implements DaJiaOrderService {
                 } else if ("0".equals(odr1009Response.getResult().getSyAppStatus()) && "0002".equals(odr1009Response.getStatus())) {
                     return HttpResult.error("报价失败,原因:" + odr1009Response.getResult().getSyAppStatusMessage());
                 }
+
+                SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),t.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord);
+                sysQuoteRecords.forEach(item->{
+                    sysQuoteRecord.setSubOrderNo(subOrderNo);
+                });
+                sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                //刷新redis中的报价次数
+                sysQuoteRedisService.refreshQuoteNum(t.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
                 return HttpResult.error("报价失败");
             }
         } catch (Exception e) {
@@ -337,10 +373,14 @@ public class DaJiaOrderServiceImpl implements DaJiaOrderService {
      * @return
      * @throws Exception
      */
-    public ODR1009Response quotation(String orderNo, List<KindInfoVo> kindInfoVos, List<RiskInfoVo> riskInfoVos, BaseQuoteInfoVo quoteInfoVo, ODR1016Response odr1016Response, InsAccidentalDrivingDajia insAccidentalDrivingDajia, List<InsAccidentalDrivingSubDajia> insAccidentalDrivingSubDajias, DaJiaConfigureParameters daJiaConfigureParameters, boolean isEnergy) throws Exception {
+    public ODR1009Response quotation(String orderNo, List<KindInfoVo> kindInfoVos, List<RiskInfoVo> riskInfoVos, BaseQuoteInfoVo quoteInfoVo, ODR1016Response odr1016Response,
+                                     InsAccidentalDrivingDajia insAccidentalDrivingDajia, List<InsAccidentalDrivingSubDajia> insAccidentalDrivingSubDajias,
+                                     DaJiaConfigureParameters daJiaConfigureParameters, boolean isEnergy,String companyId,Integer maxQuoteNum, List<SysQuoteRecord> sysQuoteRecords) throws Exception {
 
         ODR1009Request odr1009Request = new ODR1009Request(orderNo, kindInfoVos, riskInfoVos, quoteInfoVo, odr1016Response, insAccidentalDrivingDajia, insAccidentalDrivingSubDajias, daJiaConfigureParameters, isEnergy);
         ODR1009Response odr1009Response = daJiaRequestApiComponents.newPremiumXnyCalculation(odr1009Request);
+        maxQuoteNum--;
+
         if (odr1009Response.getStatus().equals(Message.M0002.getCode())) {
             //获取重复投保信息
             String jqAppStatusMessage = odr1009Response.getResult().getJqAppStatusMessage() == null ? "" : odr1009Response.getResult().getJqAppStatusMessage().toString();
@@ -362,7 +402,16 @@ public class DaJiaOrderServiceImpl implements DaJiaOrderService {
                         riskInfoVo.setEndDate(duplicateDate.get(1));
                     }
                 }
-                return quotation(orderNo, kindInfoVos, riskInfoVos, quoteInfoVo, odr1016Response, insAccidentalDrivingDajia, insAccidentalDrivingSubDajias, daJiaConfigureParameters, isEnergy);
+
+                SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),companyId,quoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord);
+                if(maxQuoteNum <= 0){
+                    return odr1009Response;
+                }
+
+                return quotation(orderNo, kindInfoVos, riskInfoVos, quoteInfoVo, odr1016Response, insAccidentalDrivingDajia, insAccidentalDrivingSubDajias,
+                        daJiaConfigureParameters, isEnergy, companyId, maxQuoteNum, sysQuoteRecords);
             }
         }
         return odr1009Response;

+ 62 - 12
src/main/java/com/ydtech/modules/order/service/impl/GuorenOrderApiServiceImpl.java

@@ -23,8 +23,10 @@ import com.ydtech.modules.order.components.InsImagesUploadCacheComponents;
 import com.ydtech.modules.order.components.InsOrdersComponents;
 import com.ydtech.modules.order.components.gouren.GuorenDuplicateInsuranceComponent;
 import com.ydtech.modules.order.components.gouren.GuorenRequestApiComponent;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
 import com.ydtech.modules.order.dao.InsTaskImagesMapper;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.InsAreaCompany;
 import com.ydtech.modules.order.entity.InsAreaCompanyAccidentalDriving;
 import com.ydtech.modules.order.entity.InsAreaCompanyExternalPolicy;
@@ -42,13 +44,11 @@ import com.ydtech.modules.order.entity.api.guoren.response.SignatureResponse;
 import com.ydtech.modules.order.entity.api.guoren.response.SpecialAgreementResponse;
 import com.ydtech.modules.order.entity.dto.InsUploadImagesDto;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.PolicyPrintVo;
 import com.ydtech.modules.order.entity.vo.guoren.*;
-import com.ydtech.modules.order.service.GuorenOrderApiService;
-import com.ydtech.modules.order.service.InsAreaCompanyService;
-import com.ydtech.modules.order.service.InsOrdersService;
-import com.ydtech.modules.order.service.InsSubOrderUpdateDetailService;
+import com.ydtech.modules.order.service.*;
 import com.ydtech.modules.protocol.entity.po.PtlAgreementAttribution;
 import com.ydtech.modules.protocol.service.PtlAgreementAttributionService;
 import com.ydtech.modules.protocol.utils.AssertionUtils;
@@ -126,6 +126,12 @@ public class GuorenOrderApiServiceImpl implements GuorenOrderApiService {
     @Autowired
     private InsSubOrderUpdateDetailService insSubOrderUpdateDetailService;
 
+    @Autowired
+    private SysQuoteRecordMapper sysQuoteRecordMapper;
+
+    @Autowired
+    private SysQuoteRedisService sysQuoteRedisService;
+
     /**
      * 获取渠道信息
      *
@@ -234,6 +240,9 @@ public class GuorenOrderApiServiceImpl implements GuorenOrderApiService {
     @Override
     public HttpResult quoteApi(GuoRenQuoteVo<GuorenAccidentalDrivingVo> quoteVo) {
         log.debug("--------报价开始,订单号:{},协议号:{}--------------", quoteVo.getOrderNo(), quoteVo.getAgreementId());
+
+        Integer maxQuoteNum = quoteVo.getMaxQuoteNum();
+        List<SysQuoteRecord> sysQuoteRecords = new ArrayList<>();
         // 获取协议配置信息
         ChannelInfoDto channelInfo = gainChannelConfigInfo(quoteVo.getAgreementId());
         BaseQuoteInfoVo yaQuoteInfoVo = insOrdersComponents.getQuoteInfo(quoteVo.getOrderNo(), quoteVo.getKinds());
@@ -275,7 +284,7 @@ public class GuorenOrderApiServiceImpl implements GuorenOrderApiService {
         List<GuoRenSpecialAgreementVo> specialAgreementVo = quoteVo.getGuoRenSpecialAgreementVo();
         // 4、保费计算
         PremiumResp resp = premiumQuery(yaQuoteInfoVo, carPriceResult, vinQ, isNoCar,
-                specialAgreementVo, noCarPremium, goodsCode);
+                specialAgreementVo, noCarPremium, goodsCode, quoteVo.getCompanyId(), maxQuoteNum, sysQuoteRecords);
 
         if (resp.getResultCode() == 1) {
             InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
@@ -284,7 +293,16 @@ public class GuorenOrderApiServiceImpl implements GuorenOrderApiService {
                 insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
             }
             PtlAgreementAttribution ptlAgreementAttribution = ptlAgreementAttributionService.getById(quoteVo.getAgreementId());
-            insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order,resp.getResultMsg(),insOrderStatusEnum);
+            String subOrderNo = insOrdersService.responseFailedOrder(quoteVo, ptlAgreementAttribution, order, resp.getResultMsg(), insOrderStatusEnum);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),quoteVo.getCompanyId(),yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            sysQuoteRecords.forEach(item->{
+                item.setSubOrderNo(subOrderNo);
+            });
+            sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+            //刷新redis中的报价次数
+            sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),yaQuoteInfoVo.getUserid(),sysQuoteRecords);
             throw new SystemException(resp.getResultMsg() == null ? "保费计算失败,请联系管理员" : resp.getResultMsg());
         }
 
@@ -325,6 +343,15 @@ public class GuorenOrderApiServiceImpl implements GuorenOrderApiService {
         //这里调用费用匹配功能
 //        feeRuleSchemeService.dealFeeOrderInfo(yaQuoteInfoVo, quoteRespVo, quoteVo.getAgreementId(), iac.getId());
 
+        SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),quoteVo.getCompanyId(),yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+        sysQuoteRecords.add(sysQuoteRecord);
+        sysQuoteRecords.forEach(item->{
+            item.setSubOrderNo(iac.getId());
+        });
+        sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+        //刷新redis中的报价次数
+        sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteVo.getUserId(),sysQuoteRecords);
         log.debug("--------报价结束,车牌:{},vin:{}--------------", carInfo.getLicenseNo(), carInfo.getVinNo());
         return HttpResult.ok("报价成功", quoteRespVo);
 
@@ -1081,12 +1108,15 @@ public class GuorenOrderApiServiceImpl implements GuorenOrderApiService {
      * 保费计算
      */
     public PremiumResp premiumQuery(BaseQuoteInfoVo yaQuoteInfoVo,
-                                            CarPriceResp.DataDTO carPriceResult,
-                                            VinQueryResp.DataDTO vinQ,
-                                            boolean isNoCar,
-                                            List<GuoRenSpecialAgreementVo> specialAgreementVo,
-                                            String noCarPremium,
-                                            String goodsCode) {
+                                    CarPriceResp.DataDTO carPriceResult,
+                                    VinQueryResp.DataDTO vinQ,
+                                    boolean isNoCar,
+                                    List<GuoRenSpecialAgreementVo> specialAgreementVo,
+                                    String noCarPremium,
+                                    String goodsCode,
+                                    String companyId,
+                                    Integer maxQuoteNum,
+                                    List<SysQuoteRecord> sysQuoteRecords) {
 
         //请求信息列表
         List<String> requestInfoList = new ArrayList<>();
@@ -1097,23 +1127,43 @@ public class GuorenOrderApiServiceImpl implements GuorenOrderApiService {
         int a = 0;
         for (; ; ) {
             resp = guorenRequestApiComponent.request(req, PlatformInterfaceCode.API_IIRBT00004, PremiumResp.class);
+            maxQuoteNum--;
+
             req.getCi().getPrpTmain().setAnswer(null);
             req.getBi().getPrpTmain().setAnswer(null);
             //1、 交强险重复投保 替换时间
             boo = GuorenDuplicateInsuranceComponent.processor(resp, requestInfoList, req);
             if (boo) {
                 a++;
+                SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord);
+                if(maxQuoteNum <= 0){
+                    return resp;
+                }
                 continue;
             }
 
             boo = GuorenDuplicateInsuranceComponent.theCheckCodeIsWrong(resp);
             if (boo) {
                 a++;
+                SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord);
+                if(maxQuoteNum <= 0){
+                    return resp;
+                }
                 continue;
             }
             //2、 转保
             boo = GuorenDuplicateInsuranceComponent.buildCheckCodeParam(resp, requestInfoList, req);
             if (boo) {
+                SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.TRANSFER_INSRUANCE.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord);
+                if(maxQuoteNum <= 0){
+                    return resp;
+                }
                 continue;
             }
 

+ 35 - 1
src/main/java/com/ydtech/modules/order/service/impl/HuaTaiOrderApiServiceImpl.java

@@ -17,7 +17,9 @@ import com.ydtech.modules.order.components.huatai.HuaTaiQuotationProcessorCompon
 import com.ydtech.modules.order.components.huatai.HuaTaiRequestApiComponents;
 import com.ydtech.modules.order.components.huatai.HuiTaiUploadImageComponents;
 import com.ydtech.modules.order.constants.InsuranceTypeCorrespondence;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.InsAreaCompany;
 import com.ydtech.modules.order.entity.InsAreaCompanyExternalPolicy;
 import com.ydtech.modules.order.entity.InsOrders;
@@ -33,6 +35,7 @@ import com.ydtech.modules.order.entity.dto.InsUploadImagesDto;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.filter.CarModelsFilterUtils;
 import com.ydtech.modules.order.entity.po.InsHuataiContributing;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.*;
 import com.ydtech.modules.order.entity.vo.huatai.InsHuataiContributingVo;
 import com.ydtech.modules.order.service.*;
@@ -97,9 +100,18 @@ public class HuaTaiOrderApiServiceImpl implements HuaTaiOrderApiService {
     @Autowired
     private InsSubOrderUpdateDetailService insSubOrderUpdateDetailService;
 
+    @Autowired
+    private SysQuoteRecordMapper sysQuoteRecordMapper;
+
+    @Autowired
+    private SysQuoteRedisService sysQuoteRedisService;
 
     @Override
     public HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfo, BaseQuoteVo<AccidentalDrivingVo> zmQuoteVo) {
+        Integer maxQuoteNum = zmQuoteVo.getMaxQuoteNum();
+
+        List<SysQuoteRecord> sysQuoteRecords = new ArrayList<>();
+
         // 1. 协议id获取配置实体
         String agreementId = zmQuoteVo.getAgreementId();
         // 账号信息
@@ -146,10 +158,23 @@ public class HuaTaiOrderApiServiceImpl implements HuaTaiOrderApiService {
 
         // 3.1 处理报价请求
         List<String> warnMessageList = new ArrayList<>();
-        HuaTaiQuotedPriceResponse quotedPriceResponse = huaTaiQuotationProcessorComponent.handler(quotedPriceRequest, warnMessageList, huaTaiConfigureParameters.getInsuredCode());
+        HuaTaiQuotedPriceResponse quotedPriceResponse = huaTaiQuotationProcessorComponent.handler(quoteInfo, quotedPriceRequest, warnMessageList,
+                huaTaiConfigureParameters.getInsuredCode(), zmQuoteVo.getCompanyId() ,maxQuoteNum,sysQuoteRecords);
 
         if (!"0".equals(quotedPriceResponse.getHead().getReturnCode())) {
             log.error(quotedPriceResponse.getHead().getReturnMessage());
+            InsOrders order = insOrdersService.getById(quoteInfo.getOrderNo());
+            String subOrderNo = insOrdersService.responseFailedOrder(zmQuoteVo,ptlAgreementAttribution, order,quotedPriceResponse.getHead().getReturnMessage(),InsOrderStatusEnum.QUOTE_FAILED);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfo.getUserid(),zmQuoteVo.getCompanyId() ,quoteInfo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            sysQuoteRecords.forEach(item->{
+                item.setSubOrderNo(subOrderNo);
+            });
+            sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+
+            sysQuoteRedisService.refreshQuoteNum(zmQuoteVo.getCompanyId(),quoteInfo.getUserid(),sysQuoteRecords);
+
             throw new SystemException("该车两率管控不建议承保");
         }
 
@@ -157,6 +182,15 @@ public class HuaTaiOrderApiServiceImpl implements HuaTaiOrderApiService {
         // 核心返回车型
         quoteRespVo.setCoreModels(fullCarDataDto.toCoreModelsVo());
 
+        SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfo.getUserid(),zmQuoteVo.getCompanyId() ,quoteInfo.getCarInfo().getLicenseNo(),
+                QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+        sysQuoteRecords.add(sysQuoteRecord);
+        sysQuoteRecords.forEach(item->{
+            item.setSubOrderNo(quoteRespVo.getCompanyId());
+        });
+        sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+        //刷新redis中的报价次数
+        sysQuoteRedisService.refreshQuoteNum(zmQuoteVo.getCompanyId(),quoteInfo.getUserid(),sysQuoteRecords);
         return responseOrder(quotedPriceResponse, quoteRespVo, ptlAgreementAttribution, quoteInfo);
     }
 

+ 61 - 8
src/main/java/com/ydtech/modules/order/service/impl/InsAreaCompanyServiceImpl.java

@@ -168,7 +168,7 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
     }
 
     @Override
-    public void insertCompanyAndOrders(InsAreaCompany insAreaCompany, InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving) {
+    public String insertCompanyAndOrders(InsAreaCompany insAreaCompany, InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving) {
         //add by hxl   解决部分数据更新不了险种信息
         insAreaCompany = updateEntityPruductAndPruductid(insAreaCompany);
 
@@ -176,8 +176,34 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
         //更新主订单的投保时间
         insOrdersService.updateOrderStartingInsruanceTime(insAreaCompany.getOrderno(), insAreaCompany.getJqStartDate(), insAreaCompany.getJqEndDate(),
                 insAreaCompany.getSyStartDate(), insAreaCompany.getSyEndDate(), insAreaCompany);
+        String subOrderNo = IdGenerate.nextId();
+        insAreaCompany.setId(subOrderNo);
+        baseMapper.insert(insAreaCompany);
+        //保存驾意险信息
 
+        final InsAreaCompany finalInsAreaCompany = insAreaCompany;
+        Optional.ofNullable(insAreaCompanyAccidentalDriving)
+                .filter(x -> StringUtils.isNotEmpty(x.getRideRiskName()) && !ObjectUtils.isEmpty(x.getQuantity()))
+                .ifPresent(x -> {
+                    x.setCompanyId(finalInsAreaCompany.getId());
+                    x.setId(IdGenerate.nextId());
+                    insAreaCompanyAccidentalDrivingService.save(insAreaCompanyAccidentalDriving);
+                });
+
+        insOrdersTrackService.addingTrajectories(insAreaCompany);
+        insOrdersService.updateByOrderStatus(insAreaCompany);
+        return subOrderNo;
+    }
+
+    @Override
+    public String insertCompanyAndOrders(String subOrderNo, InsAreaCompany insAreaCompany, InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving) {
+        insAreaCompany = updateEntityPruductAndPruductid(insAreaCompany);
 
+
+        //更新主订单的投保时间
+        insOrdersService.updateOrderStartingInsruanceTime(insAreaCompany.getOrderno(), insAreaCompany.getJqStartDate(), insAreaCompany.getJqEndDate(),
+                insAreaCompany.getSyStartDate(), insAreaCompany.getSyEndDate(), insAreaCompany);
+        insAreaCompany.setId(subOrderNo);
         baseMapper.insert(insAreaCompany);
         //保存驾意险信息
 
@@ -192,6 +218,7 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
 
         insOrdersTrackService.addingTrajectories(insAreaCompany);
         insOrdersService.updateByOrderStatus(insAreaCompany);
+        return subOrderNo;
     }
 
     @Override
@@ -531,10 +558,20 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
         if (quoteVo.getStageFlag() == null) {
             throw new SystemException("暂存标志为空");
         }
-
         validQuoteVo(quoteVo);
-
-
+        if (StringUtils.isBlank(quoteVo.getAgreementId())) {
+            throw new SystemException("请选择协议!!");
+        }
+        if (StringUtils.isBlank(quoteVo.getCostFlag())) {
+            throw new SystemException("是否现询不能为空!");
+        }
+        if(StringUtils.isBlank(quoteVo.getNowCostsId())){
+            throw new SystemException("费用不能为空!!");
+        }
+        String nowCostsId = quoteVo.getNowCostsId();
+        if("1".equals(quoteVo.getCostFlag())){
+            nowCostsId =null;
+        }
 //        LambdaQueryWrapper<InsAreaCompany> queryWrapper = new LambdaQueryWrapper<>();
 //        queryWrapper.eq(InsAreaCompany::getJqpolicyno, quoteVo.getJqpolicyno())
 //                .or()
@@ -574,7 +611,7 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
         agreementProductQueryVo.setProductCode(productId);
         agreementProductQueryVo.setIsAudit("1");
         agreementProductQueryVo.setAgreementId(ptlAgreement.getId());
-        agreementProductQueryVo.setNowCostsId(quoteVo.getNowCostsId());
+        agreementProductQueryVo.setNowCostsId(nowCostsId);
 
         List<PtlAgreementProductCostsNew> costsNews = ptlAgreementProductCostsNewService.getByAgreementId(agreementProductQueryVo);
 
@@ -696,6 +733,8 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
         insAreaCompanyExternalFee.setNoSuperviseCostsProportion(quoteVo.getNoSuperviseCostsProportion() != null ? quoteVo.getNoSuperviseCostsProportion() : new BigDecimal(0));
         insAreaCompanyExternalFee.setNoOtherCostsProportion(quoteVo.getNoOtherCostsProportion() != null ? quoteVo.getNoOtherCostsProportion() : new BigDecimal(0));
 
+        insAreaCompanyExternalFee.setCostId(ptlAgreementProductCostsNew.getId());
+        insAreaCompanyExternalFee.setCostFlag(quoteVo.getCostFlag());
         this.insAreaCompanyExternalFeeService.save(insAreaCompanyExternalFee);
 
 
@@ -791,6 +830,16 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
         if (StringUtils.isBlank(insOrdersEditingVo.getAgreementId())) {
             throw new SystemException("请选择协议!!");
         }
+        if (StringUtils.isBlank(insOrdersEditingVo.getCostFlag())) {
+            throw new SystemException("是否现询不能为空!");
+        }
+        if(StringUtils.isBlank(insOrdersEditingVo.getNowCostsId())){
+            throw new SystemException("费用不能为空!!");
+        }
+        String nowCostsId = insOrdersEditingVo.getNowCostsId();
+        if("1".equals(insOrdersEditingVo.getCostFlag())){
+            nowCostsId =null;
+        }
         //通过协议id 查询费用
         PtlAgreement ptlAgreement = ptlAgreementService.getById(insOrdersEditingVo.getAgreementId());
         InsOrders insOrders = new InsOrders();
@@ -821,7 +870,8 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
             insOrders.setOrderstatus(InsOrderStatusEnum.ACCEPT_INSURANCE.getCode());
             insOrders.setInsureTime(insOrdersEditingVo.getSignDate());
         }
-        insOrdersService.updateById(insOrders);
+        //更新空值
+        insOrdersMapper.updateWithNull(insOrders);
         String subOrderNo = insOrdersEditingVo.getInsAreaCompanyList().get(0).getId();
         //处理保单
         InsAreaCompanyExternalPolicy externalPolicy = new InsAreaCompanyExternalPolicy();
@@ -853,11 +903,11 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
         //查找协议的费用
         AgreementProductQueryVo agreementProductQueryVo = new AgreementProductQueryVo();
         List<String> productId = new ArrayList<>();
-        productId.add(insOrders.getProductid());
+        productId.add(insAreaCompany.getProductid());
         agreementProductQueryVo.setProductCode(productId);
         agreementProductQueryVo.setIsAudit("1");
         agreementProductQueryVo.setAgreementId(ptlAgreement.getId());
-        agreementProductQueryVo.setNowCostsId(insOrdersEditingVo.getNowCostsId());
+        agreementProductQueryVo.setNowCostsId(nowCostsId);
 
         List<PtlAgreementProductCostsNew> costsNews = ptlAgreementProductCostsNewService.getByAgreementId(agreementProductQueryVo);
 
@@ -871,6 +921,9 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
 
         InsAreaCompanyExternalFee insAreaCompanyExternalFee = new InsAreaCompanyExternalFee();
         insAreaCompanyExternalFee.setSubOrderNo(subOrderNo);
+        // add by hxl 2024-12-16    添加费用id 和是否现询
+        insAreaCompanyExternalFee.setCostId(insOrdersEditingVo.getNowCostsId());
+        insAreaCompanyExternalFee.setCostFlag(insOrdersEditingVo.getCostFlag());
         if (insOrdersEditingVo.getJqCostsProportion() != null) {
             if (jqSuperviseCostsProportion.compareTo(insOrdersEditingVo.getJqCostsProportion()) > 0) {
                 //总比例等于手续费比例

+ 52 - 3
src/main/java/com/ydtech/modules/order/service/impl/InsCrawlerOrderServiceImpl.java

@@ -11,7 +11,9 @@ import com.ydtech.exception.SystemException;
 import com.ydtech.modules.ins.model.vo.*;
 import com.ydtech.modules.order.components.InsCrawlerOrderComponents;
 import com.ydtech.modules.order.components.InsImagesUploadCacheComponents;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.*;
 import com.ydtech.modules.order.entity.crawler.constants.CrawlerAuditStatus;
 import com.ydtech.modules.order.entity.crawler.constants.CrawlerVerifyPaymentConstants;
@@ -20,6 +22,7 @@ import com.ydtech.modules.order.entity.crawler.response.*;
 import com.ydtech.modules.order.entity.crawler.vo.CrawlerPolicyPrintVo;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import com.ydtech.modules.order.service.*;
@@ -86,6 +89,11 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
     @Autowired
     private InsSubOrderUpdateDetailService insSubOrderUpdateDetailService;
 
+    @Autowired
+    private SysQuoteRecordMapper sysQuoteRecordMapper;
+
+    @Autowired
+    private SysQuoteRedisService sysQuoteRedisService;
 
     @Override
     public void isLogin(PtlAgreementAttributionDto attribution, String companyId, String insCompanyName) {
@@ -100,6 +108,11 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
 
     @Override
     public HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<Object> t) {
+
+        //获取报价次数
+        Integer maxQuoteNum = t.getMaxQuoteNum();
+        List<SysQuoteRecord> sysQuoteRecords = new ArrayList<>();
+        InsOrders order = insOrdersService.getById(t.getOrderNo());
         // 协议id
         String agreementId = t.getAgreementId();
         // 请求地址
@@ -109,7 +122,7 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
 
         CrawlerQuoteRequest crawlerQuoteRequest = new CrawlerQuoteRequest();
         BeanUtils.copyProperties(quoteInfoVo, crawlerQuoteRequest);
-
+        crawlerQuoteRequest.setMaxQuoteNum(maxQuoteNum);
         crawlerQuoteRequest.setUsername(ptlAgreementAttribution.getUsername());
         // 前端传入的驾意险信息
         crawlerQuoteRequest.setAccidentalDriving(t.getAccidentalDrivingVo());
@@ -138,13 +151,29 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
         CrawlerQuoteResponse response = insCrawlerOrderComponents.request(apiUrl, ptlAgreementAttribution.getInsCompanyId(),
                 PtlCrawlerApiType.API_2.getDesc(), crawlerQuoteRequest, CrawlerQuoteResponse.class);
         if (response.getCode() != 200) {
-            InsOrders order = insOrdersService.getById(t.getOrderNo());
+
             //判断错误订单是否是重复投保
             InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
             if(response.getMessage().contains("重复投保")){
                 insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
             }
-            insOrdersService.responseFailedOrder(t,ptlAgreementAttribution,order,response.getMessage(),insOrderStatusEnum);
+            String subOrderNo = insOrdersService.responseFailedOrder(t, ptlAgreementAttribution, order, response.getMessage(), insOrderStatusEnum);
+            if(!Objects.isNull(response.getOther().getMaxQuoteNum())) {
+                int quoteNum = maxQuoteNum - Integer.parseInt(response.getOther().getMaxQuoteNum());
+                for (int i = 0; i < quoteNum; i++) {
+                    SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),t.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                            QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                    sysQuoteRecords.add(sysQuoteRecord);
+                }
+                sysQuoteRecords.forEach(item -> {
+                    item.setSubOrderNo(subOrderNo);
+                });
+                if(sysQuoteRecords.size() > 0) {
+                    sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                    //刷新redis中的报价次数
+                    sysQuoteRedisService.refreshQuoteNum(t.getCompanyId(), quoteInfoVo.getUserid(), sysQuoteRecords);
+                }
+            }
             throw new SystemException(response.getMessage());
         }
 
@@ -175,7 +204,27 @@ public class InsCrawlerOrderServiceImpl implements InsCrawlerOrderService {
 
         //处理订单信息
         QuoteRespVo responseVo = responseOrder(response, quoteRespVo, ptlAgreementAttribution, insAreaCompanyAccidentalDriving);
+        if(!Objects.isNull(response.getOther().getMaxQuoteNum())) {
+            int quoteNum = maxQuoteNum - Integer.parseInt(response.getOther().getMaxQuoteNum());
+            for (int i = 0; i < quoteNum; i++) {
+                SysQuoteRecord sysQuoteRecord;
+                if (i == quoteNum - 1) {
+                    sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),t.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                            QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+                }else{
+                    sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),t.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                            QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                }
 
+                sysQuoteRecords.add(sysQuoteRecord);
+            }
+            sysQuoteRecords.forEach(item -> {
+                item.setSubOrderNo(responseVo.getCompanyId());
+            });
+            sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+            //刷新redis中的报价次数
+            sysQuoteRedisService.refreshQuoteNum(t.getCompanyId(), quoteInfoVo.getUserid(), sysQuoteRecords);
+        }
         return HttpResult.ok("成功", responseVo);
     }
 

+ 32 - 7
src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java

@@ -778,7 +778,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
             // 设置车主信息
             JSONObject ownerInfo = insOrdersExcel.getOwnerInfo();
-            CustomerInfoVo owner = ownerInfo.toJavaObject(CustomerInfoVo.class);
+            CustomerInfoVo owner =  JSON.parseObject(JSON.toJSONString(ownerInfo), CustomerInfoVo.class);
             insOrdersExcel.setOwnerName(owner.getName());
             insOrdersExcel.setOwnerAge(owner.getAge());
             insOrdersExcel.setOwnerMobile(owner.getMobile());
@@ -786,7 +786,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
             // 设置申请人信息
             JSONObject applyInfo = insOrdersExcel.getApplyInfo();
-            CustomerInfoVo apply = applyInfo.toJavaObject(CustomerInfoVo.class);
+            CustomerInfoVo apply = JSON.parseObject(JSON.toJSONString(applyInfo), CustomerInfoVo.class);
             insOrdersExcel.setApplyName(apply.getName());
             insOrdersExcel.setApplyAge(apply.getAge());
             insOrdersExcel.setApplyMobile(apply.getMobile());
@@ -794,7 +794,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
             // 设置被保险人信息
             JSONObject insureInfo = insOrdersExcel.getInsureInfo();
-            CustomerInfoVo insure = insureInfo.toJavaObject(CustomerInfoVo.class);
+            CustomerInfoVo insure = JSON.parseObject(JSON.toJSONString(insureInfo), CustomerInfoVo.class);
             insOrdersExcel.setInsureName(insure.getName());
             insOrdersExcel.setInsureAge(insure.getAge());
             insOrdersExcel.setInsureMobile(insure.getMobile());
@@ -1130,6 +1130,19 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             }
             insOrdersEditingVo.setJypolicyno(application);
 
+            InsFeeAudit feeAuditByInsOrderNo = insFeeAuditService.getFeeAuditByInsOrderNo(insAreaCompanyList.get(0).getId());
+            int status=0;
+            if(feeAuditByInsOrderNo !=null){
+                String auditstatus = feeAuditByInsOrderNo.getAuditstatus();
+                if("2".equals(auditstatus)){
+                    status=1;
+                }else{
+                    status=2;
+                }
+            }
+            //添加订单状态   add by hxl  2024-12-17
+            insOrdersEditingVo.setOrderExternalStatus(status);
+
             InsAreaCompanyExternalPolicy policyByCompanyId = insAreaCompanyExternalPolicyService.getPolicyByCompanyId(insAreaCompanyList.get(0).getId());
 //            insOrdersEditingVo.setExternalPolicy(policyByCompanyId);
 
@@ -1209,6 +1222,13 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
                     insFeeOrderNews.get(0).getNoOtherCostsProportion().compareTo(BigDecimal.ZERO) > 0) {
                 insOrdersEditingVo.setNoCostsProportion(insAreaCompanyExternalFee.getNoSuperviseCostsProportion().add(insAreaCompanyExternalFee.getNoOtherCostsProportion()));
             }
+            // add by hxl 2024-12-16    添加费用id 和是否现询
+            insOrdersEditingVo.setNowCostsId(insAreaCompanyExternalFee.getCostId());
+            insOrdersEditingVo.setCostFlag(insAreaCompanyExternalFee.getCostFlag());
+            insOrdersEditingVo.setJqExportFee(insAreaCompanyExternalFee.getCostFlag());
+            insOrdersEditingVo.setSyExportFee(insAreaCompanyExternalFee.getCostFlag());
+            insOrdersEditingVo.setNoExportFee(insAreaCompanyExternalFee.getCostFlag());
+
         }
 
         //计算费用
@@ -2291,7 +2311,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
     }
 
     @Override
-    public boolean responseFailedOrder(BaseQuoteVo quoteVo, PtlAgreementAttribution ptlAgreementAttribution, InsOrders insOrder, String errorMessage, InsOrderStatusEnum statusEnum) {
+    public String responseFailedOrder(BaseQuoteVo quoteVo, PtlAgreementAttribution ptlAgreementAttribution, InsOrders insOrder, String errorMessage, InsOrderStatusEnum statusEnum) {
 
         //保存订单信息
         InsAreaCompany insAreaCompany = new InsAreaCompany();
@@ -2324,8 +2344,13 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         insAreaCompany.setQuoteErrMsg(errorMessage);
 
         InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving = new InsAreaCompanyAccidentalDriving();
-        insAreaCompanyService.insertCompanyAndOrders(insAreaCompany, insAreaCompanyAccidentalDriving);
-        return true;
+        String s = insAreaCompanyService.insertCompanyAndOrders(insAreaCompany, insAreaCompanyAccidentalDriving);
+        return s;
+    }
+
+    @Override
+    public String responseFailedOrder(String subOrderNo, BaseQuoteVo quoteVo, PtlAgreementAttribution ptlAgreementAttribution, InsOrders insOrder, String errorMessage, InsOrderStatusEnum statusEnum) {
+        return null;
     }
 
     /**
@@ -2452,7 +2477,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         final int day = 30;
         DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         LocalDate startDate = LocalDate.parse(signStartDateStr, pattern);
-        LocalDate endDate = LocalDate.parse(signStartDateStr, pattern);
+        LocalDate endDate = LocalDate.parse(signEndDateStr, pattern);
         long between = ChronoUnit.DAYS.between(startDate, endDate);
         if (between > day) {
             LocalDate localDate = endDate.minusDays(day);

+ 1 - 1
src/main/java/com/ydtech/modules/order/service/impl/InsuranceCompanyPolymerizationServiceImpl.java

@@ -70,7 +70,7 @@ public class InsuranceCompanyPolymerizationServiceImpl implements InsuranceCompa
             return zhongMeiOrderApiService.cancelOrder(insAreaCompany);
         }
         else if (InsuranceEnum.YGBX.getCode().equals(code)) {
-            return yangGuangOrderApiService.autoWriteOff(companyId);
+            return yangGuangOrderApiService.autoWriteOffOrder(companyId);
         }
         return false;
     }

+ 349 - 0
src/main/java/com/ydtech/modules/order/service/impl/SysQuoteConfigServiceImpl.java

@@ -0,0 +1,349 @@
+package com.ydtech.modules.order.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ydtech.exception.SystemException;
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.service.SysUserService;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
+import com.ydtech.modules.order.dao.*;
+import com.ydtech.modules.order.entity.InsOrders;
+import com.ydtech.modules.order.entity.PtlAgreementNonCarProductRule;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
+import com.ydtech.modules.order.entity.po.SysQuoteUser;
+import com.ydtech.modules.order.entity.po.SysQuoteUserConfigAppend;
+import com.ydtech.modules.order.entity.vo.DrivingInsuranceQueryVo;
+import com.ydtech.modules.order.entity.vo.QuoteDetailsQueryVo;
+import com.ydtech.modules.order.entity.vo.QuoteDetailsVo;
+import com.ydtech.modules.order.entity.vo.QuoteNumRedisVo;
+import com.ydtech.modules.order.service.InsOrdersService;
+import com.ydtech.modules.order.service.PtlAgreementNonCarProductRuleService;
+import com.ydtech.modules.order.service.SysQuoteConfigService;
+import com.ydtech.modules.order.service.SysQuoteRedisService;
+import com.ydtech.modules.protocol.entity.po.PtlAgreement;
+import com.ydtech.modules.protocol.service.PtlAgreementService;
+import com.ydtech.utils.idgen.IdGenerate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 服务实现类
+ */
+@Service
+public class SysQuoteConfigServiceImpl extends ServiceImpl<SysQuoteConfigMapper, SysQuoteConfig>
+        implements SysQuoteConfigService {
+
+    @Autowired
+    SysQuoteUserMapper sysQuoteUserMapper;
+
+    @Autowired
+    SysQuoteUserConfigAppendMapper sysQuoteUserConfigAppendMapper;
+
+    @Autowired
+    InsOrdersService insOrdersService;
+
+    @Autowired
+    SysQuoteRecordMapper sysQuoteRecordMapper;
+
+    @Autowired
+    SysQuoteRedisService sysQuoteRedisService;
+
+    @Autowired
+    SysUserService sysUserService;
+
+    /**
+     * 检查报价限制
+     * @return
+     */
+    @Override
+    public boolean checkQuoteLimitation(String userId,String companyId,String licenseNo) {
+        //读取配置
+        QuoteNumRedisVo quoteNumberRedisData = sysQuoteRedisService.getQuoteNumberRedisData(userId);
+
+        //如果没有数据则查询数据库
+        if(Objects.isNull(quoteNumberRedisData)){
+            List<SysQuoteConfig> sysQuoteConfigs = this.getUserQuoteNumber(userId);
+            quoteNumberRedisData = sysQuoteRedisService.assembleQuoteRedisData(userId, sysQuoteConfigs);
+            //存储redis数据
+            sysQuoteRedisService.saveRedisData(quoteNumberRedisData);
+        }
+//
+//        //获取规则报价次数数据
+//        QuoteNumRedisVo.QuoteNumberCompanyVo quoteNumberCompanyVo = quoteNumberRedisData.getOriginalCompanyList().stream()
+//                .filter(company -> company.getCompanyId().equals(companyId)).findFirst().orElse(null);
+//
+//        if(!Objects.isNull(quoteNumberCompanyVo)){
+//            Integer dayMaxQuote = quoteNumberCompanyVo.getDayMaxQuoteNum();
+//            Integer carMaxQuote = quoteNumberCompanyVo.getCarMaxQuoteNum();
+//            BigDecimal orderRatio = quoteNumberCompanyVo.getOrderRatio();
+//            //获取已报价次数数据
+//            QuoteNumRedisVo.QuoteNumberCompanyVo alreadyQuoteNumberCompanyVo = quoteNumberRedisData.getQuoteCompanyList().stream()
+//                    .filter(company -> company.getCompanyId().equals(companyId)).findFirst().orElse(null);
+//            Integer alreadyDayQuoteNum = alreadyQuoteNumberCompanyVo.getDayMaxQuoteNum();
+//
+//            //获取车牌已报价次数
+//            Integer alreadyCarQuoteNum = 0;
+//            QuoteNumRedisVo.CarQuoteNumberVo carQuoteNumberVo = quoteNumberRedisData.getCarList().stream()
+//                    .filter(car -> car.getLicenseNo().equals(licenseNo)).findFirst().orElse(null);
+//            if(!Objects.isNull(carQuoteNumberVo)){
+//                alreadyCarQuoteNum = carQuoteNumberVo.getQuoteNum();
+//            }
+//
+//            //校验规则 是否能报价
+//            if(dayMaxQuote <= alreadyDayQuoteNum || carMaxQuote <= alreadyCarQuoteNum){
+//                return false;
+//            }
+//        }
+        Integer maxQuoteNum = sysQuoteRedisService.getMaxQuoteNum(companyId, userId, licenseNo);
+        if(maxQuoteNum <= 0) {
+            return false;
+        }
+        sysQuoteRedisService.quoteAfterRedisData(companyId, userId, licenseNo, 0);
+        return true;
+    }
+
+    /**
+     * 获取保险公司的报价次数
+     * @param userId
+     * @return
+     */
+    @Override
+    public QuoteNumRedisVo.QuoteNumberCompanyVo getUserQuoteNumber(String userId, String companyId) {
+
+        QuoteNumRedisVo.QuoteNumberCompanyVo quoteNumberCompanyVo = new QuoteNumRedisVo.QuoteNumberCompanyVo();
+        quoteNumberCompanyVo.setCompanyId(companyId);
+
+        //查询保险公司报价次数配置
+        SysQuoteConfig sysQuoteConfig = baseMapper.selectOne(new LambdaQueryWrapper<SysQuoteConfig>()
+                .eq(SysQuoteConfig::getCompanyId, companyId));
+
+        if(!Objects.isNull(sysQuoteConfig)) {
+            //查询是否有附加的用户报价次数配置
+            List<SysQuoteUserConfigAppend> sysQuoteUserConfigAppends = sysQuoteUserConfigAppendMapper.selectList(new LambdaQueryWrapper<SysQuoteUserConfigAppend>()
+                    .eq(SysQuoteUserConfigAppend::getUserId, BaseController.getUserId())
+                    .eq(SysQuoteUserConfigAppend::getCompanyId, companyId));
+
+            //与配置的总次数累加
+            SysQuoteUserConfigAppend sysQuoteUserConfigAppend = new SysQuoteUserConfigAppend();
+            sysQuoteUserConfigAppends.forEach(item -> {
+                sysQuoteUserConfigAppend.setCarMaxQuoteNum(item.getCarMaxQuoteNum() + sysQuoteUserConfigAppend.getCarMaxQuoteNum());
+                sysQuoteUserConfigAppend.setDayMaxQuoteNum(item.getDayMaxQuoteNum() + sysQuoteUserConfigAppend.getDayMaxQuoteNum());
+            });
+            //合成总次数
+            quoteNumberCompanyVo.setDayMaxQuoteNum(sysQuoteConfig.getDayMaxQuoteNum() + sysQuoteUserConfigAppend.getDayMaxQuoteNum());
+            quoteNumberCompanyVo.setCarMaxQuoteNum(sysQuoteConfig.getCarMaxQuoteNum() + sysQuoteUserConfigAppend.getCarMaxQuoteNum());
+        }
+        return quoteNumberCompanyVo;
+    }
+
+    /**
+     * 获取保险公司的报价次数
+     * @param userId
+     * @return
+     */
+    public List<SysQuoteConfig> getUserQuoteNumber(String userId){
+//        List<SysQuoteConfig> sysQuoteConfigs = baseMapper.selectList(new LambdaQueryWrapper<SysQuoteConfig>()
+//                .eq(SysQuoteConfig::getIsEnabled,1));
+        List<SysQuoteConfig> sysQuoteConfigs = sysQuoteUserMapper.getQuoteUserConfig(userId);
+        return sysQuoteConfigs;
+    }
+
+    /**
+     * 设置配置信息
+     */
+    @Override
+    @Transactional
+    public boolean setQuoteInfo(SysQuoteConfig sysQuoteConfig) {
+        boolean result = false;
+        if(Objects.isNull(sysQuoteConfig.getCompanyId())){
+            throw new SystemException("未找到公司信息");
+        }
+
+        //判断是否存在配置信息
+        SysQuoteConfig quoteConfig = baseMapper.selectOne(new LambdaQueryWrapper<SysQuoteConfig>()
+                .eq(SysQuoteConfig::getCompanyId, sysQuoteConfig.getCompanyId()));
+        if(Objects.isNull(quoteConfig)){
+            //新增操作
+            String id = IdGenerate.nextId();
+            sysQuoteConfig.setId(id);
+            sysQuoteConfig.setCreateTime(LocalDateTime.now());
+            sysQuoteConfig.setCreateBy(BaseController.getUserId());
+            result = this.save(sysQuoteConfig);
+            if(Objects.equals(sysQuoteConfig.getAuthorize(), QuoteNumberConstant.QuoteAuthorizeType.PART.getCode())){
+                //组装用户数据
+                List<String> userIds = sysQuoteConfig.getProxyList().stream().map(proxy->proxy.getId()).collect(Collectors.toList());
+                List<SysQuoteUser> sysQuoteUsers = SysQuoteUser.getSysQuoteUserList(sysQuoteConfig.getId(), userIds);
+                sysQuoteUserMapper.insertBatch(sysQuoteUsers);
+                //更新redis数据
+                sysQuoteRedisService.updateAllQuoteRedis(sysQuoteConfig);
+            }
+        }else{
+            quoteConfig.setUpdateTime(LocalDateTime.now());
+            quoteConfig.setUpdateBy(BaseController.getUserId());
+            quoteConfig.setCarMaxQuoteNum(Objects.isNull(sysQuoteConfig.getCarMaxQuoteNum()) ? 0 : sysQuoteConfig.getCarMaxQuoteNum());
+            quoteConfig.setDayMaxQuoteNum(Objects.isNull(sysQuoteConfig.getDayMaxQuoteNum())? 0 : sysQuoteConfig.getDayMaxQuoteNum());
+            quoteConfig.setOrderRatio(Objects.isNull(sysQuoteConfig.getOrderRatio())? new BigDecimal(BigInteger.ZERO) : sysQuoteConfig.getOrderRatio());
+            quoteConfig.setAuthorize(sysQuoteConfig.getAuthorize());
+            quoteConfig.setIsEnabled(sysQuoteConfig.getIsEnabled());
+            result = this.updateById(quoteConfig);
+
+            if(Objects.equals(sysQuoteConfig.getAuthorize(), QuoteNumberConstant.QuoteAuthorizeType.PART.getCode())){
+                sysQuoteUserMapper.delete(new LambdaQueryWrapper<SysQuoteUser>()
+                        .eq(SysQuoteUser::getConfigId, sysQuoteConfig.getId()));
+                //组装用户数据
+                List<String> userIds = sysQuoteConfig.getProxyList().stream().map(proxy->proxy.getId()).collect(Collectors.toList());
+                List<SysQuoteUser> sysQuoteUsers = SysQuoteUser.getSysQuoteUserList(sysQuoteConfig.getId(), userIds);
+                sysQuoteUserMapper.insertBatch(sysQuoteUsers);
+            }
+            List<String> redisUserIds = sysQuoteRedisService.searchKeysWithScan(QuoteNumberConstant.QUOTE_NUMBER_KEY + "*");
+            redisUserIds.forEach(item->{
+                sysQuoteRedisService.delQuoteRedis(item.substring(QuoteNumberConstant.QUOTE_NUMBER_KEY.length()));
+            });
+        }
+
+        return result;
+    }
+
+    /**
+     * 获取报价次数配置信息
+     */
+    @Override
+    public SysQuoteConfig getQuoteConfigInfo(String companyId) {
+        SysQuoteConfig sysQuoteConfig = baseMapper.selectOne(new LambdaQueryWrapper<SysQuoteConfig>()
+                .eq(SysQuoteConfig::getCompanyId, companyId));
+        if(Objects.isNull(sysQuoteConfig)){
+            throw new SystemException("未找到配置信息");
+        }
+
+        if(Objects.equals(sysQuoteConfig.getAuthorize(), QuoteNumberConstant.QuoteAuthorizeType.PART.getCode())){
+            //查询关联的用户
+            List<SysQuoteUser> sysQuoteUsers = sysQuoteUserMapper.selectList(new LambdaQueryWrapper<SysQuoteUser>()
+                  .eq(SysQuoteUser::getConfigId, sysQuoteConfig.getId()));
+            List<String> users = sysQuoteUsers.stream().map(user -> user.getUserId()).collect(Collectors.toList());
+            List<SysUser> sysUsers = sysUserService.getByIds(users);
+            sysQuoteConfig.setProxyList(sysUsers);
+        }
+        return sysQuoteConfig;
+    }
+
+    /**
+     * 关联用户
+     */
+    @Override
+    @Transactional
+    public boolean connectUser(String configId, List<String> userIds) {
+        //删除原数据
+        sysQuoteUserMapper.delete(new LambdaQueryWrapper<SysQuoteUser>()
+                .eq(SysQuoteUser::getConfigId, configId));
+
+        List<SysQuoteUser> sysQuoteUsers = new ArrayList<>();
+
+        userIds.forEach(userId->{
+            SysQuoteUser sysQuoteUser = new SysQuoteUser();
+            sysQuoteUser.setId(IdGenerate.nextId());
+            sysQuoteUser.setConfigId(configId);
+            sysQuoteUser.setUserId(userId);
+            sysQuoteUsers.add(sysQuoteUser);
+        });
+
+        sysQuoteUsers.forEach(item->{
+            sysQuoteUserMapper.insert(item);
+        });
+        return true;
+    }
+
+    /**
+     * 追加配置
+     */
+    @Override
+    public boolean quoteConfigAppend(SysQuoteUserConfigAppend sysQuoteUserConfigAppend){
+        if(Objects.isNull(sysQuoteUserConfigAppend.getUserId()) || "".equals(sysQuoteUserConfigAppend.getUserId())){
+            throw new SystemException("未找到用户信息");
+        }
+        sysQuoteUserConfigAppend.setCarMaxQuoteNum(sysQuoteUserConfigAppend.getQuoteNumber());
+        sysQuoteUserConfigAppend.setDayMaxQuoteNum(sysQuoteUserConfigAppend.getQuoteNumber());
+        sysQuoteUserConfigAppend.setStartTime(LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT));
+        sysQuoteUserConfigAppend.setEndTime(LocalDateTime.of(LocalDate.now(), LocalTime.MAX));
+        sysQuoteUserConfigAppend.setCreateTime(LocalDateTime.now());
+        sysQuoteUserConfigAppend.setCreateBy(BaseController.getUserId());
+        int insert = sysQuoteUserConfigAppendMapper.insert(sysQuoteUserConfigAppend);
+        if(insert > 0){
+            sysQuoteRedisService.updateUserQuoteAppendRedis(sysQuoteUserConfigAppend);
+        }
+        return insert > 0;
+    }
+
+    @Override
+    public Page<QuoteDetailsVo> getAppendUserQuote(Page page,QuoteDetailsQueryVo quoteDetailsQueryVo) {
+        Page<QuoteDetailsVo> appendUserQuote = sysQuoteUserConfigAppendMapper.getAppendUserQuote(page,quoteDetailsQueryVo);
+        return appendUserQuote;
+    }
+
+    /**
+     * 根据保险公司获取今天用户追加的数据
+     */
+    @Override
+    public List<SysQuoteUserConfigAppend> getTodayAppendData(String companyId){
+        List<SysQuoteUserConfigAppend> sysQuoteUserConfigAppends = sysQuoteUserConfigAppendMapper.selectList(new LambdaQueryWrapper<SysQuoteUserConfigAppend>()
+                .eq(SysQuoteUserConfigAppend::getCompanyId, companyId)
+                .ge(SysQuoteUserConfigAppend::getCreateTime, LocalDate.now().atStartOfDay()) // 起始时间
+                .lt(SysQuoteUserConfigAppend::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay()));
+        return sysQuoteUserConfigAppends;
+    }
+
+    @Override
+    public Page<QuoteDetailsVo> getQuoteRecordPage(Page page, QuoteDetailsQueryVo quoteDetailsQueryVo) {
+        if(quoteDetailsQueryVo.getDeptId() == null) {
+            quoteDetailsQueryVo.setDeptId(BaseController.getDeptId());
+        }
+        Page<QuoteDetailsVo> quoteRecordPage = sysQuoteRecordMapper.getQuoteRecordPage(page, quoteDetailsQueryVo);
+        quoteRecordPage.getRecords().forEach(item -> {
+            item.setAction(QuoteNumberConstant.QuoteAction.getByCode(item.getAction()));
+            item.setResult(QuoteNumberConstant.QuoteResult.getByCode(item.getResult()));
+        });
+        return quoteRecordPage;
+    }
+
+    @Override
+    public Page<QuoteDetailsVo> getQuoteRequestRecordPage(Page page, QuoteDetailsQueryVo quoteDetailsQueryVo) {
+        if(quoteDetailsQueryVo.getDeptId() == null) {
+            quoteDetailsQueryVo.setDeptId(BaseController.getDeptId());
+        }
+        Page<QuoteDetailsVo> quoteRecordPage = sysQuoteRecordMapper.getQuoteRequestRecordPage(page, quoteDetailsQueryVo);
+        quoteRecordPage.getRecords().forEach(item -> {
+            item.setAction(QuoteNumberConstant.QuoteAction.getByCode(item.getAction()));
+            item.setResult(QuoteNumberConstant.QuoteResult.getByCode(item.getResult()));
+        });
+        return quoteRecordPage;
+    }
+
+    @Override
+    public Page<QuoteDetailsVo> getQuoteDetails(Page page, QuoteDetailsQueryVo quoteDetailsQueryVo){
+        if(quoteDetailsQueryVo.getDeptId() == null) {
+            quoteDetailsQueryVo.setDeptId(BaseController.getDeptId());
+        }
+        Page<QuoteDetailsVo> quoteDetailsVoPage = sysQuoteRecordMapper.getQuoteDetails(page, quoteDetailsQueryVo);
+        quoteDetailsVoPage.getRecords().forEach(item -> {
+            item.setAction(QuoteNumberConstant.QuoteAction.getByCode(item.getAction()));
+            item.setResult(QuoteNumberConstant.QuoteResult.getByCode(item.getResult()));
+        });
+        return quoteDetailsVoPage;
+    }
+
+}

+ 423 - 0
src/main/java/com/ydtech/modules/order/service/impl/SysQuoteRedisServiceImpl.java

@@ -0,0 +1,423 @@
+package com.ydtech.modules.order.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ydtech.exception.SystemException;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
+import com.ydtech.modules.order.dao.SysQuoteConfigMapper;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
+import com.ydtech.modules.order.dao.SysQuoteUserConfigAppendMapper;
+import com.ydtech.modules.order.dao.SysQuoteUserMapper;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
+import com.ydtech.modules.order.entity.po.SysQuoteUser;
+import com.ydtech.modules.order.entity.po.SysQuoteUserConfigAppend;
+import com.ydtech.modules.order.entity.vo.QuoteNumRedisVo;
+import com.ydtech.modules.order.service.InsOrdersService;
+import com.ydtech.modules.order.service.SysQuoteConfigService;
+import com.ydtech.modules.order.service.SysQuoteRedisService;
+import com.ydtech.utils.idgen.IdGenerate;
+import lombok.var;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ScanOptions;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static com.ydtech.modules.order.constants.QuoteNumberConstant.QUOTE_NUMBER_KEY;
+
+/**
+ * 服务实现类
+ */
+@Service
+public class SysQuoteRedisServiceImpl implements SysQuoteRedisService {
+
+    @Autowired
+    SysQuoteUserMapper sysQuoteUserMapper;
+
+    @Autowired
+    SysQuoteUserConfigAppendMapper sysQuoteUserConfigAppendMapper;
+
+    @Autowired
+    InsOrdersService insOrdersService;
+
+    @Autowired
+    SysQuoteRecordMapper sysQuoteRecordMapper;
+
+    @Autowired
+    RedisTemplate redisTemplate;
+
+
+    @Autowired
+    SysQuoteConfigService sysQuoteConfigService;
+
+    /**
+     * 模糊搜索报价次数的keys
+     * @param pattern
+     * @return
+     */
+    @Override
+    public List<String> searchKeysWithScan(String pattern) {
+        List<String> keys = new ArrayList<>();
+
+        redisTemplate.execute((RedisCallback<Object>) connection -> {
+            ScanOptions options = ScanOptions.scanOptions()
+                    .match(pattern) // 匹配
+                    .build();
+
+            try (var cursor = connection.scan(options)) {
+                cursor.forEachRemaining(item -> keys.add(new String(item)));
+            }
+            return null;
+        });
+
+        return keys;
+    }
+
+
+    /**
+     * 组装报价次数的redis数据
+     * @return
+     */
+    @Override
+    public QuoteNumRedisVo assembleQuoteRedisData(String userId,List<SysQuoteConfig> sysQuoteConfigs){
+        QuoteNumRedisVo quoteNumRedisVo = new QuoteNumRedisVo();
+        quoteNumRedisVo.setUserId(userId);
+
+        //查询用户今日的追加报价配置
+        List<SysQuoteUserConfigAppend> sysQuoteUserConfigAppendList = sysQuoteUserConfigAppendMapper.selectList(new LambdaQueryWrapper<SysQuoteUserConfigAppend>()
+              .eq(SysQuoteUserConfigAppend::getUserId, userId)
+                .ge(SysQuoteUserConfigAppend::getStartTime, LocalDate.now())
+                .le(SysQuoteUserConfigAppend::getEndTime, LocalDate.now().plusDays(1)));
+
+        sysQuoteConfigs.forEach(quoteConfig -> {
+            List<SysQuoteUserConfigAppend> appends = sysQuoteUserConfigAppendList.stream()
+                    .filter(append -> append.getCompanyId().equals(quoteConfig.getCompanyId())).collect(Collectors.toList());
+            //用户的追加报价次数
+            appends.forEach(append->{
+                quoteConfig.setDayMaxQuoteNum(quoteConfig.getDayMaxQuoteNum() + append.getDayMaxQuoteNum());
+                quoteConfig.setCarMaxQuoteNum(quoteConfig.getCarMaxQuoteNum() + append.getCarMaxQuoteNum());
+            });
+        });
+
+        List<QuoteNumRedisVo.QuoteNumberCompanyVo> originalCompanyList = new ArrayList<>();
+        sysQuoteConfigs.forEach(quoteConfig -> {
+            QuoteNumRedisVo.QuoteNumberCompanyVo quoteNumberCompanyVo = new QuoteNumRedisVo.QuoteNumberCompanyVo(quoteConfig);
+            originalCompanyList.add(quoteNumberCompanyVo);
+        });
+
+        //原始的报价数据
+        quoteNumRedisVo.setOriginalCompanyList(originalCompanyList);
+
+        // 获取今日报价的次数 进行数组组装
+        List<SysQuoteRecord> sysQuoteRecords = sysQuoteRecordMapper.selectList(new LambdaQueryWrapper<SysQuoteRecord>()
+                .eq(SysQuoteRecord::getUserId, userId)
+                .ge(SysQuoteRecord::getCreateTime, LocalDate.now())
+                .lt(SysQuoteRecord::getCreateTime, LocalDate.now().plusDays(1)));
+
+        //根据保险公司分组
+        Map<String, List<SysQuoteRecord>> sysQuoteRecordGroup = sysQuoteRecords.stream().collect(Collectors.groupingBy(SysQuoteRecord::getCompanyId));
+
+        List<QuoteNumRedisVo.QuoteNumberCompanyVo> quoteNumberCompanyList = new ArrayList<>();
+        sysQuoteRecordGroup.forEach((key, value) -> {
+            QuoteNumRedisVo.QuoteNumberCompanyVo quoteNumberCompanyVo = new QuoteNumRedisVo.QuoteNumberCompanyVo();
+            quoteNumberCompanyVo.setCompanyId(key);
+            quoteNumberCompanyVo.setDayMaxQuoteNum(value.size());
+            quoteNumberCompanyList.add(quoteNumberCompanyVo);
+        });
+        quoteNumRedisVo.setQuoteCompanyList(quoteNumberCompanyList);
+
+        //根据车牌进行分组
+        List<QuoteNumRedisVo.CarQuoteNumberVo> carQuoteNumberList = new ArrayList<>();
+
+        Map<Map.Entry<String, String>, List<SysQuoteRecord>> grouped = sysQuoteRecords.stream()
+                .collect(Collectors.groupingBy(record -> new AbstractMap.SimpleEntry<>(record.getCompanyId(), record.getLicenseNo())));
+
+        grouped.forEach((key, value) -> {
+            QuoteNumRedisVo.CarQuoteNumberVo carQuoteNumberVo = new QuoteNumRedisVo.CarQuoteNumberVo();
+            carQuoteNumberVo.setCompanyId(key.getKey());
+            carQuoteNumberVo.setLicenseNo(key.getValue());
+            carQuoteNumberVo.setQuoteNum(value.size());
+            carQuoteNumberList.add(carQuoteNumberVo);
+        });
+        quoteNumRedisVo.setCarList(carQuoteNumberList);
+
+        return quoteNumRedisVo;
+    }
+
+    @Override
+    public void saveRedisData(QuoteNumRedisVo quoteNumberRedis) {
+        redisTemplate.opsForValue().set(getQuoteNumberRedisKey(quoteNumberRedis.getUserId()), JSONObject.toJSONString(quoteNumberRedis));
+    }
+
+    /**
+     * 获取报价次数缓存key
+     * @param userId
+     * @return
+     */
+    @Override
+    public String getQuoteNumberRedisKey(String userId){
+        return QUOTE_NUMBER_KEY + userId;
+    }
+
+    /**
+     * 从redis获取用户报价次数的数据
+     * @param userId
+     * @return
+     */
+    @Override
+    public QuoteNumRedisVo getQuoteNumberRedisData(String userId) {
+        QuoteNumRedisVo quoteNumRedisVo = null;
+        if(!Objects.isNull(redisTemplate.opsForValue().get(getQuoteNumberRedisKey(userId))))
+        {
+            String jsonStr = redisTemplate.opsForValue().get(getQuoteNumberRedisKey(userId)).toString();
+            quoteNumRedisVo = JSONObject.parseObject(jsonStr, QuoteNumRedisVo.class);
+        }
+        return quoteNumRedisVo;
+    }
+
+    @Override
+    public void setQuoteRecordRedis(String userId,QuoteNumRedisVo quoteNumRedisVo) {
+        redisTemplate.opsForValue().set(getQuoteNumberRedisKey(userId), JSONObject.toJSONString(quoteNumRedisVo));
+    }
+
+    @Override
+    public void delQuoteRedis(String userId) {
+        redisTemplate.delete(getQuoteNumberRedisKey(userId));
+    }
+
+    @Override
+    public boolean updateAllQuoteRedis(SysQuoteConfig sysQuoteConfig) {
+        Map<String,String> updateRedisMap = new HashMap<>();
+
+        //查找出所有的key
+        List<String> keys = this.searchKeysWithScan(QuoteNumberConstant.QUOTE_NUMBER_KEY + "*");
+
+        //查找出所有的追加的配置信息
+        List<SysQuoteUserConfigAppend> sysQuoteUserConfigAppendList = sysQuoteUserConfigAppendMapper.selectList(new LambdaQueryWrapper<SysQuoteUserConfigAppend>()
+                .eq(SysQuoteUserConfigAppend::getCompanyId, sysQuoteConfig.getCompanyId())
+                .ge(SysQuoteUserConfigAppend::getCreateTime, LocalDate.now())
+                .lt(SysQuoteUserConfigAppend::getCreateTime, LocalDate.now()));
+
+        keys.forEach(key->{
+            QuoteNumRedisVo quoteNumRedisVo;
+            if(Objects.isNull(redisTemplate.opsForValue().get(getQuoteNumberRedisKey(BaseController.getUserId())))){
+                List<SysQuoteConfig> sysQuoteConfigs = sysQuoteConfigService.getUserQuoteNumber(BaseController.getUserId());
+                quoteNumRedisVo = assembleQuoteRedisData(BaseController.getUserId(), sysQuoteConfigs);
+            }else{
+                String jsonStr = redisTemplate.opsForValue().get(getQuoteNumberRedisKey(BaseController.getUserId())).toString();
+                quoteNumRedisVo = new QuoteNumRedisVo(jsonStr);
+
+            }
+            //判断是否存在 新加规则的保险公司
+            if(quoteNumRedisVo.getOriginalCompanyList().stream().anyMatch(x-> x.getCompanyId().equals(sysQuoteConfig.getCompanyId()))) {
+                quoteNumRedisVo.getOriginalCompanyList().forEach(company -> {
+                    if (company.getCompanyId().equals(sysQuoteConfig.getCompanyId())) {
+                        List<SysQuoteUserConfigAppend> appends = sysQuoteUserConfigAppendList.stream()
+                                .filter(append -> append.getUserId().equals(quoteNumRedisVo.getUserId())).collect(Collectors.toList());
+                        company.setDayMaxQuoteNum(sysQuoteConfig.getDayMaxQuoteNum());
+                        company.setCarMaxQuoteNum(sysQuoteConfig.getCarMaxQuoteNum());
+                        company.setOrderRatio(sysQuoteConfig.getOrderRatio());
+                        //每个用户的追加次数
+                        appends.forEach(append -> {
+                            company.setDayMaxQuoteNum(company.getDayMaxQuoteNum() + append.getDayMaxQuoteNum());
+                            company.setCarMaxQuoteNum(company.getCarMaxQuoteNum() + append.getCarMaxQuoteNum());
+                        });
+                    }
+                });
+            }else{
+                QuoteNumRedisVo.QuoteNumberCompanyVo redisVo = new QuoteNumRedisVo.QuoteNumberCompanyVo();
+                redisVo.setCompanyId(sysQuoteConfig.getCompanyId());
+                redisVo.setCarMaxQuoteNum(sysQuoteConfig.getCarMaxQuoteNum());
+                redisVo.setDayMaxQuoteNum(sysQuoteConfig.getDayMaxQuoteNum());
+                redisVo.setOrderRatio(sysQuoteConfig.getOrderRatio());
+                quoteNumRedisVo.getOriginalCompanyList().add(redisVo);
+            }
+            updateRedisMap.put(key, JSONObject.toJSONString(quoteNumRedisVo));
+        });
+        //批量更新数据
+        redisTemplate.opsForValue().multiSet(updateRedisMap);
+        return true;
+    }
+
+    /**
+     * 更新用户追加的缓存数据
+     * @param sysQuoteUserConfigAppend
+     * @return
+     */
+    @Override
+    public boolean updateUserQuoteAppendRedis(SysQuoteUserConfigAppend sysQuoteUserConfigAppend) {
+        QuoteNumRedisVo quoteNumRedisVo;
+        if(Objects.isNull(redisTemplate.opsForValue().get(getQuoteNumberRedisKey(sysQuoteUserConfigAppend.getUserId())))){
+            List<SysQuoteConfig> sysQuoteConfigs = sysQuoteConfigService.getUserQuoteNumber(sysQuoteUserConfigAppend.getUserId());
+            quoteNumRedisVo = assembleQuoteRedisData(sysQuoteUserConfigAppend.getUserId(), sysQuoteConfigs);
+        }else{
+            String jsonStr = redisTemplate.opsForValue().get(getQuoteNumberRedisKey(sysQuoteUserConfigAppend.getUserId())).toString();
+            quoteNumRedisVo = new QuoteNumRedisVo(jsonStr);
+
+        }
+        quoteNumRedisVo.getOriginalCompanyList().forEach(company->{
+            if(company.getCompanyId().equals(sysQuoteUserConfigAppend.getCompanyId())){
+                company.setDayMaxQuoteNum(company.getDayMaxQuoteNum() + sysQuoteUserConfigAppend.getDayMaxQuoteNum());
+                company.setCarMaxQuoteNum(company.getCarMaxQuoteNum() + sysQuoteUserConfigAppend.getCarMaxQuoteNum());
+            }
+        });
+        redisTemplate.opsForValue().set(getQuoteNumberRedisKey(sysQuoteUserConfigAppend.getUserId()), JSONObject.toJSONString(quoteNumRedisVo));
+        return true;
+    }
+
+    /**
+     * 报价之后redis数据更新
+     * @param companyId
+     * @param userId
+     * @param licenseNo
+     * @param num
+     * @return
+     */
+    @Override
+    public void quoteAfterRedisData(String companyId,String userId,String licenseNo,Integer num){
+        QuoteNumRedisVo quoteNumberRedisData = getQuoteNumberRedisData(userId);
+        //判断缓存中的报价保险公司是否存在
+        boolean isExists = quoteNumberRedisData.getQuoteCompanyList().stream().anyMatch(company -> company.getCompanyId().equals(companyId));
+        if(isExists) {
+            quoteNumberRedisData.getQuoteCompanyList().forEach(company -> {
+                if (company.getCompanyId().equals(companyId)) {
+                    company.setDayMaxQuoteNum(company.getDayMaxQuoteNum() + num);
+                }
+            });
+        }else{
+            List<QuoteNumRedisVo.QuoteNumberCompanyVo> quoteCompanyList = quoteNumberRedisData.getQuoteCompanyList();
+            QuoteNumRedisVo.QuoteNumberCompanyVo quoteNumberCompanyVo = new QuoteNumRedisVo.QuoteNumberCompanyVo();
+            quoteNumberCompanyVo.setCompanyId(companyId);
+            quoteNumberCompanyVo.setDayMaxQuoteNum(num);
+            quoteCompanyList.add(quoteNumberCompanyVo);
+            quoteNumberRedisData.setQuoteCompanyList(quoteCompanyList);
+        }
+
+        //判断缓存中的车牌报价是否存在
+        boolean carIsExists = quoteNumberRedisData.getCarList().stream().anyMatch(car -> car.getLicenseNo().equals(licenseNo));
+        if(carIsExists){
+            quoteNumberRedisData.getCarList().forEach(car -> {
+                if(car.getLicenseNo().equals(licenseNo)){
+                    car.setQuoteNum(car.getQuoteNum() + num);
+                }
+            });
+        }else{
+            List<QuoteNumRedisVo.CarQuoteNumberVo> carList = quoteNumberRedisData.getCarList();
+            QuoteNumRedisVo.CarQuoteNumberVo carQuoteNumberVo = new QuoteNumRedisVo.CarQuoteNumberVo();
+            carQuoteNumberVo.setLicenseNo(licenseNo);
+            carQuoteNumberVo.setQuoteNum(num);
+            carQuoteNumberVo.setCompanyId(companyId);
+            carList.add(carQuoteNumberVo);
+            quoteNumberRedisData.setCarList(carList);
+        }
+
+        redisTemplate.opsForValue().set(getQuoteNumberRedisKey(userId), JSONObject.toJSONString(quoteNumberRedisData));
+    }
+
+    /**
+     * 根据车辆信息获取最大的报价次数
+     */
+    @Override
+    public Integer getMaxQuoteNum(String companyId, String userId, String licenseNo) {
+        Integer maxQuoteNum = 9999;
+        //当天最大报价的次数
+        Integer dayMaxQuoteNum = 0;
+        // 当天已经报价的次数
+        Integer dayAlreadyQuoteNum = 0;
+        //车辆最大报价的次数
+        Integer carMaxQuoteNum = 0;
+        //车辆已经报价的次数
+        Integer carAlreadyQuoteNum = 0;
+        QuoteNumRedisVo quoteNumberRedisData = getQuoteNumberRedisData(userId);
+        QuoteNumRedisVo.QuoteNumberCompanyVo quoteNumberCompanyVo1 = quoteNumberRedisData.getOriginalCompanyList().stream()
+                .filter(company -> company.getCompanyId().equals(companyId)).findFirst().orElse(null);
+        if(!Objects.isNull(quoteNumberCompanyVo1)){
+
+            dayMaxQuoteNum = quoteNumberCompanyVo1.getDayMaxQuoteNum();
+            carMaxQuoteNum = quoteNumberCompanyVo1.getCarMaxQuoteNum();
+
+
+            QuoteNumRedisVo.QuoteNumberCompanyVo quoteNumberCompanyVo = quoteNumberRedisData.getQuoteCompanyList().stream()
+                    .filter(company -> company.getCompanyId().equals(companyId)).findFirst().orElse(null);
+            if(!Objects.isNull(quoteNumberCompanyVo)){
+                dayAlreadyQuoteNum = quoteNumberCompanyVo.getDayMaxQuoteNum();
+            }
+
+            QuoteNumRedisVo.CarQuoteNumberVo carQuoteNumberVo = quoteNumberRedisData.getCarList().stream()
+                    .filter(car -> car.getLicenseNo().equals(licenseNo) && car.getCompanyId().equals(companyId))
+                    .findAny().orElse(null);
+            if(!Objects.isNull(carQuoteNumberVo)){
+                carAlreadyQuoteNum = carQuoteNumberVo.getQuoteNum();
+            }
+
+            //最大报价次数 - 已报价 = 剩余    当天剩余  与 车辆剩余报价  取最小值
+            maxQuoteNum = Math.min(dayMaxQuoteNum - dayAlreadyQuoteNum,carMaxQuoteNum - carAlreadyQuoteNum);
+        }
+
+        return maxQuoteNum;
+    }
+
+    @Override
+    public BigDecimal getQuoteRatio(String companyId, String userId) {
+        BigDecimal quoteRatio = sysQuoteRecordMapper.getQuoteRatio(userId, companyId);
+        return quoteRatio;
+    }
+
+    /**
+     * 刷新报价次数
+     * @param companyId
+     * @param userId
+     * @return
+     */
+    @Override
+    public void refreshQuoteNum(String companyId, String userId, List<SysQuoteRecord> sysQuoteRecords) {
+        String licenseNo = sysQuoteRecords.get(0).getLicenseNo();
+        QuoteNumRedisVo quoteNumberRedisData = getQuoteNumberRedisData(userId);
+        QuoteNumRedisVo.QuoteNumberCompanyVo quoteNumberCompanyVo = quoteNumberRedisData.getQuoteCompanyList().stream()
+                .filter(company -> company.getCompanyId().equals(companyId)).findFirst().orElse(null);
+
+        if(!Objects.isNull(quoteNumberCompanyVo)){
+            quoteNumberRedisData.getQuoteCompanyList().forEach(item->{
+                if(item.getCompanyId().equals(companyId)){
+                    item.setDayMaxQuoteNum(item.getDayMaxQuoteNum() + sysQuoteRecords.size());
+                }
+            });
+        }else{
+            QuoteNumRedisVo.QuoteNumberCompanyVo quoteNumberCompanyVo1 = new QuoteNumRedisVo.QuoteNumberCompanyVo();
+            quoteNumberCompanyVo1.setCompanyId(companyId);
+            quoteNumberCompanyVo1.setDayMaxQuoteNum(sysQuoteRecords.size());
+            quoteNumberRedisData.getQuoteCompanyList().add(quoteNumberCompanyVo1);
+        }
+
+        QuoteNumRedisVo.CarQuoteNumberVo carQuoteNumberVo = quoteNumberRedisData.getCarList().stream()
+                .filter(car -> car.getLicenseNo().equals(licenseNo) && car.getCompanyId().equals(companyId))
+                .findFirst().orElse(null);
+        if(!Objects.isNull(carQuoteNumberVo)){
+            quoteNumberRedisData.getCarList().forEach(item->{
+                if(item.getLicenseNo().equals(licenseNo)){
+                    item.setQuoteNum(item.getQuoteNum() + sysQuoteRecords.size());
+                }
+            });
+        }else{
+            carQuoteNumberVo = new QuoteNumRedisVo.CarQuoteNumberVo();
+            carQuoteNumberVo.setCompanyId(companyId);
+            carQuoteNumberVo.setLicenseNo(licenseNo);
+            carQuoteNumberVo.setQuoteNum(sysQuoteRecords.size());
+            quoteNumberRedisData.getCarList().add(carQuoteNumberVo);
+        }
+        redisTemplate.opsForValue().set(getQuoteNumberRedisKey(userId), JSONObject.toJSONString(quoteNumberRedisData));
+    }
+
+
+}

+ 233 - 57
src/main/java/com/ydtech/modules/order/service/impl/YangGuangOrderApiServiceImpl.java

@@ -19,7 +19,9 @@ import com.ydtech.modules.order.components.FileComponents;
 import com.ydtech.modules.order.components.InsImagesUploadCacheComponents;
 import com.ydtech.modules.order.components.yangguang.YangGuangRequestApiComponents;
 import com.ydtech.modules.order.constants.InsuranceTypeCorrespondence;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.*;
 import com.ydtech.modules.order.entity.api.yangguang.request.*;
 import com.ydtech.modules.order.entity.api.yangguang.response.*;
@@ -30,6 +32,7 @@ import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.filter.CarModelsFilterUtils;
 import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
 import com.ydtech.modules.order.entity.po.InsUploadFiles;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import com.ydtech.modules.order.entity.vo.PolicyPrintVo;
@@ -83,6 +86,10 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
 
     private final FileComponents fileComponents;
 
+    private final SysQuoteRecordMapper sysQuoteRecordMapper;
+
+    private final SysQuoteRedisService sysQuoteRedisService;
+
     @Value("${upload.file.path}")
     private String uploadFilePath;
 
@@ -93,6 +100,12 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
     private String apiUrl;
     @Override
     public HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<List<YgQuoteAccidentVo>> quoteVo) throws JsonProcessingException {
+
+        Integer maxQuoteNum = quoteVo.getMaxQuoteNum();
+
+        List<SysQuoteRecord> sysQuoteRecords = new ArrayList<>();
+
+
         // 通过协议获取配置实体
         String agreementId = quoteVo.getAgreementId();
         PtlAgreementAttribution ptlAgreementAttribution = ptlAgreementAttributionService.getById(agreementId);
@@ -127,6 +140,7 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
         // 如果险种为单商或交商 需要报两次价 将第一次报出的车实际价值取到
         //报价
         InsOrders insOrders = insOrdersService.getById(quoteInfoVo.getOrderNo());
+        quoteInfoVo.setProductId(insOrders.getProductid());
 
         YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequest = new YangGuangAccuracyCalculateRequest(quoteInfoVo, purchasePrice, carModelList1, riskList.get(0),startDate,ygConfigureParameters,quoteVo);
         yangGuangAccuracyCalculateRequest.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
@@ -137,58 +151,123 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
             DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
             DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
-            LocalDateTime dateTime = LocalDateTime.parse(endDate, inputFormatter);
-            String newDateStr = dateTime.format(outputFormatter);
-            YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequestRe = new YangGuangAccuracyCalculateRequest(quoteInfoVo, purchasePrice, carModelList1, riskList.get(0),newDateStr,ygConfigureParameters,quoteVo);
-            yangGuangAccuracyCalculateRequestRe.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
-            YangGuangAccuracyCalculateResponse yangGuangAccuracyCalculateResponseRe = yangGuangRequestApiComponents.accuracyCalculaye(yangGuangAccuracyCalculateRequestRe);
-            if (insOrders.getProductid().equals("034001") || insOrders.getProductid().equals("0330034001") || insOrders.getProductid().equals("0330034002")) {
-                if (yangGuangAccuracyCalculateResponseRe.getErrorCode().equals("0")) {
-                    YangGuangAccuracyCalculateResponse.itemcar itemcar = yangGuangAccuracyCalculateResponseRe.getItemcar();
-                    String actualValue = itemcar.getActualValue();
-                    YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequest1 = new YangGuangAccuracyCalculateRequest(quoteInfoVo, actualValue, carModelList1, riskList.get(0),newDateStr,ygConfigureParameters,quoteVo);
-                    yangGuangAccuracyCalculateRequest1.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
-                    YangGuangAccuracyCalculateResponse yangGuangAccuracyCalculateResponse1 = yangGuangRequestApiComponents.accuracyCalculaye(yangGuangAccuracyCalculateRequest1);
-                    boolean isEnergy = carInfo.isNewEnergy();
-
-                    if (!yangGuangAccuracyCalculateResponse1.getErrorCode().equals("0")) {
-                    InsOrders order = insOrdersService.getById(quoteInfoVo.getOrderNo());
-                    InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
-                        if (yangGuangAccuracyCalculateResponse1.getErrorMessage().contains("重复投保")) {
-                        insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
+                LocalDateTime dateTime = LocalDateTime.parse(endDate, inputFormatter);
+                String newDateStr = dateTime.format(outputFormatter);
+                YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequestRe = new YangGuangAccuracyCalculateRequest(quoteInfoVo, purchasePrice, carModelList1, riskList.get(0),newDateStr,ygConfigureParameters,quoteVo);
+                yangGuangAccuracyCalculateRequestRe.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
+                maxQuoteNum--;
+                SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord);
+                if(maxQuoteNum <= 0){
+                    sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                    //刷新redis中的报价次数
+                    sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
+                    throw new SystemException("报价次数限制");
+                }
+                YangGuangAccuracyCalculateResponse yangGuangAccuracyCalculateResponseRe = yangGuangRequestApiComponents.accuracyCalculaye(yangGuangAccuracyCalculateRequestRe);
+                if (insOrders.getProductid().equals("034001") || insOrders.getProductid().equals("0330034001") || insOrders.getProductid().equals("0330034002")) {
+                    if (yangGuangAccuracyCalculateResponseRe.getErrorCode().equals("0")) {
+                        YangGuangAccuracyCalculateResponse.itemcar itemcar = yangGuangAccuracyCalculateResponseRe.getItemcar();
+                        String actualValue = itemcar.getActualValue();
+                        YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequest1 = new YangGuangAccuracyCalculateRequest(quoteInfoVo, actualValue, carModelList1, riskList.get(0),newDateStr,ygConfigureParameters,quoteVo);
+                        yangGuangAccuracyCalculateRequest1.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
+                        maxQuoteNum--;
+                        SysQuoteRecord sysQuoteRecord1 = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                                QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                        sysQuoteRecords.add(sysQuoteRecord1);
+                        if(maxQuoteNum <= 0){
+                            sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                            //刷新redis中的报价次数
+                            sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
+                            throw new SystemException("报价次数限制");
                         }
-                    insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse1.getErrorMessage(),insOrderStatusEnum);
-                    throw new SystemException(yangGuangAccuracyCalculateResponse1.getErrorMessage());
+                        YangGuangAccuracyCalculateResponse yangGuangAccuracyCalculateResponse1 = yangGuangRequestApiComponents.accuracyCalculaye(yangGuangAccuracyCalculateRequest1);
+                        boolean isEnergy = carInfo.isNewEnergy();
+
+                        if (!yangGuangAccuracyCalculateResponse1.getErrorCode().equals("0")) {
+                        InsOrders order = insOrdersService.getById(quoteInfoVo.getOrderNo());
+                        InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
+                            if (yangGuangAccuracyCalculateResponse1.getErrorMessage().contains("重复投保")) {
+                            insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
+                            }
+                            String subOrderNo = insOrdersService.responseFailedOrder(quoteVo, ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse1.getErrorMessage(), insOrderStatusEnum);
+                            SysQuoteRecord sysQuoteRecord2 = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                                    QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                            sysQuoteRecords.add(sysQuoteRecord2);
+                            //存储报价记录
+                            sysQuoteRecords.forEach(item->{
+                                item.setSubOrderNo(subOrderNo);
+                            });
+
+                            sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                            //刷新redis中的报价次数
+                            sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
+                            throw new SystemException(yangGuangAccuracyCalculateResponse1.getErrorMessage());
+                        }
+                        // 处理数据
+                        QuoteRespVo quoteRespVo = getQuoteRespVo(yangGuangAccuracyCalculateResponse1, quoteInfoVo, quoteVo.getAccidentalDrivingVo(), isEnergy);
+
+                        // 设置核心报价车型
+                        quoteRespVo.setCoreModels(carModelList1.toCoreModelsVo());
+                        HttpResult<QuoteRespVo> quoteRespVoHttpResult = responseOrder(yangGuangAccuracyCalculateResponse1, quoteRespVo, ptlAgreementAttribution, quoteInfoVo.getOrderNo(),
+                                quoteVo.getAccidentalDrivingVo());
+
+                        SysQuoteRecord sysQuoteRecord3 = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                                QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+                        sysQuoteRecords.add(sysQuoteRecord3);
+                        //存储报价记录
+                        sysQuoteRecords.forEach(item->{
+                            item.setSubOrderNo(quoteRespVoHttpResult.getData().getCompanyId());
+                        });
+                        sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                        sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
+                        return quoteRespVoHttpResult;
+                    } else {
+                        InsOrders order = insOrdersService.getById(quoteInfoVo.getOrderNo());
+                        InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
+                        if (yangGuangAccuracyCalculateResponse.getErrorMessage().contains("重复投保")) {
+                            insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
+                        }
+                        String subOrderNo = insOrdersService.responseFailedOrder(quoteVo, ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse.getErrorMessage(), insOrderStatusEnum);
+                        SysQuoteRecord sysQuoteRecord2 = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                                QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                        sysQuoteRecords.add(sysQuoteRecord2);
+                        //存储报价记录
+                        sysQuoteRecords.forEach(item->{
+                            item.setSubOrderNo(subOrderNo);
+                        });
+
+                        sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                        //刷新redis中的报价次数
+                        sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
+                        throw new SystemException(yangGuangAccuracyCalculateResponse.getErrorMessage());
                     }
-                    // 处理数据
-                    QuoteRespVo quoteRespVo = getQuoteRespVo(yangGuangAccuracyCalculateResponse1, quoteInfoVo, quoteVo.getAccidentalDrivingVo(), isEnergy);
-
-                    // 设置核心报价车型
-                    quoteRespVo.setCoreModels(carModelList1.toCoreModelsVo());
-                    return responseOrder(yangGuangAccuracyCalculateResponse1, quoteRespVo, ptlAgreementAttribution, quoteInfoVo.getOrderNo(),
-                            quoteVo.getAccidentalDrivingVo());
                 } else {
-                    InsOrders order = insOrdersService.getById(quoteInfoVo.getOrderNo());
-                    InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
-                    if (yangGuangAccuracyCalculateResponse.getErrorMessage().contains("重复投保")) {
+                    boolean isEnergy = carInfo.isNewEnergy();
+                    if (!yangGuangAccuracyCalculateResponse.getErrorCode().equals("0")) {
+                        QuoteRespVo resp  = new QuoteRespVo();
+                        InsOrders order = insOrdersService.getById(quoteInfoVo.getOrderNo());
+                        InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
+                        if (yangGuangAccuracyCalculateResponse.getErrorMessage().contains("重复投保")) {
                         insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
+                        }
+                        String subOrderNo = insOrdersService.responseFailedOrder(quoteVo, ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse.getErrorMessage(), insOrderStatusEnum);
+                        SysQuoteRecord sysQuoteRecord2 = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                                QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                        sysQuoteRecords.add(sysQuoteRecord2);
+                        //存储报价记录
+                        sysQuoteRecords.forEach(item->{
+                            item.setSubOrderNo(subOrderNo);
+                        });
+
+                        sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                        //刷新redis中的报价次数
+                        sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
+                        throw new SystemException(yangGuangAccuracyCalculateResponse.getErrorMessage());
                     }
-                    insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse.getErrorMessage(),insOrderStatusEnum);
-                    throw new SystemException(yangGuangAccuracyCalculateResponse.getErrorMessage());
-                }
-            } else {
-                boolean isEnergy = carInfo.isNewEnergy();
-                if (!yangGuangAccuracyCalculateResponseRe.getErrorCode().equals("0")) {
-                    InsOrders order = insOrdersService.getById(quoteInfoVo.getOrderNo());
-                    InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
-                    if (yangGuangAccuracyCalculateResponseRe.getErrorMessage().contains("重复投保")) {
-                    insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
-                    }
-                    insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponseRe.getErrorMessage(),insOrderStatusEnum);
-                    throw new SystemException(yangGuangAccuracyCalculateResponseRe.getErrorMessage());
-                }
-                // 处理数据
-                QuoteRespVo quoteRespVo = getQuoteRespVo(yangGuangAccuracyCalculateResponseRe, quoteInfoVo, quoteVo.getAccidentalDrivingVo(), isEnergy);
+                    // 处理数据
+                    QuoteRespVo quoteRespVo = getQuoteRespVo(yangGuangAccuracyCalculateResponse, quoteInfoVo, quoteVo.getAccidentalDrivingVo(), isEnergy);
 
                 // 设置核心报价车型
                 quoteRespVo.setCoreModels(carModelList1.toCoreModelsVo());
@@ -212,7 +291,18 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
                     if (yangGuangAccuracyCalculateResponse1.getErrorMessage().contains("重复投保")) {
                         insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
                     }
-                    insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse1.getErrorMessage(),insOrderStatusEnum);
+                    String s = insOrdersService.responseFailedOrder(quoteVo, ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse1.getErrorMessage(), insOrderStatusEnum);
+                    SysQuoteRecord sysQuoteRecord2 = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                            QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                    sysQuoteRecords.add(sysQuoteRecord2);
+                    //存储报价记录
+                    sysQuoteRecords.forEach(item->{
+                        item.setSubOrderNo(s);
+                    });
+
+                    sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                    //刷新redis中的报价次数
+                    sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
                     throw new SystemException(yangGuangAccuracyCalculateResponse1.getErrorMessage());
                 }
 
@@ -221,15 +311,36 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
 
                 // 设置核心报价车型
                 quoteRespVo.setCoreModels(carModelList1.toCoreModelsVo());
-                return responseOrder(yangGuangAccuracyCalculateResponse1, quoteRespVo, ptlAgreementAttribution, quoteInfoVo.getOrderNo(),
+                HttpResult<QuoteRespVo> quoteRespVoHttpResult = responseOrder(yangGuangAccuracyCalculateResponse1, quoteRespVo, ptlAgreementAttribution, quoteInfoVo.getOrderNo(),
                         quoteVo.getAccidentalDrivingVo());
+                SysQuoteRecord sysQuoteRecord3 = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord3);
+                //存储报价记录
+                sysQuoteRecords.forEach(item->{
+                    item.setSubOrderNo(quoteRespVoHttpResult.getData().getCompanyId());
+                });
+                sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
+                return quoteRespVoHttpResult;
             } else {
                 InsOrders order = insOrdersService.getById(quoteInfoVo.getOrderNo());
                 InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
                 if (yangGuangAccuracyCalculateResponse.getErrorMessage().contains("重复投保")) {
                     insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
                 }
-                insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse.getErrorMessage(),insOrderStatusEnum);
+                String s = insOrdersService.responseFailedOrder(quoteVo, ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse.getErrorMessage(), insOrderStatusEnum);
+                SysQuoteRecord sysQuoteRecord2 = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord2);
+                //存储报价记录
+                sysQuoteRecords.forEach(item->{
+                    item.setSubOrderNo(s);
+                });
+
+                sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                //刷新redis中的报价次数
+                sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
                 throw new SystemException(yangGuangAccuracyCalculateResponse.getErrorMessage());
             }
         } else {
@@ -242,7 +353,18 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
                 if (yangGuangAccuracyCalculateResponse.getErrorMessage().contains("重复投保")) {
                     insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
                 }
-                insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse.getErrorMessage(),insOrderStatusEnum);
+                String s = insOrdersService.responseFailedOrder(quoteVo, ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse.getErrorMessage(), insOrderStatusEnum);
+                SysQuoteRecord sysQuoteRecord2 = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord2);
+                //存储报价记录
+                sysQuoteRecords.forEach(item->{
+                    item.setSubOrderNo(s);
+                });
+
+                sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                //刷新redis中的报价次数
+                sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
                 throw new SystemException(yangGuangAccuracyCalculateResponse.getErrorMessage());
             }
             // 处理数据
@@ -250,8 +372,18 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
 
             // 设置核心报价车型
             quoteRespVo.setCoreModels(carModelList1.toCoreModelsVo());
-            return responseOrder(yangGuangAccuracyCalculateResponse, quoteRespVo, ptlAgreementAttribution, quoteInfoVo.getOrderNo(),
+            HttpResult<QuoteRespVo> quoteRespVoHttpResult = responseOrder(yangGuangAccuracyCalculateResponse, quoteRespVo, ptlAgreementAttribution, quoteInfoVo.getOrderNo(),
                     quoteVo.getAccidentalDrivingVo());
+            SysQuoteRecord sysQuoteRecord3 = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord3);
+            //存储报价记录
+            sysQuoteRecords.forEach(item->{
+                item.setSubOrderNo(quoteRespVoHttpResult.getData().getCompanyId());
+            });
+            sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+            sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
+            return quoteRespVoHttpResult;
         }
     }
 
@@ -301,7 +433,7 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
         YangGuangSubmitRequest yangGuangSubmitRequest = new YangGuangSubmitRequest(insOrders, insAreaCompany, productid, ygConfigureParameters);
         YangGuangSubmitResponse yangGuangSubmitResponse = yangGuangRequestApiComponents.submit(yangGuangSubmitRequest);
         if (!yangGuangSubmitResponse.getErrorCode().equals("0")) {
-            return HttpResult.error(yangGuangSubmitResponse.message(yangGuangSubmitResponse.getErrorMessage()));
+            return HttpResult.error(yangGuangSubmitResponse.getErrorMessage());
         }
         if (yangGuangSubmitResponse.getCiProposalNo() != null) {
             insAreaCompany.setJqapplyno(yangGuangSubmitResponse.getCiProposalNo());
@@ -656,7 +788,50 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
 
 
     @Override
-    public boolean autoWriteOff(String companyId) throws Exception {
+    public HttpResult<Object> autoWriteOff(String companyId) throws Exception {
+        InsAreaCompany insAreaCompany = insAreaCompanyService.getByIdIsExist(companyId);
+        YangGuangConfigureParameters ygConfigureParameters = configureParametersComponents.toEntity(YangGuangConfigureParameters.class,
+                insAreaCompany.getAgreementId());
+        String productid = insAreaCompany.getProductid();
+        //单交
+        if (productid.equals("0330")) {
+            YangGuangAutoWriteOffRequest yangGuangAutoWriteOffRequest = new YangGuangAutoWriteOffRequest(ygConfigureParameters, insAreaCompany.getJqapplyno());
+            YangGuangAutoWriteOffResponse yangGuangAutoWriteOffResponse = yangGuangRequestApiComponents.autoWriteOff(yangGuangAutoWriteOffRequest);
+            if (yangGuangAutoWriteOffResponse.getErrorCode().equals("0")) {
+                insAreaCompany.setOrderstatus(InsOrderStatusEnum.QUOTE_ING.getCode());
+                insAreaCompanyService.updateCompanyAndOrders(insAreaCompany);
+                return HttpResult.ok("撤单成功");
+            }
+        }
+        // 单商
+        if (productid.equals("034001")) {
+            YangGuangAutoWriteOffRequest yangGuangAutoWriteOffRequest = new YangGuangAutoWriteOffRequest(ygConfigureParameters, insAreaCompany.getSyapplyno());
+            YangGuangAutoWriteOffResponse yangGuangAutoWriteOffResponse = yangGuangRequestApiComponents.autoWriteOff(yangGuangAutoWriteOffRequest);
+            if (yangGuangAutoWriteOffResponse.getErrorCode().equals("0")) {
+                insAreaCompany.setOrderstatus(InsOrderStatusEnum.QUOTE_ING.getCode());
+                insAreaCompanyService.updateCompanyAndOrders(insAreaCompany);
+                return HttpResult.ok("撤单成功");
+            }
+        }
+            //交商同保
+        if (insAreaCompany.getJqpolicyno() != null && insAreaCompany.getSypolicyno() != null && !insAreaCompany.getJqpolicyno().equals("") && !insAreaCompany.getSypolicyno().equals("")) {
+            YangGuangAutoWriteOffRequest yangGuangAutoWriteOffRequestJq = new YangGuangAutoWriteOffRequest(ygConfigureParameters, insAreaCompany.getJqapplyno());
+            YangGuangAutoWriteOffResponse yangGuangAutoWriteOffResponseJq = yangGuangRequestApiComponents.autoWriteOff(yangGuangAutoWriteOffRequestJq);
+            YangGuangAutoWriteOffRequest yangGuangAutoWriteOffRequestSy = new YangGuangAutoWriteOffRequest(ygConfigureParameters, insAreaCompany.getSyapplyno());
+            YangGuangAutoWriteOffResponse yangGuangAutoWriteOffResponseSy = yangGuangRequestApiComponents.autoWriteOff(yangGuangAutoWriteOffRequestSy);
+            if (yangGuangAutoWriteOffResponseJq.getErrorCode().equals("0") && yangGuangAutoWriteOffResponseSy.getErrorCode().equals("0")) {
+                insAreaCompany.setOrderstatus(InsOrderStatusEnum.QUOTE_ING.getCode());
+                insAreaCompanyService.updateCompanyAndOrders(insAreaCompany);
+                return HttpResult.ok("撤单成功");
+            } else {
+                return HttpResult.error("撤单失败,原因:"+ yangGuangAutoWriteOffResponseSy.getErrorMessage() + yangGuangAutoWriteOffResponseJq.getErrorMessage());
+            }
+        }
+        return HttpResult.ok("撤单成功");
+    }
+
+    @Override
+    public boolean autoWriteOffOrder(String companyId) throws Exception {
         InsAreaCompany insAreaCompany = insAreaCompanyService.getByIdIsExist(companyId);
         YangGuangConfigureParameters ygConfigureParameters = configureParametersComponents.toEntity(YangGuangConfigureParameters.class,
                 insAreaCompany.getAgreementId());
@@ -681,7 +856,7 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
                 return true;
             }
         }
-            //交商同保
+        //交商同保
         if (insAreaCompany.getJqpolicyno() != null && insAreaCompany.getSypolicyno() != null && !insAreaCompany.getJqpolicyno().equals("") && !insAreaCompany.getSypolicyno().equals("")) {
             YangGuangAutoWriteOffRequest yangGuangAutoWriteOffRequestJq = new YangGuangAutoWriteOffRequest(ygConfigureParameters, insAreaCompany.getJqapplyno());
             YangGuangAutoWriteOffResponse yangGuangAutoWriteOffResponseJq = yangGuangRequestApiComponents.autoWriteOff(yangGuangAutoWriteOffRequestJq);
@@ -731,7 +906,7 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
             quoteRespVo.setSyScore(discount.getMarkingnobcBI() != null ? discount.getMarkingnobcBI() : "");
             quoteRespVo.setJqLossRation(Double.parseDouble(discount.getFinalmarkingnoCi() != null ? discount.getFinalmarkingnoCi() : "0.00"));
             quoteRespVo.setSyLossRation(Double.parseDouble(discount.getFinalmarkingnoBi() != null ? discount.getFinalmarkingnoBi() : "0.00"));
-            quoteRespVo.setMergeCostRate(Double.parseDouble(yangGuangAccuracyCalculateResponse.getVascostmarginbc() != null ?yangGuangAccuracyCalculateResponse.getVascostmarginbc() : "0.00"));
+            quoteRespVo.setMergeCostRate(yangGuangAccuracyCalculateResponse.getVascostmarginbc() != null ?yangGuangAccuracyCalculateResponse.getVascostmarginbc() : "0.00");
         }
 
         List<QuoteKindRespVo> kindList1 = new ArrayList<>();
@@ -786,6 +961,7 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
         quoteRespVo.setCiSumPermium(CalculateUtils.add(jqPremium, sumPayTax));//交强险和车船税合计
         quoteRespVo.setSumPermium(CalculateUtils.add(jqPremium, syPremium, sumPayTax, jyPremium));//保费合计
         quoteRespVo.setTotalAdjustRate(0);
+        quoteRespVo.setMergeCostRate(yangGuangAccuracyCalculateResponse.getVascostmarginbc());
         quoteRespVo.setOrderno(yaQuoteInfoVo.getOrderNo()); //订单号
         return quoteRespVo;
     }
@@ -802,7 +978,7 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
         insAreaCompany.setReptxt(JSON.parseObject(JSON.toJSONString(yangGuangAccuracyCalculateResponse)));
         insAreaCompany.setOrderstatus(InsOrderStatusEnum.QUOTE_ING.getCode());
         insAreaCompany.setInsOrderNo(yangGuangAccuracyCalculateResponse.getInfotransNo());
-        insAreaCompany.setMergeCostRate(Double.parseDouble(yangGuangAccuracyCalculateResponse.getVascostmarginbc()));
+        insAreaCompany.setMergeCostRate(quoteRespVo.getMergeCostRate());
         InsOrders insOrders = insOrdersService.getById(orderId);
         //车船税
         if (!insOrders.getProductid().equals("034001") && !insOrders.getProductid().equals("034002")) {

+ 104 - 30
src/main/java/com/ydtech/modules/order/service/impl/YongchengOrderApiServiceImpl.java

@@ -56,7 +56,9 @@ import com.ydtech.modules.order.components.InsOrdersComponents;
 import com.ydtech.modules.order.components.VerificationCodeIdentification;
 import com.ydtech.modules.order.components.gouren.GuorenDuplicateInsuranceComponent;
 import com.ydtech.modules.order.components.yongcheng.YongchengRequestApiComponents;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.InsAreaCompany;
 import com.ydtech.modules.order.entity.InsAreaCompanyAccidentalDriving;
 import com.ydtech.modules.order.entity.InsAreaCompanyExternalPolicy;
@@ -70,6 +72,8 @@ import com.ydtech.modules.order.entity.crawler.response.RecognitionResponse;
 import com.ydtech.modules.order.entity.dto.DrivingInsuranceDto;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
+import com.ydtech.modules.order.entity.po.SysQuoteConfig;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.*;
 import com.ydtech.modules.order.service.*;
 import com.ydtech.modules.order.utils.InsuranceLog;
@@ -176,6 +180,15 @@ public class YongchengOrderApiServiceImpl implements YongchengOrderApiService {
     @Autowired
     private PtlAgreementAttributionService ptlAgreementAttributionService;
 
+    @Autowired
+    private SysQuoteRedisService sysQuoteRedisService;
+
+    @Autowired
+    private SysQuoteConfigService sysQuoteConfigService;
+
+    @Autowired
+    private SysQuoteRecordMapper sysQuoteRecordMapper;
+
     public void gainVehicleModel(YcConfigureParameters ycConfigureParameters, CarInfoVo carInfo, CoreModelsVo coreModelsVo) {
         CarModel_Req carModelReq = new CarModel_Req();
         carModelReq.setFrameNo(carInfo.getFrameNo());
@@ -293,14 +306,13 @@ public class YongchengOrderApiServiceImpl implements YongchengOrderApiService {
             }
             //被保人
             CustomerInfoVo insured = yaQuoteInfoVo.getInsuredPersonInfo();
-            if (StringUtils.isNullOrEmpty(insured.getIdentifyNumber())) {
-                throw new SystemException("被保人只能为个人信息");
-            }
-            PersonAreaVo insuredPersonAreaVo = sysAreaService.queryByAddressYc(insured.getAddr(), insured.getIdentifyNumber());
-            if (!Objects.isNull(insuredPersonAreaVo)) {
-                m.getRequestLabel().getCondition().getInsured().setCProvince(insuredPersonAreaVo.getProvinceCode());
-                m.getRequestLabel().getCondition().getInsured().setCCity(insuredPersonAreaVo.getCityCode());
-                m.getRequestLabel().getCondition().getInsured().setCCounty(insuredPersonAreaVo.getCountyCode());
+            if (!"0".equals(insured.getProperty())) {
+                PersonAreaVo insuredPersonAreaVo = sysAreaService.queryByAddressYc(insured.getAddr(), insured.getIdentifyNumber());
+                if (!Objects.isNull(insuredPersonAreaVo)) {
+                    m.getRequestLabel().getCondition().getInsured().setCProvince(insuredPersonAreaVo.getProvinceCode());
+                    m.getRequestLabel().getCondition().getInsured().setCCity(insuredPersonAreaVo.getCityCode());
+                    m.getRequestLabel().getCondition().getInsured().setCCounty(insuredPersonAreaVo.getCountyCode());
+                }
             }
 
         }
@@ -316,9 +328,11 @@ public class YongchengOrderApiServiceImpl implements YongchengOrderApiService {
      * @return
      * @throws JsonProcessingException
      */
-    private RuoteResponse getResponse(Ruote m, String vinNo, List<String> requestInfoList, BaseQuoteInfoVo yaQuoteInfoVo) throws JsonProcessingException {
+    private RuoteResponse getResponse(Ruote m, String vinNo, List<String> requestInfoList, BaseQuoteInfoVo yaQuoteInfoVo,String companyId,Integer maxQuoteNum,List<SysQuoteRecord> sysQuoteRecords) throws JsonProcessingException {
         boolean boo;
         RuoteResponse rr = yongchengRequestApiComponents.newPremiumXnyCalculation(m);
+        maxQuoteNum--;
+
         //存储 报价返回的查询码  交强和商业
         if (rr.getVhl() != null) {
             if (rr.getVhl().getCQryCdeJQ() != null) {
@@ -370,7 +384,13 @@ public class YongchengOrderApiServiceImpl implements YongchengOrderApiService {
 
             if (!jq.isEmpty() || !sy.isEmpty()) {
                 InsuranceLog.infoLog(InsuranceEnum.AICS.getPinyin(), "\n\n---------> {} - 重复投保处理", vinNo);
-                return this.getResponse(m, vinNo, requestInfoList, yaQuoteInfoVo);
+                SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord);
+                if(maxQuoteNum <= 0){
+                    return rr;
+                }
+                return this.getResponse(m, vinNo, requestInfoList, yaQuoteInfoVo,companyId,maxQuoteNum,sysQuoteRecords);
             }
 
         }
@@ -379,21 +399,39 @@ public class YongchengOrderApiServiceImpl implements YongchengOrderApiService {
         boo = reinsurance(rr, m);
         if (!boo) {
             InsuranceLog.infoLog(InsuranceEnum.AICS.getPinyin(), "\n\n---------> {} - 转保处理", vinNo);
-            return this.getResponse(m, vinNo, requestInfoList, yaQuoteInfoVo);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.TRANSFER_INSRUANCE.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            if(maxQuoteNum <= 0){
+                return rr;
+            }
+            return this.getResponse(m, vinNo, requestInfoList, yaQuoteInfoVo,companyId,maxQuoteNum,sysQuoteRecords);
         }
 
         //3、商业险日期处理
         boo = biRepetitionInsure(rr, m, requestInfoList);
         if (!boo) {
             InsuranceLog.infoLog(InsuranceEnum.AICS.getPinyin(), "\n\n---------> {} - 商业险日期处理", vinNo);
-            return this.getResponse(m, vinNo, requestInfoList, yaQuoteInfoVo);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            if(maxQuoteNum <= 0){
+                return rr;
+            }
+            return this.getResponse(m, vinNo, requestInfoList, yaQuoteInfoVo,companyId,maxQuoteNum,sysQuoteRecords);
         }
 
         // 转保验证码
         boo = reinsuranceCodeError(rr, m);
         if (!boo) {
             InsuranceLog.infoLog(InsuranceEnum.AICS.getPinyin(), "\n\n---------> {} - 转保处理", vinNo);
-            return this.getResponse(m, vinNo, requestInfoList, yaQuoteInfoVo);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),companyId,yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.TRANSFER_INSRUANCE.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            if(maxQuoteNum <= 0){
+                return rr;
+            }
+            return this.getResponse(m, vinNo, requestInfoList, yaQuoteInfoVo,companyId,maxQuoteNum,sysQuoteRecords);
         }
         return rr;
     }
@@ -433,37 +471,54 @@ public class YongchengOrderApiServiceImpl implements YongchengOrderApiService {
      */
     @Override
     public HttpResult quoteApi(BaseQuoteVo<AccidentalDrivingVo> quoteVo) throws JsonProcessingException {
+        Integer maxQuoteNum = quoteVo.getMaxQuoteNum();
 
         List<String> requestInfoList = new ArrayList<>();
+
+
         //获取报价信息
         BaseQuoteInfoVo yaQuoteInfoVo = insOrdersComponents.getQuoteInfo(quoteVo.getOrderNo(), quoteVo.getKinds());
         CoreModelsVo coreModelsVo = new CoreModelsVo();
 
+        //查询订单信息
+        InsOrders order = insOrdersService.getById(yaQuoteInfoVo.getOrderNo());
+
         //build参数
         Ruote m = this.builderParams(quoteVo, yaQuoteInfoVo, coreModelsVo);
 
+        List<SysQuoteRecord> sysQuoteRecords = new ArrayList<>();
         //递归报价
-        RuoteResponse rr = this.getResponse(m, yaQuoteInfoVo.getCarInfo().getVinNo(), requestInfoList, yaQuoteInfoVo);
-
-        //错误信息
-        StringBuilder errorInfo = this.getErrorInfo(rr);
-        if (StringUtils.isNotEmpty(errorInfo)) {
-            throw new SystemException(errorInfo.toString());
-        }
-
-        //查询订单信息
-        InsOrders order = insOrdersService.getById(yaQuoteInfoVo.getOrderNo());
+        RuoteResponse rr = this.getResponse(m, yaQuoteInfoVo.getCarInfo().getVinNo(), requestInfoList, yaQuoteInfoVo,quoteVo.getCompanyId(),maxQuoteNum,sysQuoteRecords);
 
         //报价失败
         if (!"000000".equals(rr.getHead().getErrorCode())) {
             //保存报价失败的子订单
             InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
+
+            //错误信息
+            StringBuilder errorInfo = this.getErrorInfo(rr);
+            if (StringUtils.isNotEmpty(errorInfo)) {
+                rr.getHead().setErrorMessage(errorInfo.toString());
+            }
+
             if(rr.getHead().getErrorMessage().contains("重复投保"))
             {
                 insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
             }
+
             PtlAgreementAttribution ptlAgreementAttribution = ptlAgreementAttributionService.getById(quoteVo.getAgreementId());
-            insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order,rr.getHead().getErrorMessage(),insOrderStatusEnum);
+            String subOrderNo = insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order,rr.getHead().getErrorMessage(),insOrderStatusEnum);
+            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),quoteVo.getCompanyId(),yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(sysQuoteRecord);
+            //存储报价记录
+            sysQuoteRecords.forEach(item->{
+                item.setSubOrderNo(subOrderNo);
+            });
+
+            sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+            //刷新redis中的报价次数
+            sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),yaQuoteInfoVo.getUserid(),sysQuoteRecords);
             return HttpResult.error(rr.getHead().getErrorMessage());
         }
 
@@ -471,6 +526,15 @@ public class YongchengOrderApiServiceImpl implements YongchengOrderApiService {
         //8 生成订单
         InsAreaCompany iac = responseOrder(order, quoteRespVo, rr, quoteVo);
 
+        SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(yaQuoteInfoVo.getUserid(),quoteVo.getCompanyId(),yaQuoteInfoVo.getCarInfo().getLicenseNo(),
+                QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+        sysQuoteRecords.add(sysQuoteRecord);
+        //存储报价记录
+        sysQuoteRecords.forEach(item->{
+            item.setSubOrderNo(iac.getId());
+        });
+        sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+
         quoteRespVo.setCompanyId(iac.getId());
 
         if (CollUtil.isNotEmpty(requestInfoList)) {
@@ -492,6 +556,9 @@ public class YongchengOrderApiServiceImpl implements YongchengOrderApiService {
             }
         }
 
+        //刷新redis中的报价次数
+        sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),yaQuoteInfoVo.getUserid(),sysQuoteRecords);
+
         return HttpResult.ok("报价成功", quoteRespVo);
 
     }
@@ -771,14 +838,21 @@ public class YongchengOrderApiServiceImpl implements YongchengOrderApiService {
         CustomerInfoVo applyInfo = order.getApplyinfo().toJavaObject(CustomerInfoVo.class);
         //组装参数
         Audit m = Audit.buildAuditParam(ownerInfo, insureInfo, applyInfo, ycConfigureParameters, iac);
+        String property = insureInfo.getProperty();
+        if (StringUtils.isNotEmpty(property) && "0".equals(property)) {
+            m.getRequestLabel().getCondition().getCustomer().setCProvince(insureInfo.getProvince());
+            m.getRequestLabel().getCondition().getCustomer().setCCity(insureInfo.getCity());
+            m.getRequestLabel().getCondition().getCustomer().setCCounty(insureInfo.getCounty());
+        }else {
 
-        //投保人地区信息
-        PersonAreaVo personAreaVo = sysAreaService.queryByAddressYc(insureInfo.getAddr(), insureInfo.getIdentifyNumber());
+            //投保人地区信息
+            PersonAreaVo personAreaVo = sysAreaService.queryByAddressYc(insureInfo.getAddr(), insureInfo.getIdentifyNumber());
 
-        //构造被保人地区
-        m.getRequestLabel().getCondition().getCustomer().setCProvince(personAreaVo.getProvinceCode());
-        m.getRequestLabel().getCondition().getCustomer().setCCity(personAreaVo.getCityCode());
-        m.getRequestLabel().getCondition().getCustomer().setCCounty(personAreaVo.getCountyCode());
+            //构造被保人地区
+            m.getRequestLabel().getCondition().getCustomer().setCProvince(personAreaVo.getProvinceCode());
+            m.getRequestLabel().getCondition().getCustomer().setCCity(personAreaVo.getCityCode());
+            m.getRequestLabel().getCondition().getCustomer().setCCounty(personAreaVo.getCountyCode());
+        }
 
         try {
             AuditResponse rd = yongchengRequestApiComponents.newXnyUnderwritingService(m);

+ 48 - 1
src/main/java/com/ydtech/modules/order/service/impl/ZhongMeiOrderApiServiceImpl.java

@@ -19,7 +19,9 @@ import com.ydtech.modules.order.components.ZhongmeiRequestApiComponents;
 import com.ydtech.modules.order.components.vehicle.QueryVehicleComponents;
 import com.ydtech.modules.order.components.zhongmei.ZhongmeiRepeatInsuranceComponents;
 import com.ydtech.modules.order.constants.InsuranceTypeCorrespondence;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.*;
 import com.ydtech.modules.order.entity.api.zhongmei.BaseRequestHead;
 import com.ydtech.modules.order.entity.api.zhongmei.constants.enums.AuditStatusEnum;
@@ -32,6 +34,7 @@ import com.ydtech.modules.order.entity.config.ZmConfigureParameters;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.filter.CarModelsFilterUtils;
 import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.AccidentalDrivingVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
@@ -96,6 +99,10 @@ public class ZhongMeiOrderApiServiceImpl implements ZhongMeiOrderApiService {
 
     private final InsImagesUploadCacheComponents insImagesUploadCacheComponents;
 
+    private final SysQuoteRecordMapper sysQuoteRecordMapper;
+
+    private final SysQuoteRedisService sysQuoteRedisService;
+
     @Value("${upload.file.path}")
     private String uploadFilePath;
 
@@ -161,6 +168,9 @@ public class ZhongMeiOrderApiServiceImpl implements ZhongMeiOrderApiService {
 
     @Override
     public HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfo, BaseQuoteVo<AccidentalDrivingVo> zmQuoteVo) {
+        Integer maxQuoteNum = zmQuoteVo.getMaxQuoteNum();
+        List<SysQuoteRecord> sysQuoteRecords = new ArrayList<>();
+
         // 1. 协议id获取配置实体
         String agreementId = zmQuoteVo.getAgreementId();
         // 账号信息
@@ -199,10 +209,26 @@ public class ZhongMeiOrderApiServiceImpl implements ZhongMeiOrderApiService {
         quotedPriceRequest.setHead(baseRequestHead);
 
         QuotedPriceResponse quotedPriceResponse = zhongmeiRequestApiComponents.quotedPrice(quotedPriceRequest, QuotedPriceResponse.class);
+        maxQuoteNum--;
+        SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfo.getUserid(),zmQuoteVo.getCompanyId(),quoteInfo.getCarInfo().getLicenseNo(),
+                QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+        sysQuoteRecords.add(sysQuoteRecord);
+
         if ("-1".equals(quotedPriceResponse.getHead().getReturnCode())) {
             if (StringUtils.isNotEmpty(quotedPriceResponse.getHead().getReturnMessage()) && quotedPriceResponse.getHead().getReturnMessage().contains("商业险重复投保") && quotedPriceResponse.getHead().getReturnMessage().contains("重复投保的本公司的保单信息")) {
                 quotedPriceResponse = zhongmeiRepeatInsuranceComponents.dealRepeatDateFormError(quotedPriceRequest, quotedPriceResponse,
                         quoteInfo);
+                maxQuoteNum--;
+                SysQuoteRecord deplSysQuoteRecord = new SysQuoteRecord(quoteInfo.getUserid(),zmQuoteVo.getCompanyId(),quoteInfo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(deplSysQuoteRecord);
+
+                if(maxQuoteNum < 0) {
+                    sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                    //刷新redis中的报价次数
+                    sysQuoteRedisService.refreshQuoteNum(zmQuoteVo.getCompanyId(), quoteInfo.getUserid(), sysQuoteRecords);
+                    throw new SystemException("报价次数限制");
+                }
             }
         }
         QuoteRespVo quoteRespVo = getQuoteRespVo(quotedPriceResponse, quoteInfo);
@@ -215,12 +241,33 @@ public class ZhongMeiOrderApiServiceImpl implements ZhongMeiOrderApiService {
         }
         if (repeatFlag) {
             quotedPriceResponse = zhongmeiRepeatInsuranceComponents.dealRepeatDate(quotedPriceRequest, quotedPriceResponse, quoteInfo);
+            maxQuoteNum--;
+            SysQuoteRecord deplSysQuoteRecord = new SysQuoteRecord(quoteInfo.getUserid(),zmQuoteVo.getCompanyId(),quoteInfo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.DATE_DEAL.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+            sysQuoteRecords.add(deplSysQuoteRecord);
+
+            if(maxQuoteNum < 0) {
+                sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                //刷新redis中的报价次数
+                sysQuoteRedisService.refreshQuoteNum(zmQuoteVo.getCompanyId(), quoteInfo.getUserid(), sysQuoteRecords);
+                throw new SystemException("报价次数限制");
+            }
             quoteRespVo = getQuoteRespVo(quotedPriceResponse, quoteInfo);
         }
 
         // 核心返回车型
         quoteRespVo.setCoreModels(simpleStadarCarDTO.toCoreModelsVo());
-        return responseOrder(quotedPriceResponse, quoteRespVo, ptlAgreementAttribution, quoteInfo,zmQuoteVo.getAccidentalDrivingVo());
+        HttpResult<QuoteRespVo> quoteRespVoHttpResult = responseOrder(quotedPriceResponse, quoteRespVo, ptlAgreementAttribution, quoteInfo, zmQuoteVo.getAccidentalDrivingVo());
+        SysQuoteRecord deplSysQuoteRecord = new SysQuoteRecord(quoteInfo.getUserid(),zmQuoteVo.getCompanyId(),quoteInfo.getCarInfo().getLicenseNo(),
+                QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+        sysQuoteRecords.add(deplSysQuoteRecord);
+        sysQuoteRecords.forEach(item->{
+            item.setSubOrderNo(quoteRespVoHttpResult.getData().getCompanyId());
+        });
+        sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+        //刷新redis中的报价次数
+        sysQuoteRedisService.refreshQuoteNum(zmQuoteVo.getCompanyId(), quoteInfo.getUserid(), sysQuoteRecords);
+        return quoteRespVoHttpResult;
     }
 
 

+ 31 - 2
src/main/java/com/ydtech/modules/order/service/impl/ZijinOrderApiServiceImpl.java

@@ -15,7 +15,9 @@ import com.ydtech.modules.order.components.ConfigureParametersComponents;
 import com.ydtech.modules.order.components.InsImagesUploadCacheComponents;
 import com.ydtech.modules.order.components.zijin.ZijinRequestApiComponents;
 import com.ydtech.modules.order.constants.InsuranceTypeCorrespondence;
+import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
+import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.*;
 import com.ydtech.modules.order.entity.api.zijin.constants.enums.*;
 import com.ydtech.modules.order.entity.api.zijin.request.*;
@@ -25,6 +27,7 @@ import com.ydtech.modules.order.entity.dto.DrivingInsuranceDto;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.filter.CarModelsFilterUtils;
 import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
+import com.ydtech.modules.order.entity.po.SysQuoteRecord;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import com.ydtech.modules.order.entity.vo.PolicyPrintVo;
@@ -71,6 +74,10 @@ public class ZijinOrderApiServiceImpl implements ZijinOrderApiService {
 
     private final InsImagesUploadCacheComponents insImagesUploadCacheComponents;
 
+    private final SysQuoteRecordMapper sysQuoteRecordMapper;
+
+    private final SysQuoteRedisService sysQuoteRedisService;
+
     // 重复投保次数
     private static final int REPEAT_NUMBER = 3;
 
@@ -107,6 +114,9 @@ public class ZijinOrderApiServiceImpl implements ZijinOrderApiService {
 
     @Override
     public HttpResult<QuoteRespVo> quote(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<List<ZjQuoteAccidentVo>> quoteVo) {
+        Integer maxQuoteNum = quoteVo.getMaxQuoteNum();
+        List<SysQuoteRecord> sysQuoteRecords = new ArrayList<>();
+
         // 1. 协议id获取配置实体
         String agreementId = quoteVo.getAgreementId();
         // 1.1 账号信息
@@ -159,7 +169,16 @@ public class ZijinOrderApiServiceImpl implements ZijinOrderApiService {
             {
                 insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
             }
-            insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order,calculatePremiumResponse.getRtnMsg(),insOrderStatusEnum);
+            String subOrderNo = insOrdersService.responseFailedOrder(quoteVo, ptlAgreementAttribution, order, calculatePremiumResponse.getRtnMsg(), insOrderStatusEnum);
+            SysQuoteRecord deplSysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                    QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+            sysQuoteRecords.add(deplSysQuoteRecord);
+            sysQuoteRecords.forEach(item->{
+                item.setSubOrderNo(subOrderNo);
+            });
+            sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+            //刷新redis中的报价次数
+            sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(), quoteInfoVo.getUserid(), sysQuoteRecords);
             throw new SystemException(calculatePremiumResponse.getRtnMsg());
         }
 
@@ -173,8 +192,18 @@ public class ZijinOrderApiServiceImpl implements ZijinOrderApiService {
 
         // 设置核心报价车型
         quoteRespVo.setCoreModels(vehicleModelInfosDTO.toCoreModelsVo());
-        return responseOrder(calculatePremiumResponse, quoteRespVo, ptlAgreementAttribution, calculatePremiumRequest.getOrderId(),
+        HttpResult<QuoteRespVo> quoteRespVoHttpResult = responseOrder(calculatePremiumResponse, quoteRespVo, ptlAgreementAttribution, calculatePremiumRequest.getOrderId(),
                 calculatePremiumRequest.getOrderNo(), quoteVo.getAccidentalDrivingVo());
+        SysQuoteRecord deplSysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                QuoteNumberConstant.QuoteAction.QUOTE_SUCCESS.getCode().toString(),QuoteNumberConstant.QuoteResult.SUCCESS.getCode().toString());
+        sysQuoteRecords.add(deplSysQuoteRecord);
+        sysQuoteRecords.forEach(item->{
+            item.setSubOrderNo(quoteRespVoHttpResult.getData().getCompanyId());
+        });
+        sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+        //刷新redis中的报价次数
+        sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(), quoteInfoVo.getUserid(), sysQuoteRecords);
+        return quoteRespVoHttpResult;
     }
 
     @Override

Vissa filer visades inte eftersom för många filer har ändrats