ソースを参照

Merge remote-tracking branch 'origin/test' into test_mq

hxl13994548489 1 年間 前
コミット
6f984cca2b
83 ファイル変更2803 行追加511 行削除
  1. 10 0
      sql/Online.sql
  2. 2 0
      src/main/java/com/ydtech/components/TokenInterceptor.java
  3. 0 29
      src/main/java/com/ydtech/config/MvcConfig.java
  4. 61 1
      src/main/java/com/ydtech/config/WechatWorkConfig.java
  5. 26 0
      src/main/java/com/ydtech/config/properties/WechatCustomerProperties.java
  6. 0 17
      src/main/java/com/ydtech/config/scheduledConfig/ScheduledConfig.java
  7. 107 0
      src/main/java/com/ydtech/modules/admin/components/WechatCustomerComponents.java
  8. 37 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerAddContactWayRequest.java
  9. 19 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerBaseRequest.java
  10. 26 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerGetTokenRequest.java
  11. 34 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerListRequest.java
  12. 68 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerSendMsgOnEventRequest.java
  13. 31 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerSyncMsgRequest.java
  14. 30 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerAddContactWayResponse.java
  15. 36 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerBaseResponse.java
  16. 42 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerGetTokenResponse.java
  17. 55 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerListResponse.java
  18. 42 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerSendMsgOnEventResponse.java
  19. 78 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerSyncMsgResponse.java
  20. 29 0
      src/main/java/com/ydtech/modules/admin/constants/WechatCustomerEnum.java
  21. 2 5
      src/main/java/com/ydtech/modules/admin/controller/SysPartnerController.java
  22. 20 2
      src/main/java/com/ydtech/modules/admin/controller/SysQyWeChatController.java
  23. 2 0
      src/main/java/com/ydtech/modules/admin/controller/SysUserAgentController.java
  24. 2 8
      src/main/java/com/ydtech/modules/admin/controller/SysUserController.java
  25. 21 5
      src/main/java/com/ydtech/modules/admin/controller/WechatController.java
  26. 35 0
      src/main/java/com/ydtech/modules/admin/controller/taskStatistics/TaskStatisticsController.java
  27. 50 0
      src/main/java/com/ydtech/modules/admin/controller/wechat/WechatCustomerController.java
  28. 13 1
      src/main/java/com/ydtech/modules/admin/dao/SysUserMapper.java
  29. 16 0
      src/main/java/com/ydtech/modules/admin/dao/TaskStatisticsMapper.java
  30. 2 0
      src/main/java/com/ydtech/modules/admin/model/dto/SysUserDto.java
  31. 7 6
      src/main/java/com/ydtech/modules/admin/model/po/SysQyWeChat.java
  32. 59 0
      src/main/java/com/ydtech/modules/admin/model/vo/BusinessOrderData.java
  33. 14 2
      src/main/java/com/ydtech/modules/admin/model/vo/SysUserBaseVO.java
  34. 11 0
      src/main/java/com/ydtech/modules/admin/model/vo/TaskStatisticsVo.java
  35. 39 0
      src/main/java/com/ydtech/modules/admin/model/vo/wechat/WechatCustomerCallbackVo.java
  36. 24 0
      src/main/java/com/ydtech/modules/admin/model/vo/wechat/WechatEncryptVo.java
  37. 2 2
      src/main/java/com/ydtech/modules/admin/service/SysPartnerService.java
  38. 1 4
      src/main/java/com/ydtech/modules/admin/service/SysUserService.java
  39. 17 0
      src/main/java/com/ydtech/modules/admin/service/TaskStatisticsService.java
  40. 43 0
      src/main/java/com/ydtech/modules/admin/service/WechatCustomerService.java
  41. 7 9
      src/main/java/com/ydtech/modules/admin/service/impl/SysPartnerServiceImpl.java
  42. 146 19
      src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java
  43. 107 0
      src/main/java/com/ydtech/modules/admin/service/impl/TaskStatisticsServiceImpl.java
  44. 89 0
      src/main/java/com/ydtech/modules/admin/service/impl/WechatCustomerServiceImpl.java
  45. 3 6
      src/main/java/com/ydtech/modules/fnc/service/impl/InsPlyIncomeServiceImpl.java
  46. 22 1
      src/main/java/com/ydtech/modules/ins/model/vo/CustomerInfoVo.java
  47. 3 0
      src/main/java/com/ydtech/modules/ins/model/vo/QuoteRespVo.java
  48. 3 0
      src/main/java/com/ydtech/modules/ins/model/yc/imageUp/ImageUp.java
  49. 4 0
      src/main/java/com/ydtech/modules/order/components/InsCrawlerOrderComponents.java
  50. 3 3
      src/main/java/com/ydtech/modules/order/components/chengtai/ChengTaiRequestApiComponents.java
  51. 5 1
      src/main/java/com/ydtech/modules/order/constants/OrderCacheConstant.java
  52. 18 2
      src/main/java/com/ydtech/modules/order/controller/QuoteController.java
  53. 18 0
      src/main/java/com/ydtech/modules/order/dao/InsAreaCompanyRelatedInfoMapper.java
  54. 7 0
      src/main/java/com/ydtech/modules/order/entity/InsAreaCompany.java
  55. 149 0
      src/main/java/com/ydtech/modules/order/entity/InsAreaCompanyRelatedInfo.java
  56. 3 0
      src/main/java/com/ydtech/modules/order/entity/InsDrivingIntentionInsurance.java
  57. 189 27
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java
  58. 4 0
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/DownLoadDocumentUrlResponse.java
  59. 136 138
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/InsurePremiumResponse.java
  60. 5 0
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/constants/ImageTypeEnum.java
  61. 20 7
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangAccuracyCalculateRequest.java
  62. 13 8
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangUpLoadRequest.java
  63. 7 0
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/response/YangGuangAccuracyCalculateResponse.java
  64. 13 0
      src/main/java/com/ydtech/modules/order/service/InsAreaCompanyRelatedInfoService.java
  65. 273 37
      src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java
  66. 22 0
      src/main/java/com/ydtech/modules/order/service/impl/InsAreaCompanyRelatedInfoServiceImpl.java
  67. 11 4
      src/main/java/com/ydtech/modules/order/service/impl/InsAreaCompanyServiceImpl.java
  68. 0 3
      src/main/java/com/ydtech/modules/order/service/impl/InsOrderPdfUrlServiceImpl.java
  69. 3 1
      src/main/java/com/ydtech/modules/order/service/impl/InsOrdersServiceImpl.java
  70. 90 11
      src/main/java/com/ydtech/modules/order/service/impl/YangGuangOrderApiServiceImpl.java
  71. 2 0
      src/main/java/com/ydtech/utils/baidu/BusinessLicenseRecognition.java
  72. 25 0
      src/main/java/com/ydtech/utils/cache/BaseCacheConfig.java
  73. 10 0
      src/main/java/com/ydtech/utils/cache/CacheFactory.java
  74. 31 0
      src/main/java/com/ydtech/utils/cache/RedissonUtils.java
  75. 0 48
      src/main/java/com/ydtech/utils/scheduledFutureUtil/ScheduledFutureHolder.java
  76. 0 40
      src/main/java/com/ydtech/utils/scheduledFutureUtil/ScheduledFutureUtil.java
  77. 7 0
      src/main/resources/application-pre.yml
  78. 16 2
      src/main/resources/application-prod.yml
  79. 8 2
      src/main/resources/application-test.yml
  80. 91 43
      src/main/resources/mapper/modules/admin/SysUserMapper.xml
  81. 107 15
      src/main/resources/mapper/modules/admin/TaskStatisticsMapper.xml
  82. 2 2
      src/main/resources/mapper/modules/order/InsAreaCompanyMapper.xml
  83. 18 0
      src/main/resources/mapper/modules/order/InsAreaCompanyRelatedInfoMapper.xml

+ 10 - 0
sql/Online.sql

@@ -0,0 +1,10 @@
+--  2024-12-02 BY wks
+alter table sys_qy_wechat
+    drop column support_staff_url;
+
+alter table sys_qy_wechat
+    add open_kf_id varchar(256) null comment '客服账号ID';
+
+alter table sys_qy_wechat
+    add open_kf_name varchar(256) null comment '客服账号名称';
+--  2024-12-02 BY wks

+ 2 - 0
src/main/java/com/ydtech/components/TokenInterceptor.java

@@ -83,6 +83,8 @@ public class TokenInterceptor {
         //企业微信绑定
         notMatchList.add("/wxWork/verifyBind");
         notMatchList.add("/wxWork/bind");
+        // 微信客服
+        notMatchList.add("/wechat/customer/callback");
 
         // 平安相关屏蔽地址
         notMatchList.add("/order/pingAnApi/getApplyVerifyCodeAndRecoverApplyVerifyCode");

+ 0 - 29
src/main/java/com/ydtech/config/MvcConfig.java

@@ -8,10 +8,6 @@ import com.ydtech.aop.DynamicTableNameHandler;
 import com.ydtech.aop.RequestStringParamHandlerMethodArgumentResolver;
 import com.ydtech.components.CorsInterceptor;
 import com.ydtech.components.TokenInterceptor;
-import com.ydtech.config.properties.WechatOpenProperties;
-import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -25,14 +21,10 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 import javax.annotation.Resource;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
 @Configuration
 public class MvcConfig implements WebMvcConfigurer {
 
-    @Resource
-    private WechatOpenProperties wechatOpenProperties;
 
     @Value("${apk.path}")
     private String apkPath;
@@ -97,26 +89,6 @@ public class MvcConfig implements WebMvcConfigurer {
         registry.addResourceHandler(uploadFileUrl + "**").addResourceLocations("file:" + uploadFilePath);
     }
 
-    @Bean
-    public Map<String, WxMpService> wxMpService() {
-        Map<String, WxMpDefaultConfigImpl> collect = wechatOpenProperties.getProperties().keySet()
-                .stream()
-                .collect(Collectors.toMap(x->x, x -> {
-                    WechatOpenProperties.PropertiesDto propertiesDto = wechatOpenProperties.getProperties().get(x);
-                    WxMpDefaultConfigImpl wxMpDefaultConfig = new WxMpDefaultConfigImpl();
-                    wxMpDefaultConfig.setAppId(propertiesDto.getComponentAppId());
-                    wxMpDefaultConfig.setSecret(propertiesDto.getComponentSecret());
-                    return wxMpDefaultConfig;
-                }));
-
-        return collect.keySet().stream().collect(Collectors.toMap(x -> x, x -> {
-            WxMpServiceImpl wxMpService = new WxMpServiceImpl();
-            WxMpDefaultConfigImpl wxMpDefaultConfig = collect.get(x);
-            wxMpService.setWxMpConfigStorage(wxMpDefaultConfig);
-            return wxMpService;
-        }));
-    }
-
     @Bean
     public PaginationInnerInterceptor paginationInnerInterceptor() {
         PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();
@@ -164,5 +136,4 @@ public class MvcConfig implements WebMvcConfigurer {
 
     }
 
-
 }

+ 61 - 1
src/main/java/com/ydtech/config/WechatWorkConfig.java

@@ -1,12 +1,30 @@
 package com.ydtech.config;
 
+import com.ydtech.config.properties.WechatCustomerProperties;
+import com.ydtech.config.properties.WechatOpenProperties;
+import me.chanjar.weixin.cp.api.WxCpKfService;
 import me.chanjar.weixin.cp.api.WxCpService;
+import me.chanjar.weixin.cp.api.impl.WxCpKfServiceImpl;
 import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
 import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
+import javax.annotation.Resource;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * @version
+ * @description: 微信相关配置
+ * @author: wenks
+ * @date: 2024/11/27 15:01
+ **/
 @Configuration
 public class WechatWorkConfig {
 
@@ -17,13 +35,55 @@ public class WechatWorkConfig {
     @Value("${wechat.cp.agent-id}")
     private Integer agentId;
 
+    @Resource
+    private WechatOpenProperties wechatOpenProperties;
+
+    @Resource
+    private WechatCustomerProperties wechatCustomerProperties;
+
     @Bean
     public WxCpService wxCpService() {
         WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl();
         config.setCorpId(corpId);
         config.setCorpSecret(secret);
         config.setAgentId(agentId);
-
+        WxCpServiceImpl wxCpService = new WxCpServiceImpl();
+        wxCpService.setWxCpConfigStorage(config);
         return new WxCpServiceImpl();
     }
+
+    @Bean
+    public Map<String, WxMpService> wxMpService() {
+        Map<String, WxMpDefaultConfigImpl> collect = wechatOpenProperties.getProperties().keySet()
+                .stream()
+                .collect(Collectors.toMap(x->x, x -> {
+                    WechatOpenProperties.PropertiesDto propertiesDto = wechatOpenProperties.getProperties().get(x);
+                    WxMpDefaultConfigImpl wxMpDefaultConfig = new WxMpDefaultConfigImpl();
+                    wxMpDefaultConfig.setAppId(propertiesDto.getComponentAppId());
+                    wxMpDefaultConfig.setSecret(propertiesDto.getComponentSecret());
+                    return wxMpDefaultConfig;
+                }));
+
+        return collect.keySet().stream().collect(Collectors.toMap(x -> x, x -> {
+            WxMpServiceImpl wxMpService = new WxMpServiceImpl();
+            WxMpDefaultConfigImpl wxMpDefaultConfig = collect.get(x);
+            wxMpService.setWxMpConfigStorage(wxMpDefaultConfig);
+            return wxMpService;
+        }));
+    }
+
+
+    @Bean
+    public WxCpKfService wxCpKfService(){
+        WxCpDefaultConfigImpl config = new WxCpDefaultConfigImpl();
+        config.setCorpId(corpId);
+        config.setCorpSecret(wechatCustomerProperties.getSecret());
+        config.setToken(wechatCustomerProperties.getToken());
+        config.setAesKey(wechatCustomerProperties.getEncodingAesKey());
+        WxCpServiceImpl wxCpService = new WxCpServiceImpl();
+        wxCpService.setWxCpConfigStorage(config);
+        return new WxCpKfServiceImpl(wxCpService());
+    }
+
+
 }

+ 26 - 0
src/main/java/com/ydtech/config/properties/WechatCustomerProperties.java

@@ -0,0 +1,26 @@
+package com.ydtech.config.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @version
+ * @description: 企业微信客服接口
+ * @author: wenks
+ * @date: 2024/11/26 10:22
+ **/
+@Data
+@Component
+@ConfigurationProperties(prefix = "wechat.customer")
+public class WechatCustomerProperties {
+
+    private String corpId;
+
+    private String secret;
+
+    private String token;
+
+    private String encodingAesKey;
+
+}

+ 0 - 17
src/main/java/com/ydtech/config/scheduledConfig/ScheduledConfig.java

@@ -1,17 +0,0 @@
-package com.ydtech.config.scheduledConfig;
-
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
-
-@Configuration
-public class ScheduledConfig {
-    @Bean
-    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
-        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
-        threadPoolTaskScheduler.setPoolSize(5);
-        threadPoolTaskScheduler.setRemoveOnCancelPolicy(true);
-        return threadPoolTaskScheduler;
-    }
-}
-

+ 107 - 0
src/main/java/com/ydtech/modules/admin/components/WechatCustomerComponents.java

@@ -0,0 +1,107 @@
+package com.ydtech.modules.admin.components;
+
+
+import com.ydtech.config.properties.WechatCustomerProperties;
+import com.ydtech.modules.admin.components.wechat.customer.request.*;
+import com.ydtech.modules.admin.components.wechat.customer.response.*;
+import com.ydtech.modules.admin.constants.WechatCustomerEnum;
+import com.ydtech.modules.order.components.InsCrawlerOrderComponents;
+import com.ydtech.modules.order.constants.OrderCacheConstant;
+import com.ydtech.modules.protocol.utils.AssertionUtils;
+import com.ydtech.utils.cache.BaseCacheConfig;
+import com.ydtech.utils.cache.RedissonUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.util.crypto.WxCryptUtil;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @description: 【微信客服】 发送请求实体
+ * @author: wenks
+ * @date: 2024/11/28 15:35
+ **/
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class WechatCustomerComponents {
+
+    private final RestTemplate restTemplate;
+
+    private final WechatCustomerProperties wechatCustomerProperties;
+
+    private final RedissonUtils redissonUtils;
+
+    private final InsCrawlerOrderComponents insCrawlerOrderComponents;
+
+    private <T, B extends CustomerBaseResponse> B request(WechatCustomerEnum wechatCustomer, T requestBody, Class<B> responseType, HttpHeaders httpHeaders) {
+        String token = getToken();
+        String url = WechatCustomerEnum.URL + wechatCustomer.getUri() + "?access_token=" + token;
+        return insCrawlerOrderComponents.request(url, "wechatCustomer", wechatCustomer.getDesc(), requestBody, responseType, httpHeaders);
+    }
+
+    public WxCryptUtil getWxCryptUtil() {
+        return new WxCryptUtil(wechatCustomerProperties.getToken(), wechatCustomerProperties.getEncodingAesKey(), wechatCustomerProperties.getCorpId());
+    }
+
+    /**
+     * 获取调用凭证access_token
+     *
+     * @return access_token
+     */
+    private String getToken() {
+        return redissonUtils.getFromRedis(() -> {
+            CustomerGetTokenRequest customerGetTokenRequest = new CustomerGetTokenRequest(wechatCustomerProperties.getCorpId(), wechatCustomerProperties.getSecret());
+            String url = WechatCustomerEnum.URL + WechatCustomerEnum.GET_ACCESS_TOKEN.getUri() + customerGetTokenRequest.getUrlParams();
+            CustomerGetTokenResponse customerGetTokenResponse = restTemplate.getForObject(url, CustomerGetTokenResponse.class);
+            AssertionUtils.isEmpty(customerGetTokenResponse, "获取调用凭证access_token异常");
+            String accessToken = customerGetTokenResponse.getAccessToken();
+            return new BaseCacheConfig<String>().setExpiresIn(customerGetTokenResponse.getExpiresIn()).setTimeUnit(TimeUnit.SECONDS).setData(accessToken);
+        }, OrderCacheConstant.WECHAT_CUSTOMER_TOKEN);
+    }
+
+
+    /**
+     * 获取客服账号列表
+     *
+     * @param customerListRequest 请求实体
+     * @return 客服账号列表
+     */
+    public CustomerListResponse list(CustomerListRequest customerListRequest) {
+        return request(WechatCustomerEnum.LIST, customerListRequest, CustomerListResponse.class, new HttpHeaders());
+    }
+
+    /**
+     * 获取客服账号链接
+     *
+     * @param customerAddContactWayRequest 请求实体
+     * @return 客服账号链接
+     */
+    public CustomerAddContactWayResponse addContactWay(CustomerAddContactWayRequest customerAddContactWayRequest) {
+        return request(WechatCustomerEnum.ADD_CONTACT_WAY, customerAddContactWayRequest, CustomerAddContactWayResponse.class, new HttpHeaders());
+    }
+
+    /**
+     * 获取消息
+     *
+     * @param customerSendMsgOnEventRequest 请求实体
+     * @return 消息信息
+     */
+    public CustomerSendMsgOnEventResponse sendMsgOnEvent(CustomerSendMsgOnEventRequest customerSendMsgOnEventRequest) {
+        return request(WechatCustomerEnum.SEND_MSG_ON_EVENT, customerSendMsgOnEventRequest, CustomerSendMsgOnEventResponse.class, new HttpHeaders());
+    }
+
+    /**
+     * 发送客服欢迎语
+     *
+     * @param customerSyncMsgRequest 请求实体
+     * @return 成功失败
+     */
+    public CustomerSyncMsgResponse syncMsg(CustomerSyncMsgRequest customerSyncMsgRequest) {
+        return request(WechatCustomerEnum.SYNC_MSG, customerSyncMsgRequest, CustomerSyncMsgResponse.class, new HttpHeaders());
+    }
+
+}

+ 37 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerAddContactWayRequest.java

@@ -0,0 +1,37 @@
+package com.ydtech.modules.admin.components.wechat.customer.request;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @description: 【微信客服】 获取客服账号链接
+ * @author: wenks
+ * @date: 2024/11/28 15:14
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CustomerAddContactWayRequest extends CustomerBaseRequest {
+
+    /**
+     * 客服账号ID
+     */
+    @JsonProperty("open_kfid")
+    private String openKfid;
+
+    /**
+     * 场景值,字符串类型,由开发者自定义。
+     * 不多于32字节
+     * 字符串取值范围(正则表达式):[0-9a-zA-Z_-]*
+     */
+    @JsonProperty("scene")
+    private String scene;
+
+
+}

+ 19 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerBaseRequest.java

@@ -0,0 +1,19 @@
+package com.ydtech.modules.admin.components.wechat.customer.request;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @description: 【微信客服】 请求基类
+ * @author: wenks
+ * @date: 2024/11/28 14:51
+ **/
+@Data
+@NoArgsConstructor
+public class CustomerBaseRequest {
+
+
+}

+ 26 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerGetTokenRequest.java

@@ -0,0 +1,26 @@
+package com.ydtech.modules.admin.components.wechat.customer.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @description: 【微信客服】 获取调用凭证access_token
+ * @author: wenks
+ * @date: 2024/11/27 18:03
+ **/
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class CustomerGetTokenRequest {
+
+    private String corpId;
+
+    private String corpSecret;
+
+    public String getUrlParams() {
+        return "?corpid=" + corpId + "&corpsecret=" + corpSecret;
+    }
+
+
+}

+ 34 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerListRequest.java

@@ -0,0 +1,34 @@
+package com.ydtech.modules.admin.components.wechat.customer.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.core.page.BasePageVO;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @description: 【微信客服】 获取客服账号列表
+ * @author: wenks
+ * @date: 2024/11/28 15:15
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CustomerListRequest extends CustomerBaseRequest {
+
+    /**
+     * 分页,偏移量, 默认为0
+     */
+    @JsonProperty("offset")
+    private Integer offset;
+
+    /**
+     * 分页,预期请求的数据量,默认为100,取值范围 1 ~ 100
+     */
+    @JsonProperty("limit")
+    private Integer limit;
+
+}

+ 68 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerSendMsgOnEventRequest.java

@@ -0,0 +1,68 @@
+package com.ydtech.modules.admin.components.wechat.customer.request;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ydtech.modules.admin.components.wechat.customer.response.CustomerSyncMsgResponse;
+import com.ydtech.modules.admin.model.SysUser;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @description: 【微信客服】 发送客服欢迎语
+ * @author: wenks
+ * @date: 2024/11/28 15:34
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CustomerSendMsgOnEventRequest extends CustomerBaseRequest {
+
+    /**
+     * 事件响应消息对应的code。通过事件回调下发,仅可使用一次。
+     */
+    @JsonProperty("code")
+    private String code;
+
+    /**
+     * 消息ID。如果请求参数指定了msgid,则原样返回,否则系统自动生成并返回。
+     * 不多于32字节
+     * 字符串取值范围(正则表达式):[0-9a-zA-Z_-]*
+     */
+    @JsonProperty("msgid")
+    private String msgid;
+
+    /**
+     * 消息类型。对不同的msgtype,有相应的结构描述,详见消息类型
+     */
+    @JsonProperty("msgtype")
+    private String msgtype;
+
+    @JsonProperty("text")
+    private TextDTO text;
+
+    @NoArgsConstructor
+    @Data
+    @AllArgsConstructor
+    public static class TextDTO {
+
+        @JsonProperty("content")
+        private String content;
+
+    }
+
+
+    public static CustomerSendMsgOnEventRequest sendMsgOnEvent(SysUser sysUser, String msgid, String code) {
+        String messages = "你好!" + sysUser.getName() + "(" + sysUser.getId() + ")" + "很高兴为你服务";
+        // 发送欢迎信息
+        CustomerSendMsgOnEventRequest customerSendMsgOnEventRequest = new CustomerSendMsgOnEventRequest();
+        customerSendMsgOnEventRequest.setMsgtype("text");
+        customerSendMsgOnEventRequest.setCode(code);
+        customerSendMsgOnEventRequest.setText(new TextDTO(messages));
+        return customerSendMsgOnEventRequest;
+    }
+
+}

+ 31 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerSyncMsgRequest.java

@@ -0,0 +1,31 @@
+package com.ydtech.modules.admin.components.wechat.customer.request;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@EqualsAndHashCode(callSuper = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class CustomerSyncMsgRequest extends CustomerBaseRequest {
+
+    @JsonProperty("cursor")
+    private String cursor;
+
+    @JsonProperty("token")
+    private String token;
+
+    @JsonProperty("limit")
+    private Integer limit;
+
+    @JsonProperty("voice_format")
+    private Integer voiceFormat;
+
+    @JsonProperty("open_kfid")
+    private String openKfid;
+
+}

+ 30 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerAddContactWayResponse.java

@@ -0,0 +1,30 @@
+package com.ydtech.modules.admin.components.wechat.customer.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @description: 【微信客服】 获取客服账号链接
+ * @author: wenks
+ * @date: 2024/11/28 15:14
+ **/
+@EqualsAndHashCode(callSuper = true)
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CustomerAddContactWayResponse extends CustomerBaseResponse {
+
+    private static final long serialVersionUID = 3481360032833130444L;
+
+    /**
+     * 客服链接,开发者可将该链接嵌入到H5页面中,用户点击链接即可向对应
+     * 的微信客服账号发起咨询。开发者也可根据该url自行生成需要的二维码图片
+     */
+    @JsonProperty("url")
+    private String url;
+
+}

+ 36 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerBaseResponse.java

@@ -0,0 +1,36 @@
+package com.ydtech.modules.admin.components.wechat.customer.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+
+/**
+ * @description: 【微信客服】 请求基类
+ * @author: wenks
+ * @date: 2024/11/28 14:54
+ **/
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CustomerBaseResponse implements Serializable {
+
+    private static final long serialVersionUID = -3778665006292913282L;
+
+    /**
+     * 返回码
+     */
+    @JsonProperty("errcode")
+    private Integer errcode;
+
+    /**
+     * 错误码描述
+     */
+    @JsonProperty("errmsg")
+    private String errmsg;
+
+}

+ 42 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerGetTokenResponse.java

@@ -0,0 +1,42 @@
+package com.ydtech.modules.admin.components.wechat.customer.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+/**
+ * @description: 【微信客服】  获取调用凭证access_token
+ * @author: wenks
+ * @date: 2024/11/27 18:01
+ **/
+@NoArgsConstructor
+@Data
+public class CustomerGetTokenResponse {
+
+    /**
+     * 出错返回码,为0表示成功,非0表示调用失败
+     */
+    @JsonProperty("errcode")
+    private Integer errcode;
+
+    /**
+     * 返回码提示语
+     */
+    @JsonProperty("errmsg")
+    private String errmsg;
+
+    /**
+     * 获取到的凭证,最长为512字节
+     */
+    @JsonProperty("access_token")
+    private String accessToken;
+
+    /**
+     * 凭证的有效时间(秒)
+     */
+    @JsonProperty("expires_in")
+    private Integer expiresIn;
+
+}

+ 55 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerListResponse.java

@@ -0,0 +1,55 @@
+package com.ydtech.modules.admin.components.wechat.customer.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * @description: 【微信客服】 获取客服账号列表
+ * @author: wenks
+ * @date: 2024/11/28 15:36
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class CustomerListResponse extends CustomerBaseResponse {
+
+    private static final long serialVersionUID = -4750295003681323623L;
+
+    @JsonProperty("account_list")
+    private List<AccountListDTO> accountList;
+
+    @NoArgsConstructor
+    @Data
+    public static class AccountListDTO implements Serializable {
+
+        private static final long serialVersionUID = 1186740344093413070L;
+
+        /**
+         * 客服账号ID
+         */
+        @JsonProperty("open_kfid")
+        private String openKfid;
+
+        /**
+         * 客服账号名称
+         */
+        @JsonProperty("name")
+        private String name;
+
+        /**
+         * 客服头像URL
+         */
+        @JsonProperty("avatar")
+        private String avatar;
+
+    }
+}

+ 42 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerSendMsgOnEventResponse.java

@@ -0,0 +1,42 @@
+package com.ydtech.modules.admin.components.wechat.customer.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+/**
+ * @version
+ * @description: 【微信客服】 发送客服欢迎语
+ * @author: wenks
+ * @date: 2024/11/28 16:00
+ **/
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+public class CustomerSendMsgOnEventResponse extends CustomerBaseResponse {
+
+    private static final long serialVersionUID = -3439241873552051173L;
+
+    @JsonProperty("code")
+    private String code;
+
+    @JsonProperty("msgid")
+    private String msgid;
+
+    @JsonProperty("msgtype")
+    private String msgtype;
+
+    @JsonProperty("text")
+    private TextDTO text;
+
+    @NoArgsConstructor
+    @Data
+    public static class TextDTO {
+        @JsonProperty("content")
+        private String content;
+    }
+
+}

+ 78 - 0
src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerSyncMsgResponse.java

@@ -0,0 +1,78 @@
+package com.ydtech.modules.admin.components.wechat.customer.response;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @version
+ * @description: TODO
+ * @author: wenks
+ * @date: 2024/11/28 16:00
+ **/
+@EqualsAndHashCode(callSuper = true)
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class CustomerSyncMsgResponse extends CustomerBaseResponse{
+
+    private static final long serialVersionUID = 7675662937493615248L;
+
+
+    @JsonProperty("next_cursor")
+    private String nextCursor;
+
+    @JsonProperty("msg_list")
+    private List<MsgListDTO> msgList;
+
+    @JsonProperty("has_more")
+    private Integer hasMore;
+
+    @NoArgsConstructor
+    @Data
+    public static class MsgListDTO {
+        @JsonProperty("msgid")
+        private String msgid;
+
+        @JsonProperty("send_time")
+        private Integer sendTime;
+
+        @JsonProperty("origin")
+        private Integer origin;
+
+        @JsonProperty("msgtype")
+        private String msgtype;
+
+        @JsonProperty("event")
+        private EventDTO event;
+
+        @NoArgsConstructor
+        @Data
+        public static class EventDTO {
+
+            @JsonProperty("event_type")
+            private String eventType;
+
+            @JsonProperty("scene")
+            private String scene;
+
+            @JsonProperty("open_kfid")
+            private String openKfid;
+
+            @JsonProperty("external_userid")
+            private String externalUserid;
+
+            @JsonProperty("scene_param")
+            private String sceneParam;
+
+            @JsonProperty("welcome_code")
+            private String welcomeCode;
+
+        }
+    }
+}

+ 29 - 0
src/main/java/com/ydtech/modules/admin/constants/WechatCustomerEnum.java

@@ -0,0 +1,29 @@
+package com.ydtech.modules.admin.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @description: 微信客服api
+ * @author: wenks
+ * @date: 2024/11/27 17:41
+ **/
+@Getter
+@AllArgsConstructor
+public enum WechatCustomerEnum {
+
+
+    GET_ACCESS_TOKEN("获取调用凭证access_token", "/cgi-bin/gettoken"),
+    LIST("获取客服账号列表", "/cgi-bin/kf/account/list"),
+    ADD_CONTACT_WAY("获取客服账号链接", "/cgi-bin/kf/add_contact_way"),
+    SYNC_MSG("获取消息", "/cgi-bin/kf/sync_msg"),
+    SEND_MSG_ON_EVENT("发送客服欢迎语", "/cgi-bin/kf/send_msg_on_event"),
+    ;
+
+    private final String desc;
+
+    private final String uri;
+
+    public final static String URL = "https://qyapi.weixin.qq.com";
+
+}

+ 2 - 5
src/main/java/com/ydtech/modules/admin/controller/SysPartnerController.java

@@ -1,18 +1,15 @@
 package com.ydtech.modules.admin.controller;
 
-import com.ydtech.aop.exception.DescribeException;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.exception.SystemException;
 import com.ydtech.modules.admin.dao.SysProportionConfigMapper;
-import com.ydtech.modules.admin.model.SysAgencyLeader;
-import com.ydtech.modules.admin.model.SysPartner;
 import com.ydtech.modules.admin.model.SysProportionConfig;
+import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.dto.SysAgencyLeaderPageDto;
 import com.ydtech.modules.admin.model.dto.SysPartnerAPPPageDto;
 import com.ydtech.modules.admin.model.dto.SysPartnerDto;
 import com.ydtech.modules.admin.model.dto.SysPartnerPageDto;
 import com.ydtech.modules.admin.model.vo.AgencyExtractFeeVo;
-import com.ydtech.modules.admin.model.vo.SysAgencyLeaderVo;
 import com.ydtech.modules.admin.model.vo.SysPartnerAPPPageVo;
 import com.ydtech.modules.admin.model.vo.SysUserPartner;
 import com.ydtech.modules.admin.service.SysPartnerService;
@@ -77,7 +74,7 @@ public class SysPartnerController extends BaseController {
      */
     @GetMapping("/queryRecommendAndPartner/{id}/{level}")
     @ApiOperation(value = "根据部门id查询配置的推荐人接口")
-    public HttpResult<List<SysPartner>> queryRecommendAndPartner(@PathVariable(value = "id") @ApiParam("部门id") String id,@PathVariable(value = "level") @ApiParam("合伙人等级") Integer level) {
+    public HttpResult<List<SysUser>> queryRecommendAndPartner(@PathVariable(value = "id") @ApiParam("部门id") String id, @PathVariable(value = "level") @ApiParam("合伙人等级") Integer level) {
         return HttpResult.ok("success", this.sysPartnerService.queryRecommendAndPartner(id,level));
     }
 

+ 20 - 2
src/main/java/com/ydtech/modules/admin/controller/SysQyWeChatController.java

@@ -3,18 +3,17 @@ package com.ydtech.modules.admin.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ydtech.core.page.HttpResult;
-import com.ydtech.exception.SystemException;
 import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.po.SysQyWeChat;
 import com.ydtech.modules.admin.service.SysQyWeChatService;
 import com.ydtech.modules.admin.service.SysSwitchConfigService;
 import com.ydtech.modules.admin.service.SysUserService;
+import com.ydtech.modules.admin.service.WechatCustomerService;
 import com.ydtech.modules.base.controller.BaseController;
 import com.ydtech.modules.protocol.utils.AssertionUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
@@ -33,6 +32,8 @@ public class SysQyWeChatController {
 
     private final SysSwitchConfigService sysSwitchConfigService;
 
+    private final WechatCustomerService wechatCustomerService;
+
     @ApiOperation(value = "配置宣传图/客服")
     @PostMapping(value = "/save/picture")
     public HttpResult<SysQyWeChat> save(@RequestBody SysQyWeChat sysQyWeChat) {
@@ -62,6 +63,8 @@ public class SysQyWeChatController {
             List<SysQyWeChat> list = sysQyWeChatService.list();
             sysQyWeChat = list.get(new Random().nextInt(list.size()));
         }
+        sysQyWeChat.setOpenKfId(null);
+        sysQyWeChat.setOpenKfName(null);
         sysQyWeChat.setDisplay(b);
         return HttpResult.ok(sysQyWeChat);
     }
@@ -73,4 +76,19 @@ public class SysQyWeChatController {
         return HttpResult.ok(sysQyWeChat);
     }
 
+    @ApiOperation(value = "查询微信客服链接")
+    @PostMapping(value = "/find/wechatCustomer")
+    public HttpResult<String> findWechatPictureByUserId() {
+        String userId = BaseController.getUser().getId();
+        SysUser user = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getId, userId));
+        SysQyWeChat sysQyWeChat = sysQyWeChatService.getOne(new LambdaQueryWrapper<SysQyWeChat>().eq(SysQyWeChat::getUserId, user.getLeaderId()));
+        if (sysQyWeChat == null) {
+            List<SysQyWeChat> list = sysQyWeChatService.list();
+            sysQyWeChat = list.get(new Random().nextInt(list.size()));
+        }
+        String s = wechatCustomerService.addContactWay(sysQyWeChat.getOpenKfId());
+        String url = s + "&scene_param=" + userId;
+        return HttpResult.ok(url);
+    }
+
 }

+ 2 - 0
src/main/java/com/ydtech/modules/admin/controller/SysUserAgentController.java

@@ -90,6 +90,8 @@ public class SysUserAgentController extends BaseController {
         SysUser mobileUser = sysUserService.findByPhone(dto.getMobile());
         AssertionUtils.isFail(!sysUser.getMobile().equals(dto.getMobile()) && Objects.isNull(mobileUser), "用户手机号未注册!");
         AssertionUtils.isFail(!"2".equals(sysUser.getManagementSource()), "只有个代来源需要认证!");
+        List<SysUser> list = sysUserService.lambdaQuery().eq(SysUser::getIdentity, dto.getIdentity()).list();
+        AssertionUtils.isFail(!list.isEmpty(), "身份证已经被认证。如有疑问请联系管理人员。");
         return HttpResult.ok(sysUserService.agentAuth(sysUser,dto));
     }
 

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

@@ -3,7 +3,6 @@ package com.ydtech.modules.admin.controller;
 
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.extra.spring.SpringUtil;
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -19,9 +18,6 @@ import com.ydtech.modules.admin.components.request.UnionPayRequest;
 import com.ydtech.modules.admin.components.response.UnionPayResponse;
 import com.ydtech.modules.admin.constants.RoleConstants;
 import com.ydtech.modules.admin.constants.UserWorkStatus;
-import com.ydtech.modules.admin.dao.SysAgencyLeaderMapper;
-import com.ydtech.modules.admin.dao.SysPartnerMapper;
-import com.ydtech.modules.admin.dao.SysUserMapper;
 import com.ydtech.modules.admin.dao.SysUserRecordMapper;
 import com.ydtech.modules.admin.model.*;
 import com.ydtech.modules.admin.model.dto.*;
@@ -52,7 +48,6 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.models.auth.In;
 import jodd.util.StringUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -63,7 +58,6 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.*;
 
-import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.time.LocalDate;
 import java.util.*;
@@ -1319,8 +1313,8 @@ public class SysUserController extends BaseController {
      */
     @ApiOperation(value = "电销管理人数据列表")
     @GetMapping(value = "/findDxUserList")
-    public HttpResult findDxUserList() {
-        return HttpResult.ok(sysUserService.findDxUserList());
+    public HttpResult findDxUserList(String type) {
+        return HttpResult.ok(sysUserService.findDxUserList(type));
     }
 
 }

+ 21 - 5
src/main/java/com/ydtech/modules/admin/controller/WechatController.java

@@ -1,21 +1,37 @@
 package com.ydtech.modules.admin.controller;
 
+import cn.hutool.core.util.XmlUtil;
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.exception.SystemException;
 import com.ydtech.modules.admin.model.vo.WechatBindVo;
 import com.ydtech.modules.admin.model.vo.WechatLoginVo;
 import com.ydtech.modules.admin.model.vo.WechatVo;
+import com.ydtech.modules.admin.model.vo.wechat.WechatCustomerCallbackVo;
+import com.ydtech.modules.admin.model.vo.wechat.WechatEncryptVo;
 import com.ydtech.modules.admin.service.WechatService;
 import com.ydtech.modules.base.controller.BaseController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.models.Xml;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import me.chanjar.weixin.common.util.crypto.WxCryptUtil;
+import me.chanjar.weixin.cp.api.WxCpKfService;
+import me.chanjar.weixin.cp.bean.kf.WxCpKfMsgListResp;
+import me.chanjar.weixin.cp.bean.kf.WxCpKfMsgSendRequest;
+import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 @Api(tags = "微信业务")
 @Slf4j
@@ -39,7 +55,7 @@ public class WechatController extends BaseController {
 
     @PostMapping("/bind")
     @ApiOperation(value = "工号绑定微信")
-    HttpResult<Object> bind(@RequestBody WechatBindVo wechatBindVo) throws WxErrorException {
+    public HttpResult<Object> bind(@RequestBody WechatBindVo wechatBindVo) throws WxErrorException {
         try {
             String userId = getUserId();
             return wechatService.bind(wechatBindVo, userId);

+ 35 - 0
src/main/java/com/ydtech/modules/admin/controller/taskStatistics/TaskStatisticsController.java

@@ -2,10 +2,12 @@ package com.ydtech.modules.admin.controller.taskStatistics;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.pagehelper.PageInfo;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.admin.model.dto.TaskStatisticsDto;
 import com.ydtech.modules.admin.model.dto.TaskStatisticsDtoNew;
 import com.ydtech.modules.admin.model.vo.BusinessAgentData;
+import com.ydtech.modules.admin.model.vo.BusinessOrderData;
 import com.ydtech.modules.admin.model.vo.KztGetDeptUtilsDto;
 import com.ydtech.modules.admin.model.vo.TaskStatisticsVo;
 import com.ydtech.modules.admin.service.TaskStatisticsService;
@@ -472,4 +474,37 @@ public class TaskStatisticsController {
         }
     }
 
+
+    /**
+     * @description:   任控制台-业务数据-渠道-详情
+     * @author: hh
+     * @date: 2024/11/19
+     **/
+    @PostMapping("getBusinessOrderDataDetails")
+    @ApiOperation(value = "控制台-业务数据-电销-订单详情-详情")
+    public HttpResult<PageInfo<BusinessOrderData>> getBusinessOrderDataDetails(@RequestBody TaskStatisticsVo taskStatisticsVo) {
+        try {
+            PageInfo<BusinessOrderData> businessOrderDataDetails = taskStatisticsService.getBusinessOrderDataDetails(taskStatisticsVo);
+            return HttpResult.ok("查询数据成功", businessOrderDataDetails);
+        } catch (Exception e) {
+            return HttpResult.error("查询错误"+e.getMessage());
+        }
+    }
+
+    /**
+     * @description:   控制台-业务数据-渠道-订单详情-合计
+     * @author: hh
+     * @date: 2024/11/19
+     **/
+    @PostMapping("getBusinessOrderDataTotal")
+    @ApiOperation(value = "控制台-业务数据-电销-订单详情-合计")
+    public HttpResult<BusinessOrderData> getBusinessOrderDataTotal(@RequestBody TaskStatisticsVo taskStatisticsVo) {
+        try {
+            BusinessOrderData result = taskStatisticsService.getBusinessOrderDataTotal(taskStatisticsVo);
+            return HttpResult.ok("查询数据成功", result);
+        } catch (Exception e) {
+            return HttpResult.error("查询错误"+e.getMessage());
+        }
+    }
+
 }

+ 50 - 0
src/main/java/com/ydtech/modules/admin/controller/wechat/WechatCustomerController.java

@@ -0,0 +1,50 @@
+package com.ydtech.modules.admin.controller.wechat;
+
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.admin.components.wechat.customer.response.CustomerListResponse;
+import com.ydtech.modules.admin.service.WechatCustomerService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@Api(tags = "微信业务")
+@Slf4j
+@RestController
+@RequestMapping("/wechat/customer")
+@RequiredArgsConstructor
+public class WechatCustomerController {
+
+    private final WechatCustomerService customerService;
+
+    @GetMapping(path = "/callback")
+    @ApiOperation(value = "客服回调")
+    public String customerCallback(@RequestParam(value = "msg_signature") String msgSignature,
+                                   @RequestParam(value = "timestamp") String timestamp,
+                                   @RequestParam(value = "nonce") String nonce,
+                                   @RequestParam(value = "echostr") String echoStr) {
+        return customerService.customerCallback(msgSignature, timestamp, nonce, echoStr);
+    }
+
+    @PostMapping(path = "/callback", consumes = MediaType.TEXT_XML_VALUE, produces = MediaType.TEXT_XML_VALUE)
+    @ApiOperation(value = "客服回调(处理事件发送欢迎语)")
+    public HttpResult<String> customerCallback(@RequestBody String wechatEncrypt) throws JsonProcessingException {
+        customerService.callbackSendMsgOnEvent(wechatEncrypt);
+        return HttpResult.ok();
+    }
+
+    @PostMapping(path = "/list")
+    @ApiOperation(value = "客服列表")
+    public HttpResult<List<CustomerListResponse.AccountListDTO>> list() throws JsonProcessingException {
+        List<CustomerListResponse.AccountListDTO> list = customerService.list();
+        return HttpResult.ok(list);
+    }
+
+}

+ 13 - 1
src/main/java/com/ydtech/modules/admin/dao/SysUserMapper.java

@@ -10,7 +10,6 @@ import com.ydtech.modules.admin.model.dto.*;
 import com.ydtech.modules.admin.model.report.user.QianLineQDPersonnelReportDto;
 import com.ydtech.modules.admin.model.vo.*;
 import com.ydtech.modules.base.model.dto.PageDto;
-import com.ydtech.modules.order.entity.BasePageResult;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.springframework.stereotype.Repository;
@@ -535,6 +534,19 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
      */
     SysUser getByRoleIdAndDeptId(@Param("roleId") String roleId, @Param("deptId") String deptId);
 
+    /**
+     * 根据登陆者 id deptId 查询
+     */
+    List<SysUser> selectLeaderBylanderInfo(@Param("deptId") String deptId, @Param("leaderId") String leaderId, @Param("userId") String userId);
+
+
+    /**
+     * @version
+     * @author: hxl
+     * @Date: 2024/9/24 17:35
+     * @Description: 查询电销的管理人列表
+     */
+    List<SysUser> findDxZyUserList();
 }
 
 

+ 16 - 0
src/main/java/com/ydtech/modules/admin/dao/TaskStatisticsMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.vo.BusinessAgentData;
+import com.ydtech.modules.admin.model.vo.BusinessOrderData;
 import com.ydtech.modules.admin.model.vo.TaskStatisticsVo;
 import org.apache.ibatis.annotations.Mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -39,4 +40,19 @@ public interface TaskStatisticsMapper extends BaseMapper<TaskStatisticsDto> {
      */
     IPage<TaskStatisticsDto> channelAgentDetails(Page page, TaskStatisticsVo taskStatisticsVo);
 
+
+    /**
+     * @description:   任控制台-业务数据-渠道-订单详情
+     * @author: hh
+     * @date: 2024/09/10
+     **/
+    List<BusinessOrderData> getBusinessOrderDataDetails(@Param("vo") TaskStatisticsVo taskStatisticsVo);
+
+    /**
+     * @description:   任控制台-业务数据-渠道-订单详情总和
+     * @author: hh
+     * @date: 2024/09/10
+     **/
+    BusinessOrderData getBusinessOrderDataTotal(@Param("vo") TaskStatisticsVo taskStatisticsVo);
+
 }

+ 2 - 0
src/main/java/com/ydtech/modules/admin/model/dto/SysUserDto.java

@@ -52,4 +52,6 @@ public class SysUserDto extends PageRequest {
     private String deptNBId;
 
     private String notSelected;
+    //区分管理还是审核
+    private int examine;
 }

+ 7 - 6
src/main/java/com/ydtech/modules/admin/model/po/SysQyWeChat.java

@@ -48,12 +48,13 @@ public class SysQyWeChat {
     @TableField( "wechat_picture_url")
     private String wechatPictureUrl;
 
-    /**
-     * 企业微信客服URL
-     */
-    @ApiModelProperty("企业微信客服URL")
-    @TableField("support_staff_url")
-    private String supportStaffUrl;
+    @ApiModelProperty("企业微信客服id")
+    @TableField("open_kf_id")
+    private String openKfId;
+
+    @ApiModelProperty("企业微信客服名称")
+    @TableField("open_kf_name")
+    private String openKfName;
 
     @ApiModelProperty("创建用户")
     @TableField("operator")

+ 59 - 0
src/main/java/com/ydtech/modules/admin/model/vo/BusinessOrderData.java

@@ -0,0 +1,59 @@
+package com.ydtech.modules.admin.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+
+@Data
+@ApiModel("业务数据-渠道-详情")
+public class BusinessOrderData {
+
+
+    @ApiModelProperty(value = "姓名")
+    private String userName;
+
+    @ApiModelProperty(value = "工号")
+    private String userId;
+
+    @ApiModelProperty(value = "订单号")
+    private String orderNo;
+
+    @ApiModelProperty(value = "车牌号")
+    private String carNum;
+
+    @ApiModelProperty(value = "签单保费")
+    private BigDecimal sumPremium;
+
+    @ApiModelProperty(value = "交强险保费")
+    private BigDecimal jqPremium;
+
+    @ApiModelProperty(value = "车船税")
+    private BigDecimal taxAmount;
+
+    @ApiModelProperty(value = "商业险保费")
+    private BigDecimal syPremium;
+
+    @ApiModelProperty(value = "非车险保费")
+    private BigDecimal jyPremium;
+
+    @ApiModelProperty(value = "签单保费占比")
+    private BigDecimal sumPremiumProportion;
+
+    @ApiModelProperty(value = "总人数")
+    private String totalNumber;
+
+    @ApiModelProperty(value = "毛利润")
+    private BigDecimal distributionAmount;
+
+    @ApiModelProperty(value = "毛利润占比")
+    private BigDecimal distributionAmountRate;
+
+    @ApiModelProperty(value = "入口金额")
+    private BigDecimal entranceAllFee;
+
+    @ApiModelProperty(value = "出口金额")
+    private BigDecimal exportAllFee;
+}

+ 14 - 2
src/main/java/com/ydtech/modules/admin/model/vo/SysUserBaseVO.java

@@ -120,10 +120,22 @@ public class SysUserBaseVO {
     @ApiModelProperty(value = "银行卡号信息")
     private String bankCardNumbers;
 
-
     @ApiModelProperty(value = "身份证号")
     private String identity;
 
     @ApiModelProperty(value = "居住地址")
-    private String liveAddress = "";
+    private String liveAddress;
+
+    @ApiModelProperty(value = "推荐人ID")
+    private String referrerId;
+
+    @ApiModelProperty(value = "推荐人名称")
+    private String referrerName;
+
+    @ApiModelProperty(value = "用户类型:0:普通用户 1:合伙人 2:工作室管理员")
+    private Integer type;
+
+    @ApiModelProperty(value = "合伙人等级;1,2,3,4,5")
+    private Integer level;
+
 }

+ 11 - 0
src/main/java/com/ydtech/modules/admin/model/vo/TaskStatisticsVo.java

@@ -152,4 +152,15 @@ public class TaskStatisticsVo implements Serializable {
     @ApiModelProperty(value = "对接人")
     private String dockingPerson;
 
+    @ApiModelProperty(value = "筛选签单开始时间")
+    private String signingTimeStart;
+
+    @ApiModelProperty(value = "筛选签单结束时间")
+    private String signingTimeEnd;
+
+    @ApiModelProperty(value = "筛选录单开始时间")
+    private String enterTimeStart;
+
+    @ApiModelProperty(value = "筛选录单开始时间")
+    private String enterTimeEnd;
 }

+ 39 - 0
src/main/java/com/ydtech/modules/admin/model/vo/wechat/WechatCustomerCallbackVo.java

@@ -0,0 +1,39 @@
+package com.ydtech.modules.admin.model.vo.wechat;
+
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @description: 微信客服 回调实体
+ * @author: wenks
+ * @date: 2024/11/26 10:37
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@JacksonXmlRootElement(localName = "xml")
+public class WechatCustomerCallbackVo {
+
+    @JacksonXmlProperty(localName = "ToUserName")
+    private String toUserName;
+
+    @JacksonXmlProperty(localName = "CreateTime")
+    private String createTime;
+
+    @JacksonXmlProperty(localName = "MsgType")
+    private String msgType;
+
+    @JacksonXmlProperty(localName = "Event")
+    private String event;
+
+    @JacksonXmlProperty(localName = "Token")
+    private String token;
+
+    @JacksonXmlProperty(localName = "OpenKfId")
+    private String openKfId;
+
+}

+ 24 - 0
src/main/java/com/ydtech/modules/admin/model/vo/wechat/WechatEncryptVo.java

@@ -0,0 +1,24 @@
+package com.ydtech.modules.admin.model.vo.wechat;
+
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@JacksonXmlRootElement(localName = "xml")
+public class WechatEncryptVo {
+
+    @JacksonXmlProperty(localName = "ToUserName")
+    private String toUserName;
+
+    @JacksonXmlProperty(localName = "Encrypt")
+    private String encrypt;
+
+    @JacksonXmlProperty(localName = "AgentID")
+    private String agentID;
+
+}

+ 2 - 2
src/main/java/com/ydtech/modules/admin/service/SysPartnerService.java

@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.admin.model.SysPartner;
 import com.ydtech.modules.admin.model.SysPartnerAccount;
-import com.ydtech.modules.admin.model.SysPremiumDetails;
+import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.dto.*;
 import com.ydtech.modules.admin.model.vo.*;
 import com.ydtech.modules.order.entity.BasePageResult;
@@ -23,7 +23,7 @@ import java.util.List;
 public interface SysPartnerService extends IService<SysPartner> {
 
 
-    List<SysPartner> queryRecommendAndPartner(String id,Integer level);
+    List<SysUser> queryRecommendAndPartner(String id, Integer level);
 
     BasePageResult<SysUserPartner> queryByPage(SysPartnerPageDto sysPartnerPageDto);
 

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

@@ -14,10 +14,7 @@ import com.ydtech.modules.admin.model.dto.*;
 import com.ydtech.modules.admin.model.vo.*;
 import com.ydtech.modules.base.model.dto.PageDto;
 import com.ydtech.modules.base.model.vo.PageVo;
-import org.apache.ibatis.annotations.Param;
-import org.springframework.web.bind.annotation.RequestParam;
 
-import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -276,7 +273,7 @@ public interface SysUserService extends BaseIService<SysUser> {
      *  @Date: 2024/9/24 17:35
      *  @Description:  查询电销的管理人列表
      */
-    List<SysUser> findDxUserList();
+    List<SysUser> findDxUserList(String type);
 
     List<Map<String,String>>  selectHxUserList(SysUserDto sysUserDto);
 

+ 17 - 0
src/main/java/com/ydtech/modules/admin/service/TaskStatisticsService.java

@@ -1,10 +1,12 @@
 package com.ydtech.modules.admin.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.pagehelper.PageInfo;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.admin.model.dto.TaskStatisticsDto;
 import com.ydtech.modules.admin.model.dto.TaskStatisticsDtoNew;
 import com.ydtech.modules.admin.model.vo.BusinessAgentData;
+import com.ydtech.modules.admin.model.vo.BusinessOrderData;
 import com.ydtech.modules.admin.model.vo.TaskStatisticsVo;
 import com.ydtech.modules.order.entity.BasePageResult;
 
@@ -142,4 +144,19 @@ public interface TaskStatisticsService {
      **/
     HttpResult electricExcel(TaskStatisticsVo taskStatisticsVo);
 
+
+    /**
+     * @description:   任控制台-业务数据-渠道-详情
+     * @author: hh
+     * @date: 2024/11/19
+     **/
+    PageInfo<BusinessOrderData> getBusinessOrderDataDetails(TaskStatisticsVo taskStatisticsVo);
+
+    /**
+     * @description:   控制台-业务数据-渠道-订单详情-合计
+     * @author: hh
+     * @date: 2024/11/19
+     **/
+    BusinessOrderData getBusinessOrderDataTotal(TaskStatisticsVo taskStatisticsVo);
+
 }

+ 43 - 0
src/main/java/com/ydtech/modules/admin/service/WechatCustomerService.java

@@ -0,0 +1,43 @@
+package com.ydtech.modules.admin.service;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.ydtech.core.page.BasePageVO;
+import com.ydtech.modules.admin.components.wechat.customer.response.CustomerListResponse;
+
+import java.util.List;
+
+public interface WechatCustomerService {
+
+    /**
+     * 配置微信客服回调信息
+     *
+     * @param msgSignature
+     * @param timestamp    时间戳
+     * @param nonce
+     * @param echoStr      加密后的参数
+     * @return 校验参数
+     */
+    String customerCallback(String msgSignature, String timestamp, String nonce, String echoStr);
+
+    /**
+     * 回调事件
+     *
+     * @param wechatEncrypt
+     */
+    void callbackSendMsgOnEvent(String wechatEncrypt) throws JsonProcessingException;
+
+
+    /**
+     * 获取全部客服账号
+     *
+     * @return 客服列表
+     */
+    List<CustomerListResponse.AccountListDTO> list();
+
+    /**
+     * 获取链接
+     *
+     * @return 跳转链接
+     */
+    String addContactWay(String openKfId);
+}

+ 7 - 9
src/main/java/com/ydtech/modules/admin/service/impl/SysPartnerServiceImpl.java

@@ -102,16 +102,14 @@ public class SysPartnerServiceImpl extends ServiceImpl<SysPartnerMapper, SysPart
     private Map<String, WxMpService> wxMpService;
 
     @Override
-    public List<SysPartner> queryRecommendAndPartner(String id,Integer level) {
-        List<SysPartner> sysPartnerList = sysPartnerMapper.selectList(new LambdaQueryWrapper<SysPartner>().eq(SysPartner::getDelFlag, 1)
-                .likeRight(SysPartner::getUserId, id).lt(SysPartner::getType,level).orderByDesc(SysPartner::getId));
-        if (sysPartnerList.size() > 0) {
-            for (SysPartner sysPartner : sysPartnerList) {
-                SysUser sysUser = sysUserMapper.selectById(sysPartner.getUserId());
-                sysPartner.setUserName(sysUser.getName());
-            }
+    public List<SysUser> queryRecommendAndPartner(String id,Integer level) {
+        List<SysUser> sysPartnerList = sysUserMapper.selectList(new LambdaQueryWrapper<SysUser>()
+                .ne(SysUser::getStatus, 0)
+                .likeRight(SysUser::getId, id)
+                .eq(SysUser::getType,1)
+                .lt(SysUser::getLevel,level)
+                .orderByDesc(SysUser::getId));
 
-        }
         return sysPartnerList;
     }
 

+ 146 - 19
src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java

@@ -1,7 +1,5 @@
 package com.ydtech.modules.admin.service.impl;
 
-import cn.dev33.satoken.session.SaSession;
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.extra.spring.SpringUtil;
@@ -15,7 +13,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.gson.Gson;
 import com.ydtech.constants.InsuranceImageEnum;
 import com.ydtech.constants.SysConstants;
-import com.ydtech.constants.sys.SysPasswordEnum;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.core.page.PageResult;
 import com.ydtech.exception.SystemException;
@@ -60,10 +57,9 @@ import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.util.ObjectUtils;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
 import java.io.*;
 import java.math.BigDecimal;
 import java.net.HttpURLConnection;
@@ -72,11 +68,8 @@ import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
-import static com.ydtech.constants.RedisConstant.PHONE_VERIFICATION_CODE_KEY;
-import static com.ydtech.constants.RedisConstant.PHONE_VERIFICATION_CODE_KEY_TIME;
 
 
 @Service
@@ -164,6 +157,29 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             throw new SystemException("必传标识未传递");
         }
         IPage<SysUserBaseVO> userList = sysUserMapper.findUserList(page, sysUserVO);
+        List<SysUserBaseVO> records = userList.getRecords();
+        if (!CollectionUtils.isEmpty(records)) {
+            for (SysUserBaseVO record : records) {
+                //合伙人APP邀请团队长查询推介人
+//                if (record.getType() != 0) {
+//                    String referrerId = record.getReferrerId();
+//                    if (StringUtils.isNotEmpty(referrerId)) {
+//                        record.setReferrerId(referrerId);
+//                        SysUser sysUser = sysUserMapper.selectById(record.getReferrerId());
+//                        record.setReferrerName(sysUser.getName());
+//                    }
+//                }
+                // 查询推荐人
+                EsmUserReferrer referrer = esmUserReferrerService.getById(record.getUserId());
+                if (ObjectUtils.isEmpty(referrer)) {
+                    record.setReferrerId(null);
+                    record.setReferrerName(null);
+                } else {
+                    record.setReferrerId(referrer.getReferrerId());
+                    record.setReferrerName(referrer.getReferrerName());
+                }
+            }
+        }
         return userList;
     }
 
@@ -190,8 +206,35 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         if (sysUserDto.getAgentFlag() == null) {
             throw new SystemException("必传标识未传递");
         }
+        IPage<SysUserBaseVO> backUserList = sysUserMapper.findBackUserList(page, sysUserDto);
+        List<SysUserBaseVO> records = backUserList.getRecords();
+        if (!CollectionUtils.isEmpty(records)) {
+            for (SysUserBaseVO record : records) {
+                //合伙人,机构负责人查询推荐人
+//                if (record.getType() != 0) {
+//                    Integer level = record.getLevel();
+//                    if (level == null || level != 1) {
+//                        String referrerId = record.getReferrerId();
+//                        if (StringUtils.isNotEmpty(referrerId)) {
+//                            record.setReferrerId(referrerId);
+//                            SysUser sysUser = sysUserMapper.selectById(record.getReferrerId());
+//                            record.setReferrerName(sysUser.getName());
+//                        }
+//                    }
+//                }
+                // 查询推荐人
+                EsmUserReferrer referrer = esmUserReferrerService.getById(record.getUserId());
+                if (ObjectUtils.isEmpty(referrer)) {
+                    record.setReferrerId(null);
+                    record.setReferrerName(null);
+                } else {
+                    record.setReferrerId(referrer.getReferrerId());
+                    record.setReferrerName(referrer.getReferrerName());
+                }
+            }
+        }
 
-        return sysUserMapper.findBackUserList(page, sysUserDto);
+        return backUserList;
     }
 
     @Override
@@ -876,13 +919,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Transactional(rollbackFor = Exception.class)
     public HttpResult saveUserInfoByPartner(SysUser2Vo sysUserVo) {
         SysUser sysUser = sysUserVo.getSysUser();
+        //1:合伙人 2:工作室管理员
+        Integer type = sysUser.getType();
         // 手机号
-        List<SysUser> mobileList = lambdaQuery().eq(SysUser::getMobile, sysUser.getMobile()).list();
+        List<SysUser> mobileList = lambdaQuery().eq(SysUser::getMobile, sysUser.getMobile()).eq(SysUser::getType,type).list();
         if (!mobileList.isEmpty()) {
             throw new SystemException("手机号已经注册请更换手机号。");
         }
         // 身份证号
-        List<SysUser> identityList = lambdaQuery().eq(SysUser::getIdentity, sysUser.getIdentity()).list();
+        List<SysUser> identityList = lambdaQuery().eq(SysUser::getIdentity, sysUser.getIdentity()).eq(SysUser::getType,type).list();
         if (!identityList.isEmpty()) {
             throw new SystemException("身份证号已经注册请更换身份证号。");
         }
@@ -967,7 +1012,13 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             List<EsmUserImage> esmUserImages = esmUserImageVo.stream().map(x -> new EsmUserImage(x, finalUserId)).collect(Collectors.toList());
             esmUserImageService.saveBatch(esmUserImages);
         }
-        SpringUtil.getBean(RecordUserUtils.class).addRecord(userId, Optional.ofNullable(sysUserVo.getSysUser().getReferrerId()).orElse("admin") );
+        String referrerId = sysUserVo.getSysUser().getReferrerId();
+        if (referrerId == null) {
+            SpringUtil.getBean(RecordUserUtils.class).addRecord(userId, "admin");
+        }else {
+            SysUser sysUser1 = sysUserMapper.selectById(sysUserVo.getSysUser().getReferrerId());
+            SpringUtil.getBean(RecordUserUtils.class).addRecord(userId, Optional.ofNullable(sysUser1.getName()).orElse("admin") );
+        }
         return HttpResult.ok("新增成功", sysUserMapper.selectById(userId));
     }
 
@@ -975,7 +1026,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Transactional(rollbackFor = Exception.class)
     public HttpResult saveUserInfo1(SysUser2Vo sysUserVo) {
 
-        log.info("添加团队入参:{}", sysUserVo);
+        log.info("添加团队添加入参:{}", sysUserVo);
         SysUser sysUser = sysUserVo.getSysUser();
         sysUser.setType(3);
         sysUser.setCreateTime(new Date());
@@ -1040,12 +1091,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 
 //        SysUser sysUser = sysUserVo.getSysUser();
         // 手机号
-        List<SysUser> mobileList = lambdaQuery().eq(SysUser::getMobile, sysUser.getMobile()).list();
+        List<SysUser> mobileList = lambdaQuery().eq(SysUser::getMobile, sysUser.getMobile()).eq(SysUser::getType,sysUser.getType()).list();
         if (!mobileList.isEmpty()) {
             throw new SystemException("手机号已经注册请更换手机号。");
         }
         // 身份证号
-        List<SysUser> identityList = lambdaQuery().eq(SysUser::getIdentity, sysUser.getIdentity()).list();
+        List<SysUser> identityList = lambdaQuery().eq(SysUser::getIdentity, sysUser.getIdentity()).eq(SysUser::getType,sysUser.getType()).list();
         if (!identityList.isEmpty()) {
             throw new SystemException("身份证号已经注册请更换身份证号。");
         }
@@ -1130,7 +1181,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             List<EsmUserImage> esmUserImages = esmUserImageVo.stream().map(x -> new EsmUserImage(x, finalUserId)).collect(Collectors.toList());
             esmUserImageService.saveBatch(esmUserImages);
         }
-        SpringUtil.getBean(RecordUserUtils.class).addRecord(userId, Optional.ofNullable(sysUserVo.getSysUser().getReferrerId()).orElse("admin"));
+        SysUser referrerInfo = sysUserMapper.selectById(sysUserVo.getSysUser().getReferrerId());
+        SpringUtil.getBean(RecordUserUtils.class).addRecord(userId, Optional.ofNullable(referrerInfo.getName()).orElse("admin"));
         return HttpResult.ok("新增成功", sysUserMapper.selectById(userId));
     }
 
@@ -1533,7 +1585,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             treeShowLevel.setShowLevel("subordinate");
         }
         //获取领导字段不为空的人的ID
-        List<SysUser> users = lambdaQuery().isNotNull(SysUser::getLeaderId).list();
+        List<SysUser> users = lambdaQuery()
+                .isNotNull(SysUser::getLeaderId)
+                .ne(SysUser::getStatus, 0)
+                .list();
+
 
         if (users == null || users.size() == 0) {
             return new ArrayList<>();
@@ -1866,11 +1922,77 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     public List<SysUserBaseVO> getAllUsersByHospitality(SysUserVOExt sysUserVOExt) {
         if (StringUtils.isNotEmpty(sysUserVOExt.getUserId()) || StringUtils.isNotEmpty(sysUserVOExt.getIdentity()) ||
                 StringUtils.isNotEmpty(sysUserVOExt.getMobile()) || StringUtils.isNotEmpty(sysUserVOExt.getName())) {
-            return super.baseMapper.getAllUsersByHospitality(sysUserVOExt);
+            List<SysUserBaseVO> allUsersByHospitality = super.baseMapper.getAllUsersByHospitality(sysUserVOExt);
+            //数据隔离操作
+            List<SysUserBaseVO> divideUserInfo = this.dataDivide(allUsersByHospitality);
+            return divideUserInfo;
         }
         return new ArrayList<SysUserBaseVO>();
     }
 
+    private List<SysUserBaseVO> dataDivide(List<SysUserBaseVO> allUsersByHospitality) {
+        List<SysUser> userList = new ArrayList<>();
+        SysUser landerInfo = BaseController.getUser();
+        //超级管理员不做处理
+        if ("admin".equals(landerInfo.getId()) || "99D1501".equals(landerInfo.getId())) {
+            return allUsersByHospitality;
+        }
+
+        //获取查询结果id
+        List<String> userIds = new ArrayList<>();
+        //如果登陆者部门所属总裁办,则进行是否是运营中心领导人逻辑的判断
+        if ("99D15".equals(landerInfo.getDeptId())) {
+            //判断登陆者下属是否所属运营中心
+            LambdaQueryWrapper<SysUser> getLanderBranch = new LambdaQueryWrapper<>();
+            getLanderBranch.notLike(SysUser::getId, "M")
+                    .eq(SysUser::getDeptId, "9914D18")
+                    .eq(SysUser::getLeaderId, landerInfo.getId());
+            List<SysUser> sysUserList = list(getLanderBranch);
+
+            if (StringUtils.isNullOrEmpty(sysUserList) || sysUserList.isEmpty()) {
+                //如果不属于运营中心则不展示数据
+                return new ArrayList<>();
+            }
+            userIds.add(landerInfo.getId());
+            //获取运营中心全部员工
+            LambdaQueryWrapper<SysUser> getOperationUser = new LambdaQueryWrapper<>();
+            getOperationUser.notLike(SysUser::getId, "M")
+                    .eq(SysUser::getDeptId, "9914D18")
+                    .isNotNull(SysUser::getLeaderId);
+            userList.addAll(list(getOperationUser));
+        } else if ("9914D18".equals(landerInfo.getDeptId()) || "9914D13".equals(landerInfo.getDeptId())) {
+            //查询登陆者组长信息
+            List<SysUser> sysUsers = super.baseMapper.selectLeaderBylanderInfo(landerInfo.getDeptId(), null, landerInfo.getLeaderId());
+            if (StringUtils.isNullOrEmpty(sysUsers) || sysUsers.size() < 1) {
+                userIds.add(landerInfo.getId());
+                //为空则登陆者为组长,id当做leaderID查询
+                sysUsers = super.baseMapper.selectLeaderBylanderInfo(landerInfo.getDeptId(), landerInfo.getId(), null);
+                userList.addAll(sysUsers);
+            } else {
+                SysUser sysUser = sysUsers.get(0);
+                userList.add(sysUser);
+                List<SysUser> sysUserList = super.baseMapper.selectLeaderBylanderInfo(landerInfo.getDeptId(), landerInfo.getLeaderId(), null);
+                userList.addAll(sysUserList);
+            }
+        } else {
+            //如果不属于运营中心则不展示数据
+            return new ArrayList<>();
+        }
+
+        //获取查询结果id
+         userIds.addAll(userList.stream()
+                .filter(user -> !StringUtils.isNullOrEmpty(user) && StringUtils.isNotEmpty(user.getId()))
+                .map(SysUser::getId)
+                .collect(Collectors.toList()));
+
+        List<SysUserBaseVO> divideUserInfo = allUsersByHospitality.stream()
+                .filter(allUser -> !StringUtils.isNullOrEmpty(allUser) && StringUtils.isNotEmpty(allUser.getLeaderId())
+                        && userIds.contains(allUser.getLeaderId()))
+                .collect(Collectors.toList());
+
+        return divideUserInfo;
+    }
+
     /**
      * @version
      * @author: hxl
@@ -2359,7 +2481,12 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
      * @Description: 电销管理人数据
      */
     @Override
-    public List<SysUser> findDxUserList() {
+    public List<SysUser> findDxUserList(String type) {
+        if("1".equals(type)){
+            return sysUserMapper.findDxUserList();
+        }else if("2".equals(type)){
+            return sysUserMapper.findDxZyUserList();
+        }
         return sysUserMapper.findDxUserList();
     }
 

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

@@ -18,6 +18,7 @@ import com.ydtech.modules.admin.model.SysDept;
 import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.dto.*;
 import com.ydtech.modules.admin.model.vo.BusinessAgentData;
+import com.ydtech.modules.admin.model.vo.BusinessOrderData;
 import com.ydtech.modules.admin.model.vo.TaskStatisticsVo;
 import com.ydtech.modules.admin.service.SysDeptService;
 import com.ydtech.modules.admin.service.TaskStatisticsService;
@@ -40,6 +41,7 @@ import java.math.RoundingMode;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -691,11 +693,15 @@ public class TaskStatisticsServiceImpl  implements TaskStatisticsService {
         HashMap<String, String> dateMapByType = getDateMapByTypeNew(taskStatisticsVo.getDateType(), taskStatisticsVo.getCreatetimeStart(), taskStatisticsVo.getCreatetimeEnd());
         taskStatisticsVo.setCreatetimeStart(dateMapByType.get("startDate"));
         taskStatisticsVo.setCreatetimeEnd(dateMapByType.get("endDate"));
+        getDateByType(taskStatisticsVo.getDateType(), taskStatisticsVo);
 
         IPage<BusinessAgentData> list = this.taskStatisticsMapper.getBusinessAgentData(page,taskStatisticsVo);
         List<BusinessAgentData> records = list.getRecords();
         for (BusinessAgentData record : records) {
             this.appendName(record);
+            if (record.getDistributionAmountRate() == null) {
+                record.setDistributionAmountRate(new BigDecimal("0.0000"));
+            }
         }
         Long  total = this.taskStatisticsMapper.getBusinessAgentDataTotal(taskStatisticsVo);
         list.setTotal(total);
@@ -838,6 +844,7 @@ public class TaskStatisticsServiceImpl  implements TaskStatisticsService {
         HashMap<String, String> dateMapByType = getDateMapByTypeNew(taskStatisticsVo.getDateType(), taskStatisticsVo.getCreatetimeStart(), taskStatisticsVo.getCreatetimeEnd());
         taskStatisticsVo.setCreatetimeStart(dateMapByType.get("startDate"));
         taskStatisticsVo.setCreatetimeEnd(dateMapByType.get("endDate"));
+        getDateByType(taskStatisticsVo.getDateType(), taskStatisticsVo);
 
 
         if(StringUtils.isNotEmpty(taskStatisticsVo.getTreeType()) || "3".equals(taskStatisticsVo.getManagementSource())){
@@ -958,6 +965,7 @@ public class TaskStatisticsServiceImpl  implements TaskStatisticsService {
         HashMap<String, String> dateMapByType = getDateMapByType(taskStatisticsVo.getDateType(), taskStatisticsVo.getCreatetimeStart(), taskStatisticsVo.getCreatetimeEnd());
         taskStatisticsVo.setCreatetimeStart(dateMapByType.get("startDate"));
         taskStatisticsVo.setCreatetimeEnd(dateMapByType.get("endDate"));
+        getDateByType(taskStatisticsVo.getDateType(), taskStatisticsVo);
         PageVo<TaskStatisticsVo> pageVo = new PageVo<>();
         Page page = new Page(taskStatisticsVo.getPageNum(), taskStatisticsVo.getPageSize());
         page.setSearchCount(false).setOptimizeCountSql(false);//关闭count查询
@@ -1049,4 +1057,103 @@ public class TaskStatisticsServiceImpl  implements TaskStatisticsService {
             }
         }
     }
+
+    /**
+     * @description:   任控制台-业务数据-渠道-详情
+     * @author: hh
+     * @date: 2024/11/19
+     **/
+    @Override
+    public PageInfo<BusinessOrderData> getBusinessOrderDataDetails(TaskStatisticsVo taskStatisticsVo) {
+        getDateByType(taskStatisticsVo.getDateType(), taskStatisticsVo);
+
+        PageHelper.startPage(taskStatisticsVo.getPageNum(), taskStatisticsVo.getPageSize());
+        List<BusinessOrderData> businessOrderList = this.taskStatisticsMapper.getBusinessOrderDataDetails(taskStatisticsVo);
+        if (!com.ydtech.utils.StringUtils.isNullOrEmpty(businessOrderList) && !businessOrderList.isEmpty()) {
+            for (BusinessOrderData businessOrderData : businessOrderList) {
+                BigDecimal entranceAllFee = businessOrderData.getEntranceAllFee() != null ?
+                        businessOrderData.getEntranceAllFee().setScale(2, BigDecimal.ROUND_HALF_UP) : BigDecimal.ZERO;
+                BigDecimal exportAllFee = businessOrderData.getExportAllFee() != null ? businessOrderData.getExportAllFee() : BigDecimal.ZERO;
+                BigDecimal distributionAmount = entranceAllFee.subtract(exportAllFee);
+                businessOrderData.setDistributionAmount(distributionAmount); //毛利润
+                businessOrderData.setEntranceAllFee(entranceAllFee);
+                if(distributionAmount.compareTo(BigDecimal.ZERO) > 0
+                        && businessOrderData.getSumPremium().compareTo(BigDecimal.ZERO) > 0){
+                    BigDecimal resultDivided = distributionAmount.divide(businessOrderData.getSumPremium(), 4, RoundingMode.HALF_UP); //人均产能
+                    businessOrderData.setDistributionAmountRate(resultDivided);
+                }else {
+                    businessOrderData.setDistributionAmountRate(new BigDecimal("0.0000"));
+                }
+            }
+        }
+        return new PageInfo<>(businessOrderList);
+    }
+
+
+    /**
+     * @description:   任控制台-业务数据-渠道-合计
+     * @author: hh
+     * @date: 2024/11/19
+     **/
+    @Override
+    public BusinessOrderData getBusinessOrderDataTotal(TaskStatisticsVo taskStatisticsVo) {
+        getDateByType(taskStatisticsVo.getDateType(), taskStatisticsVo);
+
+        BusinessOrderData result = this.taskStatisticsMapper.getBusinessOrderDataTotal(taskStatisticsVo);
+
+        if (com.ydtech.utils.StringUtils.isNullOrEmpty(result)) {
+            return null;
+        }
+        BigDecimal sumPremium = result.getSumPremium();
+        BusinessAgentData allsumPremium = this.taskStatisticsMapper.getAllsumPremium(taskStatisticsVo);
+        if (ObjectUtils.isNotEmpty(sumPremium)) {
+            BigDecimal allSumPremium = allsumPremium.getSumPremium();
+            if (sumPremium.compareTo(BigDecimal.ZERO) == 1 && allSumPremium.compareTo(BigDecimal.ZERO) > 0) {
+                BigDecimal multiply = sumPremium.divide(allSumPremium, 4, BigDecimal.ROUND_DOWN);
+                result.setSumPremiumProportion(multiply);
+            }
+        } else {
+            result.setSumPremiumProportion(BigDecimal.ZERO);
+        }
+
+        BigDecimal entranceAllFee = result.getEntranceAllFee() != null ? result.getEntranceAllFee() : BigDecimal.ZERO;
+        BigDecimal exportAllFee = result.getExportAllFee() != null ? result.getExportAllFee() : BigDecimal.ZERO;
+        BigDecimal subtract = entranceAllFee.subtract(exportAllFee);
+        result.setDistributionAmount(subtract); //毛利润
+        if(subtract.compareTo(BigDecimal.ZERO) > 0 && sumPremium.compareTo(BigDecimal.ZERO) > 0){
+            BigDecimal resultDivided = subtract.divide(sumPremium, 4, RoundingMode.HALF_UP); //人均产能
+            result.setDistributionAmountRate(resultDivided);
+        }else {
+            result.setDistributionAmountRate(new BigDecimal("0.0000"));
+        }
+        return result;
+    }
+
+    /**
+     *  @version
+     *  @author: hh
+     *  @Date: 2024/11/19
+     *  @Description:  通过时间类型判断
+     */
+    private static void getDateByType(String type, TaskStatisticsVo taskStatisticsVo) {
+        String  startDateStr = new String();
+        String  endDateStr = new String();
+        if (StringUtils.isNotEmpty(type)) {
+            switch (type) {
+                case "1" : startDateStr= SliceUpDateUtil.getBeforeDay(new Date(),0) + " 00:00:00";
+                           endDateStr=SliceUpDateUtil.getBeforeDay(new Date(),0) + " 23:59:59";
+                           break;
+                case "2" : startDateStr= SliceUpDateUtil.getBeforeDay(new Date(),1) + " 00:00:00";
+                           endDateStr=SliceUpDateUtil.getBeforeDay(new Date(),0) + " 23:59:59";
+                           break;
+                case "3" : startDateStr= SliceUpDateUtil.getBeforeDay(new Date(),6) + " 00:00:00";
+                           endDateStr=SliceUpDateUtil.getBeforeDay(new Date(),0) + " 23:59:59";
+                           break;
+            }
+            taskStatisticsVo.setSigningTimeStart(startDateStr);
+            taskStatisticsVo.setSigningTimeEnd(endDateStr);
+            taskStatisticsVo.setEnterTimeStart(startDateStr);
+            taskStatisticsVo.setEnterTimeEnd(endDateStr);
+        }
+    }
 }

+ 89 - 0
src/main/java/com/ydtech/modules/admin/service/impl/WechatCustomerServiceImpl.java

@@ -0,0 +1,89 @@
+package com.ydtech.modules.admin.service.impl;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.dataformat.xml.XmlMapper;
+import com.ydtech.modules.admin.components.WechatCustomerComponents;
+import com.ydtech.modules.admin.components.wechat.customer.request.CustomerAddContactWayRequest;
+import com.ydtech.modules.admin.components.wechat.customer.request.CustomerListRequest;
+import com.ydtech.modules.admin.components.wechat.customer.request.CustomerSendMsgOnEventRequest;
+import com.ydtech.modules.admin.components.wechat.customer.request.CustomerSyncMsgRequest;
+import com.ydtech.modules.admin.components.wechat.customer.response.CustomerAddContactWayResponse;
+import com.ydtech.modules.admin.components.wechat.customer.response.CustomerListResponse;
+import com.ydtech.modules.admin.components.wechat.customer.response.CustomerSyncMsgResponse;
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.model.vo.wechat.WechatCustomerCallbackVo;
+import com.ydtech.modules.admin.model.vo.wechat.WechatEncryptVo;
+import com.ydtech.modules.admin.service.SysUserService;
+import com.ydtech.modules.admin.service.WechatCustomerService;
+import com.ydtech.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.util.crypto.WxCryptUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
+
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class WechatCustomerServiceImpl implements WechatCustomerService {
+
+    private final WechatCustomerComponents wechatCustomerComponents;
+
+    private final SysUserService sysUserService;
+
+    private final XmlMapper xmlMapper = new XmlMapper();
+
+    @Override
+    public String customerCallback(String msgSignature, String timestamp, String nonce, String echoStr) {
+        WxCryptUtil wxCryptUtil = wechatCustomerComponents.getWxCryptUtil();
+        return wxCryptUtil.decrypt(echoStr);
+    }
+
+    @Override
+    public void callbackSendMsgOnEvent(String wechatEncrypt) throws JsonProcessingException {
+        log.info("回调参数为{}", wechatEncrypt);
+        WechatEncryptVo wechatEncryptVo = xmlMapper.readValue(wechatEncrypt, WechatEncryptVo.class);
+        WxCryptUtil wxCryptUtil = wechatCustomerComponents.getWxCryptUtil();
+        log.info("解密参数为{}", wechatEncryptVo.getEncrypt());
+        String encrypt = wxCryptUtil.decrypt(wechatEncryptVo.getEncrypt());
+        log.info("解密后的参数为{}", encrypt);
+        WechatCustomerCallbackVo wechatCustomerCallbackVo = xmlMapper.readValue(encrypt, WechatCustomerCallbackVo.class);
+
+        // 获取消息
+        CustomerSyncMsgRequest customerSyncMsgRequest = new CustomerSyncMsgRequest();
+        customerSyncMsgRequest.setToken(wechatCustomerCallbackVo.getToken());
+        customerSyncMsgRequest.setOpenKfid(wechatCustomerCallbackVo.getOpenKfId());
+        CustomerSyncMsgResponse customerSyncMsgResponse = wechatCustomerComponents.syncMsg(customerSyncMsgRequest);
+        List<CustomerSyncMsgResponse.MsgListDTO> msgList = customerSyncMsgResponse.getMsgList();
+        CustomerSyncMsgResponse.MsgListDTO msgListDTO = customerSyncMsgResponse.getMsgList().get(msgList.size() - 1);
+
+        CustomerSyncMsgResponse.MsgListDTO.EventDTO event = msgListDTO.getEvent();
+        if(ObjectUtils.isEmpty(event)) {
+            return;
+        }
+        String sceneParam = event.getSceneParam();
+        if (StringUtils.isEmpty(sceneParam)) {
+            return;
+        }
+
+        SysUser sysUser = sysUserService.getById(sceneParam);
+        CustomerSendMsgOnEventRequest customerSendMsgOnEventRequest = CustomerSendMsgOnEventRequest.sendMsgOnEvent(sysUser, msgListDTO.getMsgid(), event.getWelcomeCode());
+        wechatCustomerComponents.sendMsgOnEvent(customerSendMsgOnEventRequest);
+    }
+
+    @Override
+    public List<CustomerListResponse.AccountListDTO> list() {
+        CustomerListRequest customerListResponse = new CustomerListRequest(0, 100);
+        return wechatCustomerComponents.list(customerListResponse).getAccountList();
+    }
+
+    @Override
+    public String addContactWay(String openKfId) {
+        CustomerAddContactWayRequest customerAddContactWayRequest = new CustomerAddContactWayRequest(openKfId, "WELCOME_MESSAGE");
+        CustomerAddContactWayResponse customerAddContactWayResponse = wechatCustomerComponents.addContactWay(customerAddContactWayRequest);
+        return customerAddContactWayResponse.getUrl();
+    }
+
+}

+ 3 - 6
src/main/java/com/ydtech/modules/fnc/service/impl/InsPlyIncomeServiceImpl.java

@@ -2012,13 +2012,10 @@ public class InsPlyIncomeServiceImpl extends ServiceImpl<InsPlyIncomeMapper, Ins
                         item.setHandlingFeesStatus("2");
                         if (StringUtils.isNotEmpty(item.getTaskId())) {
                             return HttpResult.error("该单据已经开票 ");
+                        }else {
+                            item.setTaskId(importResult.getId());
+                            item.setSettlementTime(LocalDateTime.now());
                         }
-
-//                        else {
-//                            item.setTaskId(importResult.getId());
-//                            item.setSettlementTime(LocalDateTime.now());
-//                            baseMapper.updateById(item);
-//                        }
                     }
                     this.saveOrUpdateBatch(insPlyIncomes);
                 }

+ 22 - 1
src/main/java/com/ydtech/modules/ins/model/vo/CustomerInfoVo.java

@@ -29,10 +29,13 @@ public class CustomerInfoVo {
     private String name;
 
     @NotNull(message = "车主、投保人、被保人身份证号不能为空")
-    @CheckIdentifyNumber
     @ApiModelProperty("身份证号")
     private String identifyNumber;
 
+//    @NotNull(message = "(企业)车主、投保人、被保人组织机构代码不能为空")
+    @ApiModelProperty("组织机构代码")
+    private String organizationCode;
+
 //    @NotNull(message = "车主、投保人、被保人身份证类型不能为空")
     @ApiModelProperty("身份证类型")
     private String identifyType;
@@ -70,6 +73,24 @@ public class CustomerInfoVo {
     @ApiModelProperty(value = "同投保人")
     private boolean insuranceHolder;
 
+    @ApiModelProperty(value = "省")
+    private String province;
+
+    @ApiModelProperty(value = "市")
+    private String city;
+
+    @ApiModelProperty(value = "县")
+    private String county;
+
+    @ApiModelProperty(value = "车主类型(0:法人 1:个人(中国籍) 2: 个人(非中国籍))")
+    private String property;
+
+    @ApiModelProperty(value = "注册资本金")
+    private String registeredCapital;
+    @ApiModelProperty(value = "经营范围")
+    private String scope;
+
+
     public boolean contrastInfo(CustomerInfoVo customerInfoVo) {
         if (!ObjectUtils.nullSafeEquals(this.name, customerInfoVo.getName())) {
             return false;

+ 3 - 0
src/main/java/com/ydtech/modules/ins/model/vo/QuoteRespVo.java

@@ -128,6 +128,9 @@ public class QuoteRespVo {
     @ApiModelProperty("商业赔付率")
     private double syLossRation;
 
+    @ApiModelProperty("阳光 交商含增值服务合并经营成本率")
+    private double margeCostRate;
+
     @ApiModelProperty("核心返回车型")
     private CoreModelsVo coreModels;
 

+ 3 - 0
src/main/java/com/ydtech/modules/ins/model/yc/imageUp/ImageUp.java

@@ -138,6 +138,9 @@ public class ImageUp {
             }else if (imgType.equals(InsuranceImageEnum.D04.getCode())) {
                 fileName = "被保人身份证" + "(反面)" + ".jpg";
                 rb.setImgtype("UW01008");
+            } else if (imgType.equals(InsuranceImageEnum.GX00.getCode())) {
+                fileName = "投保人被保人信息不一致说明" + ".jpg";
+                rb.setImgtype("UW01017");
             }
 
         }

+ 4 - 0
src/main/java/com/ydtech/modules/order/components/InsCrawlerOrderComponents.java

@@ -56,5 +56,9 @@ public class InsCrawlerOrderComponents {
         return this.post(url, insuranceEnum.getPinyin(), message, requestBody, responseType, httpHeaders);
     }
 
+    public <T, B> B request(String url, String logId, String message, T requestBody, Class<B> responseType, HttpHeaders httpHeaders) {
+        return this.post(url, logId, message, requestBody, responseType, httpHeaders);
+    }
+
 }
 

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

@@ -211,9 +211,9 @@ public class ChengTaiRequestApiComponents {
      */
     private void verificationResponseCode(String responseCode, boolean flag, String responseMsg) {
         if (!flag){
-            throw new SystemException(responseMsg);
+            throw new SystemException("验签失败");
         }
-        if (!ResponseCode.R_000.getCode().equals(responseCode)) {
+        if (!ResponseCode.R_000.getCode().equals(responseCode) && !responseMsg.contains("重复投保") && !responseMsg.contains("录入的校验码有误")) {
             throw new SystemException(responseMsg);
         }
     }
@@ -263,7 +263,7 @@ public class ChengTaiRequestApiComponents {
                 try {
                     return this.getToken(parameters,httpHeaders);
                 } catch (Exception e) {
-                    throw new RuntimeException(e);
+                    throw new SystemException(e.toString());
                 } finally {
                     lock.unlock();
                 }

+ 5 - 1
src/main/java/com/ydtech/modules/order/constants/OrderCacheConstant.java

@@ -99,7 +99,6 @@ public class OrderCacheConstant {
     public static final String CT_ACCESS_LOCK = "ct:accessLock:";
 
 
-
     /**
      * 紫金财险 为接入方提供获取token时间
      */
@@ -110,4 +109,9 @@ public class OrderCacheConstant {
      */
     public static final long CT_ACCESS_TOKEN_TIME = 238;
 
+    /**
+     * 微信客服token
+     */
+    public static final String WECHAT_CUSTOMER_TOKEN = "wechat:customer:token";
+
 }

+ 18 - 2
src/main/java/com/ydtech/modules/order/controller/QuoteController.java

@@ -2,6 +2,7 @@ package com.ydtech.modules.order.controller;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ydtech.aop.request.RequestSingleParam;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.exception.SystemException;
@@ -30,6 +31,7 @@ import com.ydtech.modules.protocol.service.PtlAgreementAttributionService;
 import com.ydtech.modules.protocol.service.PtlAgreementService;
 import com.ydtech.modules.protocol.service.PtlTaxSourceNewService;
 import com.ydtech.modules.protocol.service.impl.TaxSourceExcludeServiceImpl;
+import com.ydtech.utils.StringUtils;
 import io.swagger.annotations.Api;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -109,6 +111,8 @@ public class QuoteController extends BaseController {
 
     @Autowired
     PtlAgreementService ptlAgreementService;
+    @Autowired
+    InsDrivingIntentionInsuranceService insDrivingIntentionInsuranceService;
 
     @QuoteVerification("报价授权")
     @PostMapping(value = "/quote")
@@ -230,9 +234,21 @@ public class QuoteController extends BaseController {
             if(!Objects.isNull(quoteVo.getAccidentalDrivingVo())) {
                 JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(quoteVo.getAccidentalDrivingVo()));
                 javaObject = jsonObject.toJavaObject(InsDrivingIntentionInsurance.class);
+                BeanUtils.copyProperties(quoteVo,quoteVo1);
+                if(StringUtils.isNotBlank(javaObject.getProjectCode())){
+                    LambdaQueryWrapper<InsDrivingIntentionInsurance> wrapper = new LambdaQueryWrapper<>();
+                    wrapper.eq(InsDrivingIntentionInsurance::getProjectCode,javaObject.getProjectCode());
+                    InsDrivingIntentionInsurance insDrivingIntentionInsurance = insDrivingIntentionInsuranceService.getOne(wrapper);
+                    if (StringUtils.isNotBlank(insDrivingIntentionInsurance.getRelateCode())){
+                        javaObject.setProjectCode(insDrivingIntentionInsurance.getRelateCode());
+                        quoteVo1.setAccidentalDrivingVo(javaObject);
+                    }else{
+                        throw new SystemException("驾意险失效,请检查方案配置");
+                    }
+                }else{
+                    quoteVo1.setAccidentalDrivingVo(javaObject);
+                }
             }
-            BeanUtils.copyProperties(quoteVo,quoteVo1);
-            quoteVo1.setAccidentalDrivingVo(javaObject);
             respVo = chengTaiOrderApiService.quoteApi(quoteInfo, quoteVo1);
         }
         if ("YGBX1000000".equals(ptlAgreementAttribution.getInsCompanyId()) && Objects.isNull(respVo)) {

+ 18 - 0
src/main/java/com/ydtech/modules/order/dao/InsAreaCompanyRelatedInfoMapper.java

@@ -0,0 +1,18 @@
+package com.ydtech.modules.order.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.order.entity.InsAreaCompanyRelatedInfo;
+
+/**
+* @author dongxin
+* @description 针对表【ins_area_company_related_info(子订单关联信息表)】的数据库操作Mapper
+* @createDate 2024-11-29 15:26:49
+* @Entity generator.domain.InsAreaCompanyRelatedInfo
+*/
+public interface InsAreaCompanyRelatedInfoMapper extends BaseMapper<InsAreaCompanyRelatedInfo> {
+
+}
+
+
+
+

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

@@ -569,6 +569,12 @@ public class InsAreaCompany implements Serializable {
     @TableField(value = "ci_message")
     private String ciMessage;
 
+    /**
+     * 交商含增值服务合并经营成本率 阳光使用
+     */
+    @TableField(value = "merge_cost_rate")
+    private Double mergeCostRate;
+
     //入口总金额
     @TableField(exist = false)
     private BigDecimal entranceAllFee;
@@ -621,6 +627,7 @@ public class InsAreaCompany implements Serializable {
         this.lossRation = quoteRespVo.getLossRation();
         this.jqLossRation = quoteRespVo.getJqLossRation();
         this.syLossRation = quoteRespVo.getSyLossRation();
+        this.mergeCostRate = quoteRespVo.getMargeCostRate();
         // 保单号
         this.jqapplyno = quoteRespVo.getJqApplyNo();
         this.syapplyno = quoteRespVo.getSyApplyNo();

+ 149 - 0
src/main/java/com/ydtech/modules/order/entity/InsAreaCompanyRelatedInfo.java

@@ -0,0 +1,149 @@
+package com.ydtech.modules.order.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 子订单关联信息表
+ * @TableName ins_area_company_related_info
+ */
+@TableName(value = "ins_area_company_related_info")
+@Data
+@ApiModel(value = "子订单关联信息表")
+@NoArgsConstructor
+@AllArgsConstructor
+public class InsAreaCompanyRelatedInfo implements Serializable {
+    /**
+     * 主键/自增
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 子订单id
+     */
+    @ApiModelProperty(value = "子订单id")
+    private String companyId;
+
+    /**
+     * 交强特别约定
+     */
+    @ApiModelProperty(value = "交强特别约定")
+    private String jqappoint;
+
+    /**
+     * 商业特别约定
+     */
+    @ApiModelProperty(value = "商业特别约定")
+    private String syappoint;
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键/自增
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * 主键/自增
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * 子订单id
+     */
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    /**
+     * 子订单id
+     */
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    /**
+     * 交强特别约定
+     */
+    public String getJqappoint() {
+        return jqappoint;
+    }
+
+    /**
+     * 交强特别约定
+     */
+    public void setJqappoint(String jqappoint) {
+        this.jqappoint = jqappoint;
+    }
+
+    /**
+     * 商业特别约定
+     */
+    public String getSyappoint() {
+        return syappoint;
+    }
+
+    /**
+     * 商业特别约定
+     */
+    public void setSyappoint(String syappoint) {
+        this.syappoint = syappoint;
+    }
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        InsAreaCompanyRelatedInfo other = (InsAreaCompanyRelatedInfo) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getCompanyId() == null ? other.getCompanyId() == null : this.getCompanyId().equals(other.getCompanyId()))
+            && (this.getJqappoint() == null ? other.getJqappoint() == null : this.getJqappoint().equals(other.getJqappoint()))
+            && (this.getSyappoint() == null ? other.getSyappoint() == null : this.getSyappoint().equals(other.getSyappoint()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getCompanyId() == null) ? 0 : getCompanyId().hashCode());
+        result = prime * result + ((getJqappoint() == null) ? 0 : getJqappoint().hashCode());
+        result = prime * result + ((getSyappoint() == null) ? 0 : getSyappoint().hashCode());
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", id=").append(id);
+        sb.append(", companyId=").append(companyId);
+        sb.append(", jqappoint=").append(jqappoint);
+        sb.append(", syappoint=").append(syappoint);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

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

@@ -95,6 +95,9 @@ public class InsDrivingIntentionInsurance implements Serializable {
     @TableField(value = "request_data")
     private String requestData;
 
+    @TableField(value = "relate_code")
+    private String relateCode;
+
     /**
      * 份数
      */

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

@@ -14,6 +14,7 @@ import com.ydtech.modules.order.entity.InsDrivingIntentionInsurance;
 import com.ydtech.modules.order.entity.InsDrivingIntentionInsuranceSon;
 import com.ydtech.modules.order.entity.api.chengtai.constants.*;
 import com.ydtech.modules.order.entity.api.chengtai.response.CarInfoResponse;
+import com.ydtech.modules.order.entity.api.chengtai.response.InsurePremiumResponse;
 import com.ydtech.modules.order.entity.api.chengtai.response.QueryCarActualValueResponse;
 import com.ydtech.modules.order.entity.config.ChengTaiConfigureParameters;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
@@ -55,11 +56,10 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
                                 QueryCarActualValueResponse carActualValueResponse,
                                 PersonAreaVo personAreaVo,
                                 ChengTaiConfigureParameters parameters,
-                                BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo,
-                                CarInfoResponse.CarModelListDTO modelListDTO){
+                                BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo){
         super(parameters.getPartnerCode());
         // 标的信息
-        InsuredObjectDTO insuredObject = new InsuredObjectDTO(quoteInfoVo, carModelListDTO,carActualValueResponse, modelListDTO);
+        InsuredObjectDTO insuredObject = new InsuredObjectDTO(quoteInfoVo, carModelListDTO,carActualValueResponse);
         this.insuredObject = insuredObject;
         // 客户信息
         OwnerDTO owner = new OwnerDTO(quoteInfoVo.getOwnerInfo(), personAreaVo);
@@ -77,11 +77,14 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
             this.biContract = biContract;
         }
         // 意外险
-        InsDrivingIntentionInsurance ctQuoteAccidentVo = quoteVo.getAccidentalDrivingVo();
-        if(StringUtils.isNotBlank(ctQuoteAccidentVo.getProjectCode())){
-            AccContractDTO accContract = new AccContractDTO(quoteVo);
-            this.accContract = accContract;
+        if(!Objects.isNull(quoteVo.getAccidentalDrivingVo())){
+            InsDrivingIntentionInsurance ctQuoteAccidentVo = quoteVo.getAccidentalDrivingVo();
+            if(StringUtils.isNotBlank(ctQuoteAccidentVo.getProjectCode())){
+                AccContractDTO accContract = new AccContractDTO(quoteVo);
+                this.accContract = accContract;
+            }
         }
+
         this.handlerCode = parameters.getUserId();
 
     }
@@ -132,7 +135,7 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
 
             public ContractMainDTO(BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo){
                 InsDrivingIntentionInsurance ctQuoteAccidentVo = quoteVo.getAccidentalDrivingVo();
-                this.riskCode = ctQuoteAccidentVo.getRiskCode();
+                this.riskCode = "ct_1116";
                 this.renewalFlag = "0";
                 this.insPlan = ctQuoteAccidentVo.getProjectCode();
                 List<RiskInfoVo> riskList = quoteVo.getRisks();
@@ -171,20 +174,31 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
             private String shortRate;
 
             public static List<CoverageDTO> toCoverageList(InsDrivingIntentionInsurance ctQuoteAccidentVo) {
-                List<InsDrivingIntentionInsuranceSon> sons = ctQuoteAccidentVo.getInsDrivingIntentionInsuranceSon();
                 List<CoverageDTO> coverageDTOS = new ArrayList<>();
-                if (CollUtil.isNotEmpty(sons)){
-                    for (InsDrivingIntentionInsuranceSon son : sons) {
-                        CoverageDTO coverageDTO = new CoverageDTO();
-                        coverageDTO.setKindCode(son.getCode());
-                        coverageDTO.setIfMainKind("2");
-                        coverageDTO.setQuantity(0);
-                        coverageDTO.setCalculateFlag("1");
-                        coverageDTO.setShortRateType("2");
-                        coverageDTO.setShortRate("100");
-                        coverageDTOS.add(coverageDTO);
-                    }
-                }
+                CoverageDTO coverageDTO1 = new CoverageDTO();
+                coverageDTO1.setKindCode("ct_111601");
+                coverageDTO1.setIfMainKind("2");
+                coverageDTO1.setQuantity(0);
+                coverageDTO1.setCalculateFlag("1");
+                coverageDTO1.setShortRateType("2");
+                coverageDTO1.setShortRate("100");
+                coverageDTOS.add(coverageDTO1);
+                CoverageDTO coverageDTO2 = new CoverageDTO();
+                coverageDTO2.setKindCode("ct_111602");
+                coverageDTO2.setIfMainKind("2");
+                coverageDTO2.setQuantity(0);
+                coverageDTO2.setCalculateFlag("1");
+                coverageDTO2.setShortRateType("2");
+                coverageDTO2.setShortRate("100");
+                coverageDTOS.add(coverageDTO2);
+                CoverageDTO coverageDTO3 = new CoverageDTO();
+                coverageDTO3.setKindCode("ct_111603");
+                coverageDTO3.setIfMainKind("2");
+                coverageDTO3.setQuantity(0);
+                coverageDTO3.setCalculateFlag("1");
+                coverageDTO3.setShortRateType("2");
+                coverageDTO3.setShortRate("100");
+                coverageDTOS.add(coverageDTO3);
                 return coverageDTOS;
             }
         }
@@ -197,6 +211,8 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
         private ContractMainDTO contractMain;
         @JsonProperty("coverage")
         private List<CoverageDTO> coverage;
+        @JsonProperty("platFormMessage")
+        private PlatFormMessageDTO platFormMessage;
 
         public BiContractDTO(BaseQuoteInfoVo quoteInfoVo,BigDecimal actualValue){
             boolean isNewEnergy = quoteInfoVo.getCarInfo().isNewEnergy();
@@ -207,6 +223,77 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
             this.coverage = CoverageDTO.toCoverageList(isNewEnergy,quoteInfoVo,actualValue);
         }
 
+        @NoArgsConstructor
+        @Data
+        public static class PlatFormMessageDTO {
+//            @JsonProperty("scoreCode")
+//            private String scoreCode;
+//            @JsonProperty("lastPolicyQueryDate")
+//            private String lastPolicyQueryDate;
+//            @JsonProperty("insureYears")
+//            private String insureYears;
+//            @JsonProperty("ciCarKind")
+//            private String ciCarKind;
+//            @JsonProperty("peccancyAdjustCI")
+//            private String peccancyAdjustCI;
+//            @JsonProperty("lastPolicyExpireDate")
+//            private String lastPolicyExpireDate;
+//            @JsonProperty("noClaimAdjustReasonCodeBI")
+//            private String noClaimAdjustReasonCodeBI;
+//            @JsonProperty("modelEnergyType")
+//            private String modelEnergyType;
+//            @JsonProperty("noClaimAdjustReason")
+//            private String noClaimAdjustReason;
+//            @JsonProperty("score")
+//            private String score;
+//            @JsonProperty("queryDate")
+//            private String queryDate;
+//            @JsonProperty("claimAdjustReasonCodeBI")
+//            private String claimAdjustReasonCodeBI;
+//            @JsonProperty("ciModelCode")
+//            private String ciModelCode;
+//            @JsonProperty("lastPolicyEffectiveDate")
+//            private String lastPolicyEffectiveDate;
+//            @JsonProperty("unMatchLicenseNoMessage")
+//            private String unMatchLicenseNoMessage;
+//            @JsonProperty("lastReplacementValue")
+//            private String lastReplacementValue;
+//            @JsonProperty("expireDate")
+//            private String expireDate;
+//            @JsonProperty("repeatedMsg")
+//            private String repeatedMsg;
+            @JsonProperty("question")
+            private String question;
+//            @JsonProperty("noClaimAdjustReasonBI")
+//            private String noClaimAdjustReasonBI;
+//            @JsonProperty("nonClaimAdjust")
+//            private String nonClaimAdjust;
+            @JsonProperty("querySequenceNo")
+            private String querySequenceNo;
+//            @JsonProperty("noClaimAdjustReasonCodeCI")
+//            private String noClaimAdjustReasonCodeCI;
+//            @JsonProperty("lastModelCode")
+//            private String lastModelCode;
+//            @JsonProperty("claimAdjustReasonCodeCI")
+//            private String claimAdjustReasonCodeCI;
+//            @JsonProperty("lastModel")
+//            private String lastModel;
+            @JsonProperty("answer")
+            private String answer;
+//            @JsonProperty("claimCoeff")
+//            private String claimCoeff;
+//            @JsonProperty("claimAdjustLevel")
+//            private String claimAdjustLevel;
+//            @JsonProperty("peccancyAdjustReasonCI")
+//            private String peccancyAdjustReasonCI;
+            @JsonProperty("reinsuranceFlag")
+            private String reinsuranceFlag;
+//            @JsonProperty("claimTimes")
+//            private String claimTimes;
+//            @JsonProperty("rateFloatFlag")
+//            private String rateFloatFlag;
+        }
+
         @NoArgsConstructor
         @Data
         public static class ContractMainDTO {
@@ -228,6 +315,8 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
             private String validAtOnce;
             @JsonProperty("validDate")
             private String validDate;
+            @JsonProperty("expiryDate")
+            private String expiryDate;
 
             public ContractMainDTO(BaseQuoteInfoVo quoteInfoVo,boolean isNewEnergy){
                 if(isNewEnergy){
@@ -243,6 +332,7 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
                         this.validAtOnce = StringUtils.isBlank(riskInfoVo.getInstantFlag())
                                 || "0".equals(riskInfoVo.getInstantFlag()) ? "0" : "1"; // 及时起保
                         this.validDate =riskInfoVo.getStartDate();
+                        this.expiryDate = riskInfoVo.getEndDate();
                         this.renewalFlag = "0";
                     }
                 }
@@ -328,8 +418,8 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
 
         public InsuredObjectDTO(BaseQuoteInfoVo quoteInfoVo,
                                 CarInfoResponse.CarModelListDTO carModelListDTO,
-                                QueryCarActualValueResponse carActualValueResponse, CarInfoResponse.CarModelListDTO modelListDTO){
-            PolicyCarDTO policyCarDTO = new PolicyCarDTO(quoteInfoVo, carModelListDTO,carActualValueResponse,modelListDTO);
+                                QueryCarActualValueResponse carActualValueResponse){
+            PolicyCarDTO policyCarDTO = new PolicyCarDTO(quoteInfoVo, carModelListDTO,carActualValueResponse);
             this.policyCar = policyCarDTO;
 
             // 修理厂信息
@@ -419,8 +509,7 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
 
             public PolicyCarDTO(BaseQuoteInfoVo quoteInfoVo,
                                 CarInfoResponse.CarModelListDTO carModelListDTO,
-                                QueryCarActualValueResponse carActualValueResponse,
-                                CarInfoResponse.CarModelListDTO modelListDTO){
+                                QueryCarActualValueResponse carActualValueResponse){
                 CarInfoVo carInfo = quoteInfoVo.getCarInfo();
                 this.vin = carInfo.getFrameNo();
                 this.engine = carInfo.getEngineNo();
@@ -463,14 +552,14 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
                 this.carCheckStatus = "3";
                 this.carCheckReason = "1";
                 this.carCheckReasonName = "按期续保未增保损失险类";
-                if (Objects.isNull(modelListDTO.getDisplacement())){
+                if (Objects.isNull(carModelListDTO.getDisplacement())){
                     if(StringUtils.isBlank(carInfo.getEnginedesc())){
                         this.displacement = new BigDecimal(1);
                     }else{
                         this.displacement = new BigDecimal(carInfo.getEnginedesc()).multiply(new BigDecimal("1000"));
                     }
                 }else{
-                    this.displacement = modelListDTO.getDisplacement().multiply(new BigDecimal("1000"));
+                    this.displacement = carModelListDTO.getDisplacement().multiply(new BigDecimal("1000"));
                 }
                 this.exhaustScaleUnit = "ml";
                 this.approvedLoad = StringUtils.isBlank(carInfo.getLimitLoad()) ? new BigDecimal(0) : new BigDecimal(carInfo.getLimitLoad());
@@ -589,6 +678,8 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
         private List<CoverageDTO> coverage;
         @JsonProperty("tax")
         private TaxDTO tax;
+        @JsonProperty("platFormMessage")
+        private PlatFormMessageDTO platFormMessage;
 
         public CiContractDTO(BaseQuoteInfoVo quoteInfoVo){
             // 险种信息
@@ -599,6 +690,77 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
             this.tax = new TaxDTO(quoteInfoVo);
         }
 
+        @NoArgsConstructor
+        @Data
+        public static class PlatFormMessageDTO {
+//            @JsonProperty("scoreCode")
+//            private String scoreCode;
+//            @JsonProperty("lastPolicyQueryDate")
+//            private String lastPolicyQueryDate;
+//            @JsonProperty("insureYears")
+//            private String insureYears;
+//            @JsonProperty("ciCarKind")
+//            private String ciCarKind;
+//            @JsonProperty("peccancyAdjustCI")
+//            private String peccancyAdjustCI;
+//            @JsonProperty("lastPolicyExpireDate")
+//            private String lastPolicyExpireDate;
+//            @JsonProperty("noClaimAdjustReasonCodeBI")
+//            private String noClaimAdjustReasonCodeBI;
+//            @JsonProperty("modelEnergyType")
+//            private String modelEnergyType;
+//            @JsonProperty("noClaimAdjustReason")
+//            private String noClaimAdjustReason;
+//            @JsonProperty("score")
+//            private String score;
+//            @JsonProperty("queryDate")
+//            private String queryDate;
+//            @JsonProperty("claimAdjustReasonCodeBI")
+//            private String claimAdjustReasonCodeBI;
+//            @JsonProperty("ciModelCode")
+//            private String ciModelCode;
+//            @JsonProperty("lastPolicyEffectiveDate")
+//            private String lastPolicyEffectiveDate;
+//            @JsonProperty("unMatchLicenseNoMessage")
+//            private String unMatchLicenseNoMessage;
+//            @JsonProperty("lastReplacementValue")
+//            private String lastReplacementValue;
+//            @JsonProperty("expireDate")
+//            private String expireDate;
+//            @JsonProperty("repeatedMsg")
+//            private String repeatedMsg;
+            @JsonProperty("question")
+            private String question;
+//            @JsonProperty("noClaimAdjustReasonBI")
+//            private String noClaimAdjustReasonBI;
+//            @JsonProperty("nonClaimAdjust")
+//            private String nonClaimAdjust;
+            @JsonProperty("querySequenceNo")
+            private String querySequenceNo;
+//            @JsonProperty("noClaimAdjustReasonCodeCI")
+//            private String noClaimAdjustReasonCodeCI;
+//            @JsonProperty("lastModelCode")
+//            private String lastModelCode;
+//            @JsonProperty("claimAdjustReasonCodeCI")
+//            private String claimAdjustReasonCodeCI;
+//            @JsonProperty("lastModel")
+//            private String lastModel;
+            @JsonProperty("answer")
+            private String answer;
+//            @JsonProperty("claimCoeff")
+//            private String claimCoeff;
+//            @JsonProperty("claimAdjustLevel")
+//            private String claimAdjustLevel;
+//            @JsonProperty("peccancyAdjustReasonCI")
+//            private String peccancyAdjustReasonCI;
+            @JsonProperty("reinsuranceFlag")
+            private String reinsuranceFlag;
+//            @JsonProperty("claimTimes")
+//            private String claimTimes;
+//            @JsonProperty("rateFloatFlag")
+//            private String rateFloatFlag;
+        }
+
         @NoArgsConstructor
         @Data
         public static class ContractMainDTO {

+ 4 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/DownLoadDocumentUrlResponse.java

@@ -22,4 +22,8 @@ public class DownLoadDocumentUrlResponse extends ChengTaiBaseResponse{
     private String contractNoBi;
     @JsonProperty("contractNoCi")
     private String contractNoCi;
+    @JsonProperty("ahiDownLoad")
+    private String ahiDownLoad;
+
+
 }

+ 136 - 138
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/InsurePremiumResponse.java

@@ -1,5 +1,6 @@
 package com.ydtech.modules.order.entity.api.chengtai.response;
 
+import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ydtech.modules.ins.model.vo.AccidentResponseVo;
 import com.ydtech.modules.order.entity.InsDrivingIntentionInsurance;
@@ -8,134 +9,24 @@ import com.ydtech.utils.StringUtils;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 
 @NoArgsConstructor
 @Data
-public class InsurePremiumResponse extends ChengTaiBaseResponse{
-
+public class InsurePremiumResponse extends ChengTaiBaseResponse {
     @JsonProperty("orderId")
     private String orderId;
+    @JsonProperty("carRegistFlag")
+    private String carRegistFlag;
     @JsonProperty("biContract")
     private BiContractDTO biContract;
-//    @JsonProperty("insuredObject")
-//    private InsuredObjectDTO insuredObject;
-    @JsonProperty("ciContract")
-    private CiContractDTO ciContract;
     @JsonProperty("accContract")
     private AccContractDTO accContract;
-    @JsonProperty("carRegistFlag")
-    private String carRegistFlag;
-
-
-    @NoArgsConstructor
-    @Data
-    public static class AccContractDTO {
-        @JsonProperty("coverage")
-        private List<InsurePremiumResponse.AccContractDTO.CoverageDTO> coverage;
-        @JsonProperty("engage")
-        private List<InsurePremiumResponse.AccContractDTO.EngageDTO> engage;
-        @JsonProperty("contractMain")
-        private InsurePremiumResponse.AccContractDTO.ContractMainDTO contractMain;
-
-        public static List<AccidentResponseVo> toAccidentResponseVoList(AccContractDTO accContract, BaseQuoteVo<InsDrivingIntentionInsurance> quoteInfoVo) {
-            InsurePremiumResponse.AccContractDTO.ContractMainDTO contractMainDTO = accContract.getContractMain();
-            InsDrivingIntentionInsurance insDrivingIntentionInsurance = quoteInfoVo.getAccidentalDrivingVo();
-            List<AccidentResponseVo> accidentResponseVoList = new ArrayList<>();
-            AccidentResponseVo accidentResponseVo = new AccidentResponseVo();
-
-            accidentResponseVo.setProjectCode(quoteInfoVo.getAccidentalDrivingVo().getProjectCode());
-            if (StringUtils.isNotBlank(quoteInfoVo.getAccidentalDrivingVo().getProjectName())) {
-                accidentResponseVo.setProjectName(quoteInfoVo.getAccidentalDrivingVo().getProjectName());
-            }
-            accidentResponseVo.setPremium(contractMainDTO.getTotalPremium().toString());
-            accidentResponseVo.setQuantity("1");
-            accidentResponseVo.setActualPremium(contractMainDTO.getSumAmount().toString());
-            accidentResponseVoList.add(accidentResponseVo);
-            return accidentResponseVoList;
-        }
-
-        @NoArgsConstructor
-        @Data
-        public static class ContractMainDTO {
-            @JsonProperty("riskName")
-            private String riskName;
-            @JsonProperty("hopeDiscount")
-            private String hopeDiscount;
-            @JsonProperty("validDate")
-            private String validDate;
-            @JsonProperty("riskCode")
-            private String riskCode;
-            @JsonProperty("totalPremium")
-            private String totalPremium;
-            @JsonProperty("policyNo")
-            private String policyNo;
-            @JsonProperty("validAtOnce")
-            private String validAtOnce;
-            @JsonProperty("renewalFlag")
-            private String renewalFlag;
-            @JsonProperty("lastYearPolicyNo")
-            private String lastYearPolicyNo;
-            @JsonProperty("sumAmount")
-            private String sumAmount;
-            @JsonProperty("proposalNo")
-            private String proposalNo;
-            @JsonProperty("expiryDate")
-            private String expiryDate;
-            @JsonProperty("currency")
-            private String currency;
-        }
-
-        @NoArgsConstructor
-        @Data
-        public static class CoverageDTO {
-            @JsonProperty("glassClassName")
-            private String glassClassName;
-            @JsonProperty("amount")
-            private Integer amount;
-            @JsonProperty("kindCode")
-            private String kindCode;
-            @JsonProperty("quantity")
-            private String quantity;
-            @JsonProperty("validDate")
-            private String validDate;
-            @JsonProperty("coveragePremium")
-            private String coveragePremium;
-            @JsonProperty("glassClassCode")
-            private String glassClassCode;
-            @JsonProperty("calculateFlag")
-            private String calculateFlag;
-            @JsonProperty("expiryDate")
-            private String expiryDate;
-            @JsonProperty("ifMainKind")
-            private String ifMainKind;
-            @JsonProperty("deductible")
-            private String deductible;
-            @JsonProperty("kindName")
-            private String kindName;
-            @JsonProperty("unitAmount")
-            private String unitAmount;
-            @JsonProperty("currency")
-            private String currency;
-        }
-
-        @NoArgsConstructor
-        @Data
-        public static class EngageDTO {
-            @JsonProperty("engageDetail")
-            private String engageDetail;
-            @JsonProperty("modifyind")
-            private String modifyind;
-            @JsonProperty("engageCode")
-            private String engageCode;
-            @JsonProperty("engageTitle")
-            private String engageTitle;
-            @JsonProperty("chooseType")
-            private String chooseType;
-        }
-    }
+    @JsonProperty("insuredObject")
+    private InsuredObjectDTO insuredObject;
+    @JsonProperty("ciContract")
+    private CiContractDTO ciContract;
 
     @NoArgsConstructor
     @Data
@@ -150,10 +41,10 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse{
         private List<AdjustDTO> adjust;
         @JsonProperty("engage")
         private List<EngageDTO> engage;
-        @JsonProperty("chargingPileList")
-        private List<?> chargingPileList;
-        @JsonProperty("coveragePremium")
-        private List<CoveragePremiumDTO> coveragePremium;
+//        @JsonProperty("chargingPileList")
+//        private List<?> chargingPileList;
+//        @JsonProperty("coveragePremium")
+//        private List<CoveragePremiumDTO> coveragePremium;
         @JsonProperty("reInsureItem")
         private ReInsureItemDTO reInsureItem;
         @JsonProperty("contractMain")
@@ -166,6 +57,17 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse{
             private String entireInitialDiscount;
         }
 
+//        @NoArgsConstructor
+//        @Data
+//        public static class CoveragePremiumDTO {
+//            @JsonProperty("vehiclaCode")
+//            private String vehiclaCode;
+//            @JsonProperty("pureriskPremium")
+//            private String pureriskPremium;
+//            @JsonProperty("used")
+//            private String used;
+//        }
+
         @NoArgsConstructor
         @Data
         public static class PlatFormMessageDTO {
@@ -276,7 +178,7 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse{
             @JsonProperty("riskCode")
             private String riskCode;
             @JsonProperty("totalPremium")
-            private BigDecimal totalPremium;
+            private Double totalPremium;
             @JsonProperty("policyNo")
             private String policyNo;
             @JsonProperty("validAtOnce")
@@ -303,7 +205,7 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse{
             @JsonProperty("glassClassName")
             private String glassClassName;
             @JsonProperty("amount")
-            private Double amount;
+            private Integer amount;
             @JsonProperty("kindCode")
             private String kindCode;
             @JsonProperty("quantity")
@@ -311,7 +213,7 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse{
             @JsonProperty("validDate")
             private String validDate;
             @JsonProperty("coveragePremium")
-            private BigDecimal coveragePremium;
+            private Double coveragePremium;
             @JsonProperty("glassClassCode")
             private String glassClassCode;
             @JsonProperty("calculateFlag")
@@ -325,7 +227,7 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse{
             @JsonProperty("kindName")
             private String kindName;
             @JsonProperty("unitAmount")
-            private BigDecimal unitAmount;
+            private Double unitAmount;
             @JsonProperty("currency")
             private String currency;
         }
@@ -359,24 +261,120 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse{
             @JsonProperty("chooseType")
             private String chooseType;
         }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class AccContractDTO {
+        @JsonProperty("coverage")
+        private List<CoverageDTO> coverage;
+        @JsonProperty("engage")
+        private List<EngageDTO> engage;
+        @JsonProperty("contractMain")
+        private ContractMainDTO contractMain;
+
+        public static List<AccidentResponseVo> toAccidentResponseVoList(AccContractDTO accContract, BaseQuoteVo<InsDrivingIntentionInsurance> quoteInfoVo) {
+            InsurePremiumResponse.AccContractDTO.ContractMainDTO contractMainDTO = accContract.getContractMain();
+            InsDrivingIntentionInsurance insDrivingIntentionInsurance = quoteInfoVo.getAccidentalDrivingVo();
+            List<AccidentResponseVo> accidentResponseVoList = new ArrayList<>();
+            AccidentResponseVo accidentResponseVo = new AccidentResponseVo();
+
+            accidentResponseVo.setProjectCode(quoteInfoVo.getAccidentalDrivingVo().getProjectCode());
+            if (StringUtils.isNotBlank(quoteInfoVo.getAccidentalDrivingVo().getProjectName())) {
+                accidentResponseVo.setProjectName(quoteInfoVo.getAccidentalDrivingVo().getProjectName());
+            }
+            accidentResponseVo.setPremium(contractMainDTO.getTotalPremium().toString());
+            accidentResponseVo.setQuantity("1");
+            accidentResponseVo.setActualPremium(contractMainDTO.getSumAmount().toString());
+            accidentResponseVoList.add(accidentResponseVo);
+            return accidentResponseVoList;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class ContractMainDTO {
+            @JsonProperty("riskName")
+            private String riskName;
+            @JsonProperty("hopeDiscount")
+            private String hopeDiscount;
+            @JsonProperty("validDate")
+            private String validDate;
+            @JsonProperty("riskCode")
+            private String riskCode;
+            @JsonProperty("totalPremium")
+            private Double totalPremium;
+            @JsonProperty("policyNo")
+            private String policyNo;
+            @JsonProperty("validAtOnce")
+            private String validAtOnce;
+            @JsonProperty("renewalFlag")
+            private String renewalFlag;
+            @JsonProperty("lastYearPolicyNo")
+            private String lastYearPolicyNo;
+            @JsonProperty("sumAmount")
+            private String sumAmount;
+            @JsonProperty("proposalNo")
+            private String proposalNo;
+            @JsonProperty("expiryDate")
+            private String expiryDate;
+            @JsonProperty("currency")
+            private String currency;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class CoverageDTO {
+            @JsonProperty("glassClassName")
+            private String glassClassName;
+            @JsonProperty("amount")
+            private Integer amount;
+            @JsonProperty("kindCode")
+            private String kindCode;
+            @JsonProperty("quantity")
+            private String quantity;
+            @JsonProperty("validDate")
+            private String validDate;
+            @JsonProperty("coveragePremium")
+            private String coveragePremium;
+            @JsonProperty("glassClassCode")
+            private String glassClassCode;
+            @JsonProperty("calculateFlag")
+            private String calculateFlag;
+            @JsonProperty("expiryDate")
+            private String expiryDate;
+            @JsonProperty("ifMainKind")
+            private String ifMainKind;
+            @JsonProperty("deductible")
+            private String deductible;
+            @JsonProperty("kindName")
+            private String kindName;
+            @JsonProperty("unitAmount")
+            private String unitAmount;
+            @JsonProperty("currency")
+            private String currency;
+        }
 
         @NoArgsConstructor
         @Data
-        public static class CoveragePremiumDTO {
-            @JsonProperty("vehiclaCode")
-            private String vehiclaCode;
-            @JsonProperty("pureriskPremium")
-            private String pureriskPremium;
-            @JsonProperty("used")
-            private String used;
+        public static class EngageDTO {
+            @JsonProperty("engageDetail")
+            private String engageDetail;
+            @JsonProperty("modifyind")
+            private String modifyind;
+            @JsonProperty("engageCode")
+            private String engageCode;
+            @JsonProperty("engageTitle")
+            private String engageTitle;
+            @JsonProperty("chooseType")
+            private String chooseType;
         }
     }
 
     @NoArgsConstructor
     @Data
     public static class InsuredObjectDTO {
-        @JsonProperty("deviceList")
-        private List<?> deviceList;
+//        @JsonProperty("deviceList")
+//        private List<?> deviceList;
     }
 
     @NoArgsConstructor
@@ -475,9 +473,9 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse{
         @Data
         public static class TaxDTO {
             @JsonProperty("sumTax")
-            private BigDecimal sumTax;
+            private Double sumTax;
             @JsonProperty("sumOverdue")
-            private BigDecimal sumOverdue;
+            private Double sumOverdue;
             @JsonProperty("taxPayerIdentityNo")
             private String taxPayerIdentityNo;
             @JsonProperty("documentNumber")
@@ -485,7 +483,7 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse{
             @JsonProperty("taxPayerName")
             private String taxPayerName;
             @JsonProperty("annualTaxDue")
-            private BigDecimal annualTaxDue;
+            private Double annualTaxDue;
             @JsonProperty("noTaxReasonCode")
             private String noTaxReasonCode;
             @JsonProperty("sumTaxDefault")
@@ -542,7 +540,7 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse{
             @JsonProperty("riskCode")
             private String riskCode;
             @JsonProperty("totalPremium")
-            private BigDecimal totalPremium;
+            private Double totalPremium;
             @JsonProperty("policyNo")
             private String policyNo;
             @JsonProperty("validAtOnce")

+ 5 - 0
src/main/java/com/ydtech/modules/order/entity/api/yangguang/constants/ImageTypeEnum.java

@@ -35,6 +35,11 @@ public enum ImageTypeEnum {
     ITE_14("14","行驶证",new String[]{
             InsuranceImageEnum.C01.getCode(),
             InsuranceImageEnum.D01.getCode()
+    }),
+    ITE_18("18","营业执照",new String[]{
+            InsuranceImageEnum.Y02.getCode(),
+            InsuranceImageEnum.Y03.getCode(),
+            InsuranceImageEnum.Y04.getCode()
     });
 
     private final String code;

+ 20 - 7
src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangAccuracyCalculateRequest.java

@@ -14,6 +14,7 @@ import com.ydtech.modules.order.entity.api.yangguang.response.YangGuangQueryVehi
 import com.ydtech.modules.order.entity.api.yangguang.constants.YgUseNatureCode;
 import com.ydtech.modules.order.entity.config.YangGuangConfigureParameters;
 import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
+import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import com.ydtech.modules.order.entity.vo.VehicleAndVesselTax;
 import com.ydtech.modules.order.entity.vo.yangguang.YgQuoteAccidentVo;
 import lombok.*;
@@ -55,6 +56,12 @@ public class YangGuangAccuracyCalculateRequest extends YangGuangBaseRequest{
     @JSONField(name = "InfotransNo")
     private String InfotransNo;
 
+    /**
+     * 自主系数
+     */
+    @JSONField(name = "UnderWritingRate")
+    private String UnderWritingRate;
+
     /**
      * 车辆信息ID号
      */
@@ -216,9 +223,10 @@ public class YangGuangAccuracyCalculateRequest extends YangGuangBaseRequest{
                                              YangGuangQueryVehicleModelResponse.carmodellist carmodellist,
                                              RiskInfoVo riskInfoVo, String startDate,
                                              YangGuangConfigureParameters ygConfigureParameters,
-                                             List<YgQuoteAccidentVo> accidentVo) {
+                                             BaseQuoteVo<List<YgQuoteAccidentVo>> quoteVo) {
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     this.RequestNo = "accuracyCalculate";
+    this.UnderWritingRate = quoteVo.getCoefficient();
     this.ComCode = ygConfigureParameters.getComCode();
     this.HandlerCode = ygConfigureParameters.getHandlerCode();
     this.TongxinNo = ygConfigureParameters.getTongxinNo() == null ? "" : ygConfigureParameters.getTongxinNo();
@@ -274,8 +282,8 @@ public class YangGuangAccuracyCalculateRequest extends YangGuangBaseRequest{
     this.itemcar = new ItemCarInfoDTO(quoteInfoVo.getCarInfo(),carmodellist);
     this.kindList = ItemKindListDTO.toItemKindListDTOList(actualValue, quoteInfoVo.getKindList(),
                 Integer.parseInt(quoteInfoVo.getCarInfo().getSeatCount()) - 1, quoteInfoVo.getCarInfo().isNewEnergy());
-    if (ArrayUtil.isNotEmpty(accidentVo) && accidentVo.size() > 0) {
-        this.NonVehicleProductInformationList = accidentVo.stream().map(NonVehicleProductInformationListDTO::new).collect(Collectors.toList());
+    if (ArrayUtil.isNotEmpty(quoteVo.getAccidentalDrivingVo()) && quoteVo.getAccidentalDrivingVo().size() > 0) {
+        this.NonVehicleProductInformationList = quoteVo.getAccidentalDrivingVo().stream().map(NonVehicleProductInformationListDTO::new).collect(Collectors.toList());
         this.CasualtyFlag = "1";
     }
     this.carshipyTaxInfo = new CarshipyTaxInfoDTO(quoteInfoVo.getVehicleAndVesselTax(),riskInfoVo);
@@ -483,13 +491,18 @@ public class YangGuangAccuracyCalculateRequest extends YangGuangBaseRequest{
             this.IdentifyNumber = customerInfoVo.getIdentifyNumber();
             if (carInfoVo.getProperty() != null && carInfoVo.getProperty().equals("1")) {
                 this.InsuredType = "0";
+                this.IdentifyType = "01";
+                this.CarInsuredRelation = "1";
             } else if (carInfoVo.getProperty() != null && carInfoVo.getProperty().equals("2")) {
-                this.InsuredType = "1";
-            } else if (carInfoVo.getProperty() != null && carInfoVo.getProperty().equals("3")) {
+                this.IdentifyType = "09";
                 this.InsuredType = "2";
+                this.CarInsuredRelation = "1";
+            } else if (carInfoVo.getProperty() != null && carInfoVo.getProperty().equals("3")) {
+                this.InsuredType = "1";
+                this.IdentifyType = "99";
+                this.CarInsuredRelation = "3";
             }
-            this.IdentifyType = "01";
-            this.CarInsuredRelation = "1";
+
         }
     }
 

+ 13 - 8
src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangUpLoadRequest.java

@@ -23,9 +23,9 @@ public class YangGuangUpLoadRequest extends YangGuangBaseRequest{
     @JSONField(name = "Body")
     private Body Body;
 
-    public YangGuangUpLoadRequest(String InfotransNo, InsTaskImagesBase64 insTaskImagesBase64, YangGuangConfigureParameters parameters, InsUploadFiles insUploadFiles) {
+    public YangGuangUpLoadRequest(String InfotransNo, InsTaskImagesBase64 insTaskImagesBase64, YangGuangConfigureParameters parameters, InsUploadFiles insUploadFiles,String apiUrl) {
         this.Head = new Head();
-        this.Body = new Body(InfotransNo,insTaskImagesBase64, parameters,insUploadFiles);
+        this.Body = new Body(InfotransNo,insTaskImagesBase64, parameters,insUploadFiles,apiUrl);
     }
 
     @Data
@@ -51,8 +51,8 @@ public class YangGuangUpLoadRequest extends YangGuangBaseRequest{
         @JSONField(name = "imageInfo")
         private imageInfo imageInfo;
 
-        public Body(String InfotransNo,InsTaskImagesBase64 insTaskImagesBase64, YangGuangConfigureParameters parameters,InsUploadFiles insUploadFiles) {
-           this.imageInfo = new imageInfo(InfotransNo, insTaskImagesBase64, parameters,insUploadFiles);
+        public Body(String InfotransNo,InsTaskImagesBase64 insTaskImagesBase64, YangGuangConfigureParameters parameters,InsUploadFiles insUploadFiles,String apiUrl) {
+           this.imageInfo = new imageInfo(InfotransNo, insTaskImagesBase64, parameters,insUploadFiles,apiUrl);
         }
         @Data
         public static class imageInfo implements Serializable {
@@ -83,13 +83,13 @@ public class YangGuangUpLoadRequest extends YangGuangBaseRequest{
             @JSONField(name = "insuranceImageList")
             private List<insuranceImageList> insuranceImageList;
 
-            public imageInfo(String InfotransNo,InsTaskImagesBase64 insTaskImagesBase64, YangGuangConfigureParameters parameters, InsUploadFiles insUploadFiles) {
+            public imageInfo(String InfotransNo,InsTaskImagesBase64 insTaskImagesBase64, YangGuangConfigureParameters parameters, InsUploadFiles insUploadFiles,String apiUrl) {
                 this.caseNo = InfotransNo;
                 this.appCode = "CARAPPLY";
                 this.caseSource = "0";
                 this.fileServer = "0";
                 this.ifNationwideQuick = "0";
-                this.insuranceImageList = Arrays.asList(new insuranceImageList(insTaskImagesBase64,parameters,insUploadFiles));
+                this.insuranceImageList = Arrays.asList(new insuranceImageList(insTaskImagesBase64,parameters,insUploadFiles,apiUrl));
             }
 
             @NoArgsConstructor
@@ -134,9 +134,9 @@ public class YangGuangUpLoadRequest extends YangGuangBaseRequest{
                 @JSONField(name = "exifInfo")
                 private String exifInfo;
 
-                public insuranceImageList(InsTaskImagesBase64 insTaskImagesBase64, YangGuangConfigureParameters parameters, InsUploadFiles insUploadFiles) {
+                public insuranceImageList(InsTaskImagesBase64 insTaskImagesBase64, YangGuangConfigureParameters parameters, InsUploadFiles insUploadFiles, String apiUrl) {
                     String suffix = insTaskImagesBase64.getFileName().substring(insTaskImagesBase64.getFileName().lastIndexOf("."));
-                    this.imageUrl = "https://test.baoxianzhanggui.com/web-api" + insUploadFiles.getUrl();
+                    this.imageUrl = apiUrl + insUploadFiles.getUrl();
                     this.imageType = "01";
                     this.referer = "SXJZG";
                     this.userNo = parameters.getHandlerCode();
@@ -159,6 +159,11 @@ public class YangGuangUpLoadRequest extends YangGuangBaseRequest{
                                     || InsuranceImageEnum.D04.getCode().equals(this.videoType))
                             {
                                 this.videoType = "12";
+                            } else if (InsuranceImageEnum.Y02.getCode().equals(this.videoType)
+                                    || InsuranceImageEnum.Y03.getCode().equals(this.videoType)
+                                    || InsuranceImageEnum.Y04.getCode().equals(this.videoType))
+                            {
+                                this.videoType = "18";
                             }
                             break;
                         }

+ 7 - 0
src/main/java/com/ydtech/modules/order/entity/api/yangguang/response/YangGuangAccuracyCalculateResponse.java

@@ -140,6 +140,13 @@ public class YangGuangAccuracyCalculateResponse extends YangGuangBaseResponse{
     @JSONField(name = "DeviceValue")
     private String DeviceValue;
 
+
+    /**
+     *  合并经营成本率
+     */
+    @JSONField(name = "vascostmarginbc")
+    private String vascostmarginbc;
+
     /**
      *  商业险重复投保提示
      */

+ 13 - 0
src/main/java/com/ydtech/modules/order/service/InsAreaCompanyRelatedInfoService.java

@@ -0,0 +1,13 @@
+package com.ydtech.modules.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydtech.modules.order.entity.InsAreaCompanyRelatedInfo;
+
+/**
+* @author dongxin
+* @description 针对表【ins_area_company_related_info(子订单关联信息表)】的数据库操作Service
+* @createDate 2024-11-29 15:26:49
+*/
+public interface InsAreaCompanyRelatedInfoService extends IService<InsAreaCompanyRelatedInfo> {
+
+}

+ 273 - 37
src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java

@@ -1,9 +1,13 @@
 package com.ydtech.modules.order.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ydtech.constants.enums.InsuranceOrderPdf;
 import com.ydtech.constants.enums.InsuranceRisk;
 import com.ydtech.constants.enums.dict.InsOrderStatusEnum;
@@ -14,7 +18,9 @@ import com.ydtech.modules.admin.service.SysAreaService;
 import com.ydtech.modules.ins.model.vo.*;
 import com.ydtech.modules.order.components.ConfigureParametersComponents;
 import com.ydtech.modules.order.components.InsImagesUploadCacheComponents;
+import com.ydtech.modules.order.components.VerificationCodeIdentification;
 import com.ydtech.modules.order.components.chengtai.ChengTaiRequestApiComponents;
+import com.ydtech.modules.order.components.gouren.GuorenDuplicateInsuranceComponent;
 import com.ydtech.modules.order.constants.UnderwritingStatus;
 import com.ydtech.modules.order.entity.*;
 import com.ydtech.modules.order.entity.api.chengtai.constants.CtKindCodeEnum;
@@ -23,7 +29,10 @@ import com.ydtech.modules.order.entity.api.chengtai.constants.ResponseCode;
 import com.ydtech.modules.order.entity.api.chengtai.constants.RiskCodeEnum;
 import com.ydtech.modules.order.entity.api.chengtai.request.*;
 import com.ydtech.modules.order.entity.api.chengtai.response.*;
+import com.ydtech.modules.order.entity.api.zijin.request.CalculatePremiumRequest;
 import com.ydtech.modules.order.entity.config.ChengTaiConfigureParameters;
+import com.ydtech.modules.order.entity.crawler.request.RecognitionRequest;
+import com.ydtech.modules.order.entity.crawler.response.RecognitionResponse;
 import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
 import com.ydtech.modules.order.entity.filter.CarModelsFilterUtils;
 import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
@@ -33,15 +42,15 @@ import com.ydtech.modules.order.entity.vo.PolicyPrintVo;
 import com.ydtech.modules.order.service.*;
 import com.ydtech.modules.protocol.entity.po.PtlAgreementAttribution;
 import com.ydtech.modules.protocol.service.PtlAgreementAttributionService;
-import com.ydtech.utils.CalculateUtils;
-import com.ydtech.utils.StringUtils;
+import com.ydtech.utils.*;
 import com.ydtech.utils.baidu.FileUtil;
+import lombok.Data;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 
-import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
@@ -66,6 +75,9 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
     @Autowired
     private InsAreaCompanyService insAreaCompanyService;
 
+    @Autowired
+    private InsAreaCompanyRelatedInfoService insAreaCompanyRelatedInfoService;
+
     @Autowired
     private InsTaskImagesService insTaskImagesService;
 
@@ -97,7 +109,6 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         ChengTaiConfigureParameters parameters = configureParametersComponents.toEntity(ChengTaiConfigureParameters.class,
                 ptlAgreementAttribution);
         HttpHeaders httpHeaders = chengTaiRequestApiComponents.getHttpHeaders(parameters,ChengTaiRequestApiComponents.RECURSIVE_HIERARCHY);
-
         /** 2. 查询车型 */
         CarInfoRequest carInfoRequest = new CarInfoRequest(quoteInfoVo.getCarInfo(), parameters);
         CarInfoResponse carInfoResponse = chengTaiRequestApiComponents.carinfoQuery(carInfoRequest, httpHeaders);
@@ -112,8 +123,10 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         /** 4. 报价 */
         PersonAreaVo personAreaVo = new PersonAreaVo();
         buildRegion(quoteInfoVo,personAreaVo);
-        InsurePremiumRequest insurePremiumRequest = new InsurePremiumRequest(quoteInfoVo,carModelListDTO, carActualValueResponse,personAreaVo,parameters,quoteVo, carModelListDTO);
-        InsurePremiumResponse insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+        InsurePremiumRequest insurePremiumRequest = new InsurePremiumRequest(quoteInfoVo,carModelListDTO, carActualValueResponse,personAreaVo,parameters,quoteVo);
+
+        // 重复报价
+        InsurePremiumResponse insurePremiumResponse = this.getResponse(insurePremiumRequest, httpHeaders);
 
         String message = "";
         if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode())){
@@ -149,6 +162,199 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         return responseOrder(insurePremiumResponse, quoteRespVo, ptlAgreementAttribution, insurePremiumResponse.getOrderId());
     }
 
+    /**
+     * 重复报价
+     * @param insurePremiumRequest
+     * @param httpHeaders
+     * @return
+     */
+    private InsurePremiumResponse getResponse(InsurePremiumRequest insurePremiumRequest, HttpHeaders httpHeaders) throws Exception {
+        InsurePremiumResponse insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+        if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode()) && insurePremiumResponse.getMessage().contains("重复投保")){
+            // 交强险 商业险 重复投保处理
+            this.repetitionInsure(insurePremiumResponse,insurePremiumRequest);
+            insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+        }
+
+        // 转保车处理
+        InsurePremiumResponse.BiContractDTO biContract = insurePremiumResponse.getBiContract();
+        InsurePremiumResponse.CiContractDTO ciContract = insurePremiumResponse.getCiContract();
+        Double biTotalPremium = null;
+        Double ciTotalPremium = null;
+        Boolean biBoo = false;
+        Boolean ciBoo = false;
+        if(Objects.nonNull(biContract)){
+            biTotalPremium = biContract.getContractMain().getTotalPremium();
+            if(Objects.isNull(biTotalPremium)){
+                biBoo = true;
+            }
+        }
+        if(Objects.nonNull(ciContract)){
+            ciTotalPremium = ciContract.getContractMain().getTotalPremium();
+            if(Objects.isNull(ciTotalPremium)){
+                ciBoo = true;
+            }
+        }
+        if (biBoo || ciBoo) {
+            this.platRepetition(biContract,ciContract,insurePremiumRequest);
+            insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+        }
+
+        if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode()) && insurePremiumResponse.getMessage().contains("录入的校验码有误")){
+            this.replaceByte(insurePremiumRequest);
+            insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+        }
+        return insurePremiumResponse;
+    }
+
+    /**
+     * 错误字符替换
+     * @param insurePremiumRequest
+     */
+    private void replaceByte(InsurePremiumRequest insurePremiumRequest) {
+        InsurePremiumRequest.CiContractDTO ciContractReq = insurePremiumRequest.getCiContract();
+        InsurePremiumRequest.BiContractDTO biContractReq = insurePremiumRequest.getBiContract();
+        if(Objects.nonNull(ciContractReq)){
+            InsurePremiumRequest.CiContractDTO.PlatFormMessageDTO platFormMessageDTO = ciContractReq.getPlatFormMessage();
+            platFormMessageDTO.setAnswer(replacingStrings(platFormMessageDTO.getAnswer()));
+        }
+        if(Objects.nonNull(biContractReq)){
+            InsurePremiumRequest.BiContractDTO.PlatFormMessageDTO platFormMessageDTO = biContractReq.getPlatFormMessage();
+            platFormMessageDTO.setAnswer(replacingStrings(platFormMessageDTO.getAnswer()));
+        }
+    }
+
+    public static String replacingStrings(String code) {
+        if (StringUtils.isEmpty(code)) {
+            return code;
+        }
+        if (code.length() > 4) {
+            return code.substring(code.length() - 4);
+        }
+        return code
+                .replace("3", "j")
+                .replace("0", "o");
+    }
+    /**
+     * 转保车处理
+     * @param biContract
+     * @param ciContract
+     * @param insurePremiumRequest
+     */
+    private void platRepetition(InsurePremiumResponse.BiContractDTO biContract, InsurePremiumResponse.CiContractDTO ciContract, InsurePremiumRequest insurePremiumRequest) {
+        String jqImageStr = null;
+        String syImageStr = null;
+
+        //交强险
+        if (Objects.nonNull(ciContract)) {
+            jqImageStr = ciContract.getPlatFormMessage().getQuestion();
+        }
+        //商业险
+        if (Objects.nonNull(biContract)) {
+            syImageStr = biContract.getPlatFormMessage().getQuestion();
+        }
+        Map<String, String> bodyMap = new HashMap<>();
+        bodyMap.put("jqImage", com.ydtech.utils.StringUtils.toString(jqImageStr, ""));
+        bodyMap.put("syImage", com.ydtech.utils.StringUtils.toString(syImageStr, ""));
+        String sendBody = JsonUtils.toJson(bodyMap);
+        String ocrStr = HttpUtil.sendPost("http://39.98.41.104:8088/getres", sendBody);
+        CheckCodeResp resp = JSONUtil.toBean(ocrStr, CheckCodeResp.class);
+
+        if(Objects.nonNull(ciContract)){
+            InsurePremiumRequest.CiContractDTO ciContractReq = insurePremiumRequest.getCiContract();
+            InsurePremiumRequest.CiContractDTO.PlatFormMessageDTO platFormMessage = ciContractReq.getPlatFormMessage();
+            if(Objects.isNull(platFormMessage)){
+                platFormMessage = new InsurePremiumRequest.CiContractDTO.PlatFormMessageDTO();
+            }
+            BeanUtils.copyProperties(ciContract.getPlatFormMessage(), platFormMessage);
+            platFormMessage.setAnswer(resp.jqImageCode);
+            ciContractReq.setPlatFormMessage(platFormMessage);
+            insurePremiumRequest.setCiContract(ciContractReq);
+        }
+        if(Objects.nonNull(biContract)){
+            InsurePremiumRequest.BiContractDTO biContractReq = insurePremiumRequest.getBiContract();
+            InsurePremiumRequest.BiContractDTO.PlatFormMessageDTO platFormMessage = biContractReq.getPlatFormMessage();
+            if(Objects.isNull(platFormMessage)){
+                platFormMessage = new InsurePremiumRequest.BiContractDTO.PlatFormMessageDTO();
+            }
+            BeanUtils.copyProperties(biContract.getPlatFormMessage(), platFormMessage);
+            platFormMessage.setAnswer(resp.syImageCode);
+            biContractReq.setPlatFormMessage(platFormMessage);
+            insurePremiumRequest.setBiContract(biContractReq);
+        }
+    }
+
+    /**
+     * 重复投保时间处理
+     *
+     * @param insurePremiumResponse
+     * @param insurePremiumRequest
+     */
+    private void repetitionInsure(InsurePremiumResponse insurePremiumResponse, InsurePremiumRequest insurePremiumRequest) {
+        String err = insurePremiumResponse.getMessage();
+        List<String> errList = Arrays.asList(err.split("。"));
+        if(CollUtil.isEmpty(errList)){ return; }
+
+        // 定义时间格式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+        errList.stream().forEach(a ->{
+            if (a.contains("交强险平台") && a.contains("重复投保")){
+                InsurePremiumRequest.CiContractDTO ciContract = insurePremiumRequest.getCiContract();
+                InsurePremiumRequest.CiContractDTO.ContractMainDTO contractMain = ciContract.getContractMain();
+
+                LocalDateTime dateTime = null;
+                if(a.contains("终保日期")){
+                    String startTime = a.substring(a.indexOf("终保日期")+5,a.indexOf("终保日期")+21);
+                    // 解析原始时间
+                    dateTime =  LocalDateTime.parse(startTime, formatter1);
+                }else{
+                    String startTime = contractMain.getExpiryDate();
+                    // 解析原始时间
+                    dateTime = LocalDateTime.parse(startTime, formatter);
+                }
+                LocalDateTime tomorrowMidnight = dateTime;
+                //判断是否是整点  如果是整点则不进行明天的零点操作
+                if(dateTime.getHour() != 0 || dateTime.getMinute() != 0 || dateTime.getSecond() != 0)
+                {
+                    tomorrowMidnight = dateTime.toLocalDate().plusDays(1).atStartOfDay();
+                }
+                LocalDateTime end = tomorrowMidnight.plusYears(1L);
+                contractMain.setValidDate(DateTimeUtil.format(tomorrowMidnight, DateTimeUtil.DATETIME_PATTERN));
+                LocalDateTime localDateTime = end.minusSeconds(1L);
+                contractMain.setExpiryDate(DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN));
+                ciContract.setContractMain(contractMain);
+                insurePremiumRequest.setCiContract(ciContract);
+            }
+            if (a.contains("商业险险平台") && a.contains("重复投保")){
+                InsurePremiumRequest.BiContractDTO biContract = insurePremiumRequest.getBiContract();
+                InsurePremiumRequest.BiContractDTO.ContractMainDTO contractMain = biContract.getContractMain();
+                LocalDateTime dateTime = null;
+                if(a.contains("终保日期")){
+                    String startTime = a.substring(a.indexOf("终保日期")+5,a.indexOf("终保日期")+21);
+                    // 解析原始时间
+                    dateTime =  LocalDateTime.parse(startTime, formatter1);
+                }else{
+                    String startTime = contractMain.getExpiryDate();
+                    // 解析原始时间
+                    dateTime = LocalDateTime.parse(startTime, formatter);
+                }
+                LocalDateTime tomorrowMidnight = dateTime;
+                //判断是否是整点  如果是整点则不进行明天的零点操作
+                if(dateTime.getHour() != 0 || dateTime.getMinute() != 0 || dateTime.getSecond() != 0)
+                {
+                    tomorrowMidnight = dateTime.toLocalDate().plusDays(1).atStartOfDay();
+                }
+                LocalDateTime end = tomorrowMidnight.plusYears(1L);
+                contractMain.setValidDate(DateTimeUtil.format(tomorrowMidnight, DateTimeUtil.DATETIME_PATTERN));
+                LocalDateTime localDateTime = end.minusSeconds(1L);
+                contractMain.setExpiryDate(DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN));
+                biContract.setContractMain(contractMain);
+                insurePremiumRequest.setBiContract(biContract);
+            }
+        });
+    }
+
     private HttpResult<QuoteRespVo> responseOrder(InsurePremiumResponse insurePremiumResponse, QuoteRespVo quoteRespVo, PtlAgreementAttribution ptlAgreementAttribution, String orderId) {
         // 保存订单信息
         InsAreaCompany insAreaCompany = new InsAreaCompany(quoteRespVo, ptlAgreementAttribution);
@@ -161,8 +367,8 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         if(Objects.nonNull(insurePremiumResponse.getCiContract())){
             if(Objects.nonNull(insurePremiumResponse.getCiContract().getTax())){
                 InsurePremiumResponse.CiContractDTO.TaxDTO taxDTO = insurePremiumResponse.getCiContract().getTax();
-                TaxArrears taxArrears = new TaxArrears("往年欠税", taxDTO.getAnnualTaxDue().doubleValue(),
-                        taxDTO.getSumOverdue().doubleValue());
+                TaxArrears taxArrears = new TaxArrears("往年欠税", taxDTO.getAnnualTaxDue(),
+                        taxDTO.getSumOverdue());
                 List<TaxArrears> taxArrearsList = Collections.singletonList(taxArrears);
                 insAreaCompany.setTaxArrears(JSON.parseArray(JSON.toJSONString(taxArrearsList)));
 
@@ -172,17 +378,19 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         List<InsAreaCompanyAccidentalDriving> insAreaCompanyAccidentalDrivings = new ArrayList<>();
         accident.forEach(accidentalDriving -> {
             InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving = new InsAreaCompanyAccidentalDriving();
-            insAreaCompanyAccidentalDriving.setCompanyId(insAreaCompany.getCompanyId());
+            insAreaCompanyAccidentalDriving.setCompanyId(insAreaCompany.getId());
             insAreaCompanyAccidentalDriving.setQuantity(Integer.parseInt(accidentalDriving.getQuantity()));
             insAreaCompanyAccidentalDriving.setRideRiskCode(accidentalDriving.getProjectCode());
             insAreaCompanyAccidentalDriving.setRideRiskName(accidentalDriving.getProjectName());
             insAreaCompanyAccidentalDrivings.add(insAreaCompanyAccidentalDriving);
         });
-
-        // 特约
-        insAreaCompany.setJqappoint(quoteRespVo.getJqappoint());
-        insAreaCompany.setSyappoint(quoteRespVo.getSyappoint());
         insAreaCompanyService.insertCompanyAndOrders(insAreaCompany, insAreaCompanyAccidentalDrivings);
+        // 保存交强特约信息
+        InsAreaCompanyRelatedInfo info = new InsAreaCompanyRelatedInfo();
+        info.setCompanyId(insAreaCompany.getId());
+        info.setJqappoint(quoteRespVo.getJqappoint());
+        info.setSyappoint(quoteRespVo.getSyappoint());
+        insAreaCompanyRelatedInfoService.save(info);
         quoteRespVo.setCompanyId(insAreaCompany.getId());
         return HttpResult.ok("报价成功", quoteRespVo);
 
@@ -199,17 +407,17 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         // 交强
         if(Objects.nonNull(insurePremiumResponse.getCiContract())){
             InsurePremiumResponse.CiContractDTO.ContractMainDTO ciContractMain = insurePremiumResponse.getCiContract().getContractMain();
-            jqPremium = ciContractMain.getTotalPremium().doubleValue();
+            jqPremium = ciContractMain.getTotalPremium();
             quoteRespVo.setStartDateJq(ciContractMain.getValidDate());
             quoteRespVo.setEndDateJq(ciContractMain.getExpiryDate());
             //车船税
             InsurePremiumResponse.CiContractDTO.TaxDTO taxDTO = insurePremiumResponse.getCiContract().getTax();
-            sumPayTax = taxDTO.getSumTax().doubleValue();
+            sumPayTax = taxDTO.getSumTax();
         }
         //商业
         if(Objects.nonNull(insurePremiumResponse.getBiContract())){
             InsurePremiumResponse.BiContractDTO.ContractMainDTO biContractMain = insurePremiumResponse.getBiContract().getContractMain();
-            syPremium = biContractMain.getTotalPremium().doubleValue();
+            syPremium = biContractMain.getTotalPremium();
             quoteRespVo.setStartDateSy(biContractMain.getValidDate());
             quoteRespVo.setEndDateSy(biContractMain.getExpiryDate());
         }
@@ -220,7 +428,7 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
                     InsurePremiumResponse.AccContractDTO.toAccidentResponseVoList(accContract,quoteVo);
             quoteRespVo.setAccident(accidentResponseVos);
             // 驾意险价格
-            jyPremium = Double.parseDouble(accContract.getContractMain().getTotalPremium());
+            jyPremium = accContract.getContractMain().getTotalPremium();
         }
 
         List<QuoteKindRespVo> kindList1 = new ArrayList<>();
@@ -245,8 +453,8 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
                 CtKindCodeEnum ctKindCodeEnum = Enum.valueOf(CtKindCodeEnum.class, kindInfoVo.getKindCode());
                 InsurePremiumResponse.BiContractDTO.CoverageDTO coverageDTO = coverage.stream().filter(a -> a.getKindCode().equals(ctKindCodeEnum.getCode())).collect(Collectors.toList()).get(0);
                 kind.setAmount(coverageDTO.getAmount().doubleValue());
-                kind.setCoveragePremium(coverageDTO.getCoveragePremium().doubleValue());
-                kind.setUnitAmount(coverageDTO.getUnitAmount() != null ? coverageDTO.getUnitAmount().doubleValue() : 0);
+                kind.setCoveragePremium(coverageDTO.getCoveragePremium());
+                kind.setUnitAmount(Objects.isNull(coverageDTO.getUnitAmount()) ? 0 : coverageDTO.getUnitAmount() );
                 kind.setServiceTimes(coverageDTO.getQuantity());
                 if (!ObjectUtils.isEmpty(kindInfoVo.getDeductibleRate())) {
                     kind.setDeductibleRate(Double.parseDouble(kindInfoVo.getDeductibleRate()));
@@ -385,6 +593,9 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
     public HttpResult<Object> audit(String companyId) throws Exception {
         InsAreaCompany insAreaCompany = insAreaCompanyService.getByIdIsExist(companyId);
         InsOrders insOrders = insOrdersService.getById(insAreaCompany.getOrderno());
+        LambdaQueryWrapper<InsAreaCompanyRelatedInfo> infoLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        infoLambdaQueryWrapper.eq(InsAreaCompanyRelatedInfo::getCompanyId, insAreaCompany.getId());
+        List<InsAreaCompanyRelatedInfo> infoList = insAreaCompanyRelatedInfoService.list(infoLambdaQueryWrapper);
         // 1 通过 协议id获取配置实体
         PtlAgreementAttribution ptlAgreementAttribution = ptlAgreementAttributionService.getById(insAreaCompany.getAgreementId());
         ChengTaiConfigureParameters parameters = configureParametersComponents.toEntity(ChengTaiConfigureParameters.class,
@@ -398,25 +609,27 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
 
         List<SubmitVerifyRequest.EngageListDTO> engageDTO = new ArrayList<>();
         // 获取特约
-        List<SubmitVerifyRequest.EngageListDTO> ciEngageDTO = JSON.parseArray(insAreaCompany.getJqappoint(),
-                SubmitVerifyRequest.EngageListDTO.class);
-        if(CollUtil.isNotEmpty(ciEngageDTO)){
-            for (SubmitVerifyRequest.EngageListDTO engageListDTO : ciEngageDTO) {
-                engageListDTO.setRiskCode(RiskCodeEnum.R1002.getCode());
+        if (CollUtil.isNotEmpty(infoList)){
+            List<SubmitVerifyRequest.EngageListDTO> ciEngageDTO = JSON.parseArray(infoList.get(0).getJqappoint(),
+                    SubmitVerifyRequest.EngageListDTO.class);
+            if(CollUtil.isNotEmpty(ciEngageDTO)){
+                for (SubmitVerifyRequest.EngageListDTO engageListDTO : ciEngageDTO) {
+                    engageListDTO.setRiskCode(RiskCodeEnum.R1002.getCode());
+                }
             }
-        }
-        List<SubmitVerifyRequest.EngageListDTO> biEngageDTO = JSON.parseArray(insAreaCompany.getSyappoint(),
-                SubmitVerifyRequest.EngageListDTO.class);
-        if(CollUtil.isNotEmpty(biEngageDTO)){
-            for (SubmitVerifyRequest.EngageListDTO engageListDTO : biEngageDTO) {
-                engageListDTO.setRiskCode(RiskCodeEnum.R0821.getCode());
+            List<SubmitVerifyRequest.EngageListDTO> biEngageDTO = JSON.parseArray(infoList.get(0).getSyappoint(),
+                    SubmitVerifyRequest.EngageListDTO.class);
+            if(CollUtil.isNotEmpty(biEngageDTO)){
+                for (SubmitVerifyRequest.EngageListDTO engageListDTO : biEngageDTO) {
+                    engageListDTO.setRiskCode(RiskCodeEnum.R0821.getCode());
+                }
+            }
+            if(CollUtil.isNotEmpty(ciEngageDTO)){
+                engageDTO.addAll(ciEngageDTO);
+            }
+            if(CollUtil.isNotEmpty(biEngageDTO)){
+                engageDTO.addAll(biEngageDTO);
             }
-        }
-        if(CollUtil.isNotEmpty(ciEngageDTO)){
-            engageDTO.addAll(ciEngageDTO);
-        }
-        if(CollUtil.isNotEmpty(biEngageDTO)){
-            engageDTO.addAll(biEngageDTO);
         }
         // 投保保存
         SubmitVerifyRequest submitVerifyRequest = new SubmitVerifyRequest(parameters,insAreaCompany,
@@ -679,9 +892,17 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
 
     @Override
     public ReadPdfUrlListDto getPolicyByCompanyIdPdfList(InsAreaCompany insAreaCompany, InsOrders insOrders, boolean flag) {
+        JSONArray array = insAreaCompany.getAccidentInfo();
+        String jypolicyno = null;
+        if(CollUtil.isNotEmpty(array)){
+            List<AccidentResponseVo> accidentResponseVos = insAreaCompany.getAccidentInfo().toJavaList(AccidentResponseVo.class);
+            jypolicyno = accidentResponseVos.get(0).getPolicyNumber();
+        }
+        insAreaCompany.setJyPolicyNo(jypolicyno);
         String jqPath =  getPdfUrl(insAreaCompany, insOrders,InsuranceRisk.TRAFFIC_CODE,PolicyPrintVo.PolicyPrintType.PPT_2.getCode(),insAreaCompany.getJqpolicyno(),flag);
         String syPath = getPdfUrl(insAreaCompany,insOrders,InsuranceRisk.BUSINESS_CODE,PolicyPrintVo.PolicyPrintType.PPT_2.getCode(), insAreaCompany.getSypolicyno(),flag);
-        InsAreaCompanyExternalPolicy insAreaCompanyExternalPolicy =new InsAreaCompanyExternalPolicy(insAreaCompany.getId(),jqPath,syPath,null,null);
+        String jyPath = getPdfUrl(insAreaCompany,insOrders,InsuranceRisk.ACCIDENT_CODE,PolicyPrintVo.PolicyPrintType.PPT_2.getCode(), jypolicyno,flag);
+        InsAreaCompanyExternalPolicy insAreaCompanyExternalPolicy =new InsAreaCompanyExternalPolicy(insAreaCompany.getId(),jqPath,syPath,jyPath,null);
         return new ReadPdfUrlListDto(insAreaCompanyExternalPolicy,insAreaCompany,null);
     }
 
@@ -716,6 +937,10 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
                     templateName = pathPrefix + InsuranceOrderPdf.SYBD.getDesc();
                     url = response.getBiDownLoad();
                     break;
+                case InsuranceRisk.ACCIDENT_CODE:
+                    templateName = pathPrefix + InsuranceOrderPdf.JYBD.getDesc();
+                    url = response.getAhiDownLoad();
+                    break;
             }
         } catch (Exception e){
             throw new SystemException(e.toString());
@@ -732,4 +957,15 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         String dir = "carInsPolicy/" + licensePlate + "/";
         return FileUtil.netUrlToFile(url, dir, fileName, uploadFilePath, apiUrl + showFileUrl);
     }
+
+    @Data
+    static class CheckCodeResp {
+
+        @JsonProperty(value = "jqImageCode")
+        String jqImageCode;
+
+        @JsonProperty(value = "syImageCode")
+        String syImageCode;
+
+    }
 }

+ 22 - 0
src/main/java/com/ydtech/modules/order/service/impl/InsAreaCompanyRelatedInfoServiceImpl.java

@@ -0,0 +1,22 @@
+package com.ydtech.modules.order.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ydtech.modules.order.dao.InsAreaCompanyRelatedInfoMapper;
+import com.ydtech.modules.order.entity.InsAreaCompanyRelatedInfo;
+import com.ydtech.modules.order.service.InsAreaCompanyRelatedInfoService;
+import org.springframework.stereotype.Service;
+
+/**
+* @author dongxin
+* @description 针对表【ins_area_company_related_info(子订单关联信息表)】的数据库操作Service实现
+* @createDate 2024-11-29 15:26:49
+*/
+@Service
+public class InsAreaCompanyRelatedInfoServiceImpl extends ServiceImpl<InsAreaCompanyRelatedInfoMapper, InsAreaCompanyRelatedInfo>
+    implements InsAreaCompanyRelatedInfoService {
+
+}
+
+
+
+

+ 11 - 4
src/main/java/com/ydtech/modules/order/service/impl/InsAreaCompanyServiceImpl.java

@@ -585,16 +585,23 @@ public class InsAreaCompanyServiceImpl extends ServiceImpl<InsAreaCompanyMapper,
 
         List<PtlAgreementProductCostsNew> costsNews = ptlAgreementProductCostsNewService.getByAgreementId(agreementProductQueryVo);
 
-        if (costsNews.isEmpty() && !Objects.isNull(quoteVo.getNowCostsId())) {
+        if (costsNews.isEmpty()) {
             throw new SystemException("没有找到费用信息");
         }
         PtlAgreementProductCostsNew ptlAgreementProductCostsNew = costsNews.get(0);
         ptlAgreementProductCostsNew.blank();
 
-        quoteVo.setJqSuperviseCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getJqCarCostsProportion()));
-        quoteVo.setSySuperviseCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getSyCarCostsProportion()));
-        quoteVo.setNoSuperviseCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getNoCarCostsProportion()));
+        if(StringUtils.isNotBlank(quoteVo.getJqpolicyno())){
+            quoteVo.setJqSuperviseCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getJqCarCostsProportion()));
+        }
 
+        if(StringUtils.isNotBlank(quoteVo.getSypolicyno())){
+            quoteVo.setSySuperviseCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getSyCarCostsProportion()));
+        }
+
+        if(StringUtils.isNotBlank(quoteVo.getJypolicyno())){
+            quoteVo.setNoSuperviseCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getNoCarCostsProportion()));
+        }
 
         InsAreaCompany insAreaCompany = new InsAreaCompany();
         String subOrderNo = IdGenerate.nextId();

+ 0 - 3
src/main/java/com/ydtech/modules/order/service/impl/InsOrderPdfUrlServiceImpl.java

@@ -283,9 +283,6 @@ public class InsOrderPdfUrlServiceImpl extends ServiceImpl<InsOrderPdfUrlMapper,
             if (subOrder.getApiType()!=null && subOrder.getApiType() == 1) {
                 return yangGuangOrderApiService.getPolicyByCompanyIdPdfList(subOrder,insOrders,flag);
             }
-//            else if (subOrder.getApiType() != null && subOrder.getApiType() == 2) {
-//                return insCrawlerOrderService.getPolicyByCompanyIdPdfList(subOrder,insOrders,flag);
-//            }
         }
         //平安财险   上线再调式
         else if(subOrder.getCompanyId().contains(InsuranceEnum.PAIC.getCode())){

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

@@ -685,7 +685,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         }
         //车险查询添加电销组长可以查询电销下的数据   电销组长 72
         if (dept != null && "3".equals(dept.getManagementSource()) && userRole != null && userRole.getRoleId() == 72) {
-            deptId = dept.getId();
+            //  add  by hxl  去除机构查询
+            //deptId = dept.getId();
+            orderQueryVo.setDeptId(null);
             isDxFlag = true;
         }
         Page<InsOrders> orderVoPage = baseMapper.queryPageOrder(page, orderQueryVo, adminFalg, isCdy, deptId, isDxFlag);

+ 90 - 11
src/main/java/com/ydtech/modules/order/service/impl/YangGuangOrderApiServiceImpl.java

@@ -50,10 +50,13 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 @Service
@@ -127,14 +130,86 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
         //报价
         InsOrders insOrders = insOrdersService.getById(quoteInfoVo.getOrderNo());
 
-        YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequest = new YangGuangAccuracyCalculateRequest(quoteInfoVo, purchasePrice, carModelList1, riskList.get(0),startDate,ygConfigureParameters,quoteVo.getAccidentalDrivingVo());
+        YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequest = new YangGuangAccuracyCalculateRequest(quoteInfoVo, purchasePrice, carModelList1, riskList.get(0),startDate,ygConfigureParameters,quoteVo);
         yangGuangAccuracyCalculateRequest.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
         YangGuangAccuracyCalculateResponse yangGuangAccuracyCalculateResponse = yangGuangRequestApiComponents.accuracyCalculaye(yangGuangAccuracyCalculateRequest);
+        // 如果发生重复投保 将返回的终保日期带入起保日期重新报价
+        if (yangGuangAccuracyCalculateResponse.getErrorMessage().contains("重复投保")) {
+            // 定义正则表达式来匹配终保日期的格式
+            Pattern pattern = Pattern.compile("终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
+            Matcher matcher = pattern.matcher(yangGuangAccuracyCalculateResponse.getErrorMessage());
+            if (matcher.find()) {
+                // 获取响应中重复投保的终保日期
+                String endDate = matcher.group(1);
+                DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+                DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+                LocalDateTime dateTime = LocalDateTime.parse(endDate, inputFormatter);
+                String newDateStr = dateTime.format(outputFormatter);
+                YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequestRe = new YangGuangAccuracyCalculateRequest(quoteInfoVo, purchasePrice, carModelList1, riskList.get(0),newDateStr,ygConfigureParameters,quoteVo);
+                yangGuangAccuracyCalculateRequestRe.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
+                YangGuangAccuracyCalculateResponse yangGuangAccuracyCalculateResponseRe = yangGuangRequestApiComponents.accuracyCalculaye(yangGuangAccuracyCalculateRequestRe);
+                if (insOrders.getProductid().equals("034001") || insOrders.getProductid().equals("0330034001") || insOrders.getProductid().equals("0330034002")) {
+                    if (yangGuangAccuracyCalculateResponseRe.getErrorCode().equals("0")) {
+                        YangGuangAccuracyCalculateResponse.itemcar itemcar = yangGuangAccuracyCalculateResponseRe.getItemcar();
+                        String actualValue = itemcar.getActualValue();
+                        YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequest1 = new YangGuangAccuracyCalculateRequest(quoteInfoVo, actualValue, carModelList1, riskList.get(0),newDateStr,ygConfigureParameters,quoteVo);
+                        yangGuangAccuracyCalculateRequest1.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
+                        YangGuangAccuracyCalculateResponse yangGuangAccuracyCalculateResponse1 = yangGuangRequestApiComponents.accuracyCalculaye(yangGuangAccuracyCalculateRequest1);
+                        boolean isEnergy = carInfo.isNewEnergy();
+
+                        if (!yangGuangAccuracyCalculateResponse1.getErrorCode().equals("0")) {
+                        InsOrders order = insOrdersService.getById(quoteInfoVo.getOrderNo());
+                        InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
+                            if (yangGuangAccuracyCalculateResponse1.getErrorMessage().contains("重复投保")) {
+                            insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
+                            }
+                        insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse1.getErrorMessage(),insOrderStatusEnum);
+                        throw new SystemException(yangGuangAccuracyCalculateResponse1.getErrorMessage());
+                        }
+                        // 处理数据
+                        QuoteRespVo quoteRespVo = getQuoteRespVo(yangGuangAccuracyCalculateResponse1, quoteInfoVo, quoteVo.getAccidentalDrivingVo(), isEnergy);
+
+                        // 设置核心报价车型
+                        quoteRespVo.setCoreModels(carModelList1.toCoreModelsVo());
+                        return responseOrder(yangGuangAccuracyCalculateResponse1, quoteRespVo, ptlAgreementAttribution, quoteInfoVo.getOrderNo(),
+                                quoteVo.getAccidentalDrivingVo());
+                    } else {
+                        InsOrders order = insOrdersService.getById(quoteInfoVo.getOrderNo());
+                        InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
+                        if (yangGuangAccuracyCalculateResponse.getErrorMessage().contains("重复投保")) {
+                            insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
+                        }
+                        insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse.getErrorMessage(),insOrderStatusEnum);
+                        throw new SystemException(yangGuangAccuracyCalculateResponse.getErrorMessage());
+                    }
+                } else {
+                    boolean isEnergy = carInfo.isNewEnergy();
+                    if (!yangGuangAccuracyCalculateResponse.getErrorCode().equals("0")) {
+                        QuoteRespVo resp  = new QuoteRespVo();
+                        InsOrders order = insOrdersService.getById(quoteInfoVo.getOrderNo());
+                        InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
+                        if (yangGuangAccuracyCalculateResponse.getErrorMessage().contains("重复投保")) {
+                        insOrderStatusEnum = InsOrderStatusEnum.REPEAT_INSURE;
+                        }
+                        insOrdersService.responseFailedOrder(quoteVo,ptlAgreementAttribution, order, yangGuangAccuracyCalculateResponse.getErrorMessage(),insOrderStatusEnum);
+                        throw new SystemException(yangGuangAccuracyCalculateResponse.getErrorMessage());
+                    }
+                    // 处理数据
+                    QuoteRespVo quoteRespVo = getQuoteRespVo(yangGuangAccuracyCalculateResponse, quoteInfoVo, quoteVo.getAccidentalDrivingVo(), isEnergy);
+
+                    // 设置核心报价车型
+                    quoteRespVo.setCoreModels(carModelList1.toCoreModelsVo());
+                    return responseOrder(yangGuangAccuracyCalculateResponse, quoteRespVo, ptlAgreementAttribution, quoteInfoVo.getOrderNo(),
+                            quoteVo.getAccidentalDrivingVo());
+                }
+            }
+        }
         if (insOrders.getProductid().equals("034001") || insOrders.getProductid().equals("0330034001") || insOrders.getProductid().equals("0330034002")) {
             if (yangGuangAccuracyCalculateResponse.getErrorCode().equals("0")) {
                 YangGuangAccuracyCalculateResponse.itemcar itemcar = yangGuangAccuracyCalculateResponse.getItemcar();
                 String actualValue = itemcar.getActualValue();
-                YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequest1 = new YangGuangAccuracyCalculateRequest(quoteInfoVo, actualValue, carModelList1, riskList.get(0),startDate,ygConfigureParameters,quoteVo.getAccidentalDrivingVo());
+                YangGuangAccuracyCalculateRequest yangGuangAccuracyCalculateRequest1 = new YangGuangAccuracyCalculateRequest(quoteInfoVo, actualValue, carModelList1, riskList.get(0),startDate,ygConfigureParameters,quoteVo);
                 yangGuangAccuracyCalculateRequest1.setInfotransNo(yangGuangQueryVehicleModelResponse.getInfotransNo());
                 YangGuangAccuracyCalculateResponse yangGuangAccuracyCalculateResponse1 = yangGuangRequestApiComponents.accuracyCalculaye(yangGuangAccuracyCalculateRequest1);
                 boolean isEnergy = carInfo.isNewEnergy();
@@ -206,7 +281,7 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
             for (InsTaskImagesBase64 insTaskImagesBase64 : insTaskImagesBase64s) {
                 ObjectMapper objectMapper = new ObjectMapper();
                 InsUploadFiles insUploadFiles = insUploadFilesService.queryById(insTaskImagesBase64.getImageId());
-                YangGuangUpLoadRequest yangGuangUpLoadRequest = new YangGuangUpLoadRequest(InfotransNo, insTaskImagesBase64, parameters, insUploadFiles);
+                YangGuangUpLoadRequest yangGuangUpLoadRequest = new YangGuangUpLoadRequest(InfotransNo, insTaskImagesBase64, parameters, insUploadFiles,apiUrl);
                 String json = objectMapper.writeValueAsString(yangGuangUpLoadRequest);
                 String yangGuangUpLoadResponse = yangGuangRequestApiComponents.upload(json);
                 log.info("上传影像:{}", yangGuangUpLoadResponse);
@@ -485,7 +560,7 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
                 templateName = "-商业险保单.pdf";
                 break;
             case InsuranceRisk.ACCIDENT_CODE:
-                busNo = insAreaCompany.getAccidentStrInfo();
+                busNo = policyPrintVo.getPolicyNumber();
                 busType = BusType.BT_4;
                 templateName = busNo + "-非车险保单.pdf";
                 break;
@@ -530,10 +605,14 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
         String jqPath = getPdfUrl(insAreaCompany,insOrders,InsuranceRisk.TRAFFIC_CODE,PolicyPrintVo.PolicyPrintType.PPT_2.getCode(),insAreaCompany.getJqpolicyno(),flag);
         String syPath = getPdfUrl(insAreaCompany,insOrders,InsuranceRisk.BUSINESS_CODE,PolicyPrintVo.PolicyPrintType.PPT_2.getCode(),insAreaCompany.getSypolicyno(),flag);
         String fcPath = "";
-        if (insAreaCompany.getAccidentStrInfo() != null && !insAreaCompany.getAccidentStrInfo().equals("")) {
+        String fcProposalNo = "";
+        if (insAreaCompany.getCrossInsurance() != null && !insAreaCompany.getCrossInsurance().isEmpty()) {
             //获取非车保单号
-            String FcProposalNo = insAreaCompany.getAccidentStrInfo();
-            fcPath = getPdfUrl(insAreaCompany,insOrders,InsuranceRisk.ACCIDENT_CODE,PolicyPrintVo.PolicyPrintType.PPT_2.getCode(), FcProposalNo, flag);
+            for (int i = 0; i < insAreaCompany.getCrossInsurance().size(); i++) {
+                JSONObject item = insAreaCompany.getCrossInsurance().getJSONObject(i);
+                fcProposalNo = item.getString("policyNumber");
+            }
+            fcPath = getPdfUrl(insAreaCompany,insOrders,InsuranceRisk.ACCIDENT_CODE,PolicyPrintVo.PolicyPrintType.PPT_2.getCode(), fcProposalNo, flag);
         }
         InsAreaCompanyExternalPolicy insAreaCompanyExternalPolicy =new InsAreaCompanyExternalPolicy(insAreaCompany.getId(),jqPath,syPath,fcPath,null);
         return new ReadPdfUrlListDto(insAreaCompanyExternalPolicy,insAreaCompany,null);
@@ -655,12 +734,11 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
         }
         YangGuangAccuracyCalculateResponse.discount discount = yangGuangAccuracyCalculateResponse.getDiscount();
         if (discount != null) {
-            quoteRespVo.setILogPreUdwMess(discount.getFinalmarkingnobc() != null ? discount.getFinalmarkingnobc() : "");
+            quoteRespVo.setLossRation(Double.parseDouble(discount.getFinalmarkingnobc() != null ? discount.getFinalmarkingnobc() : "0.00"));
             quoteRespVo.setJqScore(discount.getMarkingnobcCI() != null ? discount.getMarkingnobcCI() : "");
             quoteRespVo.setSyScore(discount.getMarkingnobcBI() != null ? discount.getMarkingnobcBI() : "");
-            quoteRespVo.setSyClaims(discount.getClaimTimes() != null ? discount.getClaimTimes() : "");
-            //自主定价系数
-            quoteRespVo.setPricingCoefficient(discount.getActualautoundwrtfactor() != null ? discount.getActualautoundwrtfactor() : "");
+            quoteRespVo.setJqLossRation(Double.parseDouble(discount.getFinalmarkingnoCi() != null ? discount.getFinalmarkingnoCi() : "0.00"));
+            quoteRespVo.setSyLossRation(Double.parseDouble(discount.getFinalmarkingnoBi() != null ? discount.getFinalmarkingnoBi() : "0.00"));
         }
 
         List<QuoteKindRespVo> kindList1 = new ArrayList<>();
@@ -731,6 +809,7 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
         insAreaCompany.setReptxt(JSON.parseObject(JSON.toJSONString(yangGuangAccuracyCalculateResponse)));
         insAreaCompany.setOrderstatus(InsOrderStatusEnum.QUOTE_ING.getCode());
         insAreaCompany.setInsOrderNo(yangGuangAccuracyCalculateResponse.getInfotransNo());
+        insAreaCompany.setMergeCostRate(Double.parseDouble(yangGuangAccuracyCalculateResponse.getVascostmarginbc()));
         InsOrders insOrders = insOrdersService.getById(orderId);
         //车船税
         if (!insOrders.getProductid().equals("034001") && !insOrders.getProductid().equals("034002")) {

+ 2 - 0
src/main/java/com/ydtech/utils/baidu/BusinessLicenseRecognition.java

@@ -4,6 +4,7 @@ package com.ydtech.utils.baidu;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.ydtech.modules.order.entity.BusinessLicense;
+import me.chanjar.weixin.common.util.http.URIUtil;
 import org.apache.commons.lang3.StringUtils;
 
 /**
@@ -23,6 +24,7 @@ public class BusinessLicenseRecognition {
      * @return
      */
     public static JSONObject businessLicense(String imgParam) {
+        imgParam= URIUtil.encodeURIComponent(imgParam);
         // 请求url
         String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/business_license";
         try {

+ 25 - 0
src/main/java/com/ydtech/utils/cache/BaseCacheConfig.java

@@ -0,0 +1,25 @@
+package com.ydtech.utils.cache;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.concurrent.TimeUnit;
+
+
+@Data
+@Accessors(chain = true)
+@AllArgsConstructor
+@NoArgsConstructor
+public class BaseCacheConfig<T> {
+
+    private Integer expiresIn;
+
+    private TimeUnit timeUnit;
+
+    private T data;
+
+}

+ 10 - 0
src/main/java/com/ydtech/utils/cache/CacheFactory.java

@@ -0,0 +1,10 @@
+package com.ydtech.utils.cache;
+
+import org.apache.poi.ss.formula.functions.T;
+
+@FunctionalInterface
+public interface CacheFactory <F extends BaseCacheConfig<?>>{
+
+    F getCache();
+
+}

+ 31 - 0
src/main/java/com/ydtech/utils/cache/RedissonUtils.java

@@ -0,0 +1,31 @@
+package com.ydtech.utils.cache;
+
+
+import com.alibaba.fastjson.JSON;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RedissonClient;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class RedissonUtils {
+
+    private final RedissonClient redisson;
+
+    public <T, F extends BaseCacheConfig<T>> T getFromRedis(CacheFactory<F> cacheFactory, String redisKey) {
+        Object cache = redisson.getBucket(redisKey).get();
+        if (cache != null) {
+            log.info("key:{} cache:{}", redisKey, JSON.toJSONString(cache));
+        }
+
+        F result = cacheFactory.getCache();
+        if (result == null) {
+            return null;
+        }
+        redisson.getBucket(redisKey).set(result.getData(), result.getExpiresIn(), result.getTimeUnit());
+        return result.getData();
+    }
+
+}

+ 0 - 48
src/main/java/com/ydtech/utils/scheduledFutureUtil/ScheduledFutureHolder.java

@@ -1,48 +0,0 @@
-package com.ydtech.utils.scheduledFutureUtil;
-
-import java.util.concurrent.ScheduledFuture;
-
-/**
- * 任务执行的包装类
- */
-public class ScheduledFutureHolder {
-    private ScheduledFuture<?> scheduledFuture;
-
-    private Class<? extends Runnable> runnableClass;
-
-    private String corn;
-
-    public ScheduledFuture<?> getScheduledFuture() {
-        return scheduledFuture;
-    }
-
-    public void setScheduledFuture(ScheduledFuture<?> scheduledFuture) {
-        this.scheduledFuture = scheduledFuture;
-    }
-
-    public Class<? extends Runnable> getRunnableClass() {
-        return runnableClass;
-    }
-
-    public void setRunnableClass(Class<? extends Runnable> runnableClass) {
-        this.runnableClass = runnableClass;
-    }
-
-    public String getCorn() {
-        return corn;
-    }
-
-    public void setCorn(String corn) {
-        this.corn = corn;
-    }
-
-    @Override
-    public String toString() {
-        return "ScheduledFutureHolder{" +
-                "scheduledFuture=" + scheduledFuture +
-                ", runnableClass=" + runnableClass +
-                ", corn='" + corn + '\'' +
-                '}';
-    }
-}
-

+ 0 - 40
src/main/java/com/ydtech/utils/scheduledFutureUtil/ScheduledFutureUtil.java

@@ -1,40 +0,0 @@
-package com.ydtech.utils.scheduledFutureUtil;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
-import org.springframework.scheduling.support.CronTrigger;
-import org.springframework.stereotype.Component;
-
-import java.util.HashMap;
-import java.util.concurrent.ScheduledFuture;
-
-@Slf4j
-@Component
-public class ScheduledFutureUtil {
-    //存储任务执行的包装类
-    public static HashMap<String, ScheduledFutureHolder> scheduleMap = new HashMap<>();
-    @Autowired
-    private ThreadPoolTaskScheduler threadPoolTaskScheduler;
-
-    public  void startJob(Runnable runnable, String cron) {
-        //将任务交给任务调度器执行
-        ScheduledFuture<?> schedule = threadPoolTaskScheduler.schedule(runnable, new CronTrigger(cron));
-        //将任务包装成ScheduledFutureHolder
-        ScheduledFutureHolder scheduledFutureHolder = new ScheduledFutureHolder();
-        scheduledFutureHolder.setScheduledFuture(schedule);
-        scheduledFutureHolder.setRunnableClass(runnable.getClass());
-        scheduledFutureHolder.setCorn(cron);
-        scheduleMap.put(scheduledFutureHolder.getRunnableClass().getName(), scheduledFutureHolder);
-    }
-
-    public void endJob(String className){
-        if(ScheduledFutureUtil.scheduleMap.containsKey(className)){//如果包含这个任务
-            ScheduledFuture<?> scheduledFuture = ScheduledFutureUtil.scheduleMap.get(className).getScheduledFuture();
-            if(scheduledFuture!=null){
-                scheduledFuture.cancel(true);
-                log.info("{}任务已停止",className);
-            }
-        }
-    }
-}

+ 7 - 0
src/main/resources/application-pre.yml

@@ -241,7 +241,14 @@ upload:
   password: ''
   url: ${netUrl}
   username: ''
+
 wechat:
+  # 微信客服
+  customer:
+    corp-id: wwfe67d19509d43ec5
+    secret: lbn1DU7VhqK3dG0XDciPDXf_AdSryne84nvRhtSEGLc
+    token: btgwGK2r
+    encoding-aes-key: eevs11QeInJYRysGYnC8gK68F4CGsedM1Dn1X79cPCs
   open:
     properties:
       jzg:

+ 16 - 2
src/main/resources/application-prod.yml

@@ -233,7 +233,14 @@ upload:
   password: ''
   url: ${netUrl}
   username: ''
+
 wechat:
+  # 微信客服
+  customer:
+    corp-id: wwfe67d19509d43ec5
+    secret: lbn1DU7VhqK3dG0XDciPDXf_AdSryne84nvRhtSEGLc
+    token: btgwGK2r
+    encoding-aes-key: eevs11QeInJYRysGYnC8gK68F4CGsedM1Dn1X79cPCs
   open:
     properties:
       jzg:
@@ -317,7 +324,7 @@ zijin:
     # 新支付
     newPayUrl: http://open.zking.com/api/v1/open/open-aggregate/auth/newPay
     # 订单详情查询服务
-    orderUrl: http://open.zking.com/api/v1/insurance/public/getOrderDetail
+    orderUrl: http://open.zking.com/api/v1/business-order/insurance-order/auth/order/queryOrderDetailById
     # 订单状态查询
     orderDetailUrl: http://open.zking.com/api/v1/insurance/autoMobile/geelyCarInsurance/queryOrderDetail
     # 下载保单地址
@@ -410,6 +417,13 @@ yangguang:
     secret: 6CPxxlHwLLphTR7gVg3hJLsH
     referer: SXJZG
 
+chengtai:
+  api:
+    baseUrl: https://hsale.champion-ic.com/app/SERVER_V2/4001/
+    ctPublicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvuUnoPTFin84nDdpNZFDiGZgUKn6d9fbp6F4/fqrb6pFoJX/wLMr0IsheP0ZnVCPpLGKLjflPNHJo/P9WRRTSM67D8fRD8GKoq+7CtSJkdIticASpN/U8AgJiNV6xdReJcMkaAWJ1ZbOQ+nYLg9OE0qQ6cuXqhy/wVrqx72CrvwIDAQAB
+    publicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyVlpqmibguria884GdAYEuqCV4aQRl2N21+7l8Vxocoyz+M8KYyXqmlLKqApNL/U5pUVTjS6vpC6ojS+wvNbawijeMsm8r2NOlTHBnQ5vN0azjjPPtSrxgHL8/EYBa4lmBcexdmcUrUyWjAIYqfO8dlY+RuXvbiw7fBHZ7xpAvQIDAQAB
+    privateKey: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALJWWmqaJuC6uJrzzgZ0BgS6oJXhpBGXY3bX7uXxXGhyjLP4zwpjJeqaUsqoCk0v9TmlRVONLq+kLqiNL7C81trCKN4yybyvY06VMcGdDm83RrOOM8+1KvGAcvz8RgFriWYFx7F2ZxStTJaMAhip87x2Vj5G5e9uLDt8EdnvGkC9AgMBAAECgYEAsEOHdEvOV1pWMdj9bgVpGW14YQu3RSfTSFheqGkpg5aMmSk3QbYDeOB1KhZysB3Ri9tdLRqi5TkqYK/DTjUnSUMs0iMhx0XaY2z3w16AMpvuJ0FZ4S2h8oAFfOWe4F6bpUYU8qmXANAaXcMm6HjU8k1QuTbjlSOeLujl8W7zk8ECQQDlHbUQ911kWmsSo8NE4S1+dq/6T+yIGCJlXzlNh/z6giMpjp8Dzm3fxDHLeZa+DCrhpT1qe6O3oGwx3HeR/85NAkEAx0NUy6pX5WolV+YAoLNHAmcCP26wQTB7LZ7mXbxww4yNNH9CWHE9PaBuV4Ws4NxSAnRDxrgArkz5+wgqnXzUMQJAHr16orkdra43+XtBYsd3jCUufT4l9SiPzNwW2yEovw+g2h2JlkAnG8O+DpfUstD9G+NItzW5hJSgj5wN6ufQbQJACEtdND0a+4m3lDkWvZm40vjGty08WPpTpkp+/FfjucAYAJ9re5L7IZ2T+kCuOY3yO/fq+lKedKLvpOtqGrQfgQJBAJ1wMccz+1ez8qpyTWbzj2h0O+GV+YDHqJ9SwRWcSacZOeAyO7UMgIZEwoYfs4nhye7DZH9e4BfkwBmFHJKwJNs=
+
 
 xxl:
   job:
@@ -472,4 +486,4 @@ ttqf:
   tokenUrl: https://test.baoxianzhanggui.com/web-api
 
 #灵活用工平台实时推送ip地址
-sendMessage-zg-yggl-IP: https://test.baoxianzhanggui.com/prod-api
+sendMessage-zg-yggl-IP: https://test.baoxianzhanggui.com/prod-api

+ 8 - 2
src/main/resources/application-test.yml

@@ -253,6 +253,12 @@ upload:
   url: ${netUrl}
   username: ''
 wechat:
+  # 微信客服
+  customer:
+    corp-id: wwfe67d19509d43ec5
+    secret: lbn1DU7VhqK3dG0XDciPDXf_AdSryne84nvRhtSEGLc
+    token: btgwGK2r
+    encoding-aes-key: eevs11QeInJYRysGYnC8gK68F4CGsedM1Dn1X79cPCs
   open:
     properties:
       jzg:
@@ -433,7 +439,7 @@ dajia:
 
 # api url
 api:
-  url: http://39.98.239.48/web-api
+  url: https://test.baoxianzhanggui.com/web-api
 
 
 # 国任财险测试
@@ -557,4 +563,4 @@ customer:
 httpUrl: https://test.baoxianzhanggui.com/copartnerH5/#/pages/index/result?
 
 #灵活用工平台实时推送ip地址
-sendMessage-zg-yggl-IP: https://test.baoxianzhanggui.com/prod-api
+sendMessage-zg-yggl-IP: https://test.baoxianzhanggui.com/prod-api

+ 91 - 43
src/main/resources/mapper/modules/admin/SysUserMapper.xml

@@ -165,6 +165,9 @@
         info.sex,
         su.mobile,
         su.status,
+        su.type,
+        su.level,
+        su.referrer_id as referrerId,
         sd.id as deptId,
         sd.name as deptName,
         t4.id as roleId,
@@ -190,6 +193,9 @@
             <if test='user.status !=null and user.status!="" '>
                 and su.status = #{user.status}
             </if>
+            <if test='user.examine != 0'>
+                and su.status not in (0,1)
+            </if>
             <if test='user.name !=null and user.name!="" '>
                 and su.name like concat('%',#{user.name},'%')
             </if>
@@ -215,6 +221,7 @@
                 and sd.management_source is null
             </if>
         </if>
+        order by su.create_time desc
     </select>
 
     <select id="findAllUserList" resultType="com.ydtech.modules.admin.model.vo.SysUserBaseVO">
@@ -275,6 +282,9 @@
         info.sex,
         su.mobile,
         su.status,
+        su.type,
+        su.level,
+        su.referrer_id as referrerId,
         sd.id as deptId,
         sd.name as deptName,
         t4.id as roleId,
@@ -300,6 +310,9 @@
             <if test='user.status !=null and user.status!="" '>
                 and su.status = #{user.status}
             </if>
+            <if test='user.examine != 0'>
+                and su.status not in (0,1)
+            </if>
             <if test='user.name !=null and user.name!="" '>
                 and su.name like concat('%',#{user.name},'%')
             </if>
@@ -323,6 +336,7 @@
             </if>
             and su.id NOT LIKE '%M%'
         </if>
+        order by su.create_time desc
     </select>
 
     <select id="findBackUserList1" resultType="com.ydtech.modules.admin.model.vo.SysUserBaseVO">
@@ -868,8 +882,12 @@
         su.id as userId,
         su.name,
         info.sex,
+        info.live_address,
         su.mobile,
+        su.leader_id,
+        su.leader_name,
         su.status,
+        su.identity,
         sd.id as deptId,
         sd.name as deptName,
         t4.id as roleId,
@@ -901,16 +919,16 @@
         su.status != 0 AND su.id LIKE '%M%' and su.id!='admin'
         <if test='user !=null  '>
             <if test='user.name !=null and user.name!="" '>
-                and su.name = #{user.name}
+                and su.name like concat('%', #{user.name}, '%')
             </if>
             <if test='user.userId !=null and user.userId!="" '>
-                and su.id = #{user.userId}
+                and su.id like concat('%', #{user.userId}, '%')
             </if>
             <if test='user.mobile !=null and user.mobile!=""  '>
-                and su.mobile = #{user.mobile}
+                and su.mobile like concat('%', #{user.mobile}, '%')
             </if>
             <if test='user.identity !=null and user.identity!=""  '>
-                and su.identity = #{user.identity}
+                and su.identity like concat('%', #{user.identity}, '%')
             </if>
         </if>
     </select>
@@ -1931,45 +1949,47 @@
         </if>
     </select>
     <select id="selectByParams" resultType="com.ydtech.modules.admin.model.SysUser">
-        select * from sys_user su
-        left join sys_dept sd on sd.id =su.dept_id
-        <where>
-            su.leader_id is not null
-            AND su.id not LIKE '%M%'
-            AND su.status ='1'
-            <if test="leaderId !=null and  leaderId !=''">
-                and su.leader_id =#{leaderId}
-            </if>
-            and (
-            WITH RECURSIVE user_subtree AS (
-            SELECT su1.id,
-            su1.leader_id,
-            0 AS level,
-            sd1.management_source
-            FROM sys_user su1
-            left join sys_dept sd1 on sd1.id = su1.dept_id
-            where
-            su1.id = su.id
-            UNION ALL
-            SELECT su1.id,
-            su1.leader_id,
-            ust.level + 1,
-            sd1.management_source
-            FROM sys_user su1
-            INNER JOIN
-            user_subtree ust ON su1.leader_id = ust.id
-            LEFT JOIN sys_dept sd1 ON sd1.id = su1.dept_id
-            )
-            SELECT count(0)
-            FROM user_subtree
-            where
-            <if test="managementSource != null  and  managementSource != ''">
-                management_source = #{managementSource}
-            </if>
-            ORDER BY level,
-            id
-            ) >0
-        </where>
+        SELECT
+        su.*,
+        sd.*
+        FROM
+        sys_user su
+        LEFT JOIN sys_dept sd ON sd.id = su.dept_id
+        WHERE
+        su.leader_id IS NOT NULL
+        AND su.id NOT LIKE '%M%'
+        AND su.STATUS = '1'
+        <if test = "leaderId !=null and  leaderId !=''" >
+            AND su.leader_id = #{leaderId}
+        </if>
+        AND EXISTS (
+        SELECT
+        1
+        FROM
+        sys_user su1
+        LEFT JOIN sys_user su2 ON su2.leader_id = su1.id
+        LEFT JOIN sys_user su3 ON su3.leader_id = su2.id
+        WHERE
+        su1.id = su.id
+        AND (
+        SELECT
+        count( 0 )
+        FROM
+        (
+        SELECT
+        sd1.management_source
+        FROM
+        sys_user su4
+        LEFT JOIN sys_dept sd1 ON sd1.id = su4.dept_id
+        WHERE
+        su4.id IN ( su1.id, su2.id, su3.id )
+        ) AS subquery
+        WHERE
+        <if test = "managementSource != null  and  managementSource != ''" >
+         management_source = #{managementSource}
+        </if>
+        ORDER BY 1
+       ) > 0 )
     </select>
 
 
@@ -2042,4 +2062,32 @@
             limit 1
     </select>
 
+    <select id="selectLeaderBylanderInfo" resultType="com.ydtech.modules.admin.model.SysUser">
+        SELECT *
+        FROM sys_user AS su
+        LEFT JOIN sys_dept sd ON su.id = sd.id
+        <where>
+            <if test="deptId != null and deptId != ''">
+                AND su.dept_id = #{deptId}
+            </if>
+            <if test="leaderId != null and leaderId != ''">
+                AND su.leader_id = #{leaderId}
+            </if>
+            <if test="userId != null and userId != ''">
+                AND su.id = #{userId}
+            </if>
+            AND sd.management_source IS NULL
+            AND su.id NOT LIKE '%M%'
+        </where>
+    </select>
+
+    <select id="findDxZyUserList" resultType="com.ydtech.modules.admin.model.SysUser">
+        SELECT t1.id   AS id,
+               t1.NAME AS NAME
+        FROM sys_user t1
+                 LEFT JOIN sys_dept t2 ON t1.dept_id = t2.id
+        WHERE t1.`status` = 1
+          AND t1.id LIKE '%M%'
+          AND t2.management_source = 3
+    </select>
 </mapper>

+ 107 - 15
src/main/resources/mapper/modules/admin/TaskStatisticsMapper.xml

@@ -50,9 +50,11 @@
         LEFT JOIN ins_fee_order_new ifon ON iac.id = ifon.ins_order_no
         <where>
             iac.orderstatus = '3'
-            <if test="vo.createtimeStart  != null  and  vo.createtimeStart!=''  and vo.createtimeEnd  != null  and  vo.createtimeEnd!=''">
-                AND DATE_FORMAT( iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT( #{vo.createtimeStart}, '%Y-%m-%d')
-                AND DATE_FORMAT( #{vo.createtimeEnd}, '%Y-%m-%d')
+            <if test="vo.signingTimeStart != null and vo.signingTimeStart!='' and vo.signingTimeEnd != null and vo.signingTimeEnd != ''">
+                AND DATE_FORMAT(iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.signingTimeStart}, '%Y-%m-%d') AND DATE_FORMAT(#{vo.signingTimeEnd}, '%Y-%m-%d')
+            </if>
+            <if test="vo.enterTimeStart != null and vo.enterTimeStart!='' and vo.enterTimeEnd != null and vo.enterTimeEnd != ''">
+                AND DATE_FORMAT(iac.createtime, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.enterTimeStart}, '%Y-%m-%d') AND DATE_FORMAT(#{vo.enterTimeEnd}, '%Y-%m-%d')
             </if>
 
             <if test="vo.userIds  !=null  and vo.userIds!=''  and vo.userIds.size()>0">
@@ -179,9 +181,11 @@
                  LEFT JOIN ins_fee_order_new ifon ON iac.id = ifon.ins_order_no
         <where>
         iac.orderstatus = '3'
-            <if test="vo.createtimeStart  != null  and  vo.createtimeStart!=''  and vo.createtimeEnd  != null  and  vo.createtimeEnd!=''">
-                AND DATE_FORMAT( iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT( #{vo.createtimeStart}, '%Y-%m-%d') AND
-                DATE_FORMAT( #{vo.createtimeEnd}, '%Y-%m-%d')
+            <if test="vo.signingTimeStart != null and vo.signingTimeStart!='' and vo.signingTimeEnd != null and vo.signingTimeEnd != ''">
+                AND DATE_FORMAT(iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.signingTimeStart}, '%Y-%m-%d') AND DATE_FORMAT(#{vo.signingTimeEnd}, '%Y-%m-%d')
+            </if>
+            <if test="vo.enterTimeStart != null and vo.enterTimeStart!='' and vo.enterTimeEnd != null and vo.enterTimeEnd != ''">
+                AND DATE_FORMAT(iac.createtime, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.enterTimeStart}, '%Y-%m-%d') AND DATE_FORMAT(#{vo.enterTimeEnd}, '%Y-%m-%d')
             </if>
 
             <if test="vo.days !=null  and vo.days !=''  and vo.days != 0 ">
@@ -230,9 +234,11 @@
         <where>
              1=1
            and  iac.orderstatus ='3'
-            <if test="vo.createtimeStart  != null  and  vo.createtimeStart!=''  and vo.createtimeEnd  != null  and  vo.createtimeEnd!=''">
-                AND DATE_FORMAT( iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT( #{vo.createtimeStart}, '%Y-%m-%d') AND
-                DATE_FORMAT( #{vo.createtimeEnd}, '%Y-%m-%d')
+            <if test="vo.signingTimeStart != null and vo.signingTimeStart!='' and vo.signingTimeEnd != null and vo.signingTimeEnd != ''">
+                AND DATE_FORMAT(iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.signingTimeStart}, '%Y-%m-%d') AND DATE_FORMAT(#{vo.signingTimeEnd}, '%Y-%m-%d')
+            </if>
+            <if test="vo.enterTimeStart != null and vo.enterTimeStart!='' and vo.enterTimeEnd != null and vo.enterTimeEnd != ''">
+                AND DATE_FORMAT(iac.createtime, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.enterTimeStart}, '%Y-%m-%d') AND DATE_FORMAT(#{vo.enterTimeEnd}, '%Y-%m-%d')
             </if>
 
             <if test="vo.userName !=null  and vo.userName!=''">
@@ -306,9 +312,11 @@
                 and su.id=#{vo.userId}
             </if>
 
-            <if test="vo.createtimeStart  != null  and  vo.createtimeStart!=''  and vo.createtimeEnd  != null  and  vo.createtimeEnd!=''">
-                AND DATE_FORMAT( iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT( #{vo.createtimeStart}, '%Y-%m-%d') AND
-                DATE_FORMAT( #{vo.createtimeEnd}, '%Y-%m-%d')
+            <if test="vo.signingTimeStart != null and vo.signingTimeStart!='' and vo.signingTimeEnd != null and vo.signingTimeEnd != ''">
+                AND DATE_FORMAT(iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.signingTimeStart}, '%Y-%m-%d') AND DATE_FORMAT(#{vo.signingTimeEnd}, '%Y-%m-%d')
+            </if>
+            <if test="vo.enterTimeStart != null and vo.enterTimeStart!='' and vo.enterTimeEnd != null and vo.enterTimeEnd != ''">
+                AND DATE_FORMAT(iac.createtime, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.enterTimeStart}, '%Y-%m-%d') AND DATE_FORMAT(#{vo.enterTimeEnd}, '%Y-%m-%d')
             </if>
 
             <if test="vo.managementSource !=null  and vo.managementSource!=''">
@@ -345,9 +353,11 @@
                       and su.id=#{vo.userId}
                   </if>
 
-                  <if test="vo.createtimeStart  != null  and  vo.createtimeStart!=''  and vo.createtimeEnd  != null  and  vo.createtimeEnd!=''">
-                      AND DATE_FORMAT( iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT( #{vo.createtimeStart}, '%Y-%m-%d') AND
-                      DATE_FORMAT( #{vo.createtimeEnd}, '%Y-%m-%d')
+                  <if test="vo.signingTimeStart != null and vo.signingTimeStart!='' and vo.signingTimeEnd != null and vo.signingTimeEnd != ''">
+                      AND DATE_FORMAT(iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.signingTimeStart}, '%Y-%m-%d') AND DATE_FORMAT(#{vo.signingTimeEnd}, '%Y-%m-%d')
+                  </if>
+                  <if test="vo.enterTimeStart != null and vo.enterTimeStart!='' and vo.enterTimeEnd != null and vo.enterTimeEnd != ''">
+                      AND DATE_FORMAT(iac.createtime, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.enterTimeStart}, '%Y-%m-%d') AND DATE_FORMAT(#{vo.enterTimeEnd}, '%Y-%m-%d')
                   </if>
 
                   <if test="vo.managementSource !=null  and vo.managementSource!=''">
@@ -416,6 +426,88 @@
         iac.inscompany
     </select>
 
+    <resultMap id="OrderDataMap" type="com.ydtech.modules.admin.model.vo.BusinessOrderData">
+        <result property="totalNumber" column="total"/>
+        <result property="orderNo"     column="order_no"/>
+        <result property="carNum"      column="car_num"/>
+        <result property="sumPremium"  column="sum_premium"/>
+        <result property="jqPremium"   column="jq_premium"/>
+        <result property="syPremium"   column="sy_premium"/>
+        <result property="taxAmount"   column="tax_amount"/>
+        <result property="jyPremium"   column="jy_premium"/>
+        <result property="userId"      column="user_id"/>
+        <result property="userName"    column="user_name"/>
+    </resultMap>
+
+    <sql id="BusinessOrderDataSQL">
+        SELECT
+            io.orderno AS "order_no",
+            io.licenseno AS "car_num",
+            su.id AS "user_id",
+            su.name AS "user_name",
+            IFNULL(SUM(iac.jqpremium), 0) AS "jq_premium",
+            IFNULL(SUM(iac.sypremium), 0) AS "sy_premium",
+            IFNULL(SUM(iac.taxamount), 0) AS "tax_amount",
+            IFNULL(SUM(iac.jypremium), 0) AS "jy_premium",
+            (IFNULL(SUM(iac.jqpremium), 0) + IFNULL(SUM(iac.sypremium), 0) + IFNULL(SUM(iac.jypremium), 0)) AS "sum_premium",
+            SUM(IFNULL(ifon.jq_costs_premiums, 0) + IFNULL(ifon.sy_costs_premiums, 0) + IFNULL(ifon.no_costs_premiums, 0)) AS "entrance_all_fee",
+            SUM(IFNULL(ifon.jq_export_other_costs_premiums, 0) + IFNULL(ifon.jq_export_supervise_costs_premiums, 0)
+                + IFNULL(ifon.sy_export_other_costs_premiums, 0) + IFNULL(ifon.sy_export_supervise_costs_premiums, 0)
+                + IFNULL(ifon.no_export_other_costs_premiums, 0) + IFNULL(ifon.no_export_supervise_costs_premiums, 0)) AS "export_all_fee"
+        FROM ins_area_company iac
+            LEFT JOIN ins_orders io ON io.orderno = iac.orderno
+            LEFT JOIN sys_user su ON io.userid = su.id
+            LEFT JOIN ins_fee_order_new ifon ON iac.id = ifon.ins_order_no
+    </sql>
+
+    <select id="getBusinessOrderDataDetails" resultMap="OrderDataMap">
+        <include refid="BusinessOrderDataSQL"/>
+        <where>
+            iac.orderstatus = '3'
+            <if test="vo.userId != null and vo.userId!=''">
+                AND su.id = #{vo.userId}
+            </if>
+            <if test="vo.signingTimeStart != null and vo.signingTimeStart!='' and vo.signingTimeEnd != null and vo.signingTimeEnd != ''">
+                AND DATE_FORMAT(iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.signingTimeStart}, '%Y-%m-%d')
+                AND DATE_FORMAT(#{vo.signingTimeEnd}, '%Y-%m-%d')
+            </if>
+            <if test="vo.enterTimeStart != null and vo.enterTimeStart!='' and vo.enterTimeEnd != null and vo.enterTimeEnd != ''">
+                AND DATE_FORMAT(iac.createtime, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.enterTimeStart}, '%Y-%m-%d')
+                AND DATE_FORMAT(#{vo.enterTimeEnd}, '%Y-%m-%d')
+            </if>
+        </where>
+        GROUP BY
+            io.orderno
+    </select>
 
+    <select id="getBusinessOrderDataTotal" resultMap="OrderDataMap">
+        SELECT
+            COUNT(*) AS `total`,
+            IFNULL(SUM(a.jq_premium), 0) AS `jq_premium`,
+            IFNULL(SUM(a.sy_premium), 0) AS `sy_premium`,
+            IFNULL(SUM(a.jy_premium), 0) AS `jy_premium`,
+            IFNULL(SUM(a.tax_amount), 0) AS `tax_amount`,
+            SUM(IFNULL(a.jq_premium, 0) + IFNULL(a.sy_premium, 0) + IFNULL(a.jy_premium, 0)) AS `sum_premium`,
+            ROUND(IFNULL(SUM(a.entrance_all_fee),0),2) AS `entrance_all_fee`,
+            ROUND(IFNULL(SUM(a.export_all_fee),0),2) AS `export_all_fee`
+        FROM (
+        <include refid="BusinessOrderDataSQL"/>
+        <where>
+            iac.orderstatus = '3'
+            <if test="vo.userId != null and vo.userId!=''">
+                AND su.id = #{vo.userId}
+            </if>
+            <if test="vo.signingTimeStart != null and vo.signingTimeStart!='' and vo.signingTimeEnd != null and vo.signingTimeEnd != ''">
+                AND DATE_FORMAT(iac.signing_time, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.signingTimeStart}, '%Y-%m-%d')
+                AND DATE_FORMAT(#{vo.signingTimeEnd}, '%Y-%m-%d')
+            </if>
+            <if test="vo.enterTimeStart != null and vo.enterTimeStart!='' and vo.enterTimeEnd != null and vo.enterTimeEnd != ''">
+                AND DATE_FORMAT(iac.createtime, '%Y-%m-%d') BETWEEN DATE_FORMAT(#{vo.enterTimeStart}, '%Y-%m-%d')
+                AND DATE_FORMAT(#{vo.enterTimeEnd}, '%Y-%m-%d')
+            </if>
+        </where>
+            GROUP BY
+                io.orderno) a
+    </select>
 
 </mapper>

+ 2 - 2
src/main/resources/mapper/modules/order/InsAreaCompanyMapper.xml

@@ -3610,8 +3610,8 @@
     </select>
 
     <select id="getSumEntryStatus" resultType="java.util.HashMap">
-            select ifnull( COUNT( CASE WHEN iac.entry_status = '2' THEN 1 END ),0) as "entryStatus",
-                   ifnull(COUNT( CASE WHEN iac.entry_status = '3' THEN 1 END ),0) as "outStatus"
+            select ifnull( COUNT( CASE WHEN io.entry_status = '2' THEN 1 END ),0) as "entryStatus",
+                   ifnull(COUNT( CASE WHEN io.entry_status = '3' THEN 1 END ),0) as "outStatus"
             from ins_area_company   iac
             left join  ins_orders io  on  iac.orderno  =io.orderno
             <where>

+ 18 - 0
src/main/resources/mapper/modules/order/InsAreaCompanyRelatedInfoMapper.xml

@@ -0,0 +1,18 @@
+<?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.ydtech.modules.order.dao.InsAreaCompanyRelatedInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.ydtech.modules.order.entity.InsAreaCompanyRelatedInfo">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="companyId" column="company_id" jdbcType="VARCHAR"/>
+            <result property="jqappoint" column="jqappoint" jdbcType="VARCHAR"/>
+            <result property="syappoint" column="syappoint" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,company_id,jqappoint,
+        syappoint
+    </sql>
+</mapper>