Jelajahi Sumber

Merge branch 'test' into my

785834757 1 tahun lalu
induk
melakukan
267892ce41
64 mengubah file dengan 2124 tambahan dan 182 penghapusan
  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. 107 0
      src/main/java/com/ydtech/modules/admin/components/WechatCustomerComponents.java
  7. 37 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerAddContactWayRequest.java
  8. 19 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerBaseRequest.java
  9. 26 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerGetTokenRequest.java
  10. 34 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerListRequest.java
  11. 68 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerSendMsgOnEventRequest.java
  12. 31 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerSyncMsgRequest.java
  13. 30 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerAddContactWayResponse.java
  14. 36 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerBaseResponse.java
  15. 42 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerGetTokenResponse.java
  16. 55 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerListResponse.java
  17. 42 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerSendMsgOnEventResponse.java
  18. 78 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/response/CustomerSyncMsgResponse.java
  19. 29 0
      src/main/java/com/ydtech/modules/admin/constants/WechatCustomerEnum.java
  20. 20 2
      src/main/java/com/ydtech/modules/admin/controller/SysQyWeChatController.java
  21. 2 0
      src/main/java/com/ydtech/modules/admin/controller/SysUserAgentController.java
  22. 21 5
      src/main/java/com/ydtech/modules/admin/controller/WechatController.java
  23. 35 0
      src/main/java/com/ydtech/modules/admin/controller/taskStatistics/TaskStatisticsController.java
  24. 50 0
      src/main/java/com/ydtech/modules/admin/controller/wechat/WechatCustomerController.java
  25. 16 0
      src/main/java/com/ydtech/modules/admin/dao/TaskStatisticsMapper.java
  26. 2 0
      src/main/java/com/ydtech/modules/admin/model/dto/SysUserDto.java
  27. 7 6
      src/main/java/com/ydtech/modules/admin/model/po/SysQyWeChat.java
  28. 59 0
      src/main/java/com/ydtech/modules/admin/model/vo/BusinessOrderData.java
  29. 12 0
      src/main/java/com/ydtech/modules/admin/model/vo/SysUserBaseVO.java
  30. 11 0
      src/main/java/com/ydtech/modules/admin/model/vo/TaskStatisticsVo.java
  31. 39 0
      src/main/java/com/ydtech/modules/admin/model/vo/wechat/WechatCustomerCallbackVo.java
  32. 24 0
      src/main/java/com/ydtech/modules/admin/model/vo/wechat/WechatEncryptVo.java
  33. 17 0
      src/main/java/com/ydtech/modules/admin/service/TaskStatisticsService.java
  34. 43 0
      src/main/java/com/ydtech/modules/admin/service/WechatCustomerService.java
  35. 57 10
      src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java
  36. 107 0
      src/main/java/com/ydtech/modules/admin/service/impl/TaskStatisticsServiceImpl.java
  37. 89 0
      src/main/java/com/ydtech/modules/admin/service/impl/WechatCustomerServiceImpl.java
  38. 3 0
      src/main/java/com/ydtech/modules/ins/model/yc/imageUp/ImageUp.java
  39. 4 0
      src/main/java/com/ydtech/modules/order/components/InsCrawlerOrderComponents.java
  40. 3 3
      src/main/java/com/ydtech/modules/order/components/chengtai/ChengTaiRequestApiComponents.java
  41. 5 1
      src/main/java/com/ydtech/modules/order/constants/OrderCacheConstant.java
  42. 18 2
      src/main/java/com/ydtech/modules/order/controller/QuoteController.java
  43. 18 0
      src/main/java/com/ydtech/modules/order/dao/InsAreaCompanyRelatedInfoMapper.java
  44. 149 0
      src/main/java/com/ydtech/modules/order/entity/InsAreaCompanyRelatedInfo.java
  45. 3 0
      src/main/java/com/ydtech/modules/order/entity/InsDrivingIntentionInsurance.java
  46. 35 18
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java
  47. 2 2
      src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/InsurePremiumResponse.java
  48. 9 4
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangAccuracyCalculateRequest.java
  49. 8 8
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangUpLoadRequest.java
  50. 13 0
      src/main/java/com/ydtech/modules/order/service/InsAreaCompanyRelatedInfoService.java
  51. 126 26
      src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java
  52. 22 0
      src/main/java/com/ydtech/modules/order/service/impl/InsAreaCompanyRelatedInfoServiceImpl.java
  53. 0 3
      src/main/java/com/ydtech/modules/order/service/impl/InsOrderPdfUrlServiceImpl.java
  54. 84 5
      src/main/java/com/ydtech/modules/order/service/impl/YangGuangOrderApiServiceImpl.java
  55. 2 0
      src/main/java/com/ydtech/utils/baidu/BusinessLicenseRecognition.java
  56. 25 0
      src/main/java/com/ydtech/utils/cache/BaseCacheConfig.java
  57. 10 0
      src/main/java/com/ydtech/utils/cache/CacheFactory.java
  58. 31 0
      src/main/java/com/ydtech/utils/cache/RedissonUtils.java
  59. 7 0
      src/main/resources/application-pre.yml
  60. 15 1
      src/main/resources/application-prod.yml
  61. 8 2
      src/main/resources/application-test.yml
  62. 55 39
      src/main/resources/mapper/modules/admin/SysUserMapper.xml
  63. 107 15
      src/main/resources/mapper/modules/admin/TaskStatisticsMapper.xml
  64. 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;
+
+}

+ 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";
+
+}

+ 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));
     }
 

+ 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);
+    }
+
+}

+ 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;
+}

+ 12 - 0
src/main/java/com/ydtech/modules/admin/model/vo/SysUserBaseVO.java

@@ -126,4 +126,16 @@ public class SysUserBaseVO {
     @ApiModelProperty(value = "居住地址")
     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;
+
+}

+ 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);
+}

+ 57 - 10
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,7 +57,7 @@ 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;
@@ -72,11 +69,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 +158,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 +207,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
@@ -1542,7 +1586,10 @@ 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) {
@@ -1914,7 +1961,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                     .eq(SysUser::getDeptId, "9914D18")
                     .isNotNull(SysUser::getLeaderId);
             userList.addAll(list(getOperationUser));
-        } else if ("9914D18".equals(landerInfo.getDeptId())) {
+        } 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) {

+ 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 - 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("重复投保")) {
             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> {
+
+}
+
+
+
+

+ 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;
+
     /**
      * 份数
      */

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

@@ -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;
             }
         }
@@ -228,6 +242,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 +259,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";
                     }
                 }

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

@@ -213,7 +213,7 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse {
             @JsonProperty("validDate")
             private String validDate;
             @JsonProperty("coveragePremium")
-            private String coveragePremium;
+            private Double coveragePremium;
             @JsonProperty("glassClassCode")
             private String glassClassCode;
             @JsonProperty("calculateFlag")
@@ -540,7 +540,7 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse {
             @JsonProperty("riskCode")
             private String riskCode;
             @JsonProperty("totalPremium")
-            private String totalPremium;
+            private Double totalPremium;
             @JsonProperty("policyNo")
             private String policyNo;
             @JsonProperty("validAtOnce")

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

@@ -491,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";
+
         }
     }
 

+ 8 - 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();

+ 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> {
+
+}

+ 126 - 26
src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 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.ydtech.constants.enums.InsuranceOrderPdf;
 import com.ydtech.constants.enums.InsuranceRisk;
@@ -35,6 +36,7 @@ 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.DateTimeUtil;
 import com.ydtech.utils.StringUtils;
 import com.ydtech.utils.baidu.FileUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,7 +44,6 @@ 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.*;
@@ -67,6 +68,9 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
     @Autowired
     private InsAreaCompanyService insAreaCompanyService;
 
+    @Autowired
+    private InsAreaCompanyRelatedInfoService insAreaCompanyRelatedInfoService;
+
     @Autowired
     private InsTaskImagesService insTaskImagesService;
 
@@ -98,7 +102,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);
@@ -114,7 +117,9 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         PersonAreaVo personAreaVo = new PersonAreaVo();
         buildRegion(quoteInfoVo,personAreaVo);
         InsurePremiumRequest insurePremiumRequest = new InsurePremiumRequest(quoteInfoVo,carModelListDTO, carActualValueResponse,personAreaVo,parameters,quoteVo, carModelListDTO);
-        InsurePremiumResponse insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+
+        // 重复报价
+        InsurePremiumResponse insurePremiumResponse = this.getResponse(insurePremiumRequest, httpHeaders);
 
         String message = "";
         if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode())){
@@ -150,6 +155,94 @@ 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 response = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+            return response;
+        }
+        return insurePremiumResponse;
+    }
+
+    /**
+     * 重复投保时间处理
+     *
+     * @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);
@@ -179,11 +272,13 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
             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.getCompanyId());
+        info.setJqappoint(quoteRespVo.getJqappoint());
+        info.setSyappoint(quoteRespVo.getSyappoint());
+        insAreaCompanyRelatedInfoService.save(info);
         quoteRespVo.setCompanyId(insAreaCompany.getId());
         return HttpResult.ok("报价成功", quoteRespVo);
 
@@ -200,7 +295,7 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         // 交强
         if(Objects.nonNull(insurePremiumResponse.getCiContract())){
             InsurePremiumResponse.CiContractDTO.ContractMainDTO ciContractMain = insurePremiumResponse.getCiContract().getContractMain();
-            jqPremium = Double.parseDouble(ciContractMain.getTotalPremium());
+            jqPremium = ciContractMain.getTotalPremium();
             quoteRespVo.setStartDateJq(ciContractMain.getValidDate());
             quoteRespVo.setEndDateJq(ciContractMain.getExpiryDate());
             //车船税
@@ -246,7 +341,7 @@ 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(Double.parseDouble(coverageDTO.getCoveragePremium()));
+                kind.setCoveragePremium(coverageDTO.getCoveragePremium());
                 kind.setUnitAmount(Objects.isNull(coverageDTO.getUnitAmount()) ? 0 : coverageDTO.getUnitAmount() );
                 kind.setServiceTimes(coverageDTO.getQuantity());
                 if (!ObjectUtils.isEmpty(kindInfoVo.getDeductibleRate())) {
@@ -386,6 +481,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.getCompanyId());
+        List<InsAreaCompanyRelatedInfo> infoList = insAreaCompanyRelatedInfoService.list(infoLambdaQueryWrapper);
         // 1 通过 协议id获取配置实体
         PtlAgreementAttribution ptlAgreementAttribution = ptlAgreementAttributionService.getById(insAreaCompany.getAgreementId());
         ChengTaiConfigureParameters parameters = configureParametersComponents.toEntity(ChengTaiConfigureParameters.class,
@@ -399,25 +497,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,

+ 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 {
+
+}
+
+
+
+

+ 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())){

+ 84 - 5
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
@@ -130,6 +133,78 @@ public class YangGuangOrderApiServiceImpl implements YangGuangOrderApiService {
         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();
@@ -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);

+ 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();
+    }
+
+}

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

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

+ 15 - 1
src/main/resources/application-prod.yml

@@ -209,7 +209,14 @@ upload:
   password: ''
   url: ${netUrl}
   username: ''
+
 wechat:
+  # 微信客服
+  customer:
+    corp-id: wwfe67d19509d43ec5
+    secret: lbn1DU7VhqK3dG0XDciPDXf_AdSryne84nvRhtSEGLc
+    token: btgwGK2r
+    encoding-aes-key: eevs11QeInJYRysGYnC8gK68F4CGsedM1Dn1X79cPCs
   open:
     properties:
       jzg:
@@ -386,6 +393,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:
@@ -448,4 +462,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

@@ -229,6 +229,12 @@ upload:
   url: ${netUrl}
   username: ''
 wechat:
+  # 微信客服
+  customer:
+    corp-id: wwfe67d19509d43ec5
+    secret: lbn1DU7VhqK3dG0XDciPDXf_AdSryne84nvRhtSEGLc
+    token: btgwGK2r
+    encoding-aes-key: eevs11QeInJYRysGYnC8gK68F4CGsedM1Dn1X79cPCs
   open:
     properties:
       jzg:
@@ -409,7 +415,7 @@ dajia:
 
 # api url
 api:
-  url: http://39.98.239.48/web-api
+  url: https://test.baoxianzhanggui.com/web-api
 
 
 # 国任财险测试
@@ -533,4 +539,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

+ 55 - 39
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">
@@ -1935,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>
 
 

+ 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>

+ 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>