Przeglądaj źródła

提交人员服务代码

lixing 4 lat temu
rodzic
commit
68490dcb0e
52 zmienionych plików z 1399 dodań i 534 usunięć
  1. 39 9
      fm-person/src/main/java/com/persagy/fm/department/controller/DepartmentController.java
  2. 1 0
      fm-person/src/main/java/com/persagy/fm/department/model/ConvertDepartmentTool.java
  3. 1 4
      fm-person/src/main/java/com/persagy/fm/department/model/Department.java
  4. 9 4
      fm-person/src/main/java/com/persagy/fm/department/model/dto/AddDepartmentDTO.java
  5. 11 6
      fm-person/src/main/java/com/persagy/fm/department/model/dto/UpdateDepartmentDTO.java
  6. 12 2
      fm-person/src/main/java/com/persagy/fm/department/model/vo/ResponseDepartmentItemVO.java
  7. 0 24
      fm-person/src/main/java/com/persagy/fm/department/service/IDepProjectService.java
  8. 0 28
      fm-person/src/main/java/com/persagy/fm/department/service/impl/DepProjectServiceImpl.java
  9. 59 1
      fm-person/src/main/java/com/persagy/fm/department/service/impl/DepartmentServiceImpl.java
  10. 16 0
      fm-person/src/main/java/com/persagy/fm/depproject/dao/DepProjectMapper.java
  11. 56 0
      fm-person/src/main/java/com/persagy/fm/depproject/model/ConvertDepProjectTool.java
  12. 32 0
      fm-person/src/main/java/com/persagy/fm/depproject/model/DepProject.java
  13. 27 0
      fm-person/src/main/java/com/persagy/fm/depproject/model/dto/AddDepProjectDTO.java
  14. 20 0
      fm-person/src/main/java/com/persagy/fm/depproject/model/dto/DeleteDepProjectDTO.java
  15. 27 0
      fm-person/src/main/java/com/persagy/fm/depproject/model/dto/PageQueryDepProjectDTO.java
  16. 22 0
      fm-person/src/main/java/com/persagy/fm/depproject/model/dto/QueryDepProjectDTO.java
  17. 20 0
      fm-person/src/main/java/com/persagy/fm/depproject/model/dto/QueryDepProjectDetailDTO.java
  18. 31 0
      fm-person/src/main/java/com/persagy/fm/depproject/model/dto/UpdateDepProjectDTO.java
  19. 106 0
      fm-person/src/main/java/com/persagy/fm/depproject/service/IDepProjectService.java
  20. 224 0
      fm-person/src/main/java/com/persagy/fm/depproject/service/impl/DepProjectServiceImpl.java
  21. 15 31
      fm-person/src/main/java/com/persagy/fm/person/controller/PersonController.java
  22. 22 0
      fm-person/src/main/java/com/persagy/fm/person/dao/PersonMapper.java
  23. 3 3
      fm-person/src/main/java/com/persagy/fm/person/model/ConvertPersonTool.java
  24. 5 0
      fm-person/src/main/java/com/persagy/fm/person/model/Person.java
  25. 3 83
      fm-person/src/main/java/com/persagy/fm/person/model/dto/AddPersonDTO.java
  26. 0 22
      fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryPersonByDepDTO.java
  27. 10 32
      fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryPersonDTO.java
  28. 4 84
      fm-person/src/main/java/com/persagy/fm/person/model/dto/UpdatePersonDTO.java
  29. 97 0
      fm-person/src/main/java/com/persagy/fm/person/model/dto/UpsertPersonDTO.java
  30. 10 30
      fm-person/src/main/java/com/persagy/fm/person/service/IPersonService.java
  31. 12 0
      fm-person/src/main/java/com/persagy/fm/person/service/IPersonTransBatchHandler.java
  32. 110 155
      fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonServiceImpl.java
  33. 36 0
      fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonTransBatchHandlerImpl.java
  34. 58 0
      fm-person/src/main/java/com/persagy/fm/saas/account/client/SaasAccountClient.java
  35. 16 0
      fm-person/src/main/java/com/persagy/fm/saas/account/client/fallback/SaasAccountClientFallbackFactory.java
  36. 31 0
      fm-person/src/main/java/com/persagy/fm/saas/account/constant/enums/AccountBelongEnum.java
  37. 40 0
      fm-person/src/main/java/com/persagy/fm/saas/account/constant/enums/AccountTypeEnum.java
  38. 28 0
      fm-person/src/main/java/com/persagy/fm/saas/account/model/dto/AddSaasAccountDTO.java
  39. 21 0
      fm-person/src/main/java/com/persagy/fm/saas/account/model/dto/QuerySaasAccountDTO.java
  40. 29 0
      fm-person/src/main/java/com/persagy/fm/saas/account/model/dto/UpdateSaasAccountDTO.java
  41. 29 0
      fm-person/src/main/java/com/persagy/fm/saas/account/model/vo/SaasAccountListItemVO.java
  42. 1 1
      fm-person/src/main/java/com/persagy/fm/saas/project/constant/FeignClientNameConstants.java
  43. 31 0
      fm-person/src/main/java/com/persagy/fm/workresume/constant/enums/WorkResumeStateEnum.java
  44. 1 1
      fm-person/src/main/java/com/persagy/fm/workresume/model/WorkResume.java
  45. 6 9
      fm-person/src/main/java/com/persagy/fm/workresume/model/dto/AddWorkResumeDTO.java
  46. 1 1
      fm-person/src/main/java/com/persagy/fm/workresume/model/dto/PageQueryWorkResumeDTO.java
  47. 1 1
      fm-person/src/main/java/com/persagy/fm/workresume/model/dto/QueryWorkResumeDTO.java
  48. 1 1
      fm-person/src/main/java/com/persagy/fm/workresume/model/dto/UpdateWorkResumeDTO.java
  49. 8 2
      fm-person/src/main/java/com/persagy/fm/workresume/service/impl/WorkResumeServiceImpl.java
  50. 16 0
      fm-person/src/main/resources/mapper/DepProjectMapper.xml
  51. 35 0
      fm-person/src/main/resources/mapper/PersonMapper.xml
  52. 6 0
      pom.xml

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

@@ -1,22 +1,25 @@
 package com.persagy.fm.department.controller;
 
 import com.persagy.fm.common.constant.enums.BoolEnum;
+import com.persagy.fm.common.response.*;
 import com.persagy.fm.department.model.ConvertDepartmentTool;
 import com.persagy.fm.department.model.Department;
+import com.persagy.fm.department.model.dto.*;
 import com.persagy.fm.department.model.vo.ResponseDepartmentItemVO;
 import com.persagy.fm.department.model.vo.ResponseDepartmentListItemVO;
 import com.persagy.fm.department.model.vo.ResponseDepartmentTreeItemVO;
-import com.persagy.fm.department.service.IDepProjectService;
 import com.persagy.fm.department.service.IDepTreeService;
 import com.persagy.fm.department.service.IDepartmentService;
-
 import com.persagy.fm.department.utils.DepDataUtil;
+import com.persagy.fm.depproject.service.IDepProjectService;
 import com.persagy.fm.saas.project.model.vo.ProjectTreeItemVO;
-import org.springframework.beans.factory.annotation.Autowired;
+import com.persagy.fm.translate.model.Trans;
+import com.persagy.fm.translate.model.TransType;
+import com.persagy.fm.translate.model.Transes;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import com.persagy.fm.department.model.dto.*;
-import com.persagy.fm.common.response.*;
+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;
@@ -24,11 +27,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-
 import javax.validation.Valid;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -61,13 +61,43 @@ public class DepartmentController {
 
     @ApiOperation(value = "部门详情")
     @PostMapping("/get")
+    // TODO: 2021/3/24 使用翻译器
+    @Transes({
+            @Trans(source = "com.persagy.fm.person.service.IPersonTransBatchHandler",
+                    type = TransType.SERVICE, result = "name", batch = true,
+                    condition = "id", parameter = "managers", target = "managersShowName"),
+            @Trans(source = "com.persagy.fm.person.service.IPersonTransBatchHandler",
+                    type = TransType.SERVICE, result = "name", batch = true,
+                    condition = "id", parameter = "projectIds", target = "projectsShowName")
+    })
     public FmResponseItem<ResponseDepartmentItemVO> queryDepartmentDetail(
             @Valid @RequestBody QueryDepartmentDetailDTO queryDepartmentDetailDTO) {
         Department department = departmentService.queryDepartmentDetail(queryDepartmentDetailDTO.getId());
         ResponseDepartmentItemVO responseDepartmentItemVO = ConvertDepartmentTool.INSTANCE.convert2ResponseItemDTO(department);
+        // 部门负责人转换为列表
+        String managers = department.getManagers();
+        List<Long> managerIdList = change2ManagerIdList(managers);
+        responseDepartmentItemVO.setManagers(managerIdList);
         return FmResponseUtil.successItem(responseDepartmentItemVO);
     }
 
+    /**
+     * 将部门负责人转换为负责人id列表
+     *
+     * @param managers 负责人id字符串:id,id,id
+     * @return 负责人id列表
+     * @author lixing
+     * @version V1.0 2021/3/24 11:09 上午
+     */
+    private List<Long> change2ManagerIdList(String managers) {
+        if (StringUtils.isNotBlank(managers)) {
+            String[] managersArray = managers.split(",");
+            List<String> managerStrList = Arrays.asList(managersArray);
+            return managerStrList.stream().map(Long::valueOf).collect(Collectors.toList());
+        }
+        return null;
+    }
+
 
     @ApiOperation(value = "更新部门")
     @PostMapping("/update")

+ 1 - 0
fm-person/src/main/java/com/persagy/fm/department/model/ConvertDepartmentTool.java

@@ -31,6 +31,7 @@ public interface ConvertDepartmentTool {
      * @author lixing
      * @version V1.0 2021-03-11 15:09:19
      */
+    @Mapping(source = "managers", ignore = true, target = "managers")
     ResponseDepartmentItemVO convert2ResponseItemDTO(Department department);
 
     /**

+ 1 - 4
fm-person/src/main/java/com/persagy/fm/department/model/Department.java

@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
 
 /**
  * 部门(Department)实体类
@@ -41,9 +42,6 @@ public class Department extends AuditableEntity<Department> implements Serializa
     @ApiModelProperty("编制人数")
     private Integer staffCount;
 
-    @ApiModelProperty("关联的项目")
-    private String projectIds;
-
     public static String PROP_NAME = "name";
     public static String PROP_TYPE = "type";
     public static String PROP_PARENT_ID = "parent_id";
@@ -51,5 +49,4 @@ public class Department extends AuditableEntity<Department> implements Serializa
     public static String PROP_MANAGERS = "managers";
     public static String PROP_FULL_PATH = "full_path";
     public static String PROP_STAFF_COUNT = "staff_count";
-    public static String PROP_PROJECT_IDS = "project_ids";
 }

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

@@ -10,6 +10,8 @@ import javax.validation.constraints.Pattern;
 import lombok.Data;
 import org.hibernate.validator.constraints.Length;
 
+import java.util.List;
+
 /**
  * @author lixing
  * @version V1.0 2021-03-11 15:09:18
@@ -32,15 +34,18 @@ public class AddDepartmentDTO {
     @NotNull(message = "上级部门id不能为空")
     private Long parentId;
 
-    @ApiModelProperty(value = "数据来源", required = true)
+    @ApiModelProperty(value = "数据来源")
     private String resourceFrom;
 
-    @ApiModelProperty(value = "负责人", required = true)
+    @ApiModelProperty(value = "负责人")
     private String managers;
 
-    @ApiModelProperty(value = "部门全路径", required = true)
+    @ApiModelProperty(value = "部门全路径")
     private String fullPath;
 
-    @ApiModelProperty(value = "编制人数", required = true)
+    @ApiModelProperty(value = "编制人数")
     private Integer staffCount;
+
+    @ApiModelProperty(value = "关联项目")
+    private List<String> projectIds;
 }

+ 11 - 6
fm-person/src/main/java/com/persagy/fm/department/model/dto/UpdateDepartmentDTO.java

@@ -10,6 +10,8 @@ import javax.validation.constraints.Pattern;
 import lombok.Data;
 import org.hibernate.validator.constraints.Length;
 
+import java.util.List;
+
 /**
  * @author lixing
  * @version V1.0 2021-03-11 15:09:18
@@ -27,21 +29,24 @@ public class UpdateDepartmentDTO {
             message = "部门名称" + RegexConstants.NAME_REGEX_WARNING)
     private String name;
 
-    @ApiModelProperty(value = "部门类型", required = true)
+    @ApiModelProperty(value = "部门类型")
     private String type;
 
-    @ApiModelProperty(value = "上级部门id", required = true)
+    @ApiModelProperty(value = "上级部门id")
     private String parentId;
 
-    @ApiModelProperty(value = "数据来源", required = true)
+    @ApiModelProperty(value = "数据来源")
     private String resourceFrom;
 
-    @ApiModelProperty(value = "负责人", required = true)
+    @ApiModelProperty(value = "负责人")
     private String managers;
 
-    @ApiModelProperty(value = "部门全路径", required = true)
+    @ApiModelProperty(value = "部门全路径")
     private String fullPath;
 
-    @ApiModelProperty(value = "编制人数", required = true)
+    @ApiModelProperty(value = "编制人数")
     private Integer staffCount;
+
+    @ApiModelProperty(value = "关联的项目")
+    private List<String> projectIds;
 }

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

@@ -2,9 +2,11 @@ package com.persagy.fm.department.model.vo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
 import lombok.Data;
 
 import java.util.Date;
+import java.util.List;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 
@@ -31,8 +33,11 @@ public class ResponseDepartmentItemVO {
     @ApiModelProperty("数据来源")
     private String resourceFrom;
 
-    @ApiModelProperty("负责人")
-    private String managers;
+    @ApiModelProperty("负责人id")
+    private List<Long> managers;
+
+    @ApiModelProperty("负责人姓名")
+    private List<String> managersShowName;
 
     @ApiModelProperty("部门全路径")
     private String fullPath;
@@ -55,4 +60,9 @@ public class ResponseDepartmentItemVO {
     @ApiModelProperty("最后修改时间")
     private Date modifiedTime;
 
+    @ApiModelProperty(value="关联的项目")
+    private List<String> projectIds;
+
+    @ApiModelProperty(value="关联的项目名称")
+    private List<String> projectsShowName;
 }

+ 0 - 24
fm-person/src/main/java/com/persagy/fm/department/service/IDepProjectService.java

@@ -1,24 +0,0 @@
-package com.persagy.fm.department.service;
-
-import com.persagy.fm.saas.project.model.vo.ProjectTreeItemVO;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-/**
- * 部门关联的项目接口
- *
- * @author lixing
- * @version V1.0 2021/3/22 11:54 上午
- **/
-public interface IDepProjectService {
-    /**
-     * 获取部门关联的项目树
-     *
-     * @param depId 部门id
-     * @return 部门关联的项目树
-     * @author lixing
-     * @version V1.0 2021/3/22 3:58 下午
-     */
-    List<ProjectTreeItemVO> queryDepProjectTree(Long depId);
-}

+ 0 - 28
fm-person/src/main/java/com/persagy/fm/department/service/impl/DepProjectServiceImpl.java

@@ -1,28 +0,0 @@
-package com.persagy.fm.department.service.impl;
-
-import com.persagy.fm.department.service.IDepProjectService;
-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 java.util.List;
-
-/**
- * 部门关联的项目service层
- *
- * @author lixing
- * @version V1.0 2021/3/22 11:54 上午
- **/
-@Service
-public class DepProjectServiceImpl implements IDepProjectService {
-    @Autowired
-    ISaasProjectService saasProjectService;
-    @Override
-    public List<ProjectTreeItemVO> queryDepProjectTree(Long depId) {
-        // 部门id 为 0, 加载整颗区域项目树,否则根据部门id查询部门关联的项目,然后组装项目树
-        // TODO: 2021/3/22 查询部门关联的项目
-        List<String> projectIds = null;
-        return saasProjectService.queryProjectTree(projectIds);
-    }
-}

+ 59 - 1
fm-person/src/main/java/com/persagy/fm/department/service/impl/DepartmentServiceImpl.java

@@ -21,7 +21,10 @@ import com.persagy.fm.department.model.dto.PageQueryDepartmentDTO;
 import com.persagy.fm.department.model.dto.QueryDepartmentDTO;
 import com.persagy.fm.department.model.dto.UpdateDepartmentDTO;
 import com.persagy.fm.department.service.IDepartmentService;
+import com.persagy.fm.depproject.model.dto.AddDepProjectDTO;
+import com.persagy.fm.depproject.service.IDepProjectService;
 import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -38,10 +41,46 @@ import java.util.stream.Collectors;
 @Service
 public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Department>
         implements IDepartmentService {
+    @Autowired
+    private IDepProjectService depProjectService;
 
     @Override
     @Transactional
     public Long createDepartment(AddDepartmentDTO addDepartmentDTO) {
+        Department department = saveDepartment(addDepartmentDTO);
+
+        // 保存部门和项目的关系
+        List<String> projectIds = addDepartmentDTO.getProjectIds();
+        Long depId = department.getId();
+        saveDepProject(projectIds, depId);
+
+        return depId;
+    }
+
+    private void saveDepProject(List<String> projectIds, Long depId) {
+        if (CollectionUtils.isEmpty(projectIds)) {
+            return;
+        }
+
+        List<AddDepProjectDTO> depProjectAddDtoList = Lists.newArrayList();
+        for (String projectId : projectIds) {
+            AddDepProjectDTO addDepProjectDTO = new AddDepProjectDTO();
+            addDepProjectDTO.setDepId(depId);
+            addDepProjectDTO.setProjectId(projectId);
+            depProjectAddDtoList.add(addDepProjectDTO);
+        }
+        depProjectService.saveBatch(depProjectAddDtoList);
+    }
+
+    /**
+     * 部门数据入库
+     *
+     * @param addDepartmentDTO 创建部门入参
+     * @return 部门实体对象
+     * @author lixing
+     * @version V1.0 2021/3/24 10:26 上午
+     */
+    private Department saveDepartment(AddDepartmentDTO addDepartmentDTO) {
         // 校验部门名称重复
         checkDuplicateDeptName(addDepartmentDTO);
         // 同一集团下只能有一个类型为集团的部门
@@ -62,9 +101,10 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         }
 
         save(department);
-        return department.getId();
+        return department;
     }
 
+
     /**
      * 校验同一集团下是否只有一个类型为集团的部门
      *
@@ -146,6 +186,24 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
         }
         department.setModifier(RequiredParamsStorage.getUserId());
         updateById(department);
+        Long depId = department.getId();
+        List<String> projectIds = updateDepartmentDTO.getProjectIds();
+        updateDepProject(projectIds, depId);
+    }
+
+    /**
+     * 更新部门关联的项目
+     *
+     * @param projectIds 更新后部门关联的项目
+     * @param depId 部门id
+     * @author lixing
+     * @version V1.0 2021/3/24 10:51 上午
+     */
+    private void updateDepProject(List<String> projectIds, Long depId) {
+        // 删除之前部门关联的项目
+        depProjectService.deleteByDepId(depId);
+        // 插入新的部门关联的项目
+        saveDepProject(projectIds, depId);
     }
 
     /**

+ 16 - 0
fm-person/src/main/java/com/persagy/fm/depproject/dao/DepProjectMapper.java

@@ -0,0 +1,16 @@
+package com.persagy.fm.depproject.dao;
+
+import com.persagy.fm.depproject.model.DepProject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 部门项目(DepProject)dao层
+ *
+ * @author lixing
+ * @version V1.0 2021-03-24 10:08:12
+ */
+@Mapper
+public interface DepProjectMapper extends BaseMapper<DepProject> {
+
+}

+ 56 - 0
fm-person/src/main/java/com/persagy/fm/depproject/model/ConvertDepProjectTool.java

@@ -0,0 +1,56 @@
+package com.persagy.fm.depproject.model;
+
+import com.persagy.fm.depproject.model.dto.AddDepProjectDTO;
+import com.persagy.fm.depproject.model.dto.UpdateDepProjectDTO;
+import org.mapstruct.Mapper;
+import org.mapstruct.MappingTarget;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.NullValueMappingStrategy;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 部门项目(DepProject) dto、vo、do转换工具类
+ *
+ * @author lixing
+ * @version V1.0 2021-03-24 10:08:14 2021-03-24 10:08:14
+ */
+@Mapper(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT,
+        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
+public interface ConvertDepProjectTool {
+
+    ConvertDepProjectTool INSTANCE = Mappers.getMapper(ConvertDepProjectTool.class);
+
+    /**
+     * addDTO转换为do
+     *
+     * @param addDepProjectDTO addDTO
+     * @return 要创建的do对象
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:14
+     */
+    DepProject convertAddDto2Entity(AddDepProjectDTO addDepProjectDTO);
+
+    /**
+     * updateDTO转换为实体
+     *
+     * @param depProject          更新前的do对象
+     * @param updateDepProjectDTO updateDTO
+     * @return 更新后的do对象
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:14
+     */
+    DepProject convertUpdateDto2Entity(@MappingTarget DepProject depProject, UpdateDepProjectDTO updateDepProjectDTO);
+
+    /**
+     * addDTO列表转换为do列表
+     *
+     * @param addDepProjectDTOList addDTO列表
+     * @return do列表
+     * @author lixing
+     * @version V1.0 2021/3/24 10:22 上午
+     */
+    List<DepProject> convert2EntityList(List<AddDepProjectDTO> addDepProjectDTOList);
+}
+

+ 32 - 0
fm-person/src/main/java/com/persagy/fm/depproject/model/DepProject.java

@@ -0,0 +1,32 @@
+package com.persagy.fm.depproject.model;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.persagy.fm.common.model.entity.AuditableEntity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 部门项目(DepProject)实体类
+ *
+ * @author lixing
+ * @version V1.0 2021-03-24 10:08:13
+ */
+@Data
+@ApiModel(description = "部门项目")
+public class DepProject extends AuditableEntity<DepProject> implements Serializable {
+    private static final long serialVersionUID = -75010347897886577L;
+
+    @ApiModelProperty("部门id")
+    private Long depId;
+
+    @ApiModelProperty("项目id")
+    private String projectId;
+
+
+    public static String PROP_DEP_ID = "dep_id";
+    public static String PROP_PROJECT_ID = "project_id";
+
+}

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

@@ -0,0 +1,27 @@
+package com.persagy.fm.depproject.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author lixing
+ * @version V1.0 2021-03-24 10:08:13
+ */
+@Data
+@ApiModel(value = "创建部门项目入参")
+public class AddDepProjectDTO {
+    @ApiModelProperty(value = "部门id", required = true)
+    @NotNull(message = "部门id不能为空") 
+    private Long depId;
+
+    @ApiModelProperty(value = "项目id", required = true)
+    @NotNull(message = "项目id不能为空") 
+    private String projectId;
+
+}

+ 20 - 0
fm-person/src/main/java/com/persagy/fm/depproject/model/dto/DeleteDepProjectDTO.java

@@ -0,0 +1,20 @@
+package com.persagy.fm.depproject.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-24 10:08:13
+ */
+@Data
+@ApiModel(value = "删除部门项目入参")
+public class DeleteDepProjectDTO {
+    @NotNull(message = "id不能为空")
+    @ApiModelProperty(value = "主键", required = true)
+    private Long id;
+
+}

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

@@ -0,0 +1,27 @@
+package com.persagy.fm.depproject.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+import com.persagy.fm.common.model.dto.PageDTO;
+import lombok.Data;
+
+/**
+ * @author lixing
+ * @version V1.0 2021-03-24 10:08:14
+ */
+@Data
+@ApiModel(value = "分页查询部门项目入参")
+public class PageQueryDepProjectDTO extends PageDTO {
+    @ApiModelProperty(value = "主键", required = true)
+    private Long id;
+
+    @ApiModelProperty(value = "部门id", required = true)
+    private Long depId;
+
+    @ApiModelProperty(value = "项目id", required = true)
+    private Long projectId;
+
+}

+ 22 - 0
fm-person/src/main/java/com/persagy/fm/depproject/model/dto/QueryDepProjectDTO.java

@@ -0,0 +1,22 @@
+package com.persagy.fm.depproject.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author lixing
+ * @version V1.0 2021-03-24 10:08:14
+ */
+@Data
+@ApiModel(value = "查询部门项目入参")
+public class QueryDepProjectDTO {
+    @ApiModelProperty(value = "部门id", required = true)
+    private Long depId;
+
+    @ApiModelProperty(value = "项目id", required = true)
+    private Long projectId;
+
+}

+ 20 - 0
fm-person/src/main/java/com/persagy/fm/depproject/model/dto/QueryDepProjectDetailDTO.java

@@ -0,0 +1,20 @@
+package com.persagy.fm.depproject.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-24 10:08:13
+ */
+@Data
+@ApiModel(value = "获取部门项目详情入参")
+public class QueryDepProjectDetailDTO {
+    @NotNull(message = "主键不能为空")
+    @ApiModelProperty(value = "主键", required = true)
+    private Long id;
+
+}

+ 31 - 0
fm-person/src/main/java/com/persagy/fm/depproject/model/dto/UpdateDepProjectDTO.java

@@ -0,0 +1,31 @@
+package com.persagy.fm.depproject.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author lixing
+ * @version V1.0 2021-03-24 10:08:13
+ */
+@Data
+@ApiModel(value = "更新部门项目入参")
+public class UpdateDepProjectDTO {
+    @ApiModelProperty(value = "主键", required = true)
+    @NotNull(message = "主键不能为空") // todo 更新校验规则
+    private Long id;
+
+    @ApiModelProperty(value = "部门id", required = true)
+    @NotNull(message = "部门id不能为空") // todo 更新校验规则
+    private Long depId;
+
+    @ApiModelProperty(value = "项目id", required = true)
+    @NotNull(message = "项目id不能为空") // todo 更新校验规则
+    private Long projectId;
+
+}

+ 106 - 0
fm-person/src/main/java/com/persagy/fm/depproject/service/IDepProjectService.java

@@ -0,0 +1,106 @@
+package com.persagy.fm.depproject.service;
+
+import com.persagy.fm.depproject.model.*;
+import com.persagy.fm.depproject.model.dto.*;
+
+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接口
+ *
+ * @author lixing
+ * @version V1.0 2021-03-24 10:08:12
+ */
+public interface IDepProjectService {
+
+    /**
+     * 创建部门项目
+     *
+     * @param addDepProjectDTO addDTO
+     * @return 部门项目主键
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    Long createDepProject(AddDepProjectDTO addDepProjectDTO);
+
+    /**
+     * 部门项目详情
+     *
+     * @param id 主键
+     * @return 部门项目do对象
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    DepProject queryDepProjectDetail(Long id);
+
+    /**
+     * 更新部门项目
+     *
+     * @param updateDepProjectDTO updateDTO
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    void updateDepProject(UpdateDepProjectDTO updateDepProjectDTO);
+
+    /**
+     * 删除部门项目
+     *
+     * @param id 主键
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    void deleteDepProject(Long id);
+
+    /**
+     * 查询部门项目
+     *
+     * @param queryDepProjectDTO queryDTO
+     * @return List<DepProject>
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    List<DepProject> queryDepProjectList(QueryDepProjectDTO queryDepProjectDTO);
+
+    /**
+     * 分页查询部门项目
+     *
+     * @param pageQueryDepProjectDTO pageQueryDTO
+     * @return IPage<DepProject>
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    IPage<DepProject> pageQueryDepProject(PageQueryDepProjectDTO pageQueryDepProjectDTO);
+
+    /**
+     * 获取部门关联的项目树
+     *
+     * @param depId 部门id
+     * @return 部门关联的项目树
+     * @author lixing
+     * @version V1.0 2021/3/22 3:58 下午
+     */
+    List<ProjectTreeItemVO> queryDepProjectTree(Long depId);
+
+    /**
+     * 批量保存部门关联的项目
+     *
+     * @param addDepProjectDtoList 批量保存入参
+     * @author lixing
+     * @version V1.0 2021/3/24 10:16 上午
+     */
+    void saveBatch(List<AddDepProjectDTO> addDepProjectDtoList);
+
+    /**
+     * 删除部门关联的项目
+     *
+     * @param depId 部门id
+     * @author lixing
+     * @version V1.0 2021/3/24 10:48 上午
+     */
+    void deleteByDepId(Long depId);
+}

+ 224 - 0
fm-person/src/main/java/com/persagy/fm/depproject/service/impl/DepProjectServiceImpl.java

@@ -0,0 +1,224 @@
+package com.persagy.fm.depproject.service.impl;
+
+import com.persagy.fm.common.model.RequiredParamsStorage;
+import com.persagy.fm.depproject.dao.DepProjectMapper;
+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 org.apache.commons.lang.StringUtils;
+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 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层
+ *
+ * @author lixing
+ * @version V1.0 2021-03-24 10:08:12
+ */
+@Service
+public class DepProjectServiceImpl extends ServiceImpl<DepProjectMapper, DepProject>
+        implements IDepProjectService {
+    @Autowired
+    ISaasProjectService saasProjectService;
+
+    @Override
+    public List<ProjectTreeItemVO> queryDepProjectTree(Long depId) {
+        // 部门id 为 0, 加载整颗区域项目树,否则根据部门id查询部门关联的项目,然后组装项目树
+        // TODO: 2021/3/22 查询部门关联的项目
+        List<String> projectIds = null;
+        return saasProjectService.queryProjectTree(projectIds);
+    }
+
+    @Override
+    public void saveBatch(List<AddDepProjectDTO> addDepProjectDTOList) {
+        List<DepProject> depProjectList = ConvertDepProjectTool.INSTANCE.convert2EntityList(addDepProjectDTOList);
+        for (DepProject depProject : depProjectList) {
+            setDefaultValue(depProject);
+        }
+        saveBatch(depProjectList);
+    }
+
+    @Override
+    public void deleteByDepId(Long depId) {
+        QueryDepProjectDTO queryDepProjectDTO = new QueryDepProjectDTO();
+        queryDepProjectDTO.setDepId(depId);
+        List<DepProject> depProjectList = queryDepProjectList(queryDepProjectDTO);
+        removeByIds(depProjectList);
+    }
+
+    /**
+     * 创建部门项目
+     *
+     * @return Long 部门项目主键
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    @Override
+    public Long createDepProject(AddDepProjectDTO addDepProjectDTO) {
+        DepProject depProject = ConvertDepProjectTool.INSTANCE.convertAddDto2Entity(addDepProjectDTO);
+        // 设置默认值
+        setDefaultValue(depProject);
+        save(depProject);
+        return depProject.getId();
+    }
+
+    /**
+     * 如果某些字段没有赋值,使用默认的值
+     *
+     * @param depProject 部门项目实体
+     * @author lixing
+     * @version V1.0 2021/3/12 12:29 下午
+     */
+    private void setDefaultValue(DepProject depProject) {
+        depProject.setCreator(RequiredParamsStorage.getUserId());
+    }
+
+    /**
+     * 部门项目详情
+     *
+     * @param id 主键
+     * @return 部门do类
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    @Override
+    public DepProject queryDepProjectDetail(Long id) {
+        DepProject depProject = getById(id);
+        if (depProject == null) {
+            throw new IllegalArgumentException("查看DepProject详情时发生异常,找不到要查看的记录,id=" + id);
+        }
+        return depProject;
+    }
+
+    /**
+     * 更新部门项目
+     *
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    @Override
+    public void updateDepProject(UpdateDepProjectDTO updateDepProjectDTO) {
+        DepProject depProject = getById(updateDepProjectDTO.getId());
+        depProject = ConvertDepProjectTool.INSTANCE.convertUpdateDto2Entity(depProject, updateDepProjectDTO);
+        depProject.setModifier(RequiredParamsStorage.getUserId());
+        updateById(depProject);
+    }
+
+    /**
+     * 校验部门项目是否可删除
+     *
+     * @param id 部门项目主键
+     * @return 部门项目do类
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    public DepProject checkDeletable(Long id) {
+        if (id == null) {
+            throw new IllegalArgumentException("删除DepProject时发生异常,主键为空");
+        }
+
+        DepProject depProject = getById(id);
+
+        if (depProject == null) {
+            throw new IllegalArgumentException("删除DepProject时发生异常,找不到要删除的数据,id:" + id);
+        }
+
+        return depProject;
+    }
+
+    /**
+     * 删除部门项目
+     *
+     * @param id 主键
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    @Override
+    public void deleteDepProject(Long id) {
+        // 校验是否可删除
+        DepProject depProject = checkDeletable(id);
+
+        depProject.setValid(ValidEnum.FALSE.getType());
+        updateById(depProject);
+    }
+
+    /**
+     * 查询部门项目
+     *
+     * @return List<DepProject>
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    @Override
+    public List<DepProject> queryDepProjectList(QueryDepProjectDTO queryDepProjectDTO) {
+        QueryWrapper<DepProject> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(DepProject.PROP_VALID, ValidEnum.TRUE.getType());
+        // 默认按创建时间倒序排序
+        queryWrapper.orderBy(true, false, DepProject.PROP_CREATIONTIME);
+
+        if (queryDepProjectDTO != null) {
+
+            if (queryDepProjectDTO.getDepId() != null) {
+                queryWrapper.eq(DepProject.PROP_DEP_ID, queryDepProjectDTO.getDepId());
+            }
+
+            if (queryDepProjectDTO.getProjectId() != null) {
+                queryWrapper.eq(DepProject.PROP_PROJECT_ID, queryDepProjectDTO.getProjectId());
+            }
+
+        }
+
+        return list(queryWrapper);
+    }
+
+    /**
+     * 分页查询部门项目
+     *
+     * @return IPage<DepProject>
+     * @author lixing
+     * @version V1.0 2021-03-24 10:08:12
+     */
+    @Override
+    public IPage<DepProject> pageQueryDepProject(PageQueryDepProjectDTO pageQueryDepProjectDTO) {
+        QueryWrapper<DepProject> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(DepProject.PROP_VALID, ValidEnum.TRUE.getType());
+        // 这里认为pageQueryDTO是经过校验的,肯定包含分页信息
+        IPage<DepProject> pageParam = new Page<>(pageQueryDepProjectDTO.getPage(), pageQueryDepProjectDTO.getSize(), true);
+        // 排序信息
+        if (CollectionUtils.isEmpty(pageQueryDepProjectDTO.getOrders())) {
+            // 默认按创建时间倒序排序
+            queryWrapper.orderBy(true, false, DepProject.PROP_CREATIONTIME);
+        } else {
+            List<Sort> orders = pageQueryDepProjectDTO.getOrders();
+            for (Sort sort : orders) {
+                // 将驼峰转换为下划线格式
+                sort.setColumn(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, sort.getColumn()));
+                queryWrapper.orderBy(true, sort.isAsc(), sort.getColumn());
+            }
+        }
+
+        if (pageQueryDepProjectDTO.getDepId() != null) {
+            queryWrapper.eq(DepProject.PROP_DEP_ID, pageQueryDepProjectDTO.getDepId());
+        }
+
+        if (pageQueryDepProjectDTO.getProjectId() != null) {
+            queryWrapper.eq(DepProject.PROP_PROJECT_ID, pageQueryDepProjectDTO.getProjectId());
+        }
+
+        return getBaseMapper().selectPage(pageParam, queryWrapper);
+    }
+}

+ 15 - 31
fm-person/src/main/java/com/persagy/fm/person/controller/PersonController.java

@@ -1,5 +1,6 @@
 package com.persagy.fm.person.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.persagy.fm.department.model.dto.DeleteDepartmentDTO;
 import com.persagy.fm.person.model.vo.SimplePersonListItemVO;
 import com.persagy.fm.person.service.IPersonProjectService;
@@ -73,16 +74,6 @@ public class PersonController {
         return FmResponseUtil.successMsg("删除成功");
     }
 
-
-    @ApiOperation(value = "人员列表")
-    @PostMapping("/query")
-    public FmResponseContent<List<ResponsePersonListItemVO>> queryPerson(
-            @Valid @RequestBody QueryPersonDTO queryPersonDTO) {
-        List<Person> personList = personService.queryPersonList(queryPersonDTO);
-        List<ResponsePersonListItemVO> resultList = ConvertPersonTool.INSTANCE.convert2List(personList);
-        return FmResponseUtil.successContent(resultList);
-    }
-
     @ApiOperation(value = "查找人名")
     @PostMapping("/name_quick_search")
     public FmResponseContent<List<SimplePersonListItemVO>> nameQuickSearch(
@@ -93,29 +84,22 @@ public class PersonController {
     }
 
 
-    //@ApiOperation(value = "人员列表, 分页查询")
-    //@PostMapping("/query")
-    //public FmResponseContent<List<ResponsePersonListItemVO>> queryPerson(
-    //        @Valid @RequestBody PageQueryPersonDTO pageQueryPersonDTO) {
-    //    IPage<ResponsePersonListItemVO> pagedList = personService.pageQueryPerson(pageQueryPersonDTO);
-    //    IPage<ResponsePersonListItemVO> pagedResultList = pagedList.convert(item -> {
-    //        try {
-    //           return ConvertPersonTool.INSTANCE.convert2ResponseListItemDTO(item);
-    //        } catch (Exception e) {
-    //            throw new IllegalArgumentException("分页查询,Person实体类转换为列表对象发生异常", e);
-    //        }
-    //    });
-    //    return FmResponseUtil.successContent(pagedResultList);;
-    //}
-
-    @ApiOperation(value = "重置密码")
-    @PostMapping("/password/reset")
-    public FmResponseMsg resetPassword(
-            @Valid @RequestBody DeletePersonDTO deletePersonDTO) {
-        personService.resetPassWord(deletePersonDTO.getId());
-        return FmResponseUtil.successMsg("重置成功");
+    @ApiOperation(value = "人员列表, 分页查询")
+    @PostMapping("/query")
+    public FmResponseContent<List<ResponsePersonListItemVO>> queryPerson(
+            @Valid @RequestBody PageQueryPersonDTO pageQueryPersonDTO) {
+        IPage<ResponsePersonListItemVO> pagedList = personService.pageQueryPerson(pageQueryPersonDTO);
+        return FmResponseUtil.successContent(pagedList);
     }
 
+//    @ApiOperation(value = "重置密码")
+//    @PostMapping("/password/reset")
+//    public FmResponseMsg resetPassword(
+//            @Valid @RequestBody DeletePersonDTO deletePersonDTO) {
+//        personService.resetPassWord(deletePersonDTO.getId());
+//        return FmResponseUtil.successMsg("重置成功");
+//    }
+
     @ApiOperation(value = "禁用人员")
     @PostMapping("/disable")
     public FmResponseItem<FmResponseUpsertVO> disablePerson(

+ 22 - 0
fm-person/src/main/java/com/persagy/fm/person/dao/PersonMapper.java

@@ -2,8 +2,12 @@ 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.PageQueryPersonDTO;
+import com.persagy.fm.person.model.dto.QueryPersonDTO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * 人员(Person)dao层
  *
@@ -12,5 +16,23 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface PersonMapper extends BaseMapper<Person> {
+    /**
+     * 查询人员列表
+     *
+     * @param pageQueryPersonDTO 分页查询条件
+     * @return 人员列表
+     * @author lixing
+     * @version V1.0 2021/3/23 5:14 下午
+     */
+    List<Person> queryPersonList(PageQueryPersonDTO pageQueryPersonDTO);
 
+    /**
+     * 查询人员数量
+     *
+     * @param pageQueryPersonDTO 分页查询条件
+     * @return 人员总条数
+     * @author lixing
+     * @version V1.0 2021/3/23 5:14 下午
+     */
+    int queryCount(PageQueryPersonDTO pageQueryPersonDTO);
 }

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

@@ -2,7 +2,7 @@ package com.persagy.fm.person.model;
 
 import com.persagy.fm.person.jms.model.AccountCreateMsg;
 import com.persagy.fm.person.model.dto.AddPersonDTO;
-import com.persagy.fm.person.model.dto.PageQueryPersonByDepDTO;
+import com.persagy.fm.person.model.dto.PageQueryPersonDTO;
 import com.persagy.fm.person.model.dto.UpdatePersonDTO;
 import com.persagy.fm.person.model.vo.ResponsePersonItemVO;
 import com.persagy.fm.person.model.vo.ResponsePersonListItemVO;
@@ -79,12 +79,12 @@ public interface ConvertPersonTool {
     /**
      * 分页查询部门下的人员入参转换为查询工作信息入参
      *
-     * @param pageQueryPersonByDepDTO 分页查询部门下的人员入参
+     * @param pageQueryPersonDTO 分页查询部门下的人员入参
      * @return 查询工作信息入参
      * @author lixing
      * @version V1.0 2021/3/15 5:32 下午
      */
-    PageQueryWorkResumeDTO convert2PageQueryWorkResumeDTO(PageQueryPersonByDepDTO pageQueryPersonByDepDTO);
+    PageQueryWorkResumeDTO convert2PageQueryWorkResumeDTO(PageQueryPersonDTO pageQueryPersonDTO);
 
     /**
      * 账号创建消息转换为创建人员入参

+ 5 - 0
fm-person/src/main/java/com/persagy/fm/person/model/Person.java

@@ -4,6 +4,7 @@ import com.persagy.fm.common.model.entity.AuditableEntity;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -14,6 +15,7 @@ import java.util.Date;
  * @author lixing
  * @version V1.0 2021-03-15 17:20:32
  */
+@EqualsAndHashCode(callSuper = true)
 @Data
 @ApiModel(description = "人员")
 public class Person extends AuditableEntity<Person> implements Serializable {
@@ -22,6 +24,9 @@ public class Person extends AuditableEntity<Person> implements Serializable {
     @ApiModelProperty("姓名")
     private String name;
 
+    @ApiModelProperty("姓名拼音")
+    private String namePinyin;
+
     @ApiModelProperty("账号")
     private String username;
 

+ 3 - 83
fm-person/src/main/java/com/persagy/fm/person/model/dto/AddPersonDTO.java

@@ -1,96 +1,16 @@
 package com.persagy.fm.person.model.dto;
 
 import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-import javax.validation.constraints.NotNull;
-
 import lombok.Data;
-import org.hibernate.validator.constraints.Length;
-
-import java.util.Date;
-import java.util.List;
+import lombok.EqualsAndHashCode;
 
 /**
  * @author lixing
  * @version V1.0 2021-03-15 17:20:32
  */
+@EqualsAndHashCode(callSuper = true)
 @Data
 @ApiModel(value = "创建人员入参")
-public class AddPersonDTO {
-    @ApiModelProperty(value = "姓名", required = true)
-    @NotNull(message = "姓名不能为空")
-    @Length(max = 20, message = "姓名长度不能大于20")
-    // TODO: 2021/3/22 只能输入文本格式
-    private String name;
-
-    // TODO: 2021/3/22 数字和字母
-    @Length(max = 50, message = "工号长度不能大于50")
-    @ApiModelProperty(value = "工号")
-    private String jobNumber;
-
-    @ApiModelProperty(value = "生日")
-    private Date birthday;
-
-    @ApiModelProperty(value = "性别")
-    private Integer gender;
-
-    @ApiModelProperty(value = "员工类型")
-    private String type;
-
-    // TODO: 2021/3/22 手机号码合法校验
-    @Length(max = 11, message = "手机号码长度不能大于11")
-    @ApiModelProperty(value = "手机号码")
-    private String phoneNum;
-
-    @ApiModelProperty(value = "证件类型")
-    private String certificateType;
-
-    // TODO: 2021/3/22 身份证合法校验
-    @Length(max = 11, message = "证件号码长度不能大于18")
-    @ApiModelProperty(value = "证件号码")
-    private String idNumber;
-
-    // TODO: 2021/3/22 邮箱合法校验
-    @ApiModelProperty(value = "邮箱")
-    private String mail;
-
-    @Length(max = 50, message = "备注长度不能大于50")
-    @ApiModelProperty(value = "备注")
-    private String remark;
-
-    @NotNull(message = "部门不能为空")
-    @ApiModelProperty(value = "所属部门id", required = true)
-    private List<Long> depIds;
-
-    @NotNull(message = "项目权限不能为空")
-    @ApiModelProperty(value = "关联的项目id", required = true)
-    private List<String> projectIds;
-
-    @ApiModelProperty(value = "主岗")
-    private String mainDuty;
-
-    @ApiModelProperty(value = "副岗")
-    private List<String> otherDuties;
-
-    @ApiModelProperty(value = "直接上级")
-    private Long leader;
-
-    @ApiModelProperty(value = "专业")
-    private String profession;
-
-    @ApiModelProperty(value = "附加权限")
-    private List<String> otherRoles;
-
-    // TODO: 2021/3/22 不包含中文,不包含指定字符外的特殊字符,不包含空格
-    @Length(max = 30, message = "账号长度不能大于30")
-    @ApiModelProperty(value = "账号", required = true)
-    @NotNull(message = "账号不能为空")
-    private String username;
-
-    @ApiModelProperty("登录权限(年.月.日/永久)")
-    private String expireDate;
+public class AddPersonDTO extends UpsertPersonDTO{
 
-    @ApiModelProperty(value = "账号来源", required = true)
-    private String userFrom;
 }

+ 0 - 22
fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryPersonByDepDTO.java

@@ -1,22 +0,0 @@
-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;
-
-/**
- * @author lixing
- * @version V1.0 2021-03-15 17:20:33
- */
-@Data
-@ApiModel(value = "分页查询部门下的人员入参")
-public class PageQueryPersonByDepDTO extends PageDTO {
-
-    @ApiModelProperty(value = "部门id", required = true)
-    private Long depId;
-
-    @ApiModelProperty(value = "在职状态")
-    private Integer state;
-
-}

+ 10 - 32
fm-person/src/main/java/com/persagy/fm/person/model/dto/PageQueryPersonDTO.java

@@ -1,48 +1,26 @@
 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 java.util.Date;
-
-import com.persagy.fm.common.model.dto.PageDTO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 /**
  * @author lixing
  * @version V1.0 2021-03-15 17:20:33
  */
+@EqualsAndHashCode(callSuper = true)
 @Data
-@ApiModel(value = "分页查询人员入参")
+@ApiModel(value = "分页查询部门下的人员入参")
 public class PageQueryPersonDTO extends PageDTO {
-    @ApiModelProperty(value = "id", required = true)
-    private Long id;
-
-    @ApiModelProperty(value = "姓名", required = true)
-    private String name;
-
-    @ApiModelProperty(value = "账号", required = true)
-    private String username;
 
-    @ApiModelProperty(value = "证件号码", required = true)
-    private String idNumber;
+    @ApiModelProperty(value = "部门id", required = true)
+    private Long depId;
 
-    @ApiModelProperty(value = "性别", required = true)
-    private Integer gender;
-
-    @ApiModelProperty(value = "生日", required = true)
-    private Date birthday;
-
-    @ApiModelProperty(value = "第三方账号", required = true)
-    private String otherAccount;
-
-    @ApiModelProperty(value = "账号来源", required = true)
-    private String userFrom;
-
-    @ApiModelProperty(value = "备注", required = true)
-    private String remark;
-
-    @ApiModelProperty(value = "专业", required = true)
-    private String profession;
+    @ApiModelProperty(value = "在职状态")
+    private Integer state;
 
+    @ApiModelProperty(value = "姓名", required = true)
+    private String name;
 }

+ 4 - 84
fm-person/src/main/java/com/persagy/fm/person/model/dto/UpdatePersonDTO.java

@@ -2,100 +2,20 @@ package com.persagy.fm.person.model.dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-
-import javax.validation.constraints.NotNull;
-
 import lombok.Data;
-import org.hibernate.validator.constraints.Length;
+import lombok.EqualsAndHashCode;
 
-import java.util.Date;
-import java.util.List;
+import javax.validation.constraints.NotNull;
 
 /**
  * @author lixing
  * @version V1.0 2021-03-15 17:20:32
  */
+@EqualsAndHashCode(callSuper = true)
 @Data
 @ApiModel(value = "更新人员入参")
-public class UpdatePersonDTO {
+public class UpdatePersonDTO extends UpsertPersonDTO{
     @ApiModelProperty(value = "id", required = true)
     @NotNull(message = "id不能为空") 
     private Long id;
-
-    @ApiModelProperty(value = "姓名", required = true)
-    @NotNull(message = "姓名不能为空")
-    @Length(max = 20, message = "姓名长度不能大于20")
-    // TODO: 2021/3/22 只能输入文本格式
-    private String name;
-
-    // TODO: 2021/3/22 数字和字母
-    @Length(max = 50, message = "工号长度不能大于50")
-    @ApiModelProperty(value = "工号")
-    private String jobNumber;
-
-    @ApiModelProperty(value = "生日")
-    private Date birthday;
-
-    @ApiModelProperty(value = "性别")
-    private Integer gender;
-
-    @ApiModelProperty(value = "员工类型")
-    private String type;
-
-    // TODO: 2021/3/22 手机号码合法校验
-    @Length(max = 11, message = "手机号码长度不能大于11")
-    @ApiModelProperty(value = "手机号码")
-    private String phoneNum;
-
-    @ApiModelProperty(value = "证件类型")
-    private String certificateType;
-
-    // TODO: 2021/3/22 身份证合法校验
-    @Length(max = 11, message = "证件号码长度不能大于18")
-    @ApiModelProperty(value = "证件号码")
-    private String idNumber;
-
-    // TODO: 2021/3/22 邮箱合法校验
-    @ApiModelProperty(value = "邮箱")
-    private String mail;
-
-    @Length(max = 50, message = "备注长度不能大于50")
-    @ApiModelProperty(value = "备注")
-    private String remark;
-
-    @NotNull(message = "部门不能为空")
-    @ApiModelProperty(value = "所属部门id", required = true)
-    private List<Long> depIds;
-
-    @NotNull(message = "项目权限不能为空")
-    @ApiModelProperty(value = "关联的项目id", required = true)
-    private List<String> projectIds;
-
-    @ApiModelProperty(value = "主岗")
-    private String mainDuty;
-
-    @ApiModelProperty(value = "副岗")
-    private List<String> otherDuties;
-
-    @ApiModelProperty(value = "直接上级")
-    private Long leader;
-
-    @ApiModelProperty(value = "专业")
-    private String profession;
-
-    @ApiModelProperty(value = "附加权限")
-    private List<String> otherRoles;
-
-    // TODO: 2021/3/22 不包含中文,不包含指定字符外的特殊字符,不包含空格
-    @Length(max = 30, message = "账号长度不能大于30")
-    @ApiModelProperty(value = "账号", required = true)
-    @NotNull(message = "账号不能为空")
-    private String username;
-
-    @ApiModelProperty("登录权限(年.月.日/永久)")
-    private String expireDate;
-
-    @ApiModelProperty(value = "账号来源", required = true)
-    private String userFrom;
-
 }

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

@@ -0,0 +1,97 @@
+package com.persagy.fm.person.model.dto;
+
+import com.persagy.fm.common.constant.RegexConstants;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.Email;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 创建和更新人员基类
+ *
+ * @author lixing
+ * @version V1.0 2021/3/23 11:09 上午
+ **/
+@Data
+public class UpsertPersonDTO {
+    @ApiModelProperty(value = "姓名", required = true)
+    @NotNull(message = "姓名不能为空")
+    @Length(max = 20, message = "姓名长度不能大于20")
+    @Pattern(regexp = RegexConstants.TEXT_REGEX, message = "姓名" + RegexConstants.TEXT_REGEX_WARNING)
+    private String name;
+
+    @Pattern(regexp = RegexConstants.EN_NUM_REGEX, message = "工号" + RegexConstants.EN_NUM_REGEX_WARNING)
+    @Length(max = 50, message = "工号长度不能大于50")
+    @ApiModelProperty(value = "工号")
+    private String jobNumber;
+
+    @ApiModelProperty(value = "生日")
+    private Date birthday;
+
+    @ApiModelProperty(value = "性别")
+    private Integer gender;
+
+    @ApiModelProperty(value = "员工类型")
+    private String type;
+
+    @Pattern(regexp = RegexConstants.PHONE_REGEX, message = RegexConstants.PHONE_REGEX_WARNING)
+    @Length(max = 11, message = "手机号码长度不能大于11")
+    @ApiModelProperty(value = "手机号码")
+    private String phoneNum;
+
+    @ApiModelProperty(value = "证件类型")
+    private String certificateType;
+
+    @Pattern(regexp = RegexConstants.ID_CARD_REGEX, message = RegexConstants.ID_CARD_REGEX_WARNING)
+    @Length(max = 11, message = "证件号码长度不能大于18")
+    @ApiModelProperty(value = "证件号码")
+    private String idNumber;
+
+    @Email(message = RegexConstants.EMAIL_REGEX_WARNING)
+    @ApiModelProperty(value = "邮箱")
+    private String mail;
+
+    @Length(max = 50, message = "备注长度不能大于50")
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @NotNull(message = "部门不能为空")
+    @ApiModelProperty(value = "所属部门id", required = true)
+    private List<Long> depIds;
+
+    @NotNull(message = "项目权限不能为空")
+    @ApiModelProperty(value = "关联的项目id", required = true)
+    private List<String> projectIds;
+
+    @ApiModelProperty(value = "主岗")
+    private String mainDuty;
+
+    @ApiModelProperty(value = "副岗")
+    private List<String> otherDuties;
+
+    @ApiModelProperty(value = "直接上级")
+    private Long leader;
+
+    @ApiModelProperty(value = "专业")
+    private String profession;
+
+    @ApiModelProperty(value = "附加权限")
+    private List<String> otherRoles;
+
+    @Pattern(regexp = RegexConstants.EN_NUM_CHAR_REGEX, message = "账号" + RegexConstants.EN_NUM_CHAR_REGEX_WARNING)
+    @Length(max = 30, message = "账号长度不能大于30")
+    @ApiModelProperty(value = "账号", required = true)
+    @NotNull(message = "账号不能为空")
+    private String username;
+
+    @ApiModelProperty("登录权限(年.月.日)")
+    private Date expireDate;
+
+    @ApiModelProperty(value = "账号来源", required = true)
+    private String userFrom;
+}

+ 10 - 30
fm-person/src/main/java/com/persagy/fm/person/service/IPersonService.java

@@ -54,26 +54,6 @@ public interface IPersonService {
     void deletePerson(Long id);
 
     /**
-     * 查询人员
-     *
-     * @param queryPersonDTO queryDTO
-     * @return List<Person>
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
-    List<Person> queryPersonList(QueryPersonDTO queryPersonDTO);
-
-    /**
-     * 根据部门id分页查询部门下的人员
-     *
-     * @param pageQueryPersonByDepDTO 分页查询部门下的人员入参
-     * @return 直属部门下的人员
-     * @author lixing
-     * @version V1.0 2021/3/15 5:21 下午
-     */
-    IPage<ResponsePersonListItemVO> pageQueryPersonListByDepId(PageQueryPersonByDepDTO pageQueryPersonByDepDTO);
-
-    /**
      * 分页查询人员
      *
      * @param pageQueryPersonDTO pageQueryDTO
@@ -81,16 +61,16 @@ public interface IPersonService {
      * @author lixing
      * @version V1.0 2021-03-15 17:20:31
      */
-    IPage<Person> pageQueryPerson(PageQueryPersonDTO pageQueryPersonDTO);
-
-    /**
-     * 重置人员账号的密码
-     *
-     * @param personId 人员id
-     * @author lixing
-     * @version V1.0 2021/3/22 10:28 上午
-     */
-    void resetPassWord(Long personId);
+    IPage<ResponsePersonListItemVO> pageQueryPerson(PageQueryPersonDTO pageQueryPersonDTO);
+
+//    /**
+//     * 重置人员账号的密码
+//     *
+//     * @param personId 人员id
+//     * @author lixing
+//     * @version V1.0 2021/3/22 10:28 上午
+//     */
+//    void resetPassWord(Long personId);
 
     /**
      * 禁用人员

+ 12 - 0
fm-person/src/main/java/com/persagy/fm/person/service/IPersonTransBatchHandler.java

@@ -0,0 +1,12 @@
+package com.persagy.fm.person.service;
+
+import com.persagy.fm.translate.service.ITranslateBatchHandle;
+
+/**
+ * 人员翻译器
+ *
+ * @author lixing
+ * @version V1.0 2021/3/24 11:21 上午
+ **/
+public interface IPersonTransBatchHandler extends ITranslateBatchHandle {
+}

+ 110 - 155
fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonServiceImpl.java

@@ -1,5 +1,6 @@
 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.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -8,21 +9,31 @@ import com.google.common.base.CaseFormat;
 import com.persagy.fm.common.constant.enums.ValidEnum;
 import com.persagy.fm.common.model.RequiredParamsStorage;
 import com.persagy.fm.common.model.dto.Sort;
+import com.persagy.fm.common.response.FmResponseContent;
 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.ResponsePersonListItemVO;
 import com.persagy.fm.person.service.IPersonService;
+import com.persagy.fm.saas.account.client.SaasAccountClient;
+import com.persagy.fm.saas.account.constant.enums.AccountBelongEnum;
+import com.persagy.fm.saas.account.constant.enums.AccountTypeEnum;
+import com.persagy.fm.saas.account.model.dto.AddSaasAccountDTO;
+import com.persagy.fm.saas.account.model.dto.QuerySaasAccountDTO;
+import com.persagy.fm.saas.account.model.vo.SaasAccountListItemVO;
 import com.persagy.fm.workresume.model.WorkResume;
+import com.persagy.fm.workresume.model.dto.AddWorkResumeDTO;
 import com.persagy.fm.workresume.model.dto.PageQueryWorkResumeDTO;
 import com.persagy.fm.workresume.service.IWorkResumeService;
 import org.apache.commons.lang.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.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -37,6 +48,10 @@ public class PersonServiceImpl extends ServiceImpl<PersonMapper, Person>
         implements IPersonService {
     @Autowired
     private IWorkResumeService workResumeService;
+    @Autowired
+    private SaasAccountClient saasAccountClient;
+    @Autowired
+    private PersonMapper personMapper;
 
     /**
      * 创建人员
@@ -46,13 +61,99 @@ public class PersonServiceImpl extends ServiceImpl<PersonMapper, Person>
      * @version V1.0 2021-03-15 17:20:31
      */
     @Override
+    @Transactional
     public Long createPerson(AddPersonDTO addPersonDTO) {
+        // 判断账号是否被占用
+        checkUserName(addPersonDTO.getUsername());
+        // 创建账号
+        String accountId = createAccount(addPersonDTO);
+        // 保存人员
+        Person person = savePerson(addPersonDTO, accountId);
+        // 创建人员工作信息
+        saveWorkResumes(addPersonDTO, person.getId());
+        // 账号关联项目
+        // TODO: 2021/3/23
+        // 账号关联角色
+        // TODO: 2021/3/23
+        return person.getId();
+    }
+
+    /**
+     * 保存人员的工作信息
+     *
+     * @param addPersonDTO 创建人员入参
+     * @param personId 人员id
+     * @author lixing
+     * @version V1.0 2021/3/23 4:23 下午
+     */
+    private void saveWorkResumes(AddPersonDTO addPersonDTO, Long personId) {
+        List<Long> depIds = addPersonDTO.getDepIds();
+        for (Long depId : depIds) {
+            AddWorkResumeDTO addWorkResumeDTO = new AddWorkResumeDTO();
+            addWorkResumeDTO.setPersonId(personId);
+            addWorkResumeDTO.setDepId(depId);
+            workResumeService.createWorkResume(addWorkResumeDTO);
+        }
+    }
+
+    /**
+     * 保存人员信息到数据库
+     *
+     * @param addPersonDTO 创建人员入参
+     * @param accountId 账号id
+     * @return 保存后的人员对象
+     * @author lixing
+     * @version V1.0 2021/3/23 4:06 下午
+     */
+    private Person savePerson(AddPersonDTO addPersonDTO, String accountId) {
         Person person = ConvertPersonTool.INSTANCE.convertAddDto2Entity(addPersonDTO);
         checkDuplicate(addPersonDTO);
+        person.setNamePinyin(PinyinUtil.getPinyin(person.getName(), ""));
+        person.setAccountId(accountId);
         // 设置默认值
         setDefaultValue(person);
         save(person);
-        return person.getId();
+        return person;
+    }
+
+    /**
+     * 创建账号
+     *
+     * @param addPersonDTO 创建人员入参
+     * @return 账号id
+     * @author lixing
+     * @version V1.0 2021/3/23 3:42 下午
+     */
+    private String createAccount(AddPersonDTO addPersonDTO) {
+        AddSaasAccountDTO addSaasAccountDTO = new AddSaasAccountDTO();
+        addSaasAccountDTO.setAccountBelong(AccountBelongEnum.BUSINESS.getType());
+        addSaasAccountDTO.setGroupCode(RequiredParamsStorage.getGroupCode());
+        addSaasAccountDTO.setAppId(RequiredParamsStorage.getAppId());
+        addSaasAccountDTO.setUsername(addPersonDTO.getUsername());
+        addSaasAccountDTO.setPhoneNum(addPersonDTO.getPhoneNum());
+        addSaasAccountDTO.setMail(addPersonDTO.getMail());
+        addSaasAccountDTO.setAccountType(AccountTypeEnum.COMMON.getType());
+        addSaasAccountDTO.setValidStartTime(new Date());
+        addSaasAccountDTO.setValidEndTime(addPersonDTO.getExpireDate());
+        FmResponseContent<String> saasAccount = saasAccountClient.createSaasAccount(addSaasAccountDTO);
+        return saasAccount.getContent();
+    }
+
+    /**
+     * 检查账号有没有被使用
+     *
+     * @param username 账号
+     * @author lixing
+     * @version V1.0 2021/3/23 3:15 下午
+     */
+    private void checkUserName(String username) {
+        QuerySaasAccountDTO querySaasAccountDTO = new QuerySaasAccountDTO();
+        querySaasAccountDTO.setGroupCode(RequiredParamsStorage.getGroupCode());
+        querySaasAccountDTO.setUsername(username);
+        FmResponseContent<List<SaasAccountListItemVO>> listFmResponseContent = saasAccountClient.querySaasAccountList(querySaasAccountDTO);
+        if (listFmResponseContent.getCount() > 0) {
+            throw new IllegalArgumentException("账号已被使用");
+        }
     }
 
     /**
@@ -77,8 +178,6 @@ public class PersonServiceImpl extends ServiceImpl<PersonMapper, Person>
      */
     private void setDefaultValue(Person person) {
         person.setCreator(RequiredParamsStorage.getUserId());
-        // todo 其他默认的属性
-
     }
 
     /**
@@ -150,166 +249,22 @@ public class PersonServiceImpl extends ServiceImpl<PersonMapper, Person>
         updateById(person);
     }
 
-    /**
-     * 查询人员
-     *
-     * @return List<Person>
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
     @Override
-    public List<Person> queryPersonList(QueryPersonDTO queryPersonDTO) {
-        QueryWrapper<Person> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq(Person.PROP_VALID, ValidEnum.TRUE.getType());
-        // 默认按创建时间倒序排序
-        queryWrapper.orderBy(true, false, Person.PROP_CREATIONTIME);
-
-        if (queryPersonDTO != null) {
-
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryPersonDTO.getName())) {
-                queryWrapper.like(Person.PROP_NAME, queryPersonDTO.getName());
-            }
-
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryPersonDTO.getUsername())) {
-                queryWrapper.like(Person.PROP_USERNAME, queryPersonDTO.getUsername());
-            }
-
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryPersonDTO.getIdNumber())) {
-                queryWrapper.like(Person.PROP_ID_NUMBER, queryPersonDTO.getIdNumber());
-            }
-
-            if (queryPersonDTO.getGender() != null) {
-                queryWrapper.eq(Person.PROP_GENDER, queryPersonDTO.getGender());
-            }
-
-            if (queryPersonDTO.getBirthday() != null) {
-                queryWrapper.eq(Person.PROP_BIRTHDAY, queryPersonDTO.getBirthday());
-            }
-
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryPersonDTO.getUserFrom())) {
-                queryWrapper.like(Person.PROP_USER_FROM, queryPersonDTO.getUserFrom());
-            }
-
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryPersonDTO.getRemark())) {
-                queryWrapper.like(Person.PROP_REMARK, queryPersonDTO.getRemark());
-            }
-
-            // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryPersonDTO.getProfession())) {
-                queryWrapper.like(Person.PROP_PROFESSION, queryPersonDTO.getProfession());
-            }
-
-        }
-
-        return list(queryWrapper);
-    }
-
-    @Override
-    public IPage<ResponsePersonListItemVO> pageQueryPersonListByDepId(PageQueryPersonByDepDTO pageQueryPersonByDepDTO) {
-        // 根据工作信息获取部门下的人员
-        PageQueryWorkResumeDTO pageQueryWorkResumeDTO = ConvertPersonTool.INSTANCE.
-                convert2PageQueryWorkResumeDTO(pageQueryPersonByDepDTO);
-        IPage<WorkResume> workResumePagedList = workResumeService.pageQueryWorkResume(pageQueryWorkResumeDTO);
-        List<WorkResume> workResumeList = workResumePagedList.getRecords();
-
-        /* 将工作信息转换为人员信息 */
-        if (CollectionUtils.isEmpty(workResumeList)) {
-            IPage<ResponsePersonListItemVO> result = new Page<>();
-            result.setRecords(Lists.newArrayList());
-            result.setTotal(0);
-            return result;
-        }
-
-        // 获取人员的基本信息
-        List<Long> personIdList = workResumeList.stream().map(WorkResume::getPersonId).collect(Collectors.toList());
-        List<Person> people = listByIds(personIdList);
-
-        // TODO: 2021/3/15  获取账号的信息
-
+    public IPage<ResponsePersonListItemVO> pageQueryPerson(PageQueryPersonDTO pageQueryPersonDTO) {
+        List<Person> people = personMapper.queryPersonList(pageQueryPersonDTO);
+        int total = personMapper.queryCount(pageQueryPersonDTO);
+        // TODO: 2021/3/23 翻译器
         // 数据转换
         List<ResponsePersonListItemVO> responsePersonListItems = ConvertPersonTool.INSTANCE.convert2List(people);
         IPage<ResponsePersonListItemVO> result = new Page<>();
         result.setRecords(responsePersonListItems);
-        result.setTotal(workResumePagedList.getTotal());
+        result.setTotal(total);
         return result;
     }
 
-    /**
-     * 分页查询人员
-     *
-     * @return IPage<Person>
-     * @author lixing
-     * @version V1.0 2021-03-15 17:20:31
-     */
-    @Override
-    public IPage<Person> pageQueryPerson(PageQueryPersonDTO pageQueryPersonDTO) {
-        QueryWrapper<Person> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq(Person.PROP_VALID, ValidEnum.TRUE.getType());
-        // 这里认为pageQueryDTO是经过校验的,肯定包含分页信息
-        IPage<Person> pageParam = new Page<>(pageQueryPersonDTO.getPage(), pageQueryPersonDTO.getSize(), true);
-        // 排序信息
-        if (CollectionUtils.isEmpty(pageQueryPersonDTO.getOrders())) {
-            // 默认按创建时间倒序排序
-            queryWrapper.orderBy(true, false, Person.PROP_CREATIONTIME);
-        } else {
-            List<Sort> orders = pageQueryPersonDTO.getOrders();
-            for (Sort sort : orders) {
-                // 将驼峰转换为下划线格式
-                sort.setColumn(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, sort.getColumn()));
-                queryWrapper.orderBy(true, sort.isAsc(), sort.getColumn());
-            }
-        }
-
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryPersonDTO.getName())) {
-            queryWrapper.like(Person.PROP_NAME, pageQueryPersonDTO.getName());
-        }
-
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryPersonDTO.getUsername())) {
-            queryWrapper.like(Person.PROP_USERNAME, pageQueryPersonDTO.getUsername());
-        }
-
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryPersonDTO.getIdNumber())) {
-            queryWrapper.like(Person.PROP_ID_NUMBER, pageQueryPersonDTO.getIdNumber());
-        }
-
-        if (pageQueryPersonDTO.getGender() != null) {
-            queryWrapper.eq(Person.PROP_GENDER, pageQueryPersonDTO.getGender());
-        }
-
-        if (pageQueryPersonDTO.getBirthday() != null) {
-            queryWrapper.eq(Person.PROP_BIRTHDAY, pageQueryPersonDTO.getBirthday());
-        }
-
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryPersonDTO.getUserFrom())) {
-            queryWrapper.like(Person.PROP_USER_FROM, pageQueryPersonDTO.getUserFrom());
-        }
-
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryPersonDTO.getRemark())) {
-            queryWrapper.like(Person.PROP_REMARK, pageQueryPersonDTO.getRemark());
-        }
-
-        // todo 需判断使用like还是eq
-        if (StringUtils.isNotEmpty(pageQueryPersonDTO.getProfession())) {
-            queryWrapper.like(Person.PROP_PROFESSION, pageQueryPersonDTO.getProfession());
-        }
-
-        return getBaseMapper().selectPage(pageParam, queryWrapper);
-    }
-
-    @Override
-    public void resetPassWord(Long personId) {
-        // TODO: 2021/3/22 重置人员账号的密码
-    }
+//    @Override
+//    public void resetPassWord(Long personId) {
+//    }
 
     @Override
     public void disablePerson(Long personId) {

+ 36 - 0
fm-person/src/main/java/com/persagy/fm/person/service/impl/PersonTransBatchHandlerImpl.java

@@ -0,0 +1,36 @@
+package com.persagy.fm.person.service.impl;
+
+import com.persagy.fm.person.service.IPersonTransBatchHandler;
+import com.persagy.fm.translate.model.ITransWrapper;
+import com.persagy.fm.translate.model.TransMeta;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 人员翻译器
+ *
+ * @author lixing
+ * @version V1.0 2021/3/24 11:22 上午
+ **/
+public class PersonTransBatchHandlerImpl implements IPersonTransBatchHandler  {
+    @Override
+    public Map<String, Object> batchTrans(List<String> parameter) {
+        return null;
+    }
+
+    @Override
+    public ITransWrapper trans(ITransWrapper wrapper) {
+        return null;
+    }
+
+    @Override
+    public TransMeta getMeta() {
+        return null;
+    }
+
+    @Override
+    public void setMeta(TransMeta meta) {
+
+    }
+}

+ 58 - 0
fm-person/src/main/java/com/persagy/fm/saas/account/client/SaasAccountClient.java

@@ -0,0 +1,58 @@
+package com.persagy.fm.saas.account.client;
+
+import com.persagy.fm.common.client.FeignConfig;
+import com.persagy.fm.common.response.FmResponseContent;
+import com.persagy.fm.common.response.FmResponseMsg;
+import com.persagy.fm.saas.account.client.fallback.SaasAccountClientFallbackFactory;
+import com.persagy.fm.saas.account.model.dto.AddSaasAccountDTO;
+import com.persagy.fm.saas.account.model.dto.QuerySaasAccountDTO;
+import com.persagy.fm.saas.account.model.dto.UpdateSaasAccountDTO;
+import com.persagy.fm.saas.account.model.vo.SaasAccountListItemVO;
+import com.persagy.fm.saas.project.constant.FeignClientNameConstants;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
+
+/**
+ * 接口说明
+ *
+ * @author lixing
+ * @version V1.0 2021/3/22 2:13 下午
+ **/
+@FeignClient(name = FeignClientNameConstants.SAAS, fallbackFactory = SaasAccountClientFallbackFactory.class,
+        configuration = FeignConfig.class)
+public interface SaasAccountClient {
+    /**
+     * 查询账号列表
+     *
+     * @param querySaasAccountDTO 查询条件
+     * @return 账号列表
+     * @author lixing
+     * @version V1.0 2021/3/23 11:57 上午
+     */
+    @PostMapping("/saas-account/account/querySaasAccountList")
+    FmResponseContent<List<SaasAccountListItemVO>> querySaasAccountList(@RequestBody QuerySaasAccountDTO querySaasAccountDTO);
+
+    /**
+     * 创建账号
+     *
+     * @param addSaasAccountDTO 创建账号入参
+     * @return 账号id
+     * @author lixing
+     * @version V1.0 2021/3/23 11:57 上午
+     */
+    @PostMapping("/saas-account/account/createSaasAccount")
+    FmResponseContent<String> createSaasAccount(@RequestBody AddSaasAccountDTO addSaasAccountDTO);
+
+    /**
+     * 更新账号
+     *
+     * @param updateSaasAccountDTO 更新账号入参
+     * @author lixing
+     * @version V1.0 2021/3/23 11:57 上午
+     */
+    @PostMapping("/saas-account/account/createSaasAccount")
+    FmResponseMsg updateSaasAccount(@RequestBody UpdateSaasAccountDTO updateSaasAccountDTO);
+}

+ 16 - 0
fm-person/src/main/java/com/persagy/fm/saas/account/client/fallback/SaasAccountClientFallbackFactory.java

@@ -0,0 +1,16 @@
+package com.persagy.fm.saas.account.client.fallback;
+
+import com.persagy.fm.saas.account.client.SaasAccountClient;
+import feign.hystrix.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author drx
+ */
+@Component
+public class SaasAccountClientFallbackFactory implements FallbackFactory<SaasAccountClient> {
+    @Override
+    public SaasAccountClient create(Throwable throwable) {
+        return null;
+    }
+}

+ 31 - 0
fm-person/src/main/java/com/persagy/fm/saas/account/constant/enums/AccountBelongEnum.java

@@ -0,0 +1,31 @@
+package com.persagy.fm.saas.account.constant.enums;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 账号所属枚举类
+ *
+ * @author lixing
+ * @version V1.0 2021/3/23 3:17 下午
+ **/
+public enum AccountBelongEnum {
+    /**
+     * 账号所属
+     */
+    SAAS_PLATFORM("0", "运维系统"),
+    BUSINESS("1", "业务账号");
+
+    @Setter
+    @Getter
+    private String type;
+    @Setter
+    @Getter
+    private String desc;
+
+    AccountBelongEnum(String type, String desc) {
+        this.type = type;
+        this.desc = desc;
+    }
+
+}

+ 40 - 0
fm-person/src/main/java/com/persagy/fm/saas/account/constant/enums/AccountTypeEnum.java

@@ -0,0 +1,40 @@
+package com.persagy.fm.saas.account.constant.enums;
+
+/**
+ * 账号所属枚举类
+ *
+ * @author lixing
+ * @version V1.0 2021/3/23 3:17 下午
+ **/
+public enum AccountTypeEnum {
+    /**
+     * 账号所属
+     */
+    SUPER_ADMIN("0", "超级管理员"),
+    GROUP_ADMIN("1", "单集团管理员"),
+    COMMON("2", "普通账号");
+
+    private String type;
+    private String desc;
+
+    AccountTypeEnum(String type, String desc) {
+        this.type = type;
+        this.desc = desc;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+    public void setDesc(String desc) {
+        this.desc = desc;
+    }
+}

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

@@ -0,0 +1,28 @@
+package com.persagy.fm.saas.account.model.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 创建运维平台账号入参
+ *
+ * @author lixing
+ * @version V1.0 2021/3/23 11:55 上午
+ **/
+@Data
+public class AddSaasAccountDTO {
+    private String accountBelong;
+    private String groupCode;
+    private String accountType;
+    private String appId;
+    private String username;
+    private String password;
+    private String phoneNum;
+    private String accountSource;
+    private String mail;
+    private String headPortrait;
+    private Date validStartTime;
+    private Date validEndTime;
+    private String remark;
+}

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

@@ -0,0 +1,21 @@
+package com.persagy.fm.saas.account.model.dto;
+
+import lombok.Data;
+
+/**
+ * 查询运维平台账号入参
+ *
+ * @author lixing
+ * @version V1.0 2021/3/23 11:55 上午
+ **/
+@Data
+public class QuerySaasAccountDTO {
+    private String accountBelong;
+    private String groupCode;
+    private String accountId;
+    private String accountType;
+    private String appId;
+    private String username;
+    private String phoneNum;
+    private String accountSource;
+}

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

@@ -0,0 +1,29 @@
+package com.persagy.fm.saas.account.model.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 创建运维平台账号入参
+ *
+ * @author lixing
+ * @version V1.0 2021/3/23 11:55 上午
+ **/
+@Data
+public class UpdateSaasAccountDTO {
+    private String accountId;
+    private String accountBelong;
+    private String groupCode;
+    private String accountType;
+    private String appId;
+    private String username;
+    private String password;
+    private String phoneNum;
+    private String accountSource;
+    private String mail;
+    private String headPortrait;
+    private Date validStartTime;
+    private Date validEndTime;
+    private String remark;
+}

+ 29 - 0
fm-person/src/main/java/com/persagy/fm/saas/account/model/vo/SaasAccountListItemVO.java

@@ -0,0 +1,29 @@
+package com.persagy.fm.saas.account.model.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 运维平台账号列表对象
+ *
+ * @author lixing
+ * @version V1.0 2021/3/23 11:50 上午
+ **/
+@Data
+public class SaasAccountListItemVO {
+    private String accountBelong;
+    private String accountSource;
+    private String accountType;
+    private String appId;
+    private Date createTime;
+    private Date validEndTime;
+    private String groupCode;
+    private String headPortrait;
+    private String mail;
+    private String phoneNum;
+    private String remark;
+    private Date updateTime;
+    private Date validStartTime;
+    private String username;
+}

+ 1 - 1
fm-person/src/main/java/com/persagy/fm/saas/project/constant/FeignClientNameConstants.java

@@ -7,5 +7,5 @@ package com.persagy.fm.saas.project.constant;
  * @version V1.0 2021/3/22 2:15 下午
  **/
 public class FeignClientNameConstants {
-    public static final String SAAS = "saas";
+    public static final String SAAS = "saas-account";
 }

+ 31 - 0
fm-person/src/main/java/com/persagy/fm/workresume/constant/enums/WorkResumeStateEnum.java

@@ -0,0 +1,31 @@
+package com.persagy.fm.workresume.constant.enums;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 工作状态枚举类
+ *
+ * @author lixing
+ * @version V1.0 2021/3/23 4:16 下午
+ **/
+public enum WorkResumeStateEnum {
+    /**
+     * 工作状态
+     */
+    ON_JOB("0", "在职"),
+    DISMISS("1", "离职"),
+    DISABLE("2", "禁用");
+
+    @Setter
+    @Getter
+    private String type;
+    @Setter
+    @Getter
+    private String desc;
+
+    WorkResumeStateEnum(String type, String desc) {
+        this.type = type;
+        this.desc = desc;
+    }
+}

+ 1 - 1
fm-person/src/main/java/com/persagy/fm/workresume/model/WorkResume.java

@@ -26,7 +26,7 @@ public class WorkResume extends AuditableEntity<WorkResume> implements Serializa
     private Long depId;
 
     @ApiModelProperty("状态")
-    private Integer state;
+    private String state;
 
     @ApiModelProperty("入职时间")
     private Date hiredDate;

+ 6 - 9
fm-person/src/main/java/com/persagy/fm/workresume/model/dto/AddWorkResumeDTO.java

@@ -17,23 +17,20 @@ import java.util.Date;
 @ApiModel(value = "创建工作信息入参")
 public class AddWorkResumeDTO {
     @ApiModelProperty(value = "人员主键", required = true)
-    @NotNull(message = "人员主键不能为空") // todo 更新校验规则
+    @NotNull(message = "人员主键不能为空")
     private Long personId;
 
     @ApiModelProperty(value = "部门主键", required = true)
-    @NotNull(message = "部门主键不能为空") // todo 更新校验规则
+    @NotNull(message = "部门主键不能为空")
     private Long depId;
 
-    @ApiModelProperty(value = "状态", required = true)
-    @NotNull(message = "状态不能为空") // todo 更新校验规则
-    private Integer state;
+    @ApiModelProperty(value = "状态")
+    private String state;
 
-    @ApiModelProperty(value = "入职时间", required = true)
-    @NotNull(message = "入职时间不能为空") // todo 更新校验规则
+    @ApiModelProperty(value = "入职时间")
     private Date hiredDate;
 
-    @ApiModelProperty(value = "离职时间", required = true)
-    @NotNull(message = "离职时间不能为空") // todo 更新校验规则
+    @ApiModelProperty(value = "离职时间")
     private Date departureDate;
 
 }

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

@@ -25,7 +25,7 @@ public class PageQueryWorkResumeDTO extends PageDTO {
     private Long depId;
 
     @ApiModelProperty(value = "状态", required = true)
-    private Integer state;
+    private String state;
 
     @ApiModelProperty(value = "入职时间", required = true)
     private Date hiredDate;

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

@@ -20,7 +20,7 @@ public class QueryWorkResumeDTO {
     private Long depId;
 
     @ApiModelProperty(value = "状态", required = true)
-    private Integer state;
+    private String state;
 
     @ApiModelProperty(value = "入职时间", required = true)
     private Date hiredDate;

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

@@ -30,7 +30,7 @@ public class UpdateWorkResumeDTO {
 
     @ApiModelProperty(value = "状态", required = true)
     @NotNull(message = "状态不能为空") // todo 更新校验规则
-    private Integer state;
+    private String state;
 
     @ApiModelProperty(value = "入职时间", required = true)
     @NotNull(message = "入职时间不能为空") // todo 更新校验规则

+ 8 - 2
fm-person/src/main/java/com/persagy/fm/workresume/service/impl/WorkResumeServiceImpl.java

@@ -1,6 +1,7 @@
 package com.persagy.fm.workresume.service.impl;
 
 import com.persagy.fm.common.model.RequiredParamsStorage;
+import com.persagy.fm.workresume.constant.enums.WorkResumeStateEnum;
 import com.persagy.fm.workresume.model.ConvertWorkResumeTool;
 import com.persagy.fm.workresume.model.WorkResume;
 import com.persagy.fm.workresume.model.dto.AddWorkResumeDTO;
@@ -14,6 +15,7 @@ import org.springframework.stereotype.Service;
 import com.persagy.fm.common.constant.enums.ValidEnum;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 
+import java.util.Date;
 import java.util.List;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -57,8 +59,12 @@ public class WorkResumeServiceImpl extends ServiceImpl<WorkResumeMapper, WorkRes
      */
     private void setDefaultValue(WorkResume workResume) {
         workResume.setCreator(RequiredParamsStorage.getUserId());
-        // todo 其他默认的属性
-
+        if (workResume.getHiredDate() == null) {
+            workResume.setHiredDate(new Date());
+        }
+        if (workResume.getState() == null) {
+            workResume.setState(WorkResumeStateEnum.ON_JOB.getType());
+        }
     }
 
     /**

+ 16 - 0
fm-person/src/main/resources/mapper/DepProjectMapper.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.persagy.fm.depproject.dao.DepProjectDao">
+    <resultMap id="DepProjectMap" type="com.persagy.fm.depproject.model.DepProject">
+        <result column="id" property="id"/>
+        <result column="dep_id" property="depId"/>
+        <result column="project_id" property="projectId"/>
+        <result column="ts" property="ts"/>
+        <result column="creator" property="creator"/>
+        <result column="creation_time" property="creationTime"/>
+        <result column="modifier" property="modifier"/>
+        <result column="modified_time" property="modifiedTime"/>
+        <result column="valid" property="valid"/>
+    </resultMap>
+</mapper>
+

+ 35 - 0
fm-person/src/main/resources/mapper/PersonMapper.xml

@@ -19,5 +19,40 @@
         <result column="modified_time" property="modifiedTime"/>
         <result column="valid" property="valid"/>
     </resultMap>
+
+    <select id="queryPersonList" parameterType="com.persagy.fm.person.model.dto.PageQueryPersonDTO"
+            resultMap="personMap">
+        select p.id, p.name, p.profession
+        from person p,
+        work_resume w
+        where p.id = w.person_id
+        <if test="queryDto.depId != null">
+            and w.dep_id = #{queryDto.depId}
+        </if>
+        <if test="queryDto.state != null">
+            and w.state = #{queryDto.state}
+        </if>
+        <if test="queryDto.name != null">
+            and p.name = #{queryDto.name}
+        </if>
+        order by w.is_leader desc, p.name_pinyin
+    </select>
+
+    <select id="queryCount" parameterType="com.persagy.fm.person.model.dto.PageQueryPersonDTO"
+            resultType="int">
+        select count(*) total
+        from person p,
+        work_resume w
+        where p.id = w.person_id
+        <if test="queryDto.depId != null">
+            and w.dep_id = #{queryDto.depId}
+        </if>
+        <if test="queryDto.state != null">
+            and w.state = #{queryDto.state}
+        </if>
+        <if test="queryDto.name != null">
+            and p.name = #{queryDto.name}
+        </if>
+    </select>
 </mapper>
 

+ 6 - 0
pom.xml

@@ -54,5 +54,11 @@
             <artifactId>fm-common</artifactId>
             <version>${fm-common.version}</version>
         </dependency>
+        <!-- fm 翻译器 -->
+        <dependency>
+            <groupId>com.persagy</groupId>
+            <artifactId>fm-translate</artifactId>
+            <version>3.0.0</version>
+        </dependency>
     </dependencies>
 </project>