package cc.mrbird.febs.server.system.service.impl; import cc.mrbird.febs.common.core.constant.ModuleCode; import cc.mrbird.febs.common.core.entity.DeptTree; import cc.mrbird.febs.common.core.entity.QueryRequest; import cc.mrbird.febs.common.core.entity.Tree; import cc.mrbird.febs.common.core.entity.constant.FebsConstant; import cc.mrbird.febs.common.core.entity.constant.PageConstant; import cc.mrbird.febs.common.core.entity.constant.StringConstant; import cc.mrbird.febs.common.core.entity.system.Dept; import cc.mrbird.febs.common.core.entity.system.DicItem; import cc.mrbird.febs.common.core.entity.system.UserDataPermission; import cc.mrbird.febs.common.core.utils.FebsUtil; import cc.mrbird.febs.common.core.utils.SequenceUtil; import cc.mrbird.febs.common.core.utils.SortUtil; import cc.mrbird.febs.common.core.utils.TreeUtil; import cc.mrbird.febs.common.redis.service.RedisService; import cc.mrbird.febs.server.system.mapper.DeptMapper; import cc.mrbird.febs.server.system.service.IDeptService; import cc.mrbird.febs.server.system.service.IUserDataPermissionService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.*; /** * @author MrBird */ @Slf4j @Service("deptService") @RequiredArgsConstructor @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public class DeptServiceImpl extends ServiceImpl implements IDeptService { private final RedisService redisService; private final IUserDataPermissionService userDataPermissionService; private final DeptMapper deptMapper; @Override public Map findDepts(QueryRequest request, Dept dept) { Map result = new HashMap<>(2); try { List depts = findDepts(dept, request); List trees = new ArrayList<>(); buildTrees(trees, depts); List> deptTree = TreeUtil.build(trees); result.put(PageConstant.ROWS, deptTree); result.put(PageConstant.TOTAL, depts.size()); } catch (Exception e) { log.error("获取部门列表失败", e); result.put(PageConstant.ROWS, null); result.put(PageConstant.TOTAL, 0); } return result; } @Override public List findDepts(Dept dept, QueryRequest request) { QueryWrapper queryWrapper = new QueryWrapper<>(); if (StringUtils.isNotBlank(dept.getDeptName())) { queryWrapper.lambda().like(Dept::getDeptName, dept.getDeptName()); } if (StringUtils.isNotBlank(dept.getCreateTimeFrom()) && StringUtils.isNotBlank(dept.getCreateTimeTo())) { queryWrapper.lambda() .ge(Dept::getCreateTime, dept.getCreateTimeFrom()) .le(Dept::getCreateTime, dept.getCreateTimeTo()); } queryWrapper.lambda().in(Dept::getDeptId, userDataPermissionService.findByUserId(FebsUtil.getUserId()).split(StringConstant.COMMA)); SortUtil.handleWrapperSort(request, queryWrapper, "orderNum", FebsConstant.ORDER_ASC, true); return this.baseMapper.selectList(queryWrapper); } @Override @Transactional(rollbackFor = Exception.class) public void createDept(Dept dept) { long deptId = SequenceUtil.generateId(0L, ModuleCode.FRAM_SYSTEM); dept.setDeptId(deptId); if (dept.getParentId() == null) { dept.setParentId(Dept.TOP_DEPT_ID); } dept.setAllDeptName(createALlDeptName(dept)); dept.setCreateTime(new Date()); this.save(dept); UserDataPermission userDataPermission = new UserDataPermission(); userDataPermission.setDeptId(deptId); userDataPermission.setUserId(Long.parseLong(FebsUtil.getUserId())); userDataPermissionService.save(userDataPermission); } @Override @Transactional(rollbackFor = Exception.class) public void updateDept(Dept dept) { if (dept.getParentId() == null) { dept.setParentId(Dept.TOP_DEPT_ID); } String oldAllName = dept.getAllDeptName(); String newAllName = createALlDeptName(dept); dept.setModifyTime(new Date()); this.baseMapper.updateById(dept); deptMapper.changeAllDeptName(oldAllName,newAllName,oldAllName + "%"); } @Override @Transactional(rollbackFor = Exception.class) public void deleteDepts(String[] deptIds) { this.delete(Arrays.asList(deptIds)); } @Override public List setDeptRedis() { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Dept::getDelFlag, 0); List depts = this.baseMapper.selectList(queryWrapper); redisService.del("depts"); redisService.set("depts", depts); return depts; } @Override public List findAllDepts(Dept dept) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(Dept::getDelFlag,0); if (StringUtils.isNotBlank(dept.getDeptName())) { queryWrapper.lambda().like(Dept::getDeptName, dept.getDeptName()); } return this.baseMapper.selectList(queryWrapper); } private void buildTrees(List trees, List depts) { depts.forEach(dept -> { DeptTree tree = new DeptTree(); tree.setId(dept.getDeptId().toString()); tree.setParentId(dept.getParentId().toString()); tree.setLabel(dept.getDeptName()); tree.setOrderNum(dept.getOrderNum()); tree.setDeptFunction(dept.getDeptFunction()); tree.setDeptType(dept.getDeptType()); tree.setAllDeptName(dept.getAllDeptName()); trees.add(tree); }); } private void delete(List deptIds) { removeByIds(deptIds); userDataPermissionService.deleteByDeptIds(deptIds); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(Dept::getParentId, deptIds); List depts = baseMapper.selectList(queryWrapper); if (CollectionUtils.isNotEmpty(depts)) { List deptIdList = new ArrayList<>(); depts.forEach(d -> deptIdList.add(String.valueOf(d.getDeptId()))); this.delete(deptIdList); } } private String createALlDeptName(Dept dept){ Dept parent = this.getById(dept.getParentId()); String parentName = parent.getAllDeptName(); if(StringUtils.isNotBlank(parentName)) { return parent.getAllDeptName() + "/" + dept.getDeptName(); } else { return dept.getDeptName(); } } }