|
|
|
@ -1,22 +1,24 @@ |
|
|
|
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; |
|
|
|
|
|
|
|
/** |
|
|
|
* 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.<br> |
|
|
|
@ -30,7 +32,14 @@ public class XmGroupService extends BaseService<XmGroupMapper, XmGroup> { |
|
|
|
@Autowired |
|
|
|
XmRecordService xmRecordService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
XmGroupService xmGroupService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
XmGroupUserService xmGroupUserService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
XmGroupCacheService groupCacheService; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
@ -50,13 +59,25 @@ public class XmGroupService extends BaseService<XmGroupMapper, XmGroup> { |
|
|
|
@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("成功"); |
|
|
|
List<XmGroupVo> pgroups=new ArrayList<>(); |
|
|
|
boolean isAdm=this.checkUserIsProductAdm(productId, user.getUserid()); |
|
|
|
if(!isAdm){ |
|
|
|
boolean isHead=false; |
|
|
|
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","您无权操作!产品经理、组长可以操作。"); |
|
|
|
} |
|
|
|
@ -68,15 +89,100 @@ public class XmGroupService extends BaseService<XmGroupMapper, XmGroup> { |
|
|
|
|
|
|
|
public Tips checkIsProjectAdmOrTeamHeadOrAss(User user, String tardgetUserid, String projectId){ |
|
|
|
Tips tips = new Tips("成功"); |
|
|
|
List<XmGroupVo> 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<XmGroupVo> getProductGroupVoList(String productId) { |
|
|
|
List<XmGroupVo> groupVoList=new ArrayList<>(); |
|
|
|
List<XmGroupVo> groupVoList2 = groupCacheService.getProductGroups(productId); |
|
|
|
if(groupVoList2==null||groupVoList2.size()==0) { |
|
|
|
|
|
|
|
XmGroup group = new XmGroup(); |
|
|
|
group.setProductId(productId); |
|
|
|
List<XmGroup> groupList = this.selectListByWhere(group); |
|
|
|
if(groupList==null || groupList.size()==0) { |
|
|
|
groupCacheService.putProductGroups(productId, groupVoList); |
|
|
|
return groupVoList; |
|
|
|
} |
|
|
|
List<XmGroupUser> 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<XmGroupUser> 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<XmGroupVo> getProjectGroupVoList(String projectId) { |
|
|
|
List<XmGroupVo> groupVoList=new ArrayList<>(); |
|
|
|
List<XmGroupVo> groupVoList2 = groupCacheService.getProjectGroups(projectId); |
|
|
|
if(groupVoList2==null||groupVoList2.size()==0) { |
|
|
|
|
|
|
|
XmGroup group = new XmGroup(); |
|
|
|
group.setProjectId(projectId); |
|
|
|
List<XmGroup> groupList = this.selectListByWhere(group); |
|
|
|
if(groupList==null || groupList.size()==0) { |
|
|
|
groupCacheService.putProjectGroups(projectId, groupVoList); |
|
|
|
return groupVoList; |
|
|
|
} |
|
|
|
List<XmGroupUser> 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<XmGroupUser> 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){ |
|
|
|
@ -122,19 +228,395 @@ public class XmGroupService extends BaseService<XmGroupMapper, XmGroup> { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 新增项目时,同时新增项目团队及小组组员等 |
|
|
|
* @param projectId |
|
|
|
* @param xmGroupVoList |
|
|
|
*/ |
|
|
|
@Transactional |
|
|
|
public void addGroups(String projectId,List<XmGroupVo> xmGroupVoList) { |
|
|
|
List<XmGroup> groups=new ArrayList<>(); |
|
|
|
List<XmGroupUser> groupUsers=new ArrayList<>(); |
|
|
|
for (XmGroupVo xmGroupVo : xmGroupVoList) { |
|
|
|
XmGroup group=new XmGroup(); |
|
|
|
xmGroupVo.setId(this.createKey("id")); |
|
|
|
BeanUtils.copyProperties(xmGroupVo, group); |
|
|
|
groups.add(group); |
|
|
|
List<XmGroupUser> 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<XmGroupUser> users=group.getGroupUsers(); |
|
|
|
List<Map<String,Object>> umaps=new ArrayList<>(); |
|
|
|
for (XmGroupUser xmGroupUser : users) { |
|
|
|
Map<String,Object> 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); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
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 boolean checkUserExistsProjectGroup(String projectId, String userid){ |
|
|
|
public void pushMsg(User user, XmGroup g, List<Map<String,Object>> 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<XmGroupVo> getUserGroupsByProjectId(String projectId, String userid){ |
|
|
|
List<XmGroupVo> xmGroupVoList=this.getProjectGroupVoList(projectId); |
|
|
|
return this.getUserGroups(xmGroupVoList, userid); |
|
|
|
} |
|
|
|
/** |
|
|
|
* 获取用户在某个产品中的组 |
|
|
|
* @param productId |
|
|
|
* @param userid |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public List<XmGroupVo> getUserGroupsByProductId(String productId, String userid){ |
|
|
|
List<XmGroupVo> xmGroupVoList=this.getProductGroupVoList(productId); |
|
|
|
return this.getUserGroups(xmGroupVoList, userid); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 检查用户是否在一些组中任意个组当组长 |
|
|
|
* @param xmGroupVoList |
|
|
|
* @param teamHeadUserid |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public boolean checkUserIsHeadInGroups(List<XmGroupVo> 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<XmGroupVo> 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<XmGroupVo> getUserGroups(List<XmGroupVo> xmGroupVoList, String userid){ |
|
|
|
List<XmGroupVo> 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<XmGroupUser> 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<XmGroupVo> userGroups= getUserGroupsByProjectId(projectId,userid); |
|
|
|
return userGroups!=null && userGroups.size()>0; |
|
|
|
|
|
|
|
} |
|
|
|
public boolean checkUserExistsProductGroup(String productId, String userid){ |
|
|
|
List<XmGroupVo> userGroups= getUserGroupsByProductId(productId,userid); |
|
|
|
return userGroups!=null && userGroups.size()>0; |
|
|
|
|
|
|
|
} |
|
|
|
public boolean checkUserExistsGroup(List<XmGroupVo> userGroups, String userid){ |
|
|
|
List<XmGroupVo> 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<XmGroupVo> xmGroupVoList, String headUserid, String memUserid){ |
|
|
|
if(xmGroupVoList==null || xmGroupVoList.size()==0) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
List<XmGroupVo> 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<XmGroupVo> 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<XmGroupVo> xmGroupVoList, String headUserid, String memUserid){ |
|
|
|
if(xmGroupVoList==null || xmGroupVoList.size()==0) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
List<XmGroupVo> 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<XmGroupVo> 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<XmGroupUser> getProjectManagers(List<XmGroupVo> xmGroupVoList){ |
|
|
|
for (XmGroupVo g : xmGroupVoList) { |
|
|
|
if("nbxmjl".equals(g.getPgTypeId())) { |
|
|
|
return g.getGroupUsers(); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
return null; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* 检测某个用户是否属于项目组的内部管理团队成员,内部管理组成员 |
|
|
|
* @param xmGroupVoList |
|
|
|
* @param pmUserid |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
public boolean checkUserIsProjectManager(List<XmGroupVo> xmGroupVoList , String pmUserid) { |
|
|
|
if(xmGroupVoList==null || xmGroupVoList.size()==0) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
List<XmGroupUser> 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<XmGroupVo> getProjectGroupVoListByIterationId(String iterationId) { |
|
|
|
|
|
|
|
List<XmProductProjectLink> list=this.xmProductProjectLinkService.selectListByIterationId(iterationId); |
|
|
|
List<XmGroupVo> datas=new ArrayList<>(); |
|
|
|
if(list!=null && list.size()>0){ |
|
|
|
for (XmProductProjectLink productProjectLink : list) { |
|
|
|
List<XmGroupVo> data0=this.getProjectGroupVoList(productProjectLink.getProjectId()); |
|
|
|
if(data0!=null && data0.size()>0){ |
|
|
|
datas.addAll(data0); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return datas; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public List<XmGroup> parentIdPathsCalcBeforeSave(List<XmGroup> nodes) { |
|
|
|
List<XmGroup> 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<String,String> 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<XmGroup> 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(","); |
|
|
|
@ -194,6 +676,32 @@ public class XmGroupService extends BaseService<XmGroupMapper, XmGroup> { |
|
|
|
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<String,String> 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<String,String> getProjectAdmUsers(XmProject xmProject){ |
|
|
|
Map<String,String> pmUserMap=new HashMap<>(); |
|
|
|
pmUserMap.put(xmProject.getCreateUserid(),xmProject.getCreateUsername()); |
|
|
|
@ -202,26 +710,270 @@ public class XmGroupService extends BaseService<XmGroupMapper, XmGroup> { |
|
|
|
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<String,String> 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 List<Dept> getSubDeptList(String pdeptid) { |
|
|
|
List<Dept> depts= sysClient.listSubDept(pdeptid); |
|
|
|
return depts; |
|
|
|
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<XmGroup> 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()+","); |
|
|
|
|
|
|
|
public List<Dept> getUserGroups(List<Dept> headGroups, String memUserid) { |
|
|
|
return new ArrayList<>(); |
|
|
|
String idPaths=currNode.getPidPaths(); |
|
|
|
String[] idpss=idPaths.split(","); |
|
|
|
currNode.setLvl(idpss.length-1); |
|
|
|
} |
|
|
|
return tips; |
|
|
|
} |
|
|
|
|
|
|
|
public boolean checkUserExistsGroup(List<Dept> groups, String memUserid) { |
|
|
|
return true; |
|
|
|
private List<XmGroup> getParentList(XmGroup currNode){ |
|
|
|
List<XmGroup> 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); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private List<XmGroup> getParentList(XmGroup currNode, List<XmGroup> nodes){ |
|
|
|
List<XmGroup> 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<XmGroup> optional=nodes.stream().filter(i->i.getId().equals(query.getId())).findFirst(); |
|
|
|
if(optional.isPresent()){ |
|
|
|
current=optional.get(); |
|
|
|
parentList.add(current); |
|
|
|
}else{ |
|
|
|
return parentList; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@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<String> pidPathsList=new ArrayList<>(); |
|
|
|
for (int i = pidPathss.length-1; i >=0; i--) { |
|
|
|
pidPathsList.add(pidPathss[i]); |
|
|
|
} |
|
|
|
if(pidPathsList.size()>0){//暂时不处理,改由前端手段更新 |
|
|
|
//super.update("sumParents",pidPathsList ); |
|
|
|
} |
|
|
|
|
|
|
|
public boolean checkUserIsOtherUserTeamHeadOrAss(List<Dept> groups, String headUserid, String memUserid) { |
|
|
|
} |
|
|
|
@Transactional |
|
|
|
public void batchSumParents(List<XmGroup> xmTasks) { |
|
|
|
List<Set<String>> 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); |
|
|
|
} |
|
|
|
|
|
|
|
if(!StringUtils.hasText(pidPaths)){ |
|
|
|
continue; |
|
|
|
} |
|
|
|
String[] pidPathss=pidPaths.split(","); |
|
|
|
for (int i = 0; i <pidPathss.length; i++) { |
|
|
|
if(list.size()<=i){ |
|
|
|
list.add(new HashSet<>()); |
|
|
|
} |
|
|
|
Set<String> set=list.get(i); |
|
|
|
set.add(pidPathss[i]); |
|
|
|
} |
|
|
|
if(list.size()<=0){ |
|
|
|
return; |
|
|
|
} |
|
|
|
Set<String> allSet=new HashSet<>(); |
|
|
|
for (int i = list.size() - 1; i >= 0; i--) { |
|
|
|
Set<String> set=list.get(i); |
|
|
|
if(set.size()>0){ |
|
|
|
List<String> 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<XmGroup> delNodes) { |
|
|
|
if(delNode==null){ |
|
|
|
return true; |
|
|
|
} |
|
|
|
if(delNode.getChildrenCnt()==null||delNode.getChildrenCnt()<=0){ |
|
|
|
return true; |
|
|
|
} |
|
|
|
List<XmGroup> childList=delNodes.stream().filter(i->delNode.getId().equals(i.getPgroupId())).collect(Collectors.toList()); |
|
|
|
if(childList==null||childList.size()<delNode.getChildrenCnt()){ |
|
|
|
return false; |
|
|
|
} |
|
|
|
for (XmGroup n : childList) { |
|
|
|
if (!this.checkCanDelAllChild(n, delNodes)) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
return true; |
|
|
|
|
|
|
|
public void addGroups(String projectId, List<Dept> gs) { |
|
|
|
} |
|
|
|
|
|
|
|
@Transactional |
|
|
|
public void doDeleteByPk(XmGroup xmGroup, XmGroup groupDb) { |
|
|
|
super.deleteByPk(xmGroup); |
|
|
|
this.sumParents(groupDb); |
|
|
|
} |
|
|
|
|
|
|
|
@Transactional |
|
|
|
public void doBatchDeleteProductGroups(List<XmGroup> canDelNodes) { |
|
|
|
super.batchDelete(canDelNodes); |
|
|
|
batchSumParents(canDelNodes); |
|
|
|
} |
|
|
|
|
|
|
|
@Transactional |
|
|
|
public void doBatchDeleteProjectGroups(List<XmGroup> 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<XmGroupUser> 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<XmGroupUser> 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; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|