Browse Source

增加了一些公共接口;
修复了部门项目树和更新部门的一些bug;

lixing 3 years ago
parent
commit
4fe8ee9550
56 changed files with 2767 additions and 2005 deletions
  1. 1 1
      fm-person/src/main/java/com/persagy/fm/department/controller/DepartmentController.java
  2. 4 3
      fm-person/src/main/java/com/persagy/fm/department/model/dto/AddDepartmentDTO.java
  3. 3 2
      fm-person/src/main/java/com/persagy/fm/department/model/dto/QueryDepProjectTreeDTO.java
  4. 2 1
      fm-person/src/main/java/com/persagy/fm/department/model/dto/UpdateDepartmentDTO.java
  5. 1 1
      fm-person/src/main/java/com/persagy/fm/department/model/vo/ResponseDepartmentItemVO.java
  6. 1 1
      fm-person/src/main/java/com/persagy/fm/department/model/vo/ResponseDepartmentListItemVO.java
  7. 30 0
      fm-person/src/main/java/com/persagy/fm/department/service/IDepartmentService.java
  8. 3 8
      fm-person/src/main/java/com/persagy/fm/department/service/impl/DepTranslatorImpl.java
  9. 46 8
      fm-person/src/main/java/com/persagy/fm/department/service/impl/DepartmentServiceImpl.java
  10. 6 2
      fm-person/src/main/java/com/persagy/fm/depproject/model/dto/QueryDepProjectDTO.java
  11. 2 4
      fm-person/src/main/java/com/persagy/fm/depproject/service/IDepProjectService.java
  12. 23 14
      fm-person/src/main/java/com/persagy/fm/depproject/service/impl/DepProjectServiceImpl.java
  13. 94 38
      fm-person/src/main/java/com/persagy/fm/person/controller/PersonController.java
  14. 0 3
      fm-person/src/main/java/com/persagy/fm/person/controller/PersonEnumController.java
  15. 21 4
      fm-person/src/main/java/com/persagy/fm/person/dao/PersonMapper.java
  16. 9 6
      fm-person/src/main/java/com/persagy/fm/person/jms/handler/AccountMsgHandler.java
  17. 11 4
      fm-person/src/main/java/com/persagy/fm/person/model/ConvertPersonTool.java
  18. 1 1
      fm-person/src/main/java/com/persagy/fm/person/model/dto/AddPerson4BackEndDTO.java
  19. 1 1
      fm-person/src/main/java/com/persagy/fm/person/model/dto/AddPerson4FrontEndDTO.java
  20. 1 5
      fm-person/src/main/java/com/persagy/fm/person/model/dto/DeletePersonDTO.java
  21. 30 0
      fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryByDepIdDTO.java
  22. 27 0
      fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryByDepIdsDTO.java
  23. 21 0
      fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryByRoleIdsDTO.java
  24. 3 0
      fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryPersonDTO.java
  25. 19 0
      fm-person/src/main/java/com/persagy/fm/person/model/dto/PersonIdDTO.java
  26. 4 1
      fm-person/src/main/java/com/persagy/fm/person/model/dto/QueryByAccountIdDTO.java
  27. 21 0
      fm-person/src/main/java/com/persagy/fm/person/model/dto/QueryByIdsDTO.java
  28. 1 1
      fm-person/src/main/java/com/persagy/fm/person/model/dto/UpdatePerson4FrontEndDTO.java
  29. 0 21
      fm-person/src/main/java/com/persagy/fm/person/model/dto/UpsertPerson4BackEndDTO.java
  30. 0 30
      fm-person/src/main/java/com/persagy/fm/person/model/dto/UpsertPerson4FrontEndDTO.java
  31. 4 0
      fm-person/src/main/java/com/persagy/fm/person/model/dto/UpsertPersonDTO.java
  32. 16 0
      fm-person/src/main/java/com/persagy/fm/person/model/vo/AccountIdVO.java
  33. 138 0
      fm-person/src/main/java/com/persagy/fm/person/service/IPersonCheckService.java
  34. 255 0
      fm-person/src/main/java/com/persagy/fm/person/service/IPersonQueryService.java
  35. 0 353
      fm-person/src/main/java/com/persagy/fm/person/service/IPersonService.java
  36. 112 0
      fm-person/src/main/java/com/persagy/fm/person/service/IPersonUpsertService.java
  37. 345 0
      fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonCheckServiceImpl.java
  38. 4 4
      fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonNameTranslator.java
  39. 3 3
      fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonProjectServiceImpl.java
  40. 580 0
      fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonQueryServiceImpl.java
  41. 39 1
      fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonServiceTool.java
  42. 0 1436
      fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonServiceImpl.java
  43. 666 0
      fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonUpsertServiceImpl.java
  44. 3 3
      fm-person/src/main/java/com/persagy/fm/profession/service/impl/ProfessionServiceImpl.java
  45. 3 0
      fm-person/src/main/java/com/persagy/fm/saas/account/model/dto/PageQuerySaasAccountDTO.java
  46. 10 0
      fm-person/src/main/java/com/persagy/fm/saas/account/service/ISaasAccountService.java
  47. 15 0
      fm-person/src/main/java/com/persagy/fm/saas/account/service/impl/SaasAccountServiceImpl.java
  48. 3 0
      fm-person/src/main/java/com/persagy/fm/saas/accountrole/model/dto/QuerySaasAccountRoleDTO.java
  49. 10 0
      fm-person/src/main/java/com/persagy/fm/saas/accountrole/service/ISaasAccountRoleService.java
  50. 26 0
      fm-person/src/main/java/com/persagy/fm/saas/accountrole/service/impl/SaasAccountRoleServiceImpl.java
  51. 4 4
      fm-person/src/main/java/com/persagy/fm/saas/common/model/dto/SaasBaseDTO.java
  52. 31 15
      fm-person/src/main/java/com/persagy/fm/saas/role/controller/SaasRoleController.java
  53. 24 0
      fm-person/src/main/java/com/persagy/fm/saas/role/model/dto/QuerySaasRoleDetailDTO.java
  54. 9 9
      fm-person/src/main/java/com/persagy/fm/saas/role/service/ISaasRoleService.java
  55. 14 0
      fm-person/src/main/java/com/persagy/fm/saas/role/service/impl/SaasRoleServiceImpl.java
  56. 67 17
      fm-person/src/main/resources/mapper/PersonMapper.xml

+ 1 - 1
fm-person/src/main/java/com/persagy/fm/department/controller/DepartmentController.java

@@ -163,7 +163,7 @@ public class DepartmentController {
     @PostMapping("/projects/tree")
     public CommonResult<PageList<ProjectTreeItemVO>> queryDepProjectTree(
             @Valid @RequestBody QueryDepProjectTreeDTO queryDepProjectTreeDTO) {
-        List<ProjectTreeItemVO> projectTreeItemVOList = depProjectService.queryDepProjectTree(queryDepProjectTreeDTO.getParentDepId());
+        List<ProjectTreeItemVO> projectTreeItemVOList = depProjectService.queryDepProjectTree(queryDepProjectTreeDTO.getParentDepIds());
         projectTreeItemVOList = projectTreeItemVOList == null ? Lists.newArrayList() : projectTreeItemVOList;
         return ResultHelper.multi(projectTreeItemVOList);
     }

+ 4 - 3
fm-person/src/main/java/com/persagy/fm/department/model/dto/AddDepartmentDTO.java

@@ -4,6 +4,7 @@ import com.persagy.fm.common.constant.RegexConstants;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 
@@ -20,18 +21,18 @@ import java.util.List;
 @ApiModel(value = "创建部门入参")
 public class AddDepartmentDTO {
     @ApiModelProperty(value = "部门名称", required = true)
-    @NotNull(message = "部门名称不能为空")
+    @NotBlank(message = "部门名称不能为空")
     @Length(max = 100, message = "部门名称长度不能超过100字")
     @Pattern(regexp= RegexConstants.NAME_REGEX,
             message = "部门名称" + RegexConstants.NAME_REGEX_WARNING)
     private String name;
 
     @ApiModelProperty(value = "部门类型", required = true, notes = "com.persagy.fm.department.constant.enums.DepTypeEnum")
-    @NotNull(message = "部门类型不能为空")
+    @NotBlank(message = "部门类型不能为空")
     private String type;
 
     @ApiModelProperty(value = "上级部门id", required = true)
-    @NotNull(message = "上级部门id不能为空")
+    @NotBlank(message = "上级部门id不能为空")
     private String parentId;
 
     @ApiModelProperty(value = "数据来源", notes = "com.persagy.fm.department.constant.enums.ResourceFromEnum")

+ 3 - 2
fm-person/src/main/java/com/persagy/fm/department/model/dto/QueryDepProjectTreeDTO.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * @author lixing
@@ -13,6 +14,6 @@ import javax.validation.constraints.NotNull;
 @Data
 @ApiModel(value = "查询部门项目树入参")
 public class QueryDepProjectTreeDTO {
-    @ApiModelProperty(value = "父部门id。不传加载整个集团的项目树")
-    private String parentDepId;
+    @ApiModelProperty(value = "父部门id列表。不传加载整个集团的项目树")
+    private List<String> parentDepIds;
 }

+ 2 - 1
fm-person/src/main/java/com/persagy/fm/department/model/dto/UpdateDepartmentDTO.java

@@ -4,6 +4,7 @@ import com.persagy.fm.common.constant.RegexConstants;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 
@@ -20,7 +21,7 @@ import java.util.List;
 @ApiModel(value = "更新部门入参")
 public class UpdateDepartmentDTO {
     @ApiModelProperty(value = "id", required = true)
-    @NotNull(message = "id不能为空")
+    @NotBlank(message = "id不能为空")
     private String id;
 
     @ApiModelProperty(value = "部门名称", required = true)

+ 1 - 1
fm-person/src/main/java/com/persagy/fm/department/model/vo/ResponseDepartmentItemVO.java

@@ -39,7 +39,7 @@ public class ResponseDepartmentItemVO {
     @ApiModelProperty(value = "数据来源", notes = "com.persagy.fm.department.constant.enums.ResourceFromEnum")
     private String resourceFrom;
 
-    @ApiModelProperty("负责人列表")
+    @ApiModelProperty("部门主管列表")
     private List<ManagerSimpleObjVO> managers;
 
     @ApiModelProperty("部门全路径")

+ 1 - 1
fm-person/src/main/java/com/persagy/fm/department/model/vo/ResponseDepartmentListItemVO.java

@@ -34,7 +34,7 @@ public class ResponseDepartmentListItemVO {
     @ApiModelProperty(value = "数据来源", notes = "com.persagy.fm.department.constant.enums.ResourceFromEnum")
     private String resourceFrom;
 
-    @ApiModelProperty("负责人")
+    @ApiModelProperty("部门主管")
     private String managers;
 
     @ApiModelProperty("部门全路径")

+ 30 - 0
fm-person/src/main/java/com/persagy/fm/department/service/IDepartmentService.java

@@ -164,4 +164,34 @@ public interface IDepartmentService {
      * @version V1.0 2021/4/26 4:59 下午
      */
     FullPathInfoVO getFullPathInfo(String depId);
+
+    /**
+     * 根据部门全路径查询子公司
+     *
+     * @param fullPath 部门全路径
+     * @return 子公司列表
+     * @author lixing
+     * @version V1.0 2021/4/29 4:01 下午
+     */
+    List<Department> querySonDepsByFullPath(String fullPath);
+
+    /**
+     * 查询全路径中包含给定路径的公司
+     *
+     * @param fullPath 部门全路径
+     * @return 公司列表
+     * @author lixing
+     * @version V1.0 2021/4/29 4:01 下午
+     */
+    List<Department> queryDepsContainsFullPath(String fullPath);
+
+    /**
+     * 根据全路径查询部门详情
+     *
+     * @param fullPath 部门全路径
+     * @return 部门实体
+     * @author lixing
+     * @version V1.0 2021/4/30 5:35 下午
+     */
+    Department queryDepDetailByFullPath(String fullPath);
 }

+ 3 - 8
fm-person/src/main/java/com/persagy/fm/department/service/impl/DepTranslatorImpl.java

@@ -1,22 +1,17 @@
 package com.persagy.fm.department.service.impl;
 
-import com.persagy.fm.common.response.FmResponseContent;
 import com.persagy.fm.department.model.vo.ManagerSimpleObjVO;
+import com.persagy.fm.person.service.IPersonQueryService;
 import com.persagy.fm.saas.project.model.vo.ProjectSimpleObjVO;
 import com.persagy.fm.department.service.IDepTranslator;
 import com.persagy.fm.person.model.Person;
-import com.persagy.fm.person.service.IPersonService;
-import com.persagy.fm.saas.project.client.SaasProjectClient;
 import com.persagy.fm.saas.project.model.SaasProject;
-import com.persagy.fm.saas.project.model.dto.QuerySaasProjectDTO;
 import com.persagy.fm.saas.project.service.ISaasProjectService;
-import org.apache.commons.lang3.StringUtils;
 import org.assertj.core.util.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -29,7 +24,7 @@ import java.util.stream.Collectors;
 @Service
 public class DepTranslatorImpl implements IDepTranslator {
     @Autowired
-    IPersonService personService;
+    IPersonQueryService personQueryService;
     @Autowired
     ISaasProjectService saasProjectService;
 
@@ -38,7 +33,7 @@ public class DepTranslatorImpl implements IDepTranslator {
         if (CollectionUtils.isEmpty(managerIds)) {
             return Lists.newArrayList();
         }
-        List<Person> people = personService.queryByIds(managerIds);
+        List<Person> people = personQueryService.queryByIds(managerIds);
         return people.stream().map(person -> {
             ManagerSimpleObjVO managerSimpleObjVO = new ManagerSimpleObjVO();
             managerSimpleObjVO.setId(person.getId().toString());

+ 46 - 8
fm-person/src/main/java/com/persagy/fm/department/service/impl/DepartmentServiceImpl.java

@@ -31,7 +31,7 @@ import com.persagy.fm.depproject.model.dto.AddDepProjectDTO;
 import com.persagy.fm.depproject.service.IDepProjectService;
 import com.persagy.fm.person.model.dto.PageQueryPersonDTO;
 import com.persagy.fm.person.model.vo.ResponsePersonListItemVO;
-import com.persagy.fm.person.service.IPersonService;
+import com.persagy.fm.person.service.IPersonQueryService;
 import com.persagy.fm.workresume.model.WorkResume;
 import com.persagy.fm.workresume.model.dto.QueryWorkResumeDTO;
 import com.persagy.fm.workresume.service.IWorkResumeService;
@@ -57,7 +57,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
     @Autowired
     private IDepProjectService depProjectService;
     @Autowired
-    private IPersonService personService;
+    private IPersonQueryService personQueryService;
     @Autowired
     private IWorkResumeService workResumeService;
 
@@ -248,7 +248,11 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         if (StringUtils.isNotBlank(updateDepartmentDTO.getName()) &&
                 !nameBeforeChange.equals(updateDepartmentDTO.getName())) {
             nameAfterChange = updateDepartmentDTO.getName();
-            checkDuplicateDeptName(updateDepartmentDTO.getName(), department.getParentId());
+            String parentId = department.getParentId();
+            if (StringUtils.isNotBlank(updateDepartmentDTO.getParentId())) {
+                parentId = updateDepartmentDTO.getParentId();
+            }
+            checkDuplicateDeptName(updateDepartmentDTO.getName(), parentId);
             fullPathAfterChange = getDepFullPathWhenNameChange(
                     nameBeforeChange, fullPathBeforeChange, nameAfterChange);
         }
@@ -275,6 +279,14 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             fullPathAfterChange = nameAfterChange;
         }
 
+        // 如果部门的全路径发生变化,判断是否存在重复的部门全路径
+        if (!fullPathAfterChange.equals(fullPathBeforeChange)) {
+            Department tmp = queryDepDetailByFullPath(fullPathAfterChange);
+            if (tmp != null) {
+                throw new IllegalArgumentException("部门名称已被使用");
+            }
+        }
+
         return fullPathAfterChange;
     }
 
@@ -353,9 +365,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
      */
     private void updateSonDepsFullPath(String fullPathBeforeChange, String fullPathAfterChange) {
         // 根据部门全路径查询子部门
-        QueryDepartmentDTO queryDepartmentDTO = new QueryDepartmentDTO();
-        queryDepartmentDTO.setFullPath(fullPathBeforeChange + DepConstants.FULL_PATH_SEPARATOR);
-        List<Department> sonDeps = queryDepartmentList(queryDepartmentDTO);
+        List<Department> sonDeps = querySonDepsByFullPath(fullPathBeforeChange);
         // 修改子部门全路径
         for (Department sonDep : sonDeps) {
             String tmpFullPath = sonDep.getFullPath();
@@ -368,6 +378,34 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
     }
 
     @Override
+    public List<Department> querySonDepsByFullPath(String fullPath) {
+        QueryDepartmentDTO queryDepartmentDTO = new QueryDepartmentDTO();
+        queryDepartmentDTO.setFullPath(fullPath + DepConstants.FULL_PATH_SEPARATOR);
+        return queryDepartmentList(queryDepartmentDTO);
+    }
+
+    @Override
+    public List<Department> queryDepsContainsFullPath(String fullPath) {
+        QueryDepartmentDTO queryDepartmentDTO = new QueryDepartmentDTO();
+        queryDepartmentDTO.setFullPath(fullPath);
+        return queryDepartmentList(queryDepartmentDTO);
+    }
+
+    @Override
+    public Department queryDepDetailByFullPath(String fullPath) {
+        QueryWrapper<Department> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(Department.PROP_VALID, ValidEnum.TRUE.getType());
+        queryWrapper.eq(Department.PROP_FULL_PATH, fullPath);
+
+        List<Department> deps = list(queryWrapper);
+        if (CollectionUtils.isEmpty(deps)) {
+            return null;
+        } else {
+            return deps.get(0);
+        }
+    }
+
+    @Override
     public Department checkDeletable(String id) {
         if (id == null) {
             throw new IllegalArgumentException("删除Department时发生异常,主键为空!");
@@ -400,7 +438,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         pageQueryPersonDTO.setPage(PageQueryConstants.DEFAULT_PAGE);
         pageQueryPersonDTO.setSize(PageQueryConstants.DEFAULT_SIZE);
         pageQueryPersonDTO.setDepId(id);
-        IPage<ResponsePersonListItemVO> responsePersonListItemVOIPage = personService.pageQueryPerson(pageQueryPersonDTO);
+        IPage<ResponsePersonListItemVO> responsePersonListItemVOIPage = personQueryService.pageQueryPerson(pageQueryPersonDTO);
         if (responsePersonListItemVOIPage.getTotal() > 0) {
             throw new IllegalArgumentException("当前部门包含员工,不可删除");
         }
@@ -461,7 +499,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             }
 
             if (StringUtils.isNotEmpty(queryDepartmentDTO.getFullPath())) {
-                queryWrapper.like(Department.PROP_FULL_PATH, queryDepartmentDTO.getFullPath());
+                queryWrapper.likeRight(Department.PROP_FULL_PATH, queryDepartmentDTO.getFullPath());
             }
         }
         return list(queryWrapper);

+ 6 - 2
fm-person/src/main/java/com/persagy/fm/depproject/model/dto/QueryDepProjectDTO.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * @author lixing
@@ -13,10 +14,13 @@ import java.util.Date;
 @Data
 @ApiModel(value = "查询部门项目入参")
 public class QueryDepProjectDTO {
-    @ApiModelProperty(value = "部门id", required = true)
+    @ApiModelProperty(value = "部门id")
     private String depId;
 
-    @ApiModelProperty(value = "项目id", required = true)
+    @ApiModelProperty(value = "部门id列表")
+    private List<String> depIds;
+
+    @ApiModelProperty(value = "项目id")
     private String projectId;
 
 }

+ 2 - 4
fm-person/src/main/java/com/persagy/fm/depproject/service/IDepProjectService.java

@@ -7,8 +7,6 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.persagy.fm.saas.project.model.vo.ProjectTreeItemVO;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
 
 /**
  * 部门项目(DepProject) service接口
@@ -79,12 +77,12 @@ public interface IDepProjectService {
     /**
      * 获取部门关联的项目树
      *
-     * @param depId 部门id
+     * @param depIds 部门id列表
      * @return 部门关联的项目树
      * @author lixing
      * @version V1.0 2021/3/22 3:58 下午
      */
-    List<ProjectTreeItemVO> queryDepProjectTree(String depId);
+    List<ProjectTreeItemVO> queryDepProjectTree(List<String> depIds);
 
     /**
      * 批量保存部门关联的项目

+ 23 - 14
fm-person/src/main/java/com/persagy/fm/depproject/service/impl/DepProjectServiceImpl.java

@@ -1,28 +1,31 @@
 package com.persagy.fm.depproject.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.base.CaseFormat;
 import com.persagy.fm.common.constant.DefaultValueConstants;
+import com.persagy.fm.common.constant.enums.ValidEnum;
 import com.persagy.fm.common.context.DefaultAppContext;
+import com.persagy.fm.common.model.dto.Sort;
 import com.persagy.fm.depproject.dao.DepProjectMapper;
+import com.persagy.fm.depproject.model.ConvertDepProjectTool;
+import com.persagy.fm.depproject.model.DepProject;
+import com.persagy.fm.depproject.model.dto.AddDepProjectDTO;
+import com.persagy.fm.depproject.model.dto.PageQueryDepProjectDTO;
+import com.persagy.fm.depproject.model.dto.QueryDepProjectDTO;
+import com.persagy.fm.depproject.model.dto.UpdateDepProjectDTO;
 import com.persagy.fm.depproject.service.IDepProjectService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.persagy.fm.saas.project.model.vo.ProjectTreeItemVO;
 import com.persagy.fm.saas.project.service.ISaasProjectService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.persagy.fm.common.constant.enums.ValidEnum;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.persagy.fm.depproject.model.*;
-import com.persagy.fm.depproject.model.dto.*;
+import org.springframework.util.CollectionUtils;
 
 import java.util.List;
 import java.util.stream.Collectors;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.google.common.base.CaseFormat;
-import com.persagy.fm.common.model.dto.Sort;
-import org.springframework.util.CollectionUtils;
-
 /**
  * 部门项目(DepProject) service层
  *
@@ -36,17 +39,19 @@ public class DepProjectServiceImpl extends ServiceImpl<DepProjectMapper, DepProj
     ISaasProjectService saasProjectService;
 
     @Override
-    public List<ProjectTreeItemVO> queryDepProjectTree(String parentDepId) {
+    public List<ProjectTreeItemVO> queryDepProjectTree(List<String> parentDepIds) {
         // 父部门id 为0或空, 加载整颗区域项目树
-        if (parentDepId == null || DefaultValueConstants.NO_PARENT_ID.equals(parentDepId)) {
+        if (CollectionUtils.isEmpty(parentDepIds) ||
+                parentDepIds.contains(DefaultValueConstants.NO_PARENT_ID)) {
             return saasProjectService.queryAllProjectTree();
         }
         // 部门关联的项目
         QueryDepProjectDTO queryDepProjectDTO = new QueryDepProjectDTO();
-        queryDepProjectDTO.setDepId(parentDepId);
+        queryDepProjectDTO.setDepIds(parentDepIds);
         List<DepProject> depProjectList = queryDepProjectList(queryDepProjectDTO);
         List<String> projectIds = depProjectList.stream().
                 map(DepProject::getProjectId).
+                distinct().
                 collect(Collectors.toList());
         return saasProjectService.queryProjectTree(projectIds);
     }
@@ -185,6 +190,10 @@ public class DepProjectServiceImpl extends ServiceImpl<DepProjectMapper, DepProj
                 queryWrapper.eq(DepProject.PROP_DEP_ID, queryDepProjectDTO.getDepId());
             }
 
+            if (queryDepProjectDTO.getDepIds() != null) {
+                queryWrapper.in(DepProject.PROP_DEP_ID, queryDepProjectDTO.getDepIds());
+            }
+
             if (queryDepProjectDTO.getProjectId() != null) {
                 queryWrapper.eq(DepProject.PROP_PROJECT_ID, queryDepProjectDTO.getProjectId());
             }

+ 94 - 38
fm-person/src/main/java/com/persagy/fm/person/controller/PersonController.java

@@ -1,7 +1,9 @@
 package com.persagy.fm.person.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.persagy.fm.common.model.vo.DuplicateVO;
+import com.persagy.fm.common.model.vo.SimpleObjVO;
 import com.persagy.fm.common.response.CommonResult;
 import com.persagy.fm.common.response.FmResponseUpsertVO;
 import com.persagy.fm.common.response.PageList;
@@ -10,17 +12,17 @@ import com.persagy.fm.mybatis.annotations.FormatMybatisQueryParams;
 import com.persagy.fm.person.model.ConvertPersonTool;
 import com.persagy.fm.person.model.Person;
 import com.persagy.fm.person.model.dto.*;
-import com.persagy.fm.person.model.vo.LatestJobNumberVO;
-import com.persagy.fm.person.model.vo.ResponsePersonItemVO;
-import com.persagy.fm.person.model.vo.ResponsePersonListItemVO;
-import com.persagy.fm.person.model.vo.SimplePersonListItemVO;
+import com.persagy.fm.person.model.vo.*;
+import com.persagy.fm.person.service.IPersonCheckService;
 import com.persagy.fm.person.service.IPersonProjectService;
-import com.persagy.fm.person.service.IPersonService;
+import com.persagy.fm.person.service.IPersonQueryService;
+import com.persagy.fm.person.service.IPersonUpsertService;
 import com.persagy.fm.saas.project.model.vo.ProjectTreeItemVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -42,7 +44,11 @@ import java.util.List;
 @RequestMapping("persons")
 public class PersonController {
     @Autowired
-    private IPersonService personService;
+    private IPersonUpsertService personUpsertService;
+    @Autowired
+    private IPersonQueryService personQueryService;
+    @Autowired
+    private IPersonCheckService personCheckService;
     @Autowired
     private IPersonProjectService personProjectService;
 
@@ -50,7 +56,7 @@ public class PersonController {
     @PostMapping("/create")
     public CommonResult<FmResponseUpsertVO> createPerson(
             @Validated @RequestBody AddPerson4FrontEndDTO addPerson4FrontEndDTO) {
-        String id = personService.createPerson(addPerson4FrontEndDTO);
+        String id = personUpsertService.createPerson(addPerson4FrontEndDTO);
         return ResultHelper.single(new FmResponseUpsertVO(id));
     }
 
@@ -60,7 +66,7 @@ public class PersonController {
             @Validated @RequestBody AddPerson4BackEndDTO addPerson4BackEndDTO) {
         AddPerson4FrontEndDTO addPerson4FrontEndDTO = ConvertPersonTool.INSTANCE.
                 convert2AddPerson4FrontEndDTO(addPerson4BackEndDTO);
-        String id = personService.createPerson(addPerson4FrontEndDTO);
+        String id = personUpsertService.createPerson(addPerson4FrontEndDTO);
         return ResultHelper.single(new FmResponseUpsertVO(id));
     }
 
@@ -68,7 +74,7 @@ public class PersonController {
     @PostMapping("/get")
     public CommonResult<ResponsePersonItemVO> queryPersonDetail(
             @Valid @RequestBody QueryPersonDetailDTO queryPersonDetailDTO) {
-        ResponsePersonItemVO responsePersonItemVO = personService.queryPersonDetail(
+        ResponsePersonItemVO responsePersonItemVO = personQueryService.queryPersonDetail(
                 queryPersonDetailDTO.getId(), queryPersonDetailDTO.getDepId());
         return ResultHelper.single(responsePersonItemVO);
     }
@@ -78,7 +84,7 @@ public class PersonController {
     @PostMapping("/update")
     public CommonResult<FmResponseUpsertVO> updatePerson(
             @Valid @RequestBody UpdatePerson4FrontEndDTO updatePerson4FrontEndDTO) {
-        personService.updatePerson(updatePerson4FrontEndDTO);
+        personUpsertService.updatePerson(updatePerson4FrontEndDTO);
         return ResultHelper.single(new FmResponseUpsertVO(updatePerson4FrontEndDTO.getId()));
     }
 
@@ -87,7 +93,7 @@ public class PersonController {
     @PostMapping("/delete")
     public CommonResult deletePerson(
             @RequestBody @Valid DeletePersonDTO deletePersonDTO) {
-        personService.deletePerson(deletePersonDTO.getId());
+        personUpsertService.deletePerson(deletePersonDTO.getId());
         return ResultHelper.success("删除成功");
     }
 
@@ -96,7 +102,7 @@ public class PersonController {
     @FormatMybatisQueryParams
     public CommonResult<PageList<SimplePersonListItemVO>> nameQuickSearch(
             @Valid @RequestBody NameQuickSearchDTO nameQuickSearchDTO) {
-        List<Person> personList = personService.nameQuickSearch(nameQuickSearchDTO);
+        List<Person> personList = personQueryService.nameQuickSearch(nameQuickSearchDTO);
         List<SimplePersonListItemVO> resultList = ConvertPersonTool.INSTANCE.convert2SimpleList(personList);
         return ResultHelper.multi(resultList);
     }
@@ -107,7 +113,7 @@ public class PersonController {
     @FormatMybatisQueryParams
     public CommonResult<PageList<ResponsePersonListItemVO>> pageQueryPerson(
             @Valid @RequestBody PageQueryPersonDTO pageQueryPersonDTO) {
-        IPage<ResponsePersonListItemVO> pagedList = personService.pageQueryPerson(pageQueryPersonDTO);
+        IPage<ResponsePersonListItemVO> pagedList = personQueryService.pageQueryPerson(pageQueryPersonDTO);
         return ResultHelper.multi(pagedList);
     }
 
@@ -116,7 +122,7 @@ public class PersonController {
     @FormatMybatisQueryParams
     public CommonResult<PageList<ResponsePersonListItemVO>> pageQueryByNameOrUserName(
             @Valid @RequestBody PageQueryPersonByNameOrUserNameDTO pageQueryPersonByNameOrUserNameDTO) {
-        IPage<ResponsePersonListItemVO> pagedList = personService.pageQueryByNameOrUserName(pageQueryPersonByNameOrUserNameDTO);
+        IPage<ResponsePersonListItemVO> pagedList = personQueryService.pageQueryByNameOrUserName(pageQueryPersonByNameOrUserNameDTO);
         return ResultHelper.multi(pagedList);
     }
 
@@ -125,7 +131,7 @@ public class PersonController {
     @FormatMybatisQueryParams
     public CommonResult<PageList<ResponsePersonListItemVO>> queryByUserName(
             @Valid @RequestBody QueryByUserNameDTO queryByUserNameDTO) {
-        IPage<ResponsePersonListItemVO> pagedList = personService.queryByUserName(queryByUserNameDTO);
+        IPage<ResponsePersonListItemVO> pagedList = personQueryService.queryByUserName(queryByUserNameDTO);
         return ResultHelper.multi(pagedList);
     }
 
@@ -134,31 +140,40 @@ public class PersonController {
     @FormatMybatisQueryParams
     public CommonResult<PageList<ResponsePersonListItemVO>> queryByName(
             @Valid @RequestBody QueryByNameDTO queryByNameDTO) {
-        IPage<ResponsePersonListItemVO> pagedList = personService.queryByName(queryByNameDTO);
+        IPage<ResponsePersonListItemVO> pagedList = personQueryService.queryByName(queryByNameDTO);
+        return ResultHelper.multi(pagedList);
+    }
+
+    @ApiOperation(value = "根据部门id分页查询")
+    @PostMapping("/queryByDepId")
+    @FormatMybatisQueryParams
+    public CommonResult<PageList<ResponsePersonListItemVO>> queryByDepId(
+            @Valid @RequestBody PageQueryByDepIdDTO pageQueryByDepIdDTO) {
+        IPage<ResponsePersonListItemVO> pagedList = personQueryService.queryByDepId(pageQueryByDepIdDTO);
         return ResultHelper.multi(pagedList);
     }
 
     @ApiOperation(value = "禁用人员")
     @PostMapping("/disable")
     public CommonResult<FmResponseUpsertVO> disablePerson(
-            @Valid @RequestBody DeletePersonDTO deletePersonDTO) {
-        personService.disablePerson(deletePersonDTO.getId());
-        return ResultHelper.single(new FmResponseUpsertVO(deletePersonDTO.getId()));
+            @Valid @RequestBody PersonIdDTO personIdDTO) {
+        personUpsertService.disablePerson(personIdDTO.getId());
+        return ResultHelper.single(new FmResponseUpsertVO(personIdDTO.getId()));
     }
 
     @ApiOperation(value = "解禁人员")
     @PostMapping("/enable")
     public CommonResult<FmResponseUpsertVO> enablePerson(
-            @Valid @RequestBody DeletePersonDTO deletePersonDTO) {
-        personService.enablePerson(deletePersonDTO.getId());
-        return ResultHelper.single(new FmResponseUpsertVO(deletePersonDTO.getId()));
+            @Valid @RequestBody PersonIdDTO personIdDTO) {
+        personUpsertService.enablePerson(personIdDTO.getId());
+        return ResultHelper.single(new FmResponseUpsertVO(personIdDTO.getId()));
     }
 
     @ApiOperation(value = "离职人员")
     @PostMapping("/dismiss")
     public CommonResult<FmResponseUpsertVO> dismissPerson(
             @Valid @RequestBody PersonStateChangeDTO personStateChangeDTO) {
-        personService.dismissPerson(personStateChangeDTO.getId());
+        personUpsertService.dismissPerson(personStateChangeDTO.getId());
         return ResultHelper.single(new FmResponseUpsertVO(personStateChangeDTO.getId()));
     }
 
@@ -166,7 +181,7 @@ public class PersonController {
     @PostMapping("/rejoin")
     public CommonResult<FmResponseUpsertVO> rejoinPerson(
             @Valid @RequestBody PersonStateChangeDTO personStateChangeDTO) {
-        personService.rejoinPerson(personStateChangeDTO.getId());
+        personUpsertService.rejoinPerson(personStateChangeDTO.getId());
         return ResultHelper.single(new FmResponseUpsertVO(personStateChangeDTO.getId()));
     }
 
@@ -174,22 +189,22 @@ public class PersonController {
     @PostMapping("/batch_update")
     public CommonResult batchUpdatePeople(
             @Valid @RequestBody BatchUpdatePersonDTO batchUpdatePersonDTO) {
-        personService.batchUpdatePeople(batchUpdatePersonDTO);
+        personUpsertService.batchUpdatePeople(batchUpdatePersonDTO);
         return ResultHelper.success("批量更新成功");
     }
 
     @ApiOperation(value = "人员项目树")
     @PostMapping("/projects/tree")
     public CommonResult<PageList<ProjectTreeItemVO>> queryPersonProjectTree(
-            @Valid @RequestBody DeletePersonDTO deletePersonDTO) {
-        List<ProjectTreeItemVO> projectTreeItemVOList = personProjectService.queryPersonProjectTree(deletePersonDTO.getId());
+            @Valid @RequestBody PersonIdDTO personIdDTO) {
+        List<ProjectTreeItemVO> projectTreeItemVOList = personProjectService.queryPersonProjectTree(personIdDTO.getId());
         return ResultHelper.multi(projectTreeItemVOList);
     }
 
     @ApiOperation(value = "获取最新工号")
     @PostMapping("/latestJobNumber")
     public CommonResult<LatestJobNumberVO> queryLatestJobNumber() {
-        LatestJobNumberVO latestJobNumberVO = personService.queryLatestJobNumber();
+        LatestJobNumberVO latestJobNumberVO = personQueryService.queryLatestJobNumber();
         return ResultHelper.single(latestJobNumberVO);
     }
 
@@ -201,30 +216,30 @@ public class PersonController {
 
         Person person = null;
         if (StringUtils.isNotBlank(checkDuplicateDTO.getPersonId())) {
-            person = personService.queryPersonProfile(checkDuplicateDTO.getPersonId());
+            person = personQueryService.queryPersonProfile(checkDuplicateDTO.getPersonId());
         }
         // 校验身份证号
-        if (personService.checkDuplicateIdNumber(checkDuplicateDTO.getIdNumber(), person)) {
+        if (personCheckService.checkDuplicateIdNumber(checkDuplicateDTO.getIdNumber(), person)) {
             duplicateVO.setDuplicate(true);
             return ResultHelper.single(duplicateVO, "身份证号重复");
         }
         // 校验账号
-        if (personService.checkDuplicateUserName(checkDuplicateDTO.getUsername(), person)) {
+        if (personCheckService.checkDuplicateUserName(checkDuplicateDTO.getUsername(), person)) {
             duplicateVO.setDuplicate(true);
             return ResultHelper.single(duplicateVO, "账号已被使用");
         }
         // 校验手机号
-        if (personService.checkDuplicatePhoneNum(checkDuplicateDTO.getPhoneNumber(), person)) {
+        if (personCheckService.checkDuplicatePhoneNum(checkDuplicateDTO.getPhoneNumber(), person)) {
             duplicateVO.setDuplicate(true);
             return ResultHelper.single(duplicateVO, "手机号已被使用");
         }
         // 校验工号
-        if (personService.checkDuplicateJobNumber(checkDuplicateDTO.getJobNumber(), person)) {
+        if (personCheckService.checkDuplicateJobNumber(checkDuplicateDTO.getJobNumber(), person)) {
             duplicateVO.setDuplicate(true);
             return ResultHelper.single(duplicateVO, "工号已被使用");
         }
         // 校验邮箱
-        if (personService.checkDuplicateMail(checkDuplicateDTO.getMail(), person)) {
+        if (personCheckService.checkDuplicateMail(checkDuplicateDTO.getMail(), person)) {
             duplicateVO.setDuplicate(true);
             return ResultHelper.single(duplicateVO, "邮箱已被使用");
         }
@@ -233,11 +248,52 @@ public class PersonController {
 
     @ApiOperation(value = "根据账号id查询人员信息")
     @PostMapping("/queryByAccountId")
-    public CommonResult<SimplePersonListItemVO> queryByAccountId(
+    public CommonResult<ResponsePersonItemVO> queryByAccountId(
             @Valid @RequestBody QueryByAccountIdDTO queryByAccountIdDTO) {
-        Person person = personService.queryByAccountId(queryByAccountIdDTO.getAccountId());
-        SimplePersonListItemVO simplePersonListItemVO = ConvertPersonTool.INSTANCE.convert2SimpleListItem(person);
-        return ResultHelper.single(simplePersonListItemVO);
+        ResponsePersonItemVO vo = personQueryService.queryDetailByAccountId(
+                queryByAccountIdDTO.getAccountId(), queryByAccountIdDTO.getDepId());
+        return ResultHelper.single(vo);
+    }
+
+    @ApiOperation(value = "根据主键列表查询人员信息")
+    @PostMapping("/queryByIds")
+    public CommonResult<PageList<ResponsePersonListItemVO>> queryByIds(
+            @Valid @RequestBody QueryByIdsDTO queryByIdsDTO) {
+        IPage<ResponsePersonListItemVO> vos = personQueryService.queryDetailByIds(queryByIdsDTO.getIds());
+        return ResultHelper.multi(vos);
+    }
+
+    @ApiOperation(value = "查询人员的账号id")
+    @PostMapping("/queryAccountId")
+    public CommonResult<AccountIdVO> queryAccountId(
+            @Valid @RequestBody PersonIdDTO personIdDTO) {
+        String accountId = personQueryService.queryAccountId(personIdDTO.getId());
+        AccountIdVO accountIdVO = new AccountIdVO();
+        accountIdVO.setAccountId(accountId);
+        return ResultHelper.single(accountIdVO);
+    }
+
+    @ApiOperation(value = "查询所有员工的姓名")
+    @PostMapping("/queryAllPersonName")
+    public CommonResult<PageList<SimpleObjVO>> queryAllPersonName() {
+        List<SimpleObjVO> personNameList = personQueryService.queryAllPersonName();
+        IPage<SimpleObjVO> result = new Page<>();
+        result.setRecords(personNameList);
+        if (CollectionUtils.isEmpty(personNameList)) {
+            result.setTotal(0);
+        } else {
+            result.setTotal(personNameList.size());
+        }
+
+        return ResultHelper.multi(result);
+    }
+
+    @ApiOperation(value = "根据岗位/角色主键查询员工信息")
+    @PostMapping("/queryByRoleIds")
+    public CommonResult<PageList<ResponsePersonListItemVO>> pageQueryByRoleIds(
+            @Valid @RequestBody PageQueryByRoleIdsDTO pageQueryByRoleIdsDTO) {
+        IPage<ResponsePersonListItemVO> pagedList = personQueryService.pageQueryByRoleIds(pageQueryByRoleIdsDTO);
+        return ResultHelper.multi(pagedList);
     }
 }
 

+ 0 - 3
fm-person/src/main/java/com/persagy/fm/person/controller/PersonEnumController.java

@@ -5,12 +5,9 @@ import com.persagy.fm.common.model.vo.EnumVO;
 import com.persagy.fm.common.response.CommonResult;
 import com.persagy.fm.common.response.PageList;
 import com.persagy.fm.common.utils.ResultHelper;
-import com.persagy.fm.department.service.IDepEnumService;
 import com.persagy.fm.person.service.IPersonEnumService;
-import com.persagy.fm.person.service.IPersonService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.assertj.core.util.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;

+ 21 - 4
fm-person/src/main/java/com/persagy/fm/person/dao/PersonMapper.java

@@ -2,10 +2,7 @@ package com.persagy.fm.person.dao;
 
 import com.persagy.fm.person.model.Person;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.persagy.fm.person.model.dto.NameQuickSearchDTO;
-import com.persagy.fm.person.model.dto.PageQueryPersonByNameOrUserNameDTO;
-import com.persagy.fm.person.model.dto.PageQueryPersonDTO;
-import com.persagy.fm.person.model.dto.QueryPersonDTO;
+import com.persagy.fm.person.model.dto.*;
 import org.apache.ibatis.annotations.Mapper;
 
 import javax.naming.Name;
@@ -30,6 +27,26 @@ public interface PersonMapper extends BaseMapper<Person> {
     List<Person> queryPersonList(PageQueryPersonDTO pageQueryPersonDTO);
 
     /**
+     * 查询部门下的人员列表
+     *
+     * @param pageQueryByDepIdsDTO 查询条件
+     * @return 人员列表
+     * @author lixing
+     * @version V1.0 2021/3/23 5:14 下午
+     */
+    List<Person> queryByDepIds(PageQueryByDepIdsDTO pageQueryByDepIdsDTO);
+
+    /**
+     * 查询人员数量
+     *
+     * @param pageQueryByDepIdsDTO 查询条件
+     * @return 人员总条数
+     * @author lixing
+     * @version V1.0 2021/3/23 5:14 下午
+     */
+    int queryCountByDepIds(PageQueryByDepIdsDTO pageQueryByDepIdsDTO);
+
+    /**
      * 查询人员数量
      *
      * @param pageQueryPersonDTO 分页查询条件

+ 9 - 6
fm-person/src/main/java/com/persagy/fm/person/jms/handler/AccountMsgHandler.java

@@ -12,7 +12,8 @@ import com.persagy.fm.person.jms.model.AccountUpdateMsg;
 import com.persagy.fm.person.model.ConvertPersonTool;
 import com.persagy.fm.person.model.Person;
 import com.persagy.fm.person.model.dto.QueryPersonDTO;
-import com.persagy.fm.person.service.IPersonService;
+import com.persagy.fm.person.service.IPersonQueryService;
+import com.persagy.fm.person.service.IPersonUpsertService;
 import com.persagy.fm.workresume.model.dto.AddWorkResumeDTO;
 import com.persagy.fm.workresume.service.IWorkResumeService;
 import com.rabbitmq.client.Channel;
@@ -36,7 +37,9 @@ import java.util.List;
 @Slf4j
 public class AccountMsgHandler {
     @Autowired
-    private IPersonService personService;
+    private IPersonUpsertService personUpsertService;
+    @Autowired
+    private IPersonQueryService personQueryService;
     @Autowired
     private IWorkResumeService workResumeService;
     @Autowired
@@ -57,7 +60,7 @@ public class AccountMsgHandler {
         synchronized (accountId.intern()) {
             // 查询集团下有没有使用消息中的账号id的用户
             QueryPersonDTO queryPersonDTO = new QueryPersonDTO();
-            Person tmpPerson = personService.queryByAccountId(accountId);
+            Person tmpPerson = personQueryService.queryByAccountId(accountId);
 
             if (tmpPerson != null) {
                 log.error("已有人员使用该账号,拒绝创建人员");
@@ -74,7 +77,7 @@ public class AccountMsgHandler {
             Department group = departments.get(0);
 
             Person person = ConvertPersonTool.INSTANCE.convert2Entity(accountCreateMsg);
-            personService.createPerson(person);
+            personUpsertService.createPerson(person);
 
             // 创建人员的工作信息
             AddWorkResumeDTO addWorkResumeDTO = new AddWorkResumeDTO();
@@ -95,7 +98,7 @@ public class AccountMsgHandler {
      */
     public void updateAccount(AccountUpdateMsg accountUpdateMsg) {
         // 根据账号id找到对应的人员信息
-        Person person = personService.queryByAccountId(accountUpdateMsg.getId());
+        Person person = personQueryService.queryByAccountId(accountUpdateMsg.getId());
         // 更新人员的账号信息
         if (person != null) {
             // 避免因为先查后更新与其他事务发生冲突
@@ -103,7 +106,7 @@ public class AccountMsgHandler {
             person = new Person();
             person.setId(id);
             person.setUsername(accountUpdateMsg.getUsername());
-            personService.updatePerson(person);
+            personUpsertService.updatePerson(person);
         }
     }
 

+ 11 - 4
fm-person/src/main/java/com/persagy/fm/person/model/ConvertPersonTool.java

@@ -2,10 +2,7 @@ package com.persagy.fm.person.model;
 
 import com.persagy.fm.common.model.vo.SimpleObjVO;
 import com.persagy.fm.person.jms.model.AccountCreateMsg;
-import com.persagy.fm.person.model.dto.AddPerson4BackEndDTO;
-import com.persagy.fm.person.model.dto.AddPerson4FrontEndDTO;
-import com.persagy.fm.person.model.dto.PageQueryPersonDTO;
-import com.persagy.fm.person.model.dto.UpdatePerson4FrontEndDTO;
+import com.persagy.fm.person.model.dto.*;
 import com.persagy.fm.person.model.vo.ResponsePersonItemVO;
 import com.persagy.fm.person.model.vo.ResponsePersonListItemVO;
 import com.persagy.fm.person.model.vo.SimplePersonListItemVO;
@@ -211,5 +208,15 @@ public interface ConvertPersonTool {
      * @version V1.0 2021/4/20 10:06 上午
      */
     AddPerson4FrontEndDTO convert2AddPerson4FrontEndDTO(AddPerson4BackEndDTO addPerson4BackEndDTO);
+
+    /**
+     * pageQueryByDepIdDTO 转换为 PageQueryByDepIdsDTO
+     *
+     * @param pageQueryByDepIdDTO 根据部门id查询入参
+     * @return 根据部门id列表查询入参
+     * @author lixing
+     * @version V1.0 2021/4/29 4:51 下午
+     */
+    PageQueryByDepIdsDTO convert2PageQueryByDepIdsDTO(PageQueryByDepIdDTO pageQueryByDepIdDTO);
 }
 

+ 1 - 1
fm-person/src/main/java/com/persagy/fm/person/model/dto/AddPerson4BackEndDTO.java

@@ -11,6 +11,6 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 @Data
 @ApiModel
-public class AddPerson4BackEndDTO extends UpsertPerson4BackEndDTO{
+public class AddPerson4BackEndDTO extends UpsertPersonDTO{
 
 }

+ 1 - 1
fm-person/src/main/java/com/persagy/fm/person/model/dto/AddPerson4FrontEndDTO.java

@@ -11,6 +11,6 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 @Data
 @ApiModel
-public class AddPerson4FrontEndDTO extends UpsertPerson4FrontEndDTO{
+public class AddPerson4FrontEndDTO extends UpsertPersonDTO{
 
 }

+ 1 - 5
fm-person/src/main/java/com/persagy/fm/person/model/dto/DeletePersonDTO.java

@@ -12,9 +12,5 @@ import javax.validation.constraints.NotNull;
  */
 @Data
 @ApiModel(value = "删除人员入参")
-public class DeletePersonDTO {
-    @NotNull(message = "id不能为空")
-    @ApiModelProperty(value = "id", required = true)
-    private String id;
-
+public class DeletePersonDTO extends PersonIdDTO{
 }

+ 30 - 0
fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryByDepIdDTO.java

@@ -0,0 +1,30 @@
+package com.persagy.fm.person.model.dto;
+
+import com.persagy.fm.common.model.dto.PageDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * @author lixing
+ * @version V1.0 2021/4/8 8:27 下午
+ **/
+@Data
+@ApiModel
+public class PageQueryByDepIdDTO extends PageDTO {
+    @ApiModelProperty(value = "部门主键", required = true)
+    @NotEmpty(message = "部门主键不能为空")
+    private String depId;
+
+    @ApiModelProperty(value = "是否包含下级部门", notes = "com.persagy.fm.common.constant.enums.BoolEnum")
+    private String containsSub;
+
+    @ApiModelProperty(value = "在职状态", notes = "com.persagy.fm.workresume.constant.enums.WorkResumeHiredStateEnum")
+    private Integer hiredState;
+
+    @ApiModelProperty(value = "禁用状态", notes = "com.persagy.fm.workresume.constant.enums.WorkResumeEnableStateEnum")
+    private Integer enableState;
+}

+ 27 - 0
fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryByDepIdsDTO.java

@@ -0,0 +1,27 @@
+package com.persagy.fm.person.model.dto;
+
+import com.persagy.fm.common.model.dto.PageDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * @author lixing
+ * @version V1.0 2021/4/8 8:27 下午
+ **/
+@Data
+@ApiModel
+public class PageQueryByDepIdsDTO extends PageDTO {
+    @ApiModelProperty(value = "部门主键", required = true)
+    @NotEmpty(message = "部门主键不能为空")
+    private List<String> depIds;
+
+    @ApiModelProperty(value = "在职状态", notes = "com.persagy.fm.workresume.constant.enums.WorkResumeHiredStateEnum")
+    private Integer hiredState;
+
+    @ApiModelProperty(value = "禁用状态", notes = "com.persagy.fm.workresume.constant.enums.WorkResumeEnableStateEnum")
+    private Integer enableState;
+}

+ 21 - 0
fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryByRoleIdsDTO.java

@@ -0,0 +1,21 @@
+package com.persagy.fm.person.model.dto;
+
+import com.persagy.fm.common.model.dto.PageDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * @author lixing
+ * @version V1.0 2021/4/8 8:27 下午
+ **/
+@Data
+@ApiModel
+public class PageQueryByRoleIdsDTO extends PageDTO {
+    @ApiModelProperty(value = "角色主键列表", required = true)
+    @NotEmpty(message = "角色主键列表不能为空")
+    private List<String> roleIds;
+}

+ 3 - 0
fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryPersonDTO.java

@@ -6,6 +6,9 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+
 /**
  * @author lixing
  * @version V1.0 2021-03-15 17:20:33

+ 19 - 0
fm-person/src/main/java/com/persagy/fm/person/model/dto/PersonIdDTO.java

@@ -0,0 +1,19 @@
+package com.persagy.fm.person.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author lixing
+ * @version V1.0 2021-03-15 17:20:33
+ */
+@Data
+@ApiModel
+public class PersonIdDTO {
+    @NotNull(message = "id不能为空")
+    @ApiModelProperty(value = "id", required = true)
+    private String id;
+}

+ 4 - 1
fm-person/src/main/java/com/persagy/fm/person/model/dto/QueryByAccountIdDTO.java

@@ -11,9 +11,12 @@ import javax.validation.constraints.NotNull;
  * @version V1.0 2021/4/8 8:27 下午
  **/
 @Data
-@ApiModel(value = "根据账号id查询账号信息入参")
+@ApiModel
 public class QueryByAccountIdDTO {
     @ApiModelProperty(value = "账号id", required = true)
     @NotNull(message = "账号id不能为空")
     private String accountId;
+
+    @ApiModelProperty(value = "部门id")
+    private String depId;
 }

+ 21 - 0
fm-person/src/main/java/com/persagy/fm/person/model/dto/QueryByIdsDTO.java

@@ -0,0 +1,21 @@
+package com.persagy.fm.person.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author lixing
+ * @version V1.0 2021/4/8 8:27 下午
+ **/
+@Data
+@ApiModel
+public class QueryByIdsDTO {
+    @ApiModelProperty(value = "主键列表", required = true)
+    @NotEmpty(message = "主键列表不能为空")
+    private List<String> ids;
+}

+ 1 - 1
fm-person/src/main/java/com/persagy/fm/person/model/dto/UpdatePerson4FrontEndDTO.java

@@ -14,7 +14,7 @@ import javax.validation.constraints.NotNull;
 @EqualsAndHashCode(callSuper = true)
 @Data
 @ApiModel(value = "更新人员入参")
-public class UpdatePerson4FrontEndDTO extends UpsertPerson4FrontEndDTO{
+public class UpdatePerson4FrontEndDTO extends UpsertPersonDTO{
     @ApiModelProperty(value = "id", required = true)
     @NotNull(message = "id不能为空") 
     private String id;

+ 0 - 21
fm-person/src/main/java/com/persagy/fm/person/model/dto/UpsertPerson4BackEndDTO.java

@@ -1,21 +0,0 @@
-package com.persagy.fm.person.model.dto;
-
-import com.persagy.fm.saas.project.model.dto.UpsertSaasProjectDTO;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * 给前端使用的创建和更新人员基类
- *
- * @author lixing
- * @version V1.0 2021/3/23 11:09 上午
- **/
-@Data
-@ApiModel
-public class UpsertPerson4BackEndDTO extends UpsertPersonDTO{
-    @ApiModelProperty(value = "项目权限")
-    private List<UpsertSaasProjectDTO> projects;
-}

+ 0 - 30
fm-person/src/main/java/com/persagy/fm/person/model/dto/UpsertPerson4FrontEndDTO.java

@@ -1,30 +0,0 @@
-package com.persagy.fm.person.model.dto;
-
-import com.persagy.fm.common.constant.RegexConstants;
-import com.persagy.fm.saas.project.model.dto.UpsertSaasProjectDTO;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import net.minidev.json.annotate.JsonIgnore;
-import org.hibernate.validator.constraints.Length;
-
-import javax.validation.constraints.Email;
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.Pattern;
-import java.util.Date;
-import java.util.List;
-
-/**
- * 给前端使用的创建和更新人员基类
- *
- * @author lixing
- * @version V1.0 2021/3/23 11:09 上午
- **/
-@EqualsAndHashCode(callSuper = true)
-@Data
-@ApiModel
-public class UpsertPerson4FrontEndDTO extends UpsertPersonDTO{
-    @ApiModelProperty(value = "项目权限")
-    private List<UpsertSaasProjectDTO> projects;
-}

+ 4 - 0
fm-person/src/main/java/com/persagy/fm/person/model/dto/UpsertPersonDTO.java

@@ -1,6 +1,7 @@
 package com.persagy.fm.person.model.dto;
 
 import com.persagy.fm.common.constant.RegexConstants;
+import com.persagy.fm.saas.project.model.dto.UpsertSaasProjectDTO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -104,4 +105,7 @@ public class UpsertPersonDTO {
     @JsonIgnore
     @ApiModelProperty(hidden = true)
     private String accountId;
+
+    @ApiModelProperty(value = "项目权限")
+    private List<UpsertSaasProjectDTO> projects;
 }

+ 16 - 0
fm-person/src/main/java/com/persagy/fm/person/model/vo/AccountIdVO.java

@@ -0,0 +1,16 @@
+package com.persagy.fm.person.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author lixing
+ * @version V1.0 2021/4/29 11:47 上午
+ **/
+@ApiModel
+@Data
+public class AccountIdVO {
+    @ApiModelProperty("账号id")
+    private String accountId;
+}

+ 138 - 0
fm-person/src/main/java/com/persagy/fm/person/service/IPersonCheckService.java

@@ -0,0 +1,138 @@
+package com.persagy.fm.person.service;
+
+import com.persagy.fm.person.model.Person;
+
+import java.util.List;
+
+/**
+ * 人员(Person) 校验接口
+ *
+ * @author lixing
+ * @version V1.0 2021-03-15 17:20:31
+ */
+public interface IPersonCheckService {
+    /**
+     * 校验直接上级
+     *
+     * @param leaderId 直接上级id
+     * @param person   人员对象
+     * @author lixing
+     * @version V1.0 2021/4/22 11:43 上午
+     */
+    void checkLeader(String leaderId, Person person);
+
+    /**
+     * 批量更新时,验证人员的主副岗是否重复
+     *
+     * @param mainDuty    更新条件中的主岗,为空代表不更新
+     * @param otherDuties 更新条件中的副岗,为空代表不更新
+     * @param personId    人员id
+     * @author lixing
+     * @version V1.0 2021/4/21 7:44 下午
+     */
+    void checkMainAndOtherDutiesWhenBatchUpdate(String mainDuty, List<String> otherDuties, String personId);
+    /**
+     * 校验重复的手机号
+     *
+     * @param phoneNumber 手机号
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/7 11:39 上午
+     */
+    Boolean checkDuplicatePhoneNum(String phoneNumber);
+
+    /**
+     * 校验重复的手机号,如果没变动不校验
+     *
+     * @param phoneNumber 手机号
+     * @param person      当前人员
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/7 11:39 上午
+     */
+    Boolean checkDuplicatePhoneNum(String phoneNumber, Person person);
+
+    /**
+     * 校验重复的身份证号
+     *
+     * @param idNumber 身份证号
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/7 11:40 上午
+     */
+    Boolean checkDuplicateIdNumber(String idNumber);
+
+    /**
+     * 校验重复的身份证号,如果没变动不校验
+     *
+     * @param idNumber 身份证号
+     * @param person   当前人员
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/7 11:40 上午
+     */
+    Boolean checkDuplicateIdNumber(String idNumber, Person person);
+
+    /**
+     * 校验重复的登录名
+     *
+     * @param username 登录名
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/7 11:41 上午
+     */
+    Boolean checkDuplicateUserName(String username);
+
+    /**
+     * 校验重复的登录名,如果没变动不校验
+     *
+     * @param username 登录名
+     * @param person   当前人员
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/7 11:40 上午
+     */
+    Boolean checkDuplicateUserName(String username, Person person);
+
+    /**
+     * 校验重复的工号
+     *
+     * @param jobNumber 工号
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/7 11:41 上午
+     */
+    Boolean checkDuplicateJobNumber(String jobNumber);
+
+    /**
+     * 校验重复的工号,如果没变动不校验
+     *
+     * @param jobNumber 工号
+     * @param person    当前人员
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/7 11:40 上午
+     */
+    Boolean checkDuplicateJobNumber(String jobNumber, Person person);
+
+    /**
+     * 校验重复的邮箱
+     *
+     * @param mail 邮箱
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/7 11:41 上午
+     */
+    Boolean checkDuplicateMail(String mail);
+
+    /**
+     * 校验重复的邮箱,如果没变动不校验
+     *
+     * @param mail   邮箱
+     * @param person 当前人员
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/7 11:40 上午
+     */
+    Boolean checkDuplicateMail(String mail, Person person);
+}

+ 255 - 0
fm-person/src/main/java/com/persagy/fm/person/service/IPersonQueryService.java

@@ -0,0 +1,255 @@
+package com.persagy.fm.person.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.persagy.fm.common.model.vo.SimpleObjVO;
+import com.persagy.fm.person.model.Person;
+import com.persagy.fm.person.model.dto.*;
+import com.persagy.fm.person.model.vo.LatestJobNumberVO;
+import com.persagy.fm.person.model.vo.ResponsePersonItemVO;
+import com.persagy.fm.person.model.vo.ResponsePersonListItemVO;
+
+import java.util.List;
+
+/**
+ * 人员(Person) 查询接口
+ *
+ * @author lixing
+ * @version V1.0 2021-03-15 17:20:31
+ */
+public interface IPersonQueryService {
+    /**
+     * 获取最新的工号
+     *
+     * @return 工号vo类
+     * @author lixing
+     * @version V1.0 2021/4/7 10:42 上午
+     */
+    LatestJobNumberVO queryLatestJobNumber();
+
+    /**
+     * 人员基本属性详情
+     *
+     * @param id 主键
+     * @return 人员do对象
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    Person queryPersonProfile(String id);
+
+    /**
+     * 人员详情
+     *
+     * @param id 主键
+     * @return 人员do对象
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    ResponsePersonItemVO queryPersonDetail(String id);
+
+    /**
+     * 根据直接领导id,获取直接领导信息
+     *
+     * @param leaderId 直接领导id
+     * @return 直接领导信息
+     * @author lixing
+     * @version V1.0 2021/4/1 2:53 下午
+     */
+    SimpleObjVO getLeaderVO(String leaderId);
+
+    /**
+     * 人员详情
+     *
+     * @param id 人员主键
+     * @param depId 部门主键
+     * @return 人员do对象
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    ResponsePersonItemVO queryPersonDetail(String id, String depId);
+
+    /**
+     * 通过主键数组查询人员
+     *
+     * @param ids 主键List
+     * @return 人员列表
+     */
+    List<Person> queryByIds(List<String> ids);
+
+    /**
+     * 通过主键数组查询人员
+     *
+     * @param ids 主键List
+     * @return 人员详情分页列表
+     */
+    IPage<ResponsePersonListItemVO> queryDetailByIds(List<String> ids);
+
+    /**
+     * 根据身份证号查询人员
+     *
+     * @param idCard 身份证号
+     * @return 人员列表
+     * @author lixing
+     * @version V1.0 2021/4/1 3:00 下午
+     */
+    List<Person> queryByIdCard(String idCard);
+
+    /**
+     * 根据账号查询人员
+     *
+     * @param username 账号
+     * @return 人员列表
+     * @author lixing
+     * @version V1.0 2021/4/1 3:00 下午
+     */
+    List<Person> queryByUsername(String username);
+
+    /**
+     * 根据工号查询人员
+     *
+     * @param jobNumber 工号
+     * @return 人员列表
+     * @author lixing
+     * @version V1.0 2021/4/1 3:00 下午
+     */
+    List<Person> queryByJobNumber(String jobNumber);
+
+    /**
+     * 分页查询人员
+     *
+     * @param pageQueryPersonDTO pageQueryDTO
+     * @return IPage<Person>
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    IPage<ResponsePersonListItemVO> pageQueryPerson(PageQueryPersonDTO pageQueryPersonDTO);
+
+    /**
+     * 根据账号id,查询人员信息
+     *
+     * @param accountId 账号id
+     * @return 人员
+     * @author lixing
+     * @version V1.0 2021/3/30 5:00 下午
+     */
+    Person queryByAccountId(String accountId);
+
+    /**
+     * 根据账号id,查询人员信息
+     *
+     * @param accountId 账号id
+     * @param depId 部门id
+     * @return 人员详情
+     * @author lixing
+     * @version V1.0 2021/3/30 5:00 下午
+     */
+    ResponsePersonItemVO queryDetailByAccountId(String accountId, String depId);
+
+    /**
+     * 快速查询人名
+     *
+     * @param nameQuickSearchDTO 快速查询人名入参
+     * @return 匹配到的人名列表
+     * @author lixing
+     * @version V1.0 2021/3/22 7:57 下午
+     */
+    List<Person> nameQuickSearch(NameQuickSearchDTO nameQuickSearchDTO);
+
+    /**
+     * 根据专业id查询人员
+     *
+     * @param professionId 专业id
+     * @return 人员列表
+     * @author lixing
+     * @version V1.0 2021/4/11 9:50 下午
+     */
+    List<Person> queryByProfessionId(String professionId);
+
+    /**
+     * 根据直接上级id查询人员
+     *
+     * @param leaderId 直接上级id
+     * @return 人员列表
+     * @author lixing
+     * @version V1.0 2021/4/11 9:50 下午
+     */
+    List<Person> queryByLeader(Long leaderId);
+
+    /**
+     * 根据名称或账号查询
+     *
+     * @param pageQueryPersonDTO 查询参数
+     * @return 分页列表
+     * @author lixing
+     * @version V1.0 2021/4/14 4:32 下午
+     */
+    IPage<ResponsePersonListItemVO> pageQueryByNameOrUserName(PageQueryPersonByNameOrUserNameDTO pageQueryPersonDTO);
+
+    /**
+     * 根据账号查询
+     *
+     * @param queryByUserNameDTO 查询参数
+     * @return 分页列表
+     * @author lixing
+     * @version V1.0 2021/4/22 3:28 下午
+     */
+    IPage<ResponsePersonListItemVO> queryByUserName(QueryByUserNameDTO queryByUserNameDTO);
+
+    /**
+     * 根据姓名查询
+     *
+     * @param queryByNameDTO 查询参数
+     * @return 分页列表
+     * @author lixing
+     * @version V1.0 2021/4/25 3:04 下午
+     */
+    IPage<ResponsePersonListItemVO> queryByName(QueryByNameDTO queryByNameDTO);
+
+    /**
+     * 查询人员的账号id
+     *
+     * @param id 人员id
+     * @return 人员的账号id
+     * @author lixing
+     * @version V1.0 2021/4/29 11:53 上午
+     */
+    String queryAccountId(String id);
+
+    /**
+     * 根据部门id查询人员
+     *
+     * @param pageQueryByDepIdDTO 查询入参
+     * @return 人员分页列表
+     * @author lixing
+     * @version V1.0 2021/4/29 3:27 下午
+     */
+    IPage<ResponsePersonListItemVO> queryByDepId(PageQueryByDepIdDTO pageQueryByDepIdDTO);
+
+    /**
+     * 查询所有人员的姓名列表
+     *
+     * @return 人员姓名列表 id -> 名字
+     * @author lixing
+     * @version V1.0 2021/4/29 5:22 下午
+     */
+    List<SimpleObjVO> queryAllPersonName();
+
+    /**
+     * 根据角色id分页查询
+     *
+     * @param pageQueryByRoleIdsDTO 查询参数
+     * @return 人员分页列表
+     * @author lixing
+     * @version V1.0 2021/4/30 10:27 上午
+     */
+    IPage<ResponsePersonListItemVO> pageQueryByRoleIds(PageQueryByRoleIdsDTO pageQueryByRoleIdsDTO);
+
+    /**
+     * 根据账号id列表分页查询
+     *
+     * @param accountIds 查询参数
+     * @return 人员分页列表
+     * @author lixing
+     * @version V1.0 2021/4/30 10:27 上午
+     */
+    IPage<ResponsePersonListItemVO> pageQueryByAccountIds(List<String> accountIds);
+}

+ 0 - 353
fm-person/src/main/java/com/persagy/fm/person/service/IPersonService.java

@@ -1,353 +0,0 @@
-package com.persagy.fm.person.service;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.persagy.fm.person.model.Person;
-import com.persagy.fm.person.model.dto.*;
-import com.persagy.fm.person.model.vo.LatestJobNumberVO;
-import com.persagy.fm.person.model.vo.ResponsePersonItemVO;
-import com.persagy.fm.person.model.vo.ResponsePersonListItemVO;
-
-import java.util.List;
-
-/**
- * 人员(Person) service接口
- *
- * @author lixing
- * @version V1.0 2021-03-15 17:20:31
- */
-public interface IPersonService {
-
-    /**
-     * 创建人员
-     *
-     * @param addPerson4FrontEndDTO addDTO
-     * @return 人员主键
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
-    String createPerson(AddPerson4FrontEndDTO addPerson4FrontEndDTO);
-
-    /**
-     * 创建人员
-     *
-     * @param person 人员对象
-     * @return 人员主键
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
-    String createPerson(Person person);
-
-    /**
-     * 人员基本属性详情
-     *
-     * @param id 主键
-     * @return 人员do对象
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
-    Person queryPersonProfile(String id);
-
-    /**
-     * 人员详情
-     *
-     * @param id 主键
-     * @return 人员do对象
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
-    ResponsePersonItemVO queryPersonDetail(String id);
-
-    /**
-     * 人员详情
-     *
-     * @param id 人员主键
-     * @param depId 部门主键
-     * @return 人员do对象
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
-    ResponsePersonItemVO queryPersonDetail(String id, String depId);
-
-    /**
-     * 通过主键数组查询人员
-     *
-     * @param ids 主键List
-     * @return
-     */
-    List<Person> queryByIds(List<String> ids);
-
-    /**
-     * 更新人员
-     *
-     * @param updatePerson4FrontEndDTO updateDTO
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
-    void updatePerson(UpdatePerson4FrontEndDTO updatePerson4FrontEndDTO);
-
-    /**
-     * 更新人员
-     *
-     * @param person 人员对象
-     * @author lixing
-     * @version V1.0 2021/3/30 5:05 下午
-     */
-    void updatePerson(Person person);
-
-    /**
-     * 删除人员
-     *
-     * @param id 主键
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
-    void deletePerson(String id);
-
-    /**
-     * 分页查询人员
-     *
-     * @param pageQueryPersonDTO pageQueryDTO
-     * @return IPage<Person>
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
-    IPage<ResponsePersonListItemVO> pageQueryPerson(PageQueryPersonDTO pageQueryPersonDTO);
-
-    /**
-     * 根据账号id,查询人员信息
-     *
-     * @param accountId 账号id
-     * @return 人员
-     * @author lixing
-     * @version V1.0 2021/3/30 5:00 下午
-     */
-    Person queryByAccountId(String accountId);
-
-    //    /**
-    //     * 重置人员账号的密码
-    //     *
-    //     * @param personId 人员id
-    //     * @author lixing
-    //     * @version V1.0 2021/3/22 10:28 上午
-    //     */
-    //    void resetPassWord(Long personId);
-
-    /**
-     * 禁用人员
-     *
-     * @param personId 人员id
-     * @author lixing
-     * @version V1.0 2021/3/22 10:39 上午
-     */
-    void disablePerson(String personId);
-
-    /**
-     * 解雇人员
-     *
-     * @param personId 人员id
-     * @author lixing
-     * @version V1.0 2021/3/22 10:39 上午
-     */
-    void dismissPerson(String personId);
-
-    /**
-     * 恢复入职
-     *
-     * @param personId 人员id
-     * @author lixing
-     * @version V1.0 2021/3/22 10:44 上午
-     */
-    void rejoinPerson(String personId);
-
-    /**
-     * 批量更新人员信息
-     *
-     * @param batchUpdatePersonDTO 批量更新参数
-     * @author lixing
-     * @version V1.0 2021/3/22 11:06 上午
-     */
-    void batchUpdatePeople(BatchUpdatePersonDTO batchUpdatePersonDTO);
-
-    /**
-     * 快速查询人名
-     *
-     * @param nameQuickSearchDTO 快速查询人名入参
-     * @return 匹配到的人名列表
-     * @author lixing
-     * @version V1.0 2021/3/22 7:57 下午
-     */
-    List<Person> nameQuickSearch(NameQuickSearchDTO nameQuickSearchDTO);
-
-    /**
-     * 解禁人员
-     *
-     * @param personId 人员id
-     * @author lixing
-     * @version V1.0 2021/3/22 10:39 上午
-     */
-    void enablePerson(String personId);
-
-    /**
-     * 获取最新的工号
-     *
-     * @return 工号vo类
-     * @author lixing
-     * @version V1.0 2021/4/7 10:42 上午
-     */
-    LatestJobNumberVO queryLatestJobNumber();
-
-    /**
-     * 校验重复的手机号
-     *
-     * @param phoneNumber 手机号
-     * @return 是否重复
-     * @author lixing
-     * @version V1.0 2021/4/7 11:39 上午
-     */
-    Boolean checkDuplicatePhoneNum(String phoneNumber);
-
-    /**
-     * 校验重复的手机号,如果没变动不校验
-     *
-     * @param phoneNumber 手机号
-     * @param person 当前人员
-     * @return 是否重复
-     * @author lixing
-     * @version V1.0 2021/4/7 11:39 上午
-     */
-    Boolean checkDuplicatePhoneNum(String phoneNumber, Person person);
-
-    /**
-     * 校验重复的身份证号
-     *
-     * @param idNumber 身份证号
-     * @return 是否重复
-     * @author lixing
-     * @version V1.0 2021/4/7 11:40 上午
-     */
-    Boolean checkDuplicateIdNumber(String idNumber);
-
-    /**
-     * 校验重复的身份证号,如果没变动不校验
-     *
-     * @param idNumber 身份证号
-     * @param person 当前人员
-     * @return 是否重复
-     * @author lixing
-     * @version V1.0 2021/4/7 11:40 上午
-     */
-    Boolean checkDuplicateIdNumber(String idNumber, Person person);
-
-    /**
-     * 校验重复的登录名
-     *
-     * @param username 登录名
-     * @return 是否重复
-     * @author lixing
-     * @version V1.0 2021/4/7 11:41 上午
-     */
-    Boolean checkDuplicateUserName(String username);
-
-    /**
-     * 校验重复的登录名,如果没变动不校验
-     *
-     * @param username 登录名
-     * @param person 当前人员
-     * @return 是否重复
-     * @author lixing
-     * @version V1.0 2021/4/7 11:40 上午
-     */
-    Boolean checkDuplicateUserName(String username, Person person);
-
-    /**
-     * 校验重复的工号
-     *
-     * @param jobNumber 工号
-     * @return 是否重复
-     * @author lixing
-     * @version V1.0 2021/4/7 11:41 上午
-     */
-    Boolean checkDuplicateJobNumber(String jobNumber);
-
-    /**
-     * 校验重复的工号,如果没变动不校验
-     *
-     * @param jobNumber 工号
-     * @param person 当前人员
-     * @return 是否重复
-     * @author lixing
-     * @version V1.0 2021/4/7 11:40 上午
-     */
-    Boolean checkDuplicateJobNumber(String jobNumber, Person person);
-
-    /**
-     * 校验重复的邮箱
-     *
-     * @param mail 邮箱
-     * @return 是否重复
-     * @author lixing
-     * @version V1.0 2021/4/7 11:41 上午
-     */
-    Boolean checkDuplicateMail(String mail);
-
-    /**
-     * 校验重复的邮箱,如果没变动不校验
-     *
-     * @param mail 邮箱
-     * @param person 当前人员
-     * @return 是否重复
-     * @author lixing
-     * @version V1.0 2021/4/7 11:40 上午
-     */
-    Boolean checkDuplicateMail(String mail, Person person);
-
-    /**
-     * 根据专业id查询人员
-     *
-     * @param professionId 专业id
-     * @return 人员列表
-     * @author lixing
-     * @version V1.0 2021/4/11 9:50 下午
-     */
-    List<Person> queryByProfessionId(String professionId);
-
-    /**
-     * 根据直接上级id查询人员
-     *
-     * @param leaderId 直接上级id
-     * @return 人员列表
-     * @author lixing
-     * @version V1.0 2021/4/11 9:50 下午
-     */
-    List<Person> queryByLeader(Long leaderId);
-
-    /**
-     * 根据名称或账号查询
-     *
-     * @param pageQueryPersonDTO 查询参数
-     * @return 分页列表
-     * @author lixing
-     * @version V1.0 2021/4/14 4:32 下午
-     */
-    IPage<ResponsePersonListItemVO> pageQueryByNameOrUserName(PageQueryPersonByNameOrUserNameDTO pageQueryPersonDTO);
-
-    /**
-     * 根据账号查询
-     *
-     * @param queryByUserNameDTO 查询参数
-     * @return 分页列表
-     * @author lixing
-     * @version V1.0 2021/4/22 3:28 下午
-     */
-    IPage<ResponsePersonListItemVO> queryByUserName(QueryByUserNameDTO queryByUserNameDTO);
-
-    /**
-     * 根据姓名查询
-     *
-     * @param queryByNameDTO 查询参数
-     * @return 分页列表
-     * @author lixing
-     * @version V1.0 2021/4/25 3:04 下午
-     */
-    IPage<ResponsePersonListItemVO> queryByName(QueryByNameDTO queryByNameDTO);
-}

+ 112 - 0
fm-person/src/main/java/com/persagy/fm/person/service/IPersonUpsertService.java

@@ -0,0 +1,112 @@
+package com.persagy.fm.person.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.persagy.fm.common.model.vo.SimpleObjVO;
+import com.persagy.fm.person.model.Person;
+import com.persagy.fm.person.model.dto.*;
+import com.persagy.fm.person.model.vo.LatestJobNumberVO;
+import com.persagy.fm.person.model.vo.ResponsePersonItemVO;
+import com.persagy.fm.person.model.vo.ResponsePersonListItemVO;
+
+import java.util.List;
+
+/**
+ * 人员(Person) 创建更新接口
+ *
+ * @author lixing
+ * @version V1.0 2021-03-15 17:20:31
+ */
+public interface IPersonUpsertService {
+
+    /**
+     * 创建人员
+     *
+     * @param addPerson4FrontEndDTO addDTO
+     * @return 人员主键
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    String createPerson(AddPerson4FrontEndDTO addPerson4FrontEndDTO);
+
+    /**
+     * 创建人员
+     *
+     * @param person 人员对象
+     * @return 人员主键
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    String createPerson(Person person);
+
+    /**
+     * 更新人员
+     *
+     * @param updatePerson4FrontEndDTO updateDTO
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    void updatePerson(UpdatePerson4FrontEndDTO updatePerson4FrontEndDTO);
+
+    /**
+     * 更新人员
+     *
+     * @param person 人员对象
+     * @author lixing
+     * @version V1.0 2021/3/30 5:05 下午
+     */
+    void updatePerson(Person person);
+
+    /**
+     * 删除人员
+     *
+     * @param id 主键
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    void deletePerson(String id);
+
+    /**
+     * 禁用人员
+     *
+     * @param personId 人员id
+     * @author lixing
+     * @version V1.0 2021/3/22 10:39 上午
+     */
+    void disablePerson(String personId);
+
+    /**
+     * 解雇人员
+     *
+     * @param personId 人员id
+     * @author lixing
+     * @version V1.0 2021/3/22 10:39 上午
+     */
+    void dismissPerson(String personId);
+
+    /**
+     * 恢复入职
+     *
+     * @param personId 人员id
+     * @author lixing
+     * @version V1.0 2021/3/22 10:44 上午
+     */
+    void rejoinPerson(String personId);
+
+    /**
+     * 批量更新人员信息
+     *
+     * @param batchUpdatePersonDTO 批量更新参数
+     * @author lixing
+     * @version V1.0 2021/3/22 11:06 上午
+     */
+    void batchUpdatePeople(BatchUpdatePersonDTO batchUpdatePersonDTO);
+
+    /**
+     * 解禁人员
+     *
+     * @param personId 人员id
+     * @author lixing
+     * @version V1.0 2021/3/22 10:39 上午
+     */
+    void enablePerson(String personId);
+}

+ 345 - 0
fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonCheckServiceImpl.java

@@ -0,0 +1,345 @@
+package com.persagy.fm.person.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.persagy.fm.common.model.vo.SimpleObjVO;
+import com.persagy.fm.person.dao.PersonMapper;
+import com.persagy.fm.person.model.Person;
+import com.persagy.fm.person.model.dto.AddPerson4FrontEndDTO;
+import com.persagy.fm.person.model.dto.UpdatePerson4FrontEndDTO;
+import com.persagy.fm.person.service.IPersonCheckService;
+import com.persagy.fm.person.service.IPersonQueryService;
+import com.persagy.fm.saas.account.model.dto.PageQuerySaasAccountDTO;
+import com.persagy.fm.saas.account.model.vo.SaasAccountListItemVO;
+import com.persagy.fm.saas.account.service.ISaasAccountService;
+import com.persagy.fm.saas.accountrole.model.vo.AccountRoleVO;
+import com.persagy.fm.saas.accountrole.service.ISaasAccountRoleService;
+import org.apache.commons.lang3.StringUtils;
+import org.assertj.core.util.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 人员校验工具类
+ *
+ * @author lixing
+ * @version V1.0 2021/4/29 5:27 下午
+ */
+@Component
+public class PersonCheckServiceImpl extends ServiceImpl<PersonMapper, Person>
+        implements IPersonCheckService {
+    @Autowired
+    private ISaasAccountService saasAccountService;
+    @Autowired
+    private ISaasAccountRoleService saasAccountRoleService;
+    @Autowired
+    private IPersonQueryService personQueryService;
+
+    @Override
+    public void checkLeader(String leaderId, Person person) {
+        if (StringUtils.isBlank(leaderId)) {
+            return;
+        }
+        String personId = person.getId();
+        if (personId.equals(leaderId)) {
+            throw new IllegalArgumentException("不能选择自己作为直接上级");
+        }
+        // 不能选择直接上级是自己的员工作为上级
+        List<Person> people = personQueryService.queryByLeader(Long.valueOf(personId));
+        people.forEach(tmpPerson -> {
+            String tmpPersonId = tmpPerson.getId();
+            if (tmpPersonId.equals(leaderId)) {
+                throw new IllegalArgumentException("不能选择自己的下级作为直接上级");
+            }
+        });
+    }
+
+    @Override
+    public void checkMainAndOtherDutiesWhenBatchUpdate(String mainDuty, List<String> otherDuties, String personId) {
+        Person person = getById(personId);
+        String accountId = person.getAccountId();
+        // 设置人员岗位角色信息
+        Map<String, AccountRoleVO> accountRoleVoMap = saasAccountRoleService.
+                queryAccountRoleVoMapByAccountIdList(Lists.newArrayList(accountId));
+        if (accountRoleVoMap != null) {
+            AccountRoleVO accountRoleVO = accountRoleVoMap.get(accountId);
+            String personMainDuty = mainDuty;
+            if (mainDuty == null) {
+                SimpleObjVO mainDutyVO = accountRoleVO.getMainDuty();
+                personMainDuty = mainDutyVO == null ? null : mainDutyVO.getId();
+            }
+            List<String> personOtherDuties = otherDuties;
+            if (otherDuties == null) {
+                List<SimpleObjVO> otherDutiesVO = accountRoleVO.getOtherDuties();
+                if (otherDutiesVO != null) {
+                    personOtherDuties = otherDutiesVO.stream().
+                            map(SimpleObjVO::getId).collect(Collectors.toList());
+                }
+            }
+            if (!CollectionUtils.isEmpty(personOtherDuties)
+                    && StringUtils.isNotBlank(personMainDuty)
+                    && personOtherDuties.contains(personMainDuty)) {
+                throw new IllegalArgumentException("人员主岗与副岗不能出现重合");
+            }
+        }
+    }
+
+    /**
+     * 检查账号有没有被使用
+     *
+     * @param username 账号
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/3/23 3:15 下午
+     */
+    @Override
+    public Boolean checkDuplicateUserName(String username) {
+        if (StringUtils.isBlank(username)) {
+            return false;
+        }
+        List<Person> people = personQueryService.queryByUsername(username);
+        if (!CollectionUtils.isEmpty(people)) {
+            return true;
+        }
+
+        PageQuerySaasAccountDTO pageQuerySaasAccountDTO = new PageQuerySaasAccountDTO();
+        pageQuerySaasAccountDTO.setUsername(username);
+        List<SaasAccountListItemVO> accountListItemVoList = saasAccountService.querySaasAccountList(pageQuerySaasAccountDTO);
+        return !CollectionUtils.isEmpty(accountListItemVoList);
+    }
+
+    @Override
+    public Boolean checkDuplicateMail(String mail) {
+        if (StringUtils.isBlank(mail)) {
+            return false;
+        }
+        PageQuerySaasAccountDTO pageQuerySaasAccountDTO = new PageQuerySaasAccountDTO();
+        pageQuerySaasAccountDTO.setMail(mail);
+        List<SaasAccountListItemVO> accountListItemVoList = saasAccountService.querySaasAccountList(pageQuerySaasAccountDTO);
+        return !CollectionUtils.isEmpty(accountListItemVoList);
+    }
+
+    /**
+     * 检查手机号有没有被使用
+     *
+     * @param phoneNum 手机号
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/3/23 3:15 下午
+     */
+    @Override
+    public Boolean checkDuplicatePhoneNum(String phoneNum) {
+        if (StringUtils.isBlank(phoneNum)) {
+            return false;
+        }
+        PageQuerySaasAccountDTO pageQuerySaasAccountDTO = new PageQuerySaasAccountDTO();
+        pageQuerySaasAccountDTO.setPhoneNum(phoneNum);
+        List<SaasAccountListItemVO> accountListItemVoList = saasAccountService.querySaasAccountList(pageQuerySaasAccountDTO);
+        return !CollectionUtils.isEmpty(accountListItemVoList);
+    }
+
+
+    /**
+     * 校验身份证号重复
+     *
+     * @param idNumber 身份证号
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/1 3:03 下午
+     */
+    @Override
+    public Boolean checkDuplicateIdNumber(String idNumber) {
+        if (StringUtils.isBlank(idNumber)) {
+            return false;
+        }
+        List<Person> people = personQueryService.queryByIdCard(idNumber);
+        return !CollectionUtils.isEmpty(people);
+    }
+
+    /**
+     * 校验工号重复
+     *
+     * @param jobNumber 工号
+     * @return 是否重复
+     * @author lixing
+     * @version V1.0 2021/4/1 3:03 下午
+     */
+    @Override
+    public Boolean checkDuplicateJobNumber(String jobNumber) {
+        if (StringUtils.isBlank(jobNumber)) {
+            return false;
+        }
+        List<Person> people = personQueryService.queryByJobNumber(jobNumber);
+        return !CollectionUtils.isEmpty(people);
+    }
+
+    /**
+     * 校验人员是否可删除
+     *
+     * @param id 人员主键
+     * @return 人员do类
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    public Person checkDeletable(String id) {
+        if (id == null) {
+            throw new IllegalArgumentException("删除Person时发生异常,主键为空");
+        }
+
+        Person person = getById(id);
+
+        if (person == null) {
+            throw new IllegalArgumentException("删除Person时发生异常,找不到要删除的数据,id:" + id);
+        }
+
+        return person;
+    }
+
+    /**
+     * 校验重复项
+     *
+     * @param addPerson4FrontEndDTO 创建人员入参
+     * @author lixing
+     * @version V1.0 2021/3/22 9:53 上午
+     */
+    public void checkAddPersonDTO(AddPerson4FrontEndDTO addPerson4FrontEndDTO) {
+        // 校验身份证号
+        if (checkDuplicateIdNumber(addPerson4FrontEndDTO.getIdNumber())) {
+            throw new IllegalArgumentException("身份证号重复");
+        }
+        // 校验账号
+        if (checkDuplicateUserName(addPerson4FrontEndDTO.getUsername())) {
+            throw new IllegalArgumentException("账号已被使用");
+        }
+        // 校验手机号
+        if (checkDuplicatePhoneNum(addPerson4FrontEndDTO.getPhoneNum())) {
+            throw new IllegalArgumentException("手机号已被使用");
+        }
+        // 校验工号
+        if (checkDuplicateJobNumber(addPerson4FrontEndDTO.getJobNumber())) {
+            throw new IllegalArgumentException("工号已被使用");
+        }
+        // 校验邮箱
+        if (checkDuplicateMail(addPerson4FrontEndDTO.getMail())) {
+            throw new IllegalArgumentException("邮箱已被使用");
+        }
+    }
+
+    /**
+     * 校验重复项
+     *
+     * @param updatePerson4FrontEndDTO 更新人员入参
+     * @author lixing
+     * @version V1.0 2021/3/22 9:53 上午
+     */
+    public void checkUpdatePersonDTO(UpdatePerson4FrontEndDTO updatePerson4FrontEndDTO) {
+        String personId = updatePerson4FrontEndDTO.getId();
+        Person person = getById(personId);
+        // 校验身份证号
+        if (checkDuplicateIdNumber(updatePerson4FrontEndDTO.getIdNumber(), person)) {
+            throw new IllegalArgumentException("身份证号重复");
+        }
+        // 校验账号
+        if (checkDuplicateUserName(updatePerson4FrontEndDTO.getUsername(), person)) {
+            throw new IllegalArgumentException("账号已被使用");
+        }
+        // 校验手机号
+        if (checkDuplicatePhoneNum(updatePerson4FrontEndDTO.getPhoneNum(), person)) {
+            throw new IllegalArgumentException("手机号已被使用");
+        }
+        // 校验工号
+        if (checkDuplicateJobNumber(updatePerson4FrontEndDTO.getJobNumber(), person)) {
+            throw new IllegalArgumentException("工号已被使用");
+        }
+        // 校验邮箱
+        if (checkDuplicateMail(updatePerson4FrontEndDTO.getMail(), person)) {
+            throw new IllegalArgumentException("邮箱已被使用");
+        }
+    }
+
+    @Override
+    public Boolean checkDuplicatePhoneNum(String phoneNumber, Person person) {
+        if (StringUtils.isBlank(phoneNumber)) {
+            return false;
+        }
+        if (person == null) {
+            return checkDuplicatePhoneNum(phoneNumber);
+        }
+        SaasAccountListItemVO saasAccountListItemVO = saasAccountService.querySaasAccountDetail(person.getAccountId());
+        String accountPhoneNumber = saasAccountListItemVO.getPhoneNum();
+        if (phoneNumber.equals(accountPhoneNumber)) {
+            return false;
+        } else {
+            return checkDuplicatePhoneNum(phoneNumber);
+        }
+    }
+
+    @Override
+    public Boolean checkDuplicateIdNumber(String idNumber, Person person) {
+        if (StringUtils.isBlank(idNumber)) {
+            return false;
+        }
+        if (person == null) {
+            return checkDuplicateIdNumber(idNumber);
+        }
+        String personIdNumber = person.getIdNumber();
+        if (idNumber.equals(personIdNumber)) {
+            return false;
+        } else {
+            return checkDuplicateIdNumber(idNumber);
+        }
+    }
+
+    @Override
+    public Boolean checkDuplicateUserName(String username, Person person) {
+        if (StringUtils.isBlank(username)) {
+            return false;
+        }
+        if (person == null) {
+            return checkDuplicateUserName(username);
+        }
+        String personUsername = person.getUsername();
+        if (username.equals(personUsername)) {
+            return false;
+        } else {
+            return checkDuplicateUserName(username);
+        }
+    }
+
+    @Override
+    public Boolean checkDuplicateJobNumber(String jobNumber, Person person) {
+        if (StringUtils.isBlank(jobNumber)) {
+            return false;
+        }
+        if (person == null) {
+            return checkDuplicateJobNumber(jobNumber);
+        }
+        String personJobNumber = person.getJobNumber();
+        if (jobNumber.equals(personJobNumber)) {
+            return false;
+        } else {
+            return checkDuplicateJobNumber(jobNumber);
+        }
+    }
+
+    @Override
+    public Boolean checkDuplicateMail(String mail, Person person) {
+        if (StringUtils.isBlank(mail)) {
+            return false;
+        }
+        if (person == null) {
+            return checkDuplicateMail(mail);
+        }
+        SaasAccountListItemVO saasAccountListItemVO = saasAccountService.querySaasAccountDetail(person.getAccountId());
+        String accountMail = saasAccountListItemVO.getMail();
+        if (mail.equals(accountMail)) {
+            return false;
+        } else {
+            return checkDuplicateMail(mail);
+        }
+    }
+}

+ 4 - 4
fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonNameTranslator.java

@@ -2,7 +2,7 @@ package com.persagy.fm.person.service.impl;
 
 import com.persagy.fm.department.model.vo.ManagerSimpleObjVO;
 import com.persagy.fm.person.model.Person;
-import com.persagy.fm.person.service.IPersonService;
+import com.persagy.fm.person.service.IPersonQueryService;
 import com.persagy.fm.translate.service.ITranslator;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
@@ -24,14 +24,14 @@ import java.util.*;
 public class PersonNameTranslator implements ITranslator {
 
     @Autowired
-    private IPersonService personService;
+    private IPersonQueryService personQueryService;
 
     @Override
     public String trans(String parameter) {
         if (StringUtils.isBlank(parameter)) {
             return "";
         }
-        Person person = personService.queryPersonProfile(parameter);
+        Person person = personQueryService.queryPersonProfile(parameter);
         return person.getName();
         //        if(StringUtils.isBlank(parameter)) {
         //            return null;
@@ -63,7 +63,7 @@ public class PersonNameTranslator implements ITranslator {
         }
         List<String> idList = new ArrayList<>(idSet);
         Map<String, Object> idMap = new HashMap<>(16);
-        List<Person> personList = personService.queryByIds(idList);
+        List<Person> personList = personQueryService.queryByIds(idList);
         personList.forEach(person -> idMap.put(String.valueOf(person.getId()), person.getName()));
         Map<String, Object> resultMap = new HashMap<>(16);
         for (String para : parameter) {

+ 3 - 3
fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonProjectServiceImpl.java

@@ -2,7 +2,7 @@ package com.persagy.fm.person.service.impl;
 
 import com.persagy.fm.person.model.Person;
 import com.persagy.fm.person.service.IPersonProjectService;
-import com.persagy.fm.person.service.IPersonService;
+import com.persagy.fm.person.service.IPersonQueryService;
 import com.persagy.fm.saas.accountproject.model.SaasAccountProject;
 import com.persagy.fm.saas.accountproject.model.dto.QuerySaasAccountProjectDTO;
 import com.persagy.fm.saas.accountproject.service.ISaasAccountProjectService;
@@ -27,7 +27,7 @@ public class PersonProjectServiceImpl implements IPersonProjectService {
     @Autowired
     ISaasProjectService saasProjectService;
     @Autowired
-    IPersonService personService;
+    IPersonQueryService personQueryService;
     @Autowired
     ISaasAccountProjectService accountProjectService;
 
@@ -35,7 +35,7 @@ public class PersonProjectServiceImpl implements IPersonProjectService {
     @Override
     public List<ProjectTreeItemVO> queryPersonProjectTree(String personId) {
         // 根据人员id查询人员关联的项目,然后组装项目树
-        Person person = personService.queryPersonProfile(personId);
+        Person person = personQueryService.queryPersonProfile(personId);
         String accountId = person.getAccountId();
         QuerySaasAccountProjectDTO querySaasAccountProjectDTO = new QuerySaasAccountProjectDTO();
         querySaasAccountProjectDTO.setAccountId(accountId);

+ 580 - 0
fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonQueryServiceImpl.java

@@ -0,0 +1,580 @@
+package com.persagy.fm.person.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.persagy.fm.common.constant.enums.BoolEnum;
+import com.persagy.fm.common.constant.enums.ValidEnum;
+import com.persagy.fm.common.model.vo.SimpleObjVO;
+import com.persagy.fm.department.model.Department;
+import com.persagy.fm.department.model.vo.DepSimpleObjVO;
+import com.persagy.fm.department.service.IDepartmentService;
+import com.persagy.fm.person.dao.PersonMapper;
+import com.persagy.fm.person.model.ConvertPersonTool;
+import com.persagy.fm.person.model.Person;
+import com.persagy.fm.person.model.dto.*;
+import com.persagy.fm.person.model.vo.LatestJobNumberVO;
+import com.persagy.fm.person.model.vo.ResponsePersonItemVO;
+import com.persagy.fm.person.model.vo.ResponsePersonListItemVO;
+import com.persagy.fm.person.service.IPersonQueryService;
+import com.persagy.fm.profession.service.IProfessionService;
+import com.persagy.fm.saas.account.constant.enums.ExpireTypeEnum;
+import com.persagy.fm.saas.account.model.vo.SaasAccountListItemVO;
+import com.persagy.fm.saas.account.service.ISaasAccountService;
+import com.persagy.fm.saas.accountproject.model.SaasAccountProject;
+import com.persagy.fm.saas.accountproject.service.ISaasAccountProjectService;
+import com.persagy.fm.saas.accountrole.model.vo.AccountRoleVO;
+import com.persagy.fm.saas.accountrole.service.ISaasAccountRoleService;
+import com.persagy.fm.saas.project.model.SaasProject;
+import com.persagy.fm.saas.project.model.vo.ProjectVO;
+import com.persagy.fm.saas.project.service.ISaasProjectService;
+import com.persagy.fm.workresume.model.WorkResume;
+import com.persagy.fm.workresume.service.IWorkResumeService;
+import org.apache.commons.lang3.StringUtils;
+import org.assertj.core.util.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 人员(Person) service层
+ *
+ * @author lixing
+ * @version V1.0 2021-03-15 17:20:31
+ */
+@Service
+public class PersonQueryServiceImpl extends ServiceImpl<PersonMapper, Person>
+        implements IPersonQueryService {
+    @Autowired
+    private PersonServiceCommonTool personServiceCommonTool;
+    @Autowired
+    private IWorkResumeService workResumeService;
+    @Autowired
+    private ISaasAccountService saasAccountService;
+    @Autowired
+    private PersonMapper personMapper;
+    @Autowired
+    private ISaasAccountRoleService saasAccountRoleService;
+    @Autowired
+    private ISaasAccountProjectService saasAccountProjectService;
+    @Autowired
+    private IProfessionService professionService;
+    @Autowired
+    private IDepartmentService departmentService;
+    @Autowired
+    private ISaasProjectService saasProjectService;
+
+
+    @Override
+    public List<Person> queryByIdCard(String idCard) {
+        if (StringUtils.isBlank(idCard)) {
+            return null;
+        }
+        QueryWrapper<Person> queryWrapper = personServiceCommonTool.getDefaultPersonQueryWrapper();
+        queryWrapper.eq(Person.PROP_ID_NUMBER, idCard);
+        return list(queryWrapper);
+    }
+
+    @Override
+    public List<Person> queryByUsername(String username) {
+        if (StringUtils.isBlank(username)) {
+            return null;
+        }
+
+        QueryWrapper<Person> queryWrapper = personServiceCommonTool.getDefaultPersonQueryWrapper();
+        queryWrapper.eq(Person.PROP_USERNAME, username);
+        return list(queryWrapper);
+    }
+
+    @Override
+    public List<Person> queryByJobNumber(String jobNumber) {
+        if (StringUtils.isBlank(jobNumber)) {
+            return null;
+        }
+        QueryWrapper<Person> queryWrapper = personServiceCommonTool.getDefaultPersonQueryWrapper();
+        queryWrapper.eq(Person.PROP_JOB_NUMBER, jobNumber);
+        return list(queryWrapper);
+    }
+
+
+    /**
+     * 人员详情
+     *
+     * @param id 主键
+     * @return 部门do类
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    @Override
+    public Person queryPersonProfile(String id) {
+        if (StringUtils.isBlank(id)) {
+            throw new IllegalArgumentException("查看Person详情时发生异常, 传入的id为空");
+        }
+        Person person = getById(id);
+        if (person == null) {
+            throw new IllegalArgumentException("查看Person详情时发生异常,找不到要查看的记录,id=" + id);
+        }
+        return person;
+    }
+
+    @Override
+    public List<Person> queryByIds(List<String> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return null;
+        }
+        return listByIds(ids);
+    }
+
+    @Override
+    public Person queryByAccountId(String accountId) {
+        if (StringUtils.isBlank(accountId)) {
+            throw new IllegalArgumentException("根据账号id查询人员,账号id为空");
+        }
+        QueryWrapper<Person> queryWrapper = personServiceCommonTool.getDefaultPersonQueryWrapper();
+        queryWrapper.eq(Person.PROP_ACCOUNT_ID, accountId);
+        List<Person> people = list(queryWrapper);
+        if (!CollectionUtils.isEmpty(people)) {
+            return people.get(0);
+        }
+        return null;
+    }
+
+
+    @Override
+    public IPage<ResponsePersonListItemVO> pageQueryPerson(PageQueryPersonDTO pageQueryPersonDTO) {
+        List<Person> people = personMapper.queryPersonList(pageQueryPersonDTO);
+        int total = personMapper.queryCount(pageQueryPersonDTO);
+
+        return packagePageResult(people, total, pageQueryPersonDTO.getDepId());
+    }
+
+    /**
+     * 组装分页查询结果
+     *
+     * @param people 人员列表(单页)
+     * @param total  人员总数量
+     * @return 分页结果
+     * @author lixing
+     * @version V1.0 2021/4/14 5:51 下午
+     */
+    private IPage<ResponsePersonListItemVO> packagePageResult(List<Person> people, int total) {
+        return packagePageResult(people, total, null);
+    }
+
+    /**
+     * 组装分页查询结果
+     *
+     * @param people 人员列表(单页)
+     * @param total  人员总数量
+     * @param depId  部门id,如果不根据部门id查询这里传null
+     * @return 分页结果
+     * @author lixing
+     * @version V1.0 2021/4/14 5:51 下午
+     */
+    private IPage<ResponsePersonListItemVO> packagePageResult(List<Person> people, int total, String depId) {
+        return packagePageResult(people, total, depId, null, null);
+    }
+
+    /**
+     * 组装分页查询结果
+     *
+     * @param people      人员列表(单页)
+     * @param total       人员总数量
+     * @param depId       部门id,如果不根据部门id查询这里传null
+     * @param hiredState  在职状态,如果不为空,只返回人员对应在职状态的工作信息
+     * @param enableState 禁用状态,如果不为空,只返回人员对应禁用状态的工作信息
+     * @return 分页结果
+     * @author lixing
+     * @version V1.0 2021/4/14 5:51 下午
+     */
+    private IPage<ResponsePersonListItemVO> packagePageResult(
+            List<Person> people, int total, String depId, String hiredState, String enableState) {
+        IPage<ResponsePersonListItemVO> result = new Page<>();
+        if (CollectionUtils.isEmpty(people)) {
+            result.setRecords(Lists.newArrayList());
+            return result;
+        }
+        // 准备数据
+        List<String> accountIds = people.stream().map(Person::getAccountId).collect(Collectors.toList());
+        List<String> peopleIds = people.stream().map(Person::getId).collect(Collectors.toList());
+        /* 账号角色的关联信息 */
+        Map<String, AccountRoleVO> accountRoleVoMap = saasAccountRoleService.
+                queryAccountRoleVoMapByAccountIdList(accountIds);
+        /* 人员的工作信息 */
+        List<WorkResume> workResumes = workResumeService.queryWorkResumeListByPersonIdList(peopleIds);
+        /* 账号的信息 */
+        List<SaasAccountListItemVO> saasAccountListItemVOS = saasAccountService.querySaasAccountListByAccountIds(accountIds);
+        Map<String, SaasAccountListItemVO> accountInfoMap = saasAccountListItemVOS.stream().
+                collect(Collectors.toMap(SaasAccountListItemVO::getId, itemVO -> itemVO, (k1, k2) -> k1));
+
+        /* 数据转换 */
+        // 设置人员基本信息
+        List<ResponsePersonListItemVO> responsePersonListItems = ConvertPersonTool.INSTANCE.convert2List(people);
+
+        for (ResponsePersonListItemVO responsePersonListItem : responsePersonListItems) {
+            // 设置人员主岗副岗信息
+            if (accountRoleVoMap != null) {
+                AccountRoleVO accountRoleVO = accountRoleVoMap.get(responsePersonListItem.getAccountId());
+                if (accountRoleVO != null) {
+                    responsePersonListItem.setMainDuty(accountRoleVO.getMainDuty());
+                    responsePersonListItem.setOtherDuties(accountRoleVO.getOtherDuties());
+                }
+            }
+
+            // 设置账号的过期时间和头像
+            SaasAccountListItemVO saasAccountListItemVO = accountInfoMap.get(responsePersonListItem.getAccountId());
+            if (saasAccountListItemVO != null) {
+                responsePersonListItem.setHeadPortrait(saasAccountListItemVO.getHeadPortrait());
+                String validLast = saasAccountListItemVO.getValidLast();
+                if (ExpireTypeEnum.EXPIRY_DATE.getType().equals(validLast)) {
+                    responsePersonListItem.setExpireDate(saasAccountListItemVO.getValidEndTime());
+                }
+            }
+
+            // 设置员工类型
+            String type = responsePersonListItem.getPersonType();
+            responsePersonListItem.setPersonTypeVO(personServiceCommonTool.getPersonTypeVO(type));
+
+            // 设置专业
+            String profession = responsePersonListItem.getProfession();
+            responsePersonListItem.setProfessions(getProfessionVoList(profession));
+
+            // 设置所属部门
+            List<WorkResume> personWorkResumes = workResumes.stream().
+                    filter(workResume -> responsePersonListItem.getId().equals(workResume.getPersonId())).
+                    filter(workResume -> StringUtils.isBlank(hiredState)
+                            || hiredState.equals(workResume.getHiredState())).
+                    filter(workResume -> StringUtils.isBlank(enableState)
+                            || enableState.equals(workResume.getEnableState())).
+                    collect(Collectors.toList());
+            if (StringUtils.isNotBlank(depId)) {
+                List<WorkResume> currentWorkResumes = personWorkResumes.stream().
+                        filter(workResume -> depId.equals(workResume.getDepId())
+                                && responsePersonListItem.getId().equals(workResume.getPersonId())).
+                        collect(Collectors.toList());
+                if (!CollectionUtils.isEmpty(currentWorkResumes)) {
+                    WorkResume currentWorkResume = currentWorkResumes.get(0);
+                    responsePersonListItem.setIsLeader(currentWorkResume.getIsLeader());
+                    responsePersonListItem.setEnableState(currentWorkResume.getEnableState());
+                    responsePersonListItem.setHiredState(currentWorkResume.getHiredState());
+                }
+            }
+            responsePersonListItem.setDeps(getDepSimpleObjVoList(personWorkResumes));
+        }
+
+        result.setRecords(responsePersonListItems);
+        result.setTotal(total);
+        return result;
+    }
+
+    /**
+     * 根据专业id获取专业信息
+     *
+     * @param profession 专业id id1,id2
+     * @return 专业信息列表
+     * @author lixing
+     * @version V1.0 2021/4/1 2:46 下午
+     */
+    private List<SimpleObjVO> getProfessionVoList(String profession) {
+        List<SimpleObjVO> professions = Lists.newArrayList();
+        if (StringUtils.isNotBlank(profession)) {
+            String[] professionArr = profession.split(",");
+            List<String> professionIds = Arrays.asList(professionArr);
+            professions = professionService.queryProfessionInfoByProfessionIds(professionIds);
+        }
+        return professions;
+    }
+
+    @Override
+    public List<Person> nameQuickSearch(NameQuickSearchDTO nameQuickSearchDTO) {
+        return personMapper.queryPersonNameList(nameQuickSearchDTO);
+    }
+
+
+    @Override
+    public ResponsePersonItemVO queryPersonDetail(String id) {
+        return queryPersonDetail(id, null);
+    }
+
+    @Override
+    public ResponsePersonItemVO queryPersonDetail(String id, String depId) {
+        Person person = queryPersonProfile(id);
+        return fillPersonInfo(depId, person);
+    }
+
+    /**
+     * 填充人员详情信息
+     *
+     * @param depId  部门id
+     * @param person 人员实体类
+     * @return 补充后的人员信息
+     * @author lixing
+     * @version V1.0 2021/4/29 10:52 上午
+     */
+    private ResponsePersonItemVO fillPersonInfo(String depId, Person person) {
+        if (person == null) {
+            return new ResponsePersonItemVO();
+        }
+        // 设置人员的基本信息
+        ResponsePersonItemVO responsePersonItemVO = ConvertPersonTool.INSTANCE.convert2ResponseItemDTO(person);
+
+        // 设置人员账号信息
+        String accountId = person.getAccountId();
+        SaasAccountListItemVO saasAccountListItemVO = saasAccountService.querySaasAccountDetail(accountId);
+        responsePersonItemVO.setMail(saasAccountListItemVO.getMail());
+        responsePersonItemVO.setPhoneNum(saasAccountListItemVO.getPhoneNum());
+        responsePersonItemVO.setHeadPortrait(saasAccountListItemVO.getHeadPortrait());
+        if (ExpireTypeEnum.EXPIRY_DATE.getType().equals(saasAccountListItemVO.getValidLast())) {
+            responsePersonItemVO.setExpireDate(saasAccountListItemVO.getValidEndTime());
+        }
+
+
+        // 设置人员岗位角色信息
+        Map<String, AccountRoleVO> accountRoleVoMap = saasAccountRoleService.
+                queryAccountRoleVoMapByAccountIdList(Lists.newArrayList(accountId));
+        if (accountRoleVoMap != null) {
+            AccountRoleVO accountRoleVO = accountRoleVoMap.get(accountId);
+            if (accountRoleVO != null) {
+                responsePersonItemVO.setMainDuty(accountRoleVO.getMainDuty());
+                responsePersonItemVO.setOtherDuties(accountRoleVO.getOtherDuties());
+                responsePersonItemVO.setOtherRoles(accountRoleVO.getOtherRoles());
+            }
+        }
+
+        // 设置项目
+        List<SaasAccountProject> saasAccountProjects = saasAccountProjectService.
+                querySaasAccountProjectListByAccountId(accountId);
+        if (!CollectionUtils.isEmpty(saasAccountProjects)) {
+            List<String> projectIds = saasAccountProjects.stream().
+                    map(SaasAccountProject::getProjectId).collect(Collectors.toList());
+            List<SaasProject> saasProjects = saasProjectService.queryProjectList(projectIds);
+            List<ProjectVO> projectVoList = ConvertPersonTool.INSTANCE.convert2ProjectVoList(saasProjects);
+            responsePersonItemVO.setProjects(projectVoList);
+        }
+
+        // 设置员工类型
+        String type = person.getPersonType();
+        responsePersonItemVO.setPersonTypeVO(personServiceCommonTool.getPersonTypeVO(type));
+
+        // 设置专业
+        String profession = person.getProfession();
+        responsePersonItemVO.setProfessions(getProfessionVoList(profession));
+
+        // 设置证件类型
+        String certificateType = person.getCertificateType();
+        responsePersonItemVO.setCertificateTypeVO(personServiceCommonTool.getCertificateTypeVO(certificateType));
+
+        // 设置直接上级
+        String leader = person.getLeader();
+        responsePersonItemVO.setLeaderVO(getLeaderVO(leader));
+
+        // 设置所属部门
+        List<WorkResume> workResumes = workResumeService.queryWorkResumeListByPersonIdList(
+                Lists.newArrayList(person.getId()));
+        responsePersonItemVO.setDeps(getDepSimpleObjVoList(workResumes));
+
+        if (StringUtils.isNotBlank(depId)) {
+            // 设置人员的在职状态和启用状态
+            List<WorkResume> currentDepWorkResumes = workResumes.stream().filter(
+                    workResume -> depId.equals(workResume.getDepId())
+            ).collect(Collectors.toList());
+            if (!CollectionUtils.isEmpty(currentDepWorkResumes)) {
+                WorkResume currentWorkResume = currentDepWorkResumes.get(0);
+                responsePersonItemVO.setHiredState(currentWorkResume.getHiredState());
+                responsePersonItemVO.setEnableState(currentWorkResume.getEnableState());
+            }
+        }
+
+        return responsePersonItemVO;
+    }
+
+    /**
+     * 根据工作信息获取人员所属部门
+     *
+     * @param workResumes 工作信息列表
+     * @return 所属部门列表
+     * @author lixing
+     * @version V1.0 2021/4/1 6:00 下午
+     */
+    public List<DepSimpleObjVO> getDepSimpleObjVoList(List<WorkResume> workResumes) {
+        if (CollectionUtils.isEmpty(workResumes)) {
+            return Lists.newArrayList();
+        }
+        List<String> depIds = workResumes.stream().map(WorkResume::getDepId).collect(Collectors.toList());
+        return departmentService.getDepInfoList(depIds);
+    }
+
+    @Override
+    public SimpleObjVO getLeaderVO(String leaderId) {
+        if (StringUtils.isBlank(leaderId)) {
+            return new SimpleObjVO();
+        }
+        Person person = queryPersonProfile(leaderId);
+        return new SimpleObjVO(leaderId, person.getName());
+    }
+
+    @Override
+    public LatestJobNumberVO queryLatestJobNumber() {
+        LatestJobNumberVO latestJobNumberVO = new LatestJobNumberVO();
+
+        QueryWrapper<Person> personQueryWrapper = personServiceCommonTool.getDefaultPersonQueryWrapper();
+        personQueryWrapper.ne(Person.PROP_JOB_NUMBER, "");
+        personQueryWrapper.orderByDesc(Person.PROP_CREATIONTIME);
+
+        IPage<Person> pageParam = new Page<>(1, 1, true);
+        IPage<Person> results = getBaseMapper().selectPage(pageParam, personQueryWrapper);
+        List<Person> records = results.getRecords();
+        if (!CollectionUtils.isEmpty(records)) {
+            Person person = records.get(0);
+            latestJobNumberVO.setJobNumber(person.getJobNumber());
+        }
+
+        return latestJobNumberVO;
+    }
+
+    @Override
+    public List<Person> queryByProfessionId(String professionId) {
+        if (StringUtils.isBlank(professionId)) {
+            throw new IllegalArgumentException("根据专业查询人员,专业id不可为空");
+        }
+        LambdaQueryWrapper<Person> personLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        personLambdaQueryWrapper.
+                like(Person::getProfession, "%" + professionId + "%").
+                eq(Person::getValid, ValidEnum.TRUE.getType());
+        return list(personLambdaQueryWrapper);
+    }
+
+    @Override
+    public List<Person> queryByLeader(Long leaderId) {
+        if (leaderId == null) {
+            throw new IllegalArgumentException("根据直接上级查询人员,直接上级id不可为空");
+        }
+        LambdaQueryWrapper<Person> personLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        personLambdaQueryWrapper.
+                eq(Person::getLeader, leaderId).
+                eq(Person::getValid, ValidEnum.TRUE.getType());
+        return list(personLambdaQueryWrapper);
+    }
+
+    @Override
+    public IPage<ResponsePersonListItemVO> pageQueryByNameOrUserName(PageQueryPersonByNameOrUserNameDTO pageQueryPersonDTO) {
+        List<Person> people = personMapper.queryPersonListByNameOrUserName(pageQueryPersonDTO);
+        int total = personMapper.queryCountByNameOrUserName(pageQueryPersonDTO);
+        String hiredState = pageQueryPersonDTO.getHiredState() == null ?
+                "" : pageQueryPersonDTO.getHiredState().toString();
+        String enableState = pageQueryPersonDTO.getEnableState() == null ?
+                "" : pageQueryPersonDTO.getEnableState().toString();
+        return packagePageResult(people, total, null, hiredState, enableState);
+    }
+
+    @Override
+    public IPage<ResponsePersonListItemVO> queryByUserName(QueryByUserNameDTO queryByUserNameDTO) {
+        QueryWrapper<Person> queryWrapper = personServiceCommonTool.getDefaultPersonQueryWrapper();
+        queryWrapper.eq(Person.PROP_USERNAME, queryByUserNameDTO.getUsername());
+        List<Person> result = list(queryWrapper);
+        return packagePageResult(result, result.size());
+    }
+
+
+    @Override
+    public IPage<ResponsePersonListItemVO> queryByName(QueryByNameDTO queryByNameDTO) {
+        QueryWrapper<Person> queryWrapper = personServiceCommonTool.getDefaultPersonQueryWrapper();
+        queryWrapper.like(Person.PROP_NAME, queryByNameDTO.getName());
+        List<Person> result = list(queryWrapper);
+        return packagePageResult(result, result.size());
+    }
+
+    @Override
+    public IPage<ResponsePersonListItemVO> queryDetailByIds(List<String> ids) {
+        List<Person> people = queryByIds(ids);
+        if (CollectionUtils.isEmpty(people)) {
+            IPage<ResponsePersonListItemVO> result = new Page<>();
+            result.setRecords(Lists.newArrayList());
+            return result;
+        }
+        return packagePageResult(people, people.size());
+    }
+
+    @Override
+    public ResponsePersonItemVO queryDetailByAccountId(String accountId, String depId) {
+        Person person = queryByAccountId(accountId);
+        return fillPersonInfo(depId, person);
+    }
+
+    @Override
+    public String queryAccountId(String id) {
+        Person person = queryPersonProfile(id);
+        return person.getAccountId();
+    }
+
+    @Override
+    public IPage<ResponsePersonListItemVO> queryByDepId(PageQueryByDepIdDTO pageQueryByDepIdDTO) {
+        List<String> depIds = Lists.newArrayList(pageQueryByDepIdDTO.getDepId());
+        // 如果包含下级部门,查询下级部门。
+        String containsSub = pageQueryByDepIdDTO.getContainsSub();
+        if (BoolEnum.TRUE.getType().equals(containsSub)) {
+            Department department = departmentService.queryDepartmentDetail(pageQueryByDepIdDTO.getDepId());
+            String fullPath = department.getFullPath();
+            List<Department> departments = departmentService.queryDepsContainsFullPath(fullPath);
+            depIds = departments.stream().map(Department::getId).collect(Collectors.toList());
+        }
+
+        // 查询这些部门下的人员
+        PageQueryByDepIdsDTO pageQueryByDepIdsDTO = ConvertPersonTool.INSTANCE.
+                convert2PageQueryByDepIdsDTO(pageQueryByDepIdDTO);
+        pageQueryByDepIdsDTO.setDepIds(depIds);
+        List<Person> people = personMapper.queryByDepIds(pageQueryByDepIdsDTO);
+        int total = personMapper.queryCountByDepIds(pageQueryByDepIdsDTO);
+
+        // 处理返回结果
+        if (!BoolEnum.TRUE.getType().equals(containsSub)) {
+            return packagePageResult(people, total, pageQueryByDepIdDTO.getDepId());
+        }
+        return packagePageResult(people, total);
+    }
+
+    @Override
+    public List<SimpleObjVO> queryAllPersonName() {
+        List<Person> people = list();
+        return people.stream().map(person -> {
+            SimpleObjVO simpleObjVO = new SimpleObjVO();
+            simpleObjVO.setId(person.getId());
+            simpleObjVO.setName(person.getName());
+            return simpleObjVO;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public IPage<ResponsePersonListItemVO> pageQueryByRoleIds(PageQueryByRoleIdsDTO pageQueryByRoleIdsDTO) {
+        IPage<ResponsePersonListItemVO> result = new Page<>();
+
+        // 角色id为空,返回空结果
+        List<String> roleIds = pageQueryByRoleIdsDTO.getRoleIds();
+        if (CollectionUtils.isEmpty(roleIds)) {
+            personServiceCommonTool.emptyPageResult(result);
+            return result;
+        }
+
+        // 根据角色id查询角色关联的账号
+        List<String> accountIds = saasAccountRoleService.queryAccountIdByRoleIdList(roleIds);
+
+        // 根据账号查询账号关联的人员
+        // TODO: 2021/4/30
+        return pageQueryByAccountIds(accountIds);
+    }
+
+    @Override
+    public IPage<ResponsePersonListItemVO> pageQueryByAccountIds(List<String> accountIds) {
+        QueryWrapper<Person> queryWrapper = personServiceCommonTool.getDefaultPersonQueryWrapper();
+        queryWrapper.in(Person.PROP_ACCOUNT_ID, accountIds);
+        List<Person> result = list(queryWrapper);
+        return packagePageResult(result, result.size());
+    }
+}

+ 39 - 1
fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonServiceTool.java

@@ -1,12 +1,25 @@
 package com.persagy.fm.person.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.persagy.fm.common.constant.enums.ValidEnum;
 import com.persagy.fm.common.context.DefaultAppContext;
 import com.persagy.fm.common.model.vo.SimpleObjVO;
 import com.persagy.fm.person.constant.enums.CertificateTypeEnum;
 import com.persagy.fm.person.constant.enums.PersonTypeEnum;
 import com.persagy.fm.person.model.Person;
+import com.persagy.fm.person.model.vo.ResponsePersonListItemVO;
+import org.assertj.core.util.Lists;
+import org.springframework.stereotype.Component;
 
-public class PersonServiceTool {
+/**
+ * 人员服务通用工具类
+ *
+ * @author lixing
+ * @version V1.0 2021/4/29 5:29 下午
+ */
+@Component
+public class PersonServiceCommonTool {
     /**
      * 如果某些字段没有赋值,使用默认的值
      *
@@ -53,4 +66,29 @@ public class PersonServiceTool {
         }
         return certificateTypeVO;
     }
+
+    /**
+     * 获取人员默认查询参数对象
+     *
+     * @return QueryWrapper
+     * @author lixing
+     * @version V1.0 2021/4/25 3:07 下午
+     */
+    QueryWrapper<Person> getDefaultPersonQueryWrapper() {
+        QueryWrapper<Person> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(Person.PROP_VALID, ValidEnum.TRUE.getType());
+        return queryWrapper;
+    }
+
+    /**
+     * 置空分页结果对象
+     *
+     * @param result 分页结果
+     * @author lixing
+     * @version V1.0 2021/4/30 10:32 上午
+     */
+    public void emptyPageResult(IPage<ResponsePersonListItemVO> result) {
+        result.setRecords(Lists.newArrayList());
+        result.setTotal(0);
+    }
 }

File diff suppressed because it is too large
+ 0 - 1436
fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonServiceImpl.java


+ 666 - 0
fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonUpsertServiceImpl.java

@@ -0,0 +1,666 @@
+package com.persagy.fm.person.service.impl;
+
+import cn.hutool.extra.pinyin.PinyinUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.persagy.fm.common.constant.enums.ValidEnum;
+import com.persagy.fm.common.context.DefaultAppContext;
+import com.persagy.fm.common.model.vo.SimpleObjVO;
+import com.persagy.fm.common.utils.ListUtil;
+import com.persagy.fm.department.model.vo.DepSimpleObjVO;
+import com.persagy.fm.department.service.IDepartmentService;
+import com.persagy.fm.person.dao.PersonMapper;
+import com.persagy.fm.person.model.ConvertPersonTool;
+import com.persagy.fm.person.model.Person;
+import com.persagy.fm.person.model.dto.AddPerson4FrontEndDTO;
+import com.persagy.fm.person.model.dto.BatchUpdatePersonDTO;
+import com.persagy.fm.person.model.dto.UpdatePerson4FrontEndDTO;
+import com.persagy.fm.person.model.vo.ResponsePersonItemVO;
+import com.persagy.fm.person.service.IPersonCheckService;
+import com.persagy.fm.person.service.IPersonQueryService;
+import com.persagy.fm.person.service.IPersonUpsertService;
+import com.persagy.fm.profession.service.IProfessionService;
+import com.persagy.fm.saas.account.constant.enums.ExpireTypeEnum;
+import com.persagy.fm.saas.account.model.dto.*;
+import com.persagy.fm.saas.account.model.vo.SaasAccountListItemVO;
+import com.persagy.fm.saas.account.service.ISaasAccountService;
+import com.persagy.fm.saas.accountproject.model.SaasAccountProject;
+import com.persagy.fm.saas.accountproject.model.dto.AddSaasAccountProjectDTO;
+import com.persagy.fm.saas.accountproject.service.ISaasAccountProjectService;
+import com.persagy.fm.saas.accountrole.constant.enums.AccountRoleTypeEnum;
+import com.persagy.fm.saas.accountrole.model.SaasAccountRole;
+import com.persagy.fm.saas.accountrole.model.dto.AddSaasAccountRoleDTO;
+import com.persagy.fm.saas.accountrole.model.vo.AccountRoleVO;
+import com.persagy.fm.saas.accountrole.service.ISaasAccountRoleService;
+import com.persagy.fm.saas.project.model.SaasProject;
+import com.persagy.fm.saas.project.model.dto.UpsertSaasProjectDTO;
+import com.persagy.fm.saas.project.model.vo.ProjectVO;
+import com.persagy.fm.saas.project.service.ISaasProjectService;
+import com.persagy.fm.workresume.constant.enums.WorkResumeEnableStateEnum;
+import com.persagy.fm.workresume.constant.enums.WorkResumeHiredStateEnum;
+import com.persagy.fm.workresume.model.WorkResume;
+import com.persagy.fm.workresume.model.dto.AddWorkResumeDTO;
+import com.persagy.fm.workresume.service.IWorkResumeService;
+import org.apache.commons.lang3.StringUtils;
+import org.assertj.core.util.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 人员(Person) service层
+ *
+ * @author lixing
+ * @version V1.0 2021-03-15 17:20:31
+ */
+@Service
+public class PersonUpsertServiceImpl extends ServiceImpl<PersonMapper, Person>
+        implements IPersonUpsertService {
+    @Autowired
+    private PersonServiceCommonTool personServiceCommonTool;
+    @Autowired
+    private PersonCheckServiceImpl personCheckServiceImpl;
+    @Autowired
+    private IWorkResumeService workResumeService;
+    @Autowired
+    private ISaasAccountService saasAccountService;
+    @Autowired
+    private ISaasAccountRoleService saasAccountRoleService;
+    @Autowired
+    private ISaasAccountProjectService saasAccountProjectService;
+    @Autowired
+    private IPersonQueryService personQueryService;
+    @Autowired
+    private IPersonCheckService personCheckService;
+
+    @Override
+    public String createPerson(Person person) {
+        save(person);
+        return person.getId();
+    }
+
+    /**
+     * 创建人员
+     *
+     * @return Long 人员主键
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    @Override
+    @Transactional
+    public String createPerson(AddPerson4FrontEndDTO addPerson4FrontEndDTO) {
+        personCheckServiceImpl.checkAddPersonDTO(addPerson4FrontEndDTO);
+        // 创建账号
+        String accountId = createAccount(addPerson4FrontEndDTO);
+        // 保存人员
+        Person person = savePerson(addPerson4FrontEndDTO, accountId);
+        // 创建人员工作信息
+        saveWorkResumes(addPerson4FrontEndDTO, person.getId());
+        // 账号关联项目
+        saveAccountProject(accountId, addPerson4FrontEndDTO.getProjects());
+        // 账号关联角色
+        saveAccountRole(accountId, addPerson4FrontEndDTO.getMainDuty(),
+                addPerson4FrontEndDTO.getOtherDuties(), addPerson4FrontEndDTO.getOtherRoles());
+        return person.getId();
+    }
+
+    /**
+     * 账号关联项目
+     *
+     * @param accountId 账号id
+     * @param projects  项目列表
+     * @author lixing
+     * @version V1.0 2021/3/26 5:23 下午
+     */
+    private void saveAccountProject(String accountId, List<UpsertSaasProjectDTO> projects) {
+        if (!CollectionUtils.isEmpty(projects)) {
+            for (UpsertSaasProjectDTO upsertSaasProjectDTO : projects) {
+                AddSaasAccountProjectDTO addSaasAccountProjectDTO = new AddSaasAccountProjectDTO();
+                addSaasAccountProjectDTO.setAccountId(accountId);
+                addSaasAccountProjectDTO.setProjectId(upsertSaasProjectDTO.getProjectId());
+                addSaasAccountProjectDTO.setAreaId(upsertSaasProjectDTO.getAreaId());
+                saasAccountProjectService.createSaasAccountProject(addSaasAccountProjectDTO);
+            }
+        }
+    }
+
+    /**
+     * 账号关联角色
+     *
+     * @param accountId   账号id
+     * @param mainDuty    主岗id
+     * @param otherDuties 副岗id列表
+     * @param otherRoles  其他角色列表
+     * @author lixing
+     * @version V1.0 2021/3/26 11:41 上午
+     */
+    private void saveAccountRole(
+            String accountId, String mainDuty,
+            List<String> otherDuties, List<String> otherRoles) {
+        if (otherDuties.contains(mainDuty)) {
+            throw new IllegalArgumentException("副岗不能选择和主岗相同的岗位");
+        }
+        // 保存主岗
+        if (StringUtils.isNotBlank(mainDuty)) {
+            saveAccountRole(accountId, mainDuty, AccountRoleTypeEnum.MAIN_DUTY.getType());
+        }
+        // 保存副岗
+        if (!CollectionUtils.isEmpty(otherDuties)) {
+            for (String otherDuty : otherDuties) {
+                saveAccountRole(accountId, otherDuty, AccountRoleTypeEnum.OTHER_DUTY.getType());
+            }
+        }
+        // 保存其他角色
+        if (!CollectionUtils.isEmpty(otherRoles)) {
+            for (String otherRole : otherRoles) {
+                saveAccountRole(accountId, otherRole, AccountRoleTypeEnum.SYS_ROLE.getType());
+            }
+        }
+    }
+
+    /**
+     * 账号关联角色
+     *
+     * @param accountId       账号id
+     * @param roleId          角色id
+     * @param accountRoleType 关联类型
+     * @author lixing
+     * @version V1.0 2021/3/26 11:42 上午
+     */
+    private void saveAccountRole(String accountId, String roleId, String accountRoleType) {
+        AddSaasAccountRoleDTO addAccountRoleDTO = new AddSaasAccountRoleDTO();
+        addAccountRoleDTO.setAccountId(accountId);
+        addAccountRoleDTO.setRoleId(roleId);
+        addAccountRoleDTO.setCasType(accountRoleType);
+        saasAccountRoleService.createSaasAccountRole(addAccountRoleDTO);
+    }
+
+    /**
+     * 保存人员的工作信息
+     *
+     * @param addPerson4FrontEndDTO 创建人员入参
+     * @param personId              人员id
+     * @author lixing
+     * @version V1.0 2021/3/23 4:23 下午
+     */
+    private void saveWorkResumes(AddPerson4FrontEndDTO addPerson4FrontEndDTO, String personId) {
+        List<String> depIds = addPerson4FrontEndDTO.getDepIds();
+        for (String depId : depIds) {
+            AddWorkResumeDTO addWorkResumeDTO = new AddWorkResumeDTO();
+            addWorkResumeDTO.setPersonId(personId);
+            addWorkResumeDTO.setDepId(depId);
+            workResumeService.createWorkResume(addWorkResumeDTO);
+        }
+    }
+
+    /**
+     * 保存人员信息到数据库
+     *
+     * @param addPerson4FrontEndDTO 创建人员入参
+     * @param accountId             账号id
+     * @return 保存后的人员对象
+     * @author lixing
+     * @version V1.0 2021/3/23 4:06 下午
+     */
+    private Person savePerson(AddPerson4FrontEndDTO addPerson4FrontEndDTO, String accountId) {
+        Person person = ConvertPersonTool.INSTANCE.convertAddDto2Entity(addPerson4FrontEndDTO);
+        person.setNamePinyin(PinyinUtil.getPinyin(person.getName(), ""));
+        person.setAccountId(accountId);
+        // 数据库中leader为Long型,不能存储空字符串
+        if (StringUtils.isBlank(person.getLeader())) {
+            person.setLeader(null);
+        }
+        if (!CollectionUtils.isEmpty(addPerson4FrontEndDTO.getProfessions())) {
+            person.setProfession(String.join(",", addPerson4FrontEndDTO.getProfessions()));
+        }
+        // 设置默认值
+        personServiceCommonTool.setDefaultValue(person);
+        save(person);
+        return person;
+    }
+
+    /**
+     * 创建账号
+     *
+     * @param addPerson4FrontEndDTO 创建人员入参
+     * @return 账号id
+     * @author lixing
+     * @version V1.0 2021/3/23 3:42 下午
+     */
+    private String createAccount(AddPerson4FrontEndDTO addPerson4FrontEndDTO) {
+        AddSaasAccountDTO addSaasAccountDTO = ConvertPersonTool.INSTANCE.convert2AddSaasAccountDTO(addPerson4FrontEndDTO);
+        addSaasAccountDTO.setValidLast(getAccountExpireType(addPerson4FrontEndDTO.getExpireDate()));
+        return saasAccountService.createSaasAccount(addSaasAccountDTO);
+    }
+
+    /**
+     * 获取账号过期类型
+     *
+     * @param expireDate 过期时间
+     * @return java.lang.String 过期类型
+     * @author lixing
+     * @version V1.0 2021/4/8 9:10 下午
+     */
+    private String getAccountExpireType(Date expireDate) {
+        return expireDate == null ? ExpireTypeEnum.FOREVER.getType() : ExpireTypeEnum.EXPIRY_DATE.getType();
+    }
+
+    /**
+     * 更新人员
+     *
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    @Override
+    @Transactional
+    public void updatePerson(UpdatePerson4FrontEndDTO updatePerson4FrontEndDTO) {
+        personCheckServiceImpl.checkUpdatePersonDTO(updatePerson4FrontEndDTO);
+        String personId = updatePerson4FrontEndDTO.getId();
+        // 更新人员基本信息
+        Person person = updatePersonBaseInfo(updatePerson4FrontEndDTO, personId);
+        // 账号基本信息发生改变,更新账号信息
+        String accountId = person.getAccountId();
+        if (StringUtils.isBlank(accountId)) {
+            throw new IllegalArgumentException("无法获取人员的账号信息,人员的账号id为空,人员id:" + personId);
+        }
+        SaasAccountListItemVO account = saasAccountService.querySaasAccountDetail(accountId);
+        if (accountInfoChanged(updatePerson4FrontEndDTO, account)) {
+            UpdateSaasAccountDTO updateSaasAccountDTO = ConvertPersonTool.INSTANCE.
+                    convert2UpdateSaasAccountDTO(account, updatePerson4FrontEndDTO);
+            updateSaasAccountDTO.setValidLast(getAccountExpireType(updatePerson4FrontEndDTO.getExpireDate()));
+            updateSaasAccountDTO.setValid(ValidEnum.TRUE.getType());
+            saasAccountService.updateSaasAccount(updateSaasAccountDTO);
+        }
+
+        // 更新账号和角色的关联
+        List<SaasAccountRole> saasAccountRoles = saasAccountRoleService.
+                querySaasAccountRoleListByAccountIdList(Lists.newArrayList(accountId));
+        if (accountRoleChanged(saasAccountRoles, updatePerson4FrontEndDTO.getMainDuty(),
+                updatePerson4FrontEndDTO.getOtherDuties(), updatePerson4FrontEndDTO.getOtherRoles())) {
+            resetAccountRoles(updatePerson4FrontEndDTO, accountId);
+        }
+
+        // 更新账号和项目的关联
+        List<SaasAccountProject> saasAccountProjects = saasAccountProjectService.
+                querySaasAccountProjectListByAccountId(accountId);
+        if (accountProjectsChanged(saasAccountProjects, updatePerson4FrontEndDTO.getProjects())) {
+            saasAccountProjectService.resetSaasAccountProject(accountId, updatePerson4FrontEndDTO.getProjects());
+        }
+
+        // 更新工作信息
+        List<String> depIdsAfterUpdate = updatePerson4FrontEndDTO.getDepIds();
+        updatePersonWorkResumes(depIdsAfterUpdate, personId);
+    }
+
+    /**
+     * 更新人员基本信息
+     *
+     * @param updatePerson4FrontEndDTO 更新人员入参
+     * @param personId                 人员id
+     * @return 更新后的人员对象
+     * @author lixing
+     * @version V1.0 2021/4/9 7:30 下午
+     */
+    private Person updatePersonBaseInfo(UpdatePerson4FrontEndDTO updatePerson4FrontEndDTO, String personId) {
+        Person person = getById(personId);
+        // 直接上级不能选择自己
+        String leaderAfterChange = updatePerson4FrontEndDTO.getLeader();
+        personCheckService.checkLeader(leaderAfterChange, person);
+        person = ConvertPersonTool.INSTANCE.convertUpdateDto2Entity(person, updatePerson4FrontEndDTO);
+        // 数据库中leader是long型,这里加一个特殊处理
+        if ("".equals(person.getLeader())) {
+            person.setLeader(null);
+        }
+        person.setNamePinyin(PinyinUtil.getPinyin(person.getName(), ""));
+        List<String> professions = updatePerson4FrontEndDTO.getProfessions();
+        if (CollectionUtils.isEmpty(professions)) {
+            person.setProfession("");
+        } else {
+            person.setProfession(String.join(",", professions));
+        }
+        person.setModifier(DefaultAppContext.getContext().getAccountId());
+        updateById(person);
+        return person;
+    }
+
+
+
+    /**
+     * 重置账号与角色的关联关系
+     *
+     * @param updatePerson4FrontEndDTO 更新人员入参
+     * @param accountId                账号id
+     * @author lixing
+     * @version V1.0 2021/4/8 3:07 下午
+     */
+    private void resetAccountRoles(UpdatePerson4FrontEndDTO updatePerson4FrontEndDTO, String accountId) {
+        // 判断主副岗角色是否重合
+        List<String> otherDuties = updatePerson4FrontEndDTO.getOtherDuties();
+        String mainDuty = updatePerson4FrontEndDTO.getMainDuty();
+        if (!CollectionUtils.isEmpty(otherDuties) &&
+                StringUtils.isNotBlank(mainDuty) &&
+                otherDuties.contains(mainDuty)) {
+            throw new IllegalArgumentException("人员主岗与副岗不能出现重合");
+        }
+
+        List<AddSaasAccountRoleDTO> accountRoleDTOList = Lists.newArrayList();
+        if (StringUtils.isNotBlank(mainDuty)) {
+            AddSaasAccountRoleDTO mainDutyDTO = new AddSaasAccountRoleDTO();
+            mainDutyDTO.setRoleId(mainDuty);
+            mainDutyDTO.setCasType(AccountRoleTypeEnum.MAIN_DUTY.getType());
+            accountRoleDTOList.add(mainDutyDTO);
+        }
+
+        if (!CollectionUtils.isEmpty(otherDuties)) {
+            otherDuties.forEach(otherDuty -> {
+                AddSaasAccountRoleDTO otherDutyDTO = new AddSaasAccountRoleDTO();
+                otherDutyDTO.setRoleId(otherDuty);
+                otherDutyDTO.setCasType(AccountRoleTypeEnum.OTHER_DUTY.getType());
+                accountRoleDTOList.add(otherDutyDTO);
+            });
+        }
+
+        if (!CollectionUtils.isEmpty(updatePerson4FrontEndDTO.getOtherRoles())) {
+            updatePerson4FrontEndDTO.getOtherRoles().forEach(otherRole -> {
+                AddSaasAccountRoleDTO otherDutyDTO = new AddSaasAccountRoleDTO();
+                otherDutyDTO.setRoleId(otherRole);
+                otherDutyDTO.setCasType(AccountRoleTypeEnum.SYS_ROLE.getType());
+                accountRoleDTOList.add(otherDutyDTO);
+            });
+        }
+
+        saasAccountRoleService.resetSaasAccountRole(accountId, accountRoleDTOList);
+    }
+
+    /**
+     * 判断账号关联的项目是否发生变化
+     *
+     * @param saasAccountProjects 账号之前关联的项目
+     * @param projects            更新后账号关联的项目
+     * @return 是否发生变化
+     * @author lixing
+     * @version V1.0 2021/4/8 9:40 上午
+     */
+    private Boolean accountProjectsChanged(List<SaasAccountProject> saasAccountProjects, List<UpsertSaasProjectDTO> projects) {
+        if (CollectionUtils.isEmpty(saasAccountProjects)) {
+            return !CollectionUtils.isEmpty(projects);
+        } else {
+            if (CollectionUtils.isEmpty(projects)) {
+                return true;
+            }
+            List<String> projectIdsAfterUpdate = projects.stream().map(
+                    UpsertSaasProjectDTO::getProjectId).collect(Collectors.toList());
+            List<String> projectIdsBeforeUpdate = saasAccountProjects.stream().
+                    map(SaasAccountProject::getProjectId).collect(Collectors.toList());
+            return ListUtil.listChanged(projectIdsBeforeUpdate, projectIdsAfterUpdate);
+        }
+    }
+
+    /**
+     * 判断账号关联的角色是否发生变化
+     *
+     * @param saasAccountRoles 账号之前关联的角色
+     * @param mainDuty         更新后,账号关联的主岗
+     * @param otherDuties      更新后,账号关联的副岗
+     * @param otherRoles       更新后,账号关联的附加角色
+     * @return 是否发生变化
+     * @author lixing
+     * @version V1.0 2021/4/8 9:37 上午
+     */
+    private Boolean accountRoleChanged(
+            List<SaasAccountRole> saasAccountRoles, String mainDuty,
+            List<String> otherDuties, List<String> otherRoles) {
+        //        if (otherDuties.contains(mainDuty)) {
+        //            throw new IllegalArgumentException("副岗不能选择和主岗相同的岗位");
+        //        }
+        // 校验主岗是否发生变化
+        List<SaasAccountRole> mainDuties = saasAccountRoles.stream().filter(
+                saasAccountRole -> AccountRoleTypeEnum.MAIN_DUTY.getType().equals(saasAccountRole.getCasType())
+        ).collect(Collectors.toList());
+
+        if (CollectionUtils.isEmpty(mainDuties)) {
+            if (StringUtils.isNotBlank(mainDuty)) {
+                return true;
+            }
+        } else {
+            SaasAccountRole saasAccountRole = mainDuties.get(0);
+            if (!saasAccountRole.getRoleId().equals(mainDuty)) {
+                return true;
+            }
+        }
+        // 校验副岗是否发生变化
+        List<String> otherDutiesBeforeUpdate = saasAccountRoles.stream().filter(
+                saasAccountRole -> AccountRoleTypeEnum.OTHER_DUTY.getType().equals(saasAccountRole.getCasType())
+        ).map(SaasAccountRole::getRoleId).collect(Collectors.toList());
+
+        if (ListUtil.listChanged(otherDutiesBeforeUpdate, otherDuties)) {
+            return true;
+        }
+        // 校验附加角色是否发生变化
+        List<String> otherRolesBeforeUpdate = saasAccountRoles.stream().filter(
+                saasAccountRole -> AccountRoleTypeEnum.SYS_ROLE.getType().equals(saasAccountRole.getCasType())
+        ).map(SaasAccountRole::getRoleId).collect(Collectors.toList());
+
+        return ListUtil.listChanged(otherRolesBeforeUpdate, otherRoles);
+    }
+
+    /**
+     * 判断账号基本信息是否发生变化
+     *
+     * @param updatePerson4FrontEndDTO 更新人员入参
+     * @param account                  账号实例
+     * @return 是否发生变化
+     * @author lixing
+     * @version V1.0 2021/4/8 9:38 上午
+     */
+    private boolean accountInfoChanged(UpdatePerson4FrontEndDTO updatePerson4FrontEndDTO, SaasAccountListItemVO account) {
+        if (account != null) {
+            // 账号名称
+            if (account.getUsername() != null &&
+                    !account.getUsername().equals(updatePerson4FrontEndDTO.getUsername())) {
+                return true;
+            }
+            // 登录权限
+            if (account.getValidEndTime() != null &&
+                    !account.getValidEndTime().equals(updatePerson4FrontEndDTO.getExpireDate())) {
+                return true;
+            }
+            // 手机号码
+            if (account.getPhoneNum() != null &&
+                    !account.getPhoneNum().equals(updatePerson4FrontEndDTO.getPhoneNum())) {
+                return true;
+            }
+            // 邮箱
+            return account.getMail() != null &&
+                    !account.getMail().equals(updatePerson4FrontEndDTO.getMail());
+        } else {
+            throw new IllegalArgumentException("账号信息为空");
+        }
+    }
+
+    /**
+     * 更新人员的工作信息
+     *
+     * @param depIdsAfterUpdate 人员更新后所在的部门
+     * @param personId          人员id
+     * @author lixing
+     * @version V1.0 2021/4/6 11:37 上午
+     */
+    private void updatePersonWorkResumes(List<String> depIdsAfterUpdate, String personId) {
+        List<WorkResume> workResumes = workResumeService.queryWorkResumeListByPersonIdList(Lists.newArrayList(personId));
+        List<String> depIdsBeforeUpdate = workResumes.stream().map(WorkResume::getDepId).collect(Collectors.toList());
+
+        List<String> addedDepIds = ListUtil.getAddedList(depIdsBeforeUpdate, depIdsAfterUpdate);
+        List<String> deletedDepIds = ListUtil.getDeletedList(depIdsBeforeUpdate, depIdsAfterUpdate);
+
+        workResumeService.updatePersonWorkResume(personId, addedDepIds, deletedDepIds);
+    }
+
+    /**
+     * 删除人员
+     *
+     * @param id 主键
+     * @author lixing
+     * @version V1.0 2021-03-15 17:20:31
+     */
+    @Override
+    public void deletePerson(String id) {
+        // 校验是否可删除
+        Person person = personCheckServiceImpl.checkDeletable(id);
+
+        person.setValid(ValidEnum.FALSE.getType());
+        updateById(person);
+    }
+
+    @Override
+    public void disablePerson(String personId) {
+        // 禁用账号
+        Person person = personQueryService.queryPersonProfile(personId);
+        String accountId = person.getAccountId();
+
+        // 有可能账号已经被禁用。被禁用的账号再次被禁用会抛出异常。
+        SaasAccountListItemVO saasAccountListItemVO = saasAccountService.querySaasAccountDetail(accountId);
+        if (saasAccountListItemVO != null &&
+                ValidEnum.TRUE.getType().equals(saasAccountListItemVO.getValid())) {
+            DeleteSaasAccountDTO deleteSaasAccountDTO = new DeleteSaasAccountDTO();
+            deleteSaasAccountDTO.setAccountId(accountId);
+            saasAccountService.disableAccount(deleteSaasAccountDTO);
+        }
+
+        // 工作信息状态更新为禁用
+        workResumeService.changeWorkResumeEnableStateByPersonId(
+                personId, WorkResumeEnableStateEnum.DISABLE.getType());
+    }
+
+    @Override
+    public void dismissPerson(String personId) {
+        // 离职要先禁用账号
+        disablePerson(personId);
+
+        workResumeService.changeWorkResumeHiredStateByPersonId(
+                personId, WorkResumeHiredStateEnum.DISMISS.getType());
+    }
+
+    @Override
+    public void rejoinPerson(String personId) {
+        // 恢复禁用的账号
+        enablePerson(personId);
+        workResumeService.changeWorkResumeHiredStateByPersonId(
+                personId, WorkResumeHiredStateEnum.ON_JOB.getType());
+    }
+
+    @Override
+    @Transactional
+    public void batchUpdatePeople(BatchUpdatePersonDTO batchUpdatePersonDTO) {
+
+        List<String> personIds = batchUpdatePersonDTO.getIds();
+        if (CollectionUtils.isEmpty(personIds)) {
+            return;
+        }
+
+        // 如果有主副岗的更新,判断涉及到的人员是否有主副岗重复的情况
+        String mainDuty = batchUpdatePersonDTO.getMainDuty();
+        List<String> otherDuties = batchUpdatePersonDTO.getOtherDuties();
+        if (mainDuty != null || otherDuties != null) {
+            if (mainDuty != null && otherDuties != null && otherDuties.contains(mainDuty)) {
+                throw new IllegalArgumentException("人员主岗与副岗不能出现重合");
+            }
+            personIds.forEach(personId -> {
+                personCheckService.checkMainAndOtherDutiesWhenBatchUpdate(mainDuty, otherDuties, personId);
+            });
+        }
+
+        // 更新人员基本信息
+        if (batchUpdatePersonDTO.getPersonType() != null ||
+                batchUpdatePersonDTO.getProfessions() != null) {
+            personIds.forEach(personId -> {
+                UpdatePerson4FrontEndDTO updatePerson4FrontEndDTO = new UpdatePerson4FrontEndDTO();
+                updatePerson4FrontEndDTO.setPersonType(batchUpdatePersonDTO.getPersonType());
+                updatePerson4FrontEndDTO.setProfessions(batchUpdatePersonDTO.getProfessions());
+                updatePersonBaseInfo(updatePerson4FrontEndDTO, personId);
+            });
+        }
+
+        // 更新工作信息
+        if (batchUpdatePersonDTO.getDepIds() != null) {
+            personIds.forEach(personId -> {
+                updatePersonWorkResumes(batchUpdatePersonDTO.getDepIds(), personId);
+            });
+        }
+
+        // 更新主岗
+        if (mainDuty != null) {
+            personIds.forEach(personId -> {
+                Person person = getById(personId);
+                AddSaasAccountRoleDTO addSaasAccountRoleDTO = new AddSaasAccountRoleDTO();
+                addSaasAccountRoleDTO.setRoleId(mainDuty);
+                addSaasAccountRoleDTO.setCasType(AccountRoleTypeEnum.MAIN_DUTY.getType());
+                saasAccountRoleService.resetSaasAccountRole(
+                        person.getAccountId(), AccountRoleTypeEnum.MAIN_DUTY.getType(),
+                        Lists.newArrayList(addSaasAccountRoleDTO));
+            });
+        }
+
+        // 更新副岗
+        if (otherDuties != null) {
+            personIds.forEach(personId -> {
+                Person person = getById(personId);
+                List<AddSaasAccountRoleDTO> otherDutiesDTO = otherDuties.stream().map(
+                        otherDuty -> {
+                            AddSaasAccountRoleDTO addSaasAccountRoleDTO = new AddSaasAccountRoleDTO();
+                            addSaasAccountRoleDTO.setRoleId(otherDuty);
+                            addSaasAccountRoleDTO.setCasType(AccountRoleTypeEnum.OTHER_DUTY.getType());
+                            return addSaasAccountRoleDTO;
+                        }
+                ).collect(Collectors.toList());
+                saasAccountRoleService.resetSaasAccountRole(
+                        person.getAccountId(), AccountRoleTypeEnum.OTHER_DUTY.getType(), otherDutiesDTO);
+            });
+        }
+
+        // 更新附加角色
+        if (batchUpdatePersonDTO.getOtherRoles() != null) {
+            personIds.forEach(personId -> {
+                Person person = getById(personId);
+                List<AddSaasAccountRoleDTO> otherRoles = batchUpdatePersonDTO.getOtherRoles().stream().map(
+                        otherRole -> {
+                            AddSaasAccountRoleDTO addSaasAccountRoleDTO = new AddSaasAccountRoleDTO();
+                            addSaasAccountRoleDTO.setRoleId(otherRole);
+                            addSaasAccountRoleDTO.setCasType(AccountRoleTypeEnum.SYS_ROLE.getType());
+                            return addSaasAccountRoleDTO;
+                        }
+                ).collect(Collectors.toList());
+                saasAccountRoleService.resetSaasAccountRole(
+                        person.getAccountId(), AccountRoleTypeEnum.SYS_ROLE.getType(), otherRoles);
+            });
+        }
+    }
+
+    @Override
+    public void enablePerson(String personId) {
+        // 启用账号
+        Person person = personQueryService.queryPersonProfile(personId);
+        String accountId = person.getAccountId();
+        EnableSaasAccountDTO enableSaasAccountDTO = new EnableSaasAccountDTO();
+        enableSaasAccountDTO.setAccountId(accountId);
+        saasAccountService.enableAccount(enableSaasAccountDTO);
+        // 工作信息状态更新为启用
+        workResumeService.changeWorkResumeEnableStateByPersonId(
+                personId, WorkResumeEnableStateEnum.ENABLE.getType());
+    }
+
+    @Override
+    public void updatePerson(Person person) {
+        updateById(person);
+    }
+
+
+
+}

+ 3 - 3
fm-person/src/main/java/com/persagy/fm/profession/service/impl/ProfessionServiceImpl.java

@@ -7,7 +7,7 @@ import com.persagy.fm.common.constant.enums.ValidEnum;
 import com.persagy.fm.common.context.DefaultAppContext;
 import com.persagy.fm.common.model.vo.SimpleObjVO;
 import com.persagy.fm.person.model.Person;
-import com.persagy.fm.person.service.IPersonService;
+import com.persagy.fm.person.service.IPersonQueryService;
 import com.persagy.fm.profession.dao.ProfessionMapper;
 import com.persagy.fm.profession.model.ConvertProfessionTool;
 import com.persagy.fm.profession.model.Profession;
@@ -33,7 +33,7 @@ import java.util.stream.Collectors;
 public class ProfessionServiceImpl extends ServiceImpl<ProfessionMapper, Profession>
         implements IProfessionService {
     @Autowired
-    IPersonService personService;
+    IPersonQueryService personQueryService;
 
     /**
      * 创建专业
@@ -112,7 +112,7 @@ public class ProfessionServiceImpl extends ServiceImpl<ProfessionMapper, Profess
         }
 
         // 如果专业被人员使用,专业不可删除
-        List<Person> people = personService.queryByProfessionId(id);
+        List<Person> people = personQueryService.queryByProfessionId(id);
         if (!CollectionUtils.isEmpty(people)) {
             throw new IllegalArgumentException("被引用的专业不可删除");
         }

+ 3 - 0
fm-person/src/main/java/com/persagy/fm/saas/account/model/dto/PageQuerySaasAccountDTO.java

@@ -4,6 +4,8 @@ import com.persagy.fm.saas.common.model.dto.SaasBasePageDTO;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.List;
+
 /**
  * 查询运维平台账号入参
  *
@@ -18,4 +20,5 @@ public class PageQuerySaasAccountDTO extends SaasBasePageDTO {
     private String phoneNum;
     private String accountSource;
     private String mail;
+    private List<String> accountIds;
 }

+ 10 - 0
fm-person/src/main/java/com/persagy/fm/saas/account/service/ISaasAccountService.java

@@ -33,6 +33,16 @@ public interface ISaasAccountService {
     List<SaasAccountListItemVO> querySaasAccountList(PageQuerySaasAccountDTO pageQuerySaasAccountDTO);
 
     /**
+     * 根据账号id列表查询账号信息
+     *
+     * @param accountIds 账号id列表
+     * @return 账号列表
+     * @author lixing
+     * @version V1.0 2021/5/6 9:59 上午
+     */
+    List<SaasAccountListItemVO> querySaasAccountListByAccountIds(List<String> accountIds);
+
+    /**
      * 查询账号详情
      *
      * @param accountId 账号id

+ 15 - 0
fm-person/src/main/java/com/persagy/fm/saas/account/service/impl/SaasAccountServiceImpl.java

@@ -7,6 +7,7 @@ import com.persagy.fm.saas.account.constant.enums.AccountTypeEnum;
 import com.persagy.fm.saas.account.model.dto.*;
 import com.persagy.fm.saas.account.model.vo.SaasAccountListItemVO;
 import com.persagy.fm.saas.account.service.ISaasAccountService;
+import org.assertj.core.util.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -78,4 +79,18 @@ public class SaasAccountServiceImpl implements ISaasAccountService {
             throw new IllegalArgumentException("未获取到账号信息,accountId:" + accountId);
         }
     }
+
+    @Override
+    public List<SaasAccountListItemVO> querySaasAccountListByAccountIds(List<String> accountIds) {
+        if (CollectionUtils.isEmpty(accountIds)) {
+            return Lists.newArrayList();
+        }
+        PageQuerySaasAccountDTO pageQuerySaasAccountDTO = new PageQuerySaasAccountDTO();
+        pageQuerySaasAccountDTO.setAccountIds(accountIds);
+        pageQuerySaasAccountDTO.setSize(accountIds.size());
+        pageQuerySaasAccountDTO.setPageInfo();
+        FmResponseContent<List<SaasAccountListItemVO>> listFmResponseContent = saasAccountClient.
+                querySaasAccountPageList(pageQuerySaasAccountDTO);
+        return listFmResponseContent.getContent();
+    }
 }

+ 3 - 0
fm-person/src/main/java/com/persagy/fm/saas/accountrole/model/dto/QuerySaasAccountRoleDTO.java

@@ -27,6 +27,9 @@ public class QuerySaasAccountRoleDTO extends SaasBaseDTO {
     @ApiModelProperty(value = "角色ID")
     private String roleId;
 
+    @ApiModelProperty(value = "角色ID列表")
+    private List<String> roleIds;
+
     @ApiModelProperty(value = "关联类型,0-主岗,1-副岗")
     private String casType;
 

+ 10 - 0
fm-person/src/main/java/com/persagy/fm/saas/accountrole/service/ISaasAccountRoleService.java

@@ -50,6 +50,16 @@ public interface ISaasAccountRoleService {
     List<SaasAccountRole> querySaasAccountRoleList(QuerySaasAccountRoleDTO querySaasAccountRoleDTO);
 
     /**
+     * 查询角色关联的账号id
+     *
+     * @param roleIds 角色列表
+     * @return 账号id列表
+     * @author lixing
+     * @version V1.0 2021/4/30 10:35 上午
+     */
+    List<String> queryAccountIdByRoleIdList(List<String> roleIds);
+
+    /**
      * 根据账号id列表查询账号-角色关联信息
      *
      * @param accountIdList 账号id列表

+ 26 - 0
fm-person/src/main/java/com/persagy/fm/saas/accountrole/service/impl/SaasAccountRoleServiceImpl.java

@@ -1,5 +1,6 @@
 package com.persagy.fm.saas.accountrole.service.impl;
 
+import com.persagy.fm.common.constant.PageQueryConstants;
 import com.persagy.fm.common.context.DefaultAppContext;
 import com.persagy.fm.common.model.vo.SimpleObjVO;
 import com.persagy.fm.common.response.FmResponseContent;
@@ -197,4 +198,29 @@ public class SaasAccountRoleServiceImpl implements ISaasAccountRoleService {
             saasAccountRoleClient.resetSaasAccountRole(resetSaasAccountRoleDTO);
         }
     }
+
+    @Override
+    public List<String> queryAccountIdByRoleIdList(List<String> roleIds) {
+        if (CollectionUtils.isEmpty(roleIds)) {
+            return Lists.newArrayList();
+        }
+
+        if (roleIds.size() > PageQueryConstants.PARAM_MAX_SIZE) {
+            throw new IllegalArgumentException("一次最多查询" + PageQueryConstants.PARAM_MAX_SIZE + "个角色关联的账号");
+        }
+
+        // 查询角色账号的关联信息
+        QuerySaasAccountRoleDTO querySaasAccountRoleDTO = new QuerySaasAccountRoleDTO();
+        querySaasAccountRoleDTO.setDefaultValueNoAccountId();
+        querySaasAccountRoleDTO.setRoleIds(roleIds);
+        FmResponseContent<List<SaasAccountRole>> responseContent = saasAccountRoleClient.
+                querySaasAccountRoleList(querySaasAccountRoleDTO);
+        List<SaasAccountRole> content = responseContent.getContent();
+
+        if (CollectionUtils.isEmpty(content)) {
+            return Lists.newArrayList();
+        }
+
+        return content.stream().map(SaasAccountRole::getAccountId).collect(Collectors.toList());
+    }
 }

+ 4 - 4
fm-person/src/main/java/com/persagy/fm/saas/common/model/dto/SaasBaseDTO.java

@@ -16,13 +16,13 @@ import org.apache.commons.lang3.StringUtils;
 @Data
 @ApiModel
 public class SaasBaseDTO {
-    @ApiModelProperty("数据来源")
+    @ApiModelProperty(value = "数据来源", hidden = true)
     private String accountBelong;
-    @ApiModelProperty("集团编码")
+    @ApiModelProperty(value = "集团编码", hidden = true)
     private String groupCode;
-    @ApiModelProperty("客户端类型(PC、APP)")
+    @ApiModelProperty(value = "客户端类型(PC、APP)", hidden = true)
     private String appId;
-    @ApiModelProperty("账号id")
+    @ApiModelProperty(value = "账号id", hidden = true)
     private String accountId;
 
     /**

+ 31 - 15
fm-person/src/main/java/com/persagy/fm/saas/role/controller/SaasRoleController.java

@@ -2,6 +2,7 @@ package com.persagy.fm.saas.role.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.persagy.fm.common.response.CommonResult;
+import com.persagy.fm.common.response.FmResponseItem;
 import com.persagy.fm.common.response.PageList;
 import com.persagy.fm.common.utils.ResultHelper;
 import com.persagy.fm.saas.role.model.ConvertSaasRoleTool;
@@ -44,14 +45,14 @@ public class SaasRoleController {
         return ResultHelper.single(saasRoleIdVO);
     }
 
-    //    @ApiOperation(value = "详情")
-    //    @PostMapping("/get")
-    //    public FmResponseItem<ResponseSaasRoleItemVO> querySaasRoleDetail(
-    //            @Valid @RequestBody QuerySaasRoleDetailDTO querySaasRoleDetailDTO) {
-    //        SaasRole saasRole = saasRoleService.querySaasRoleDetail(querySaasRoleDetailDTO.getId());
-    //        ResponseSaasRoleItemVO responseSaasRoleItemVO = ConvertSaasRoleTool.INSTANCE.convert2ResponseItemDTO(saasRole);
-    //        return ResultHelper.successItem(responseSaasRoleItemVO);
-    //    }
+    @ApiOperation(value = "详情")
+    @PostMapping("/get")
+    public CommonResult<SaasRoleListItemVO> querySaasRoleDetail(
+            @Valid @RequestBody QuerySaasRoleDetailDTO querySaasRoleDetailDTO) {
+        SaasRole saasRole = saasRoleService.querySaasRoleDetail(querySaasRoleDetailDTO.getId());
+        SaasRoleListItemVO saasRoleListItemVO = convertSaasRole2SaasRoleListItemVO(saasRole);
+        return ResultHelper.single(saasRoleListItemVO);
+    }
 
 
     @ApiOperation(value = "更新")
@@ -88,13 +89,7 @@ public class SaasRoleController {
         IPage<SaasRole> pagedList = saasRoleService.pageQuerySaasRole(pageQuerySaasRoleDTO);
         IPage<SaasRoleListItemVO> pagedResultList = pagedList.convert(item -> {
             try {
-                SaasRoleListItemVO saasRoleListItemVO = ConvertSaasRoleTool.INSTANCE.convert2ResponseListItemDTO(item);
-                Integer countFunction = item.getCountFunction();
-                Integer countMenu = item.getCountMenu();
-                countFunction = countFunction == null ? 0 : countFunction;
-                countMenu = countMenu == null ? 0 : countMenu;
-                saasRoleListItemVO.setRelatedFunCount(countFunction + countMenu);
-                return saasRoleListItemVO;
+                return convertSaasRole2SaasRoleListItemVO(item);
             } catch (Exception e) {
                 throw new IllegalArgumentException("分页查询,SaasRole实体类转换为列表对象发生异常", e);
             }
@@ -102,6 +97,27 @@ public class SaasRoleController {
         return ResultHelper.multi(pagedResultList);
     }
 
+    /**
+     * 将saasRole转换为SaasRoleListItemVO
+     *
+     * @param saasRole 角色对象
+     * @return SaasRoleListItemVO
+     * @author lixing
+     * @version V1.0 2021/4/29 2:35 下午
+     */
+    private SaasRoleListItemVO convertSaasRole2SaasRoleListItemVO(SaasRole saasRole) {
+        if (saasRole == null) {
+            return null;
+        }
+        SaasRoleListItemVO saasRoleListItemVO = ConvertSaasRoleTool.INSTANCE.convert2ResponseListItemDTO(saasRole);
+        Integer countFunction = saasRole.getCountFunction();
+        Integer countMenu = saasRole.getCountMenu();
+        countFunction = countFunction == null ? 0 : countFunction;
+        countMenu = countMenu == null ? 0 : countMenu;
+        saasRoleListItemVO.setRelatedFunCount(countFunction + countMenu);
+        return saasRoleListItemVO;
+    }
+
     @ApiOperation(value = "根据角色名称查询")
     @PostMapping("/queryByName")
     public CommonResult<PageList<SaasRole>> querySaasRoleByName(

+ 24 - 0
fm-person/src/main/java/com/persagy/fm/saas/role/model/dto/QuerySaasRoleDetailDTO.java

@@ -0,0 +1,24 @@
+package com.persagy.fm.saas.role.model.dto;
+
+import com.persagy.fm.saas.common.model.dto.SaasBaseDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author lixing
+ * @version V1.0 2021-03-22 19:04:24
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel(value = "查询入参")
+public class QuerySaasRoleDetailDTO extends SaasBaseDTO {
+    @ApiModelProperty(value = "id", required = true)
+    @NotEmpty(message = "主键不能为空")
+    private String id;
+}

+ 9 - 9
fm-person/src/main/java/com/persagy/fm/saas/role/service/ISaasRoleService.java

@@ -28,15 +28,15 @@ public interface ISaasRoleService {
      */
     String createSaasRole(AddSaasRoleDTO addSaasRoleDTO);
 
-//    /**
-//     * 详情
-//     *
-//     * @param id 主键
-//     * @return do对象
-//     * @author lixing
-//     * @version V1.0 2021-03-22 19:04:15
-//     */
-//    SaasRole querySaasRoleDetail(String id);
+    /**
+     * 详情
+     *
+     * @param id 主键
+     * @return do对象
+     * @author lixing
+     * @version V1.0 2021-03-22 19:04:15
+     */
+    SaasRole querySaasRoleDetail(String id);
 
     /**
      * 更新

+ 14 - 0
fm-person/src/main/java/com/persagy/fm/saas/role/service/impl/SaasRoleServiceImpl.java

@@ -15,6 +15,7 @@ import com.persagy.fm.saas.role.model.SaasRole;
 import com.persagy.fm.saas.role.model.dto.*;
 import com.persagy.fm.saas.role.service.ISaasRoleService;
 import org.apache.commons.lang3.StringUtils;
+import org.assertj.core.util.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -230,4 +231,17 @@ public class SaasRoleServiceImpl implements ISaasRoleService {
         FmResponseContent<List<SaasRole>> responseContent = saasRoleClient.querySaasRoleByName(querySaasRoleByNameDTO);
         return responseContent.getContent();
     }
+
+    @Override
+    public SaasRole querySaasRoleDetail(String id) {
+        if (StringUtils.isBlank(id)) {
+            return null;
+        }
+        List<SaasRole> saasRoles = querySaasRoleListByRoleIdList(Lists.newArrayList(id));
+        if (CollectionUtils.isEmpty(saasRoles)) {
+            return null;
+        } else {
+            return saasRoles.get(0);
+        }
+    }
 }

+ 67 - 17
fm-person/src/main/resources/mapper/PersonMapper.xml

@@ -41,6 +41,22 @@
             and p.name = #{name}
         </if>
     </sql>
+    <sql id="queryPersonByDepIdsWhereExpression">
+        where p.id = w.person_id and p.valid = 1 and w.valid = 1
+        <if test="depIds != null">
+            and w.dep_id in
+            <foreach collection="depIds" item="id" index="index"
+                     open="(" close=")" separator=",">
+                #{id}
+            </foreach>
+        </if>
+        <if test="hiredState != null and hiredState != '' or 0 == hiredState">
+            and w.hired_state = #{hiredState}
+        </if>
+        <if test="enableState != null and enableState != '' or 0 == enableState">
+            and w.enable_state = #{enableState}
+        </if>
+    </sql>
 
     <sql id="queryPersonByNameOrUsernameExpression">
         where p.id = w.person_id and p.valid = 1 and w.valid = 1
@@ -58,13 +74,12 @@
         </if>
     </sql>
 
-    <sql id="selectPersonInfo">
+    <sql id="selectPersonAndWorkResumeInfo">
         select p.id          as id,
                p.name        as name,
                p.profession  as profession,
                p.account_id  as account_id,
-               p.person_type as
-                                person_type,
+               p.person_type as person_type,
                p.username    as username,
                w.is_leader   as is_leader
         from person p,
@@ -79,23 +94,46 @@
         p.name_pinyin
     </sql>
 
-    <sql id="queryPersonListByNameOrUserName">
+    <sql id="orderByNamePinyin">
+        order by p.name_pinyin
+    </sql>
+
+    <sql id="queryPersonListByNameOrUserNameSql">
+        <include refid="queryPersonInfo">
+            <property name="queryExpression" value="queryPersonByNameOrUsernameExpression"/>
+            <property name="orderBy" value="orderBy"/>
+        </include>
+    </sql>
+    <sql id="queryPersonListSql">
+        <include refid="queryPersonInfo">
+            <property name="queryExpression" value="queryPersonWhereExpression"/>
+            <property name="orderBy" value="orderBy"/>
+        </include>
+    </sql>
+    <sql id="queryPersonListByDepIdsSql">
+        <include refid="queryPersonInfo">
+            <property name="queryExpression" value="queryPersonByDepIdsWhereExpression"/>
+            <property name="orderBy" value="orderByNamePinyin"/>
+        </include>
+    </sql>
+
+    <sql id="queryPersonInfo">
         select max(pw.id) as id,
         pw.name as name,
         pw.profession as profession,
         pw.account_id as account_id,
-        pw.person_type as
-        person_type,
+        pw.person_type as person_type,
         pw.username as username from (
-        <include refid="selectPersonInfo"/>
-        <include refid="queryPersonByNameOrUsernameExpression"/>
-        <include refid="orderBy"/>) as pw group by pw.id
+        <include refid="selectPersonAndWorkResumeInfo"/>
+        <include refid="${queryExpression}"/>
+        <include refid="${orderBy}"/>) as pw group by pw.id
     </sql>
 
+
     <select id="queryPersonListByNameOrUserName"
             parameterType="com.persagy.fm.person.model.dto.PageQueryPersonByNameOrUserNameDTO"
             resultType="com.persagy.fm.person.model.Person">
-        <include refid="queryPersonListByNameOrUserName"/>
+        <include refid="queryPersonListByNameOrUserNameSql"/>
         limit #{startIndex}, #{size}
     </select>
 
@@ -104,25 +142,37 @@
             resultType="int">
         select count(*) total
         from (
-        <include refid="queryPersonListByNameOrUserName"/>
+        <include refid="queryPersonListByNameOrUserNameSql"/>
         ) tmp
     </select>
 
 
     <select id="queryPersonList" parameterType="com.persagy.fm.person.model.dto.PageQueryPersonDTO"
             resultType="com.persagy.fm.person.model.Person">
-        <include refid="selectPersonInfo"/>
-        <include refid="queryPersonWhereExpression"/>
-        <include refid="orderBy"/>
+        <include refid="queryPersonListSql"/>
+        limit #{startIndex}, #{size}
+    </select>
+
+    <select id="queryByDepIds" parameterType="com.persagy.fm.person.model.dto.PageQueryByDepIdsDTO"
+            resultType="com.persagy.fm.person.model.Person">
+        <include refid="queryPersonListByDepIdsSql"/>
         limit #{startIndex}, #{size}
     </select>
 
     <select id="queryCount" parameterType="com.persagy.fm.person.model.dto.PageQueryPersonDTO"
             resultType="int">
         select count(*) total
-        from person p,
-        work_resume w
-        <include refid="queryPersonWhereExpression"/>
+        from (
+        <include refid="queryPersonListSql"/>
+        ) tmp
+    </select>
+
+    <select id="queryCountByDepIds" parameterType="com.persagy.fm.person.model.dto.PageQueryByDepIdsDTO"
+            resultType="int">
+        select count(*) total
+        from (
+        <include refid="queryPersonListByDepIdsSql"/>
+        ) tmp
     </select>
 
     <select id="queryPersonNameList" parameterType="com.persagy.fm.person.model.dto.NameQuickSearchDTO"