Răsfoiți Sursa

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

wks 1 an în urmă
părinte
comite
e2acf442a0
33 a modificat fișierele cu 1525 adăugiri și 38 ștergeri
  1. 13 1
      sql/Online.sql
  2. 1 0
      src/main/java/com/ydtech/constants/InsuranceImageEnum.java
  3. 26 0
      src/main/java/com/ydtech/modules/admin/constants/UserAgentStatus.java
  4. 2 2
      src/main/java/com/ydtech/modules/admin/constants/UserWorkStatus.java
  5. 9 0
      src/main/java/com/ydtech/modules/admin/controller/AppCustomerManagementController.java
  6. 2 1
      src/main/java/com/ydtech/modules/admin/controller/SysLoginController.java
  7. 113 0
      src/main/java/com/ydtech/modules/admin/controller/SysUserAgentController.java
  8. 18 0
      src/main/java/com/ydtech/modules/admin/dao/SysUserAgentTrackMapper.java
  9. 17 11
      src/main/java/com/ydtech/modules/admin/model/SysUser.java
  10. 45 0
      src/main/java/com/ydtech/modules/admin/model/dto/AgentAuthDto.java
  11. 17 0
      src/main/java/com/ydtech/modules/admin/model/dto/AgentAuthResultDto.java
  12. 30 0
      src/main/java/com/ydtech/modules/admin/model/dto/AgentSubmitDto.java
  13. 40 0
      src/main/java/com/ydtech/modules/admin/model/dto/AgentUserNewDto.java
  14. 9 0
      src/main/java/com/ydtech/modules/admin/model/dto/SysUserTeamDto.java
  15. 9 0
      src/main/java/com/ydtech/modules/admin/model/dto/SysUserTeamInfoDto.java
  16. 41 0
      src/main/java/com/ydtech/modules/admin/model/dto/SysUserTeamStaticDto.java
  17. 119 0
      src/main/java/com/ydtech/modules/admin/model/po/SysUserAgentTrack.java
  18. 1 1
      src/main/java/com/ydtech/modules/admin/model/vo/AppCustomerManagementQueryVo.java
  19. 31 0
      src/main/java/com/ydtech/modules/admin/model/vo/SysUserAgentVo.java
  20. 5 1
      src/main/java/com/ydtech/modules/admin/service/AppCustomerManagementService.java
  21. 20 0
      src/main/java/com/ydtech/modules/admin/service/SysUserAgentTrackService.java
  22. 32 0
      src/main/java/com/ydtech/modules/admin/service/SysUserService.java
  23. 210 5
      src/main/java/com/ydtech/modules/admin/service/impl/AppCustomerManagementImpl.java
  24. 39 0
      src/main/java/com/ydtech/modules/admin/service/impl/SysUserAgentTrackServiceImpl.java
  25. 203 0
      src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java
  26. 59 0
      src/main/java/com/ydtech/modules/admin/utils/UserAgentTrackUtils.java
  27. 40 4
      src/main/java/com/ydtech/modules/esm/dao/EsmUserReferrerMapper.java
  28. 5 5
      src/main/java/com/ydtech/modules/esm/model/vo/EsmUserCountVO.java
  29. 14 1
      src/main/java/com/ydtech/modules/esm/service/EsmUserReferrerService.java
  30. 53 3
      src/main/java/com/ydtech/modules/esm/service/impl/EsmUserReferrerServiceImpl.java
  31. 31 2
      src/main/java/com/ydtech/modules/fnc/service/contract/impl/contractServiceImpl.java
  32. 23 0
      src/main/resources/mapper/modules/admin/SysUserAgentTrackMapper.xml
  33. 248 1
      src/main/resources/mapper/modules/esm/EsmUserReferrerMapper.xml

+ 13 - 1
sql/Online.sql

@@ -159,7 +159,19 @@ CREATE TABLE `pay_user_sign` (
 ALTER TABLE `agent`.`sys_premium_details` ADD COLUMN `licenseno` varchar(30) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '车牌号';
 ALTER TABLE `agent`.`sys_premium_details` ADD COLUMN `source` tinyint DEFAULT NULL COMMENT '费用来源(1,2,3,4,5级)';
 
-
+-- 2024.11.11 dongxin --
+CREATE TABLE `sys_user_agent_track`  (
+                                         `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键id',
+                                         `user_id` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户id',
+                                         `status` tinyint NULL DEFAULT NULL COMMENT '状态  0.注册 1.认证成功 2.认证失败 3.审核成功 4.审核失败',
+                                         `approve_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '审核人Id',
+                                         `approve_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '审核人',
+                                         `approve_mess` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '审核认证信息',
+                                         `create_by` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',
+                                         `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                         PRIMARY KEY (`id`) USING BTREE,
+                                         INDEX `idx_sys_user_track_user_id`(`user_id` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 571 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '个代用户认证审核轨迹表' ROW_FORMAT = DYNAMIC;
 
 
 

+ 1 - 0
src/main/java/com/ydtech/constants/InsuranceImageEnum.java

@@ -15,6 +15,7 @@ public enum InsuranceImageEnum {
 
     SFZ_01("SFZ_01", "身份证正面"),
     SFZ_02("SFZ_02", "身份证反面"),
+    YHK_01("YHK_01", "银行卡正面"),
 
     ZGZ_00("ZGZ_00", "资格证照片"),
 

+ 26 - 0
src/main/java/com/ydtech/modules/admin/constants/UserAgentStatus.java

@@ -0,0 +1,26 @@
+package com.ydtech.modules.admin.constants;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum UserAgentStatus {
+
+    UAS_0(0, "注册"),
+    UAS_1(1, "认证成功"),
+    UAS_2(2, "认证失败"),
+    UAS_3(3, "银行卡认证成功"),
+    UAS_4(4, "银行卡认证失败");
+    private final Integer code;
+
+    private final String desc;
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+}

+ 2 - 2
src/main/java/com/ydtech/modules/admin/constants/UserWorkStatus.java

@@ -15,8 +15,8 @@ public enum UserWorkStatus {
     UWS_4(4, "离司待审核"),
     UWS_5(5, "离司审核驳回"),
     UWS_6(6, "修改待审核"),
-    UWS_7(7, "修改审核驳回");
-
+    UWS_7(7, "修改审核驳回"),
+    UWS_8(8, "待入司");
     private final Integer code;
 
     private final String desc;

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

@@ -1,9 +1,11 @@
 package com.ydtech.modules.admin.controller;
 
 
+import cn.dev33.satoken.annotation.SaIgnore;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.admin.model.dto.SysUserTeamDto;
 import com.ydtech.modules.admin.model.dto.SysUserTeamInfoDto;
+import com.ydtech.modules.admin.model.dto.SysUserTeamStaticDto;
 import com.ydtech.modules.admin.model.vo.AppCustomerManagementQueryVo;
 import com.ydtech.modules.admin.service.AppCustomerManagementService;
 import com.ydtech.modules.order.entity.BasePageResult;
@@ -20,6 +22,12 @@ public class AppCustomerManagementController {
 
     private final AppCustomerManagementService appCustomerManagementService;
 
+    @ApiOperation(value = "认证统计")
+    @GetMapping(value = "/authStatics")
+    public HttpResult authStatics(Integer dateType) {
+        return appCustomerManagementService.authStatics(dateType);
+    }
+
     @ApiOperation(value = "认证查询")
     @PostMapping(value = "/authenticationQuery")
     public HttpResult<BasePageResult<SysUserTeamDto>> authenticationQuery(@RequestBody AppCustomerManagementQueryVo appCustomerManagementQueryVo) {
@@ -28,6 +36,7 @@ public class AppCustomerManagementController {
 
     @ApiOperation(value = "团队人员详情")
     @GetMapping(value = "/{userId}")
+    @SaIgnore
     public HttpResult<SysUserTeamInfoDto> authenticationQuery(@PathVariable String userId) {
         return appCustomerManagementService.getUserInfo(userId);
     }

+ 2 - 1
src/main/java/com/ydtech/modules/admin/controller/SysLoginController.java

@@ -230,7 +230,7 @@ public class SysLoginController {
                 throw new SystemException("该用户未授权");
             }
         }
-
+        user.setIsLock(0);
         //验证用户
         SysUser.verifyUser(user);
         SysPassword sysPassword = sysPasswordService.getOne(new LambdaQueryWrapper<SysPassword>().eq(SysPassword::getCode, SysPasswordEnum.GENERAL.getCode()));
@@ -396,6 +396,7 @@ public class SysLoginController {
         String phoneMsg = phoneLoginVo.getPhoneMsg();
         SysUser user = sysUserService.findByPhone(phone);
         //验证用户
+        user.setIsLock(0);
         SysUser.verifyUser(user);
         String msg = redisTemplate.opsForValue().get(PHONE_VERIFICATION_CODE_KEY + phone);
         if (msg == null || msg.isEmpty()) {

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

@@ -0,0 +1,113 @@
+package com.ydtech.modules.admin.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.exception.SystemException;
+import com.ydtech.modules.admin.components.UnionPayRequestApiComponent;
+import com.ydtech.modules.admin.components.request.UnionPayRequest;
+import com.ydtech.modules.admin.components.response.UnionPayResponse;
+import com.ydtech.modules.admin.constants.UserAgentStatus;
+import com.ydtech.modules.admin.model.SysDept;
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.model.SysUserRole;
+import com.ydtech.modules.admin.model.dto.AgentAuthDto;
+import com.ydtech.modules.admin.model.dto.AgentAuthResultDto;
+import com.ydtech.modules.admin.model.dto.AgentSubmitDto;
+import com.ydtech.modules.admin.model.dto.AgentUserNewDto;
+import com.ydtech.modules.admin.service.SysDeptService;
+import com.ydtech.modules.admin.service.SysUserRoleService;
+import com.ydtech.modules.admin.service.SysUserService;
+import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.protocol.utils.AssertionUtils;
+import com.ydtech.utils.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.validation.annotation.Validated;
+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 java.util.List;
+import java.util.Objects;
+
+import static com.ydtech.constants.RedisConstant.PHONE_VERIFICATION_CODE_KEY;
+
+@RestController
+@Api(tags = "个代用户控制器")
+@RequestMapping("userAgent")
+@RequiredArgsConstructor
+@Slf4j
+public class SysUserAgentController extends BaseController {
+
+    private final SysUserService sysUserService;
+
+    private final SysDeptService sysDeptService;
+
+    private final StringRedisTemplate redisTemplate;
+
+    private final SysUserRoleService sysUserRoleService;
+
+    @ApiOperation(value = "个代注册")
+    @PostMapping(value = "/agentRegist")
+    @SaIgnore
+    public HttpResult agentRegist(@RequestBody @Validated AgentUserNewDto dto) {
+        List<SysUser> list = sysUserService.lambdaQuery().eq(SysUser::getMobile, dto.getMobile()).list();
+        AssertionUtils.isFail(!list.isEmpty(), "手机号已经被注册请重新跟换手机号。如有疑问请联系管理人员。");
+        String captchaRedis = redisTemplate.opsForValue().get(PHONE_VERIFICATION_CODE_KEY + dto.getMobile());
+        redisTemplate.delete(PHONE_VERIFICATION_CODE_KEY + dto.getMobile());
+        AssertionUtils.isFail(StringUtils.isBlank(captchaRedis), "验证码已失效!");
+        AssertionUtils.isFail(!dto.getMobileMsg().equals(captchaRedis), "验证码错误!");
+        String recommenderid = dto.getReferrerId();
+        SysUser recommender = sysUserService.getById(recommenderid);
+        AssertionUtils.isFail(Objects.isNull(recommender), "推荐人信息不存在!");
+        AssertionUtils.isFail(!"2".equals(dto.getFlag()), "只有个代来源允许注册!");
+        //只有团队长和代理人才能邀请
+        SysUserRole recommenderRole = sysUserRoleService.selectByUserId(recommenderid);
+        if (!recommenderRole.getRoleId().equals(20L) && !recommenderRole.getRoleId().equals(21L)) {
+            return HttpResult.error("只有团队长和代理人才能推荐");
+        }
+        String userId = sysUserService.agentRegist(dto, recommender);
+        return HttpResult.ok("保存成功", userId);
+    }
+
+    @ApiOperation(value = "个代(认证/审核)结果获取")
+    @PostMapping(value = "/getAuthResult")
+    public HttpResult getAuthResult(@RequestBody @Validated AgentAuthResultDto dto) {
+        SysUser sysUser = sysUserService.getByUserId(dto.getUserId());
+        AssertionUtils.isFail(Objects.isNull(sysUser), "用户信息不存在!");
+        AssertionUtils.isFail(!"2".equals(sysUser.getManagementSource()), "只有个代来源需要认证!");
+        return HttpResult.ok(sysUserService.getAuthResult(sysUser,dto));
+    }
+
+    @ApiOperation(value = "个代认证")
+    @PostMapping(value = "/agentAuth")
+    public HttpResult agentAuth(@RequestBody @Validated AgentAuthDto dto) {
+        SysUser sysUser = sysUserService.getByUserId(dto.getUserId());
+        SysUser mobileUser = sysUserService.findByPhone(dto.getMobile());
+        AssertionUtils.isFail(!sysUser.getMobile().equals(dto.getMobile()) && Objects.isNull(mobileUser), "用户手机号未注册!");
+        AssertionUtils.isFail(!"2".equals(sysUser.getManagementSource()), "只有个代来源需要认证!");
+        return HttpResult.ok(sysUserService.agentAuth(sysUser,dto));
+    }
+
+    @ApiOperation(value = "个代资料提交")
+    @PostMapping(value = "/agentSubmit")
+    public HttpResult agentSubmit(@RequestBody @Validated AgentSubmitDto dto) {
+        SysUser sysUser = sysUserService.getByUserId(dto.getUserId());
+        AssertionUtils.isFail(Objects.isNull(sysUser), "用户不存在!");
+        AssertionUtils.isFail(!"2".equals(sysUser.getManagementSource()), "只有个代来源需要资料提交!");
+        SysUser user = sysUserService.getById(sysUser.getId());
+        AssertionUtils.isFail("0".equals(sysUser.getFactorVerify()) || "2".equals(sysUser.getFactorVerify())
+                , "未实名认证的用户不允许提交资料");
+        sysUserService.agentSubmit(user,dto);
+        return HttpResult.ok("提交成功");
+    }
+
+
+
+
+
+}

+ 18 - 0
src/main/java/com/ydtech/modules/admin/dao/SysUserAgentTrackMapper.java

@@ -0,0 +1,18 @@
+package com.ydtech.modules.admin.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.admin.model.po.SysUserAgentTrack;
+
+/**
+* @author dongxin
+* @description 针对表【sys_user_agent_track(个代用户认证审核轨迹表)】的数据库操作Mapper
+* @createDate 2024-11-04 14:57:40
+* @Entity generator.domain.SysUserAgentTrack
+*/
+public interface SysUserAgentTrackMapper extends BaseMapper<SysUserAgentTrack> {
+
+}
+
+
+
+

+ 17 - 11
src/main/java/com/ydtech/modules/admin/model/SysUser.java

@@ -127,7 +127,7 @@ public class SysUser extends BaseEntity {
     private String leaderName;
 
 
-    @ApiModelProperty(value = "三要素验证")
+    @ApiModelProperty(value = "三要素验证 0.未认证 1. 认证成功 2. 认证驳回")
     @TableField(value = "factor_verify")
     private Integer factorVerify;
 
@@ -252,6 +252,10 @@ public class SysUser extends BaseEntity {
     @TableField(value = "dept_type")
     private String deptType;
 
+    @TableField(exist = false)
+    @ApiModelProperty(value = "是否判断锁定状态 0.否 1. 是 默认判断")
+    private Integer isLock = 1;
+
     /**
      * 验证用户
      *
@@ -266,16 +270,18 @@ public class SysUser extends BaseEntity {
         }
 
         // 账号锁定
-        if (user.getStatus() == 0) {
-            throw new SystemException("账号已被锁定,请联系管理员");
-        }
-        // 新注册用户需要审核
-        if (user.getStatus() == 2) {
-            throw new SystemException("新注册用户需要审核,请联系管理员");
-        }
-        // 新注册用户审核不通过
-        if (user.getStatus() == 3) {
-            throw new SystemException("新注册用户审核不通过,请联系管理员");
+        if(user.getIsLock().equals(1)){
+            if (user.getStatus() == 0) {
+                throw new SystemException("账号已被锁定,请联系管理员");
+            }
+            // 新注册用户需要审核
+            if (user.getStatus() == 2) {
+                throw new SystemException("新注册用户需要审核,请联系管理员");
+            }
+            // 新注册用户审核不通过
+            if (user.getStatus() == 3) {
+                throw new SystemException("新注册用户审核不通过,请联系管理员");
+            }
         }
     }
 

+ 45 - 0
src/main/java/com/ydtech/modules/admin/model/dto/AgentAuthDto.java

@@ -0,0 +1,45 @@
+package com.ydtech.modules.admin.model.dto;
+
+import com.ydtech.modules.esm.model.vo.EsmUserImageVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+@Data
+@ApiModel("个代认证DTO")
+public class AgentAuthDto {
+
+    @NotBlank(message = "用户id为空")
+    @ApiModelProperty(value = "用户id",required = true)
+    private String userId;
+
+    @NotBlank(message = "姓名不能为空")
+    @ApiModelProperty(value = "姓名",required = true)
+    private String name;
+
+    @NotBlank(message = "手机号不能为空")
+    @ApiModelProperty(value = "手机号")
+    private String mobile;
+
+    @NotBlank(message = "身份证号不能为空")
+    @ApiModelProperty(value = "身份证")
+    private String identity;
+
+    @NotBlank(message = "身份证有效期不能为空")
+    @ApiModelProperty(value = "身份证有效期")
+    private String identityTime;
+
+    @NotBlank(message = "开户账号不能为空")
+    @ApiModelProperty(value = "开户账号")
+    private String bankName;
+
+    @NotBlank(message = "开户行不能为空")
+    @ApiModelProperty(value = "开户行")
+    private String accountno;
+
+    @ApiModelProperty("影像信息")
+    private List<EsmUserImageVo> esmUserImageVo;
+}

+ 17 - 0
src/main/java/com/ydtech/modules/admin/model/dto/AgentAuthResultDto.java

@@ -0,0 +1,17 @@
+package com.ydtech.modules.admin.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel("个代认证审核结果获取DTO")
+public class AgentAuthResultDto {
+
+    @NotBlank(message = "用户id为空")
+    @ApiModelProperty(value = "用户id",required = true)
+    private String userId;
+
+}

+ 30 - 0
src/main/java/com/ydtech/modules/admin/model/dto/AgentSubmitDto.java

@@ -0,0 +1,30 @@
+package com.ydtech.modules.admin.model.dto;
+
+import com.ydtech.modules.esm.model.vo.EsmUserImageVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+@Data
+@ApiModel("个代资料提交DTO")
+public class AgentSubmitDto {
+
+
+    @NotBlank(message = "开户账号不能为空")
+    @ApiModelProperty(value = "开户账号")
+    private String bankName;
+
+    @NotBlank(message = "开户行不能为空")
+    @ApiModelProperty(value = "开户行")
+    private String accountno;
+
+    @NotBlank(message = "用户id为空")
+    @ApiModelProperty(value = "用户id",required = true)
+    private String userId;
+
+    @ApiModelProperty("影像信息")
+    private List<EsmUserImageVo> esmUserImageVo;
+}

+ 40 - 0
src/main/java/com/ydtech/modules/admin/model/dto/AgentUserNewDto.java

@@ -0,0 +1,40 @@
+package com.ydtech.modules.admin.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+@ApiModel("个代用户DTO")
+public class AgentUserNewDto {
+
+    @NotBlank(message = "姓名不能为空")
+    @ApiModelProperty(value = "姓名",required = true)
+    private String name;
+
+    @NotBlank(message = "手机号不能为空")
+    @ApiModelProperty(value = "手机号",required = true)
+    private String mobile;
+
+    @NotBlank(message = "密码不能为空")
+    @ApiModelProperty(value = "密码" ,required = true)
+    private String password;
+
+    @NotBlank(message = "手机验证码不能为空")
+    @ApiModelProperty(value = "手机验证码",required = true)
+    private String mobileMsg;
+
+    @NotBlank(message = "推荐人ID不能为空")
+    @ApiModelProperty(value = "推荐人ID",required = true)
+    private String referrerId;
+
+    @NotBlank(message = "推荐人名称不能为空")
+    @ApiModelProperty(value = "推荐人名称",required = true)
+    private String referrerName;
+
+    @NotBlank(message = "个代、出单员标识不能为空")
+    @ApiModelProperty(value = "个代、出单员标识:2个代、1出单员",required = true)
+    private String flag;
+}

+ 9 - 0
src/main/java/com/ydtech/modules/admin/model/dto/SysUserTeamDto.java

@@ -30,6 +30,15 @@ public class SysUserTeamDto implements Serializable {
     @ApiModelProperty(value = "状态")
     private Integer status;
 
+    @ApiModelProperty(value = "等级")
+    private Integer level;
+
+    @ApiModelProperty(value = "等级名称")
+    private String levelName;
+
+    @ApiModelProperty(value = "更新时间")
+    private String updateTime;
+
     public SysUserTeamDto(SysUser sysUser) {
         this.id = sysUser.getId();
         this.name = sysUser.getName();

+ 9 - 0
src/main/java/com/ydtech/modules/admin/model/dto/SysUserTeamInfoDto.java

@@ -56,6 +56,15 @@ public class SysUserTeamInfoDto {
     @ApiModelProperty(value = "推荐人姓名")
     private String referrersName;
 
+    @ApiModelProperty(value = "角色")
+    private String roleName;
+
+    @ApiModelProperty(value = "来源")
+    private String source;
+
+    @ApiModelProperty(value = "通过描述")
+    private String passDesc;
+
     public SysUserTeamInfoDto(SysUser sysUser, SysDept sysDept, SysDept  organization, SysUserInfo sysUserInfo) {
         this.organization = organization.getName();
         this.deptId = sysDept.getId();

+ 41 - 0
src/main/java/com/ydtech/modules/admin/model/dto/SysUserTeamStaticDto.java

@@ -0,0 +1,41 @@
+package com.ydtech.modules.admin.model.dto;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@ApiModel("认证数量统计信息")
+@Data
+public class SysUserTeamStaticDto {
+
+    @ApiModelProperty("日期")
+    private String timeDay;
+
+    @ApiModelProperty("全部")
+    private Integer allCount;
+
+    @ApiModelProperty("未审核")
+    private Integer noCount;
+
+    @ApiModelProperty("审核通过")
+    private Integer yesCount;
+
+    @ApiModelProperty("一级代理")
+    private Integer oneCount;
+
+    @ApiModelProperty("二级代理")
+    private Integer twoCount;
+
+    @ApiModelProperty("三级代理")
+    private Integer threeCount;
+
+    @ApiModelProperty("临时代理")
+    private Integer tempCount;
+
+
+    @ApiModelProperty("图表数据")
+    private JSONObject staticsData;
+
+}

+ 119 - 0
src/main/java/com/ydtech/modules/admin/model/po/SysUserAgentTrack.java

@@ -0,0 +1,119 @@
+package com.ydtech.modules.admin.model.po;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 个代用户认证审核轨迹表
+ * @TableName sys_user_agent_track
+ */
+@TableName(value ="sys_user_agent_track")
+@Data
+public class SysUserAgentTrack implements Serializable {
+    /**
+     * 主键id
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 用户id
+     */
+    private String userId;
+
+    /**
+     * 状态  0.注册 1.认证成功 2.认证失败 3. 银行卡认证成功 4. 银行卡认证失败  5.审核成功 6.审核失败
+     */
+    private Integer status;
+
+    /**
+     * 审核人Id
+     */
+    private String approveId;
+
+    /**
+     * 审核人
+     */
+    private String approveName;
+
+    /**
+     * 审核认证信息
+     */
+    private String approveMess;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public boolean equals(Object that) {
+        if (this == that) {
+            return true;
+        }
+        if (that == null) {
+            return false;
+        }
+        if (getClass() != that.getClass()) {
+            return false;
+        }
+        SysUserAgentTrack other = (SysUserAgentTrack) that;
+        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
+            && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId()))
+            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getApproveId() == null ? other.getApproveId() == null : this.getApproveId().equals(other.getApproveId()))
+            && (this.getApproveName() == null ? other.getApproveName() == null : this.getApproveName().equals(other.getApproveName()))
+            && (this.getApproveMess() == null ? other.getApproveMess() == null : this.getApproveMess().equals(other.getApproveMess()))
+            && (this.getCreateBy() == null ? other.getCreateBy() == null : this.getCreateBy().equals(other.getCreateBy()))
+            && (this.getCreateTime() == null ? other.getCreateTime() == null : this.getCreateTime().equals(other.getCreateTime()));
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
+        result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode());
+        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getApproveId() == null) ? 0 : getApproveId().hashCode());
+        result = prime * result + ((getApproveName() == null) ? 0 : getApproveName().hashCode());
+        result = prime * result + ((getApproveMess() == null) ? 0 : getApproveMess().hashCode());
+        result = prime * result + ((getCreateBy() == null) ? 0 : getCreateBy().hashCode());
+        result = prime * result + ((getCreateTime() == null) ? 0 : getCreateTime().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(", userId=").append(userId);
+        sb.append(", status=").append(status);
+        sb.append(", approveId=").append(approveId);
+        sb.append(", approveName=").append(approveName);
+        sb.append(", approveMess=").append(approveMess);
+        sb.append(", createBy=").append(createBy);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 1 - 1
src/main/java/com/ydtech/modules/admin/model/vo/AppCustomerManagementQueryVo.java

@@ -24,7 +24,7 @@ public class AppCustomerManagementQueryVo implements Serializable {
     @ApiModelProperty("工号,用户名,手机号")
     private String criteria;
 
-    @ApiModelProperty("认证状态 1 认证成功 2 认证失败")
+    @ApiModelProperty("认证状态0.未认证 1 认证成功")
     private String authenticationStatus;
 
     @ApiModelProperty(value = "每页页数")

+ 31 - 0
src/main/java/com/ydtech/modules/admin/model/vo/SysUserAgentVo.java

@@ -0,0 +1,31 @@
+package com.ydtech.modules.admin.model.vo;
+
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.model.SysUserInfo;
+import com.ydtech.modules.esm.model.vo.EsmUserImageQueryVo;
+import com.ydtech.modules.esm.model.vo.EsmUserImageVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("个代结果")
+public class SysUserAgentVo {
+
+    @ApiModelProperty("认证/审核结果")
+    private Integer status;
+
+    @ApiModelProperty("用户信息")
+    private SysUser sysUser;
+
+    @ApiModelProperty("用户详情信息")
+    private SysUserInfo sysUserInfo;
+
+    @ApiModelProperty("影像信息")
+    private List<EsmUserImageQueryVo> esmUserImageVo;
+
+    @ApiModelProperty("审核信息")
+    private String desc;
+}

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

@@ -27,5 +27,9 @@ public interface AppCustomerManagementService {
      **/
     HttpResult<SysUserTeamInfoDto> getUserInfo(String userId);
 
-
+    /**
+     * 认证数量统计
+     * @return
+     */
+    HttpResult authStatics(Integer dateType);
 }

+ 20 - 0
src/main/java/com/ydtech/modules/admin/service/SysUserAgentTrackService.java

@@ -0,0 +1,20 @@
+package com.ydtech.modules.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydtech.modules.admin.model.po.SysUserAgentTrack;
+
+/**
+* @author dongxin
+* @description 针对表【sys_user_agent_track(个代用户认证审核轨迹表)】的数据库操作Service
+* @createDate 2024-11-04 14:57:40
+*/
+public interface SysUserAgentTrackService extends IService<SysUserAgentTrack> {
+
+    /**
+     * 认证审核轨迹查询
+     * @param id
+     * @param status
+     * @return
+     */
+    SysUserAgentTrack queryTrack(String id, Integer status);
+}

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

@@ -304,6 +304,38 @@ public interface SysUserService extends BaseIService<SysUser> {
 
 
     boolean addInfo(SysUser sysUser);
+
+    /**
+     * 个代注册
+     *
+     * @param dto 注册dto
+     * @param recommender 推荐人信息
+     * @return
+     */
+    String agentRegist(AgentUserNewDto dto, SysUser recommender);
+
+    /**
+     * 个代认证
+     *
+     * @param sysUser 用户信息
+     * @param dto 认证dto
+     */
+    SysUserAgentVo agentAuth(SysUser sysUser, AgentAuthDto dto);
+
+    /**
+     * 个代(认证/审核)结果获取
+     * @param sysUser
+     * @param dto
+     */
+    SysUserAgentVo getAuthResult(SysUser sysUser, AgentAuthResultDto dto);
+
+    /**
+     * 个代资料提交
+     * @param sysUser
+     * @param dto
+     * @return
+     */
+    void agentSubmit(SysUser sysUser, AgentSubmitDto dto);
 }
 
 

+ 210 - 5
src/main/java/com/ydtech/modules/admin/service/impl/AppCustomerManagementImpl.java

@@ -1,26 +1,40 @@
 package com.ydtech.modules.admin.service.impl;
 
 
+import cn.hutool.core.collection.CollUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ydtech.constants.enums.dict.organization.OrganizationSource;
 import com.ydtech.core.page.HttpResult;
-import com.ydtech.modules.admin.model.SysDept;
-import com.ydtech.modules.admin.model.SysUser;
-import com.ydtech.modules.admin.model.SysUserInfo;
-import com.ydtech.modules.admin.model.SysUserTrack;
+import com.ydtech.exception.SystemException;
+import com.ydtech.modules.admin.constants.RoleConstants;
+import com.ydtech.modules.admin.constants.UserAgentStatus;
+import com.ydtech.modules.admin.constants.UserWorkStatus;
+import com.ydtech.modules.admin.model.*;
 import com.ydtech.modules.admin.model.dto.SysUserTeamDto;
 import com.ydtech.modules.admin.model.dto.SysUserTeamInfoDto;
+import com.ydtech.modules.admin.model.dto.SysUserTeamStaticDto;
+import com.ydtech.modules.admin.model.po.SysUserAgentTrack;
 import com.ydtech.modules.admin.model.vo.AppCustomerManagementQueryVo;
 import com.ydtech.modules.admin.service.*;
 import com.ydtech.modules.base.controller.BaseController;
 import com.ydtech.modules.esm.model.EsmUserReferrer;
 import com.ydtech.modules.esm.service.EsmUserReferrerService;
 import com.ydtech.modules.order.entity.BasePageResult;
+import com.ydtech.utils.DateUtil;
 import com.ydtech.utils.StringUtils;
 import lombok.RequiredArgsConstructor;
+import org.apache.bcel.generic.LADD;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 @Service
@@ -31,12 +45,17 @@ public class AppCustomerManagementImpl implements AppCustomerManagementService {
 
     private final SysDeptService sysDeptService;
 
+    private final SysUserRoleService sysUserRoleService;
+
+
     private final EsmUserReferrerService esmUserReferrerService;
 
     private final SysUserInfoService sysUserInfoService;
 
     private final SysUserTrackService sysUserTrackService;
 
+    private final SysUserAgentTrackService sysUserAgentTrackService;
+
 
     @Override
     public HttpResult<BasePageResult<SysUserTeamDto>> authenticationQuery(AppCustomerManagementQueryVo managementQueryVo) {
@@ -62,7 +81,7 @@ public class AppCustomerManagementImpl implements AppCustomerManagementService {
             return HttpResult.ok(sysUserBasePageResult);
         }
 
-        BasePageResult<SysUserTeamDto> sysUserBasePageResult = esmUserReferrerService.getTeamUser(managementQueryVo, userId);
+        BasePageResult<SysUserTeamDto> sysUserBasePageResult = esmUserReferrerService.getTeamUser(managementQueryVo, userId,dept);
         return HttpResult.ok(sysUserBasePageResult);
     }
 
@@ -89,7 +108,193 @@ public class AppCustomerManagementImpl implements AppCustomerManagementService {
             sysUserTeamInfoDto.setReferrersId(esmUserReferrer.getReferrerId());
             sysUserTeamInfoDto.setReferrersName(esmUserReferrer.getReferrerName());
         }
+        SysUserRole role = sysUserRoleService.selectByUserId(userId);
+        if(Objects.nonNull(role)){
+            RoleConstants roleConstants = Enum.valueOf(RoleConstants.class, "R" + role.getRoleId());
+            sysUserTeamInfoDto.setRoleName(roleConstants.getName());
+        }
 
+        switch (dept.getManagementSource()){
+            case "1":
+                sysUserTeamInfoDto.setSource(OrganizationSource.OS_1.getDesc());
+                break;
+            case "2":
+                sysUserTeamInfoDto.setSource(OrganizationSource.OS_2.getDesc());
+                break;
+            case "3":
+                sysUserTeamInfoDto.setSource(OrganizationSource.OS_3.getDesc());
+                break;
+        }
+        // 个代
+        if (OrganizationSource.OS_2.getCode().equals(dept.getManagementSource())) {
+            // 实名认证通过
+            if (UserWorkStatus.UWS_8.getCode().equals(sysUser.getStatus())) {
+                SysUserAgentTrack track = sysUserAgentTrackService.queryTrack(sysUser.getId(),
+                        UserAgentStatus.UAS_1.getCode());
+                if (Objects.nonNull(track)) {
+                    String desc = track.getCreateTime() + "由系统认证通过";
+                    sysUserTeamInfoDto.setPassDesc(desc);
+                }
+            // 实名认证未通过
+            } else if(UserWorkStatus.UWS_0.getCode().equals(sysUser.getStatus()) && sysUser.getFactorVerify().equals(2)){
+                SysUserAgentTrack track = sysUserAgentTrackService.queryTrack(sysUser.getId(),
+                        UserAgentStatus.UAS_2.getCode());
+                if (Objects.nonNull(track)) {
+                    String desc = "认证申请被驳回,驳回理由:" + track.getApproveMess();
+                    sysUserTeamInfoDto.setPassDesc(desc);
+                }
+            }
+            // 审核驳回
+            if (UserWorkStatus.UWS_3.getCode().equals(sysUser.getStatus())) {
+                String desc = sysUserTrackService.getApproveMessByUserId(sysUser.getId(),"1");
+                String passDesc = "提交资料申请被驳回,驳回理由:" + desc;
+                sysUserTeamInfoDto.setPassDesc(passDesc);
+            // 审核通过
+            } else {
+                SysUserTrack track = sysUserTrackService.getLastTime(sysUser.getId());
+                if (Objects.nonNull(track)) {
+                    String desc = DateUtil.getDateFormat(track.getApproveTime(),"yyyy-MM-dd HH:mm:ss") + "由"+track.getApproveBy()+"审核通过";
+                    sysUserTeamInfoDto.setPassDesc(desc);
+                }
+            }
+        }
         return HttpResult.ok(sysUserTeamInfoDto);
     }
+
+    @Override
+    public HttpResult authStatics(Integer dateType) {
+        String userId = BaseController.getUserId();
+        // 获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+        String start = "";
+        String end = "";
+        // 格式化输出
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        // 设置结束时间(当前时间)
+        LocalDateTime endTime = now.withHour(23).withMinute(59).withSecond(59).withNano(0);
+        LocalDateTime startTime = null;
+        // 当天
+        if (dateType.equals(1)){
+            startTime = now.toLocalDate().atStartOfDay();
+        // 七天
+        } else if(dateType.equals(2)){
+            // 获取七天前的日期
+            LocalDateTime sevenDaysAgo = now.minusDays(7);
+            startTime = sevenDaysAgo.toLocalDate().atStartOfDay();
+        // 三十天
+        } else if(dateType.equals(3)){
+            // 获取三十天前的日期
+            LocalDateTime sevenDaysAgo = now.minusDays(30);
+            startTime = sevenDaysAgo.toLocalDate().atStartOfDay();
+        }
+        if(!dateType.equals(0)){
+            start = startTime.format(formatter);
+            end = endTime.format(formatter);
+        }
+        List<SysUserTeamStaticDto> dtos = esmUserReferrerService.authStatics(userId,start,end,dateType);
+
+        /** 前端统计图所需数据组装 start */
+        SysUserTeamStaticDto result = new SysUserTeamStaticDto();
+        JSONObject res = new JSONObject();
+        JSONArray cate = new JSONArray();
+        JSONArray series = new JSONArray();
+        if(CollUtil.isEmpty(dtos)){
+            result.setAllCount(0);
+            result.setOneCount(0);
+            result.setTwoCount(0);
+            result.setThreeCount(0);
+            result.setNoCount(0);
+            result.setTempCount(0);
+            result.setYesCount(0);
+            if (dateType.equals(1)){
+                cate.add("一级代理");
+                cate.add("二级代理");
+                cate.add("三级代理");
+                cate.add("临时代理");
+                series.add(0);
+                series.add(0);
+                series.add(0);
+                series.add(0);
+            }
+        }
+        if (dateType.equals(1)){
+            if(CollUtil.isNotEmpty(dtos)){
+                for (SysUserTeamStaticDto dto : dtos) {
+                    BeanUtils.copyProperties(dto, result);
+                    cate.add("一级代理");
+                    cate.add("二级代理");
+                    cate.add("三级代理");
+                    cate.add("临时代理");
+                    series.add(dto.getOneCount());
+                    series.add(dto.getTwoCount());
+                    series.add(dto.getThreeCount());
+                    series.add(dto.getTempCount());
+                }
+            }
+            res.put("categories", cate);
+            res.put("series", series);
+            result.setStaticsData(res);
+            // 七天
+        } else if(dateType.equals(2) || dateType.equals(3)){
+            Integer totalOne = 0;
+            Integer totalTwo = 0;
+            Integer totalThree = 0;
+            Integer totalTemp = 0;
+            Integer totalAll = 0;
+            Integer totalNo = 0;
+            Integer totalYes = 0;
+
+            JSONObject one = new JSONObject();
+            one.put("name","一级代理");
+            JSONArray oneArray = new JSONArray();
+            JSONObject two = new JSONObject();
+            two.put("name","二级代理");
+            JSONArray twoArray = new JSONArray();
+            JSONObject three = new JSONObject();
+            three.put("name","三级代理");
+            JSONArray threeArray = new JSONArray();
+            JSONObject temp = new JSONObject();
+            temp.put("name","临时代理");
+            JSONArray tempArray = new JSONArray();
+            for (SysUserTeamStaticDto dto : dtos) {
+                totalOne += dto.getOneCount();
+                totalTwo += dto.getTwoCount();
+                totalThree += dto.getThreeCount();
+                totalTemp += dto.getTempCount();
+                totalAll += dto.getAllCount();
+                totalNo += dto.getNoCount();
+                totalYes += dto.getYesCount();
+                oneArray.add(dto.getOneCount());
+                twoArray.add(dto.getTwoCount());
+                threeArray.add(dto.getThreeCount());
+                tempArray.add(dto.getTempCount());
+                cate.add(dto.getTimeDay().substring(5));
+            }
+            one.put("data",oneArray);
+            two.put("data",twoArray);
+            three.put("data",threeArray);
+            temp.put("data",tempArray);
+            series.add(one);
+            series.add(two);
+            series.add(three);
+            series.add(temp);
+            res.put("categories", cate);
+            res.put("series", series);
+            result.setOneCount(totalOne);
+            result.setTwoCount(totalTwo);
+            result.setThreeCount(totalThree);
+            result.setTempCount(totalTemp);
+            result.setAllCount(totalAll);
+            result.setNoCount(totalNo);
+            result.setYesCount(totalYes);
+            result.setStaticsData(res);
+        }else{
+            if(CollUtil.isNotEmpty(dtos)){
+                BeanUtils.copyProperties(dtos.get(0), result);
+            }
+        }
+        /** 前端统计图所需数据组装 end */
+        return HttpResult.ok(result);
+    }
+
 }

+ 39 - 0
src/main/java/com/ydtech/modules/admin/service/impl/SysUserAgentTrackServiceImpl.java

@@ -0,0 +1,39 @@
+package com.ydtech.modules.admin.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ydtech.modules.admin.dao.SysUserAgentTrackMapper;
+import com.ydtech.modules.admin.model.po.SysUserAgentTrack;
+import com.ydtech.modules.admin.service.SysUserAgentTrackService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+* @author dongxin
+* @description 针对表【sys_user_agent_track(个代用户认证审核轨迹表)】的数据库操作Service实现
+* @createDate 2024-11-04 14:57:40
+*/
+@Service
+public class SysUserAgentTrackServiceImpl extends ServiceImpl<SysUserAgentTrackMapper, SysUserAgentTrack>
+    implements SysUserAgentTrackService {
+
+    @Override
+    public SysUserAgentTrack queryTrack(String id, Integer status) {
+        LambdaQueryWrapper<SysUserAgentTrack> trackLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        trackLambdaQueryWrapper.eq(SysUserAgentTrack::getUserId, id)
+                .eq(SysUserAgentTrack::getStatus, status)
+                .orderByDesc(SysUserAgentTrack::getId);
+        List<SysUserAgentTrack> trackList = this.list(trackLambdaQueryWrapper);
+        if(CollUtil.isNotEmpty(trackList)){
+            return trackList.get(0);
+        }
+        return new SysUserAgentTrack();
+    }
+
+}
+
+
+
+

+ 203 - 0
src/main/java/com/ydtech/modules/admin/service/impl/SysUserServiceImpl.java

@@ -3,6 +3,7 @@ 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;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -19,8 +20,12 @@ import com.ydtech.core.page.HttpResult;
 import com.ydtech.core.page.PageResult;
 import com.ydtech.exception.SystemException;
 import com.ydtech.handler.CreateAndUpdateMetaObjectHandler;
+import com.ydtech.modules.admin.components.UnionPayRequestApiComponent;
+import com.ydtech.modules.admin.components.request.UnionPayRequest;
+import com.ydtech.modules.admin.components.response.UnionPayResponse;
 import com.ydtech.modules.admin.constants.QuMarks;
 import com.ydtech.modules.admin.constants.RoleConstants;
+import com.ydtech.modules.admin.constants.UserAgentStatus;
 import com.ydtech.modules.admin.constants.UserWorkStatus;
 import com.ydtech.modules.admin.dao.SysDeptMapper;
 import com.ydtech.modules.admin.dao.SysPartnerMapper;
@@ -28,20 +33,26 @@ import com.ydtech.modules.admin.dao.SysUserLinkAreaMapper;
 import com.ydtech.modules.admin.dao.SysUserMapper;
 import com.ydtech.modules.admin.model.*;
 import com.ydtech.modules.admin.model.dto.*;
+import com.ydtech.modules.admin.model.po.SysUserAgentTrack;
 import com.ydtech.modules.admin.model.po.SysUserIsDial;
 import com.ydtech.modules.admin.model.po.SysUserTreeShowLevel;
 import com.ydtech.modules.admin.model.vo.*;
 import com.ydtech.modules.admin.service.*;
 import com.ydtech.modules.admin.utils.RecordUserUtils;
+import com.ydtech.modules.admin.utils.UserAgentTrackUtils;
 import com.ydtech.modules.base.controller.BaseController;
 import com.ydtech.modules.base.model.dto.PageDto;
 import com.ydtech.modules.base.model.vo.PageVo;
 import com.ydtech.modules.esm.model.EsmUserImage;
 import com.ydtech.modules.esm.model.EsmUserReferrer;
+import com.ydtech.modules.esm.model.vo.EsmUserImageQueryVo;
 import com.ydtech.modules.esm.model.vo.EsmUserImageVo;
 import com.ydtech.modules.esm.service.EsmUserImageService;
 import com.ydtech.modules.esm.service.EsmUserReferrerService;
+import com.ydtech.modules.message.constants.MessageTypeConstants;
+import com.ydtech.modules.message.service.MessageSecretaryService;
 import com.ydtech.security.utils.PasswordUtils;
+import com.ydtech.utils.IDCardUtils;
 import com.ydtech.utils.StringUtils;
 import com.ydtech.utils.idgen.IdGenerate;
 import lombok.extern.slf4j.Slf4j;
@@ -128,6 +139,18 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Resource
     private SysPartnerMapper sysPartnerMapper;
 
+    @Autowired
+    private MessageSecretaryService messageSecretaryService;
+
+    @Autowired
+    private UnionPayRequestApiComponent unionPayRequestApiComponent;
+
+    @Autowired
+    private SysUserAgentTrackService sysUserAgentTrackService;
+
+    @Autowired
+    private SysUserBankCardService bankCardService;
+
     @Value("${httpUrl}")
     private String httpUrl;
     @Override
@@ -2421,4 +2444,184 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     }
 
 
+    @Override
+    @Transactional
+    public String agentRegist(AgentUserNewDto dto, SysUser recommender) {
+        int noCount = 3;
+        //根据机构号获取userid最大值,不需要加人员类型判断  从sys_user获取
+        String maxId = this.findMaxId(recommender.getDeptId());
+        String nextPK = StringUtils.isNullOrEmpty(maxId)? recommender.getDeptId() + "001"
+                : IdGenerate.nextCode(maxId, noCount);
+        SysUser sysUser = new SysUser();
+        sysUser.setId(nextPK);
+        sysUser.setName(dto.getName());
+        sysUser.setMobile(dto.getMobile());
+        sysUser.setDeptId(recommender.getDeptId());
+        //密码加密
+        String salt = PasswordUtils.getSalt();
+        sysUser.setSalt(salt);
+        String password = PasswordUtils.encode(dto.getPassword(), salt);
+        sysUser.setPassword(password);
+        sysUser.setStatus(UserWorkStatus.UWS_0.getCode());
+        sysUser.setCreateBy("admin");
+        sysUser.setCreateTime(new Date());
+        sysUser.setFactorVerify(0);  // 未认证状态
+        sysUser.setUpdateTime(new Date());
+        sysUser.setUpdateBy("admin");
+        this.save(sysUser);
+        //角色配置
+        SysUserRole userRole = new SysUserRole();
+        userRole.setUserId(nextPK);
+        userRole.setRoleId(20l);
+        sysUserRoleService.save(userRole);
+        //添加增员服务消息
+        //添加订单消息
+        messageSecretaryService.addMessage(MessageTypeConstants.M_6, dto.getReferrerId(),
+                dto.getMobile() + "(" + dto.getName() + ")" + "进行注册,请立即认证审核.");
+        esmUserReferrerService.addReferrer(dto.getReferrerId(), nextPK);
+
+        // 保存个代认证轨迹
+        SpringUtil.getBean(UserAgentTrackUtils.class).addTrack(
+                sysUser.getId(), UserAgentStatus.UAS_0.getCode(),
+                "admin");
+        return sysUser.getId();
+    }
+
+    @Override
+    @Transactional
+    public SysUserAgentVo agentAuth(SysUser sysUser, AgentAuthDto dto) {
+        SysUser user = this.getById(sysUser.getId());
+        String msg;
+        Integer status;
+        SysUserAgentVo userAgentVo = new SysUserAgentVo();
+        // 三要素认证
+        UnionPayRequest request = new UnionPayRequest();
+        request.setName(dto.getName());
+        request.setPhoneNo(dto.getMobile());
+        request.setCertNo(dto.getIdentity());
+        UnionPayResponse response = unionPayRequestApiComponent.threeFactorVerifyRequest(request);
+        if (response != null&&!"00".equals(response.getRespCode())) {
+            msg = "认证信息不一致:"+response.getDetailRespMsg();
+            status = UserAgentStatus.UAS_2.getCode();
+            user.setFactorVerify(2); // 认证失败 即未认证状态
+            userAgentVo.setStatus(status);
+            userAgentVo.setDesc(msg);
+        }else{
+            msg = "认证成功";
+            status = UserAgentStatus.UAS_1.getCode();
+            user.setFactorVerify(1);
+            user.setStatus(UserWorkStatus.UWS_8.getCode());
+            userAgentVo.setStatus(status);
+        }
+        user.setName(dto.getName());
+        user.setMobile(dto.getMobile());
+        user.setIdentity(dto.getIdentity());
+        user.setIdentityTime(dto.getIdentityTime());
+        user.setUpdateBy("admin");
+        user.setUpdateTime(new Date());
+        this.saveOrUpdate(user);
+
+        SysUserInfo sysUserInfo = new SysUserInfo();
+        sysUserInfo.setId(user.getId());
+        // 根据身份证获取出生日期和性别
+        sysUserInfo.setBirthday(LocalDate.parse(IDCardUtils.GetBirthday(dto.getIdentity())));
+        sysUserInfo.setSex(IDCardUtils.GetSex(dto.getIdentity()).equalsIgnoreCase("FEMALE") ? "F" : "M");
+        sysUserInfo.setBankName(dto.getBankName());
+        sysUserInfo.setAccountno(dto.getAccountno());
+        sysUserInfoService.saveOrUpdate(sysUserInfo);
+        // 影像资料
+        LambdaQueryWrapper<EsmUserImage> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(EsmUserImage::getUserId, user.getId());
+        esmUserImageService.remove(wrapper);
+
+        List<EsmUserImageVo> esmUserImageVo = dto.getEsmUserImageVo();
+        String finalUserId = user.getId();
+        List<EsmUserImage> esmUserImages = esmUserImageVo.stream().map(x -> new EsmUserImage(x, finalUserId)).collect(Collectors.toList());
+        esmUserImageService.saveBatch(esmUserImages);
+        // 保存个代认证轨迹
+        SpringUtil.getBean(UserAgentTrackUtils.class).addTrack(
+                user.getId(), status,
+                BaseController.getUserName(),
+                null, msg);
+        return userAgentVo;
+    }
+
+    @Override
+    public SysUserAgentVo getAuthResult(SysUser sysUser, AgentAuthResultDto dto) {
+        SysUser user = this.getById(sysUser.getId());
+        SysUserInfo info = sysUserInfoService.getById(sysUser.getId());
+        SysUserAgentVo userAgentVo = new SysUserAgentVo();
+        userAgentVo.setSysUser(user);
+        if (Objects.nonNull(info)){
+            userAgentVo.setSysUserInfo(info);
+        }
+
+        if (UserWorkStatus.UWS_0.getCode().equals(user.getStatus()) && user.getFactorVerify().equals(2)) {
+            SysUserAgentTrack track = sysUserAgentTrackService.queryTrack(sysUser.getId(),
+                    UserAgentStatus.UAS_2.getCode());
+            if (Objects.nonNull(track)) {
+                userAgentVo.setDesc(track.getApproveMess());
+            }
+        } else if(UserWorkStatus.UWS_3.getCode().equals(user.getStatus())){
+            userAgentVo.setDesc(sysUserTrackService.getApproveMessByUserId(sysUser.getId(),"1"));
+        }
+        List<EsmUserImageQueryVo> esmUserImageQueryVo = esmUserImageService.getEsmUserImageQueryVo(sysUser.getId());
+        if(CollUtil.isNotEmpty(esmUserImageQueryVo)){
+            userAgentVo.setEsmUserImageVo(esmUserImageQueryVo);
+        }
+        return userAgentVo;
+    }
+
+    @Override
+    @Transactional
+    public void agentSubmit(SysUser user, AgentSubmitDto dto) {
+        SysUserInfo info = sysUserInfoService.getById(user.getId());
+        // 银行卡认证
+        UnionPayRequest request = new UnionPayRequest();
+        request.setName(user.getName());
+        request.setPhoneNo(user.getMobile());
+        request.setCertNo(user.getIdentity());
+        request.setCardNo(dto.getBankName());
+        UnionPayResponse response = unionPayRequestApiComponent.bankCardVerifyRequest(request);
+        String msg;
+        Integer status;
+        if (response != null&&!"00".equals(response.getRespCode())) {
+            msg = "认证信息不一致:"+response.getDetailRespMsg();
+            status = UserAgentStatus.UAS_4.getCode();
+        }else{
+            msg = "银行卡认证成功";
+            status = UserAgentStatus.UAS_3.getCode();
+            SysUserBankCardVO sysUserBankCardVO = new SysUserBankCardVO();
+            sysUserBankCardVO.setUserId(dto.getUserId());
+            sysUserBankCardVO.setBankNumber(dto.getBankName());
+            sysUserBankCardVO.setBankAccount(dto.getAccountno());
+            sysUserBankCardVO.setPhoneNo(user.getMobile());
+            sysUserBankCardVO.setRealUserName(user.getName());
+            sysUserBankCardVO.setUserName(user.getName());
+            bankCardService.insertByBankNumber(sysUserBankCardVO);
+        }
+        // 保存个代银行卡认证轨迹
+        SpringUtil.getBean(UserAgentTrackUtils.class).addTrack(
+                user.getId(), status,
+                BaseController.getUserName(),
+                null, msg);
+
+        user.setStatus(UserWorkStatus.UWS_2.getCode());
+        user.setUpdateBy("admin");
+        user.setUpdateTime(new Date());
+        this.saveOrUpdate(user);
+        info.setBankName(dto.getBankName());
+        info.setAccountno(dto.getAccountno());
+        sysUserInfoService.saveOrUpdate(info);
+        // 影像资料
+        LambdaQueryWrapper<EsmUserImage> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(EsmUserImage::getUserId, user.getId());
+        esmUserImageService.remove(wrapper);
+
+        List<EsmUserImageVo> esmUserImageVo = dto.getEsmUserImageVo();
+        String finalUserId = user.getId();
+        List<EsmUserImage> esmUserImages = esmUserImageVo.stream().map(x -> new EsmUserImage(x, finalUserId)).collect(Collectors.toList());
+        esmUserImageService.saveBatch(esmUserImages);
+    }
+
 }

+ 59 - 0
src/main/java/com/ydtech/modules/admin/utils/UserAgentTrackUtils.java

@@ -0,0 +1,59 @@
+package com.ydtech.modules.admin.utils;
+
+import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.model.SysUserRecord;
+import com.ydtech.modules.admin.model.po.SysUserAgentTrack;
+import com.ydtech.modules.admin.service.SysUserAgentTrackService;
+import com.ydtech.modules.admin.service.SysUserService;
+import com.ydtech.utils.StringUtils;
+import com.ydtech.utils.idgen.IdGenerate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@Service
+public class UserAgentTrackUtils {
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @Autowired
+    private SysUserAgentTrackService sysUserAgentTrackService;
+
+    @Async
+    public void addTrack (String userId ,
+                          Integer status,
+                          String createBy,
+                          String approveId,
+                          String msg){
+        SysUserAgentTrack sysUserAgentTrack = new SysUserAgentTrack();
+        sysUserAgentTrack.setUserId(userId);
+        sysUserAgentTrack.setCreateBy(createBy);
+        sysUserAgentTrack.setCreateTime(LocalDateTime.now());
+        sysUserAgentTrack.setStatus(status);
+        sysUserAgentTrack.setApproveMess(msg);
+        if(StringUtils.isNotBlank(approveId)){
+            SysUser approveUser = sysUserService.getByUserId(approveId);
+            sysUserAgentTrack.setApproveId(approveId);
+            sysUserAgentTrack.setApproveName(approveUser.getName());
+        }else {
+            sysUserAgentTrack.setApproveName("系统认证");
+        }
+        sysUserAgentTrackService.save(sysUserAgentTrack);
+    }
+
+    @Async
+    public void addTrack (String userId ,
+                          Integer status,
+                          String createBy){
+        SysUserAgentTrack sysUserAgentTrack = new SysUserAgentTrack();
+        sysUserAgentTrack.setUserId(userId);
+        sysUserAgentTrack.setCreateBy(createBy);
+        sysUserAgentTrack.setCreateTime(LocalDateTime.now());
+        sysUserAgentTrack.setStatus(status);
+        sysUserAgentTrackService.save(sysUserAgentTrack);
+    }
+}

+ 40 - 4
src/main/java/com/ydtech/modules/esm/dao/EsmUserReferrerMapper.java

@@ -3,10 +3,7 @@ package com.ydtech.modules.esm.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ydtech.modules.admin.model.SysUser;
-import com.ydtech.modules.admin.model.dto.EmployeeIncreaseReportDto;
-import com.ydtech.modules.admin.model.dto.EsmUserReferrerDTO;
-import com.ydtech.modules.admin.model.dto.SysUserDto;
-import com.ydtech.modules.admin.model.dto.SysUserTeamDto;
+import com.ydtech.modules.admin.model.dto.*;
 import com.ydtech.modules.admin.model.vo.AppCustomerManagementQueryVo;
 import com.ydtech.modules.admin.model.vo.QxFrontlineAgentVo;
 import com.ydtech.modules.admin.model.vo.SysReferrerVo;
@@ -261,5 +258,44 @@ public interface EsmUserReferrerMapper extends BaseMapper<EsmUserReferrer> {
      */
     List<SysUserTeamDto>  getByTeamByLevel(@Param("userId") String userId,@Param("level") String level,@Param("status") String status);
 
+    /**
+     * 个代当天认证统计
+     * @param userId
+     * @param level
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    List<SysUserTeamStaticDto> authNowStatics(@Param("userId")String userId, @Param("level")int level, @Param("startDate")String startDate, @Param("endDate")String endDate);
+
+    /**
+     * 个代七天认证统计
+     *
+     * @param userId
+     * @param level
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    List<SysUserTeamStaticDto> authSevenStatics(@Param("userId")String userId, @Param("level")int level, @Param("startDate")String startDate, @Param("endDate")String endDate);
+
+
+    /**
+     * 个代三十天认证统计
+     * @param userId
+     * @param level
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    List<SysUserTeamStaticDto> authThreeStatics(@Param("userId")String userId, @Param("level")int level, @Param("startDate")String startDate, @Param("endDate")String endDate);
+
+    /**
+     *  个代总数统计
+     * @param userId
+     * @param level
+     * @return
+     */
+    List<SysUserTeamStaticDto> authStatics(@Param("userId")String userId, @Param("level")int level);
 
 }

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

@@ -51,11 +51,11 @@ public class EsmUserCountVO implements Serializable {
         public AggregateDataList(List<EsmUserPolicyVO> userPolicyList) {
             AggregateData aggregateDataO = new AggregateData();
             userPolicyList.forEach(x->{
-                aggregateDataO.setOrdernum(aggregateDataO.getOrdernum() + aggregateDataO.getOrdernum());
-                aggregateDataO.setPolicynum(aggregateDataO.getPolicynum() + aggregateDataO.getPolicynum());
-                aggregateDataO.setSumpremium(aggregateDataO.getSumpremium() + aggregateDataO.getSumpremium());
-                aggregateDataO.setBjpolicynum(aggregateDataO.getBjpolicynum() + aggregateDataO.getBjpolicynum());
-                aggregateDataO.setBjsumpremium(aggregateDataO.getBjsumpremium() + aggregateDataO.getBjpolicynum());
+                aggregateDataO.setOrdernum(aggregateDataO.getOrdernum() + x.getOrdernum());
+                aggregateDataO.setPolicynum(aggregateDataO.getPolicynum() + x.getPolicynum());
+                aggregateDataO.setSumpremium(aggregateDataO.getSumpremium() + x.getSumpremium());
+                aggregateDataO.setBjpolicynum(aggregateDataO.getBjpolicynum() + x.getBjpolicynum());
+                aggregateDataO.setBjsumpremium(aggregateDataO.getBjsumpremium() + x.getBjpolicynum());
             });
             this.userPolicyList = userPolicyList;
             this.aggregateData = aggregateDataO;

+ 14 - 1
src/main/java/com/ydtech/modules/esm/service/EsmUserReferrerService.java

@@ -4,9 +4,11 @@ package com.ydtech.modules.esm.service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.admin.model.SysDept;
 import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.dto.SysUserDto;
 import com.ydtech.modules.admin.model.dto.SysUserTeamDto;
+import com.ydtech.modules.admin.model.dto.SysUserTeamStaticDto;
 import com.ydtech.modules.admin.model.vo.AppCustomerManagementQueryVo;
 import com.ydtech.modules.admin.model.vo.SysReferrerVo;
 import com.ydtech.modules.base.model.dto.PageDto;
@@ -72,7 +74,7 @@ public interface EsmUserReferrerService extends IService<EsmUserReferrer> {
      * @param:
      * @return:
      **/
-    BasePageResult<SysUserTeamDto> getTeamUser(AppCustomerManagementQueryVo managementQueryVo, String userId);
+    BasePageResult<SysUserTeamDto> getTeamUser(AppCustomerManagementQueryVo managementQueryVo, String userId, SysDept dept);
 
     /**
      * 团队业绩统计
@@ -80,6 +82,17 @@ public interface EsmUserReferrerService extends IService<EsmUserReferrer> {
      * @return 团队业绩
      */
     List<EsmUserPolicyForUserVO> queryUserCountForUser(TeamUserQryVO record);
+
+    /**
+     * 个代认证统计
+     *
+     * @param userId
+     * @param start
+     * @param end
+     * @param dateType
+     * @return
+     */
+    List<SysUserTeamStaticDto> authStatics(String userId, String start, String end, Integer dateType);
 }
 
 

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

@@ -1,18 +1,25 @@
 package com.ydtech.modules.esm.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.pagehelper.PageHelper;
+import com.ydtech.constants.enums.dict.organization.OrganizationSource;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.core.page.PageResult;
 import com.ydtech.exception.SystemException;
+import com.ydtech.modules.admin.constants.UserWorkStatus;
+import com.ydtech.modules.admin.model.SysDept;
 import com.ydtech.modules.admin.model.SysUser;
 import com.ydtech.modules.admin.model.dto.SysUserDto;
 import com.ydtech.modules.admin.model.dto.SysUserTeamDto;
+import com.ydtech.modules.admin.model.dto.SysUserTeamStaticDto;
 import com.ydtech.modules.admin.model.vo.AppCustomerManagementQueryVo;
 import com.ydtech.modules.admin.model.vo.SysReferrerVo;
+import com.ydtech.modules.admin.service.SysDeptService;
 import com.ydtech.modules.admin.service.SysUserService;
+import com.ydtech.modules.base.controller.BaseController;
 import com.ydtech.modules.base.model.dto.PageDto;
 import com.ydtech.modules.base.model.vo.PageVo;
 import com.ydtech.modules.esm.dao.EsmUserReferrerMapper;
@@ -45,6 +52,10 @@ public class EsmUserReferrerServiceImpl extends ServiceImpl<EsmUserReferrerMappe
     @Autowired
     private SysUserService sysUserService;
 
+    @Autowired
+    private SysDeptService sysDeptService;
+
+
     @Autowired
     private EsmUserReferrerService esmUserReferrerService;
 
@@ -393,7 +404,7 @@ public class EsmUserReferrerServiceImpl extends ServiceImpl<EsmUserReferrerMappe
                         EsmTeamPolicyVO esmTeamPolicyVO3_t = this.baseMapper.queryOrderCountHz(userList3, record.getStartdate(), record.getEnddate());
                         esmTeamPolicyVO3.setTeamlevel("三级会员");
                         esmTeamPolicyVO3.setTeamnum(userList3.size());
-                        if (esmTeamPolicyVO2_t != null) {
+                        if (esmTeamPolicyVO3_t != null) {
                             esmTeamPolicyVO3.setSumpremium(esmTeamPolicyVO3_t.getSumpremium());
                             esmTeamPolicyVO3.setUsernum(userPolicyList3.size());
                         }
@@ -477,17 +488,36 @@ public class EsmUserReferrerServiceImpl extends ServiceImpl<EsmUserReferrerMappe
 
 
     @Override
-    public BasePageResult<SysUserTeamDto> getTeamUser(AppCustomerManagementQueryVo managementQueryVo, String userId) {
-        List<EsmUserReferrer> esmUserReferrers = lambdaQuery().eq(EsmUserReferrer::getReferrerId, userId).list();
+    public BasePageResult<SysUserTeamDto> getTeamUser(AppCustomerManagementQueryVo managementQueryVo, String userId, SysDept dept) {
+        List<EsmUserReferrer> esmUserReferrers = lambdaQuery().eq(EsmUserReferrer::getReferrerId, userId).orderByDesc(EsmUserReferrer::getLevel).list();
         if (esmUserReferrers.isEmpty()) {
             return new BasePageResult<>();
         }
+        int level = esmUserReferrers.get(0).getLevel();
         int i = esmUserReferrers.get(0).getLevel() + 3;
         PageHelper.startPage(managementQueryVo.getPageNum(), managementQueryVo.getPageSize());
         if ("2".equals(managementQueryVo.getAuthenticationStatus())) {
             managementQueryVo.setAuthenticationStatus("-1");
         }
         List<SysUserTeamDto> byTeam = baseMapper.getByTeam(managementQueryVo, userId, i);
+        // 个代特殊处理返回
+        if (OrganizationSource.OS_2.getCode().equals(dept.getManagementSource())) {
+            if(CollUtil.isNotEmpty(byTeam)){
+                for (SysUserTeamDto sysUserTeamDto : byTeam) {
+                    if (UserWorkStatus.UWS_1.getCode().equals(sysUserTeamDto.getStatus())){
+                        if(sysUserTeamDto.getLevel().equals(level)){
+                            sysUserTeamDto.setLevelName("一级代理");
+                        } else if (sysUserTeamDto.getLevel().equals(level + 1)){
+                            sysUserTeamDto.setLevelName("二级代理");
+                        } else if (sysUserTeamDto.getLevel().equals(level + 2)){
+                            sysUserTeamDto.setLevelName("三级代理");
+                        }
+                    }else{
+                        sysUserTeamDto.setLevelName("临时代理");
+                    }
+                }
+            }
+        }
         PageResult<SysUserTeamDto> sysUserPageResult = new PageResult<>(byTeam);
         return new BasePageResult<>(managementQueryVo.getPageNum(), managementQueryVo.getPageSize(), sysUserPageResult.getTotalSize(),
                 sysUserPageResult.getTotalPages(), sysUserPageResult.getContent());
@@ -503,6 +533,26 @@ public class EsmUserReferrerServiceImpl extends ServiceImpl<EsmUserReferrerMappe
         return this.baseMapper.queryOrderCountForUser(record.getId(), record.getStartdate(), record.getEnddate());
     }
 
+    @Override
+    public List<SysUserTeamStaticDto> authStatics(String userId, String startTime, String endTime, Integer dateType) {
+        List<EsmUserReferrer> esmUserReferrers = lambdaQuery().eq(EsmUserReferrer::getReferrerId, userId).orderByDesc(EsmUserReferrer :: getLevel).list();
+        if (esmUserReferrers.isEmpty()) {
+            return new ArrayList<>();
+        }
+        int i = esmUserReferrers.get(0).getLevel() + 3;
+        List<SysUserTeamStaticDto> dtoList;
+        if (dateType.equals(0)) {
+            dtoList = baseMapper.authStatics(userId, i);
+        } else if (dateType.equals(1)){
+            dtoList = baseMapper.authNowStatics(userId, i,startTime,endTime);
+        } else if(dateType.equals(2)){
+            dtoList = baseMapper.authSevenStatics(userId, i,startTime,endTime);
+        } else{
+            dtoList = baseMapper.authThreeStatics(userId, i,startTime,endTime);
+        }
+        return dtoList;
+    }
+
 }
 
 

+ 31 - 2
src/main/java/com/ydtech/modules/fnc/service/contract/impl/contractServiceImpl.java

@@ -77,6 +77,14 @@ public class contractServiceImpl extends ServiceImpl<ContractMapper, ContractEnt
             contractEntity.setContractCode(contractCode);
 //           添加关联表  供应商与合同
             List<String> supplierIdList = contractDto.getSupplierIdList();
+            //甲方名称
+            String name = this.getNameInv(contractDto.getExternalCompaniesId());
+            contractEntity.setExternalCompaniesName(name);
+
+            //乙方名称
+            String interName = this.getNameInv(contractDto.getInternalCompanyId());
+            contractEntity.setInternalCompanyName(interName);
+
             contractEntity.setContractStatus("0");
             baseMapper.insert(contractEntity);
             if (contractDto.getSupplierIdList() != null) {
@@ -90,6 +98,13 @@ public class contractServiceImpl extends ServiceImpl<ContractMapper, ContractEnt
             BeanUtils.copyProperties(contractDto, contractEntity);
             String contractCode = this.generateCode(contractDto);
             contractEntity.setContractCode(contractCode);
+            //甲方名称
+            String name = this.getNameInv(contractDto.getExternalCompaniesId());
+            contractEntity.setExternalCompaniesName(name);
+
+            //乙方名称
+            String interName = this.getNameInv(contractDto.getInternalCompanyId());
+            contractEntity.setInternalCompanyName(interName);
             baseMapper.updateById(contractEntity);
             if (!contractDto.getSupplierIdList().isEmpty()) {
                 contractSupplierService.saveAndUpdate(contractDto.getSupplierIdList(), contractEntity.getId());
@@ -101,6 +116,13 @@ public class contractServiceImpl extends ServiceImpl<ContractMapper, ContractEnt
         }
     }
 
+    private String getNameInv(String externalCompaniesId) {
+        QueryWrapper<InvAccount> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("account_id", externalCompaniesId);
+        InvAccount exinvAccount = invAccountMapper.selectOne(queryWrapper);
+        return exinvAccount.getAccountName();
+    }
+
     /**
      * @param contractDto
      * @return 合同编码规则   甲方简称 首字母 大写 +  当前年份 + 000
@@ -262,6 +284,13 @@ public class contractServiceImpl extends ServiceImpl<ContractMapper, ContractEnt
         contractEntity.setId(null);
         contractEntity.setParentId(contractDto.getId());
 
+        //甲方名称
+        String name = this.getNameInv(contractDto.getExternalCompaniesId());
+        contractEntity.setExternalCompaniesName(name);
+
+        //乙方名称
+        String interName = this.getNameInv(contractDto.getInternalCompanyId());
+        contractEntity.setInternalCompanyName(interName);
         baseMapper.insert(contractEntity);
         if (contractDto.getSupplierIdList() != null) {
             contractSupplierService.saveAndUpdate(supplierIdList, contractEntity.getId());
@@ -277,8 +306,8 @@ public class contractServiceImpl extends ServiceImpl<ContractMapper, ContractEnt
             return contractCode + "-1";
         } else {
             int i = Integer.parseInt(contractCodeCopy.get("contractCode").toString());
-            i=i+1;
-            return contractCode+i;
+            i = i + 1;
+            return contractCode + i;
 
         }
     }

+ 23 - 0
src/main/resources/mapper/modules/admin/SysUserAgentTrackMapper.xml

@@ -0,0 +1,23 @@
+<?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.admin.dao.SysUserAgentTrackMapper">
+
+    <resultMap id="BaseResultMap" type="com.ydtech.modules.admin.model.po.SysUserAgentTrack">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="userId" column="user_id" jdbcType="VARCHAR"/>
+            <result property="status" column="status" jdbcType="TINYINT"/>
+            <result property="approveId" column="approve_id" jdbcType="VARCHAR"/>
+            <result property="approveName" column="approve_name" jdbcType="VARCHAR"/>
+            <result property="approveMess" column="approve_mess" jdbcType="VARCHAR"/>
+            <result property="createBy" column="create_by" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,user_id,status,
+        approve_id,approve_name,approve_mess,
+        create_by,create_time
+    </sql>
+</mapper>

+ 248 - 1
src/main/resources/mapper/modules/esm/EsmUserReferrerMapper.xml

@@ -174,7 +174,7 @@
         from esm_user_referrer r1
         INNER JOIN t1 on t1.id = r1.referrer_id
         WHERE r1.level &lt; #{level})
-        select u.id as id , u.name as name , u.mobile as mobile, u.status as status
+        select u.id as id , u.name as name , u.mobile as mobile, u.status as status, t1.level as level, u.update_time as updateTime
         from t1
         LEFT JOIN sys_user u on t1.id = u.id
         where 1=1
@@ -191,6 +191,7 @@
                 AND u.status = #{managementQueryVo.authenticationStatus}
             </when>
         </choose>
+            order by u.update_time desc
     </select>
 
     <select id="employeeIncreaseReportYear" resultType="com.ydtech.modules.admin.model.dto.EmployeeIncreaseReportDto">
@@ -424,4 +425,250 @@
             </if>
         </where>
     </select>
+    <select id="authSevenStatics" resultType="com.ydtech.modules.admin.model.dto.SysUserTeamStaticDto">
+        SELECT
+        a.timeDay,
+        IFNULL(b.allCount,0) AS allCount,
+        IFNULL(b.noCount,0) AS noCount,
+        IFNULL(b.yesCount,0) AS yesCount,
+        IFNULL(b.oneCount,0) AS oneCount,
+        IFNULL(b.twoCount,0) AS twoCount,
+        IFNULL(b.threeCount,0) AS threeCount,
+        IFNULL(b.tempCount,0) AS tempCount
+        FROM
+        (
+        SELECT
+        curdate() AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 1 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 2 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 3 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 4 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 5 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 6 DAY ) AS timeDay
+        ) a
+        LEFT JOIN (
+        select
+        DATE_FORMAT( t2.updateTime, '%Y-%m-%d' ) AS time,
+        count(*) as allCount,
+        SUM(CASE WHEN t2.status <![CDATA[ <> ]]> 1 THEN 1 ELSE 0 END) AS noCount,
+        SUM(CASE WHEN t2.status = 1 THEN 1 ELSE 0 END) AS yesCount,
+        SUM(CASE WHEN t2.level = #{level} - 3 and t2.STATUS = 1 THEN 1 ELSE 0 END) AS oneCount,
+        SUM(CASE WHEN t2.level = #{level} - 2  and t2.STATUS = 1 THEN 1 ELSE 0 END) AS twoCount,
+        SUM(CASE WHEN t2.level = #{level} - 1 and t2.STATUS = 1 THEN 1 ELSE 0 END) AS threeCount,
+        SUM(CASE WHEN t2.status &lt;&gt; 1 THEN 1 ELSE 0 END) AS tempCount
+        FROM (
+        with recursive t1 as (select *
+        from esm_user_referrer
+        WHERE referrer_id = #{userId}
+        and id !=#{userId}
+        union all
+        select r1.*
+        from esm_user_referrer r1
+        INNER JOIN t1 on t1.id = r1.referrer_id
+        WHERE r1.level &lt; #{level})
+        select u.id as id , u.name as name , u.mobile as mobile, u.status as status, t1.level as level,u.update_time as
+        updateTime
+        from t1
+        LEFT JOIN sys_user u on t1.id = u.id
+        where 1=1
+        ) AS t2
+        WHERE 1=1
+        <if test="startDate !=null  and  startDate!='' and  endDate !=null and endDate !=''">
+            and DATE_FORMAT( t2.updateTime, '%Y-%m-%d') between DATE_FORMAT(#{startDate}, '%Y-%m-%d') and
+            DATE_FORMAT(#{endDate}, '%Y-%m-%d')
+        </if>
+        GROUP BY
+        DATE_FORMAT( t2.updateTime, '%Y-%m-%d' )
+        ORDER BY DATE_FORMAT( t2.updateTime, '%Y-%m-%d' ) desc
+        ) b ON a.timeDay = b.time
+    </select>
+    <select id="authNowStatics" resultType="com.ydtech.modules.admin.model.dto.SysUserTeamStaticDto">
+        SELECT
+        a.timeDay,
+        IFNULL(b.allCount,0) AS allCount,
+        IFNULL(b.noCount,0) AS noCount,
+        IFNULL(b.yesCount,0) AS yesCount,
+        IFNULL(b.oneCount,0) AS oneCount,
+        IFNULL(b.twoCount,0) AS twoCount,
+        IFNULL(b.threeCount,0) AS threeCount,
+        IFNULL(b.tempCount,0) AS tempCount
+        FROM
+        (
+        SELECT
+        curdate() AS timeDay
+        ) a
+        LEFT JOIN (
+        select
+        DATE_FORMAT( t2.updateTime, '%Y-%m-%d' ) AS time,
+        count(*) as allCount,
+        SUM(CASE WHEN t2.status <![CDATA[ <> ]]> 1 THEN 1 ELSE 0 END) AS noCount,
+        SUM(CASE WHEN t2.status = 1 THEN 1 ELSE 0 END) AS yesCount,
+        SUM(CASE WHEN t2.level = #{level} - 3 and t2.STATUS = 1 THEN 1 ELSE 0 END) AS oneCount,
+        SUM(CASE WHEN t2.level = #{level} - 2  and t2.STATUS = 1 THEN 1 ELSE 0 END) AS twoCount,
+        SUM(CASE WHEN t2.level = #{level} - 1 and t2.STATUS = 1 THEN 1 ELSE 0 END) AS threeCount,
+        SUM(CASE WHEN t2.status &lt;&gt; 1 THEN 1 ELSE 0 END) AS tempCount
+        FROM (
+        with recursive t1 as (select *
+        from esm_user_referrer
+        WHERE referrer_id = #{userId}
+        and id !=#{userId}
+        union all
+        select r1.*
+        from esm_user_referrer r1
+        INNER JOIN t1 on t1.id = r1.referrer_id
+        WHERE r1.level &lt; #{level})
+        select u.id as id , u.name as name , u.mobile as mobile, u.status as status, t1.level as level,u.update_time as
+        updateTime
+        from t1
+        LEFT JOIN sys_user u on t1.id = u.id
+        where 1=1
+        ) AS t2
+        WHERE 1=1
+        <if test="startDate !=null  and  startDate!='' and  endDate !=null and endDate !=''">
+            and DATE_FORMAT( t2.updateTime, '%Y-%m-%d') between DATE_FORMAT(#{startDate}, '%Y-%m-%d') and
+            DATE_FORMAT(#{endDate}, '%Y-%m-%d')
+        </if>
+        GROUP BY
+        DATE_FORMAT( t2.updateTime, '%Y-%m-%d' )
+        ORDER BY DATE_FORMAT( t2.updateTime, '%Y-%m-%d' ) desc
+        ) b ON a.timeDay = b.time
+    </select>
+    <select id="authThreeStatics" resultType="com.ydtech.modules.admin.model.dto.SysUserTeamStaticDto">
+        SELECT
+        a.timeDay,
+        IFNULL(b.allCount,0) AS allCount,
+        IFNULL(b.noCount,0) AS noCount,
+        IFNULL(b.yesCount,0) AS yesCount,
+        IFNULL(b.oneCount,0) AS oneCount,
+        IFNULL(b.twoCount,0) AS twoCount,
+        IFNULL(b.threeCount,0) AS threeCount,
+        IFNULL(b.tempCount,0) AS tempCount
+        FROM
+        (
+        SELECT
+        curdate() AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 1 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 2 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 3 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 4 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 5 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 6 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 7 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 8 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 9 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 10 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 11 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 12 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 13 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 14 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 15 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 16 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 17 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 18 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 19 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 20 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 21 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 22 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 23 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 24 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 25 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 26 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 27 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 28 DAY ) AS timeDay UNION ALL
+        SELECT
+        date_sub( curdate(), INTERVAL 29 DAY ) AS timeDay
+        ) a
+        LEFT JOIN (
+        select
+        DATE_FORMAT( t2.updateTime, '%Y-%m-%d' ) AS time,
+        count(*) as allCount,
+        SUM(CASE WHEN t2.status <![CDATA[ <> ]]> 1 THEN 1 ELSE 0 END) AS noCount,
+        SUM(CASE WHEN t2.status = 1 THEN 1 ELSE 0 END) AS yesCount,
+        SUM(CASE WHEN t2.level = #{level} - 3 and t2.STATUS = 1 THEN 1 ELSE 0 END) AS oneCount,
+        SUM(CASE WHEN t2.level = #{level} - 2  and t2.STATUS = 1 THEN 1 ELSE 0 END) AS twoCount,
+        SUM(CASE WHEN t2.level = #{level} - 1  and t2.STATUS = 1 THEN 1 ELSE 0 END) AS threeCount,
+        SUM(CASE WHEN t2.status &lt;&gt; 1 THEN 1 ELSE 0 END) AS tempCount
+        FROM (
+        with recursive t1 as (select *
+        from esm_user_referrer
+        WHERE referrer_id = #{userId}
+        and id !=#{userId}
+        union all
+        select r1.*
+        from esm_user_referrer r1
+        INNER JOIN t1 on t1.id = r1.referrer_id
+        WHERE r1.level &lt; #{level})
+        select u.id as id , u.name as name , u.mobile as mobile, u.status as status, t1.level as level,u.update_time as
+        updateTime
+        from t1
+        LEFT JOIN sys_user u on t1.id = u.id
+        where 1=1
+        ) AS t2
+        WHERE 1=1
+        <if test="startDate !=null  and  startDate!='' and  endDate !=null and endDate !=''">
+            and DATE_FORMAT( t2.updateTime, '%Y-%m-%d') between DATE_FORMAT(#{startDate}, '%Y-%m-%d') and
+            DATE_FORMAT(#{endDate}, '%Y-%m-%d')
+        </if>
+        GROUP BY
+        DATE_FORMAT( t2.updateTime, '%Y-%m-%d' )
+        ORDER BY DATE_FORMAT( t2.updateTime, '%Y-%m-%d' ) desc
+        ) b ON a.timeDay = b.time
+    </select>
+    <select id="authStatics" resultType="com.ydtech.modules.admin.model.dto.SysUserTeamStaticDto">
+        select
+        IFNULL(count(*),0) as allCount,
+        IFNULL(SUM(CASE WHEN t2.status <![CDATA[ <> ]]> 1 THEN 1 ELSE 0 END),0) AS noCount,
+        IFNULL(SUM(CASE WHEN t2.status = 1 THEN 1 ELSE 0 END),0) AS yesCount
+        FROM (
+        with recursive t1 as (select *
+        from esm_user_referrer
+        WHERE referrer_id = #{userId}
+        and id !=#{userId}
+        union all
+        select r1.*
+        from esm_user_referrer r1
+        INNER JOIN t1 on t1.id = r1.referrer_id
+        WHERE r1.level &lt; #{level})
+        select u.id as id , u.name as name , u.mobile as mobile, u.status as status, t1.level as level,u.update_time as
+        updateTime
+        from t1
+        LEFT JOIN sys_user u on t1.id = u.id
+        where 1=1
+        ) AS t2
+        WHERE 1=1
+    </select>
 </mapper>