Эх сурвалжийг харах

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

dongxin 1 жил өмнө
parent
commit
82076dbf6a
27 өөрчлөгдсөн 618 нэмэгдсэн , 115 устгасан
  1. 10 9
      sql/Online.sql
  2. 0 7
      src/main/java/com/ydtech/config/MvcConfig.java
  3. 7 8
      src/main/java/com/ydtech/modules/admin/components/WechatCustomerComponents.java
  4. 1 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerListRequest.java
  5. 13 0
      src/main/java/com/ydtech/modules/admin/components/wechat/customer/request/CustomerSendMsgOnEventRequest.java
  6. 20 2
      src/main/java/com/ydtech/modules/admin/controller/SysQyWeChatController.java
  7. 35 0
      src/main/java/com/ydtech/modules/admin/controller/taskStatistics/TaskStatisticsController.java
  8. 9 0
      src/main/java/com/ydtech/modules/admin/controller/wechat/WechatCustomerController.java
  9. 16 0
      src/main/java/com/ydtech/modules/admin/dao/TaskStatisticsMapper.java
  10. 2 0
      src/main/java/com/ydtech/modules/admin/model/dto/SysUserDto.java
  11. 7 6
      src/main/java/com/ydtech/modules/admin/model/po/SysQyWeChat.java
  12. 59 0
      src/main/java/com/ydtech/modules/admin/model/vo/BusinessOrderData.java
  13. 11 0
      src/main/java/com/ydtech/modules/admin/model/vo/TaskStatisticsVo.java
  14. 17 0
      src/main/java/com/ydtech/modules/admin/service/TaskStatisticsService.java
  15. 22 2
      src/main/java/com/ydtech/modules/admin/service/WechatCustomerService.java
  16. 4 1
      src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java
  17. 107 0
      src/main/java/com/ydtech/modules/admin/service/impl/TaskStatisticsServiceImpl.java
  18. 29 15
      src/main/java/com/ydtech/modules/admin/service/impl/WechatCustomerServiceImpl.java
  19. 1 1
      src/main/java/com/ydtech/modules/order/constants/OrderCacheConstant.java
  20. 9 4
      src/main/java/com/ydtech/modules/order/entity/api/yangguang/request/YangGuangAccuracyCalculateRequest.java
  21. 75 0
      src/main/java/com/ydtech/modules/order/service/impl/YangGuangOrderApiServiceImpl.java
  22. 2 0
      src/main/java/com/ydtech/utils/baidu/BusinessLicenseRecognition.java
  23. 2 2
      src/main/resources/application-pre.yml
  24. 2 2
      src/main/resources/application-prod.yml
  25. 2 2
      src/main/resources/application-test.yml
  26. 49 39
      src/main/resources/mapper/modules/admin/SysUserMapper.xml
  27. 107 15
      src/main/resources/mapper/modules/admin/TaskStatisticsMapper.xml

+ 10 - 9
sql/Online.sql

@@ -1,9 +1,10 @@
---  2024-11-29 BY dongxin
-CREATE TABLE `ins_area_company_related_info`  (
-                                                  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键/自增',
-                                                  `company_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '子订单id',
-                                                  `jqappoint` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '交强特别约定',
-                                                  `syappoint` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '商业特别约定',
-                                                  PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '子订单关联信息表' ROW_FORMAT = Dynamic;
---  2024-11-29 BY dongxin
+--  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

+ 0 - 7
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,8 +21,6 @@ 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 {
@@ -142,5 +136,4 @@ public class MvcConfig implements WebMvcConfigurer {
 
     }
 
-
 }

+ 7 - 8
src/main/java/com/ydtech/modules/admin/components/WechatCustomerComponents.java

@@ -41,8 +41,8 @@ public class WechatCustomerComponents {
         return insCrawlerOrderComponents.request(url, "wechatCustomer", wechatCustomer.getDesc(), requestBody, responseType, httpHeaders);
     }
 
-    public WxCryptUtil getWxCryptUtil(){
-        return new WxCryptUtil(wechatCustomerProperties.getToken(),  wechatCustomerProperties.getEncodingAesKey(), wechatCustomerProperties.getCorpId());
+    public WxCryptUtil getWxCryptUtil() {
+        return new WxCryptUtil(wechatCustomerProperties.getToken(), wechatCustomerProperties.getEncodingAesKey(), wechatCustomerProperties.getCorpId());
     }
 
     /**
@@ -53,7 +53,7 @@ public class WechatCustomerComponents {
     private String getToken() {
         return redissonUtils.getFromRedis(() -> {
             CustomerGetTokenRequest customerGetTokenRequest = new CustomerGetTokenRequest(wechatCustomerProperties.getCorpId(), wechatCustomerProperties.getSecret());
-            String url = WechatCustomerEnum.URL + customerGetTokenRequest.getUrlParams();
+            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();
@@ -62,7 +62,6 @@ public class WechatCustomerComponents {
     }
 
 
-
     /**
      * 获取客服账号列表
      *
@@ -70,7 +69,7 @@ public class WechatCustomerComponents {
      * @return 客服账号列表
      */
     public CustomerListResponse list(CustomerListRequest customerListRequest) {
-        return request(WechatCustomerEnum.LIST, customerListRequest, CustomerListResponse.class, HttpHeaders.EMPTY);
+        return request(WechatCustomerEnum.LIST, customerListRequest, CustomerListResponse.class, new HttpHeaders());
     }
 
     /**
@@ -80,7 +79,7 @@ public class WechatCustomerComponents {
      * @return 客服账号链接
      */
     public CustomerAddContactWayResponse addContactWay(CustomerAddContactWayRequest customerAddContactWayRequest) {
-        return request(WechatCustomerEnum.ADD_CONTACT_WAY, customerAddContactWayRequest, CustomerAddContactWayResponse.class, HttpHeaders.EMPTY);
+        return request(WechatCustomerEnum.ADD_CONTACT_WAY, customerAddContactWayRequest, CustomerAddContactWayResponse.class, new HttpHeaders());
     }
 
     /**
@@ -90,7 +89,7 @@ public class WechatCustomerComponents {
      * @return 消息信息
      */
     public CustomerSendMsgOnEventResponse sendMsgOnEvent(CustomerSendMsgOnEventRequest customerSendMsgOnEventRequest) {
-        return request(WechatCustomerEnum.LIST, customerSendMsgOnEventRequest, CustomerSendMsgOnEventResponse.class, HttpHeaders.EMPTY);
+        return request(WechatCustomerEnum.SEND_MSG_ON_EVENT, customerSendMsgOnEventRequest, CustomerSendMsgOnEventResponse.class, new HttpHeaders());
     }
 
     /**
@@ -100,7 +99,7 @@ public class WechatCustomerComponents {
      * @return 成功失败
      */
     public CustomerSyncMsgResponse syncMsg(CustomerSyncMsgRequest customerSyncMsgRequest) {
-        return request(WechatCustomerEnum.SYNC_MSG, customerSyncMsgRequest, CustomerSyncMsgResponse.class, HttpHeaders.EMPTY);
+        return request(WechatCustomerEnum.SYNC_MSG, customerSyncMsgRequest, CustomerSyncMsgResponse.class, new HttpHeaders());
     }
 
 }

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

@@ -1,6 +1,7 @@
 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;

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

@@ -2,6 +2,8 @@ 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;
@@ -52,4 +54,15 @@ public class CustomerSendMsgOnEventRequest extends CustomerBaseRequest {
 
     }
 
+
+    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;
+    }
+
 }

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

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

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

@@ -3,6 +3,7 @@ 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;
@@ -12,6 +13,7 @@ import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 @Api(tags = "微信业务")
 @Slf4j
@@ -38,4 +40,11 @@ public class WechatCustomerController {
         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;
+}

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

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

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

@@ -1,6 +1,10 @@
 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 {
 
@@ -8,16 +12,32 @@ public interface WechatCustomerService {
      * 配置微信客服回调信息
      *
      * @param msgSignature
-     * @param timestamp 时间戳
+     * @param timestamp    时间戳
      * @param nonce
-     * @param echoStr 加密后的参数
+     * @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);
 }

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

@@ -1586,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) {

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

+ 29 - 15
src/main/java/com/ydtech/modules/admin/service/impl/WechatCustomerServiceImpl.java

@@ -3,25 +3,28 @@ 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.SysDept;
 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.SysDeptService;
 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 me.chanjar.weixin.cp.bean.kf.WxCpKfMsgListResp;
-import me.chanjar.weixin.cp.bean.kf.WxCpKfMsgSendRequest;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
 import java.util.List;
 
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class WechatCustomerServiceImpl implements WechatCustomerService {
@@ -30,21 +33,22 @@ public class WechatCustomerServiceImpl implements WechatCustomerService {
 
     private final SysUserService sysUserService;
 
-    private final SysDeptService sysDeptService;
+    private final XmlMapper xmlMapper = new XmlMapper();
 
     @Override
     public String customerCallback(String msgSignature, String timestamp, String nonce, String echoStr) {
-        System.out.println(msgSignature + " " + timestamp + " " + nonce + " " + echoStr);
         WxCryptUtil wxCryptUtil = wechatCustomerComponents.getWxCryptUtil();
         return wxCryptUtil.decrypt(echoStr);
     }
 
     @Override
     public void callbackSendMsgOnEvent(String wechatEncrypt) throws JsonProcessingException {
-        XmlMapper xmlMapper = new XmlMapper();
+        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);
 
         // 获取消息
@@ -56,20 +60,30 @@ public class WechatCustomerServiceImpl implements WechatCustomerService {
         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);
-        String messages = "你好!" + sysUser.getName() + "(" + sysUser.getId() + ")" + "很高兴为你服务";
-
-        // 发送欢迎信息
-        CustomerSendMsgOnEventRequest customerSendMsgOnEventRequest = new CustomerSendMsgOnEventRequest();
-        customerSendMsgOnEventRequest.setMsgtype("text");
-        customerSendMsgOnEventRequest.setMsgid(msgListDTO.getMsgid());
-        customerSendMsgOnEventRequest.setCode(event.getWelcomeCode());
-        customerSendMsgOnEventRequest.setText(new CustomerSendMsgOnEventRequest.TextDTO(messages));
+        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();
+    }
+
 }

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

@@ -112,6 +112,6 @@ public class OrderCacheConstant {
     /**
      * 微信客服token
      */
-    public static final String WECHAT_CUSTOMER_TOKEN = "WECHAT:CUSTOMER:TOKEN";
+    public static final String WECHAT_CUSTOMER_TOKEN = "wechat:customer:token";
 
 }

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

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

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

+ 2 - 2
src/main/resources/application-pre.yml

@@ -223,8 +223,8 @@ wechat:
   customer:
     corp-id: wwfe67d19509d43ec5
     secret: lbn1DU7VhqK3dG0XDciPDXf_AdSryne84nvRhtSEGLc
-    token: HBme3ASL
-    encoding-aes-key: kv1XrZqTDUup27rVatFG3s04DSw2qEAvxg7k9euEROq
+    token: btgwGK2r
+    encoding-aes-key: eevs11QeInJYRysGYnC8gK68F4CGsedM1Dn1X79cPCs
   open:
     properties:
       jzg:

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

@@ -215,8 +215,8 @@ wechat:
   customer:
     corp-id: wwfe67d19509d43ec5
     secret: lbn1DU7VhqK3dG0XDciPDXf_AdSryne84nvRhtSEGLc
-    token: HBme3ASL
-    encoding-aes-key: kv1XrZqTDUup27rVatFG3s04DSw2qEAvxg7k9euEROq
+    token: btgwGK2r
+    encoding-aes-key: eevs11QeInJYRysGYnC8gK68F4CGsedM1Dn1X79cPCs
   open:
     properties:
       jzg:

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

@@ -233,8 +233,8 @@ wechat:
   customer:
     corp-id: wwfe67d19509d43ec5
     secret: lbn1DU7VhqK3dG0XDciPDXf_AdSryne84nvRhtSEGLc
-    token: HBme3ASL
-    encoding-aes-key: kv1XrZqTDUup27rVatFG3s04DSw2qEAvxg7k9euEROq
+    token: btgwGK2r
+    encoding-aes-key: eevs11QeInJYRysGYnC8gK68F4CGsedM1Dn1X79cPCs
   open:
     properties:
       jzg:

+ 49 - 39
src/main/resources/mapper/modules/admin/SysUserMapper.xml

@@ -193,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>
@@ -218,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">
@@ -306,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>
@@ -329,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">
@@ -1941,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>