diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmIterationMenuController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmIterationMenuController.java index 223cc6b2..622b39d9 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmIterationMenuController.java +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmIterationMenuController.java @@ -10,6 +10,7 @@ import com.mdp.safe.client.utils.LoginUtils; import com.xm.core.entity.XmIteration; import com.xm.core.entity.XmMenu; import com.xm.core.service.XmMenuService; +import com.xm.core.service.XmProjectGroupService; import com.xm.core.service.push.XmMenuPushMsgService; import com.xm.core.vo.XmIterationMenuVo; import io.swagger.annotations.*; @@ -48,6 +49,10 @@ public class XmIterationMenuController { @Autowired XmMenuService xmMenuService; + + @Autowired + XmProjectGroupService groupService; + @Autowired XmMenuController xmMenuController; @@ -113,16 +118,13 @@ public class XmIterationMenuController { if(menus==null || menus.size()==0){ return ResponseHelper.failed("menus-0","需求已不存在"); } - /** - String productId=menus.get(0).getProductId(); - if(menus.stream().filter(i->!productId.equals(i.getProductId())).findAny().isPresent()){ - return ResponseHelper.failed("productId-0","批量操作的需求必须是同一个产品下的需求。"); - } - **/ + List noQxOpList=new ArrayList<>(); + List canOpList=new ArrayList<>(); + groupService.calcCanOpMenus(menus,canOpList,noQxOpList); List notJoins=new ArrayList<>(); List status7=new ArrayList<>(); List canDels=new ArrayList<>(); - for (XmMenu menu : menus) { + for (XmMenu menu : canOpList) { if(!StringUtils.hasText(menu.getIterationId())){ notJoins.add(menu); continue; @@ -147,9 +149,9 @@ public class XmIterationMenuController { msgs.add("有"+notJoins.size()+"个需求未加入迭代,无需移出。【"+notJoins.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); } if(canDels.size()==0){ - tips.setFailureMsg(msgs.stream().collect(Collectors.joining("\n"))); + tips.setFailureMsg(msgs.stream().collect(Collectors.joining(";"))); }else { - tips.setOkMsg(msgs.stream().collect(Collectors.joining("\n"))); + tips.setOkMsg(msgs.stream().collect(Collectors.joining(";"))); } }catch (BizException e) { tips=e.getTips(); @@ -177,17 +179,15 @@ public class XmIterationMenuController { if(menus==null || menus.size()==0){ return ResponseHelper.failed("menus-0","需求已不存在"); } - /** - String productId=menus.get(0).getProductId(); - if(menus.stream().filter(i->!productId.equals(i.getProductId())).findAny().isPresent()){ - return ResponseHelper.failed("productId-0","批量操作的需求必须是同一个产品下的需求。"); - } - **/ + + List noQxOpList=new ArrayList<>(); + List canOpList=new ArrayList<>(); + groupService.calcCanOpMenus(menus,canOpList,noQxOpList); List hadJoin=new ArrayList<>(); List ntype1=new ArrayList<>(); List status789=new ArrayList<>(); List canAdds=new ArrayList<>(); - for (XmMenu menu : menus) { + for (XmMenu menu : canOpList) { if(StringUtils.hasText(menu.getIterationId())){ hadJoin.add(menu); continue; @@ -219,9 +219,9 @@ public class XmIterationMenuController { msgs.add("有"+ntype1.size()+"个为需求集,不用加入迭代。【"+ntype1.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); } if(canAdds.size()==0){ - tips.setFailureMsg(msgs.stream().collect(Collectors.joining("\n"))); + tips.setFailureMsg(msgs.stream().collect(Collectors.joining(";"))); }else { - tips.setOkMsg(msgs.stream().collect(Collectors.joining("\n"))); + tips.setOkMsg(msgs.stream().collect(Collectors.joining(";"))); } }catch (BizException e) { diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmPhaseMenuController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmPhaseMenuController.java index b957ec87..6e35c48c 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmPhaseMenuController.java +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmPhaseMenuController.java @@ -3,11 +3,19 @@ package com.xm.core.ctrl; import com.mdp.core.entity.Tips; import com.mdp.core.err.BizException; import com.mdp.core.utils.ResponseHelper; +import com.mdp.safe.client.entity.User; +import com.mdp.safe.client.utils.LoginUtils; import com.xm.core.entity.XmMenu; +import com.xm.core.entity.XmProduct; +import com.xm.core.entity.XmProjectGroup; import com.xm.core.service.XmMenuService; +import com.xm.core.service.XmProductService; +import com.xm.core.service.XmProjectGroupService; +import com.xm.core.service.XmRecordService; import com.xm.core.service.push.XmMenuPushMsgService; import com.xm.core.vo.XmPhaseMenusVo; import com.xm.core.vo.XmPhaseMenusVo; +import com.xm.core.vo.XmProjectGroupVo; import io.swagger.annotations.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -30,7 +38,7 @@ import java.util.stream.Collectors; * 删除: xm/xmPhaseMenu/del
* 批量删除: xm/xmPhaseMenu/batchDel
* 组织 com.qqkj 顶级模块 oa 大模块 xm 小模块
- * 实体 XmIterationMenu 表 XM.xm_iteration_menu 当前主键(包括多主键): id; + * 实体 XmPhaseMenu 表 XM.xm_iteration_menu 当前主键(包括多主键): id; ***/ @RestController("xm.core.xmPhaseMenuController") @RequestMapping(value="/**/xm/core/xmPhaseMenu") @@ -50,7 +58,17 @@ public class XmPhaseMenuController { @Autowired XmMenuController xmMenuController; - @ApiOperation( value = "查询计划定义信息列表",notes="listXmIterationMenu,条件之间是 and关系,模糊查询写法如 {studentName:'%才哥%'}") + @Autowired + XmProjectGroupService groupService; + + + @Autowired + XmProductService xmProductService; + + @Autowired + XmRecordService xmRecordService; + + @ApiOperation( value = "查询计划定义信息列表",notes="listXmPhaseMenu,条件之间是 and关系,模糊查询写法如 {studentName:'%才哥%'}") @ApiImplicitParams({ @ApiImplicitParam(name="id",value="主键,主键",required=false), @ApiImplicitParam(name="phaseId",value="对应的计划编号",required=false), @@ -74,12 +92,12 @@ public class XmPhaseMenuController { - @ApiOperation( value = "根据主键列表批量删除计划定义信息",notes="batchDelXmIterationMenu,仅需要上传主键字段") + @ApiOperation( value = "根据主键列表批量删除计划定义信息",notes="batchDelXmPhaseMenu,仅需要上传主键字段") @ApiResponses({ @ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}") }) @RequestMapping(value="/batchDel",method=RequestMethod.POST) - public Map batchDelXmIterationMenu(@RequestBody XmPhaseMenusVo xmPhaseMenus) { + public Map batchDelXmPhaseMenu(@RequestBody XmPhaseMenusVo xmPhaseMenus) { Map m = new HashMap<>(); Tips tips=new Tips("成功将需求移出计划"); try{ @@ -91,8 +109,13 @@ public class XmPhaseMenuController { if(menus==null || menus.size()==0){ return ResponseHelper.failed("menus-0","需求已不存在"); } + + + + List noQxOpList=new ArrayList<>(); + List canOpList=new ArrayList<>(); + groupService.calcCanOpMenus(menus,canOpList,noQxOpList); /** - String productId=menus.get(0).getProductId(); if(menus.stream().filter(i->!productId.equals(i.getProductId())).findAny().isPresent()){ return ResponseHelper.failed("productId-0","批量操作的需求必须是同一个产品下的需求。"); } @@ -100,8 +123,8 @@ public class XmPhaseMenuController { List notJoins=new ArrayList<>(); List status7=new ArrayList<>(); List canDels=new ArrayList<>(); - for (XmMenu menu : menus) { - if(!StringUtils.hasText(menu.getIterationId())){ + for (XmMenu menu : canOpList) { + if(!StringUtils.hasText(menu.getPhaseId())){ notJoins.add(menu); continue; } @@ -112,22 +135,26 @@ public class XmPhaseMenuController { canDels.add(menu); } List msgs=new ArrayList<>(); + msgs.add("成功将"+canDels.size()+"个需求移出计划"); if(canDels.size()>0){ - msgs.add("成功将"+canDels.size()+"个需求移出计划"); xmPhaseMenus.setMenuIds(canDels.stream().map(i->i.getMenuId()).collect(Collectors.toList())); xmMenuService.batchUnProductPhase(xmPhaseMenus); + xmRecordService.addXmMenuRecord( canDels,"产品-计划-批量将需求移出","将需求移出计划"); //this.xmMenuPushMsgService.pushMenuRelUsersMsg(user.getBranchId(), xmPhaseMenu.getMenuId(), user.getUserid(), user.getUsername(), user.getUsername()+"将需求【"+xmPhaseMenu.getMenuId()+"】加入计划"); } + if(noQxOpList.size()>0){ + msgs.add("有"+noQxOpList.size()+"个需求无权限操作,【"+noQxOpList.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); + } if(status7.size()>0){ - msgs.add("有"+status7.size()+"个需求状态为已上线,不能移出计划。【"+status7.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); + msgs.add("有"+status7.size()+"个需求状态为已上线,不能移出计划,【"+status7.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); } if(notJoins.size()>0){ - msgs.add("有"+notJoins.size()+"个需求未加入计划,无需移出。【"+notJoins.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); + msgs.add("有"+notJoins.size()+"个需求未加入计划,无需移出,【"+notJoins.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); } if(canDels.size()==0){ - tips.setFailureMsg(msgs.stream().collect(Collectors.joining("\n"))); + tips.setFailureMsg(msgs.stream().collect(Collectors.joining(";"))); }else { - tips.setOkMsg(msgs.stream().collect(Collectors.joining("\n"))); + tips.setOkMsg(msgs.stream().collect(Collectors.joining(";"))); } }catch (BizException e) { tips=e.getTips(); @@ -140,7 +167,7 @@ public class XmPhaseMenuController { return m; } @RequestMapping(value="/batchAdd",method=RequestMethod.POST) - public Map batchAddXmIterationMenu(@RequestBody XmPhaseMenusVo xmPhaseMenus) { + public Map batchAddXmPhaseMenu(@RequestBody XmPhaseMenusVo xmPhaseMenus) { Map m = new HashMap<>(); Tips tips=new Tips("成功将需求与计划关联"); try{ @@ -155,18 +182,16 @@ public class XmPhaseMenuController { if(menus==null || menus.size()==0){ return ResponseHelper.failed("menus-0","需求已不存在"); } - /** - String productId=menus.get(0).getProductId(); - if(menus.stream().filter(i->!productId.equals(i.getProductId())).findAny().isPresent()){ - return ResponseHelper.failed("productId-0","批量操作的需求必须是同一个产品下的需求。"); - } - **/ + + List noQxOpList=new ArrayList<>(); + List canOpList=new ArrayList<>(); + groupService.calcCanOpMenus(menus,canOpList,noQxOpList); List hadJoin=new ArrayList<>(); List ntype1=new ArrayList<>(); List status789=new ArrayList<>(); List canAdds=new ArrayList<>(); - for (XmMenu menu : menus) { - if(StringUtils.hasText(menu.getIterationId())){ + for (XmMenu menu : canOpList) { + if(StringUtils.hasText(menu.getPhaseId())){ hadJoin.add(menu); continue; } @@ -181,12 +206,19 @@ public class XmPhaseMenuController { canAdds.add(menu); } List msgs=new ArrayList<>(); + msgs.add("成功将"+canAdds.size()+"个需求加入计划"); if(canAdds.size()>0){ - msgs.add("成功将"+canAdds.size()+"个需求加入计划"); + xmPhaseMenus.setMenuIds(canAdds.stream().map(i->i.getMenuId()).collect(Collectors.toList())); xmMenuService.batchProductPhase(xmPhaseMenus); + xmRecordService.addXmMenuRecord( canAdds,"产品-计划-批量将需求加入计划","将需求加入计划"); + //this.xmMenuPushMsgService.pushMenuRelUsersMsg(user.getBranchId(), xmPhaseMenu.getMenuId(), user.getUserid(), user.getUsername(), user.getUsername()+"将需求【"+xmPhaseMenu.getMenuId()+"】加入计划"); } + + if(noQxOpList.size()>0){ + msgs.add("有"+noQxOpList.size()+"个需求无权限操作,【"+noQxOpList.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); + } if(status789.size()>0){ msgs.add("有"+status789.size()+"个需求状态为已上线、已下线、已删除状态,不能加入计划。【"+status789.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); } @@ -194,12 +226,12 @@ public class XmPhaseMenuController { msgs.add("有"+hadJoin.size()+"个需求已加入计划,不能重复加入。【"+hadJoin.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); } if(ntype1.size()>0){ - msgs.add("有"+ntype1.size()+"个为需求集,不用加入计划。【"+ntype1.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); + msgs.add("有"+ntype1.size()+"个需求为需求集,不用加入计划。【"+ntype1.stream().map(i->i.getMenuName()).collect(Collectors.joining(","))+"】"); } if(canAdds.size()==0){ - tips.setFailureMsg(msgs.stream().collect(Collectors.joining("\n"))); + tips.setFailureMsg(msgs.stream().collect(Collectors.joining(";"))); }else { - tips.setOkMsg(msgs.stream().collect(Collectors.joining("\n"))); + tips.setOkMsg(msgs.stream().collect(Collectors.joining(";"))); } }catch (BizException e) { diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmProductController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmProductController.java index 4bef169c..ab2c1dcd 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmProductController.java +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmProductController.java @@ -403,10 +403,10 @@ public class XmProductController { tips.setOkMsg(msg); }else{ if(errTips.size()>0 && canDelList.size()>0){ - String errmsg=errTips.stream().map(i->i.getMsg()).collect(Collectors.joining("\n")); + String errmsg=errTips.stream().map(i->i.getMsg()).collect(Collectors.joining(";")); tips.setOkMsg(msg+"\n"+errmsg); }else{ - tips.setFailureMsg(errTips.stream().map(i->i.getMsg()).collect(Collectors.joining("\n"))); + tips.setFailureMsg(errTips.stream().map(i->i.getMsg()).collect(Collectors.joining(";"))); } } return tips; diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmProjectGroupUserController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmProjectGroupUserController.java index d64a3843..bb1f0926 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmProjectGroupUserController.java +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmProjectGroupUserController.java @@ -445,9 +445,9 @@ public class XmProjectGroupUserController { msg.add("以下"+noDelUsers.size()+"个小组用户无权限删除。【"+noDelUsers.stream().collect(Collectors.toSet()).stream().collect(Collectors.joining(","))+"】"); } if(canDelUsers.size()!=0){ - tips.setOkMsg(msg.stream().collect(Collectors.joining("\n"))); + tips.setOkMsg(msg.stream().collect(Collectors.joining(";"))); }else{ - tips.setFailureMsg(msg.stream().collect(Collectors.joining("\n"))); + tips.setFailureMsg(msg.stream().collect(Collectors.joining(";"))); } groupUsersMap.forEach((groupId,groupUsers)->{ List> users=groupUsers.stream().map(i->map("userid",i.getUserid(),"username",i.getUsername())).collect(Collectors.toList()); diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmTaskController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmTaskController.java index 40b8c799..458995f8 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmTaskController.java +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmTaskController.java @@ -1050,9 +1050,9 @@ public class XmTaskController { msgs.add("以下"+existsExecuserList.size()+"个任务存在待结算的执行人,不能删除。【"+existsExecuserList.stream().map(i->i.getName()).collect(Collectors.joining(","))+"】"); } if(canDelNodes.size()==0){ - tips.setFailureMsg(msgs.stream().collect(Collectors.joining("\n"))); + tips.setFailureMsg(msgs.stream().collect(Collectors.joining(";"))); }else{ - tips.setOkMsg(msgs.stream().collect(Collectors.joining("\n"))); + tips.setOkMsg(msgs.stream().collect(Collectors.joining(";"))); } }catch (BizException e) { diff --git a/xm-core/src/main/java/com/xm/core/service/XmProjectGroupService.java b/xm-core/src/main/java/com/xm/core/service/XmProjectGroupService.java index b410501a..02317ed9 100644 --- a/xm-core/src/main/java/com/xm/core/service/XmProjectGroupService.java +++ b/xm-core/src/main/java/com/xm/core/service/XmProjectGroupService.java @@ -55,6 +55,57 @@ public class XmProjectGroupService extends BaseService { @Autowired XmPushMsgService pushMsgService; + + public void calcCanOpMenus(List menus,List canOpResult,List noQxOpResult){ + + //按产品分组检查权限 + Map> productMenusMap=new HashMap<>(); + for (XmMenu menu : menus) { + List menus0=productMenusMap.get(menu.getProductId()); + if(menus0==null){ + menus0=new ArrayList<>(); + productMenusMap.put(menu.getProductId(),menus0); + } + menus0.add(menu); + } + + User user= LoginUtils.getCurrentUserInfo(); + productMenusMap.forEach((key,menuList)->{ + XmProduct xmProduct=this.xmProductService.getProductFromCache(key); + if(xmProduct==null||"3".equals(xmProduct.getPstatus())){ + noQxOpResult.addAll(menuList); + }else{ + if(!this.checkUserIsProductAdm(xmProduct,user.getUserid())){ + List groupVoList=this.getProductGroupVoList(xmProduct.getId()); + for (XmMenu xmMenu : menuList) { + boolean canOp=false; + if(user.getUserid().equals(xmMenu.getMmUserid())){ + canOp=true; + }else{ + if(StringUtils.hasText(xmMenu.getMmUserid())){ + if(this.checkUserIsOtherUserTeamHeadOrAss(groupVoList,xmMenu.getMmUserid(),user.getUserid())){ + canOp=true; + } + }else{ + if(this.checkUserIsOtherUserTeamHeadOrAss(groupVoList,user.getUserid(),user.getUserid())){ + canOp=true; + } + } + } + if(canOp){ + canOpResult.add(xmMenu); + }else{ + noQxOpResult.add(xmMenu); + } + + } + }else{ + canOpResult.addAll(menuList); + } + } + }); + } + /** 请在此类添加自定义函数 */ public List getProjectGroupVoList(String projectId) { List groupVoList=new ArrayList<>(); diff --git a/xm-core/src/main/java/com/xm/core/service/XmRecordService.java b/xm-core/src/main/java/com/xm/core/service/XmRecordService.java index e7a26319..1e6f0b08 100644 --- a/xm-core/src/main/java/com/xm/core/service/XmRecordService.java +++ b/xm-core/src/main/java/com/xm/core/service/XmRecordService.java @@ -3,12 +3,16 @@ package com.xm.core.service; import com.mdp.core.service.BaseService; import com.mdp.safe.client.entity.User; import com.mdp.safe.client.utils.LoginUtils; +import com.xm.core.entity.XmMenu; import com.xm.core.entity.XmRecord; import org.slf4j.MDC; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.Date; +import java.util.List; + /** * 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.
* 组织 com.qqkj 顶级模块 oa 大模块 xm 小模块
@@ -28,7 +32,7 @@ public class XmRecordService extends BaseService { record.setReqNo(MDC.get("reqNo")); record.setOperUserid(user.getUserid()); record.setOperUsername(user.getUsername()); - record.setBranchId(user.getBranchId()); + record.setBranchId(user.getBranchId()); return record; } @@ -164,7 +168,37 @@ public class XmRecordService extends BaseService { record.setObjType("menu"); this.insert(record); } + /** + * 针对产品下的需求的所有操作用此方法 + * @param productId 产品编号 + * @param menus 需求列表 + * @param action 操作如 新增任务,修改任务信息,修改任务进度 等 + * @param remarks 人性化语言描述 ,自动添加 需求名称【xxxxx】 + */ + @Async + public void addXmMenuRecord(List menus, String action, String remarks) { + User user=LoginUtils.getCurrentUserInfo(); + List records=new ArrayList<>(); + for (XmMenu menu : menus) { + XmRecord record=new XmRecord(); + record.setId(this.createKey("id")); + record.setOperTime(new Date()); + record.setReqNo(MDC.get("reqNo")); + record.setOperUserid(user.getUserid()); + record.setOperUsername(user.getUsername()); + record.setBranchId(user.getBranchId()); + record.setProductId(menu.getProductId()); + record.setBizId(menu.getMenuId()); + record.setAction(action); + record.setRemarks(remarks+" 需求名称【"+menu.getMenuName()+"】"); + record.setObjType("menu"); + records.add(record); + } + if(records.size()>0){ + super.batchDelete(records); + } + } /** * 针对产品下的需求的所有操作用此方法 * @param productId 产品编号