package jnpf.permission.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.dynamic.datasource.annotation.DSTransactional; 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.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.google.common.collect.Lists; import jnpf.base.UserInfo; import jnpf.base.entity.SuperBaseEntity; import jnpf.base.service.SuperServiceImpl; import jnpf.constant.MsgCode; import jnpf.constant.PermissionConst; import jnpf.message.entity.SynThirdInfoEntity; import jnpf.message.service.SynThirdInfoService; import jnpf.message.util.SynThirdConsts; import jnpf.permission.entity.OrganizeEntity; import jnpf.permission.entity.PositionEntity; import jnpf.permission.entity.UserEntity; import jnpf.permission.entity.UserRelationEntity; import jnpf.permission.mapper.UserRelationMapper; import jnpf.permission.model.position.PosistionCurrentModel; import jnpf.permission.model.user.page.UserPagination; import jnpf.permission.model.user.vo.UserListVO; import jnpf.permission.model.userrelation.UserRelationForm; import jnpf.permission.service.*; import jnpf.util.RandomUtil; import jnpf.util.StringUtil; import jnpf.util.UserProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; /** * 用户关系 * * @author JNPF开发平台组 * @version V3.1.0 * @copyright 引迈信息技术有限公司 * @date 2019年9月26日 上午9:18 */ @Service public class UserRelationServiceImpl extends SuperServiceImpl implements UserRelationService { @Autowired private UserService userService; @Autowired private PositionService positionService; @Autowired private OrganizeService organizeService; @Autowired private RoleRelationService roleRelationService; @Autowired private UserRelationService userRelationService; @Autowired private SynThirdInfoService synThirdInfoService; @Override public List getListPage(UserPagination pagination) { String objectType = StringUtil.isNotEmpty(pagination.getPositionId()) ? PermissionConst.POSITION : PermissionConst.ORGANIZE; String objectId = StringUtil.isNotEmpty(pagination.getPositionId()) ? pagination.getPositionId() : pagination.getOrganizeId(); //是否显示子孙组织用户 List orgIds = new ArrayList<>(); if (Objects.equals(pagination.getShowSubOrganize(), 1)) { List allChild = organizeService.getAllChild(pagination.getOrganizeId()); orgIds.addAll(allChild.stream().map(OrganizeEntity::getId).collect(Collectors.toList())); } MPJLambdaWrapper queryWrapper = JoinWrappers.lambda(UserRelationEntity.class); queryWrapper.selectAs(UserEntity::getId, UserListVO::getId); queryWrapper.selectAs(UserEntity::getAccount, UserListVO::getAccount); queryWrapper.selectAs(UserEntity::getRealName, UserListVO::getRealName); queryWrapper.selectAs(UserEntity::getGender, UserListVO::getGender); queryWrapper.selectAs(UserEntity::getMobilePhone, UserListVO::getMobilePhone); queryWrapper.selectAs(UserEntity::getEnabledMark, UserListVO::getEnabledMark); queryWrapper.selectAs(UserEntity::getUnlockTime, UserListVO::getUnlockTime); queryWrapper.selectMax(UserRelationEntity::getId, UserListVO::getMaxRelationId); queryWrapper.leftJoin(UserEntity.class, UserEntity::getId, UserRelationEntity::getUserId); if (!StringUtil.isEmpty(pagination.getKeyword())) { queryWrapper.and( t -> t.like(UserEntity::getAccount, pagination.getKeyword()) .or().like(UserEntity::getRealName, pagination.getKeyword()) .or().like(UserEntity::getMobilePhone, pagination.getKeyword()) ); } if (pagination.getEnabledMark() != null) { queryWrapper.eq(UserEntity::getEnabledMark, pagination.getEnabledMark()); } if (orgIds.size() > 0) { queryWrapper.in(UserRelationEntity::getObjectId, orgIds); } else { queryWrapper.eq(UserRelationEntity::getObjectId, objectId); } queryWrapper.eq(UserRelationEntity::getObjectType, objectType); queryWrapper.orderByDesc("maxRelationId"); queryWrapper.groupBy(UserEntity::getId, UserEntity::getAccount, UserEntity::getRealName, UserEntity::getGender, UserEntity::getMobilePhone, UserEntity::getEnabledMark, UserEntity::getUnlockTime); Page page = new Page<>(pagination.getCurrentPage(), pagination.getPageSize()); IPage data = this.selectJoinListPage(page, UserListVO.class, queryWrapper); return pagination.setData(data.getRecords(), page.getTotal()); } @Override public List getListByUserId(String userId) { return getListByUserIdAll(Collections.singletonList(userId)); } @Override public List getListByUserIdAndObjType(String userId, String objectType) { QueryWrapper query = new QueryWrapper<>(); query.lambda().in(UserRelationEntity::getUserId, userId); query.lambda().in(UserRelationEntity::getObjectType, objectType); query.lambda().orderByAsc(UserRelationEntity::getSortCode).orderByDesc(UserRelationEntity::getCreatorTime); return this.list(query); } @Override public List getListByUserIdAll(List userId) { if (userId.size() > 0) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().in(UserRelationEntity::getUserId, userId); return this.list(queryWrapper); } return new ArrayList<>(); } @Override public List getListByObjectId(String objectId) { return getListByObjectId(objectId, null); } @Override public List getListByObjectType(String objectType) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserRelationEntity::getObjectType, objectType); return this.list(queryWrapper); } @Override public List getListByObjectId(String objectId, String objectType) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserRelationEntity::getObjectId, objectId); if (objectType != null) { queryWrapper.lambda().eq(UserRelationEntity::getObjectType, objectType); } queryWrapper.lambda().orderByAsc(UserRelationEntity::getSortCode).orderByDesc(UserRelationEntity::getCreatorTime); return this.list(queryWrapper); } @Override public List getListByObjectIdAll(List objectId) { List list = new ArrayList<>(); if (objectId.size() > 0) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().in(UserRelationEntity::getObjectId, objectId); list = this.list(queryWrapper); } return list; } @Override public void deleteAllByObjId(String objId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserRelationEntity::getObjectId, objId); this.remove(queryWrapper); } @Override public void deleteAllByUserId(String userId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserRelationEntity::getUserId, userId); queryWrapper.lambda().ne(UserRelationEntity::getObjectType, PermissionConst.GROUP); userRelationService.remove(queryWrapper); } @Override public void createByList(List userRelationEntityList) { userRelationEntityList.forEach(t -> { this.save(t); }); } @Override public UserRelationEntity getInfo(String id) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserRelationEntity::getId, id); return this.getOne(queryWrapper); } @Override @DSTransactional public void save(String objectId, List entitys) { List existList = this.getListByObjectId(objectId); List relationList = new ArrayList<>(); for (int i = 0; i < entitys.size(); i++) { UserRelationEntity entity = entitys.get(i); entity.setId(RandomUtil.uuId()); entity.setSortCode(Long.parseLong(i + "")); entity.setCreatorUserId(UserProvider.getUser().getUserId()); if (existList.stream().filter(t -> t.getUserId().equals(entity.getUserId())).count() == 0) { relationList.add(entity); } } for (UserRelationEntity entity : relationList) { this.save(entity); } } @Override public void save(List list) { for (UserRelationEntity entity : list) { this.save(entity); } } @Override @DSTransactional public void delete(UserRelationForm form) { List userIds = form.getUserIds(); String type = form.getObjectType(); if (CollectionUtil.isEmpty(userIds)) { return; } QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserRelationEntity::getObjectId, form.getObjectId()); queryWrapper.lambda().eq(UserRelationEntity::getObjectType, type); queryWrapper.lambda().in(UserRelationEntity::getUserId, userIds); List list = this.list(queryWrapper); if (CollectionUtil.isEmpty(list)) { return; } if (PermissionConst.POSITION.equals(type)) { PositionEntity info = positionService.getInfo(form.getObjectId()); //如果责任人被移除则清空责任人 if (StringUtil.isNotEmpty(info.getDutyUser()) && userIds.contains(info.getDutyUser())) { info.setDutyUser(null); positionService.updateById(info); } //岗位时顺便移除组织关系 for (String userId : userIds) { queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserRelationEntity::getObjectId, info.getOrganizeId()); queryWrapper.lambda().eq(UserRelationEntity::getObjectType, PermissionConst.ORGANIZE); queryWrapper.lambda().in(UserRelationEntity::getUserId, userId); List orgList = this.list(queryWrapper); if (CollectionUtil.isNotEmpty(orgList)) { list.add(orgList.get(0)); } } } for (UserRelationEntity item : list) { this.removeById(item); } if (PermissionConst.POSITION.equals(type)) { userService.delCurUser(MsgCode.PS010.get(), form.getUserIds()); } } @Override @DSTransactional public void saveObjectId(String objectId, UserRelationForm userRelationForm) { UserInfo userInfo = UserProvider.getUser(); //调整岗位(直接替换用户全部岗位绑定信息) if (Objects.equals(userRelationForm.getActionType(), 1)) { List listByUserIdAll = userRelationService.getListByUserIdAll(userRelationForm.getUserIds()); //用户列表绑定的关系数据 List collect = listByUserIdAll.stream().filter(t -> Objects.equals(t.getObjectType(), userRelationForm.getObjectType())).collect(Collectors.toList()); //替换::直接移除原有数据添加新的数据 removeBatchByIds(collect); List list = new ArrayList<>(); for (String userId : userRelationForm.getUserIds()) { UserRelationEntity entity = new UserRelationEntity(); entity.setId(RandomUtil.uuId()); entity.setObjectId(objectId); entity.setObjectType(userRelationForm.getObjectType()); entity.setCreatorUserId(userInfo.getUserId()); entity.setUserId(userId); list.add(entity); } save(list); return; } // 修改前的岗位绑定人员ID List listByObjectId = userRelationService.getListByObjectId(objectId, userRelationForm.getObjectType()); List beforeUserIds = listByObjectId.stream().map(UserRelationEntity::getUserId).collect(Collectors.toList()); // 调整前后,岗位全部用户 List allUser = new ArrayList<>(userRelationForm.getUserIds()); allUser.addAll(beforeUserIds); userRelationForm.setUserIds(userService.getUserList(allUser).stream().map(UserEntity::getId).collect(Collectors.toList())); //清除原有成员数据 deleteAllByObjId(objectId); List list = new ArrayList<>(); int i = 0; for (String userId : userRelationForm.getUserIds()) { UserRelationEntity entity = new UserRelationEntity(); entity.setId(RandomUtil.uuId()); entity.setSortCode(Long.parseLong(i + "")); entity.setObjectId(objectId); entity.setObjectType(userRelationForm.getObjectType()); entity.setCreatorUserId(userInfo.getUserId()); entity.setUserId(userId); list.add(entity); i++; } save(objectId, list); // 移除数据库不在最终用户列表里的人 List allUpdateIds = beforeUserIds.stream().filter(b -> !userRelationForm.getUserIds() .contains(b)).collect(Collectors.toList()); userService.delCurUser(MsgCode.PS010.get(), allUpdateIds); } @Override public List getRelationByUserIds(List userIds) { if (userIds.size() == 0) { return new ArrayList<>(); } QueryWrapper query = new QueryWrapper<>(); query.lambda().in(UserRelationEntity::getUserId, userIds); return this.list(query); } @Override public List getListByObjectType(String userId, String objectType) { QueryWrapper query = new QueryWrapper<>(); query.lambda().eq(UserRelationEntity::getUserId, userId); if (StringUtil.isNotEmpty(objectType)) { query.lambda().eq(UserRelationEntity::getObjectType, objectType); } query.lambda().orderByAsc(UserRelationEntity::getSortCode).orderByDesc(UserRelationEntity::getCreatorTime); return this.list(query); } @Override public List getAllOrgRelationByUserId(String userId) { return this.getListByObjectType(userId, PermissionConst.ORGANIZE); } @Override public List getObjectVoList() { UserInfo user = UserProvider.getUser(); String userId = user.getUserId(); String majorPosId = user.getPositionId(); // 岗位遵循一对多关系 List positionList = positionService.getListByUserId(userId); if (positionList.size() > 0) { List voList = new ArrayList<>(); for (PositionEntity p : positionList) { PosistionCurrentModel model = new PosistionCurrentModel(); OrganizeEntity orgInfo = organizeService.getInfo(p.getOrganizeId()); model.setId(p.getId()); model.setPositionId(p.getId()); model.setFullName(p.getFullName()); model.setOrganizeId(orgInfo.getId()); model.setOrgTreeName(orgInfo.getOrgNameTree()); //上级岗位 if (StringUtil.isNotEmpty(p.getParentId())) { PositionEntity pPosition = positionService.getInfo(p.getParentId()); if (pPosition != null) { model.setParentId(pPosition.getId()); model.setParentName(pPosition.getFullName()); UserEntity dutyUser = userService.getInfo(pPosition.getDutyUser()); if (dutyUser != null) { model.setManagerId(dutyUser.getId()); model.setManagerName(dutyUser.getRealName()); } } } else { //没有上级岗位的时候--岗位为空,上级责任人去组织上级责任岗位的责任人 OrganizeEntity pOrgInfo = organizeService.getInfo(orgInfo.getParentId()); if (pOrgInfo != null) { PositionEntity dutyPos = positionService.getInfo(pOrgInfo.getDutyPosition()); if (dutyPos != null) { UserEntity dutyUser = userService.getInfo(dutyPos.getDutyUser()); if (dutyUser != null) { model.setManagerId(dutyUser.getId()); model.setManagerName(dutyUser.getRealName()); } } } } model.setManagerId(p.getId()); if (p.getId().equals(majorPosId)) { model.setIsDefault(true); } else { model.setIsDefault(false); } voList.add(model); } return voList; } return Collections.EMPTY_LIST; } @Override public Boolean existByObj(String objectType, String objectId) { return existByObj(objectType, Arrays.asList(objectId)); } @Override public Boolean existByObj(String objectType, List objectId) { if (CollectionUtil.isEmpty(objectId)) return false; QueryWrapper query = new QueryWrapper<>(); query.lambda() .eq(UserRelationEntity::getObjectType, objectType) .in(UserRelationEntity::getObjectId, objectId); return this.count(query) > 0; } @Override public List getListByRoleId(String roleId) { List list = new ArrayList<>(); roleRelationService.getListByRoleId(roleId, PermissionConst.ORGANIZE).forEach(o -> { QueryWrapper query = new QueryWrapper<>(); query.lambda() .eq(UserRelationEntity::getObjectType, PermissionConst.ORGANIZE) .eq(UserRelationEntity::getObjectId, o.getObjectId()); list.addAll(this.list(query)); }); return list; } @Override public List getListByUserId(String userId, String objectType) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserRelationEntity::getUserId, userId); queryWrapper.lambda().eq(UserRelationEntity::getObjectType, objectType); return this.list(queryWrapper); } @Override public List getListByOrgId(List orgIdList) { if (CollectionUtil.isNotEmpty(orgIdList)) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserRelationEntity::getObjectType, PermissionConst.ORGANIZE); List> lists = Lists.partition(orgIdList, 1000); queryWrapper.lambda().and(t->{ for (List ids : lists) { t.or().in(UserRelationEntity::getObjectId, ids); } }); return this.list(queryWrapper); } return new ArrayList<>(); } @Override public void syncDingUserRelation(String sysObjId, List deptIdList, String thirdType) { // 查询对应的中间表,获取到对应的本地组织id QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().in(SynThirdInfoEntity::getThirdObjId, deptIdList); wrapper.lambda().eq(SynThirdInfoEntity::getThirdType, thirdType); wrapper.lambda().eq(SynThirdInfoEntity::getDataType, Integer.valueOf(SynThirdConsts.DATA_TYPE_ORG)); List synThirdInfoLists = synThirdInfoService.getBaseMapper().selectList(wrapper); HashMap map = new HashMap<>(); for (SynThirdInfoEntity obj : synThirdInfoLists) { map.put(obj.getThirdObjId(), obj.getSysObjId()); } // 已经存在的数据 List collect = synThirdInfoLists.stream().map(SynThirdInfoEntity::getSysObjId).collect(Collectors.toList()); QueryWrapper relationWrapper = new QueryWrapper<>(); if (CollectionUtil.isNotEmpty(collect)) { relationWrapper.lambda().in(UserRelationEntity::getObjectId, collect); } relationWrapper.lambda().eq(UserRelationEntity::getObjectType, PermissionConst.ORGANIZE); relationWrapper.lambda().eq(UserRelationEntity::getUserId, sysObjId); List userRelationEntities = this.getBaseMapper().selectList(relationWrapper); ArrayList entities = new ArrayList<>(); List relationEntities = userRelationEntities.stream() .filter(t -> collect.contains(t.getObjectId())) .collect(Collectors.toList()); List positionEntities = positionService.getList(true); if (CollectionUtil.isEmpty(relationEntities)) { for (String string : collect) { UserRelationEntity userRelationEntity = new UserRelationEntity(); userRelationEntity.setObjectType(PermissionConst.ORGANIZE); userRelationEntity.setUserId(sysObjId); userRelationEntity.setObjectId(string); List positionEntityList = positionEntities.stream() .filter(t -> t.getOrganizeId().equals(string) && t.getDefaultMark().equals(1)).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(positionEntityList)) { UserRelationEntity positionUserRelation = new UserRelationEntity(); positionUserRelation.setObjectType(PermissionConst.POSITION); positionUserRelation.setObjectId(positionEntityList.get(0).getId()); positionUserRelation.setUserId(sysObjId); entities.add(positionUserRelation); } entities.add(userRelationEntity); } } userRelationService.saveBatch(entities); // UserEntity adminAccount = userService.getUserByAccount(ADMIN_KEY); // String adminId = adminAccount == null ? null : adminAccount.getId(); // for (Long id : deptIdList) { // String objectId = String.valueOf(id); // entity = new UserRelationEntity(); // entity.setId(RandomUtil.uuId()); // entity.setObjectId(map.get(objectId)); // entity.setCreatorUserId(adminId); // entity.setSortCode(0L); // entity.setUserId(sysObjId); // entity.setObjectType("Organize"); // list.add(entity); // } // this.saveBatch(list); } @Override public List getUserProgeny(List idList, String enableMark) { //查询用户子孙下级。不包含当前岗位的用户 if (CollectionUtil.isEmpty(idList)) return new ArrayList<>(); QueryWrapper query = new QueryWrapper<>(); query.lambda() .eq(enableMark != null, PositionEntity::getEnabledMark, enableMark) .and(t -> idList.forEach(id -> t.like(PositionEntity::getPositionIdTree, id).or())) .notIn(PositionEntity::getId, idList) .orderByAsc(PositionEntity::getSortCode, PositionEntity::getCreatorTime); List list = positionService.list(query).stream().distinct().collect(Collectors.toList()); return getUserEntities(list); } @Override public List getUserAndSub(List idList, String enableMark) { if (CollectionUtil.isEmpty(idList)) return new ArrayList<>(); List byParentIds = positionService.getListByParentIds(idList); return getUserEntities(byParentIds); } private List getUserEntities(List byParentIds) { if (CollectionUtil.isEmpty(byParentIds)) return new ArrayList<>(); List listByObjectIdAll = this.getListByObjectIdAll(byParentIds.stream() .map(SuperBaseEntity.SuperIBaseEntity::getId).collect(Collectors.toList())); return userService.getUserList(listByObjectIdAll.stream() .map(UserRelationEntity::getUserId).collect(Collectors.toList())); } }