package cn.iocoder.yudao.module.system.service.dept;
|
|
import cn.hutool.core.collection.CollUtil;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSaveReqVO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO;
|
import cn.iocoder.yudao.module.system.dal.mysql.dept.PostMapper;
|
import jakarta.annotation.Resource;
|
import org.springframework.stereotype.Service;
|
import org.springframework.validation.annotation.Validated;
|
|
import java.util.Collection;
|
import java.util.Collections;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.ArrayList;
|
import java.util.LinkedHashMap;
|
|
import cn.iocoder.yudao.framework.common.exception.ServiceException;
|
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostImportExcelVO;
|
import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostImportRespVO;
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
|
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
|
|
/**
|
* 岗位 Service 实现类
|
*
|
* @author 超级管理员
|
*/
|
@Service
|
@Validated
|
public class PostServiceImpl implements PostService {
|
|
@Resource
|
private PostMapper postMapper;
|
|
@Override
|
public Long createPost(PostSaveReqVO createReqVO) {
|
// 校验正确性
|
validatePostForCreateOrUpdate(null, createReqVO.getName(), createReqVO.getCode());
|
|
// 插入岗位
|
PostDO post = BeanUtils.toBean(createReqVO, PostDO.class);
|
postMapper.insert(post);
|
return post.getId();
|
}
|
|
@Override
|
public void updatePost(PostSaveReqVO updateReqVO) {
|
// 校验正确性
|
validatePostForCreateOrUpdate(updateReqVO.getId(), updateReqVO.getName(), updateReqVO.getCode());
|
|
// 更新岗位
|
PostDO updateObj = BeanUtils.toBean(updateReqVO, PostDO.class);
|
postMapper.updateById(updateObj);
|
}
|
|
@Override
|
public void deletePost(Long id) {
|
// 校验是否存在
|
validatePostExists(id);
|
// 删除岗位
|
postMapper.deleteById(id);
|
}
|
|
@Override
|
public void deletePostList(List<Long> ids) {
|
postMapper.deleteByIds(ids);
|
}
|
|
private void validatePostForCreateOrUpdate(Long id, String name, String code) {
|
// 校验自己存在
|
validatePostExists(id);
|
// 校验岗位名的唯一性
|
validatePostNameUnique(id, name);
|
// 校验岗位编码的唯一性
|
validatePostCodeUnique(id, code);
|
}
|
|
private void validatePostNameUnique(Long id, String name) {
|
PostDO post = postMapper.selectByName(name);
|
if (post == null) {
|
return;
|
}
|
// 如果 id 为空,说明不用比较是否为相同 id 的岗位
|
if (id == null) {
|
throw exception(POST_NAME_DUPLICATE);
|
}
|
if (!post.getId().equals(id)) {
|
throw exception(POST_NAME_DUPLICATE);
|
}
|
}
|
|
private void validatePostCodeUnique(Long id, String code) {
|
PostDO post = postMapper.selectByCode(code);
|
if (post == null) {
|
return;
|
}
|
// 如果 id 为空,说明不用比较是否为相同 id 的岗位
|
if (id == null) {
|
throw exception(POST_CODE_DUPLICATE);
|
}
|
if (!post.getId().equals(id)) {
|
throw exception(POST_CODE_DUPLICATE);
|
}
|
}
|
|
private void validatePostExists(Long id) {
|
if (id == null) {
|
return;
|
}
|
if (postMapper.selectById(id) == null) {
|
throw exception(POST_NOT_FOUND);
|
}
|
}
|
|
@Override
|
public List<PostDO> getPostList(Collection<Long> ids) {
|
if (CollUtil.isEmpty(ids)) {
|
return Collections.emptyList();
|
}
|
return postMapper.selectByIds(ids);
|
}
|
|
@Override
|
public List<PostDO> getPostList(Collection<Long> ids, Collection<Integer> statuses) {
|
return postMapper.selectList(ids, statuses);
|
}
|
|
@Override
|
public PageResult<PostDO> getPostPage(PostPageReqVO reqVO) {
|
return postMapper.selectPage(reqVO);
|
}
|
|
@Override
|
public PostDO getPost(Long id) {
|
return postMapper.selectById(id);
|
}
|
|
@Override
|
public void validatePostList(Collection<Long> ids) {
|
if (CollUtil.isEmpty(ids)) {
|
return;
|
}
|
// 获得岗位信息
|
List<PostDO> posts = postMapper.selectByIds(ids);
|
Map<Long, PostDO> postMap = convertMap(posts, PostDO::getId);
|
// 校验
|
ids.forEach(id -> {
|
PostDO post = postMap.get(id);
|
if (post == null) {
|
throw exception(POST_NOT_FOUND);
|
}
|
if (!CommonStatusEnum.ENABLE.getStatus().equals(post.getStatus())) {
|
throw exception(POST_NOT_ENABLE, post.getName());
|
}
|
});
|
}
|
|
@Override
|
public PostImportRespVO importPostList(List<PostImportExcelVO> importPosts, boolean isUpdateSupport) {
|
if (CollUtil.isEmpty(importPosts)) {
|
throw exception(POST_IMPORT_LIST_IS_EMPTY);
|
}
|
PostImportRespVO respVO = PostImportRespVO.builder().createPostNames(new ArrayList<>())
|
.updatePostNames(new ArrayList<>()).failurePostNames(new LinkedHashMap<>()).build();
|
importPosts.forEach(importPost -> {
|
// 校验,判断是否有不符合的原因
|
try {
|
validatePostForCreateOrUpdate(null, importPost.getName(), importPost.getCode());
|
} catch (ServiceException ex) {
|
// 如果是重复异常,而且支持更新
|
if (isUpdateSupport && (POST_NAME_DUPLICATE.getCode().equals(ex.getCode()) || POST_CODE_DUPLICATE.getCode().equals(ex.getCode()))) {
|
// ignore
|
} else {
|
respVO.getFailurePostNames().put(importPost.getName(), ex.getMessage());
|
return;
|
}
|
}
|
|
// 判断如果存在,在进行更新
|
PostDO existPost = postMapper.selectByName(importPost.getName());
|
if (existPost == null) {
|
existPost = postMapper.selectByCode(importPost.getCode());
|
}
|
if (existPost == null) {
|
PostDO post = BeanUtils.toBean(importPost, PostDO.class);
|
postMapper.insert(post);
|
respVO.getCreatePostNames().add(importPost.getName());
|
return;
|
}
|
|
// 如果存在,判断是否允许更新
|
if (!isUpdateSupport) {
|
respVO.getFailurePostNames().put(importPost.getName(), "岗位名或编码已经存在");
|
return;
|
}
|
|
// 更新岗位
|
PostDO updatePost = BeanUtils.toBean(importPost, PostDO.class);
|
updatePost.setId(existPost.getId());
|
postMapper.updateById(updatePost);
|
respVO.getUpdatePostNames().add(importPost.getName());
|
});
|
return respVO;
|
}
|
}
|