Browse Source

团队重构

master
陈裕财 3 years ago
parent
commit
fee2953884
  1. 206
      xm-core/src/main/java/com/xm/core/ctrl/XmMenuController.java
  2. 91
      xm-core/src/main/java/com/xm/core/service/XmGroupService.java

206
xm-core/src/main/java/com/xm/core/ctrl/XmMenuController.java

@ -20,6 +20,7 @@ import com.xm.core.entity.XmTask;
import com.xm.core.queue.XmMenuSumParentsPushService;
import com.xm.core.service.*;
import com.xm.core.vo.BatchChangeParentMenuVo;
import com.xm.core.vo.XmGroupVo;
import io.swagger.annotations.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -284,19 +285,14 @@ public class XmMenuController {
return ResponseHelper.failed("dclass-not-1","一级需求目录只能是史诗");
}
}
/**
* 检查权限如果是产品经理助理副经理->通过
* 如果是产品组员->通过
* 如果都不是拒绝
*/
XmProduct xmProduct= productService.getProductFromCache(xmMenu.getProductId());
if(xmProduct==null){
return ResponseHelper.failed("data-0","产品已不存在");
}
if(!groupService.checkUserIsProductAdm(xmProduct,user.getUserid())){
if(!groupService.checkUserExistsProductGroup(xmMenu.getProductId(),user.getUserid())){
return ResponseHelper.failed("noqx-add","只有产品团队成员可以新增需求。【"+user.getUsername()+"】不在产品团队中,请将其拉入产品团队。");
}
tips=groupService.checkProductQx(xmProduct,1,user);
if(!tips.isOk()){
return failed(tips);
}
@ -358,19 +354,13 @@ public class XmMenuController {
if(childrenCnt>0){
return ResponseHelper.failed("childrenCnt-1","存在"+childrenCnt+"个子需求,不允许删除,请先删除子需求");
}
/**
* 检查权限如果是产品经理助理副经理->通过
* 如果是产品组员->通过
* 如果都不是拒绝
*/
XmProduct xmProduct= productService.getProductFromCache(xmMenuDb.getProductId());
if(xmProduct==null){
return ResponseHelper.failed("product-data-0","产品已不存在");
}
if(!groupService.checkUserIsProductAdm(xmProduct,user.getUserid())){
if(!groupService.checkUserExistsProductGroup(xmMenuDb.getProductId(),user.getUserid())){
return ResponseHelper.failed("noqx-del","只有产品团队成员可以删除需求。【"+user.getUsername()+"】不在产品团队中,请将其拉入产品团队。");
}
tips=groupService.checkProductQx(xmProduct,1,user,xmMenuDb.getMmUserid());
if(!tips.isOk()){
return failed(tips);
}
xmMenuService.deleteByPk(xmMenu);
xmRecordService.addXmMenuRecord(xmMenuDb.getProductId(),xmMenu.getMenuId(),"删除产品需求","删除需求"+xmMenuDb.getMenuName(),"",JSON.toJSONString(xmMenu));
@ -404,19 +394,13 @@ public class XmMenuController {
ResponseHelper.failed("menuId-0","menuId不能为空");
}
XmMenu xmMenuDb=this.xmMenuService.selectOneById(xmMenu.getMenuId());
/**
* 检查权限如果是产品经理助理副经理->通过
* 如果是产品组员->通过
* 如果都不是拒绝
*/
XmProduct xmProduct= productService.getProductFromCache(xmMenuDb.getProductId());
if(xmProduct==null){
return ResponseHelper.failed("product-data-0","产品已不存在");
}
if(!groupService.checkUserIsProductAdm(xmProduct,user.getUserid())){
if(!groupService.checkUserExistsProductGroup(xmMenuDb.getProductId(),user.getUserid())){
return ResponseHelper.failed("noqx-edit","只有产品团队成员可以修改需求。【"+user.getUsername()+"】不在产品团队中,请将其拉入产品团队。");
}
tips=groupService.checkProductQx(xmProduct,1,user,xmMenuDb.getMmUserid());
if(!tips.isOk()){
return failed(tips);
}
if("1".equals(xmMenuDb.getNtype())){
@ -488,54 +472,70 @@ public class XmMenuController {
if(xmMenusDb.stream().filter(k->!xmMenuDb.getProductId().equals(k.getProductId())).findAny().isPresent()){
return ResponseHelper.failed("no-same-productId","批量操作只能在同一个产品进行。");
}
/**
* 检查权限如果是产品经理助理副经理->通过
* 如果是产品组员->通过
* 如果都不是拒绝
*/
XmProduct xmProduct= productService.getProductFromCache(xmMenuDb.getProductId());
if(xmProduct==null){
return ResponseHelper.failed("product-data-0","产品已不存在");
}
if(!groupService.checkUserIsProductAdm(xmProduct,user.getUserid())){
if(!groupService.checkUserExistsProductGroup(xmMenuDb.getProductId(),user.getUserid())){
return ResponseHelper.failed("noqx-edit","只有产品团队成员可以修改需求。【"+user.getUsername()+"】不在产品团队中,请将其拉入产品团队。");
}
Map<String,List<XmGroupVo>> groupsMap=new HashMap<>();
tips=groupService.checkProductQx(groupsMap,xmProduct,1,user);
if(!tips.isOk()){
return failed(tips);
}
if(xmMenuMap.containsKey("mmUserid")){
String mmUserid= (String) xmMenuMap.get("mmUserid");
String mmUsername= (String) xmMenuMap.get("mmUsername");
if(!user.getUserid().equals(mmUserid)){
if(!groupService.checkUserExistsProductGroup(xmMenuDb.getProductId(),mmUserid)){
return ResponseHelper.failed("no-in-pteam","【"+mmUsername+"】不是产品团队成员,不允许成为需求负责人。");
tips=groupService.checkProductQx(groupsMap,xmProduct,1,user,mmUserid);
if(!tips.isOk()){
return failed(tips);
}
}
}
List<XmMenu> can=xmMenusDb;
if(can.size()<=0){
return ResponseHelper.failed("noqx","您无权修改选中的需求。");
List<XmMenu> canOper=new ArrayList<>();
List<XmMenu> noOper=new ArrayList<>();
Map<String,Tips> noOperTips=new HashMap<>();
for (XmMenu xm : xmMenusDb) {
tips=groupService.checkProductQx(groupsMap,xmProduct,1,user,xm.getMmUserid());
if(tips.isOk()){
canOper.add(xm);
}else{
noOper.add(xm);
noOperTips.put(tips.getMsg(),tips);
}
}
if(canOper.size()>0){
xmMenuMap.put("ltime",new Date());
xmMenuMap.put("ids",canOper.stream().map(k->k.getMenuId()).collect(Collectors.toList()));
xmMenuService.editSomeFields(xmMenuMap);
if(xmMenuMap.containsKey("mmUserid")){
for (XmMenu menu : canOper) {
notifyMsgService.pushMsg(user,xmMenu.getMmUserid(),xmMenu.getMmUsername(),"4",menu.getProductId(),menu.getMenuId(),"您成为需求【"+menu.getMenuName()+"】的负责人,请跟进需求!");
}
xmMenuMap.put("ltime",new Date());
xmMenuService.editSomeFields(xmMenuMap);
if(xmMenuMap.containsKey("mmUserid")){
for (XmMenu menu : can) {
notifyMsgService.pushMsg(user,xmMenu.getMmUserid(),xmMenu.getMmUsername(),"4",menu.getProductId(),menu.getMenuId(),"您成为需求【"+menu.getMenuName()+"】的负责人,请跟进需求!");
}
}
xmMenuMap.remove("ltime");
xmMenuMap.remove("menuIds");
String json=JSON.toJSONString(xmMenu);
for (XmMenu canDb : canOper) {
xmMenuMap.remove("ltime");
xmMenuMap.remove("menuIds");
String json=JSON.toJSONString(xmMenu);
for (XmMenu canDb : can) {
xmRecordService.addXmMenuRecord(canDb.getProductId(),canDb.getMenuId(),"修改产品需求","修改产品需求"+canDb.getMenuName(),json, "");
xmRecordService.addXmMenuRecord(canDb.getProductId(),canDb.getMenuId(),"修改产品需求","修改产品需求"+canDb.getMenuName(),json, "");
}
}
List<String> msgs=new ArrayList<>();
if(canOper.size()>0){
msgs.add(String.format("修改了%s个需求。",canOper.size()));
}
if(noOper.size()>0){
msgs.add(String.format("其中%s个需求,无权限修改。原因【%s】",noOper.size(),noOperTips.keySet().stream().collect(Collectors.joining(";"))));
}
if(canOper.size()>0){
tips.setOkMsg(msgs.stream().collect(Collectors.joining()));
}else{
tips.setFailureMsg(msgs.stream().collect(Collectors.joining()));
}
//m.put("data",xmMenu);
}catch (BizException e) {
tips=e.getTips();
@ -575,50 +575,57 @@ public class XmMenuController {
if(xmMenusDb.stream().filter(k->!xmMenuDb.getProductId().equals(k.getProductId())).findAny().isPresent()){
return ResponseHelper.failed("no-same-productId","批量操作只能在同一个产品进行。");
}
/**
* 检查权限如果是产品经理助理副经理->通过
* 如果是产品组员->通过
* 如果都不是拒绝
*/
List<XmMenu> canOper=new ArrayList<>();
List<XmMenu> noOper=new ArrayList<>();
Map<String,Tips> noOperTips=new HashMap<>();
Map<String,List<XmGroupVo>> groupsMap=new HashMap<>();
XmProduct xmProduct= productService.getProductFromCache(xmMenuDb.getProductId());
if(xmProduct==null){
return ResponseHelper.failed("product-data-0","产品已不存在");
}
if(!groupService.checkUserIsProductAdm(xmProduct,user.getUserid())){
if(!groupService.checkUserExistsProductGroup(xmMenuDb.getProductId(),user.getUserid())){
return ResponseHelper.failed("noqx-del","只有产品团队成员可以删除需求。【"+user.getUsername()+"】不在产品团队中,请将其拉入产品团队。");
for (XmMenu xm : xmMenusDb) {
tips=groupService.checkProductQx(groupsMap,xmProduct,1,user,xm.getMmUserid());
if(tips.isOk()){
canOper.add(xm);
}else{
noOper.add(xm);
noOperTips.put(tips.getMsg(),tips);
}
}
List<XmMenu> can=xmMenusDb;
if(can.size()<=0){
return ResponseHelper.failed("noqx","您无权删除选中的需求。");
}
for (XmMenu xmMenu : xmMenusDb) {
boolean canDel=this.xmMenuService.checkCanDelAllChild(xmMenu,xmMenusDb);
if(canDel){
canDelList.add(xmMenu);
}else{
hasChildMenus.add(xmMenu.getMenuName());
if(canOper.size()>0){
for (XmMenu xmMenu : canOper) {
boolean canDel=this.xmMenuService.checkCanDelAllChild(xmMenu,canOper);
if(canDel){
canDelList.add(xmMenu);
}else{
hasChildMenus.add(xmMenu.getMenuName());
}
}
if(canDelList.size()>0) {
xmMenuService.doBatchDelete(canDelList);
}
for (XmMenu canDb : canDelList) {
xmRecordService.addXmMenuRecord(canDb.getProductId(),canDb.getMenuId(),"删除产品需求","删除产品需求"+canDb.getMenuName(), "",JSON.toJSONString(canDb));
}
}
List<XmMenu> noQxResult=xmMenus.stream().filter(i->!xmMenusDb.stream().filter(k->k.getMenuId().equals(i.getMenuId())).findAny().isPresent()).collect(Collectors.toList());
if(canDelList.size()>0) {
xmMenuService.doBatchDelete(canDelList);
List<String> msgs=new ArrayList<>();
if(canDelList.size()>0){
msgs.add(String.format("修改了%s个需求。",canDelList.size()));
}
List<String> msg=new ArrayList<>();
msg.add("成功删除"+canDelList.size()+"个需求信息。");
if(hasChildMenus.size()>0 ) {
msg.add("以下"+hasChildMenus.size()+"个需求存在子需求,不允许删除,【"+StringUtils.arrayToDelimitedString(hasChildMenus.toArray(), ",")+"】.");
if(noOper.size()>0){
msgs.add(String.format("其中%s个需求,无权限删除。原因【%s】",noOper.size(),noOperTips.keySet().stream().collect(Collectors.joining(";"))));
}
if(noQxResult.size()>0){
msg.add("无权限操作以下"+noQxResult.size()+"个需求,【"+noQxResult.stream().map(i->i.getMenuName()).collect(Collectors.joining(",")) +"】.");
if(hasChildMenus.size()>0){
msgs.add(String.format("其中%s个需求,存在子需求,不能删除。分别是【%s】",hasChildMenus.size(),hasChildMenus.stream().collect(Collectors.joining(","))));
}
if(canDelList.size()==0){
tips.setFailureMsg(msg.stream().collect(Collectors.joining(" ")));
if(canDelList.size()>0){
tips.setOkMsg(msgs.stream().collect(Collectors.joining()));
}else{
tips.setOkMsg(msg.stream().collect(Collectors.joining(" ")));
tips.setFailureMsg(msgs.stream().collect(Collectors.joining()));
}
}catch (BizException e) {
tips=e.getTips();
@ -707,21 +714,28 @@ public class XmMenuController {
if( !"1".equals(parentDb.getDclass()) && !"2".equals(parentDb.getDclass()) && !"0".equals(parentDb.getDclass())){
return ResponseHelper.failed("parentMenu-dclass-not-1", "【"+parentDb.getMenuName()+"】为故事,不能作为上级节点。请另选上级。");
}
/**
* 检查权限如果是产品经理助理副经理->通过
* 如果是产品组员->通过
* 如果都不是拒绝
*/
List<XmMenu> canOper=new ArrayList<>();
List<XmMenu> noOper=new ArrayList<>();
Map<String,Tips> noOperTips=new HashMap<>();
Map<String,List<XmGroupVo>> groupsMap=new HashMap<>();
XmProduct xmProduct= productService.getProductFromCache(xmMenuDb.getProductId());
if(xmProduct==null){
return ResponseHelper.failed("product-data-0","产品已不存在");
}
if(!groupService.checkUserIsProductAdm(xmProduct,user.getUserid())){
if(!groupService.checkUserExistsProductGroup(xmMenuDb.getProductId(),user.getUserid())){
return ResponseHelper.failed("noqx","只有产品团队成员可以修改需求。【"+user.getUsername()+"】不在产品团队中,请将其拉入产品团队。");
for (XmMenu xm : xmMenusDb) {
tips=groupService.checkProductQx(groupsMap,xmProduct,1,user,xm.getMmUserid());
if(tips.isOk()){
canOper.add(xm);
}else{
if(xm.getMenuId().equals(parentDb.getMenuId())){
return ResponseHelper.failed("pmenu-id-0",String.format("无权限挂接需求到【%s】,原因【%s】",xm.getMenuName(),tips.getMsg()));
}
noOper.add(xm);
noOperTips.put(tips.getMsg(),tips);
}
}
xmMenusDb=xmMenusDb.stream().filter(i->!i.getMenuId().equals(parentDb.getMenuId())).collect(Collectors.toList());
xmMenusDb=canOper.stream().filter(i->!i.getMenuId().equals(parentDb.getMenuId())).collect(Collectors.toList());
List<XmMenu> canOpxmMenus=xmMenusDb.stream().filter(i->!parentDb.getMenuId().equals(i.getPmenuId())).collect(Collectors.toList());
List<XmMenu> sameParentMenus=xmMenusDb.stream().filter(i->parentDb.getMenuId().equals(i.getPmenuId())).collect(Collectors.toList());
if(canOpxmMenus.size()==0){

91
xm-core/src/main/java/com/xm/core/service/XmGroupService.java

@ -151,7 +151,6 @@ public class XmGroupService extends BaseService {
}
/**
*
* @param xmProduct
@ -165,29 +164,59 @@ public class XmGroupService extends BaseService {
if(headIsPm){
return tips;
}
tips=this.checkProductScopeQx(xmProduct,teamType,head);
Map<String,List<XmGroupVo>> groupsMap=new HashMap<>();
tips=this.checkProductScopeQx(groupsMap,xmProduct,teamType,head);
if(!tips.isOk()){
return tips;
}
return this.checkProductTransmitQx(xmProduct,teamType,head.getUserid(),head.getUserid());
return this.checkProductTransmitQx(groupsMap,xmProduct,teamType,head.getUserid(),head.getUserid());
}
public Tips checkProductQx(XmProduct xmProduct,int teamType,User head,String ...memUserids){
Tips tips=new Tips("成功");
Map<String,List<XmGroupVo>> groupsMap=new HashMap<>();
tips=this.checkProductScopeQx(groupsMap,xmProduct,teamType,head,memUserids);
if(!tips.isOk()){
return tips;
}
return this.checkProductTransmitQx(groupsMap,xmProduct,teamType,head.getUserid(),memUserids);
}
/**
*
* @param groupsMap 产品组缓存数据当需要循环执行时避免多次查询缓存与数据库
* @param xmProduct
* @param teamType 0-需求人员 1-测试人员,2-迭代人员
* @param head
* @return
*/
public Tips checkProductQx(Map<String,List<XmGroupVo>> groupsMap,XmProduct xmProduct,int teamType,User head){
Tips tips=new Tips("成功");
boolean headIsPm=this.checkUserIsProductAdm(xmProduct,head.getUserid());
if(headIsPm){
return tips;
}
tips=this.checkProductScopeQx(groupsMap,xmProduct,teamType,head);
if(!tips.isOk()){
return tips;
}
return this.checkProductTransmitQx(groupsMap,xmProduct,teamType,head.getUserid(),head.getUserid());
}
public Tips checkProductQx(Map<String,List<XmGroupVo>> groupsMap,XmProduct xmProduct,int teamType,User head,String ...memUserids){
Tips tips=new Tips("成功");
tips=this.checkProductScopeQx(xmProduct,teamType,head,memUserids);
tips=this.checkProductScopeQx(groupsMap,xmProduct,teamType,head,memUserids);
if(!tips.isOk()){
return tips;
}
return this.checkProductTransmitQx(xmProduct,teamType,head.getUserid(),memUserids);
return this.checkProductTransmitQx(groupsMap,xmProduct,teamType,head.getUserid(),memUserids);
}
public Tips checkProductScopeQx(XmProduct xmProduct,int teamType,User head,String ...memUserids){
public Tips checkProductScopeQx(Map<String,List<XmGroupVo>> groupsMap,XmProduct xmProduct,int teamType,User head,String ...memUserids){
Tips tips=new Tips("成功");
if(memUserids==null || memUserids.length==0){
return this.checkProductScopeQx(xmProduct,teamType,head.getUserid(),head.getUsername(),head.getBranchId());
return this.checkProductScopeQx(groupsMap,xmProduct,teamType,head.getUserid(),head.getUsername(),head.getBranchId());
}
Set<String> memUseridSet= Arrays.stream(memUserids).filter(k->StringUtils.hasText(k)&&!k.equals(head.getUserid())).collect(Collectors.toSet());
if(memUseridSet.size()==0){
return this.checkProductScopeQx(xmProduct,teamType,head.getUserid(),head.getUsername(),head.getBranchId());
return this.checkProductScopeQx(groupsMap,xmProduct,teamType,head.getUserid(),head.getUsername(),head.getBranchId());
}
String username=head.getUsername();
String scopeQx= QxTool.getProductScopeQx(xmProduct.getQxCode(),teamType);
@ -220,7 +249,7 @@ public class XmGroupService extends BaseService {
}else if("2".equals(scopeQx)){//同产品
List<XmGroupVo> groups=this.getProductGroupVoList(xmProduct.getId());
List<XmGroupVo> groups=this.getProductGroupsFromLocalCache(groupsMap,xmProduct.getId());
if( !headIsPm && !this.checkUserExistsGroup(groups, head.getUserid())){
tips.setFailureMsg("pdqx-scope-product-0",String.format("产品【%s】只开放给同产品团队人员,【%s】不在产品团队中。",xmProduct.getId(),username));
return tips;
@ -236,8 +265,8 @@ public class XmGroupService extends BaseService {
tips.setFailureMsg("pdqx-scope-product-1",String.format("产品【%s】只开放给同产品团队人员,【%s】不在产品团队中。",xmProduct.getId(),memUseridSet.stream().collect(Collectors.joining(","))));
return tips;
}else if("3".equals(scopeQx)){//同小组
List<XmGroupVo> groups=this.getProductGroupVoList(xmProduct.getId());
List<XmGroupVo> headGroups=groups;
List<XmGroupVo> groups=this.getProductGroupsFromLocalCache(groupsMap,xmProduct.getId());
List<XmGroupVo> headGroups=groups;
if( !headIsPm ){
headGroups=this.getUserGroups(groups,head.getUserid());
@ -270,7 +299,7 @@ public class XmGroupService extends BaseService {
* @param ubranchId
* @return
*/
public Tips checkProductScopeQx(XmProduct xmProduct,int teamType,String userid,String username,String ubranchId){
public Tips checkProductScopeQx(Map<String,List<XmGroupVo>> groupsMap,XmProduct xmProduct,int teamType,String userid,String username,String ubranchId){
Tips tips=new Tips("成功");
String scopeQx= QxTool.getProductScopeQx(xmProduct.getQxCode(),teamType);
boolean isPm=this.checkUserIsProductAdm(xmProduct,userid);
@ -299,12 +328,13 @@ public class XmGroupService extends BaseService {
}
}else if("2".equals(scopeQx)){//同产品
if(!this.checkUserExistsGroup(this.getProductGroupVoList(xmProduct.getId()), userid)){
if(!this.checkUserExistsGroup(getProductGroupsFromLocalCache(groupsMap,xmProduct.getId()), userid)){
tips.setFailureMsg("pdqx-scope-product-0",String.format("产品【%s】只开放给同产品团队人员,【%s】不在产品团队中。",xmProduct.getId(),username));
return tips;
};
}else if("3".equals(scopeQx)){//同小组
if(!this.checkUserExistsProductGroup(xmProduct.getId(), userid)){
if(!this.checkUserExistsGroup(getProductGroupsFromLocalCache(groupsMap,xmProduct.getId()), userid)){
tips.setFailureMsg("pdqx-scope-team-0",String.format("产品【%s】只开放给同产品同小组人员,【%s】不在产品团队中。",xmProduct.getId(),username));
return tips;
}
@ -312,7 +342,32 @@ public class XmGroupService extends BaseService {
return tips;
}
public Tips checkProductTransmitQx(XmProduct xmProduct,int teamType,String headUserid,String ...memUserids){
List<XmGroupVo> getProductGroupsFromLocalCache(Map<String,List<XmGroupVo>> groupsMap,String productId){
List<XmGroupVo> groupVoList=null;
if(groupsMap!=null && groupsMap.containsKey(productId)){
groupVoList=groupsMap.get(productId);
}else{
groupVoList=getProductGroupVoList(productId);
if(groupsMap!=null){
groupsMap.put(productId,groupVoList);
}
}
return groupVoList;
}
List<XmGroupVo> getProjectGroupsFromLocalCache(Map<String,List<XmGroupVo>> groupsMap,String projectId){
List<XmGroupVo> groupVoList=null;
if(groupsMap!=null && groupsMap.containsKey(projectId)){
groupVoList=groupsMap.get(projectId);
}else{
groupVoList=getProjectGroupVoList(projectId);
if(groupsMap!=null){
groupsMap.put(projectId,groupVoList);
}
}
return groupVoList;
}
public Tips checkProductTransmitQx(Map<String,List<XmGroupVo>> groupsMap,XmProduct xmProduct,int teamType,String headUserid,String ...memUserids){
Tips tips=new Tips("成功");
String transmitQx= QxTool.getProductTransmitQx(xmProduct.getQxCode(),teamType);
if("0".equals(transmitQx)){//不检查上下级关系
@ -325,7 +380,7 @@ public class XmGroupService extends BaseService {
if(memUseridSet.size()==0){
return tips;
}
List<XmGroupVo> groups=this.getProductGroupVoList(xmProduct.getId());
List<XmGroupVo> groups=getProductGroupsFromLocalCache(groupsMap,xmProduct.getId());
for (String memUserid : memUseridSet) {
if(this.checkUserIsOtherUserTeamHeadOrAss(groups,headUserid,memUserid)){
return tips;
@ -359,10 +414,6 @@ public class XmGroupService extends BaseService {
}
public Tips checkProjectQx(XmProject xmProject,User head,String ...memUserids){
Tips tips=new Tips("成功");
boolean headIsPm=this.checkUserIsProjectAdm(xmProject,head.getUserid());
if(headIsPm){
return tips;
}
tips=this.checkProjectScopeQx(xmProject,head,memUserids);
if(!tips.isOk()){
return tips;

Loading…
Cancel
Save