Explorar el Código

报价工厂类提交

785834757 hace 1 año
padre
commit
10eb3b519c
Se han modificado 40 ficheros con 2393 adiciones y 69 borrados
  1. 1 1
      authentication/src/main/java/com/jzg/config/SecurityConfig.java
  2. 1 1
      commons/src/main/java/com/jzg/commons/core/base/BaseController.java
  3. 8 0
      platform/src/main/java/com/jzg/controller/AttributionTemplateController.java
  4. 7 0
      platform/src/main/java/com/jzg/service/PtlInsAttributionTemplateService.java
  5. 17 0
      platform/src/main/java/com/jzg/service/impl/PtlInsAttributionTemplateServiceImpl.java
  6. 24 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java
  7. 25 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/PlatformClient.java
  8. 10 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/base/OrderBase.java
  9. 1 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/standard/conversion/ConfigureParametersConversion.java
  10. 10 7
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/SummaryQuotationApplication.java
  11. 78 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/constants/QuoteNumberConstant.java
  12. 26 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  13. 89 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/po/SysQuoteConfig.java
  14. 79 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/po/SysQuoteRecord.java
  15. 52 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/po/SysQuoteUser.java
  16. 80 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/po/SysQuoteUserConfigAppend.java
  17. 49 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/QuoteDetailsQueryVo.java
  18. 86 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/QuoteDetailsVo.java
  19. 91 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/QuoteNumRedisVo.java
  20. 45 9
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/CompanyFactory.java
  21. 94 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/decorator/QuoteDispatchDecorator.java
  22. 28 7
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/decorator/QuoteRestrictDecorator.java
  23. 14 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/SysQuoteConfigMapper.java
  24. 29 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/SysQuoteRecordMapper.java
  25. 20 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/SysQuoteUserConfigAppendMapper.java
  26. 19 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/SysQuoteUserMapper.java
  27. 88 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/SysQuoteConfigService.java
  28. 99 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/SysQuoteRedisService.java
  29. 331 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/SysQuoteConfigServiceImpl.java
  30. 413 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/SysQuoteRedisServiceImpl.java
  31. 281 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/SysQuoteRecordMapper.xml
  32. 103 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/SysQuoteUserConfigAppendMapper.xml
  33. 29 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/SysQuoteUserMapper.xml
  34. 9 8
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/components/YcRequestApiComponents.java
  35. 0 7
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/properties/YcApiConfigurationProperties.java
  36. 18 0
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/properties/YcConfigurationProperties.java
  37. 25 20
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java
  38. 8 0
      tenant/organization/src/main/java/com/jzg/organization/controller/AreaController.java
  39. 4 5
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java
  40. 2 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysDeptServiceImpl.java

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

@@ -77,7 +77,7 @@ public class SecurityConfig {
         http.csrf().disable();
         http.authorizeHttpRequests(auth -> auth
                         .requestMatchers("/swagger-ui/**", "/v3/api-docs/**", "/swagger-resources/**", "/webjars/**", "/favicon.ico",
-                                "/auth/login","/auth/captchaById","/auth/register","/send/sendSmsCode/**","/appLogin","/smsCodeLogin","/appAuth/smsCodeLogin").permitAll()
+                                "/auth/login","/auth/captchaById","/auth/register","/sendSmsCode","/appLogin","/smsCodeLogin","/auth/publicKeyExchange","/appAuth/smsCodeLogin").permitAll()
                         .anyRequest().authenticated()  // 其他接口需认证
                 )
 //                .formLogin((form) -> form

+ 1 - 1
commons/src/main/java/com/jzg/commons/core/base/BaseController.java

@@ -22,7 +22,7 @@ public class BaseController {
     @Autowired
     RedissonClient redissonClient;
 
-    private String getToken(){
+    public String getToken(){
         ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
         if(attributes == null){
             //内部调用的请求

+ 8 - 0
platform/src/main/java/com/jzg/controller/AttributionTemplateController.java

@@ -48,4 +48,12 @@ public class AttributionTemplateController {
         return ptlInsAttributionTemplateService.getPtlInsAttributionTemplate(ptlInsAttributionTemplateVo);
     }
 
+    @GetMapping("/getAgreementAttribution")
+    @Operation(summary = "获取协议属性信息")
+    public HttpResult<PtlAgreementAttribution> getAgreementAttribution(String agreementId) {
+        return ptlInsAttributionTemplateService.getAgreementAttribution(agreementId);
+    }
+
+
+
 }

+ 7 - 0
platform/src/main/java/com/jzg/service/PtlInsAttributionTemplateService.java

@@ -36,4 +36,11 @@ public interface PtlInsAttributionTemplateService extends IService<PtlInsAttribu
     public boolean submit(List<PtlInsAttributionTemplateSaveVo> ptlInsAttributionTemplateSaveVo);
 
     HttpResult<PtlInsAttributionTemplate> getPtlInsAttributionTemplate(PtlInsAttributionTemplateVo ptlInsAttributionTemplateVo);
+
+    /**
+     * 获取协议属性信息
+     * @param agreementId
+     * @return
+     */
+    HttpResult<PtlAgreementAttribution> getAgreementAttribution(String agreementId);
 }

+ 17 - 0
platform/src/main/java/com/jzg/service/impl/PtlInsAttributionTemplateServiceImpl.java

@@ -4,16 +4,19 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.constants.PtlApiType;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
 import com.jzg.commons.entity.agreement.po.PtlCrawlerApi;
 import com.jzg.commons.entity.agreement.po.PtlInsAttributionTemplate;
 import com.jzg.commons.entity.agreement.vo.PtlInsAttributionTemplateQueryVo;
 import com.jzg.commons.entity.agreement.vo.PtlInsAttributionTemplateSaveVo;
 import com.jzg.commons.entity.agreement.vo.PtlInsAttributionTemplateVo;
 import com.jzg.commons.entity.po.EsmInsCompany;
+import com.jzg.commons.entity.po.PtlAgreement;
 import com.jzg.commons.exception.ValidateException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.mapper.PtlAgreementAttributionMapper;
 import com.jzg.mapper.PtlInsAttributionTemplateMapper;
+import com.jzg.service.PtlAgreementService;
 import com.jzg.service.PtlCrawlerApiService;
 import com.jzg.service.EsmInsCompanyService;
 import com.jzg.service.PtlInsAttributionTemplateService;
@@ -33,6 +36,9 @@ public class PtlInsAttributionTemplateServiceImpl extends ServiceImpl<PtlInsAttr
     @Autowired
     PtlCrawlerApiService ptlCrawlerApiService;
 
+    @Autowired
+    PtlAgreementService ptlAgreementService;
+
     @Resource
     private PtlAgreementAttributionMapper agreementAttributionMapper;
 
@@ -107,4 +113,15 @@ public class PtlInsAttributionTemplateServiceImpl extends ServiceImpl<PtlInsAttr
         AssertionUtils.isEmpty(ptlInsAttributionTemplate, "保险公司归属信息模板查询失败");
         return HttpResult.ok(ptlInsAttributionTemplate);
     }
+
+    @Override
+    public HttpResult<PtlAgreementAttribution> getAgreementAttribution(String agreementId){
+        PtlAgreement ptlAgreement = ptlAgreementService.getById(agreementId);
+        AssertionUtils.isEmpty(ptlAgreement,"协议不存在");
+
+        PtlAgreementAttribution ptlAgreementAttribution = agreementAttributionMapper.selectById(ptlAgreement.getAttributionId());
+        AssertionUtils.isEmpty(ptlAgreementAttribution,"账号归属信息查询失败");
+
+        return HttpResult.ok(ptlAgreementAttribution);
+    }
 }

+ 24 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/OrgClient.java

@@ -0,0 +1,24 @@
+package com.jzg.quotation.commons.client;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
+import com.jzg.commons.entity.vo.PersonAreaVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(name="jzg-organization",url = "http://localhost:8084/")
+public interface OrgClient {
+
+    /**
+     * 查找人员信息地区
+     * @param address
+     * @param idCard
+     * @return
+     */
+    @GetMapping(value = "/area/queryByAddress")
+    public HttpResult<PersonAreaVo> queryByAddress(@RequestParam("address") String address,
+                                                   @RequestParam("idCard") String idCard);
+
+}

+ 25 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/client/PlatformClient.java

@@ -0,0 +1,25 @@
+package com.jzg.quotation.commons.client;
+
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
+import com.jzg.commons.entity.vo.PersonAreaVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(name="jzg-platform",url = "http://localhost:8083/")
+public interface PlatformClient {
+
+
+    /**
+     * 根据协议id 获取 协议配置信息
+     * @param agreementId
+     * @return
+     */
+    @GetMapping("/manager/attributionTemplate/getAgreementAttribution")
+    public HttpResult<PtlAgreementAttribution> getAgreementAttribution(
+            @RequestParam("agreementId") String agreementId,
+            @RequestHeader("Authorization") String authToken);
+
+}

+ 10 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/base/OrderBase.java

@@ -43,4 +43,14 @@ public class OrderBase implements Serializable {
      * 请求方式
      */
     private int apiType;
+
+    /**
+     * 真实的报价人 如果是待客录单 则是待客录单的用户id
+     */
+    private String realQuoteUserId;
+
+    /**
+     * 协议id 或 账号id
+     */
+    private String agreementId;
 }

+ 1 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/standard/conversion/ConfigureParametersConversion.java

@@ -40,7 +40,7 @@ public class ConfigureParametersConversion {
         for (Field field : fieldsList) {
             try {
                 ReflectionUtils.makeAccessible(field);
-                field.set(t, configInfo.get(field.getName()));
+                field.set(t1, configInfo.get(field.getName()));
             } catch (IllegalAccessException e) {
                 throw new SystemException("{}没有此字段的映射", configInfo.get(field.getName()));
             }

+ 10 - 7
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/SummaryQuotationApplication.java

@@ -1,21 +1,24 @@
 package com.jzg.quotation.summary;
 
 
+import com.jzg.quotation.yongcheng.api.properties.YcConfigurationProperties;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.openfeign.EnableFeignClients;
 import org.springframework.context.annotation.ComponentScan;
-import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
-import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
 
 
-@ComponentScan(basePackages = {"com.jzg.**"})
+@ComponentScan(basePackages = {"com.jzg"})
 @MapperScan({"com.jzg.**.mapper", "com.jzg.commons.mapper"})
 @SpringBootApplication
-@EnableMongoRepositories(
-        basePackages = "com.jzg.quotation.zijin.api.repository",
-        repositoryBaseClass = SimpleMongoRepository.class // 强制同步模式
-)
+@EnableFeignClients(basePackages = "com.jzg.quotation.commons.client")
+@EnableConfigurationProperties(YcConfigurationProperties.class)
+//@EnableMongoRepositories(
+//        basePackages = "com.jzg.quotation.zijin.api.repository",
+//        repositoryBaseClass = SimpleMongoRepository.class // 强制同步模式
+//)
 public class SummaryQuotationApplication {
 
     public static void main(String[] args) {

+ 78 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/constants/QuoteNumberConstant.java

@@ -0,0 +1,78 @@
+package com.jzg.quotation.summary.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+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(QuoteResult 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(QuoteStatus item : values()){
+                if(item.getCode().toString().equals(code)){
+                    return item.desc;
+                }
+            }
+            return "";
+        }
+    }
+
+}

+ 26 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -1,13 +1,18 @@
 package com.jzg.quotation.summary.controller;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
 import com.jzg.quotation.commons.service.QuotationApiBaseService;
+import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.summary.factory.CompanyFactory;
+import com.jzg.quotation.summary.service.SysQuoteConfigService;
+import com.jzg.quotation.summary.service.SysQuoteRedisService;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -19,6 +24,21 @@ import org.springframework.web.bind.annotation.RestController;
 @RequiredArgsConstructor
 public class UnifyOrderManager {
 
+    @Autowired
+    private SysQuoteRedisService sysQuoteRedisService;
+
+    @Autowired
+    private SysQuoteConfigService sysQuoteConfigService;
+
+    @Autowired
+    private PlatformClient platformClient;
+
+    @Autowired
+    private BaseController baseController;
+
+    @Autowired
+    CompanyFactory companyFactory;
+
     /**
      * 统一报价
      * @param quoteVo
@@ -27,7 +47,12 @@ public class UnifyOrderManager {
     @PostMapping("/quote")
     public HttpResult quote(@RequestBody QuoteVo quoteVo) throws JsonProcessingException {
         //获取保司实体
-        QuotationApiBaseService quoteService = CompanyFactory.getQuoteService(quoteVo.getOrder().getInsuranceCompanyCode());
+        QuotationApiBaseService quoteService = companyFactory.getQuoteService(
+                quoteVo.getOrder().getInsuranceCompanyCode(),
+                sysQuoteConfigService,sysQuoteRedisService,
+                platformClient,
+                baseController);
+
         QuoteResultsVo quote = quoteService.quote(quoteVo);
         return HttpResult.ok(quote);
     }

+ 89 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/po/SysQuoteConfig.java

@@ -0,0 +1,89 @@
+package com.jzg.quotation.summary.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jzg.commons.entity.po.SysUser;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+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<>();
+        }
+    }
+
+}

+ 79 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/po/SysQuoteRecord.java

@@ -0,0 +1,79 @@
+package com.jzg.quotation.summary.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.util.idgen.IdGenerate;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+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(QuoteVo quoteVo, String action, String result){
+        this.id = IdGenerate.nextId();
+//        this.userId = quoteVo.getOrder().getUserid();
+        this.companyId = quoteVo.getOrder().getInsuranceCompanyCode();
+        this.licenseNo = quoteVo.getCarInfoVo().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 =
+        this.createTime = LocalDateTime.now();
+
+    }
+}

+ 52 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/po/SysQuoteUser.java

@@ -0,0 +1,52 @@
+package com.jzg.quotation.summary.entity.po;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jzg.commons.util.idgen.IdGenerate;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+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
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/po/SysQuoteUserConfigAppend.java

@@ -0,0 +1,80 @@
+package com.jzg.quotation.summary.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);
+    }
+
+}

+ 49 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/QuoteDetailsQueryVo.java

@@ -0,0 +1,49 @@
+package com.jzg.quotation.summary.entity.vo;
+
+import com.jzg.commons.core.base.PageRequest;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 报价次数的redis缓存数据实体
+ */
+@Data
+public class QuoteDetailsQueryVo extends PageRequest {
+    @Schema(description = "子订单号")
+    private String subOrderNo;
+
+    private String id;
+
+    @Schema(description = "动作")
+    private String action;
+
+    @Schema(description = "车牌")
+    private String licenseNo;
+
+    @Schema(description = "结果")
+    private String result;
+
+    @Schema(description = "起始时间")
+    private String startTime;
+
+    @Schema(description = "止期时间")
+    private String endTime;
+
+    @Schema(description = "保险公司id")
+    private String companyId;
+
+    @Schema(description = "工号id")
+    private String agentId;
+
+    @Schema(description = "代理人")
+    private String agent;
+
+    @Schema(description = "操作人")
+    private String operator;
+
+    @Schema(description = "部门id")
+    private String deptId;
+
+    @Schema(description = "创建人")
+    private String createBy;
+}

+ 86 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/QuoteDetailsVo.java

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

+ 91 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/QuoteNumRedisVo.java

@@ -0,0 +1,91 @@
+package com.jzg.quotation.summary.entity.vo;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jzg.quotation.summary.entity.po.SysQuoteConfig;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+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);
+    }
+
+}

+ 45 - 9
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/CompanyFactory.java

@@ -1,18 +1,54 @@
 package com.jzg.quotation.summary.factory;
 
+import com.jzg.commons.constants.CompanyConstants;
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.util.spring.SpringUtils;
+import com.jzg.quotation.commons.client.PlatformClient;
+import com.jzg.quotation.commons.service.QuotationApiBaseService;
+import com.jzg.quotation.summary.factory.decorator.QuoteDispatchDecorator;
+import com.jzg.quotation.summary.factory.decorator.QuoteRestrictDecorator;
+import com.jzg.quotation.summary.service.SysQuoteConfigService;
+import com.jzg.quotation.summary.service.SysQuoteRedisService;
+import com.jzg.quotation.yongcheng.api.service.impl.YongChengApiRequestImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
 /**
  * 保司工厂类
  */
+@Component
 public class CompanyFactory {
 
-//    public static QuotationApiBaseService getQuoteService(String companyCode){
-//        QuotationApiBaseService quoteService = null;
-//        //永诚
-//        if(CompanyConstants.AICS.getCompanyCode().equals(companyCode)){
-//            quoteService = new YongChengApiRequestImpl();
-//        }
-//        //返回报价限制增强装饰器
-//        return new QuoteRestrictDecorator(quoteService);
-//    }
+    @Autowired
+    private SysQuoteConfigService sysQuoteConfigService;
+
+    @Autowired
+    private SysQuoteRedisService sysQuoteRedisService;
+
+    @Autowired
+    private PlatformClient platformClient;
+
+
+
+    public QuotationApiBaseService getQuoteService(String companyCode, SysQuoteConfigService sysQuoteConfigService, SysQuoteRedisService sysQuoteRedisService,
+                                                   PlatformClient platformClient, BaseController baseController){
+        QuotationApiBaseService quoteService = null;
+        //永诚
+        if(CompanyConstants.AICS.getCompanyCode().equals(companyCode)){
+            quoteService = SpringUtils.getBean(YongChengApiRequestImpl.class);
+        }
+
+
+        // 第三步 费用计算增强装饰器
+        //quoteService = new QuoteCostDecorator(quoteService, sysQuoteConfigService, sysQuoteRedisService);
+
+        // 第二步 报价协议调度装饰器
+        quoteService = new QuoteDispatchDecorator(quoteService,sysQuoteConfigService, sysQuoteRedisService,platformClient,baseController);
+
+
+        // 第一步 报价限制增强装饰器
+        quoteService = new QuoteRestrictDecorator(quoteService, sysQuoteConfigService, sysQuoteRedisService);
+        return quoteService;
+    }
 
 }

+ 94 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/decorator/QuoteDispatchDecorator.java

@@ -0,0 +1,94 @@
+package com.jzg.quotation.summary.factory.decorator;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
+import com.jzg.commons.util.AssertionUtils;
+import com.jzg.quotation.commons.entity.vo.aggregated.InsuranceUploadImageVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.UnderwritingVo;
+import com.jzg.quotation.commons.entity.vo.base.OrderBase;
+import com.jzg.quotation.commons.entity.vo.quote.AttributionInformationVo;
+import com.jzg.quotation.commons.service.QuotationApiBaseService;
+import com.jzg.quotation.commons.client.PlatformClient;
+import com.jzg.quotation.summary.service.SysQuoteConfigService;
+import com.jzg.quotation.summary.service.SysQuoteRedisService;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 报价协议调度装饰器
+ */
+public class QuoteDispatchDecorator implements QuotationApiBaseService {
+
+    private final QuotationApiBaseService quotationApiBaseService;
+    private final SysQuoteConfigService sysQuoteConfigService;
+
+    private final SysQuoteRedisService sysQuoteRedisService;
+
+    private final PlatformClient platformClient;
+
+    private final BaseController baseController;
+
+    public QuoteDispatchDecorator(QuotationApiBaseService quotationApiBaseService,
+                                  SysQuoteConfigService sysQuoteConfigService,
+                                  SysQuoteRedisService sysQuoteRedisService,
+                                  PlatformClient platformClient,
+                                  BaseController baseController) {
+        this.quotationApiBaseService = quotationApiBaseService;
+        this.sysQuoteConfigService = sysQuoteConfigService;
+        this.sysQuoteRedisService = sysQuoteRedisService;
+        this.platformClient = platformClient;
+        this.baseController = baseController;
+    }
+
+    @Override
+    public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
+        String agreementId = quoteVo.getOrder().getAgreementId();
+        String token = baseController.getToken();
+        HttpResult<PtlAgreementAttribution> agreementAttribution = platformClient.getAgreementAttribution(agreementId,token);
+        AssertionUtils.isFail(agreementAttribution.getCode() == 500,"获取协议属性失败");
+        Map<String, String> fieldMap = agreementAttribution.getData().getFields().stream()
+                .map(obj -> new JSONObject((Map<String, Object>) obj))  // 转换为 JSONObject
+                .collect(Collectors.toMap(
+                        json -> json.getString("field"),    // 获取 key
+                        json -> json.getString("value")   // 获取 value
+                ));
+        AttributionInformationVo attributionInformationVo = new AttributionInformationVo();
+        attributionInformationVo.setConfigInfo(fieldMap);
+        quoteVo.getOrder().setAttributionInformationVo(attributionInformationVo);
+        //协议调度
+        QuoteResultsVo quoteResultsVo = this.quotationApiBaseService.quote(quoteVo);
+        return quoteResultsVo;
+    }
+
+    @Override
+    public void underwriting(UnderwritingVo underwritingVo) {
+        quotationApiBaseService.underwriting(underwritingVo);
+    }
+
+    @Override
+    public String getPaymentLink(OrderBase orderBase) throws JsonProcessingException {
+        return null;
+    }
+
+    @Override
+    public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
+
+    }
+
+    @Override
+    public void downloadPolicy(OrderBase orderBase) {
+
+    }
+
+    @Override
+    public void queryOrderState(OrderBase orderBase) {
+
+    }
+
+}

+ 28 - 7
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/factory/decorator/QuoteRestrictDecorator.java

@@ -1,33 +1,54 @@
 package com.jzg.quotation.summary.factory.decorator;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.entity.vo.aggregated.InsuranceUploadImageVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.UnderwritingVo;
 import com.jzg.quotation.commons.entity.vo.base.OrderBase;
 import com.jzg.quotation.commons.service.QuotationApiBaseService;
+import com.jzg.quotation.summary.entity.vo.QuoteNumRedisVo;
+import com.jzg.quotation.summary.service.SysQuoteConfigService;
+import com.jzg.quotation.summary.service.SysQuoteRedisService;
+
+import java.math.BigDecimal;
+import java.util.Objects;
 
 /**
  * 报价限制装饰器
  */
 public class QuoteRestrictDecorator implements QuotationApiBaseService {
     private final QuotationApiBaseService quotationApiBaseService;
+    private final SysQuoteConfigService sysQuoteConfigService;
 
-    public QuoteRestrictDecorator(QuotationApiBaseService quotationApiBaseService) {
+    private final SysQuoteRedisService sysQuoteRedisService;
 
+    public QuoteRestrictDecorator(QuotationApiBaseService quotationApiBaseService,
+                                  SysQuoteConfigService sysQuoteConfigService,
+                                  SysQuoteRedisService sysQuoteRedisService) {
         this.quotationApiBaseService = quotationApiBaseService;
-
+        this.sysQuoteConfigService = sysQuoteConfigService;
+        this.sysQuoteRedisService = sysQuoteRedisService;
     }
 
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) throws JsonProcessingException {
+        String companyId = quoteVo.getOrder().getInsuranceCompanyCode();
         //报价前置检测次数
-
-        QuoteResultsVo quote = quotationApiBaseService.quote(quoteVo);
-        //报价后置计算费用
-
-        return quote;
+        boolean checkQuoteLimitation = sysQuoteConfigService.checkQuoteLimitation(quoteVo);
+        if(!checkQuoteLimitation){
+            //次数超限 出单比比较
+            BigDecimal quoteRatio = sysQuoteRedisService.getQuoteRatio(companyId, quoteVo.getOrder().getRealQuoteUserId());
+            QuoteNumRedisVo quoteNumberRedisData = sysQuoteRedisService.getQuoteNumberRedisData(quoteVo.getOrder().getRealQuoteUserId());
+            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))
+            {
+                throw new SystemException("报价次数限制!");
+            }
+
+        }
+        return quotationApiBaseService.quote(quoteVo);
     }
 
     @Override

+ 14 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/SysQuoteConfigMapper.java

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

+ 29 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/SysQuoteRecordMapper.java

@@ -0,0 +1,29 @@
+package com.jzg.quotation.summary.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.quotation.summary.entity.po.SysQuoteRecord;
+import com.jzg.quotation.summary.entity.vo.QuoteDetailsQueryVo;
+import com.jzg.quotation.summary.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);
+}

+ 20 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/SysQuoteUserConfigAppendMapper.java

@@ -0,0 +1,20 @@
+package com.jzg.quotation.summary.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jzg.quotation.summary.entity.po.SysQuoteUserConfigAppend;
+import com.jzg.quotation.summary.entity.vo.QuoteDetailsQueryVo;
+import com.jzg.quotation.summary.entity.vo.QuoteDetailsVo;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @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);
+
+    public QuoteDetailsVo getAppendUserQuoteInfo(@Param("companyId") String companyId,@Param("userId") String userId,@Param("id") String id);
+}

+ 19 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/mapper/SysQuoteUserMapper.java

@@ -0,0 +1,19 @@
+package com.jzg.quotation.summary.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jzg.quotation.summary.entity.po.SysQuoteConfig;
+import com.jzg.quotation.summary.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);
+}

+ 88 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/SysQuoteConfigService.java

@@ -0,0 +1,88 @@
+package com.jzg.quotation.summary.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.summary.entity.po.SysQuoteConfig;
+import com.jzg.quotation.summary.entity.po.SysQuoteUserConfigAppend;
+import com.jzg.quotation.summary.entity.vo.QuoteDetailsQueryVo;
+import com.jzg.quotation.summary.entity.vo.QuoteDetailsVo;
+import com.jzg.quotation.summary.entity.vo.QuoteNumRedisVo;
+
+import java.util.List;
+
+/**
+ * 针对表【SysQuoteConfig】的数据库操作Service
+ */
+public interface SysQuoteConfigService extends IService<SysQuoteConfig> {
+
+
+
+
+    /**
+     * 检查报价限制
+     * @return
+     */
+    public boolean checkQuoteLimitation(QuoteVo quoteVo);
+
+    /**
+     * 获取保险公司的报价次数
+     * @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 QuoteDetailsVo getAppendUserQuoteInfo(String companyId,String userId,String id);
+
+    /**
+     * 根据保险公司获取今天用户追加的数据
+     */
+    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);
+}

+ 99 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/SysQuoteRedisService.java

@@ -0,0 +1,99 @@
+package com.jzg.quotation.summary.service;
+
+
+import com.jzg.quotation.summary.entity.po.SysQuoteConfig;
+import com.jzg.quotation.summary.entity.po.SysQuoteRecord;
+import com.jzg.quotation.summary.entity.po.SysQuoteUserConfigAppend;
+import com.jzg.quotation.summary.entity.vo.QuoteNumRedisVo;
+
+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(QuoteNumRedisVo quoteNumberRedisData, 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);
+}

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

@@ -0,0 +1,331 @@
+package com.jzg.quotation.summary.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.jzg.commons.core.base.BaseController;
+import com.jzg.commons.entity.po.SysUser;
+import com.jzg.commons.exception.SystemException;
+import com.jzg.commons.util.idgen.IdGenerate;
+import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
+import com.jzg.quotation.summary.constants.QuoteNumberConstant;
+import com.jzg.quotation.summary.entity.po.SysQuoteConfig;
+import com.jzg.quotation.summary.entity.po.SysQuoteUser;
+import com.jzg.quotation.summary.entity.po.SysQuoteUserConfigAppend;
+import com.jzg.quotation.summary.entity.vo.QuoteDetailsQueryVo;
+import com.jzg.quotation.summary.entity.vo.QuoteDetailsVo;
+import com.jzg.quotation.summary.entity.vo.QuoteNumRedisVo;
+import com.jzg.quotation.summary.mapper.SysQuoteConfigMapper;
+import com.jzg.quotation.summary.mapper.SysQuoteRecordMapper;
+import com.jzg.quotation.summary.mapper.SysQuoteUserConfigAppendMapper;
+import com.jzg.quotation.summary.mapper.SysQuoteUserMapper;
+import com.jzg.quotation.summary.service.InsOrdersService;
+import com.jzg.quotation.summary.service.SysQuoteConfigService;
+import com.jzg.quotation.summary.service.SysQuoteRedisService;
+import org.springframework.beans.factory.annotation.Autowired;
+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;
+
+/**
+ * 服务实现类
+ */
+@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
+    BaseController baseController;
+
+    /**
+     * 检查报价限制
+     * @return
+     */
+    @Override
+    public boolean checkQuoteLimitation(QuoteVo quoteVo) {
+        //如果没有传入待客录单的用户 则默认为当前登录用户
+        if(Objects.isNull(quoteVo.getOrder().getRealQuoteUserId())){
+            quoteVo.getOrder().setRealQuoteUserId(baseController.getUserName());
+        }
+        //获取保司报价次数限制
+        List<SysQuoteConfig> sysQuoteConfigs = this.getUserQuoteNumber(quoteVo.getOrder().getRealQuoteUserId());
+        //拼装用户报价次数信息
+        QuoteNumRedisVo quoteNumberRedisData = sysQuoteRedisService.assembleQuoteRedisData(quoteVo.getOrder().getRealQuoteUserId(), sysQuoteConfigs);
+        //获取用户的最大报价次数
+        Integer maxQuoteNum = sysQuoteRedisService.getMaxQuoteNum(quoteNumberRedisData,quoteVo.getOrder().getInsuranceCompanyCode(), quoteVo.getOrder().getRealQuoteUserId(), quoteVo.getCarInfoVo().getLicenseNo());
+        if(maxQuoteNum <= 0) {
+            return false;
+        }
+//        sysQuoteRedisService.quoteAfterRedisData(quoteVo.getOrder().getInsuranceCompanyCode(), quoteVo.getOrder().getRealQuoteUserId(), quoteVo.getCarInfoVo().getLicenseNo(), 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.getUserName())
+                    .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
+     */
+    @Override
+    public List<SysQuoteConfig> getUserQuoteNumber(String userId){
+        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.getUserName());
+            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.getUserName());
+            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.selectByUserId(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.getUserName());
+        int insert = sysQuoteUserConfigAppendMapper.insert(sysQuoteUserConfigAppend);
+        if(insert > 0){
+            sysQuoteRedisService.updateUserQuoteAppendRedis(sysQuoteUserConfigAppend);
+        }
+        return insert > 0;
+    }
+
+    @Override
+    public Page<QuoteDetailsVo> getAppendUserQuote(Page page, QuoteDetailsQueryVo quoteDetailsQueryVo) {
+        if(!Objects.isNull(quoteDetailsQueryVo.getStartTime()) && !quoteDetailsQueryVo.getStartTime().equals("")){
+            quoteDetailsQueryVo.setStartTime(quoteDetailsQueryVo.getStartTime() + " 00:00:00");
+            quoteDetailsQueryVo.setEndTime(quoteDetailsQueryVo.getEndTime() + " 23:59:59");
+        }
+        Page<QuoteDetailsVo> appendUserQuote = sysQuoteUserConfigAppendMapper.getAppendUserQuote(page,quoteDetailsQueryVo);
+        return appendUserQuote;
+    }
+
+    @Override
+    public QuoteDetailsVo getAppendUserQuoteInfo(String companyId,String userId,String id){
+        QuoteDetailsVo appendUserQuoteInfo = sysQuoteUserConfigAppendMapper.getAppendUserQuoteInfo(companyId, userId, id);
+        return appendUserQuoteInfo;
+    }
+
+    /**
+     * 根据保险公司获取今天用户追加的数据
+     */
+    @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(!Objects.isNull(quoteDetailsQueryVo.getStartTime()) && !quoteDetailsQueryVo.getStartTime().equals("")){
+            quoteDetailsQueryVo.setStartTime(quoteDetailsQueryVo.getStartTime() + " 00:00:00");
+            quoteDetailsQueryVo.setEndTime(quoteDetailsQueryVo.getEndTime() + " 23:59:59");
+        }
+        if(quoteDetailsQueryVo.getDeptId() == null) {
+            quoteDetailsQueryVo.setDeptId(baseController.getUserName());
+        }
+        if(quoteDetailsQueryVo.getOperator() == null){
+            quoteDetailsQueryVo.setOperator(baseController.getUserName());
+        }
+        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.getUserName());
+        }
+        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.getUserName());
+        }
+        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;
+    }
+
+}

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

@@ -0,0 +1,413 @@
+package com.jzg.quotation.summary.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.jzg.commons.core.base.BaseController;
+import com.jzg.quotation.summary.constants.QuoteNumberConstant;
+import com.jzg.quotation.summary.entity.po.SysQuoteConfig;
+import com.jzg.quotation.summary.entity.po.SysQuoteRecord;
+import com.jzg.quotation.summary.entity.po.SysQuoteUserConfigAppend;
+import com.jzg.quotation.summary.entity.vo.QuoteNumRedisVo;
+import com.jzg.quotation.summary.mapper.SysQuoteRecordMapper;
+import com.jzg.quotation.summary.mapper.SysQuoteUserConfigAppendMapper;
+import com.jzg.quotation.summary.mapper.SysQuoteUserMapper;
+import com.jzg.quotation.summary.service.InsOrdersService;
+import com.jzg.quotation.summary.service.SysQuoteConfigService;
+import com.jzg.quotation.summary.service.SysQuoteRedisService;
+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 java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.jzg.quotation.summary.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
+    BaseController baseController;
+
+
+
+    /**
+     * 模糊搜索报价次数的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.getUserName())))){
+//                List<SysQuoteConfig> sysQuoteConfigs = sysQuoteConfigService.getUserQuoteNumber(baseController.getUserName());
+//                quoteNumRedisVo = assembleQuoteRedisData(baseController.getUserName(), sysQuoteConfigs);
+//            }else{
+//                String jsonStr = redisTemplate.opsForValue().get(getQuoteNumberRedisKey(baseController.getUserName())).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(QuoteNumRedisVo quoteNumberRedisData, String companyId, String userId, String licenseNo) {
+        Integer maxQuoteNum = 10;
+        //当天最大报价的次数
+        Integer dayMaxQuoteNum = 0;
+        // 当天已经报价的次数
+        Integer dayAlreadyQuoteNum = 0;
+        //车辆最大报价的次数
+        Integer carMaxQuoteNum = 0;
+        //车辆已经报价的次数
+        Integer carAlreadyQuoteNum = 0;
+        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);
+
+        if(quoteNumberRedisData.getQuoteCompanyList().stream().anyMatch(company -> company.getCompanyId().equals(companyId))){
+            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));
+    }
+
+
+}

+ 281 - 0
tenant/insurance/quotation-summary/src/main/resources/mapper/SysQuoteRecordMapper.xml

@@ -0,0 +1,281 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.quotation.summary.mapper.SysQuoteRecordMapper">
+
+    <insert id="insertBatch">
+        INSERT INTO sys_quote_record (id, user_id, company_id, sub_order_no, license_no, action, result, status, agent, operator, create_time)
+        VALUES
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.id}, #{item.userId}, #{item.companyId}, #{item.subOrderNo}, #{item.licenseNo}, #{item.action}, #{item.result}, #{item.status}, #{item.agent}, #{item.operator}, #{item.createTime})
+        </foreach>
+    </insert>
+
+    <select id="getQuoteRequestRecordPage" resultType="com.jzg.quotation.summary.entity.vo.QuoteDetailsVo">
+        SELECT
+            eic.namesimple as company,
+            sqr.*
+        FROM
+            sys_quote_record sqr
+                LEFT JOIN esm_ins_company eic ON sqr.company_id = eic.id
+                LEFT JOIN sys_user su ON sqr.user_id = su.id
+                LEFT JOIN sys_dept sd ON su.dept_id = sd.id
+        WHERE
+            1=1
+        <if test="param.deptId != null and param.deptId!= ''">
+            AND sd.id like '${param.deptId}%'
+        </if>
+
+    </select>
+
+    <select id="getQuoteRecordPage" resultType="com.jzg.quotation.summary.entity.vo.QuoteDetailsVo">
+        SELECT
+            su.id,
+            su.NAME,
+            su.mobile,
+            sqr.*
+        FROM
+            sys_quote_record sqr
+                LEFT JOIN sys_user su ON sqr.user_id = su.id
+                LEFT JOIN sys_dept sd ON su.dept_id = sd.id
+        WHERE
+            1=1
+            <if test="param.subOrderNo!= null and param.subOrderNo!= ''">
+                AND sqr.sub_order_no = #{param.subOrderNo}
+            </if>
+            <if test="param.startTime != null and param.startTime!= ''">
+                AND sqr.create_time BETWEEN #{param.startTime}
+                    AND #{param.endTime}
+            </if>
+            <if test="param.licenseNo!= null and param.licenseNo!= ''">
+                AND sqr.license_no = #{param.licenseNo}
+            </if>
+            <if test="param.result!= null and param.result!= ''">
+                AND sqr.result = #{param.result}
+            </if>
+
+
+            <if test="param.deptId!= null and param.deptId!= ''">
+                <if test="param.operator != null and param.operator != ''">
+                    AND (sd.id like '${param.deptId}%' or sqr.operator = #{param.operator} or su.name = #{param.operator})
+                </if>
+                <if test="param.operator == null or param.operator == ''">
+                    AND sd.id like '${param.deptId}%'
+                </if>
+            </if>
+            <if test="param.agent != null and param.agent!= ''">
+                AND sqr.user_id = #{param.agent}
+            </if>
+        ORDER BY sqr.create_time DESC
+    </select>
+
+    <select id="getQuoteDetails" resultType="com.jzg.quotation.summary.entity.vo.QuoteDetailsVo">
+        WITH day_all_num AS (
+        SELECT
+        user_id,
+        company_id,
+        COALESCE ( SUM( count ), 0 ) AS count
+        FROM
+        ( SELECT user_id, company_id, COUNT( id ) AS count FROM sys_quote_record WHERE DATE( create_time ) = CURRENT_DATE GROUP BY user_id, company_id ) AS subquery
+        GROUP BY
+        user_id,
+        company_id
+        ),
+        day_all_order AS (
+        SELECT
+        user_id,
+        company_id,
+        COALESCE ( SUM( count ), 0 ) AS count
+        FROM
+        (
+        SELECT
+        user_id,
+        company_id,
+        COUNT( DISTINCT sub_order_no ) AS count
+        FROM
+        sys_quote_record
+        WHERE
+        DATE( create_time ) = CURRENT_DATE
+        GROUP BY
+        user_id,
+        sub_order_no,
+        company_id
+        ) AS subquery
+        GROUP BY
+        user_id,
+        company_id
+        ),
+        day_cover_order AS (
+        SELECT
+        user_id,
+        company_id,
+        COALESCE ( SUM( count ), 0 ) AS count
+        FROM
+        (
+        SELECT
+        sqr.user_id,
+        sqr.company_id,
+        COUNT( DISTINCT sqr.sub_order_no ) AS count
+        FROM
+        sys_quote_record sqr
+        LEFT JOIN ins_area_company iac ON sqr.sub_order_no = iac.id
+        WHERE
+        iac.orderstatus = 3
+        AND DATE( sqr.create_time ) = CURRENT_DATE
+        GROUP BY
+        sqr.user_id,
+        sqr.sub_order_no,
+        company_id
+        ) AS subquery
+        GROUP BY
+        user_id,
+        company_id
+        ),
+        whole_all_order AS (
+        SELECT
+        user_id,
+        company_id,
+        COALESCE ( SUM( count ), 0 ) AS count
+        FROM
+        ( SELECT user_id, company_id, COUNT( DISTINCT sub_order_no ) AS count FROM sys_quote_record GROUP BY user_id, sub_order_no, company_id ) AS subquery
+        GROUP BY
+        user_id,
+        company_id
+        ),
+        whole_cover_order AS (
+        SELECT
+        user_id,
+        company_id,
+        COALESCE ( SUM( count ), 0 ) AS count
+        FROM
+        (
+        SELECT
+        sqr.user_id,
+        sqr.company_id,
+        COUNT( DISTINCT sqr.sub_order_no ) AS count
+        FROM
+        sys_quote_record sqr
+        LEFT JOIN ins_area_company iac ON sqr.sub_order_no = iac.id
+        WHERE
+        iac.orderstatus = 3
+        GROUP BY
+        sqr.user_id,
+        sqr.sub_order_no,
+        sqr.company_id
+        ) AS subquery
+        GROUP BY
+        user_id,
+        company_id
+        ) SELECT
+        su.dept_id,
+        sd.NAME AS dept_name,
+        su.NAME,
+        su.mobile,
+        sqr.user_id,
+        sqr.company_id,
+        eic.namesimple AS company,
+        COUNT( CASE WHEN sqr.result = 0 THEN 1 END ) AS failed_count,
+        COUNT( CASE WHEN sqr.result = 1 THEN 1 END ) AS success_count,
+        COALESCE ( dan.count, 0 ) AS num_count,
+        COALESCE ( dao.count, 0 ) AS day_all_order,
+        COALESCE ( dco.count, 0 ) AS day_cover_order,
+        COALESCE ( wao.count, 0 ) AS whole_all_order,
+        COALESCE ( wco.count, 0 ) AS whole_cover_order,
+        COALESCE (( COALESCE ( dco.count, 0 ) / NULLIF( dao.count, 0 )), 0 ) * 100 AS rate
+        FROM
+        sys_quote_record sqr
+        LEFT JOIN sys_user su ON sqr.user_id = su.id
+        LEFT JOIN sys_dept sd ON su.dept_id = sd.id
+        LEFT JOIN esm_ins_company eic ON eic.id = sqr.company_id
+        LEFT JOIN day_all_order dao ON sqr.user_id = dao.user_id
+        AND sqr.company_id = dao.company_id
+        LEFT JOIN day_cover_order dco ON sqr.user_id = dco.user_id
+        AND dco.company_id = sqr.company_id
+        LEFT JOIN whole_all_order wao ON sqr.user_id = wao.user_id
+        AND wao.company_id = sqr.company_id
+        LEFT JOIN whole_cover_order wco ON sqr.user_id = wco.user_id
+        AND wco.company_id = sqr.company_id
+        LEFT JOIN day_all_num dan ON sqr.user_id = dan.user_id
+        AND dan.company_id = sqr.company_id
+        WHERE
+        1 = 1
+        <if test="param.companyId!= null and param.companyId!= ''">
+            AND sqr.company_id = #{param.companyId}
+        </if>
+        <if test="param.agent!= null and param.agent!= ''">
+            AND (su.name = #{param.agent} or su.mobile = #{param.agent})
+        </if>
+        <if test="param.agentId!= null and param.agentId != ''">
+        AND sqr.user_id = #{param.agentId}
+        </if>
+        <if test="param.deptId!= null and param.deptId!= ''">
+            AND sd.id like '${param.deptId}%'
+        </if>
+        GROUP BY
+        sqr.user_id,
+        company_id,
+        eic.namesimple,
+        dao.count,
+        dco.count,
+        wao.count,
+        wco.count,
+        su.dept_id,
+        sd.NAME,
+        su.NAME,
+        su.mobile
+    </select>
+
+    <select id="getQuoteRatio" resultType="BigDecimal">
+        WITH
+            day_all_order AS (
+                SELECT user_id, COALESCE(SUM(count), 0) AS count
+                FROM (
+                         SELECT user_id, COUNT(DISTINCT sub_order_no) AS count
+                         FROM sys_quote_record
+                         WHERE  DATE(create_time) = CURRENT_DATE
+                         AND company_id  = #{companyId}
+                         AND user_id = #{userId}
+                         GROUP BY user_id, sub_order_no
+                     ) AS subquery
+                GROUP BY user_id
+            ),
+            day_cover_order AS (
+                SELECT user_id, COALESCE(SUM(count), 0) AS count
+                FROM (
+                         SELECT sqr.user_id, COUNT(DISTINCT sqr.sub_order_no) AS count
+                         FROM sys_quote_record sqr
+                                  LEFT JOIN ins_area_company iac ON sqr.sub_order_no = iac.id
+                         WHERE iac.orderstatus = 3 AND  DATE(sqr.create_time) = CURRENT_DATE
+                           AND iac.company_id  = #{companyId}
+                           AND sqr.user_id = #{userId}
+                         GROUP BY sqr.user_id, sqr.sub_order_no
+                     ) AS subquery
+                GROUP BY user_id
+            )
+        SELECT
+                COALESCE((COALESCE(day_cover_order.count, 0) / NULLIF(day_all_order.count, 0)),0) * 100 AS rate
+        FROM
+            sys_quote_record sqr
+                LEFT JOIN sys_user su ON sqr.user_id = su.id
+                LEFT JOIN sys_dept sd ON su.dept_id = sd.id
+                LEFT JOIN esm_ins_company eic ON eic.id = sqr.company_id
+                LEFT JOIN day_all_order ON sqr.user_id = day_all_order.user_id
+                LEFT JOIN day_cover_order ON sqr.user_id = day_cover_order.user_id
+        WHERE
+            1=1
+          AND sqr.user_id = #{userId}
+          and sqr.company_id = #{companyId}
+            and sqr.create_time BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 1 DAY)
+        GROUP BY
+            sqr.user_id,
+            company_id,
+            eic.namesimple,
+            day_all_order.count,
+            day_cover_order.count,
+            su.dept_id,
+            sd.NAME,
+            su.NAME,
+            su.mobile
+    </select>
+</mapper>

+ 103 - 0
tenant/insurance/quotation-summary/src/main/resources/mapper/SysQuoteUserConfigAppendMapper.xml

@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.quotation.summary.mapper.SysQuoteUserConfigAppendMapper">
+
+    <select id="getAppendUserQuote" resultType="com.jzg.quotation.summary.entity.vo.QuoteDetailsVo">
+        SELECT
+            eic.namesimple as company,
+            squca.id,
+            sd.name as dept_name,
+            sd.id as dept_id,
+            su.name,
+            su.mobile,
+            squca.*
+        FROM
+            sys_quote_user_config_append squca
+                LEFT JOIN sys_user su ON squca.user_id = su.id
+                LEFT JOIN sys_dept sd ON su.dept_id = sd.id
+                left join esm_ins_company eic on squca.company_id = eic.id
+        WHERE
+            1=1
+        <if test="param.companyId!= null and param.companyId!= ''">
+            AND squca.company_id = #{param.companyId}
+        </if>
+        <if test="param.startTime != null and param.startTime!= ''">
+            AND squca.create_time &gt;= #{param.startTime}
+            AND squca.create_time &lt;= #{param.endTime}
+        </if>
+        <if test="param.createBy != null and param.createBy!= ''">
+            AND squca.create_by = #{param.createBy}
+        </if>
+        <if test="param.agent != null and param.agent!= ''">
+            AND (squca.user_id = #{param.agent} or su.`name` = #{param.agent})
+        </if>
+        ORDER BY
+            squca.create_time DESC
+    </select>
+
+    <select id="getAppendUserQuoteInfo" resultType="com.jzg.quotation.summary.entity.vo.QuoteDetailsVo">
+        SELECT
+            squca.*,
+            eic.namesimple as company,
+            su.name,
+            sd.name as dept_name,
+            jrbj.numCount,
+            jrcb.dayCoverOrder,
+            COALESCE((COALESCE(dayCoverOrder, 0) / NULLIF(dayAllOrder, 0)), 0) * 100 AS rate
+        FROM
+            sys_quote_user_config_append squca
+                LEFT JOIN (
+                -- 今日已承保
+                SELECT
+                    COUNT(*) AS dayCoverOrder
+                FROM
+                    sys_quote_record sqr
+                        LEFT JOIN
+                    ins_area_company iac ON iac.id = sqr.sub_order_no
+                WHERE
+                    user_id = #{userId}
+                  AND sqr.company_id = #{companyId}
+                  AND orderstatus = 3
+                  AND DATE(create_time) = CURRENT_DATE
+            ) jrcb ON 1 = 1
+                LEFT JOIN (
+                -- 今日已报价
+                SELECT
+                    COUNT(*) AS numCount
+                FROM
+                    sys_quote_record sqr
+                WHERE
+                    user_id = #{userId}
+                  AND sqr.company_id = #{companyId}
+                  AND DATE(create_time) = CURRENT_DATE
+            ) jrbj ON 1 = 1
+                LEFT JOIN (
+                -- 今日已报价单的订单号
+                SELECT
+                    COUNT(*) AS dayAllOrder
+                FROM (
+                         SELECT
+                             sub_order_no
+                         FROM
+                             sys_quote_record sqr
+                         WHERE
+                             user_id = #{userId}
+                           AND sqr.company_id = #{companyId}
+                           AND DATE(create_time) = CURRENT_DATE
+                         GROUP BY
+                             sub_order_no
+                     ) grouped_sub_orders
+            ) jrbjdd ON 1 = 1
+                left join sys_user su on squca.user_id = su.id
+                left join sys_dept sd on su.dept_id = sd.id
+                left join esm_ins_company eic on eic.id = squca.company_id
+        WHERE
+            squca.user_id = #{userId}
+          AND squca.company_id = #{companyId}
+          AND DATE(squca.create_time) = CURRENT_DATE
+        AND squca.id = #{id}
+    </select>
+
+</mapper>

+ 29 - 0
tenant/insurance/quotation-summary/src/main/resources/mapper/SysQuoteUserMapper.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jzg.quotation.summary.mapper.SysQuoteUserMapper">
+
+    <insert id="insertBatch">
+        INSERT INTO sys_quote_user (id, config_id, user_id)
+        VALUES
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.id}, #{item.configId}, #{item.userId})
+        </foreach>
+    </insert>
+
+
+    <select id="getQuoteUserConfig" resultType="com.jzg.quotation.summary.entity.po.SysQuoteConfig">
+        select sqc.*
+        from sys_quote_config sqc
+        where is_enabled = 1
+          and authorize = 0
+        UNION
+        select sqc.*
+        from sys_quote_config sqc
+                 left join sys_quote_user squ on squ.config_id = sqc.id
+        where is_enabled = 1
+          and authorize = 1
+          and squ.user_id = #{userId};
+    </select>
+</mapper>

+ 9 - 8
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/components/YcRequestApiComponents.java

@@ -15,22 +15,24 @@ import com.jzg.quotation.yongcheng.api.entity.response.AuditResponse;
 import com.jzg.quotation.yongcheng.api.entity.response.ModelsQueryResponse;
 import com.jzg.quotation.yongcheng.api.entity.response.PriceDiscountRatioResponse;
 import com.jzg.quotation.yongcheng.api.entity.response.QuoteResponse;
-import com.jzg.quotation.yongcheng.api.properties.YcApiConfigurationProperties;
+import com.jzg.quotation.yongcheng.api.properties.YcConfigurationProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
 import org.springframework.util.ObjectUtils;
-import org.springframework.web.client.RestTemplate;
 import org.springframework.web.reactive.function.client.WebClient;
 
 @Component
 public class YcRequestApiComponents {
 
 
-    private final YcApiConfigurationProperties apiComponents;
+    @Autowired
+    private YcConfigurationProperties apiComponents;
 
-    public YcRequestApiComponents(YcApiConfigurationProperties apiComponents) {
-        this.apiComponents = apiComponents;
-    }
+//    public YcRequestApiComponents(YcConfigurationProperties apiComponents) {
+//        this.apiComponents = apiComponents;
+//    }
 
     private ObjectMapper gainXmlMapper() {
         ObjectMapper xmlMapper = new XmlMapper();
@@ -57,7 +59,6 @@ public class YcRequestApiComponents {
         WebClient webClient = WebClient.builder()
                 .baseUrl(url)
                 .defaultHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36")
-                .defaultHeader("Content-Type", "text/xml;charset=UTF-8")
                 .build();
 
         String xmlString = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tns=\"http://newWS.front.app.echannel.ebiz.alltrust.com/\">"
@@ -66,7 +67,7 @@ public class YcRequestApiComponents {
                 + "</soapenv:Body>\n</soapenv:Envelope>";
 
         String responseStringMsg = webClient.post()
-                .contentType(MediaType.APPLICATION_XML)
+                .contentType(MediaType.TEXT_XML)
                 .bodyValue(xmlString)
                 .retrieve()
                 .bodyToMono(String.class)

+ 0 - 7
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/properties/YcApiConfigurationProperties.java

@@ -8,14 +8,7 @@ import org.springframework.stereotype.Component;
 
 @Data
 @Component
-@ConfigurationProperties(prefix = "yc.api")
 public class YcApiConfigurationProperties implements ConfigureParameters {
-
-    // 回调地址
-    private String payCallBack;
-    // 请求地址
-    private String url;
-
     //机构代码(dptCde)
     private String dptCde;
     //渠道编码(agentCode)

+ 18 - 0
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/properties/YcConfigurationProperties.java

@@ -0,0 +1,18 @@
+package com.jzg.quotation.yongcheng.api.properties;
+
+import com.jzg.quotation.commons.standard.ConfigureParameters;
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+//@Component
+@ConfigurationProperties(prefix = "yc.api")
+public class YcConfigurationProperties implements ConfigureParameters {
+
+    // 回调地址
+    private String payCallBack;
+    // 请求地址
+    private String url;
+
+}

+ 25 - 20
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java

@@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.jzg.commons.entity.vo.PersonAreaVo;
 import com.jzg.commons.exception.SystemException;
+import com.jzg.quotation.commons.client.OrgClient;
+import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.entity.vo.aggregated.InsuranceUploadImageVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
@@ -16,7 +18,6 @@ import com.jzg.quotation.commons.entity.vo.quote.CustomerInfoVo;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.commons.utils.DuplicateInsuranceUtil;
-import com.jzg.quotation.yongcheng.api.client.SysAreaClient;
 import com.jzg.quotation.yongcheng.api.components.YcRequestApiComponents;
 import com.jzg.quotation.yongcheng.api.constants.Constants;
 import com.jzg.quotation.yongcheng.api.entity.YcBuildData;
@@ -28,7 +29,6 @@ import com.jzg.quotation.yongcheng.api.entity.request.RecognitionRequest;
 import com.jzg.quotation.yongcheng.api.entity.response.ModelsQueryResponse;
 import com.jzg.quotation.yongcheng.api.entity.response.PriceDiscountRatioResponse;
 import com.jzg.quotation.yongcheng.api.entity.response.QuoteResponse;
-import com.jzg.quotation.yongcheng.api.entity.response.RecognitionResponse;
 import com.jzg.quotation.yongcheng.api.entity.vo.TimeEntity;
 import com.jzg.quotation.yongcheng.api.properties.YcApiConfigurationProperties;
 import com.jzg.quotation.yongcheng.api.service.YongChengApiRequest;
@@ -55,12 +55,8 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
     @Autowired
     private RedissonClient redissonClient;
 
-//    @Autowired
-    private SysAreaClient sysAreaClient;
-
-
-//    private SysAreaService sysAreaService;
-
+    @Autowired
+    private OrgClient orgClient;
 
     /**
      * 车型获取
@@ -114,7 +110,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
 //            buildCarInfo(carInfo, vehicleInfoList.get(0), coreModelsVo);
             return vehicleInfoList.get(0);
         }
-        return null;
+        return vehicleInfoList.get(0);
     }
 
     @Override
@@ -167,8 +163,13 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
 
         //重新设置 请求的查询码
         //读取缓存的查询码
-        String cQryCdeJQ = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_JQ + quoteVo.getOrder().getOrdersNo() + quoteVo.getCarInfoVo().getVinNo() + quoteVo.getCarInfoVo().getLicenseNo()).get().toString();
-        String cQryCdeSY = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_SY + quoteVo.getOrder().getOrdersNo() + quoteVo.getCarInfoVo().getVinNo() + quoteVo.getCarInfoVo().getLicenseNo()).get().toString();
+        String cQryCdeJQ = "",cQryCdeSY = "";
+        if(Objects.nonNull(redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_JQ + quoteVo.getOrder().getOrdersNo() + quoteVo.getCarInfoVo().getVinNo() + quoteVo.getCarInfoVo().getLicenseNo()).get())){
+            cQryCdeJQ = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_JQ + quoteVo.getOrder().getOrdersNo() + quoteVo.getCarInfoVo().getVinNo() + quoteVo.getCarInfoVo().getLicenseNo()).get().toString();
+        }
+        if(Objects.nonNull(redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_SY + quoteVo.getOrder().getOrdersNo() + quoteVo.getCarInfoVo().getVinNo() + quoteVo.getCarInfoVo().getLicenseNo()).get())){
+            cQryCdeSY = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_SY + quoteVo.getOrder().getOrdersNo() + quoteVo.getCarInfoVo().getVinNo() + quoteVo.getCarInfoVo().getLicenseNo()).get().toString();
+        }
         //交强
         quoteResponse.getVhl().setCCheckCodeJQ("");
         quoteResponse.getVhl().setCQryCdeJQ(cQryCdeJQ);
@@ -485,10 +486,14 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
 //        gainVehicleModel(ycConfigureParameters, carInfo, coreModelsVo);
         List<AccidentalDrivingVo> adVos = quoteVo.getAccidentalDrivings();
 
+        String cQryCdeJQ = "",cQryCdeSY = "";
         //获取查询码
-        String cQryCdeJQ = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_JQ + quoteVo.getOrder().getOrdersNo() + carInfo.getVinNo() + carInfo.getLicenseNo()).get().toString();
-        String cQryCdeSY = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_SY + quoteVo.getOrder().getOrdersNo() + carInfo.getVinNo() + carInfo.getLicenseNo()).get().toString();
-
+        if(Objects.nonNull(redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_JQ + quoteVo.getOrder().getOrdersNo() + carInfo.getVinNo() + carInfo.getLicenseNo()).get())){
+            cQryCdeJQ = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_JQ + quoteVo.getOrder().getOrdersNo() + carInfo.getVinNo() + carInfo.getLicenseNo()).get().toString();
+        }
+        if(Objects.nonNull(redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_SY + quoteVo.getOrder().getOrdersNo() + carInfo.getVinNo() + carInfo.getLicenseNo()).get())){
+            cQryCdeSY = redissonClient.getBucket(Constants.REDIS_YONGCHENG_QUERY_CODE_SY + quoteVo.getOrder().getOrdersNo() + carInfo.getVinNo() + carInfo.getLicenseNo()).get().toString();
+        }
         //组装参数
         QuoteRequest m = QuoteRequest.buildQuoteParam(quoteVo, configurationProperties, adVos, cQryCdeJQ, cQryCdeSY,negotiatedPrice);
         //企业车不构建地区
@@ -500,7 +505,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
             //车主
             CustomerInfoVo owner = quoteVo.getOwnersInfo();
             if (!"0".equals(owner.getProperty())) {
-                PersonAreaVo ownerPersonAreaVo = sysAreaClient.queryByAddress(owner.getAddr(), owner.getIdentifyNumber()).getData();
+                PersonAreaVo ownerPersonAreaVo = orgClient.queryByAddress(owner.getAddr(), owner.getIdentifyNumber()).getData();
                 if (!Objects.isNull(ownerPersonAreaVo)) {
                     m.getRequestLabel().getCondition().getVhlowner().setCProvince(ownerPersonAreaVo.getProvinceCode());
                     m.getRequestLabel().getCondition().getVhlowner().setCCity(ownerPersonAreaVo.getCityCode());
@@ -511,7 +516,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
             //投保人
             CustomerInfoVo applicant = quoteVo.getPolicyHolderInfo();
             if (!"0".equals(applicant.getProperty())) {
-                PersonAreaVo applicantPersonAreaVo = sysAreaClient.queryByAddress(applicant.getAddr(), applicant.getIdentifyNumber()).getData();
+                PersonAreaVo applicantPersonAreaVo = orgClient.queryByAddress(applicant.getAddr(), applicant.getIdentifyNumber()).getData();
                 if (!Objects.isNull(applicantPersonAreaVo)) {
                     m.getRequestLabel().getCondition().getApplicant().setCProvince(applicantPersonAreaVo.getProvinceCode());
                     m.getRequestLabel().getCondition().getApplicant().setCCity(applicantPersonAreaVo.getCityCode());
@@ -522,7 +527,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
             //被保人
             CustomerInfoVo insured = quoteVo.getInsuredPersonInfo();
             if (!"0".equals(insured.getProperty())) {
-                PersonAreaVo insuredPersonAreaVo = sysAreaClient.queryByAddress(insured.getAddr(), insured.getIdentifyNumber()).getData();
+                PersonAreaVo insuredPersonAreaVo = orgClient.queryByAddress(insured.getAddr(), insured.getIdentifyNumber()).getData();
                 if (!Objects.isNull(insuredPersonAreaVo)) {
                     m.getRequestLabel().getCondition().getInsured().setCProvince(insuredPersonAreaVo.getProvinceCode());
                     m.getRequestLabel().getCondition().getInsured().setCCity(insuredPersonAreaVo.getCityCode());
@@ -549,7 +554,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
         CustomerInfoVo applicant = quoteVo.getPolicyHolderInfo();
 
         //车主地区信息
-        PersonAreaVo ownerPersonAreaVo = sysAreaClient.queryByAddress(owner.getAddr(), owner.getIdentifyNumber()).getData();
+        PersonAreaVo ownerPersonAreaVo = orgClient.queryByAddress(owner.getAddr(), owner.getIdentifyNumber()).getData();
         PersonAreaVo insuredPersonAreaVo;
         PersonAreaVo applicantPersonAreaVo;
 
@@ -558,7 +563,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
             insuredPersonAreaVo = ownerPersonAreaVo;
         } else {
             //投保人地区信息
-            insuredPersonAreaVo = sysAreaClient.queryByAddress(insured.getAddr(), insured.getIdentifyNumber()).getData();
+            insuredPersonAreaVo = orgClient.queryByAddress(insured.getAddr(), insured.getIdentifyNumber()).getData();
         }
 
         //车主是否与被保人相同
@@ -568,7 +573,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
             if (insured.getIdentifyNumber().equals(applicant.getIdentifyNumber())) {
                 applicantPersonAreaVo = insuredPersonAreaVo;
             } else {
-                applicantPersonAreaVo = sysAreaClient.queryByAddress(applicant.getAddr(), applicant.getIdentifyNumber()).getData();
+                applicantPersonAreaVo = orgClient.queryByAddress(applicant.getAddr(), applicant.getIdentifyNumber()).getData();
             }
 
         if (!Objects.isNull(ownerPersonAreaVo)) {

+ 8 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/AreaController.java

@@ -2,10 +2,12 @@ package com.jzg.organization.controller;
 
 import com.jzg.commons.aop.PremissionCheck;
 import com.jzg.commons.core.page.HttpResult;
+import com.jzg.commons.entity.vo.PersonAreaVo;
 import com.jzg.commons.entity.vo.SysAreaVo;
 import com.jzg.organization.service.SysAreaService;
 import io.swagger.v3.oas.annotations.media.Schema;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -29,4 +31,10 @@ public class AreaController {
         List<SysAreaVo> sysAreaVos = sysAreaService.querySysArea();
         return HttpResult.ok(sysAreaVos);
     }
+
+    @Schema(description = "根据地址与身份证查询省市区")
+    @GetMapping(value = "queryByAddress")
+    public HttpResult<PersonAreaVo> queryByAddress(String address, String idCard) {
+        return HttpResult.ok(sysAreaService.queryByAddress(address,idCard));
+    }
 }

+ 4 - 5
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java

@@ -12,6 +12,7 @@ import com.jzg.commons.entity.scheme.po.*;
 import com.jzg.commons.entity.scheme.vo.*;
 import com.jzg.commons.entity.vo.EsmInsCompanyResVo;
 import com.jzg.commons.exception.ValidateException;
+import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.organization.mapper.*;
 import com.jzg.organization.service.PtlAgreementUndwrtRulesAttrService;
@@ -122,15 +123,13 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
     public PtlSchemeQueryVo getScheme(String id) {
         //获取方案信息
         PtlSchemeInfo ptlSchemeInfo = ptlSchemeInfoMapper.selectOne(new LambdaQueryWrapper<PtlSchemeInfo>()
-                .eq(PtlSchemeInfo::getId, id));
-
+                .eq(PtlSchemeInfo::getSchemeId, id));
+        AssertionUtils.isFail(Objects.isNull(ptlSchemeInfo),"方案不存在");
         //获取方案信息
         PtlScheme ptlScheme = ptlSchemeMapper.selectOne(new LambdaQueryWrapper<PtlScheme>()
                 .eq(PtlScheme::getId, ptlSchemeInfo.getSchemeId()));
 
-        if(Objects.isNull(ptlScheme)){
-            throw new ValidateException("方案不存在");
-        }
+        AssertionUtils.isFail(Objects.isNull(ptlScheme),"方案不存在");
 
         //获取商业险
         List<PtlSchemeInsuranceVo> ptlSchemeInsurances = ptlSchemeInsuranceMapper.getSchemeInsurance(ptlSchemeInfo.getId());

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

@@ -192,10 +192,10 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
 
         // 设置子部门
         voDept.forEach(dept -> dept.setChildren(deptMap.getOrDefault(dept.getId(), new ArrayList<>())));
-
-        return Optional.ofNullable(sysDept)
+        List<SysDeptVo> sysDeptVos = Optional.ofNullable(sysDept)
                 .map(d -> deptMap.get(d.getParentId()))
                 .orElseGet(() -> deptMap.getOrDefault("0", new ArrayList<>()));
+        return sysDeptVos;
     }