ソースを参照

Merge branch 'master' into system-zyj

james 8 ヶ月 前
コミット
d24ee45a6a
20 ファイル変更491 行追加165 行削除
  1. 4 0
      base-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java
  2. 19 14
      base-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java
  3. 24 0
      base-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/context/DataScopeContextHolder.java
  4. 44 44
      base-modules/service-job/src/main/java/com/ruoyi/job/config/ScheduleConfig.java
  5. 2 0
      base-modules/service-job/src/main/java/com/ruoyi/job/mapper/SysJobMapper.java
  6. 2 2
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysDeptController.java
  7. 13 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysDept.java
  8. 12 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUser.java
  9. 2 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysDeptMapper.java
  10. 10 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysUserPostMapper.java
  11. 9 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/ISysDeptService.java
  12. 18 6
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceReceiveServiceImpl.java
  13. 141 91
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysDeptServiceImpl.java
  14. 0 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysTenantServiceImpl.java
  15. 4 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserServiceImpl.java
  16. 79 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/TreeNode.java
  17. 15 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/UserPostVo.java
  18. 62 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/UserTreeNode.java
  19. 9 0
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysDeptMapper.xml
  20. 22 5
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysUserPostMapper.xml

+ 4 - 0
base-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/poi/ExcelUtil.java

@@ -528,6 +528,7 @@ public class ExcelUtil<T>
         dataFont.setFontName("Arial");
         dataFont.setFontHeightInPoints((short) 10);
         style.setFont(dataFont);
+        style.setWrapText(true);//设置自动换行
         styles.put("data", style);
 
         style = wb.createCellStyle();
@@ -556,16 +557,19 @@ public class ExcelUtil<T>
         style = wb.createCellStyle();
         style.cloneStyleFrom(styles.get("data"));
         style.setAlignment(HorizontalAlignment.LEFT);
+        style.setWrapText(true);//设置自动换行
         styles.put("data1", style);
 
         style = wb.createCellStyle();
         style.cloneStyleFrom(styles.get("data"));
         style.setAlignment(HorizontalAlignment.CENTER);
+        style.setWrapText(true);//设置自动换行
         styles.put("data2", style);
 
         style = wb.createCellStyle();
         style.cloneStyleFrom(styles.get("data"));
         style.setAlignment(HorizontalAlignment.RIGHT);
+        style.setWrapText(true);//设置自动换行
         styles.put("data3", style);
 
         return styles;

+ 19 - 14
base-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/aspect/DataScopeAspect.java

@@ -1,5 +1,6 @@
 package com.ruoyi.common.datascope.aspect;
 
+import com.ruoyi.common.datascope.context.DataScopeContextHolder;
 import com.usky.system.domain.SysUserVO;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.annotation.Aspect;
@@ -87,41 +88,40 @@ public class DataScopeAspect
     public static void dataScopeFilter(JoinPoint joinPoint, SysUserVO user, String deptAlias, String userAlias)
     {
         StringBuilder sqlString = new StringBuilder();
-
+        StringBuilder sqlLambda = new StringBuilder();
         for (SysRoleVO role : user.getRoles())
         {
             String dataScope = role.getDataScope();
             if (DATA_SCOPE_ALL.equals(dataScope))
             {
-                sqlString = new StringBuilder();
-                break;
+                Integer tenantId = SecurityUtils.getTenantId();
+                sqlString.append(StringUtils.format(" OR {}.tenant_id = {} ", deptAlias, tenantId));
+                sqlLambda.append(StringUtils.format(" OR tenant_id = {} ",  tenantId));
             }
             else if (DATA_SCOPE_CUSTOM.equals(dataScope))
             {
-                sqlString.append(StringUtils.format(
-                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias,
-                        role.getRoleId()));
+                sqlString.append(StringUtils.format(" OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId()));
+                sqlLambda.append(StringUtils.format(" OR dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, role.getRoleId()));
             }
             else if (DATA_SCOPE_DEPT.equals(dataScope))
             {
                 sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
+                sqlLambda.append(StringUtils.format(" OR dept_id = {} ", user.getDeptId()));
             }
             else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope))
             {
-                sqlString.append(StringUtils.format(
-                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
-                        deptAlias, user.getDeptId(), user.getDeptId()));
+                sqlString.append(StringUtils.format( " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", deptAlias, user.getDeptId(), user.getDeptId()));
+                sqlLambda.append(StringUtils.format( " OR dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",  user.getDeptId(), user.getDeptId()));
             }
             else if (DATA_SCOPE_SELF.equals(dataScope))
             {
-                if (StringUtils.isNotBlank(userAlias))
-                {
+                if (StringUtils.isNotBlank(userAlias)) {
                     sqlString.append(StringUtils.format(" OR {}.create_by = {} ", userAlias, user.getUserName()));
-                }
-                else
-                {
+                    sqlLambda.append(StringUtils.format(" OR create_by = {} ", user.getUserName()));
+                } else {
                     // 数据权限为仅本人且没有userAlias别名不查询任何数据
                     sqlString.append(" OR 1=0 ");
+                    sqlLambda.append(StringUtils.format(" OR create_by = '{}' ", user.getUserName()));
                 }
             }
         }
@@ -135,6 +135,11 @@ public class DataScopeAspect
                 baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")");
             }
         }
+        if(StringUtils.isNotBlank(sqlLambda.toString())){
+            DataScopeContextHolder.setDataScopeSql(" (" + sqlLambda.substring(4) + ")");
+        }
+
+
     }
 
     /**

+ 24 - 0
base-common/ruoyi-common-datascope/src/main/java/com/ruoyi/common/datascope/context/DataScopeContextHolder.java

@@ -0,0 +1,24 @@
+package com.ruoyi.common.datascope.context;
+
+public class DataScopeContextHolder {
+
+    /**
+     * 当前租户编号
+     */
+    private static final ThreadLocal<String> DATA_SCOPE_SQL = new ThreadLocal<>();
+
+
+    public static String getDataScopeSql() {
+        return DATA_SCOPE_SQL.get();
+    }
+
+
+    public static void setDataScopeSql(String dataScope) {
+        DATA_SCOPE_SQL.set(dataScope);
+    }
+
+    public static void clear() {
+        DATA_SCOPE_SQL.remove();
+    }
+
+}

+ 44 - 44
base-modules/service-job/src/main/java/com/ruoyi/job/config/ScheduleConfig.java

@@ -11,47 +11,47 @@ import org.springframework.scheduling.quartz.SchedulerFactoryBean;
  * 
  * @author ruoyi
  */
-@Configuration
-public class ScheduleConfig
-{
-    @Bean
-    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource)
-    {
-        SchedulerFactoryBean factory = new SchedulerFactoryBean();
-        factory.setDataSource(dataSource);
-
-        // quartz参数
-        Properties prop = new Properties();
-        prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler");
-        prop.put("org.quartz.scheduler.instanceId", "AUTO");
-        // 线程池配置
-        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
-        prop.put("org.quartz.threadPool.threadCount", "20");
-        prop.put("org.quartz.threadPool.threadPriority", "5");
-        // JobStore配置
-        prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
-        // 集群配置
-        prop.put("org.quartz.jobStore.isClustered", "true");
-        prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
-        prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
-        prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
-
-        // sqlserver 启用
-        // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
-        prop.put("org.quartz.jobStore.misfireThreshold", "12000");
-        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
-        factory.setQuartzProperties(prop);
-
-        factory.setSchedulerName("RuoyiScheduler");
-        // 延时启动
-        factory.setStartupDelay(1);
-        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
-        // 可选,QuartzScheduler
-        // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
-        factory.setOverwriteExistingJobs(true);
-        // 设置自动启动,默认为true
-        factory.setAutoStartup(true);
-
-        return factory;
-    }
-}
+//@Configuration
+//public class ScheduleConfig
+//{
+//    @Bean
+//    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource)
+//    {
+//        SchedulerFactoryBean factory = new SchedulerFactoryBean();
+//        factory.setDataSource(dataSource);
+//
+//        // quartz参数
+//        Properties prop = new Properties();
+//        prop.put("org.quartz.scheduler.instanceName", "RuoyiScheduler");
+//        prop.put("org.quartz.scheduler.instanceId", "AUTO");
+//        // 线程池配置
+//        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
+//        prop.put("org.quartz.threadPool.threadCount", "20");
+//        prop.put("org.quartz.threadPool.threadPriority", "5");
+//        // JobStore配置
+//        prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
+//        // 集群配置
+//        prop.put("org.quartz.jobStore.isClustered", "true");
+//        prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
+//        prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
+//        prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true");
+//
+//        // sqlserver 启用
+//        // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
+//        prop.put("org.quartz.jobStore.misfireThreshold", "12000");
+//        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
+//        factory.setQuartzProperties(prop);
+//
+//        factory.setSchedulerName("RuoyiScheduler");
+//        // 延时启动
+//        factory.setStartupDelay(1);
+//        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
+//        // 可选,QuartzScheduler
+//        // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
+//        factory.setOverwriteExistingJobs(true);
+//        // 设置自动启动,默认为true
+//        factory.setAutoStartup(true);
+//
+//        return factory;
+//    }
+//}

+ 2 - 0
base-modules/service-job/src/main/java/com/ruoyi/job/mapper/SysJobMapper.java

@@ -2,12 +2,14 @@ package com.ruoyi.job.mapper;
 
 import java.util.List;
 import com.ruoyi.job.domain.SysJob;
+import org.springframework.stereotype.Repository;
 
 /**
  * 调度任务信息 数据层
  * 
  * @author ruoyi
  */
+@Repository
 public interface SysJobMapper
 {
     /**

+ 2 - 2
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysDeptController.java

@@ -79,11 +79,11 @@ public class SysDeptController extends BaseController {
     }
 
     /**
-     * 获取部门下拉树列表
+     * 获取部门人员下拉树列表
      */
     @GetMapping("/deptUserTreeSelect")
     public ApiResult treeselect(SysDept dept, SysUser user) {
-        List<SysDept> depts = deptService.selectDeptList(dept);
+        List<SysDept> depts = deptService.deptList(dept);
         List<SysUser> users = iSysUserService.selectUserList(user);
         return ApiResult.success(deptService.buildDeptUserTreeSelect(depts, users));
     }

+ 13 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysDept.java

@@ -3,6 +3,7 @@ package com.usky.system.domain;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.usky.common.core.bean.BaseEntity;
+import com.usky.system.service.vo.TreeNode;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
@@ -57,6 +58,18 @@ public class SysDept extends BaseEntity
     @TableField(exist = false)
     private String parentName;
 
+    /** 部门成员 */
+    @TableField(exist = false)
+    private List<SysUser> users;
+
+    public List<SysUser> getUsers() {
+        return users;
+    }
+
+    public void setUsers(List<SysUser> users) {
+        this.users = users;
+    }
+
     /**
      * 租户ID
      */

+ 12 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUser.java

@@ -100,6 +100,18 @@ public class SysUser extends BaseEntity
     /** 姓名 */
     private String fullName;
 
+    /** 岗位 */
+    @TableField(exist = false)
+    private String post;
+
+    public String getPost() {
+        return post;
+    }
+
+    public void setPost(String post) {
+        this.post = post;
+    }
+
     public SysUser()
     {
 

+ 2 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysDeptMapper.java

@@ -24,6 +24,8 @@ public interface SysDeptMapper extends BaseMapper<SysDept>
      */
     public List<SysDept> selectDeptList(SysDept dept);
 
+    public List<SysDept> deptList(SysDept dept);
+
     /**
      * 根据角色ID查询部门树信息
      * 

+ 10 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/mapper/SysUserPostMapper.java

@@ -3,10 +3,13 @@ package com.usky.system.mapper;
 
 import com.usky.common.mybatis.core.CrudMapper;
 import com.usky.system.domain.SysUserPost;
+import com.usky.system.service.vo.UserPostVo;
+import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 用户与岗位关联表 数据层
@@ -47,4 +50,11 @@ public interface SysUserPostMapper extends CrudMapper<SysUserPost>
      * @return 结果
      */
     public int batchUserPost(List<SysUserPost> userPostList);
+
+    /**
+     * 查询users的职位
+     * @param userIds userIds
+     * @return
+     */
+    public List<UserPostVo> getUserPost(@Param("userIds") List<Long> userIds);
 }

+ 9 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/ISysDeptService.java

@@ -4,6 +4,7 @@ package com.usky.system.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.usky.system.domain.SysDept;
 import com.usky.system.domain.SysUser;
+import com.usky.system.service.vo.TreeNode;
 import com.usky.system.service.vo.TreeSelect;
 
 import java.util.List;
@@ -23,6 +24,8 @@ public interface ISysDeptService extends IService<SysDept>
      */
     public List<SysDept> selectDeptList(SysDept dept);
 
+    public List<SysDept> deptList(SysDept dept);
+
     /**
      * 构建前端所需要树结构
      * 
@@ -39,7 +42,12 @@ public interface ISysDeptService extends IService<SysDept>
      */
     public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts);
 
-    List<TreeSelect> buildDeptUserTreeSelect(List<SysDept> depts, List<SysUser> users);
+    /**
+     * 构建前端所需要下拉树结构(部门+人员)
+     * @param depts 部门列表
+     * @return
+     */
+    public List<TreeNode> buildDeptUserTreeSelect(List<SysDept> depts, List<SysUser> users);
 
     /**
      * 根据角色ID查询部门树信息

+ 18 - 6
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/MceReceiveServiceImpl.java

@@ -10,6 +10,8 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.datascope.annotation.DataScope;
+import com.ruoyi.common.datascope.context.DataScopeContextHolder;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.security.utils.SecurityUtils;
@@ -46,6 +48,9 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     @Autowired
     private ISysUserService iSysUserService;
 
+    @Autowired
+    private ISysDictDataService sysDictDataService;
+
     @Override
     public CommonPage<Object> mceList(String infoTitle, String infoType, String startTime, String endTime, Integer id, Integer current, Integer size) {
         List<Object> list = new ArrayList<>();
@@ -99,20 +104,22 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     }
 
     @Override
+    @DataScope
     public CommonPage<Object> mceManageList(String infoTitle, String infoType, String startTime, String endTime, Integer current, Integer size) {
         List<Object> list = new ArrayList<>();
         IPage<MceContent> page = new Page<>(current, size);
+        //查询消息内容
         LambdaQueryWrapper<MceContent> lambdaQuery1 = Wrappers.lambdaQuery();
-        lambdaQuery1.select(MceContent::getId, MceContent::getInfoTitle, MceContent::getInfoContent,
-                MceContent::getCreateTime,MceContent::getInfoType)
+        lambdaQuery1.select(MceContent::getId, MceContent::getInfoTitle, MceContent::getInfoContent, MceContent::getCreateTime,MceContent::getInfoType)
                 .like(StringUtils.isNotBlank(infoTitle),MceContent::getInfoTitle,infoTitle)
-                .between(StringUtils.isNotBlank(startTime)&&StringUtils.isNotBlank(endTime),MceContent::getCreateTime,
-                        startTime,endTime)
+                .between(StringUtils.isNotBlank(startTime)&&StringUtils.isNotBlank(endTime),MceContent::getCreateTime, startTime,endTime)
                 .eq(StringUtils.isNotBlank(infoType),MceContent::getInfoType, infoType)
-                .eq(MceContent::getCreateBy,SecurityUtils.getUsername())
-                .eq(MceContent::getTenantId,SecurityUtils.getTenantId())
+                .apply(DataScopeContextHolder.getDataScopeSql())
+//              .eq(MceContent::getCreateBy,SecurityUtils.getUsername())
+//              .eq(MceContent::getTenantId,SecurityUtils.getTenantId())
                 .orderByDesc(MceContent::getId);
         page = mceContentService.page(page,lambdaQuery1);
+
         if (CollectionUtils.isNotEmpty(page.getRecords())) {
             List<Integer> contentIds = new ArrayList<>();
             for (int i = 0; i < page.getRecords().size(); i++) {
@@ -141,6 +148,7 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
                 list.add(map);
             }
         }
+
         return new CommonPage<>(list,page.getTotal(),page.getCurrent(),page.getSize());
     }
 
@@ -228,6 +236,10 @@ public class MceReceiveServiceImpl extends AbstractCrudService<MceReceiveMapper,
     @Override
     public void add(String mceReceive){
         JSONObject mceReceiveVO = JSONObject.parseObject(mceReceive);
+        String infoTypeName = sysDictDataService.selectDictLabel("message_type",mceReceiveVO.get("infoType").toString());
+        if (!mceReceiveVO.containsKey("infoTypeName")) {
+            mceReceiveVO.put("infoTypeName",infoTypeName);
+        }
         MceContent mceContent = new MceContent();
         mceContent.setInfoTitle(mceReceiveVO.get("infoTitle").toString());
         mceContent.setInfoContent(mceReceiveVO.get("infoContent").toString());

+ 141 - 91
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysDeptServiceImpl.java

@@ -1,6 +1,8 @@
 package com.usky.system.service.impl;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.common.datascope.annotation.DataScope;
 import com.usky.common.mybatis.core.AbstractCrudService;
 import com.usky.common.security.utils.SecurityUtils;
@@ -10,76 +12,150 @@ import com.usky.common.core.util.StringUtils;
 import com.usky.system.domain.SysDept;
 import com.usky.system.domain.SysRole;
 import com.usky.system.domain.SysUser;
+import com.usky.system.domain.SysUserPost;
 import com.usky.system.domain.constants.UserConstants;
 import com.usky.system.mapper.SysDeptMapper;
 import com.usky.system.mapper.SysRoleMapper;
+import com.usky.system.mapper.SysUserPostMapper;
 import com.usky.system.service.ISysDeptService;
+import com.usky.system.service.vo.TreeNode;
 import com.usky.system.service.vo.TreeSelect;
+import com.usky.system.service.vo.UserPostVo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
 /**
  * 部门管理 服务实现
- * 
+ *
  * @author yq
  */
 @Service
-public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDept> implements ISysDeptService
-{
+public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDept> implements ISysDeptService {
+
+    private static final Logger log = LoggerFactory.getLogger(SysDeptServiceImpl.class);//还原代码
+
     @Autowired
     private SysDeptMapper deptMapper;
 
     @Autowired
     private SysRoleMapper roleMapper;
 
+    @Autowired
+    private SysUserPostMapper sysUserPostMapper;
+
     /**
      * 查询部门管理数据
-     * 
+     *
      * @param dept 部门信息
      * @return 部门信息集合
      */
     @Override
     @DataScope(deptAlias = "d")
-    public List<SysDept> selectDeptList(SysDept dept)
-    {
+    public List<SysDept> selectDeptList(SysDept dept) {
         dept.setTenantId(SecurityUtils.getTenantId());
         return deptMapper.selectDeptList(dept);
     }
 
+    @Override
+    public List<SysDept> deptList(SysDept dept) {
+        dept.setTenantId(SecurityUtils.getTenantId());
+        return deptMapper.deptList(dept);
+    }
+
+
+    @Override
+    public List<TreeNode> buildDeptUserTreeSelect(List<SysDept> depts, List<SysUser> users) {
+        List<Long> userIds = new ArrayList<>();
+        for (SysUser user : users){
+            userIds.add(user.getUserId());
+        }
+        List<UserPostVo> userPost = sysUserPostMapper.getUserPost(userIds);
+        Map<Long, String> userIdToPostMap = userPost.stream()
+                .collect(Collectors.toMap(UserPostVo::getUserId, UserPostVo::getPostName));
+        users.forEach(user -> user.setPost(userIdToPostMap.get(user.getUserId())));
+        List<SysDept> deptTrees = buildDeptTree2(depts);
+        fillUsersToDepts(deptTrees, users);
+        return deptTrees.stream().map(TreeNode::new).collect(Collectors.toList());
+    }
+
+    private void fillUsersToDepts(List<SysDept> depts, List<SysUser> users) {
+        for (SysDept dept : depts) {
+            if (dept.getChildren() == null || dept.getChildren().isEmpty()) {
+                List<SysUser> deptUsers = filterUsersByDept(users, dept.getDeptId());
+                if (!deptUsers.isEmpty()) {
+                    dept.setUsers(deptUsers);
+                }
+            }
+            if (dept.getChildren() != null) {
+                fillUsersToDepts(dept.getChildren(), users);
+            }
+        }
+    }
+
+    private List<SysUser> filterUsersByDept(List<SysUser> users, Long deptId) {
+        return users.stream()
+                .filter(user -> user.getDeptId().equals(deptId))
+                .collect(Collectors.toList());
+    }
+
+    private List<SysDept> buildDeptTree2(List<SysDept> depts) {
+        List<SysDept> returnList = new ArrayList<SysDept>();
+        List<Long> tempList = new ArrayList<Long>();
+        for (SysDept dept : depts) {
+            tempList.add(dept.getDeptId());
+        }
+        for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext(); ) {
+            SysDept dept = (SysDept) iterator.next();
+            if (!tempList.contains(dept.getParentId())) {
+                recursionFn2(depts, dept);
+                returnList.add(dept);
+            }
+        }
+        if (returnList.isEmpty()) {
+            returnList = depts;
+        }
+        return returnList;
+    }
+
+    private void recursionFn2(List<SysDept> list, SysDept t) {
+        List<SysDept> childList = getChildList(list, t);
+        t.setChildren(childList);
+        for (SysDept tChild : childList) {
+            if (hasChild(list, tChild)) {
+                recursionFn(list, tChild);
+            }
+        }
+    }
+
     /**
      * 构建前端所需要树结构
-     * 
+     *
      * @param depts 部门列表
      * @return 树结构列表
      */
     @Override
-    public List<SysDept> buildDeptTree(List<SysDept> depts)
-    {
+    public List<SysDept> buildDeptTree(List<SysDept> depts) {
         List<SysDept> returnList = new ArrayList<SysDept>();
         List<Long> tempList = new ArrayList<Long>();
-        for (SysDept dept : depts)
-        {
+        for (SysDept dept : depts) {
             tempList.add(dept.getDeptId());
         }
-        for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext();)
-        {
+        for (Iterator<SysDept> iterator = depts.iterator(); iterator.hasNext(); ) {
             SysDept dept = (SysDept) iterator.next();
             // 如果是顶级节点, 遍历该父节点的所有子节点
-            if (!tempList.contains(dept.getParentId()))
-            {
+            if (!tempList.contains(dept.getParentId())) {
                 recursionFn(depts, dept);
                 returnList.add(dept);
             }
         }
-        if (returnList.isEmpty())
-        {
+        if (returnList.isEmpty()) {
             returnList = depts;
         }
         return returnList;
@@ -87,18 +163,17 @@ public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDe
 
     /**
      * 构建前端所需要下拉树结构
-     * 
+     *
      * @param depts 部门列表
      * @return 下拉树结构列表
      */
     @Override
-    public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts)
-    {
+    public List<TreeSelect> buildDeptTreeSelect(List<SysDept> depts) {
         List<SysDept> deptTrees = buildDeptTree(depts);
         return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
     }
 
-    @Override
+/*    @Override
     public List<TreeSelect> buildDeptUserTreeSelect(List<SysDept> depts, List<SysUser> users) {
         List<SysDept> deptTrees = buildDeptTree(depts);
         List<TreeSelect> treeSelectList = new ArrayList<>();
@@ -119,86 +194,78 @@ public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDe
             treeSelectList.add(treeSelect);
         }
         return treeSelectList;
-    }
-
+    }*/
 
 
     /**
      * 根据角色ID查询部门树信息
-     * 
+     *
      * @param roleId 角色ID
      * @return 选中部门列表
      */
     @Override
-    public List<Integer> selectDeptListByRoleId(Long roleId)
-    {
+    public List<Integer> selectDeptListByRoleId(Long roleId) {
         SysRole role = roleMapper.selectRoleById(roleId);
         return deptMapper.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly());
     }
 
     /**
      * 根据部门ID查询信息
-     * 
+     *
      * @param deptId 部门ID
      * @return 部门信息
      */
     @Override
-    public SysDept selectDeptById(Long deptId)
-    {
+    public SysDept selectDeptById(Long deptId) {
         return deptMapper.selectDeptById(deptId);
     }
 
     /**
      * 根据ID查询所有子部门(正常状态)
-     * 
+     *
      * @param deptId 部门ID
      * @return 子部门数
      */
     @Override
-    public int selectNormalChildrenDeptById(Long deptId)
-    {
-        return deptMapper.selectNormalChildrenDeptById(deptId,SecurityUtils.getTenantId());
+    public int selectNormalChildrenDeptById(Long deptId) {
+        return deptMapper.selectNormalChildrenDeptById(deptId, SecurityUtils.getTenantId());
     }
 
     /**
      * 是否存在子节点
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
     @Override
-    public boolean hasChildByDeptId(Long deptId)
-    {
+    public boolean hasChildByDeptId(Long deptId) {
         int result = deptMapper.hasChildByDeptId(deptId);
         return result > 0 ? true : false;
     }
 
     /**
      * 查询部门是否存在用户
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果 true 存在 false 不存在
      */
     @Override
-    public boolean checkDeptExistUser(Long deptId)
-    {
+    public boolean checkDeptExistUser(Long deptId) {
         int result = deptMapper.checkDeptExistUser(deptId);
         return result > 0 ? true : false;
     }
 
     /**
      * 校验部门名称是否唯一
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
     @Override
-    public String checkDeptNameUnique(SysDept dept)
-    {
+    public String checkDeptNameUnique(SysDept dept) {
         Long deptId = Objects.isNull(dept.getDeptId()) ? -1L : dept.getDeptId();
-        SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId(),SecurityUtils.getTenantId());
-        if (Objects.nonNull(info) && info.getDeptId().longValue() != deptId.longValue())
-        {
+        SysDept info = deptMapper.checkDeptNameUnique(dept.getDeptName(), dept.getParentId(), SecurityUtils.getTenantId());
+        if (Objects.nonNull(info) && info.getDeptId().longValue() != deptId.longValue()) {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
@@ -206,21 +273,19 @@ public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDe
 
     /**
      * 新增保存部门信息
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
     @Override
-    public int insertDept(SysDept dept)
-    {
-        if (dept.getParentId()==null){
+    public int insertDept(SysDept dept) {
+        if (dept.getParentId() == null) {
             dept.setParentId(0L);
             dept.setAncestors("0");
-        }else {
+        } else {
             SysDept info = deptMapper.selectDeptById(dept.getParentId());
             // 如果父节点不为正常状态,则不允许新增子节点
-            if (!UserConstants.DEPT_NORMAL.equals(info.getStatus()))
-            {
+            if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) {
                 throw new BusinessException("部门停用,不允许新增");
             }
             dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
@@ -230,17 +295,15 @@ public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDe
 
     /**
      * 修改保存部门信息
-     * 
+     *
      * @param dept 部门信息
      * @return 结果
      */
     @Override
-    public int updateDept(SysDept dept)
-    {
+    public int updateDept(SysDept dept) {
         SysDept newParentDept = deptMapper.selectDeptById(dept.getParentId());
         SysDept oldDept = deptMapper.selectDeptById(dept.getDeptId());
-        if (Objects.nonNull(newParentDept) && Objects.nonNull(oldDept))
-        {
+        if (Objects.nonNull(newParentDept) && Objects.nonNull(oldDept)) {
             String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId();
             String oldAncestors = oldDept.getAncestors();
             dept.setAncestors(newAncestors);
@@ -248,8 +311,7 @@ public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDe
         }
         int result = deptMapper.updateDept(dept);
         if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && Objects.nonNull(dept.getAncestors())
-                && !StringUtils.equals("0", dept.getAncestors()))
-        {
+                && !StringUtils.equals("0", dept.getAncestors())) {
             // 如果该部门是启用状态,则启用该部门的所有上级部门
             updateParentDeptStatusNormal(dept);
         }
@@ -258,11 +320,10 @@ public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDe
 
     /**
      * 修改该部门的父级部门状态
-     * 
+     *
      * @param dept 当前部门
      */
-    private void updateParentDeptStatusNormal(SysDept dept)
-    {
+    private void updateParentDeptStatusNormal(SysDept dept) {
         String ancestors = dept.getAncestors();
         Long[] deptIds = Convert.toLongArray(ancestors);
         deptMapper.updateDeptStatusNormal(deptIds);
@@ -270,48 +331,41 @@ public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDe
 
     /**
      * 修改子元素关系
-     * 
-     * @param deptId 被修改的部门ID
+     *
+     * @param deptId       被修改的部门ID
      * @param newAncestors 新的父ID集合
      * @param oldAncestors 旧的父ID集合
      */
-    public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors)
-    {
+    public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) {
         List<SysDept> children = deptMapper.selectChildrenDeptById(deptId);
-        for (SysDept child : children)
-        {
+        for (SysDept child : children) {
             child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors));
         }
-        if (children.size() > 0)
-        {
+        if (children.size() > 0) {
             deptMapper.updateDeptChildren(children);
         }
     }
 
     /**
      * 删除部门管理信息
-     * 
+     *
      * @param deptId 部门ID
      * @return 结果
      */
     @Override
-    public int deleteDeptById(Long deptId)
-    {
+    public int deleteDeptById(Long deptId) {
         return deptMapper.deleteDeptById(deptId);
     }
 
     /**
      * 递归列表
      */
-    private void recursionFn(List<SysDept> list, SysDept t)
-    {
+    private void recursionFn(List<SysDept> list, SysDept t) {
         // 得到子节点列表
         List<SysDept> childList = getChildList(list, t);
         t.setChildren(childList);
-        for (SysDept tChild : childList)
-        {
-            if (hasChild(list, tChild))
-            {
+        for (SysDept tChild : childList) {
+            if (hasChild(list, tChild)) {
                 recursionFn(list, tChild);
             }
         }
@@ -320,15 +374,12 @@ public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDe
     /**
      * 得到子节点列表
      */
-    private List<SysDept> getChildList(List<SysDept> list, SysDept t)
-    {
+    private List<SysDept> getChildList(List<SysDept> list, SysDept t) {
         List<SysDept> tlist = new ArrayList<SysDept>();
         Iterator<SysDept> it = list.iterator();
-        while (it.hasNext())
-        {
+        while (it.hasNext()) {
             SysDept n = (SysDept) it.next();
-            if (Objects.nonNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue())
-            {
+            if (Objects.nonNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) {
                 tlist.add(n);
             }
         }
@@ -338,8 +389,7 @@ public class SysDeptServiceImpl extends AbstractCrudService<SysDeptMapper, SysDe
     /**
      * 判断是否有子节点
      */
-    private boolean hasChild(List<SysDept> list, SysDept t)
-    {
+    private boolean hasChild(List<SysDept> list, SysDept t) {
         return getChildList(list, t).size() > 0 ? true : false;
     }
 }

+ 0 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysTenantServiceImpl.java

@@ -103,7 +103,6 @@ public class SysTenantServiceImpl extends AbstractCrudService<SysTenantMapper, S
         SysDept sysDept = new SysDept();
         sysDept.setTenantId(tenantId);
         sysDept.setDeptName(sysTenant.getTenantName());
-        sysDept.setParentId((long)0);
         sysDept.setOrderNum("0");
         sysDept.setEmail(sysTenant.getEmail());
         sysDept.setPhone(sysTenant.getPhoneNumber());

+ 4 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserServiceImpl.java

@@ -523,7 +523,10 @@ public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUs
            sysUser = userMapper.selectUserDataOne(tenantId,phone);
        }
        if(Objects.isNull(sysUser)){
-           throw new BusinessException("用户信息未注册");
+           sysUser = userMapper.selectUserDataOne(tenantId,username);
+           if (Objects.isNull(sysUser)){
+               throw new BusinessException("用户信息未注册");
+           }
        }
        List<SysRole> sysRoles = roleMapper.selectRolePermissionByUserId(sysUser.getUserId());
        List<SysRoleVO> collect = sysRoles.stream().map(sysRole -> {

+ 79 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/TreeNode.java

@@ -0,0 +1,79 @@
+package com.usky.system.service.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.usky.system.domain.SysDept;
+import com.usky.system.domain.SysUser;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @description:TODO
+ * @author: fu
+ * @create: 2024-07-12 13:37
+ */
+@Data
+public class TreeNode implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 节点ID
+     */
+    private Long id;
+
+    /**
+     * 节点名称
+     */
+    private String label;
+
+//    /**
+//     * 用户头像
+//     */
+//    private String avatar;
+//
+//    /**
+//     * 用户职位
+//     */
+//    private String post;
+
+    /**
+     * 子节点
+     */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<TreeNode> children;
+
+    public TreeNode() {
+    }
+
+    public TreeNode(Long id, String label, List<TreeNode> children) {
+        this.id = id;
+        this.label = label;
+        this.children = children;
+    }
+
+//    public TreeNode(SysUser user) {
+//        this.id = user.getUserId();
+//        this.label = user.getNickName();
+//        this.avatar = user.getAvatar();
+//        this.post = user.getPost();
+//        this.children = new ArrayList<>();
+//    }
+
+    public TreeNode(SysDept dept) {
+        this.id = dept.getDeptId();
+        this.label = dept.getDeptName();
+        this.children = new ArrayList<>();
+        if (dept.getChildren() != null && !dept.getChildren().isEmpty()) {
+            this.children = dept.getChildren().stream().map(TreeNode::new).collect(Collectors.toList());
+        } else if (dept.getUsers() != null && !dept.getUsers().isEmpty()) {
+            this.children = dept.getUsers().stream().map(UserTreeNode::new).collect(Collectors.toList());
+        }
+    }
+}
+
+
+

+ 15 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/UserPostVo.java

@@ -0,0 +1,15 @@
+package com.usky.system.service.vo;
+
+import lombok.Data;
+
+/**
+ * @description:TODO
+ * @author: fu
+ * @create: 2024-07-15 18:37
+ */
+@Data
+public class UserPostVo {
+    private Long userId;
+    private String postName;
+}
+

+ 62 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/UserTreeNode.java

@@ -0,0 +1,62 @@
+package com.usky.system.service.vo;
+import com.usky.system.domain.SysDeptVO;
+import com.usky.system.domain.SysUser;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.Date;
+
+/**
+ * @description:TODO
+ * @author: fu
+ * @create: 2024-08-01 11:40
+ */
+@Data
+public class UserTreeNode extends TreeNode {
+
+    /** 用户ID */
+    private Long userId;
+
+    /** 部门ID */
+    private Long deptId;
+
+    /** 用户账号 */
+    private String userName;
+
+    /** 用户昵称 */
+    private String nickName;
+
+    /** 用户邮箱 */
+    private String email;
+
+    /** 手机号码 */
+    private String phonenumber;
+
+    /** 用户性别 */
+    private String sex;
+
+    /** 用户头像 */
+    private String avatar;
+
+    /** 地址 */
+    private String address;
+
+    /** 岗位 */
+    private String post;
+
+
+    public UserTreeNode(SysUser user) {
+        super(user.getUserId(), user.getNickName(), new ArrayList<>());
+        this.userId = user.getUserId();
+        this.deptId = user.getDeptId();
+        this.userName = user.getUserName();
+        this.nickName = user.getNickName();
+        this.email = user.getEmail();
+        this.phonenumber = user.getPhonenumber();
+        this.sex = user.getSex();
+        this.avatar = user.getAvatar();
+        this.address = user.getAddress();
+        this.post = user.getPost();
+    }
+}
+

+ 9 - 0
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysDeptMapper.xml

@@ -49,6 +49,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		${params.dataScope}
 		order by d.parent_id, d.order_num
     </select>
+
+	<select id="deptList" parameterType="com.usky.system.domain.SysDept" resultMap="SysDeptResult">
+		<include refid="selectDeptVo"/>
+		where d.del_flag = '0'
+		<if test="tenantId != null and tenantId != '' and tenantId != 0">
+			AND tenant_id = #{tenantId}
+		</if>
+		order by d.parent_id, d.order_num
+	</select>
     
     <select id="selectDeptListByRoleId" resultType="Integer">
 		select d.dept_id

+ 22 - 5
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysUserPostMapper.xml

@@ -12,23 +12,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<delete id="deleteUserPostByUserId" parameterType="Long">
 		delete from sys_user_post where user_id=#{userId}
 	</delete>
-	
+
 	<select id="countUserPostById" resultType="Integer">
 	    select count(1) from sys_user_post where post_id=#{postId}  
 	</select>
-	
+
 	<delete id="deleteUserPost" parameterType="Long">
  		delete from sys_user_post where user_id in
  		<foreach collection="ids" item="ids" open="(" separator="," close=")">
  			#{ids}
-        </foreach> 
+        </foreach>
  	</delete>
-	
+
 	<insert id="batchUserPost">
 		insert into sys_user_post(user_id, post_id) values
 		<foreach item="item" index="index" collection="list" separator=",">
 			(#{item.userId},#{item.postId})
 		</foreach>
 	</insert>
-	
+
+
+	<select id="getUserPost" resultType="com.usky.system.service.vo.UserPostVo">
+        SELECT
+        u.user_id AS userId,
+        p.post_name AS postName
+        FROM
+        sys_user_post u
+        INNER JOIN
+        sys_post p ON u.post_id = p.post_id
+        WHERE
+        u.user_id IN
+        <foreach collection="userIds" item="userId" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </select>
+
+
 </mapper>