/**
|
* Copyright (c) 2018 人人开源 All rights reserved.
|
* <p>
|
* https://www.renren.io
|
* <p>
|
* 版权所有,侵权必究!
|
*/
|
|
package com.zt.modules.sys.service;
|
|
import cn.hutool.core.convert.Convert;
|
import com.alibaba.excel.util.StringUtils;
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
import com.zt.common.constant.Constant;
|
import com.zt.common.constant.Status;
|
import com.zt.common.db.query.QueryFilter;
|
import com.zt.common.entity.MapData;
|
import com.zt.common.exception.ErrorCode;
|
import com.zt.common.exception.RenException;
|
import com.zt.common.service.BaseService;
|
import com.zt.common.servlet.Result;
|
import com.zt.common.utils.CacheUtils;
|
import com.zt.common.utils.TreeUtils;
|
import com.zt.core.context.User;
|
import com.zt.core.context.UserContext;
|
import com.zt.core.sys.model.SysDept;
|
import com.zt.core.sys.service.ISysDeptService;
|
import com.zt.modules.sys.dao.SysDeptDao;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.cache.annotation.CacheEvict;
|
import org.springframework.cache.annotation.Cacheable;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.stream.Collectors;
|
|
/**
|
* 部门管理
|
*
|
* @author hehz
|
*/
|
@Service
|
public class SysDeptService extends BaseService<SysDeptDao, SysDept> implements ISysDeptService {
|
|
@Autowired
|
private SysUserService sysUserService;
|
|
private List<SysDept> getAll() {
|
// 这里手动缓存,不然在当前方法内调用缓存无效
|
List<SysDept> all = null;//(List<SysDept>) CacheUtils.get(Constant.Cache.DEPT, "all");
|
if (all == null) {
|
all = baseDao.getAll();
|
//CacheUtils.put(Constant.Cache.DEPT, "all", all);
|
}
|
return all.stream().map(dept -> {
|
try {
|
return dept.clone();
|
} catch (CloneNotSupportedException e) {
|
}
|
return null;
|
}).collect(Collectors.toList());
|
}
|
|
public List<SysDept> getTenantAll() {
|
return getAll();
|
// return getAll().stream().filter(dept -> dept.getTenantId().equals(UserContext.getUser().getTenantId()))
|
// .collect(Collectors.toList());
|
}
|
|
/**
|
* 查询当前租户下公司树
|
*
|
* @return
|
*/
|
public List<SysDept> getCompanyTree() {
|
List<SysDept> list = getTenantAll().stream().filter(dept -> dept.isCompany()).collect(Collectors.toList());
|
// 查询所属公司及子公司的数据
|
List<Long> deptIds = this.getWithDescendantIds(UserContext.getUser().getCompanyId());
|
list = list.stream().filter(dept -> deptIds.contains(dept.getId())).collect(Collectors.toList());
|
List<SysDept> listOut = TreeUtils.build(list);
|
//List<SysDept> listOut2 = TreeUtils.toList(listOut);
|
return listOut;
|
}
|
|
/**
|
* 查询当前登录用户公司部门树
|
*
|
* @return
|
*/
|
public List<SysDept> getDeptTreeRegister() {
|
List<SysDept> list = getTenantAll();
|
|
List<SysDept> listArea = list.stream().filter(dept -> "sy".equals(dept.getCode())).collect(Collectors.toList());
|
if (listArea.size() > 0) {
|
Long deptId = listArea.get(0).getId();
|
List<Long> deptIds = this.getWithDescendantIds(deptId);
|
deptIds.remove(0);
|
list = list.stream().filter(dept -> deptIds.contains(dept.getId())).collect(Collectors.toList());
|
}
|
return TreeUtils.build(list);
|
}
|
|
public List<SysDept> getDeptTree() {
|
User user = UserContext.getUser();
|
List<SysDept> list = getTenantAll();
|
|
if (1==0 && !user.isSuperAdmin()) {
|
// 查询所属部门及子部门的数据
|
List<Long> deptIds = this.getWithDescendantIds(user.getDeptId());
|
list = list.stream().filter(dept -> deptIds.contains(dept.getId())).collect(Collectors.toList());
|
}
|
|
return TreeUtils.build(list);
|
}
|
|
/**
|
* 查询公司下部门树
|
*
|
* @param companyId
|
* @return
|
*/
|
public List<SysDept> getDeptList(Long companyId) {
|
QueryFilter queryFilter = new QueryFilter();
|
// 普通管理员,只能查询所属部门及子部门的数据
|
User user = UserContext.getUser();
|
/* if (!user.isSuperAdmin()) {
|
queryFilter.addParam("deptIds", this.getWithDescendantIds(user.getDeptId()));
|
}*/
|
// 查询公司下部门列表
|
queryFilter.addParam("isCompany", Constant.Bool.NO);
|
queryFilter.addParam("companyId", companyId);
|
|
// 查询部门列表
|
List<SysDept> entityList = baseDao.getList(queryFilter.getParams());
|
|
return TreeUtils.build(entityList);
|
}
|
|
@Override
|
@Cacheable(value = Constant.Cache.DEPT, key = "'id:' + #id")
|
public SysDept get(Long id) {
|
return baseDao.getById(id);
|
}
|
|
/**
|
* 通过deptId查找所有祖先,按照祖先的层级排序
|
*
|
* @param id
|
* @return
|
*/
|
@Override
|
public List<SysDept> getAncestor(Long id) {
|
return TreeUtils.getAncestor(getTenantAll(), id);
|
}
|
|
/**
|
* 获取自己和所有下级
|
*
|
* @param id
|
* @return
|
*/
|
public List<SysDept> getWithDescendant(Long id) {
|
return TreeUtils.getWithDescendant(getTenantAll(), id);
|
}
|
|
@Override
|
@Cacheable(value = Constant.Cache.DEPT, key = "'withdescendant:' + #id")
|
public List<Long> getWithDescendantIds(Long id) {
|
return this.getWithDescendant(id).stream().map(dept -> dept.getId()).collect(Collectors.toList());
|
}
|
|
|
/**
|
* 获取下级
|
*
|
* @param id
|
* @return
|
*/
|
@Override
|
public List<SysDept> getDescendant(Long id) {
|
return TreeUtils.getDescendant(getTenantAll(), id);
|
}
|
|
/**
|
* 获取某部门的子节点
|
*
|
* @param id
|
* @return
|
*/
|
@Override
|
public List<SysDept> getChildren(Long id) {
|
return getTenantAll().stream().filter(dept -> dept.getPid().equals(id)).collect(Collectors.toList());
|
}
|
|
public List<SysDept> getByTypes(List<String> types) {
|
return getTenantAll().stream().filter(dept -> types.contains(dept.getNature())).collect(Collectors.toList());
|
}
|
|
/**
|
* 增加部门
|
*
|
* @param dept
|
*/
|
@Override
|
@CacheEvict(value = Constant.Cache.DEPT, allEntries = true)
|
public void insert(SysDept dept) {
|
if (dept.getId() == null || dept.getId() == 0) {
|
dept.setId(IdWorker.getId());
|
}
|
dept.setStatus(Status.ENABLE.getValue());
|
resetFullNameAndInnerId(dept, null);
|
|
// 部门类型为公司时,生成id
|
if (dept.isCompany()) {
|
dept.setCompanyId(dept.getId());
|
}
|
dept.setTenantId(1L);
|
super.insert(dept);
|
|
// 更新数据范围表
|
// dataScopeService.updateByDeptAdd(dept.getId(), dept.getParentId());
|
}
|
|
/**
|
* 更新部门
|
*
|
* @param dept
|
*/
|
@Override
|
@CacheEvict(value = Constant.Cache.DEPT, allEntries = true)
|
public void update(SysDept dept) {
|
Long id = dept.getId();
|
if (id == 0) {
|
throw new RenException("获取主键失败");
|
}
|
|
SysDept tmp = get(id);
|
TreeUtils.updateValidate(getTenantAll(), dept, tmp);
|
|
if (!tmp.getPid().equals(dept.getPid())) {// 部门层级改变了
|
resetFullNameAndInnerId(dept, null);
|
}
|
|
super.update(dept);
|
|
// if (!tmp.getPid().equals(pid)) {// 部门层级改变了
|
// // 更新数据范围表
|
// dataScopeService.updateByDeptUpdate(dept.getId(),
|
// dept.getParentId());
|
// }
|
}
|
|
/**
|
* 删除部门
|
*
|
* @param id
|
*/
|
@Override
|
@CacheEvict(value = Constant.Cache.DEPT, allEntries = true)
|
@Transactional(rollbackFor = Exception.class)
|
public void delete(Long id) {
|
// 判断是否有子部门
|
List<Long> subList = this.getWithDescendantIds(id);
|
if (subList.size() > 1) {
|
throw new RenException(ErrorCode.DEPT_SUB_DELETE_ERROR);
|
}
|
|
// 判断部门下面是否有用户
|
int count = sysUserService.getByDeptId(id).size();
|
if (count > 0) {
|
throw new RenException(ErrorCode.DEPT_USER_DELETE_ERROR);
|
}
|
|
// 删除
|
this.deleteLogic(id);
|
}
|
|
/**
|
* 修改全称和内部编码
|
*
|
* @param dept
|
* @param parent
|
*/
|
private void resetFullNameAndInnerId(SysDept dept, SysDept parent) {
|
if (parent == null) {
|
parent = get(dept.getPid());
|
}
|
if (parent != null) {// 存在上级
|
dept.setPids(parent.getPids() + "," + String.valueOf(dept.getId()));
|
} else {// 没有上级
|
dept.setPids(String.valueOf(dept.getId()));
|
}
|
resetChildFullNameAndInnerId(dept);
|
}
|
|
/**
|
* 修改子类全称和内部编码
|
*
|
* @param parent
|
*/
|
private void resetChildFullNameAndInnerId(SysDept parent) {
|
List<SysDept> list = getChildren(parent.getId());
|
for (SysDept dept : list) {
|
resetFullNameAndInnerId(dept, parent);
|
this.update(dept);
|
resetChildFullNameAndInnerId(dept);
|
}
|
}
|
|
public List<SysDept> fetchRepairer() {
|
List<SysDept> list = this.getTenantAll();
|
|
String factoryId = "cj".equals(UserContext.getUser().getUnitType()) ? UserContext.getUser().getCompanyId().toString() : "";
|
String regionFlag = UserContext.getUser().getArea();//getSessionValue(UserContext.REGION_FLAG);
|
|
/*
|
如果属于某厂家,就返回此厂家
|
*/
|
if (!StringUtils.isEmpty(factoryId)) {
|
List<SysDept> collect = list
|
.stream()
|
.filter(dept -> {
|
return dept.getId().equals(new Long(factoryId));
|
})
|
.collect(Collectors.toList());
|
return collect;
|
}
|
|
if (!StringUtils.isEmpty(regionFlag)) {
|
List<SysDept> collectRegion = list
|
.stream()
|
.filter(dept -> {
|
return dept.getCode().equals(regionFlag);
|
})
|
.collect(Collectors.toList());
|
|
if (!collectRegion.isEmpty()) {
|
final SysDept regionSysDept = collectRegion.get(0);
|
|
List<SysDept> collect = list
|
.stream()
|
.filter(dept -> {
|
String pids = dept.getPids();
|
String[] pidsArray = pids.split(",");
|
for (String pid : pidsArray) {
|
if (pid.equals(regionSysDept.getId().toString()) && new Integer(2).equals(dept.getNature())) {
|
return true;
|
}
|
}
|
|
return false;
|
})
|
.collect(Collectors.toList());
|
return collect;
|
}
|
}
|
|
List<SysDept> collect = list
|
.stream()
|
// .filter(dept -> (new Integer(1).equals(dept.getNature()) && dept.isCompany())
|
// || (new Integer(2).equals(dept.getNature()) && dept.isCompany() /*&& dept.getPid().toString().equals("1271368584383188993") */)
|
// || "HBDD".equals(dept.getCode()))
|
.filter(dept -> "cj".equals(dept.getNature()))
|
.collect(Collectors.toList());
|
return collect;
|
}
|
|
public Long fetchRepairerId(String factoryName) {
|
List<SysDept> list = this.fetchRepairer();
|
if (list != null && !list.isEmpty()) {
|
for (SysDept sysDept : list) {
|
if (sysDept.getName() != null && sysDept.getName().equals(factoryName)) {
|
return sysDept.getId();
|
}
|
}
|
}
|
return null;
|
}
|
|
public List<SysDept> getListByParent(String pid, String pCode, String code) {
|
HashMap<String, Object> map = new HashMap<>();
|
map.put("pCode", pCode);
|
map.put("code", code);
|
map.put("pId", pid);
|
List<SysDept> list = baseDao.getListByParent(map);
|
return list;
|
}
|
|
public Long getCompanyIdByDeptId(Long deptId) {
|
SysDept sysDept = baseDao.getById(deptId);
|
if (sysDept != null)
|
return sysDept.getCompanyId();
|
else
|
return deptId;
|
}
|
|
public Map<String, String> getMapFactory(Boolean idToName) {
|
List<SysDept> list = this.getTenantAll();
|
|
List<SysDept> collect = list
|
.stream()
|
.filter(dept -> ("cj".equals(dept.getNature()) ))
|
.collect(Collectors.toList());
|
|
Map<String, String> result = new HashMap<>();
|
for (SysDept item : collect) {
|
if (idToName)
|
result.put(item.getId().toString(), item.getName());
|
else
|
result.put(item.getName(), item.getId().toString());
|
}
|
return result;
|
}
|
|
public Map<String, String> getMapTeamFactory(Boolean idToName) {
|
List<SysDept> list = this.getTenantAll();
|
|
List<SysDept> collect = list
|
.stream()
|
.filter(dept -> ("cj".equals(dept.getNature()) ||"td".equals(dept.getNature())))
|
.collect(Collectors.toList());
|
|
Map<String, String> result = new HashMap<>();
|
for (SysDept item : collect) {
|
if (idToName)
|
result.put(item.getId().toString(), item.getName());
|
else
|
result.put(item.getName(), item.getId().toString());
|
}
|
return result;
|
}
|
|
public List<SysDept> getDeptList3() {
|
return baseDao.getDeptList3();
|
}
|
}
|