|
@@ -0,0 +1,244 @@
|
|
|
+package com.persagy.fm.department.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.google.common.base.CaseFormat;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+import com.persagy.common.enums.ResponseCode;
|
|
|
+import com.persagy.common.exception.BusinessException;
|
|
|
+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.department.constant.enums.ResourceFromEnum;
|
|
|
+import com.persagy.fm.department.dao.DepartmentMapper;
|
|
|
+import com.persagy.fm.department.model.ConvertDepartmentTool;
|
|
|
+import com.persagy.fm.department.model.Department;
|
|
|
+import com.persagy.fm.department.model.dto.AddDepartmentDTO;
|
|
|
+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 org.apache.commons.lang.StringUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 部门(Department) service层
|
|
|
+ *
|
|
|
+ * @author lixing
|
|
|
+ * @version V1.0 2021-03-11 15:10:35
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Department>
|
|
|
+ implements IDepartmentService {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Long createDepartment(AddDepartmentDTO addDepartmentDTO) {
|
|
|
+ // 校验部门名称重复
|
|
|
+ checkDuplicateDeptName(addDepartmentDTO);
|
|
|
+
|
|
|
+ Department department = ConvertDepartmentTool.INSTANCE.convertAddDto2Entity(addDepartmentDTO);
|
|
|
+
|
|
|
+ // 设置默认值
|
|
|
+ setDefaultValue(department);
|
|
|
+
|
|
|
+ save(department);
|
|
|
+ return department.getId();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 如果某些字段没有赋值,使用默认的值
|
|
|
+ *
|
|
|
+ * @param department 部门实体
|
|
|
+ * @author lixing
|
|
|
+ * @version V1.0 2021/3/12 12:29 下午
|
|
|
+ */
|
|
|
+ private void setDefaultValue(Department department) {
|
|
|
+ if (StringUtils.isBlank(department.getResourceFrom())) {
|
|
|
+ department.setResourceFrom(ResourceFromEnum.USER_CREATE.getType());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (department.getParentId() == null) {
|
|
|
+ department.setParentId(0L);
|
|
|
+ }
|
|
|
+
|
|
|
+ department.setCreator(RequiredParamsStorage.getUserId());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验部门名称是否重复
|
|
|
+ *
|
|
|
+ * @author lixing
|
|
|
+ * @version V1.0 2021/3/12 10:49 上午
|
|
|
+ */
|
|
|
+ private void checkDuplicateDeptName(AddDepartmentDTO addDepartmentDTO) {
|
|
|
+ // 拼装查询参数
|
|
|
+ QueryDepartmentDTO queryDepartmentDTO = new QueryDepartmentDTO();
|
|
|
+ queryDepartmentDTO.setName(addDepartmentDTO.getName());
|
|
|
+ queryDepartmentDTO.setParentId(addDepartmentDTO.getParentId());
|
|
|
+
|
|
|
+ // 查询
|
|
|
+ List<Department> departments = queryDepartmentList(queryDepartmentDTO);
|
|
|
+
|
|
|
+ // 处理查询结果
|
|
|
+ if (!CollectionUtils.isEmpty(departments)) {
|
|
|
+ throw new BusinessException(ResponseCode.B0300.getCode(), "创建部门失败,部门名称重复");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Department queryDepartmentDetail(Long id) {
|
|
|
+ Department department = getById(id);
|
|
|
+ if (department == null) {
|
|
|
+ throw new IllegalArgumentException("查看Department详情时发生异常,找不到要查看的记录,id=" + id);
|
|
|
+ }
|
|
|
+ return department;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateDepartment(UpdateDepartmentDTO updateDepartmentDTO) {
|
|
|
+ Department department = getById(updateDepartmentDTO.getId());
|
|
|
+ department = ConvertDepartmentTool.INSTANCE.convertUpdateDto2Entity(department, updateDepartmentDTO);
|
|
|
+ department.setModifier(RequiredParamsStorage.getUserId());
|
|
|
+ updateById(department);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验部门是否可删除
|
|
|
+ *
|
|
|
+ * @param id 部门主键
|
|
|
+ * @return 部门do类
|
|
|
+ * @author lixing
|
|
|
+ * @version V1.0 2021/3/12 11:02 上午
|
|
|
+ */
|
|
|
+ public Department checkDeletable(Long id) {
|
|
|
+ if (id == null) {
|
|
|
+ throw new IllegalArgumentException("删除Department时发生异常,主键为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ Department department = getById(id);
|
|
|
+
|
|
|
+ if (department == null) {
|
|
|
+ throw new IllegalArgumentException("删除Department时发生异常,找不到要删除的数据,id:" + id);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询部门是否有子部门
|
|
|
+ QueryDepartmentDTO queryDepartmentDTO = new QueryDepartmentDTO();
|
|
|
+ queryDepartmentDTO.setParentId(id);
|
|
|
+ List<Department> departments = queryDepartmentList(queryDepartmentDTO);
|
|
|
+
|
|
|
+ if (!CollectionUtils.isEmpty(departments)) {
|
|
|
+ throw new BusinessException(ResponseCode.A10000.getCode(), "当前部门包含子部门,不可删除");
|
|
|
+ }
|
|
|
+
|
|
|
+ // TODO: 2021/3/9 部门包含员工时,不可删除
|
|
|
+
|
|
|
+ return department;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void deleteDepartment(Long id) {
|
|
|
+ // 校验部门是否可删除
|
|
|
+ Department department = checkDeletable(id);
|
|
|
+
|
|
|
+ department.setValid(ValidEnum.FALSE.getType());
|
|
|
+ updateById(department);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Department> queryDepartmentList(QueryDepartmentDTO queryDepartmentDTO) {
|
|
|
+ QueryWrapper<Department> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.eq(Department.PROP_VALID, ValidEnum.TRUE.getType());
|
|
|
+ // 默认按创建时间倒序排序
|
|
|
+ queryWrapper.orderBy(true, true, Department.PROP_CREATIONTIME);
|
|
|
+ if (queryDepartmentDTO != null) {
|
|
|
+
|
|
|
+ if (StringUtils.isNotEmpty(queryDepartmentDTO.getName())) {
|
|
|
+ queryWrapper.like(Department.PROP_NAME, queryDepartmentDTO.getName());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isNotEmpty(queryDepartmentDTO.getType())) {
|
|
|
+ queryWrapper.eq(Department.PROP_TYPE, queryDepartmentDTO.getType());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (queryDepartmentDTO.getParentId() != null) {
|
|
|
+ queryWrapper.eq(Department.PROP_PARENT_ID, queryDepartmentDTO.getParentId());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isNotEmpty(queryDepartmentDTO.getResourceFrom())) {
|
|
|
+ queryWrapper.eq(Department.PROP_RESOURCE_FROM, queryDepartmentDTO.getResourceFrom());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return list(queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<Department> pageQueryDepartment(PageQueryDepartmentDTO pageQueryDepartmentDTO) {
|
|
|
+ QueryWrapper<Department> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.eq(Department.PROP_VALID, ValidEnum.TRUE.getType());
|
|
|
+ // 这里认为pageQueryDTO是经过校验的,肯定包含分页信息
|
|
|
+ IPage<Department> pageParam = new Page<>(pageQueryDepartmentDTO.getPage(), pageQueryDepartmentDTO.getSize(), true);
|
|
|
+ // 排序信息
|
|
|
+ if (CollectionUtils.isEmpty(pageQueryDepartmentDTO.getOrders())) {
|
|
|
+ // 默认按创建时间倒序排序
|
|
|
+ queryWrapper.orderBy(true, true, Department.PROP_CREATIONTIME);
|
|
|
+ } else {
|
|
|
+ List<Sort> orders = pageQueryDepartmentDTO.getOrders();
|
|
|
+ for (Sort sort : orders) {
|
|
|
+ // 将驼峰转换为下划线格式
|
|
|
+ sort.setColumn(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, sort.getColumn()));
|
|
|
+ queryWrapper.orderBy(true, sort.isAsc(), sort.getColumn());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isNotEmpty(pageQueryDepartmentDTO.getName())) {
|
|
|
+ queryWrapper.like(Department.PROP_NAME, pageQueryDepartmentDTO.getName());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isNotEmpty(pageQueryDepartmentDTO.getType())) {
|
|
|
+ queryWrapper.eq(Department.PROP_TYPE, pageQueryDepartmentDTO.getType());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isNotEmpty(pageQueryDepartmentDTO.getParentId())) {
|
|
|
+ queryWrapper.eq(Department.PROP_PARENT_ID, pageQueryDepartmentDTO.getParentId());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isNotEmpty(pageQueryDepartmentDTO.getResourceFrom())) {
|
|
|
+ queryWrapper.eq(Department.PROP_RESOURCE_FROM, pageQueryDepartmentDTO.getResourceFrom());
|
|
|
+ }
|
|
|
+
|
|
|
+ return getBaseMapper().selectPage(pageParam, queryWrapper);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Department> getSonDeps(List<Department> parentDeptList) {
|
|
|
+ if (CollectionUtils.isEmpty(parentDeptList)) {
|
|
|
+ return Lists.newArrayList();
|
|
|
+ } else {
|
|
|
+ List<Long> parentIds = parentDeptList.stream().map(Department::getId).collect(Collectors.toList());
|
|
|
+ List<Department> sonDeps = queryDepListByParentIds(parentIds);
|
|
|
+ return sonDeps == null ? Lists.newArrayList() : sonDeps;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Department> queryDepListByParentIds(List<Long> parentIds) {
|
|
|
+ // 拼装查询条件
|
|
|
+ QueryWrapper<Department> queryWrapper = new QueryWrapper<>();
|
|
|
+ queryWrapper.eq(Department.PROP_VALID, ValidEnum.TRUE.getType());
|
|
|
+ // 按创建时间倒序排序
|
|
|
+ queryWrapper.orderBy(true, true, Department.PROP_CREATIONTIME);
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(parentIds)) {
|
|
|
+ throw new IllegalArgumentException("根据父节点查询子部门,parentIds为空");
|
|
|
+ }
|
|
|
+ queryWrapper.in(Department.PROP_PARENT_ID, parentIds);
|
|
|
+
|
|
|
+ return list(queryWrapper);
|
|
|
+ }
|
|
|
+}
|