|
@@ -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);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|