From c64af1edbd9b3b28c34ea0e3c627cef9b91ad4a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E8=A3=95=E8=B4=A2?= Date: Fri, 10 Nov 2023 17:41:32 +0800 Subject: [PATCH] 2.0 --- .../com/xm/core/service/XmGroupService.java | 834 +++++++++++++++++- 1 file changed, 793 insertions(+), 41 deletions(-) diff --git a/xm-core/src/main/java/com/xm/core/service/XmGroupService.java b/xm-core/src/main/java/com/xm/core/service/XmGroupService.java index 65a64fa3..8bd066f0 100644 --- a/xm-core/src/main/java/com/xm/core/service/XmGroupService.java +++ b/xm-core/src/main/java/com/xm/core/service/XmGroupService.java @@ -1,36 +1,45 @@ package com.xm.core.service; +import com.alibaba.fastjson.JSON; import com.mdp.core.entity.Tips; import com.mdp.core.service.BaseService; -import com.mdp.safe.client.entity.Dept; import com.mdp.safe.client.entity.User; -import com.xm.core.entity.XmGroup; -import com.xm.core.entity.XmProduct; -import com.xm.core.entity.XmProject; +import com.mdp.safe.client.utils.LoginUtils; +import com.xm.core.entity.*; import com.xm.core.mapper.XmGroupMapper; +import com.xm.core.service.cache.XmGroupCacheService; import com.xm.core.service.client.SysClient; import com.xm.core.service.push.XmPushMsgService; +import com.xm.core.vo.XmGroupVo; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** - * 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.
+ * 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.
* 组织 com.qqkj 顶级模块 oa 大模块 xm 小模块
- * 实体 XmProjectGroup 表 XM.xm_group 当前主键(包括多主键): id; + * 实体 XmProjectGroup 表 XM.xm_group 当前主键(包括多主键): id; ***/ @Service("xm.core.xmGroupService") -public class XmGroupService extends BaseService { +public class XmGroupService extends BaseService { @Autowired XmRecordService xmRecordService; - + @Autowired + XmGroupService xmGroupService; + + @Autowired + XmGroupUserService xmGroupUserService; + + @Autowired + XmGroupCacheService groupCacheService; @Autowired @@ -43,20 +52,32 @@ public class XmGroupService extends BaseService { @Autowired private XmProductService xmProductService; - @Autowired - XmPushMsgService pushMsgService; + @Autowired + XmPushMsgService pushMsgService; @Autowired SysClient sysClient; + public void clearProjectGroup(String projectId){ + groupCacheService.clearProjectGroups(projectId); + } + public void clearProductGroup(String productId){ + groupCacheService.clearProductGroups(productId); + } + public Tips checkIsProductAdmOrTeamHeadOrAss(User user, String tardgetUserid, String productId){ Tips tips = new Tips("成功"); - boolean isAdm=this.checkUserIsProductAdm(productId, user.getUserid()); - if(!isAdm){ - boolean isHead=false; + List pgroups=new ArrayList<>(); + boolean isAdm=this.checkUserIsProductAdm(productId, user.getUserid()); + if(!isAdm){ + pgroups=this.getProductGroupVoList(productId); + if(pgroups==null || pgroups.size()==0){ + return new Tips(false,"group-0","产品【"+productId+"】还未建立产品团队,请先进行团队成员维护"); + } + boolean isHead=this.checkUserIsOtherUserTeamHeadOrAss(pgroups,user.getUserid(),tardgetUserid); if(!isHead){ return new Tips(false,"not-head","您无权操作!产品经理、组长可以操作。"); } @@ -67,16 +88,101 @@ public class XmGroupService extends BaseService { public Tips checkIsProjectAdmOrTeamHeadOrAss(User user, String tardgetUserid, String projectId){ - Tips tips = new Tips("成功"); - boolean isAdm=this.checkUserIsProjectAdm(projectId, user.getUserid()); + Tips tips = new Tips("成功"); + List pgroups=new ArrayList<>(); + boolean isAdm=this.checkUserIsProjectAdm(projectId, user.getUserid()); if(!isAdm){ - return tips.setErrMsg(""); + pgroups=this.getProjectGroupVoList(projectId); + if(pgroups==null || pgroups.size()==0){ + return new Tips(false,"group-0","项目【"+projectId+"】还未建立项目团队,请先进行团队成员维护"); + } + boolean isHead=this.checkUserIsOtherUserTeamHeadOrAss(pgroups,user.getUserid(),tardgetUserid); + if(!isHead){ + return new Tips(false,"not-head","您无权操作!项目经理、组长可以操作。"); + } } return tips; } - + + public List getProductGroupVoList(String productId) { + List groupVoList=new ArrayList<>(); + List groupVoList2 = groupCacheService.getProductGroups(productId); + if(groupVoList2==null||groupVoList2.size()==0) { + + XmGroup group = new XmGroup(); + group.setProductId(productId); + List groupList = this.selectListByWhere(group); + if(groupList==null || groupList.size()==0) { + groupCacheService.putProductGroups(productId, groupVoList); + return groupVoList; + } + List groupUserList=this.xmGroupUserService.selectGroupUserListByProductId(productId); + if(groupUserList==null || groupUserList.size()==0) { + //groupCacheService.putProjectGroups(productId, groupVoList); + //return groupVoList; + } + groupList.forEach(g -> { + XmGroupVo gvo = new XmGroupVo(); + BeanUtils.copyProperties(g,gvo); + List groupUsers=new ArrayList<>(); + groupUserList.forEach(gu -> { + if(g.getId().equals(gu.getGroupId())) { + groupUsers.add(gu); + } + }); + gvo.setGroupUsers(groupUsers ); + groupVoList.add(gvo); + }); + groupCacheService.putProductGroups(productId, groupVoList); + + return groupVoList; + }else { + return groupVoList2; + } + + } + + + /** 请在此类添加自定义函数 */ + public List getProjectGroupVoList(String projectId) { + List groupVoList=new ArrayList<>(); + List groupVoList2 = groupCacheService.getProjectGroups(projectId); + if(groupVoList2==null||groupVoList2.size()==0) { + + XmGroup group = new XmGroup(); + group.setProjectId(projectId); + List groupList = this.selectListByWhere(group); + if(groupList==null || groupList.size()==0) { + groupCacheService.putProjectGroups(projectId, groupVoList); + return groupVoList; + } + List groupUserList=this.xmGroupUserService.selectGroupUserListByProjectId(projectId); + if(groupUserList==null || groupUserList.size()==0) { + //groupCacheService.putProjectGroups(projectId, groupVoList); + //return groupVoList; + } + groupList.forEach(g -> { + XmGroupVo gvo = new XmGroupVo(); + BeanUtils.copyProperties(g,gvo); + List groupUsers=new ArrayList<>(); + groupUserList.forEach(gu -> { + if(g.getId().equals(gu.getGroupId())) { + groupUsers.add(gu); + } + }); + gvo.setGroupUsers(groupUsers ); + groupVoList.add(gvo); + }); + groupCacheService.putProjectGroups(projectId, groupVoList); + + return groupVoList; + }else { + return groupVoList2; + } + + } public boolean checkUserIsProjectAdm(XmProject xmProject,String userid){ if(xmProject==null){ @@ -88,7 +194,7 @@ public class XmGroupService extends BaseService { } return false; } - public boolean checkUserIsProjectAdm(String projectId,String userid){ + public boolean checkUserIsProjectAdm(String projectId,String userid){ XmProject xmProject=xmProjectService.getProjectFromCache(projectId); if(xmProject==null){ return false; @@ -122,19 +228,395 @@ public class XmGroupService extends BaseService { return false; } + /** + * 新增项目时,同时新增项目团队及小组组员等 + * @param projectId + * @param xmGroupVoList + */ + @Transactional + public void addGroups(String projectId,List xmGroupVoList) { + List groups=new ArrayList<>(); + List groupUsers=new ArrayList<>(); + for (XmGroupVo xmGroupVo : xmGroupVoList) { + XmGroup group=new XmGroup(); + xmGroupVo.setId(this.createKey("id")); + BeanUtils.copyProperties(xmGroupVo, group); + groups.add(group); + List groupUsersTemp=xmGroupVo.getGroupUsers(); + if(groupUsersTemp==null || groupUsersTemp.size()==0) { + continue; + }else { + for (XmGroupUser xmGroupUser : groupUsersTemp) { + xmGroupUser.setGroupId(group.getId()); + xmGroupUser.setJoinTime(new Date()); + xmGroupUser.setStatus("0"); + groupUsers.add(xmGroupUser); + } + + } + } + if(groups.size()>0) { + this.batchInsert(groups); + User u=LoginUtils.getCurrentUserInfo(); + + for (XmGroupVo group : xmGroupVoList) { + List users=group.getGroupUsers(); + List> umaps=new ArrayList<>(); + for (XmGroupUser xmGroupUser : users) { + Map u2=new HashMap<>(); + u2.put("userid", xmGroupUser.getUserid()); + u2.put("username", xmGroupUser.getUsername()); + umaps.add(u2); + + } + pushMsgService.pushChannelGroupCreateMsg(u.getBranchId(),group.getProjectId(),group.getId(), group.getId(), group.getGroupName(), u.getUserid(), u.getUsername(), umaps,"新增小组["+group.getGroupName()+"]及以下组员:"+StringUtils.arrayToDelimitedString(group.getGroupUsers().toArray(), ",")); + if(group.getGroupUsers()!=null && group.getGroupUsers().size()>0) { + xmRecordService.addXmGroupRecord(projectId, group.getId(),"项目-团队-新增小组", "新增小组["+group.getGroupName()+"]及以下组员:"+StringUtils.arrayToDelimitedString(group.getGroupUsers().toArray(), ","),JSON.toJSONString(group),null); + + }else { + xmRecordService.addXmGroupRecord(projectId, group.getId(),"项目-团队-新增小组", "新增小组["+group.getGroupName()+"]",JSON.toJSONString(group),null); + + } - - public boolean checkUserExistsProjectGroup(String projectId, String userid){ - return false; + } + } + if(groupUsers.size()>0) { + xmGroupUserService.batchInsert(groupUsers); + } + groupCacheService.putProjectGroups(projectId, null); + } + /* + * 更新项目团队 + * 1.项目管理者、项目创建人可以添加项目小组 + * 2.小组长可以添加本小组成员、清空本小组所有成员 + * 3.项目管理者、创建人可以任意添加删除成员 + * 4.项目管理者、创建人可以调整小组组长 + */ + @Transactional + public Tips updateGroup(XmGroup group, XmGroup groupDb) { + Tips tips=new Tips("成功"); + super.updateSomeFieldByPk(group); + this.sumParents(group); + return tips; + } - } + + public void pushMsg(User user, XmGroup g, List> users){ + pushMsgService.pushChannelGroupCreateMsg(user.getBranchId(),g.getProjectId(),g.getId(), g.getId(), g.getGroupName(), user.getUserid(), user.getUsername(), users,"新增小组["+g.getGroupName()+"]及以下组员:"+ users.stream().map(i->(String)i.get("username")).collect(Collectors.joining(","))); + + } + + /** + * 获取用户在某个项目中的组 + * @param projectId + * @param userid + * @return + */ + public List getUserGroupsByProjectId(String projectId, String userid){ + List xmGroupVoList=this.getProjectGroupVoList(projectId); + return this.getUserGroups(xmGroupVoList, userid); + } + /** + * 获取用户在某个产品中的组 + * @param productId + * @param userid + * @return + */ + public List getUserGroupsByProductId(String productId, String userid){ + List xmGroupVoList=this.getProductGroupVoList(productId); + return this.getUserGroups(xmGroupVoList, userid); + } + + /** + * 检查用户是否在一些组中任意个组当组长 + * @param xmGroupVoList + * @param teamHeadUserid + * @return + */ + public boolean checkUserIsHeadInGroups(List xmGroupVoList, String teamHeadUserid){ + if(xmGroupVoList==null || xmGroupVoList.size()==0)return false; + if(!StringUtils.hasText(teamHeadUserid)){ + return false; + } + for (XmGroupVo xmGroupVo : xmGroupVoList) { + if(teamHeadUserid.equals(xmGroupVo.getLeaderUserid())){ + return true; + } + + } + return false; + } + + /** + * 检查用户是否在指定的小组中做组长 + * @param xmGroupVoList + * @param groupId + * @param teamHeadUserid + * @return + */ + public boolean checkUserIsHeadInGroup(List xmGroupVoList, String groupId, String teamHeadUserid){ + if(xmGroupVoList==null || xmGroupVoList.size()==0)return false; + if(!StringUtils.hasText(teamHeadUserid)){ + return false; + } + if(!StringUtils.hasText(groupId)){ + return false; + } + + for (XmGroupVo xmGroupVo : xmGroupVoList) { + if(groupId.equals(xmGroupVo.getId())){ + if(teamHeadUserid.equals(xmGroupVo.getLeaderUserid())){ + return true; + } + } + } + return false; + } + public List getUserGroups(List xmGroupVoList, String userid){ + List userGroups=new ArrayList<>(); + if(xmGroupVoList==null) { + return userGroups; + } + for (XmGroupVo g : xmGroupVoList) { + if(userid.equals(g.getLeaderUserid())||userid.equals(g.getAssUserid())){ + userGroups.add(g); + }else{ + List gus=g.getGroupUsers(); + boolean exists=false; + if(gus==null) { + continue; + } + for (XmGroupUser gu : gus) { + if(userid.equals(gu.getUserid())) { + exists=true; + break; + } + } + if(exists) { + userGroups.add(g); + + } + } + } + return userGroups; + } + public boolean checkUserExistsProjectGroup(String projectId, String userid){ + List userGroups= getUserGroupsByProjectId(projectId,userid); + return userGroups!=null && userGroups.size()>0; + + } public boolean checkUserExistsProductGroup(String productId, String userid){ - return false; + List userGroups= getUserGroupsByProductId(productId,userid); + return userGroups!=null && userGroups.size()>0; + + } + public boolean checkUserExistsGroup(List userGroups, String userid){ + List userGroups2= this.getUserGroups(userGroups, userid); + return userGroups2!=null && userGroups2.size()>0; + } + /** + * 检查某个人是否为指定的小组的组长 + * @param xmGroupVo + * @param headUserid + * @return + */ + public boolean checkUserIsTeamHead(XmGroupVo xmGroupVo, String headUserid){ + if(xmGroupVo==null){ + return false; + } + if(headUserid.equals(xmGroupVo.getLeaderUserid())){ + return true; + } + return false; + + } + /** + * 检查某个人是否为指定的小组的组长\副组长\助理 + * @param xmGroupVo + * @param headUserid + * @return + */ + public boolean checkUserIsTeamHeadOrAss(XmGroupVo xmGroupVo, String headUserid){ + if(xmGroupVo==null){ + return false; + } + if(headUserid.equals(xmGroupVo.getLeaderUserid())||headUserid.equals(xmGroupVo.getAssUserid())){ + return true; + } + return false; + + } + /** + * 检查某个人是否另外一个人的组长 + * @param xmGroupVoList + * @param headUserid + * @param memUserid + * @return + */ + public boolean checkUserIsOtherUserTeamHead(List xmGroupVoList, String headUserid, String memUserid){ + if(xmGroupVoList==null || xmGroupVoList.size()==0) { + return false; + } + + List userGroups=this.getUserGroups(xmGroupVoList, memUserid); + if(userGroups==null || userGroups.size()==0) { + return false; + } + for (XmGroupVo ug : userGroups) { + if(headUserid.equals(ug.getLeaderUserid())){ + return true; + }else{ + Optional optional=xmGroupVoList.stream().filter(i->i.getId().equals(ug.getPgroupId())).findAny(); + while (optional!=null && optional.isPresent()){ + XmGroupVo g=optional.get(); + if(headUserid.equals(g.getLeaderUserid())){ + return true; + }else{ + optional=xmGroupVoList.stream().filter(i->i.getId().equals(g.getPgroupId())).findAny(); + } + + } + } + } + return false; + } + + /** + * 检查某个人是否另外一个人的组长 + * @param xmGroupVoList + * @param headUserid 检查headUserid是不是memUserid的组长 + * @param memUserid + * @return + */ + public boolean checkUserIsOtherUserTeamHeadOrAss(List xmGroupVoList, String headUserid, String memUserid){ + if(xmGroupVoList==null || xmGroupVoList.size()==0) { + return false; + } + + List userGroups=this.getUserGroups(xmGroupVoList, memUserid); + if(userGroups==null || userGroups.size()==0) { + return false; + } + for (XmGroupVo ug : userGroups) { + if(headUserid.equals(ug.getLeaderUserid())||headUserid.equals(ug.getAssUserid())){ + return true; + }else{ + Optional optional=xmGroupVoList.stream().filter(i->i.getId().equals(ug.getPgroupId())).findAny(); + while (optional!=null && optional.isPresent()){ + XmGroupVo g=optional.get(); + if(headUserid.equals(g.getLeaderUserid())||headUserid.equals(g.getAssUserid())){ + return true; + }else{ + optional=xmGroupVoList.stream().filter(i->i.getId().equals(g.getPgroupId())).findAny(); + } + + } + } + } + return false; + } + public List getProjectManagers(List xmGroupVoList){ + for (XmGroupVo g : xmGroupVoList) { + if("nbxmjl".equals(g.getPgTypeId())) { + return g.getGroupUsers(); + } + + } + return null; + + } - } - - + + /** + * 检测某个用户是否属于项目组的内部管理团队成员,内部管理组成员 + * @param xmGroupVoList + * @param pmUserid + * @return + */ + public boolean checkUserIsProjectManager(List xmGroupVoList , String pmUserid) { + if(xmGroupVoList==null || xmGroupVoList.size()==0) { + return false; + } + List getProjectManagers=this.getProjectManagers(xmGroupVoList); + if(getProjectManagers==null || getProjectManagers.size()==0) { + return false; + } + for (XmGroupUser user : getProjectManagers) { + if( user.getUserid().equals(pmUserid)) { + return true; + } + + } + return false; + } + + + public List getProjectGroupVoListByIterationId(String iterationId) { + + List list=this.xmProductProjectLinkService.selectListByIterationId(iterationId); + List datas=new ArrayList<>(); + if(list!=null && list.size()>0){ + for (XmProductProjectLink productProjectLink : list) { + List data0=this.getProjectGroupVoList(productProjectLink.getProjectId()); + if(data0!=null && data0.size()>0){ + datas.addAll(data0); + } + } + } + return datas; + } + + + + public List parentIdPathsCalcBeforeSave(List nodes) { + List noExistsList=nodes.stream().filter(i->!nodes.stream().filter(k->k.getId().equals(i.getPgroupId())).findAny().isPresent()).collect(Collectors.toList()); + noExistsList=noExistsList.stream().filter(i->StringUtils.hasText(i.getPgroupId())).collect(Collectors.toList()); + Map hadCalcMap=new HashMap<>(); + for (XmGroup node : noExistsList) { + if(hadCalcMap.containsKey(node.getPgroupId())){ + String idPaths=hadCalcMap.get(node.getPgroupId()); + node.setPidPaths(idPaths+node.getId()+","); + }else{ + this.parentIdPathsCalcBeforeSave(node); + String idPaths=node.getPidPaths(); + idPaths=idPaths.substring(0,idPaths.length()-node.getId().length()-1); + hadCalcMap.put(node.getPgroupId(),idPaths); + } + } + for (XmGroup node : nodes) { + if(!StringUtils.hasText(node.getPgroupId())){ + node.setPidPaths("0,"+node.getId()+","); + continue; + } + if(hadCalcMap.containsKey(node.getPgroupId())){ + String idPaths=hadCalcMap.get(node.getPgroupId()); + node.setPidPaths(idPaths+node.getId()+","); + }else{ + List pnodeList=this.getParentList(node,nodes); + if(pnodeList==null ||pnodeList.size()==0){ + node.setPidPaths("0,"+node.getPgroupId()+","+node.getId()+","); + continue; + } + XmGroup topParent=pnodeList.get(pnodeList.size()-1); + String idPath="0,"; + if(hadCalcMap.containsKey(topParent.getPgroupId())){ + idPath=hadCalcMap.get(topParent.getPgroupId()); + } + for (int i = pnodeList.size() - 1; i >= 0; i--) { + idPath=idPath+pnodeList.get(i).getId()+","; + } + node.setPidPaths(idPath+node.getId()+","); + } + } + for (XmGroup node : nodes) { + String idPaths=node.getPidPaths(); + String[] idpss=idPaths.split(","); + node.setLvl(idpss.length-1); + } + return nodes; + } + public static void main(String[] args) { String idpaths="0,1,2,3,"; String[] idpss=idpaths.split(","); @@ -164,7 +646,7 @@ public class XmGroupService extends BaseService { return tips; } public Tips checkHasProjectEditQx(User user,XmProject xmProject){ - Tips tips=new Tips("成功"); + Tips tips=new Tips("成功"); Map pmUserMap=new HashMap<>(); pmUserMap.put(xmProject.getCreateUserid(),xmProject.getCreateUsername()); pmUserMap.put(xmProject.getPmUserid(),xmProject.getPmUsername()); @@ -194,6 +676,32 @@ public class XmGroupService extends BaseService { return tips; } + public Tips checkHasEditProdcutGroupQx(User user, XmGroup group, XmGroup groupDb, XmProduct xmProductDb){ + Tips tips = new Tips("成功"); + if(groupDb==null){ + tips.setErrMsg("data-0","该小组已不存在"); + return tips; + } + Map proUsersMap=this.getProductAdmUsers(xmProductDb); + + if(StringUtils.hasText(group.getAssUserid()) && !group.getAssUserid().equals(groupDb.getAssUserid())){ + if(!proUsersMap.containsKey(user.getUserid()) && !user.getUserid().equals(groupDb.getLeaderUserid())){ + tips.setErrMsg("no-qx-change-pro-g-assUserid","您无权限修改小组助理.组长及以上人员可以修改。"); + } + } + if(StringUtils.hasText(group.getLeaderUserid()) && !group.getLeaderUserid().equals(groupDb.getLeaderUserid())){ + if(!proUsersMap.containsKey(user.getUserid())){ + tips.setErrMsg("no-qx-change-pro-g-leaderUserid","您无权限修改小组组长.产品级助理及以上人员可以修改。"); + } + } + if(StringUtils.hasText(group.getPgroupId()) && !group.getPgroupId().equals(groupDb.getPgroupId())){ + if(!proUsersMap.containsKey(user.getUserid())){ + tips.setErrMsg("no-qx-change-g-pgroupId","您无权限修改小组归属上级单位.产品级助理及以上人员可以修改。"); + } + } + return tips; + } + public Map getProjectAdmUsers(XmProject xmProject){ Map pmUserMap=new HashMap<>(); pmUserMap.put(xmProject.getCreateUserid(),xmProject.getCreateUsername()); @@ -202,26 +710,270 @@ public class XmGroupService extends BaseService { pmUserMap.put(xmProject.getAssUserid(),xmProject.getAssUsername()); return pmUserMap; } + public Tips checkHasEditProjectGroupQx(User user, XmGroup group, XmGroup groupDb, XmProject xmProject){ + Tips tips = new Tips("成功"); + if(groupDb==null){ + tips.setErrMsg("data-0","该小组已不存在"); + return tips; + } + + Map pmUserMap=this.getProjectAdmUsers(xmProject); + if(!pmUserMap.containsKey(user.getUserid())){ + if(!user.getUserid().equals(groupDb.getLeaderUserid()) && !user.getUserid().equals(groupDb.getAssUserid())){ + tips.setErrMsg("not-prj-group-adm-user","您无权修改小组信息。 组长助理及以上人员有权限修改。"); + return tips; + } + } + if(StringUtils.hasText(group.getAssUserid()) && !group.getAssUserid().equals(groupDb.getAssUserid())){ + if(!pmUserMap.containsKey(user.getUserid()) && !user.getUserid().equals(groupDb.getLeaderUserid())){ + tips.setErrMsg("no-qx-change-prj-g-assUserid","您无权限修改小组助理.组长及以上人员可以修改。"); + return tips; + } + } + if(StringUtils.hasText(group.getLeaderUserid()) && !group.getLeaderUserid().equals(groupDb.getLeaderUserid())){ + if(!pmUserMap.containsKey(user.getUserid())){ + tips.setErrMsg("no-qx-change-prj-g-leaderUserid","您无权限修改小组组长.项目级助理及以上人员可以修改。"); + return tips; + } + } + if(StringUtils.hasText(group.getPgroupId()) && !group.getPgroupId().equals(groupDb.getPgroupId())){ + if(!pmUserMap.containsKey(user.getUserid())){ + tips.setErrMsg("no-qx-change-prj-g-pgroupId","您无权限修改小组归属上级单位.项目级助理及以上人员可以修改。"); + return tips; + } + } + + return tips; + } + + public Tips parentIdPathsCalcBeforeSave(XmGroup currNode) { + Tips tips = new Tips("成功"); + if (!StringUtils.hasText(currNode.getPgroupId()) || "0".equals(currNode.getPgroupId())) { + currNode.setPidPaths("0," + currNode.getId() + ","); + currNode.setLvl(1); + return tips; + } else { + List parentList=this.getParentList(currNode); + if(parentList==null ||parentList.size()==0){ + currNode.setPidPaths("0,"+currNode.getPgroupId()+","+currNode.getId()+","); + currNode.setLvl(2); + return tips; + } + String idPath="0,"; + for (int i = parentList.size() - 1; i >= 0; i--) { + idPath=idPath+parentList.get(i).getId()+","; + } + currNode.setPidPaths(idPath+currNode.getId()+","); + + String idPaths=currNode.getPidPaths(); + String[] idpss=idPaths.split(","); + currNode.setLvl(idpss.length-1); + } + return tips; + } + private List getParentList(XmGroup currNode){ + List parentList=new ArrayList<>(); + XmGroup current=currNode; + while (true){ + if(!StringUtils.hasText(current.getPgroupId()) || "0".equals(current.getPgroupId())){ + return parentList; + } + XmGroup query=new XmGroup(); + query.setId(current.getPgroupId()); + current=this.selectOneObject(query); + if(current==null){ + return parentList; + } + parentList.add(current); + } + } - public List getSubDeptList(String pdeptid) { - List depts= sysClient.listSubDept(pdeptid); - return depts; + private List getParentList(XmGroup currNode, List nodes){ + List parentList=new ArrayList<>(); + XmGroup current=currNode; + while (true){ + if(!StringUtils.hasText(current.getPgroupId()) || "0".equals(current.getPgroupId())){ + return parentList; + } + XmGroup query=new XmGroup(); + query.setId(current.getPgroupId()); + Optional optional=nodes.stream().filter(i->i.getId().equals(query.getId())).findFirst(); + if(optional.isPresent()){ + current=optional.get(); + parentList.add(current); + }else{ + return parentList; + } + + } } - public List getUserGroups(List headGroups, String memUserid) { - return new ArrayList<>(); + + @Transactional + public void sumParents(XmGroup node){ + String id=node.getId(); + String pidPaths=node.getPidPaths(); + if(!StringUtils.hasText(pidPaths)){ + return; + } + if(!pidPaths.startsWith("0,")){ + return; + } + if("0".equals(node.getNtype())&&pidPaths.endsWith(id+",")){ + pidPaths=pidPaths.substring(2,pidPaths.indexOf(id)); + }else{ + pidPaths=pidPaths.substring(2); + } + + if(!StringUtils.hasText(pidPaths)){ + return; + } + String[] pidPathss=pidPaths.split(","); + List pidPathsList=new ArrayList<>(); + for (int i = pidPathss.length-1; i >=0; i--) { + pidPathsList.add(pidPathss[i]); + } + if(pidPathsList.size()>0){//暂时不处理,改由前端手段更新 + //super.update("sumParents",pidPathsList ); + } + } + @Transactional + public void batchSumParents(List xmTasks) { + List> list=new ArrayList<>(); + for (XmGroup node : xmTasks) { + String id=node.getId(); + String pidPaths=node.getPidPaths(); + if(!StringUtils.hasText(pidPaths)){ + continue; + } + if(!pidPaths.startsWith("0,")){ + continue; + } + if("0".equals(node.getNtype())){ + pidPaths=pidPaths.substring(2,pidPaths.indexOf(id)); + }else{ + pidPaths=pidPaths.substring(2); + } - public boolean checkUserExistsGroup(List groups, String memUserid) { - return true; + if(!StringUtils.hasText(pidPaths)){ + continue; + } + String[] pidPathss=pidPaths.split(","); + for (int i = 0; i ()); + } + Set set=list.get(i); + set.add(pidPathss[i]); + } + if(list.size()<=0){ + return; + } + Set allSet=new HashSet<>(); + for (int i = list.size() - 1; i >= 0; i--) { + Set set=list.get(i); + if(set.size()>0){ + List ids=set.stream().filter(k->!allSet.contains(k)).collect(Collectors.toList()); + if(ids.size()>0){ + allSet.addAll(ids.stream().collect(Collectors.toSet())); + //super.update("batchSumParents", ids);////暂时不处理,改由前端手段更新 + } + + } + + } + + + } + + } + + + /** + * 检查是否能删除干净所有儿子孙子节点。 + * @param delNode 当前删除节点 + * @param delNodes 本批量需要删除的全部节点 + * @return + */ + public boolean checkCanDelAllChild(XmGroup delNode, List delNodes) { + if(delNode==null){ + return true; + } + if(delNode.getChildrenCnt()==null||delNode.getChildrenCnt()<=0){ + return true; + } + List childList=delNodes.stream().filter(i->delNode.getId().equals(i.getPgroupId())).collect(Collectors.toList()); + if(childList==null||childList.size() groups, String headUserid, String memUserid) { - return true; + @Transactional + public void doBatchDeleteProductGroups(List canDelNodes) { + super.batchDelete(canDelNodes); + batchSumParents(canDelNodes); } - public void addGroups(String projectId, List gs) { + @Transactional + public void doBatchDeleteProjectGroups(List canDelNodes) { + super.batchDelete(canDelNodes); + batchSumParents(canDelNodes); + } + + public XmGroupVo getProductGroupFromCache(String productId, String groupId) { + XmGroupVo groupVo=groupCacheService.getProductGroup(productId,groupId); + if(groupVo==null){ + XmGroup group=this.selectOneObject(new XmGroup(groupId)); + if(group==null){ + return null; + }else{ + XmGroupUser xmGroupUser=new XmGroupUser(); + xmGroupUser.setGroupId(groupId); + List users=this.xmGroupUserService.selectListByWhere(xmGroupUser); + XmGroupVo xmGroupVo=new XmGroupVo(); + BeanUtils.copyProperties(group,xmGroupVo); + xmGroupVo.setGroupUsers(users); + this.groupCacheService.putProductGroup(xmGroupVo); + return xmGroupVo; + } + }else { + return groupVo; + } + } + public XmGroupVo getProjectGroupFromCache(String projectId, String groupId) { + XmGroupVo groupVo=groupCacheService.getProjectGroup(projectId,groupId); + if(groupVo==null){ + XmGroup group=this.selectOneObject(new XmGroup(groupId)); + if(group==null){ + return null; + }else{ + XmGroupUser xmGroupUser=new XmGroupUser(); + xmGroupUser.setGroupId(groupId); + List users=this.xmGroupUserService.selectListByWhere(xmGroupUser); + XmGroupVo xmGroupVo=new XmGroupVo(); + BeanUtils.copyProperties(group,xmGroupVo); + xmGroupVo.setGroupUsers(users); + this.groupCacheService.putProjectGroup(xmGroupVo); + return xmGroupVo; + } + }else { + return groupVo; + } } }