From 7f840ee0f07a74d597a0ba80badc0952ff7c29aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E8=A3=95=E8=B4=A2?= Date: Fri, 20 Jan 2023 12:19:49 +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 --- .../xm/core/ctrl/XmQuestionController.java | 164 +++++++------- .../com/xm/core/service/XmGroupService.java | 203 ++++++++++++++++-- 2 files changed, 282 insertions(+), 85 deletions(-) diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmQuestionController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmQuestionController.java index 01c81581..6f27367a 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmQuestionController.java +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmQuestionController.java @@ -13,12 +13,9 @@ import com.mdp.qx.HasQx; import com.mdp.safe.client.entity.User; import com.mdp.safe.client.utils.LoginUtils; import com.mdp.sensitive.SensitiveWordService; -import com.xm.core.entity.XmMenu; -import com.xm.core.entity.XmQuestion; -import com.xm.core.entity.XmQuestionHandle; -import com.xm.core.service.XmQuestionHandleService; -import com.xm.core.service.XmQuestionService; -import com.xm.core.service.XmRecordService; +import com.mdp.swagger.ApiEntityParams; +import com.xm.core.entity.*; +import com.xm.core.service.*; import com.xm.core.service.push.XmPushMsgService; import com.xm.core.vo.XmQuestionVo; import io.swagger.annotations.*; @@ -67,6 +64,15 @@ public class XmQuestionController { @Autowired SensitiveWordService sensitiveWordService; + @Autowired + XmProductService productService; + + @Autowired + XmProjectService projectService; + + @Autowired + XmGroupService groupService; + @Autowired PushNotifyMsgService notifyMsgService; @@ -74,48 +80,7 @@ public class XmQuestionController { Map fieldsMap = BaseUtils.toMap(new XmQuestion()); @ApiOperation( value = "查询xm_question信息列表",notes="listXmQuestion,条件之间是 and关系,模糊查询写法如 {studentName:'%才哥%'}") - @ApiImplicitParams({ - @ApiImplicitParam(name="id",value="问题编号,主键",required=false), - @ApiImplicitParam(name="name",value="问题标题",required=false), - @ApiImplicitParam(name="projectId",value="项目编号",required=false), - @ApiImplicitParam(name="projectName",value="项目名称",required=false), - @ApiImplicitParam(name="taskId",value="任务编号",required=false), - @ApiImplicitParam(name="taskName",value="任务名称",required=false), - @ApiImplicitParam(name="endTime",value="到期时间",required=false), - @ApiImplicitParam(name="askUserid",value="提出人编号",required=false), - @ApiImplicitParam(name="askUsername",value="提出人",required=false), - @ApiImplicitParam(name="handlerUserid",value="处理人编号",required=false), - @ApiImplicitParam(name="handlerUsername",value="处理人",required=false), - @ApiImplicitParam(name="priority",value="优先级别",required=false), - @ApiImplicitParam(name="solution",value="解决方案:",required=false), - @ApiImplicitParam(name="description",value="问题描述",required=false), - @ApiImplicitParam(name="createUserid",value="问题创建人编号",required=false), - @ApiImplicitParam(name="createUsername",value="问题创建人",required=false), - @ApiImplicitParam(name="createTime",value="创建时间",required=false), - @ApiImplicitParam(name="bugStatus",value="create创建(active激活)–confirm确认(confirmed已确认)–solve解决(resolved已解决)–close关闭(closed已关闭)",required=false), - @ApiImplicitParam(name="bizProcInstId",value="当前流程实例编号",required=false), - @ApiImplicitParam(name="bizFlowState",value="当前流程状态0初始1审批中2审批通过3审批不通过4流程取消或者删除",required=false), - @ApiImplicitParam(name="menuId",value="菜单编号",required=false), - @ApiImplicitParam(name="menuName",value="菜单名称",required=false), - @ApiImplicitParam(name="planWorkload",value="预估工时单位人时",required=false), - @ApiImplicitParam(name="planCostAmount",value="预估成本金额",required=false), - @ApiImplicitParam(name="totalActWorkload",value="实际工时",required=false), - @ApiImplicitParam(name="totalActCostAmount",value="实际总金额",required=false), - @ApiImplicitParam(name="expectResult",value="期望结果",required=false), - @ApiImplicitParam(name="opStep",value="操作步骤",required=false), - @ApiImplicitParam(name="currResult",value="当前结果",required=false), - @ApiImplicitParam(name="refRequire",value="相关需求",required=false), - @ApiImplicitParam(name="bugSeverity",value="严重程度1、2、3、4,分别对应:致命缺陷、严重缺陷、普通缺陷、轻微缺陷",required=false), - @ApiImplicitParam(name="bugType",value="BUG类型1、2、3、4,分别对应:代码错误、低级缺陷、设计缺陷、配置相关、安全相关、性能问题、其他",required=false), - @ApiImplicitParam(name="tagIds",value="标签id列表逗号分隔",required=false), - @ApiImplicitParam(name="tagNames",value="标签名称列表逗号分隔",required=false), - @ApiImplicitParam(name="urls",value="链接地址列表逗号分隔",required=false), - @ApiImplicitParam(name="pageSize",value="每页记录数",required=false), - @ApiImplicitParam(name="pageNum",value="当前页码,从1开始",required=false), - @ApiImplicitParam(name="total",value="总记录数,服务器端收到0时,会自动计算总记录数,如果上传>0的不自动计算",required=false), - @ApiImplicitParam(name="orderBy",value="排序列 如性别、学生编号排序 orderBy = sex desc,student_id desc",required=false), - @ApiImplicitParam(name="count",value="是否进行总条数计算,count=true|false",required=false) - }) + @ApiEntityParams(XmQuestion.class) @ApiResponses({ @ApiResponse(code = 200,response= XmQuestion.class,message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'错误码'},total:总记录数,data:[数据对象1,数据对象2,...]}") }) @@ -404,44 +369,99 @@ public class XmQuestionController { Tips tips=new Tips("成功删除"+xmQuestions.size()+"条数据"); try{ User user=LoginUtils.getCurrentUserInfo(); + if(xmQuestions==null || xmQuestions.size()==0){ + return ResponseHelper.failed("p-0","参数不能为空"); + } List xmQuestionsDb=xmQuestionService.selectListByIds(xmQuestions.stream().map(i->i.getId()).collect(Collectors.toList())); + if(xmQuestionsDb==null || xmQuestionsDb.size()==0){ + return ResponseHelper.failed("data-0","所有数据已不存在"); + } List canDel=new ArrayList<>(); List noMyCreate=new ArrayList<>(); + + List noDel=new ArrayList<>(); + + + /** + * 如果有测试计划,有产品编号,走产品团队判断权限 + * 如果未通过,继续走项目权限判断 + */ + Map> productsMap=new HashMap<>();//有产品的数据 + Map> projectsMap=new HashMap<>();//没有产品、但有项目的数据 for (XmQuestion xmQuestion : xmQuestionsDb) { - if(!user.getUserid().equals(xmQuestion.getCreateUserid())){ - noMyCreate.add(xmQuestion); - }else { - canDel.add(xmQuestion); + if(StringUtils.hasText(xmQuestion.getProductId())){ + List datas=productsMap.get(xmQuestion.getProductId()); + if(datas==null){ + datas=new ArrayList<>(); + datas.add(xmQuestion); + productsMap.put(xmQuestion.getProductId(),datas); + }else { + datas.add(xmQuestion); + } + }else if(StringUtils.hasText(xmQuestion.getProjectId())) { + List datas=projectsMap.get(xmQuestion.getProjectId()); + if(datas==null){ + datas=new ArrayList<>(); + datas.add(xmQuestion); + projectsMap.put(xmQuestion.getProjectId(),datas); + }else { + datas.add(xmQuestion); + } + } + } + + if(productsMap.size()>0){ + for (String productId : productsMap.keySet()) { + XmProduct xmProduct=productService.getProductFromCache(productId); + Tips tips1=groupService.checkProductQx(xmProduct,user); + if(!tips1.isOk()){ + noDel.addAll(productsMap.get(productId)); + productsMap.remove(productId); + }else{ + List questions=productsMap.get(productId); + for (XmQuestion question : questions) { + tips1=groupService.checkProductQx(xmProduct,user,question.getCreateUserid(),question.getHandlerUserid()); + if(!tips1.isOk()){ + noDel.add(question); + }else { + canDel.add(question); + } + } + + } } } + if(projectsMap.size()>0){ + for (String projectId : projectsMap.keySet()) { + XmProject xmProject=projectService.getProjectFromCache(projectId); + Tips tips1=groupService.checkProjectQx(xmProject,user); + if(!tips1.isOk()){ + noDel.addAll(projectsMap.get(projectId)); + projectsMap.remove(projectId); + }else{ + List questions=projectsMap.get(projectId); + for (XmQuestion question : questions) { + tips1=groupService.checkProjectQx(xmProject,user,question.getCreateUserid(),question.getHandlerUserid()); + if(!tips1.isOk()){ + noDel.add(question); + }else { + canDel.add(question); + } + } + } + } + } + if(canDel.size()>0){ xmQuestionService.batchDelete(canDel); - List handles=new ArrayList<>(); - for (XmQuestion xmQuestionVo : canDel) { - XmQuestionHandle handle=new XmQuestionHandle(); - handle.setReceiptMessage(user.getUsername()+"删除了缺陷:"+xmQuestionVo.getName()); - handle.setHandleStatus(xmQuestionVo.getBugStatus()); - handle.setCreateTime(new Date()); - handle.setReceiptTime(new Date()); - handle.setHandlerUserid(xmQuestionVo.getCreateUserid()); - handle.setHandlerUsername(xmQuestionVo.getCreateUsername()); - handle.setLastUpdateTime(new Date()); - handle.setHandleSolution(xmQuestionVo.getSolution()); - handle.setQuestionId(xmQuestionVo.getId()); - handle.setTargetUserid(xmQuestionVo.getHandlerUserid()); - handle.setTargetUsername(xmQuestionVo.getHandlerUsername()); - handle.setId(this.xmQuestionHandleService.createKey("id")); - handles.add(handle); - } - xmQuestionHandleService.batchAddAsync(handles); } List msgs=new ArrayList<>(); if(canDel.size()>0){ msgs.add(String.format("删除了%s个缺陷。",canDel.size())); } - if(noMyCreate.size()>0){ - msgs.add(String.format("以下%s个缺陷不属于您创建的缺陷,无权限删除。",noMyCreate.size())); + if(noDel.size()>0){ + msgs.add(String.format("其中%s个缺陷,无权限删除。",noDel.size())); } if(canDel.size()>0){ tips.setOkMsg(msgs.stream().collect(Collectors.joining())); 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 e596bbed..201c39b2 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,8 +151,187 @@ public class XmGroupService extends BaseService { } + + + public Tips checkProductQx(XmProduct xmProduct,User head){ + Tips tips=new Tips(); + boolean headIsPm=this.checkUserIsProductAdm(xmProduct,head.getUserid()); + if(headIsPm){ + return tips; + } + tips=this.checkProductScopeQx(xmProduct,head,head.getUserid()); + if(!tips.isOk()){ + return tips; + } + return this.checkProductTransmitQx(xmProduct,head.getUserid(),head.getUserid()); + } + public Tips checkProductQx(XmProduct xmProduct,User head,String ...memUserids){ + Tips tips=new Tips("成功"); + boolean headIsPm=this.checkUserIsProductAdm(xmProduct,head.getUserid()); + if(headIsPm){ + return tips; + } + tips=this.checkProductScopeQx(xmProduct,head,memUserids); + if(!tips.isOk()){ + return tips; + } + return this.checkProductTransmitQx(xmProduct,head.getUserid(),memUserids); + } + public Tips checkProductScopeQx(XmProduct xmProduct,User head,String ...memUserids){ + Tips tips=new Tips(); + + if(memUserids==null || memUserids.length==0){ + return this.checkProductScopeQx(xmProduct,head.getUserid(),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,head.getUserid(),head.getBranchId()); + } + + String scopeQx= ProjectQxTool.getTaskScopeQx(xmProduct.getQxCode()); + if("1".equals(scopeQx)){//同组织 + if( !head.getBranchId().equals(xmProduct.getBranchId())){ + tips.setFailureMsg("no-qx-no-same-branchId","该项目只开放给同企业人员。"); + return tips; + } + boolean isAllNull=true; + for (String memUserid : memUseridSet) {//只要有一个满足条件即可 + if(this.checkUserIsProductAdm(xmProduct,memUserid)){ + return tips; + } + User sysU=sysClient.getUserByUserid(memUserid); + if(sysU==null || StringUtils.isEmpty(sysU.getUserid())){ + continue; + } + isAllNull=false; + if(sysU.getBranchId().equals(xmProduct.getBranchId())){ + return tips; + } + } + if(isAllNull){ + return tips; + }else{ + tips.setFailureMsg("no-qx-no-same-branchId","该项目只开放给同企业人员。"); + return tips; + } + + + }else if("2".equals(scopeQx)){//同项目 + List groups=this.getProductGroupVoList(xmProduct.getId()); + if( !this.checkUserExistsGroup(groups, head.getUserid())){ + tips.setFailureMsg("no-qx-no-same-project","该项目只开放给同项目组人员。请先加入项目团队再操作。"); + return tips; + }; + for (String memUserid : memUseridSet) { + if(this.checkUserIsProductAdm(xmProduct,memUserid)){ + return tips; + } + if( this.checkUserExistsGroup(groups,memUserid) ){ + return tips; + }; + } + tips.setFailureMsg("no-qx-no-same-project","该项目只开放给同项目组人员。请先加入项目团队再操作。"); + return tips; + }else if("3".equals(scopeQx)){//同小组 + List groups=this.getProductGroupVoList(xmProduct.getId()); + List headGroups=groups; + headGroups=this.getUserGroups(groups,head.getUserid()); + if( headGroups==null || headGroups.size()==0 ){ + tips.setFailureMsg("no-qx-no-same-team","该项目只开放给同项目同小组人员。请先加入项目团队再操作。"); + return tips; + } + + + for (String memUserid : memUseridSet) { + if(this.checkUserIsProductAdm(xmProduct,memUserid)){ + return tips; + } + List memGroups=this.getUserGroups(headGroups,memUserid); + if( memGroups!=null && memGroups.size()>0 ){ + return tips; + } + } + tips.setFailureMsg("no-qx-no-same-team","该项目只开放给同项目同小组人员。请先加入项目团队再操作。"); + return tips; + + + } + return tips; + } + + + public Tips checkProductTransmitQx(XmProduct xmProduct,String headUserid,String ...memUserids){ + Tips tips=new Tips(); + String transmitQx= ProjectQxTool.getTaskTransmitQx(xmProduct.getQxCode()); + if("0".equals(transmitQx)){//不检查上下级关系 + return tips; + }else if("1".equals(transmitQx)){//检查上下级关系 + if(memUserids==null || memUserids.length==0){ + return tips; + } + Set memUseridSet= Arrays.stream(memUserids).filter(k->StringUtils.hasText(k) && !k.equals(headUserid)).collect(Collectors.toSet()); + if(memUseridSet.size()==0){ + return tips; + } + List groups=this.getProjectGroupVoList(xmProduct.getId()); + for (String memUserid : memUseridSet) { + if(this.checkUserIsOtherUserTeamHeadOrAss(groups,headUserid,memUserid)){ + return tips; + } + } + tips.setFailureMsg("no-qx-transmit-0","该项目开启了上下级关系检查,您当前账户不属于【"+memUseridSet.stream().collect(Collectors.joining(","))+"】中任意账户的上级,无权操作。"); + + + } + return tips; + } + + public Tips checkProductScopeQx(XmProduct xmProduct,String userid,String ubranchId){ + Tips tips=new Tips(); + String scopeQx= ProjectQxTool.getTaskScopeQx(xmProduct.getQxCode()); + boolean isPm=this.checkUserIsProductAdm(xmProduct,userid); + if(isPm){ + return tips; + } + if("1".equals(scopeQx)){//同组织 + if(!StringUtils.hasText(ubranchId)){ + User sysUser=sysClient.getUserByUserid(userid); + if(sysUser==null || StringUtils.isEmpty(sysUser.getUserid())){ + //如果账户不存在,可能已注销,再判断没有意义,会导致企业无法操作遗留数据问题 + //tips.setFailureMsg("no-qx-no-same-branchId","该项目只开放给同企业人员。"); + return tips; + } + if(!sysUser.getBranchId().equals(xmProduct.getBranchId())){ + tips.setFailureMsg("no-qx-no-same-branchId","该项目只开放给同企业人员。"); + return tips; + } + }else{ + if(!ubranchId.equals(xmProduct.getBranchId())){ + tips.setFailureMsg("no-qx-no-same-branchId","该项目只开放给同企业人员。"); + return tips; + } + } + + }else if("2".equals(scopeQx)){//同项目 + if(!this.checkUserExistsGroup(this.getProjectGroupVoList(xmProduct.getId()), userid)){ + tips.setFailureMsg("no-qx-no-same-project","该项目只开放给同项目组人员。请先加入项目团队再操作。"); + return tips; + }; + }else if("3".equals(scopeQx)){//同小组 + if(!this.checkUserExistsProjectGroup(xmProduct.getId(), userid)){ + tips.setFailureMsg("no-qx-no-same-team","该项目只开放给同项目同小组人员。请先加入项目团队再操作。"); + return tips; + } + } + return tips; + } + public Tips checkProjectQx(XmProject xmProject,User head){ Tips tips=new Tips(); + boolean headIsPm=this.checkUserIsProjectAdm(xmProject,head.getUserid()); + if(headIsPm){ + return tips; + } tips=this.checkProjectScopeQx(xmProject,head,head.getUserid()); if(!tips.isOk()){ return tips; @@ -169,7 +348,10 @@ public class XmGroupService extends BaseService { } public Tips checkProjectScopeQx(XmProject xmProject,User head,String ...memUserids){ Tips tips=new Tips(); - + boolean headIsPm=this.checkUserIsProjectAdm(xmProject,head.getUserid()); + if(headIsPm){ + return tips; + } if(memUserids==null || memUserids.length==0){ return this.checkProjectScopeQx(xmProject,head.getUserid(),head.getBranchId()); } @@ -178,10 +360,10 @@ public class XmGroupService extends BaseService { return this.checkProjectScopeQx(xmProject,head.getUserid(),head.getBranchId()); } - boolean headIsPm=this.checkUserIsProjectAdm(xmProject,head.getUserid()); + String scopeQx= ProjectQxTool.getTaskScopeQx(xmProject.getQxCode()); if("1".equals(scopeQx)){//同组织 - if( !headIsPm && !head.getBranchId().equals(xmProject.getBranchId())){ + if( !head.getBranchId().equals(xmProject.getBranchId())){ tips.setFailureMsg("no-qx-no-same-branchId","该项目只开放给同企业人员。"); return tips; } @@ -209,7 +391,7 @@ public class XmGroupService extends BaseService { }else if("2".equals(scopeQx)){//同项目 List groups=this.getProjectGroupVoList(xmProject.getId()); - if(!headIsPm && !this.checkUserExistsGroup(groups, head.getUserid())){ + if(!this.checkUserExistsGroup(groups, head.getUserid())){ tips.setFailureMsg("no-qx-no-same-project","该项目只开放给同项目组人员。请先加入项目团队再操作。"); return tips; }; @@ -226,12 +408,10 @@ public class XmGroupService extends BaseService { }else if("3".equals(scopeQx)){//同小组 List groups=this.getProjectGroupVoList(xmProject.getId()); List headGroups=groups; - if(!headIsPm){ - headGroups=this.getUserGroups(groups,head.getUserid()); - if( headGroups==null || headGroups.size()==0 ){ - tips.setFailureMsg("no-qx-no-same-team","该项目只开放给同项目同小组人员。请先加入项目团队再操作。"); - return tips; - } + headGroups=this.getUserGroups(groups,head.getUserid()); + if( headGroups==null || headGroups.size()==0 ){ + tips.setFailureMsg("no-qx-no-same-team","该项目只开放给同项目同小组人员。请先加入项目团队再操作。"); + return tips; } for (String memUserid : memUseridSet) { @@ -281,8 +461,6 @@ public class XmGroupService extends BaseService { public Tips checkProjectScopeQx(XmProject xmProject,String userid,String ubranchId){ Tips tips=new Tips(); String scopeQx= ProjectQxTool.getTaskScopeQx(xmProject.getQxCode()); - boolean isPm=this.checkUserIsProjectAdm(xmProject,userid); - if(!isPm){ if("1".equals(scopeQx)){//同组织 if(!StringUtils.hasText(ubranchId)){ User sysUser=sysClient.getUserByUserid(userid); @@ -313,7 +491,6 @@ public class XmGroupService extends BaseService { return tips; } } - } return tips; }