From fee2953884b6bcb496aad4b5d044a6549ec2069f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E8=A3=95=E8=B4=A2?= Date: Sat, 21 Jan 2023 01:41:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=A2=E9=98=9F=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xm/core/ctrl/XmMenuController.java | 206 ++++++++++-------- .../com/xm/core/service/XmGroupService.java | 91 ++++++-- 2 files changed, 181 insertions(+), 116 deletions(-) diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmMenuController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmMenuController.java index 749b785a..b047560b 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmMenuController.java +++ b/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> 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 can=xmMenusDb; - if(can.size()<=0){ - return ResponseHelper.failed("noqx","您无权修改选中的需求。"); + List canOper=new ArrayList<>(); + List noOper=new ArrayList<>(); + Map 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 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 canOper=new ArrayList<>(); + List noOper=new ArrayList<>(); + Map noOperTips=new HashMap<>(); + Map> 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 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 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 msgs=new ArrayList<>(); + if(canDelList.size()>0){ + msgs.add(String.format("修改了%s个需求。",canDelList.size())); } - List 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 canOper=new ArrayList<>(); + List noOper=new ArrayList<>(); + Map noOperTips=new HashMap<>(); + Map> 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 canOpxmMenus=xmMenusDb.stream().filter(i->!parentDb.getMenuId().equals(i.getPmenuId())).collect(Collectors.toList()); List sameParentMenus=xmMenusDb.stream().filter(i->parentDb.getMenuId().equals(i.getPmenuId())).collect(Collectors.toList()); if(canOpxmMenus.size()==0){ 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 48196a05..bb1807a1 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 @@ -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> 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> 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> 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> 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> 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 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 groups=this.getProductGroupVoList(xmProduct.getId()); + List 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 groups=this.getProductGroupVoList(xmProduct.getId()); - List headGroups=groups; + List groups=this.getProductGroupsFromLocalCache(groupsMap,xmProduct.getId()); + List 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> 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 getProductGroupsFromLocalCache(Map> groupsMap,String productId){ + List 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 getProjectGroupsFromLocalCache(Map> groupsMap,String projectId){ + List 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> 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 groups=this.getProductGroupVoList(xmProduct.getId()); + List 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;