From 635495c64c001800fa9044583d6bf5bb030c251c Mon Sep 17 00:00:00 2001
From: zzs <hi@lnbiuc.copm>
Date: Tue, 15 Oct 2024 15:36:57 +0800
Subject: [PATCH] feat:add user role

---
 .../module/crm/job/UserAllocationTask.java    | 48 +++++++++++++
 .../system/api/permission/PermissionApi.java  |  1 -
 .../system/constant/UserFunctionRoleEnum.java | 69 +++++++++++++++++++
 .../service/permission/PermissionService.java |  2 +
 .../permission/PermissionServiceImpl.java     | 60 +++++++++++++++-
 .../service/permission/RoleService.java       |  1 +
 .../service/permission/RoleServiceImpl.java   | 15 ++++
 7 files changed, 194 insertions(+), 2 deletions(-)
 create mode 100644 ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/job/UserAllocationTask.java
 create mode 100644 ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/constant/UserFunctionRoleEnum.java

diff --git a/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/job/UserAllocationTask.java b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/job/UserAllocationTask.java
new file mode 100644
index 0000000..6c7c53d
--- /dev/null
+++ b/ensign-module-crm/ensign-module-crm-biz/src/main/java/com/ensign/crm/module/crm/job/UserAllocationTask.java
@@ -0,0 +1,48 @@
+package com.ensign.crm.module.crm.job;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ensign.crm.framework.common.enums.CommonStatusEnum;
+import com.ensign.crm.framework.quartz.core.handler.JobHandler;
+import com.ensign.crm.module.system.api.permission.PermissionApi;
+import com.ensign.crm.module.system.dal.dataobject.user.AdminUserDO;
+import com.ensign.crm.module.system.dal.mysql.user.AdminUserMapper;
+import com.ensign.crm.module.system.service.permission.PermissionService;
+import com.ensign.crm.module.system.service.permission.RoleService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Description: TODO
+ * @Date: 2024/10/15 11:38
+ * @Created: by ZZSLL
+ */
+
+@Slf4j
+@Component
+public class UserAllocationTask implements JobHandler {
+
+    @Autowired
+    private AdminUserMapper userMapper;
+
+    @Autowired
+    private PermissionService permissionService;
+
+
+    @Override
+    public String execute(String param) {
+
+        LambdaQueryWrapper<AdminUserDO> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(AdminUserDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
+                .eq(AdminUserDO::getIsSyncKingdee, CommonStatusEnum.ENABLE.getStatus());
+        List<AdminUserDO> users = userMapper.selectList(queryWrapper);
+
+        for (AdminUserDO user : users) {
+            permissionService.assignPermissions(user);
+        }
+
+        return "success";
+    }
+}
diff --git a/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/api/permission/PermissionApi.java b/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/api/permission/PermissionApi.java
index 9469190..4c1ded9 100644
--- a/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/api/permission/PermissionApi.java
+++ b/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/api/permission/PermissionApi.java
@@ -45,5 +45,4 @@ public interface PermissionApi {
      * @return 部门数据权限
      */
     DeptDataPermissionRespDTO getDeptDataPermission(Long userId);
-
 }
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/constant/UserFunctionRoleEnum.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/constant/UserFunctionRoleEnum.java
new file mode 100644
index 0000000..e006ec4
--- /dev/null
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/constant/UserFunctionRoleEnum.java
@@ -0,0 +1,69 @@
+package com.ensign.crm.module.system.constant;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Classname UserFunctionRoleEnum
+ * @Description
+ *
+ * 1:厂家后台,
+ * 2:区域经理,
+ * 3:业务经理,
+ * 4:经销商后台,
+ * 5:经销商销售员
+ *
+ * @Date 2024/10/15 11:41
+ * @Created by violet
+ */
+
+@Getter
+@AllArgsConstructor
+public enum UserFunctionRoleEnum {
+
+    FACTORY_BACKEND(1, "CRM_role_1"),
+    REGIONAL_MANAGER(2, "CRM_role_2"),
+    BUSINESS_MANAGER(3, "CRM_role_3"),
+    DEALER_BACKEND(4, "CRM_role_4"),
+    DEALER_SALESMAN(5, "CRM_role_5");
+
+    private final Integer userFunc;
+
+    private final String roleName;
+
+
+    private static final Map<Integer, String> MAP = new HashMap<>();
+
+    private static final List<String> LIST = new ArrayList<>();
+
+    static {
+        for (UserFunctionRoleEnum role : UserFunctionRoleEnum.values()) {
+            MAP.put(role.getUserFunc(), role.getRoleName());
+            LIST.add(role.getRoleName());
+        }
+    }
+
+    public static String getRoleName(Integer userFunc) {
+        return MAP.get(userFunc);
+    }
+
+    public static List<String> getAllRoleName() {
+        return LIST;
+    }
+
+    public static List<String> get(Integer... func) {
+        List<String> roleNames = new ArrayList<>();
+        for (Integer f : func) {
+            String roleName = UserFunctionRoleEnum.getRoleName(f);
+            if (roleName != null) {
+                roleNames.add(roleName);
+            }
+        }
+        return roleNames;
+    }
+}
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/PermissionService.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/PermissionService.java
index 38bd1da..9ea2b2d 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/PermissionService.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/PermissionService.java
@@ -1,6 +1,7 @@
 package com.ensign.crm.module.system.service.permission;
 
 import com.ensign.crm.module.system.api.permission.dto.DeptDataPermissionRespDTO;
+import com.ensign.crm.module.system.dal.dataobject.user.AdminUserDO;
 
 import java.util.Collection;
 import java.util.Set;
@@ -143,4 +144,5 @@ public interface PermissionService {
      */
     DeptDataPermissionRespDTO getDeptDataPermission(Long userId);
 
+    void assignPermissions(AdminUserDO user);
 }
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/PermissionServiceImpl.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/PermissionServiceImpl.java
index 3a344b9..91fd919 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/PermissionServiceImpl.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/PermissionServiceImpl.java
@@ -7,11 +7,14 @@ import cn.hutool.extra.spring.SpringUtil;
 import com.ensign.crm.framework.common.enums.CommonStatusEnum;
 import com.ensign.crm.framework.common.util.collection.CollectionUtils;
 import com.ensign.crm.framework.datapermission.core.annotation.DataPermission;
+import com.ensign.crm.module.system.api.permission.PermissionApi;
 import com.ensign.crm.module.system.api.permission.dto.DeptDataPermissionRespDTO;
+import com.ensign.crm.module.system.constant.UserFunctionRoleEnum;
 import com.ensign.crm.module.system.dal.dataobject.permission.MenuDO;
 import com.ensign.crm.module.system.dal.dataobject.permission.RoleDO;
 import com.ensign.crm.module.system.dal.dataobject.permission.RoleMenuDO;
 import com.ensign.crm.module.system.dal.dataobject.permission.UserRoleDO;
+import com.ensign.crm.module.system.dal.dataobject.user.AdminUserDO;
 import com.ensign.crm.module.system.dal.mysql.permission.RoleMenuMapper;
 import com.ensign.crm.module.system.dal.mysql.permission.UserRoleMapper;
 import com.ensign.crm.module.system.dal.redis.RedisKeyConstants;
@@ -59,6 +62,9 @@ public class PermissionServiceImpl implements PermissionService {
     @Resource
     private AdminUserService userService;
 
+    @Resource
+    private PermissionApi permissionApi;
+
     @Override
     public boolean hasAnyPermissions(Long userId, String... permissions) {
         // 如果为空,说明已经有权限
@@ -86,7 +92,7 @@ public class PermissionServiceImpl implements PermissionService {
     /**
      * 判断指定角色,是否拥有该 permission 权限
      *
-     * @param roles 指定角色数组
+     * @param roles      指定角色数组
      * @param permission 权限标识
      * @return 是否拥有
      */
@@ -334,4 +340,56 @@ public class PermissionServiceImpl implements PermissionService {
         return SpringUtil.getBean(getClass());
     }
 
+
+    @Override
+    public void assignPermissions(AdminUserDO user) {
+        Integer userFunction = user.getCrmUserFunction();
+        if (userFunction == null) {
+            return;
+        }
+        if (!"12345".contains(userFunction.toString())) {
+            return;
+        }
+        Long userId = user.getId();
+        List<String> rules = getRoleList(userFunction);
+        Set<String> noRoles = new HashSet<>();
+        for (String rule : rules) {
+            boolean hassed = permissionApi.hasAnyRoles(userId, rule);
+            if (!hassed) {
+                noRoles.add(rule);
+            }
+        }
+
+        if (!noRoles.isEmpty()) {
+            doAssignPermissions(user, noRoles);
+        }
+    }
+
+    private void doAssignPermissions(AdminUserDO user, Set<String> noRoles) {
+        Set<Long> ids = roleService.getRoleIds(noRoles);
+        assignUserRole(user.getId(), ids);
+    }
+
+    private List<String> getRoleList(Integer userFunction) {
+        List<String> roles = new ArrayList<>();
+        roles.add("crmuser");
+        switch (userFunction) {
+            case 1:
+                roles.addAll(UserFunctionRoleEnum.get(1, 2, 3, 4, 5));
+                break;
+            case 2:
+                roles.addAll(UserFunctionRoleEnum.get(1, 2, 3, 4));
+                break;
+            case 3:
+                roles.addAll(UserFunctionRoleEnum.get(1, 2, 3));
+                break;
+            case 4:
+                roles.addAll(UserFunctionRoleEnum.get(1, 2));
+                break;
+            case 5:
+                roles.addAll(UserFunctionRoleEnum.get(1));
+                break;
+        }
+        return roles;
+    }
 }
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/RoleService.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/RoleService.java
index e75c0b2..39509cf 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/RoleService.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/RoleService.java
@@ -121,4 +121,5 @@ public interface RoleService {
      */
     void validateRoleList(Collection<Long> ids);
 
+    Set<Long> getRoleIds(Set<String> noRoles);
 }
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/RoleServiceImpl.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/RoleServiceImpl.java
index 1c85000..033a9d2 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/RoleServiceImpl.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/permission/RoleServiceImpl.java
@@ -4,10 +4,12 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ensign.crm.framework.common.enums.CommonStatusEnum;
 import com.ensign.crm.framework.common.pojo.PageResult;
 import com.ensign.crm.framework.common.util.collection.CollectionUtils;
 import com.ensign.crm.framework.common.util.object.BeanUtils;
+import com.ensign.crm.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.ensign.crm.module.system.controller.admin.permission.vo.role.RolePageReqVO;
 import com.ensign.crm.module.system.controller.admin.permission.vo.role.RoleSaveReqVO;
 import com.ensign.crm.module.system.dal.dataobject.permission.RoleDO;
@@ -258,4 +260,17 @@ public class RoleServiceImpl implements RoleService {
         return SpringUtil.getBean(getClass());
     }
 
+
+    @Override
+    public Set<Long> getRoleIds(Set<String> noRoles) {
+        LambdaQueryWrapperX<RoleDO> queryWrapperX = new LambdaQueryWrapperX<>();
+        queryWrapperX.eq(RoleDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
+                .in(RoleDO::getCode, noRoles);
+        List<RoleDO> roleDOS = roleMapper.selectList(queryWrapperX);
+        Set<Long> roleIds = new HashSet<>();
+        roleDOS.forEach(roleDO -> {
+            roleIds.add(roleDO.getId());
+        });
+        return roleIds;
+    }
 }