From e4024041b834e83fdc5c673f77a0394c7667a8ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E8=A3=95=E8=B4=A2?= Date: Fri, 10 Nov 2023 17:19:48 +0800 Subject: [PATCH] 2.0 --- .../com/xm/core/ctrl/XmGroupController.java | 462 ++++++++++++++ .../xm/core/ctrl/XmGroupStateController.java | 150 +++++ .../xm/core/ctrl/XmGroupUserController.java | 598 ++++++++++++++++++ .../main/java/com/xm/core/entity/XmGroup.java | 141 +++++ .../java/com/xm/core/entity/XmGroupState.java | 178 ++++++ .../java/com/xm/core/entity/XmGroupUser.java | 90 +++ .../com/xm/core/mapper/XmGroupMapper.java | 28 + .../java/com/xm/core/mapper/XmGroupMapper.xml | 17 + .../xm/core/mapper/XmGroupStateMapper.java | 28 + .../com/xm/core/mapper/XmGroupStateMapper.xml | 17 + .../com/xm/core/mapper/XmGroupUserMapper.java | 30 + .../com/xm/core/mapper/XmGroupUserMapper.xml | 17 + .../com/xm/core/service/XmGroupService.java | 5 +- .../xm/core/service/XmGroupStateService.java | 36 ++ .../xm/core/service/XmGroupUserService.java | 38 ++ .../service/cache/XmGroupCacheService.java | 197 ++++++ .../main/java/com/xm/core/vo/XmGroupVo.java | 16 + 17 files changed, 2047 insertions(+), 1 deletion(-) create mode 100644 xm-core/src/main/java/com/xm/core/ctrl/XmGroupController.java create mode 100644 xm-core/src/main/java/com/xm/core/ctrl/XmGroupStateController.java create mode 100644 xm-core/src/main/java/com/xm/core/ctrl/XmGroupUserController.java create mode 100644 xm-core/src/main/java/com/xm/core/entity/XmGroup.java create mode 100644 xm-core/src/main/java/com/xm/core/entity/XmGroupState.java create mode 100644 xm-core/src/main/java/com/xm/core/entity/XmGroupUser.java create mode 100644 xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.java create mode 100644 xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.xml create mode 100644 xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.java create mode 100644 xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.xml create mode 100644 xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.java create mode 100644 xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.xml create mode 100644 xm-core/src/main/java/com/xm/core/service/XmGroupStateService.java create mode 100644 xm-core/src/main/java/com/xm/core/service/XmGroupUserService.java create mode 100644 xm-core/src/main/java/com/xm/core/service/cache/XmGroupCacheService.java create mode 100644 xm-core/src/main/java/com/xm/core/vo/XmGroupVo.java diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmGroupController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmGroupController.java new file mode 100644 index 00000000..03711f68 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmGroupController.java @@ -0,0 +1,462 @@ +package com.xm.core.ctrl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mdp.core.entity.Result; +import com.mdp.core.entity.Tips; +import com.mdp.core.query.QueryTools; +import com.mdp.core.utils.RequestUtils; +import com.mdp.msg.client.PushNotifyMsgService; +import com.mdp.safe.client.entity.User; +import com.mdp.safe.client.utils.LoginUtils; +import com.mdp.swagger.ApiEntityParams; +import com.xm.core.entity.XmBranchStateHis; +import com.xm.core.entity.XmGroup; +import com.xm.core.entity.XmProduct; +import com.xm.core.entity.XmProject; +import com.xm.core.service.*; +import com.xm.core.service.cache.XmGroupCacheService; +import com.xm.core.service.push.XmPushMsgService; +import com.xm.core.vo.XmGroupVo; +import io.swagger.annotations.*; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * url编制采用rest风格,如对XM.xm_group xm_group的操作有增删改查,对应的url分别为:
+ * 新增: xm/xmGroup/add
+ * 查询: xm/xmGroup/list
+ * 模糊查询: xm/xmGroup/listKey
+ * 修改: xm/xmGroup/edit
+ * 删除: xm/xmGroup/del
+ * 批量删除: xm/xmGroup/batchDel
+ * 组织 com.qqkj 顶级模块 oa 大模块 xm 小模块
+ * 实体 XmProjectGroup 表 XM.xm_group 当前主键(包括多主键): id; + ***/ +@RestController("xm.core.xmGroupController") +@RequestMapping(value="/**/xm/core/xmGroup") +@Api(tags={"xm_group操作接口"}) +public class XmGroupController { + + static Log logger=LogFactory.getLog(XmGroupController.class); + + @Autowired + private XmGroupService xmGroupService; + + + @Autowired + private XmGroupCacheService xmGroupCacheService; + + @Autowired + private XmProjectService xmProjectService; + + + @Autowired + private XmProductService xmProductService; + + @Autowired + private XmProjectQxService projectQxService; + + + @Autowired + private XmProductQxService productQxService; + + @Autowired + XmPushMsgService pushMsgService; + + + @Autowired + PushNotifyMsgService notifyMsgService; + + @Autowired + XmRecordService xmRecordService; + + @ApiOperation( value = "删除旧团队,新增新团队",notes="") + @ApiResponses({ + @ApiResponse(code = 200,response= XmGroup.class,message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'},data:数据对象}") + }) + //@HasQx(value = "xm_core_xmGroup_updateGroup",name = "批量更新修改项目团队信息",moduleId = "xm-project",moduleName = "管理端-项目管理系统") + @RequestMapping(value="/edit",method=RequestMethod.POST) + public Result updateGroup(@RequestBody XmGroup group) { + + + + if(group==null){ + return Result.error("小组信息不能为空"); + } + if(!StringUtils.hasText(group.getId())){ + return Result.error("id-0","小组编号不能为空"); + } + User user=LoginUtils.getCurrentUserInfo(); + XmGroup groupDb=this.xmGroupService.getById( group.getId()); + if(groupDb==null){ + return Result.error("data-0","小组已不存在。"); + } + if("0".equals(groupDb.getPgClass())){ + XmProject project=xmProjectService.getProjectFromCache(groupDb.getProjectId()); + boolean isPm=xmGroupService.checkUserIsProjectAdm(project, user.getUserid()); + if(!isPm){ + Tips tips = projectQxService.checkProjectQx(project,0,user); + Result.assertIsFalse(tips); + } + if(StringUtils.hasText(group.getLeaderUserid()) && !group.getLeaderUserid().equals(groupDb.getLeaderUserid())){ + Tips tips = projectQxService.checkProjectQx(project,0,user, groupDb.getLeaderUserid(),groupDb.getLeaderUsername(),null); + Result.assertIsFalse(tips); + tips =projectQxService.checkProjectScopeQx(project,0,group.getLeaderUserid(),group.getLeaderUsername(),null); + Result.assertIsFalse(tips); + } + if(StringUtils.hasText(group.getAssUserid()) && !group.getAssUserid().equals(groupDb.getAssUserid())){ + Tips tips = projectQxService.checkProjectQx(project,0,user, groupDb.getAssUserid(),groupDb.getAssUsername(),null); + Result.assertIsFalse(tips); + tips =projectQxService.checkProjectScopeQx(project,0,group.getAssUserid(),group.getAssUsername(),null); + Result.assertIsFalse(tips); + } + }else { + XmProduct product=xmProductService.getProductFromCache(groupDb.getProductId()); + boolean isPm=xmGroupService.checkUserIsProductAdm(product, user.getUserid()); + if(!isPm){ + Tips tips = productQxService.checkProductQx(product,0,user); + Result.assertIsFalse(tips); + } + if(StringUtils.hasText(group.getLeaderUserid()) && !group.getLeaderUserid().equals(groupDb.getLeaderUserid())){ + Tips tips = productQxService.checkProductQx(product,0,user, groupDb.getLeaderUserid(),groupDb.getLeaderUsername(),null); + Result.assertIsFalse(tips); + tips =productQxService.checkProductScopeQx(product,0,group.getLeaderUserid(),group.getLeaderUsername(),null); + Result.assertIsFalse(tips); + } + if(StringUtils.hasText(group.getAssUserid()) && !group.getAssUserid().equals(groupDb.getAssUserid())){ + Tips tips = productQxService.checkProductQx(product,0,user, groupDb.getAssUserid(),groupDb.getAssUsername(),null); + Result.assertIsFalse(tips); + tips =productQxService.checkProductScopeQx(product,0,group.getAssUserid(),group.getAssUsername(),null); + Result.assertIsFalse(tips); + } + } + + xmGroupService.parentIdPathsCalcBeforeSave(group); + Tips tips= xmGroupService.updateGroup(group,groupDb); //列出XmProjectGroup列表 + Result.assertIsFalse(tips); + if("0".equals(groupDb.getPgClass())){ + xmGroupCacheService.clearProjectGroup(groupDb.getProjectId()); + xmRecordService.addXmGroupRecord(groupDb.getProjectId(),groupDb.getId(),"团队-小组-修改小组","修改小组信息【"+groupDb.getGroupName()+"】"); + + }else{ + xmGroupCacheService.clearProductGroup(groupDb.getProductId()); + xmRecordService.addXmProductRecord(groupDb.getProductId(),"团队-小组-修改小组","修改小组信息【"+groupDb.getGroupName()+"】"); + + } + return Result.ok(); + } + + @ApiOperation( value = "根据项目Id拿到团队",notes="") + @ApiEntityParams(XmGroup.class) + @ApiImplicitParams({ + @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) + }) + @ApiResponses({ + @ApiResponse(code = 200,response= XmGroup.class,message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'},data:数据对象}") + }) + //@HasQx(value = "xm_core_xmGroup_getGroups",name = "查找项目团队信息",moduleId = "xm-project",moduleName = "管理端-项目管理系统") + @RequestMapping(value="/getGroups",method=RequestMethod.GET) + public Result getGroup(@ApiIgnore @RequestParam Map params) { + + RequestUtils.transformArray(params, "ids"); + IPage page=QueryTools.initPage(params); + List datas=new ArrayList<>(); + String iterationId= (String) params.get("iterationId"); + String projectId= (String) params.get("projectId"); + String productId= (String) params.get("productId"); + if(StringUtils.hasText(productId)){ + datas = xmGroupService.getProductGroupVoList(productId); //产品团队 + }else if(StringUtils.hasText(projectId)){ + datas = xmGroupService.getProjectGroupVoList(projectId); //列出XmProjectGroup列表 + }else if(StringUtils.hasText(iterationId)){ + datas = xmGroupService.getProjectGroupVoListByIterationId(iterationId ); //列出XmProjectGroup列表 + } + + return Result.ok().setData(datas); + } + + + + + + @ApiOperation( value = "查询xm_group信息列表",notes="listXmProjectGroup,条件之间是 and关系,模糊查询写法如 {studentName:'%才哥%'}") + @ApiEntityParams(XmGroup.class) + @ApiImplicitParams({ + @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) + }) + @ApiResponses({ + @ApiResponse(code = 200,response= XmGroup.class,message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'错误码'},total:总记录数,data:[数据对象1,数据对象2,...]}") + }) + @RequestMapping(value="/list",method=RequestMethod.GET) + public Result listXmProjectGroup(@ApiIgnore @RequestParam Map params){ + + RequestUtils.transformArray(params, "ids"); + IPage page=QueryTools.initPage(params); + User user=LoginUtils.getCurrentUserInfo(); + String projectId= (String) params.get("projectId"); + String productId= (String) params.get("productId"); + String iterationId= (String) params.get("iterationId"); + if(!StringUtils.hasText(projectId) && !StringUtils.hasText(productId) && !StringUtils.hasText(iterationId)){ + params.put("branchId",user.getBranchId()); + params.put("orCrowBranchId",user.getBranchId()); + } + QueryWrapper qw = QueryTools.initQueryWrapper(XmBranchStateHis.class , params); + List> datas = xmGroupService.selectListMapByWhere(page,qw,params); + return Result.ok("query-ok","查询成功").setData(datas).setTotal(page.getTotal()); //列出XmProjectGroup列表 + + } + + @ApiOperation( value = "新增一条xm_group信息",notes="addXmProjectGroup,主键如果为空,后台自动生成") + @ApiResponses({ + @ApiResponse(code = 200,response= XmGroup.class,message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'},data:数据对象}") + }) + //@HasQx(value = "xm_core_xmGroup_add",name = "新增项目团队信息",moduleId = "xm-project",moduleName = "管理端-项目管理系统") + @RequestMapping(value="/add",method=RequestMethod.POST) + public Result addXmProjectGroup(@RequestBody XmGroup xmGroup) { + + User u = LoginUtils.getCurrentUserInfo(); + + if(StringUtils.isEmpty(xmGroup.getPgClass())){ + return Result.error("pgClass-0","小组类型不能为空"); + } + xmGroup.setBranchId(null); + if("0".equals(xmGroup.getPgClass())){ + if(!StringUtils.hasText(xmGroup.getProjectId())){ + return Result.error("projectId-0","项目编号不能为空"); + } + XmProject project = xmProjectService.getProjectFromCache(xmGroup.getProjectId()); + if(project==null){ + return Result.error("project-0","项目已不存在"); + } + Tips tips =this.xmGroupService.checkProjectStatus(project); + if(!tips.isOk()){ + return Result.error(tips); + } + Tips tips =checkProjectGroupQxForAdd(project,u,xmGroup); + if(!tips.isOk()){ + return Result.error(tips); + } + xmGroup.setProductId(null); + + xmGroup.setBranchId(project.getBranchId()); + }else if("1".equals(xmGroup.getPgClass())){ + if(!StringUtils.hasText(xmGroup.getProductId())){ + return Result.error("productId-0","产品编号不能为空"); + } + XmProduct xmProduct = xmProductService.getProductFromCache(xmGroup.getProductId()); + if(xmProduct==null){ + return Result.error("product-0","产品已不存在"); + } + Tips tips =this.xmGroupService.checkProductStatus(xmProduct); + if(!tips.isOk()){ + return Result.error(tips); + } + Tips tips =checkProductGroupQxForAdd(xmProduct,u,xmGroup); + if(!tips.isOk()){ + return Result.error(tips); + } + xmGroup.setBranchId(xmProduct.getBranchId()); + }else{ + return Result.error("pgClass-err","小组类型数值不正确"); + } + + + if (StringUtils.isEmpty(xmGroup.getId())) { + xmGroup.setId(xmGroupService.createKey("id")); + } else { + XmGroup xmGroupQuery = new XmGroup(xmGroup.getId()); + if (xmGroupService.countByWhere(xmGroupQuery) > 0) { + return Result.error("编号重复,请修改编号再提交"); + + } + } + if(!StringUtils.hasText(xmGroup.getBranchId())){ + xmGroup.setBranchId(u.getBranchId()); + } + this.xmGroupService.parentIdPathsCalcBeforeSave(xmGroup); + xmGroupService.insert(xmGroup); + if("0".equals(xmGroup.getPgClass())){ + xmGroupCacheService.clearProjectGroup(xmGroup.getProjectId()); + xmRecordService.addXmGroupRecord(xmGroup.getProjectId(),xmGroup.getId(),"团队-小组-新增小组","新增小组【"+xmGroup.getGroupName()+"】"); + }else{ + xmGroupCacheService.clearProductGroup(xmGroup.getProductId()); + xmRecordService.addXmProductRecord(xmGroup.getProductId(),"团队-小组-新增小组","新增小组【"+xmGroup.getGroupName()+"】"); + } + + + + return Result.ok(); + + } + + + public Tips checkProductGroupQxForAdd(XmProduct xmProduct,User u,XmGroup xmGroup){ + + + tips=productQxService.checkProductQx(xmProduct,0,u); + if(!tips.isOk()){ + return tips; + } + if(StringUtils.hasText(xmGroup.getLeaderUserid()) && !xmGroup.getLeaderUserid().equals(u.getUserid())){ + Tips tips=productQxService.checkProductScopeQx(xmProduct,0,xmGroup.getLeaderUserid(),xmGroup.getLeaderUsername(),null); + } + if(!tips.isOk()){ + return tips; + } + if(StringUtils.hasText(xmGroup.getAssUserid()) && !xmGroup.getAssUserid().equals(u.getUserid())){ + Tips tips=productQxService.checkProductScopeQx(xmProduct,0,xmGroup.getAssUserid(),xmGroup.getAssUsername(),null); + } + return tips; + } + + + public Tips checkProjectGroupQxForAdd(XmProject project,User u,XmGroup xmGroup){ + + + tips=projectQxService.checkProjectQx(project,0,u); + if(!tips.isOk()){ + return tips; + } + if(StringUtils.hasText(xmGroup.getLeaderUserid()) && !xmGroup.getLeaderUserid().equals(u.getUserid())){ + Tips tips=projectQxService.checkProjectScopeQx(project,0,xmGroup.getLeaderUserid(),xmGroup.getLeaderUsername(),null); + } + if(!tips.isOk()){ + return tips; + } + if(StringUtils.hasText(xmGroup.getAssUserid()) && !xmGroup.getAssUserid().equals(u.getUserid())){ + Tips tips=projectQxService.checkProjectScopeQx(project,0,xmGroup.getAssUserid(),xmGroup.getAssUsername(),null); + } + return tips; + } + + @ApiOperation( value = "删除一条xm_group信息",notes="delXmProjectGroup,仅需要上传主键字段") + @ApiResponses({ + @ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}}") + }) + @RequestMapping(value="/del",method=RequestMethod.POST) + public Result delXmProjectGroup(@RequestBody XmGroup xmGroup){ + + User u = LoginUtils.getCurrentUserInfo(); + if(!StringUtils.hasText(xmGroup.getId())){ + return Result.error("id-0","请上送小组编号"); + } + XmGroup groupDb=this.xmGroupService.selectOneObject(xmGroup); + if(groupDb==null){ + return Result.error("data-0","小组已不存在"); + } + if("0".equals(groupDb.getPgClass()) && StringUtils.hasText(groupDb.getProjectId())){ + XmProject project = xmProjectService.getProjectFromCache(groupDb.getProjectId()); + if(project==null){ + return Result.error("project-0","项目已不存在"); + } + boolean isPm=xmGroupService.checkUserIsProjectAdm(project,u.getUserid()); + if(!isPm) { + Tips tips =projectQxService.checkProjectQx(project,0,u,groupDb.getLeaderUserid(),groupDb.getLeaderUsername(), null); + if(!tips.isOk()){ + return Result.error(tips); + } + } + } else if("1".equals(groupDb.getPgClass()) && StringUtils.hasText(groupDb.getProductId())){ + XmProduct product = xmProductService.getProductFromCache(groupDb.getProductId()); + if(product==null){ + return Result.error("product-0","产品已不存在"); + } + boolean isPm=xmGroupService.checkUserIsProductAdm(product,u.getUserid()); + if(!isPm) { + Tips tips =productQxService.checkProductQx(product,0,u,groupDb.getLeaderUserid(),groupDb.getLeaderUsername(), null); + if(!tips.isOk()){ + return Result.error(tips); + } + } + } + XmGroup childrenGroupQuery=new XmGroup(); + childrenGroupQuery.setPgroupId(xmGroup.getId()); + long childrenCnt=this.xmGroupService.countByWhere(childrenGroupQuery); + if(childrenCnt>0){ + return Result.error("childrenCnt-no-0","该小组有下级小组,不能删除。请先删除下级小组。"); + } + xmGroupService.doDeleteByPk(xmGroup,groupDb); + if("0".equals(groupDb.getPgClass())){ + xmGroupCacheService.clearProjectGroup(groupDb.getProjectId()); + xmRecordService.addXmGroupRecord(groupDb.getProjectId(),groupDb.getId(),"团队-小组-删除小组","删除小组【"+groupDb.getGroupName()+"】"); + + }else{ + xmGroupCacheService.clearProductGroup(groupDb.getProductId()); + xmRecordService.addXmProductRecord(groupDb.getProductId(),"团队-小组-删除小组","删除小组【"+groupDb.getGroupName()+"】"); + + } + + + return Result.ok("query-ok","查询成功").setData(datas).setTotal(page.getTotal()); + + } + + + /** + * + + + @ApiOperation( value = "根据主键列表批量删除xm_group信息",notes="batchDelXmProjectGroup,仅需要上传主键字段") + @ApiResponses({ + @ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}") + }) + @RequestMapping(value="/batchDel",method=RequestMethod.POST) + public Result batchDelXmProjectGroup(@RequestBody List xmGroups) { + + List groupsDb=this.xmGroupService.selectListByIds(xmGroups.stream().map(i->i.getId()).collect(Collectors.toList())); + if(groupsDb==null || groupsDb.size()==0){ + return Result.error("data-0","要删除的小组已不存在"); + } + User user=LoginUtils.getCurrentUserInfo(); + XmGroup groupDb=groupsDb.get(0); + String id=groupDb.getProductId(); + List hasChildNodes=new ArrayList<>(); + List noQxs=new ArrayList<>(); + List canDelNodes=new ArrayList<>(); + id=groupDb.getProjectId(); + XmProject prject=this.xmProjectService.getProjectFromCache(id); + Map projectAdmMap=xmGroupService.getProjectAdmUsers(prject); + if (!projectAdmMap.containsKey(user.getUserid())) { + return Result.error("not-project-adm","您不是项目管理人员,不能删除小组。项目级助理以上人员可以删除小组。"); + } + + if(canDelNodes.size()>0){ + for (XmGroup canDelNode : canDelNodes) { + if(!xmGroupService.checkCanDelAllChild(canDelNode,canDelNodes)){ + hasChildNodes.add(canDelNode); + }else{ + canDelNodes.add(canDelNode); + } + } + } + if(canDelNodes.size()>0){ + String groupNames=canDelNodes.stream().map(i->i.getGroupName()).collect(Collectors.joining(",")); + + xmGroupService.doBatchDeleteProjectGroups(canDelNodes); + xmGroupCacheService.clearProjectGroups(groupDb.getProjectId()); + xmRecordService.addXmGroupRecord(groupDb.getProjectId(),groupDb.getId(),"团队-小组-批量删除小组","删除"+canDelNodes.size()+"个小组【"+groupNames+"】"); + + } + return Result.ok("query-ok","查询成功").setData(datas).setTotal(page.getTotal()); + + } + + */ +} diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmGroupStateController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmGroupStateController.java new file mode 100644 index 00000000..79450277 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmGroupStateController.java @@ -0,0 +1,150 @@ +package com.xm.core.ctrl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mdp.core.entity.Result; +import com.mdp.core.query.QueryTools; +import com.mdp.core.utils.RequestUtils; +import com.mdp.swagger.ApiEntityParams; +import com.xm.core.entity.XmBranchStateHis; +import com.xm.core.entity.XmGroupState; +import com.xm.core.service.XmGroupStateService; +import io.swagger.annotations.*; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.List; +import java.util.Map; + +/** + * url编制采用rest风格,如对XM.xm_group_state 功能状态表,无需前端维护,所有数据由汇总统计得出的操作有增删改查,对应的url分别为:
+ * 新增: core/xmGroupState/add
+ * 查询: core/xmGroupState/list
+ * 模糊查询: core/xmGroupState/listKey
+ * 修改: core/xmGroupState/edit
+ * 删除: core/xmGroupState/del
+ * 批量删除: core/xmGroupState/batchDel
+ * 组织 com.qqkj 顶级模块 xm 大模块 core 小模块
+ * 实体 XmProjectGroupState 表 XM.xm_group_state 当前主键(包括多主键): id; + ***/ +@RestController("xm.core.xmGroupStateController") +@RequestMapping(value="/**/core/xmGroupState") +@Api(tags={"功能状态表,无需前端维护,所有数据由汇总统计得出操作接口"}) +public class XmGroupStateController { + + static Log logger=LogFactory.getLog(XmGroupStateController.class); + + @Autowired + private XmGroupStateService xmGroupStateService; + + + + + @ApiOperation( value = "查询功能状态表,无需前端维护,所有数据由汇总统计得出信息列表",notes="listXmProjectGroupState,条件之间是 and关系,模糊查询写法如 {studentName:'%才哥%'}") + @ApiEntityParams(XmGroupState.class) + @ApiImplicitParams({ + @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) + }) + @ApiResponses({ + @ApiResponse(code = 200,response= XmGroupState.class,message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'错误码'},total:总记录数,data:[数据对象1,数据对象2,...]}") + }) + @RequestMapping(value="/list",method=RequestMethod.GET) + public Result listXmProjectGroupState(@ApiIgnore @RequestParam Map params){ + + RequestUtils.transformArray(params, "ids"); + IPage page= QueryTools.initPage(params); + QueryWrapper qw = QueryTools.initQueryWrapper(XmBranchStateHis.class , params); + List> datas = xmGroupStateService.selectListMapByWhere(page,qw,params); + return Result.ok("query-ok","查询成功").setData(datas).setTotal(page.getTotal()); //列出XmProjectGroupState列表 + + } + + + + @ApiOperation( value = "计算bug、task、测试案例、等数据",notes="loadTasksToXmProjectGroupState") + @ApiResponses({ + @ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}") + }) + @RequestMapping(value="/loadTasksToXmProjectGroupState",method=RequestMethod.POST) + public Result loadTasksToXmProjectGroupState(@RequestBody Map params) { + + + + int i= xmGroupStateService.loadTasksToXmProjectGroupState((String) params.get("projectId")); + return Result.ok(); + + } + /** + @ApiOperation( value = "新增一条功能状态表,无需前端维护,所有数据由汇总统计得出信息",notes="addXmProjectGroupState,主键如果为空,后台自动生成") + @ApiResponses({ + @ApiResponse(code = 200,response=XmProjectGroupState.class,message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'},data:数据对象}") + }) + @RequestMapping(value="/add",method=RequestMethod.POST) + public Result addXmProjectGroupState(@RequestBody XmProjectGroupState xmGroupState) { + + if(StringUtils.isEmpty(xmGroupState.getId())) { + xmGroupState.setId(xmGroupStateService.createKey("id")); + }else{ + XmProjectGroupState xmGroupStateQuery = new XmProjectGroupState(xmGroupState.getId()); + if(xmGroupStateService.countByWhere(xmGroupStateQuery)>0){ + return Result.error("编号重复,请修改编号再提交"); + + } + } + xmGroupStateService.insert(xmGroupState); + + } + */ + + /** + @ApiOperation( value = "删除一条功能状态表,无需前端维护,所有数据由汇总统计得出信息",notes="delXmProjectGroupState,仅需要上传主键字段") + @ApiResponses({ + @ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}}") + }) + @RequestMapping(value="/del",method=RequestMethod.POST) + public Result delXmProjectGroupState(@RequestBody XmProjectGroupState xmGroupState){ + + xmGroupStateService.deleteByPk(xmGroupState); + return Result.ok(); + + } + */ + + /** + @ApiOperation( value = "根据主键修改一条功能状态表,无需前端维护,所有数据由汇总统计得出信息",notes="editXmProjectGroupState") + @ApiResponses({ + @ApiResponse(code = 200,response=XmProjectGroupState.class, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'},data:数据对象}") + }) + @RequestMapping(value="/edit",method=RequestMethod.POST) + public Result editXmProjectGroupState(@RequestBody XmProjectGroupState xmGroupState) { + + xmGroupStateService.updateByPk(xmGroupState); + + } + */ + + + + /** + @ApiOperation( value = "根据主键列表批量删除功能状态表,无需前端维护,所有数据由汇总统计得出信息",notes="batchDelXmProjectGroupState,仅需要上传主键字段") + @ApiResponses({ + @ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}") + }) + @RequestMapping(value="/batchDel",method=RequestMethod.POST) + public Result batchDelXmProjectGroupState(@RequestBody List xmGroupStates) { + + + + xmGroupStateService.batchDelete(xmGroupStates); + return Result.ok(); + + } + */ +} diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmGroupUserController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmGroupUserController.java new file mode 100644 index 00000000..a7aab1b5 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmGroupUserController.java @@ -0,0 +1,598 @@ +package com.xm.core.ctrl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mdp.core.entity.Result; +import com.mdp.core.query.QueryTools; +import com.mdp.core.utils.RequestUtils; +import com.mdp.msg.client.PushNotifyMsgService; +import com.mdp.safe.client.entity.User; +import com.mdp.safe.client.utils.LoginUtils; +import com.mdp.swagger.ApiEntityParams; +import com.xm.core.entity.XmBranchStateHis; +import com.xm.core.entity.XmGroupUser; +import com.xm.core.entity.XmProduct; +import com.xm.core.entity.XmProject; +import com.xm.core.service.*; +import com.xm.core.service.push.XmPushMsgService; +import com.xm.core.vo.XmGroupVo; +import io.swagger.annotations.*; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.*; +import java.util.stream.Collectors; + +import static com.mdp.core.utils.BaseUtils.map; + +/** + * url编制采用rest风格,如对XM.xm_group_user xm_group_user的操作有增删改查,对应的url分别为:
+ * 新增: core/xmGroupUser/add
+ * 查询: core/xmGroupUser/list
+ * 模糊查询: core/xmGroupUser/listKey
+ * 修改: core/xmGroupUser/edit
+ * 删除: core/xmGroupUser/del
+ * 批量删除: core/xmGroupUser/batchDel
+ * 组织 com.qqkj 顶级模块 xm 大模块 core 小模块
+ * 实体 XmProjectGroupUser 表 XM.xm_group_user 当前主键(包括多主键): id; + ***/ +@RestController("xm.core.xmGroupUserController") +@RequestMapping(value="/**/core/xmGroupUser") +@Api(tags={"xm_group_user操作接口"}) +public class XmGroupUserController { + + static Log logger=LogFactory.getLog(XmGroupUserController.class); + + @Autowired + private XmGroupUserService xmGroupUserService; + + + @Autowired + private XmProjectService xmProjectService; + + + @Autowired + private XmProductService xmProductService; + + @Autowired + XmGroupService xmGroupService; + + + @Autowired + XmRecordService xmRecordService; + + @Autowired + XmPushMsgService pushMsgService; + + + + @Autowired + PushNotifyMsgService notifyMsgService; + + + @ApiOperation( value = "查询xm_group_user信息列表",notes="listXmProjectGroupUser,条件之间是 and关系,模糊查询写法如 {studentName:'%才哥%'}") + @ApiEntityParams(XmGroupUser.class) + @ApiImplicitParams({ + @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) + }) + @ApiResponses({ + @ApiResponse(code = 200,response= XmGroupUser.class,message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'错误码'},total:总记录数,data:[数据对象1,数据对象2,...]}") + }) + @RequestMapping(value="/list",method=RequestMethod.GET) + public Result listXmProjectGroupUser(@ApiIgnore @RequestParam Map params){ + + RequestUtils.transformArray(params, "ids"); + IPage page= QueryTools.initPage(params); + User user=LoginUtils.getCurrentUserInfo(); + params.put("branchId",user.getBranchId()); + QueryWrapper qw = QueryTools.initQueryWrapper(XmBranchStateHis.class , params); + List> datas = sssssssssssssssService.selectListMapByWhere(page,qw,params); + return Result.ok("query-ok","查询成功").setData(datas).setTotal(page.getTotal()); //列出XmProjectGroupUser列表 + + } + + + + @ApiOperation( value = "新增一条xm_group_user信息",notes="addXmProjectGroupUser,主键如果为空,后台自动生成") + @ApiResponses({ + @ApiResponse(code = 200,response= XmGroupUser.class,message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'},data:数据对象}") + }) + @RequestMapping(value="/add",method=RequestMethod.POST) + public Result addXmProjectGroupUser(@RequestBody XmGroupUser gu) { + + + if(!StringUtils.hasText(gu.getGroupId())||!StringUtils.hasText(gu.getUserid())){ + return Result.error("pk-0","请上送小组编号,用户编号groupId,userid"); + } + if(!StringUtils.hasText(gu.getPgClass())){ + return Result.error("pgClass-0","请上送小组类型pgClass"); + } + String pgClass=gu.getPgClass(); + User user=LoginUtils.getCurrentUserInfo(); + String name=""; + if("0".equals(pgClass)){ + if(!StringUtils.hasText(gu.getProjectId())){ + return Result.error("projectId-0","请上送小组归属项目编号"); + } + + XmProject xmProject=this.xmProjectService.getProjectFromCache(gu.getProjectId()); + if(xmProject==null){ + return Result.error("product-0","产品已不存在"); + } + name=xmProject.getName(); + if(!xmGroupService.checkUserIsProjectAdm(xmProject, user.getUserid())){ + XmGroupVo xmGroupVo=this.xmGroupService.getProjectGroupFromCache(xmProject.getId(),gu.getGroupId()); + if(xmGroupVo==null){ + return Result.error("group-0","小组已不存在"); + } + boolean isHead=xmGroupService.checkUserIsTeamHeadOrAss(xmGroupVo,user.getUserid()); + if(isHead==false){ + return Result.error("not-leader-ass","组长、副组长、组长助理以上人员可以添加小组成员。"); + } + } + }else if("1".equals(pgClass)){ + if(!StringUtils.hasText(gu.getProductId())){ + return Result.error("productId-0","请上送小组归属产品编号"); + } + + XmProduct product=this.xmProductService.getProductFromCache(gu.getProductId()); + if(product==null){ + return Result.error("product-0","产品已不存在"); + } + name=product.getProductName(); + if(!xmGroupService.checkUserIsProductAdm(product, user.getUserid())){ + XmGroupVo xmGroupVo=this.xmGroupService.getProductGroupFromCache(product.getId(),gu.getGroupId()); + if(xmGroupVo==null){ + return Result.error("group-0","小组已不存在"); + } + boolean isHead=xmGroupService.checkUserIsTeamHeadOrAss(xmGroupVo,user.getUserid()); + if(isHead==false){ + return Result.error("not-leader-ass","组长、副组长、组长助理以上人员可以添加小组成员。"); + } + } + } + + if(xmGroupUserService.countByWhere(gu)>0){ + return Result.error("该用户已在小组中"); + + } + xmGroupUserService.insert(gu); + Map usermap=new HashMap<>(); + usermap.put("userid", gu.getUserid()); + usermap.put("username", gu.getUsername()); + List> users=new ArrayList<>(); + users.add(usermap); + pushMsgService.pushJoinChannelGroupMsg(user.getBranchId(), gu.getGroupId(), users); + notifyMsgService.pushMsg(user,gu.getUserid(),gu.getUsername(),"7",gu.getProjectId(),gu.getGroupId(),"恭喜您加入"+("0".equals(pgClass)?"项目":"产品")+"【"+name+"】"); + if("1".equals(pgClass)){ + xmGroupService.clearProductGroup(gu.getProductId()); + xmRecordService.addXmGroupRecord(gu.getProductId(),gu.getGroupId(), "产品-团队-新增小组成员", "增加组员["+gu.getUsername()+"]",gu.getUserid(),null); + }else{ + xmGroupService.clearProjectGroup(gu.getProjectId()); + xmRecordService.addXmGroupRecord(gu.getProjectId(),gu.getGroupId(), "项目-团队-新增小组成员", "增加组员["+gu.getUsername()+"]",gu.getUserid(),null); + } + + + return Result.ok(); + + } + + @ApiOperation( value = "删除一条xm_group_user信息",notes="delXmProjectGroupUser,仅需要上传主键字段") + @ApiResponses({ + @ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}}") + }) + @RequestMapping(value="/del",method=RequestMethod.POST) + public Result delXmProjectGroupUser(@RequestBody XmGroupUser gu){ + + if(!StringUtils.hasText(gu.getGroupId())||!StringUtils.hasText(gu.getUserid())){ + return Result.error("pk-0","请上送小组编号,用户编号groupId,userid"); + } + gu=this.xmGroupUserService.selectOneObject(gu); + if(gu==null){ + return Result.error("data-0","小组组员已不存在"); + } + String pgClass=gu.getPgClass(); + User user=LoginUtils.getCurrentUserInfo(); + + String name=""; + if("0".equals(pgClass)){ + if(!StringUtils.hasText(gu.getProjectId())){ + return Result.error("projectId-0","请上送小组归属项目编号"); + } + XmProject xmProject=this.xmProjectService.getProjectFromCache(gu.getProjectId()); + if(xmProject==null){ + return Result.error("project-0","项目已不存在"); + } + name=xmProject.getName(); + if(!xmGroupService.checkUserIsProjectAdm(xmProject, user.getUserid())){ + XmGroupVo xmGroupVo=this.xmGroupService.getProjectGroupFromCache(xmProject.getId(),gu.getGroupId()); + if(xmGroupVo==null){ + return Result.error("group-0","小组已不存在"); + } + boolean isHead=xmGroupService.checkUserIsTeamHeadOrAss(xmGroupVo,user.getUserid()); + if(isHead==false){ + return Result.error("not-leader-ass","组长、副组长、组长助理以上人员可以删除小组成员。"); + } + } + }else{ + if(!StringUtils.hasText(gu.getProductId())){ + return Result.error("productId-0","请上送小组归属产品编号"); + } + XmProduct xmProduct=this.xmProductService.getProductFromCache(gu.getProductId()); + if(xmProduct==null){ + return Result.error("productId-0","产品已不存在"); + } + name=xmProduct.getProductName(); + if(!xmGroupService.checkUserIsProductAdm(xmProduct, user.getUserid())){ + XmGroupVo xmGroupVo=this.xmGroupService.getProductGroupFromCache(xmProduct.getId(),gu.getGroupId()); + if(xmGroupVo==null){ + return Result.error("group-0","小组已不存在"); + } + boolean isHead=xmGroupService.checkUserIsTeamHeadOrAss(xmGroupVo,user.getUserid()); + if(isHead==false){ + return Result.error("not-leader-ass","组长、副组长、组长助理以上人员可以删除小组成员。"); + } + } + } + + xmGroupUserService.deleteByPk(gu); + Map usermap=new HashMap<>(); + usermap.put("userid", gu.getUserid()); + usermap.put("username", gu.getUsername()); + List> users=new ArrayList<>(); + users.add(usermap); + + notifyMsgService.pushMsg(user,gu.getUserid(),gu.getUsername(),"7",gu.getProjectId(),gu.getGroupId(),"您离开"+("0".equals(pgClass)?"项目":"产品")+"【"+name+"】中的小组【"+gu.getGroupId()+"】"); + + pushMsgService.pushLeaveChannelGroupMsg(user.getBranchId(), gu.getGroupId(), users); + + if("1".equals(pgClass)){ + xmGroupService.clearProductGroup(gu.getProductId()); + xmRecordService.addXmProductRecord(gu.getProductId(), "产品-团队-删除小组成员", "删除组员["+gu.getUsername()+"]",gu.getUserid(),null); + + }else{ + xmGroupService.clearProjectGroup(gu.getProjectId()); + xmRecordService.addXmGroupRecord(gu.getProjectId(),gu.getGroupId(), "项目-团队-删除小组成员", "删除组员["+gu.getUsername()+"]",gu.getUserid(),null); + + } + + + return Result.ok("query-ok","查询成功").setData(datas).setTotal(page.getTotal()); + + } + + @ApiOperation( value = "根据主键修改一条xm_group_user信息",notes="editXmProjectGroupUser") + @ApiResponses({ + @ApiResponse(code = 200,response= XmGroupUser.class, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'},data:数据对象}") + }) + @RequestMapping(value="/edit",method=RequestMethod.POST) + public Result editXmProjectGroupUser(@RequestBody XmGroupUser gu0) { + + if(!StringUtils.hasText(gu0.getGroupId())||!StringUtils.hasText(gu0.getUserid())){ + return Result.error("pk-0","请上送小组编号,用户编号groupId,userid"); + } + XmGroupUser gu=this.xmGroupUserService.selectOneObject(gu0); + if(gu==null){ + return Result.error("data-0","小组已不存在"); + } + String pgClass=gu.getPgClass(); + User user=LoginUtils.getCurrentUserInfo(); + if("1".equals(pgClass)){ + + if(!StringUtils.hasText(gu.getProductId())){ + return Result.error("productId-0","请上送小组归属产品编号"); + } + XmProduct xmProduct=this.xmProductService.getProductFromCache(gu.getProductId()); + if(xmProduct==null){ + return Result.error("product-0","产品已不存在"); + } + if(!xmGroupService.checkUserIsProductAdm(xmProduct, user.getUserid())){ + XmGroupVo xmGroupVo=this.xmGroupService.getProductGroupFromCache(xmProduct.getId(),gu.getGroupId()); + if(xmGroupVo==null){ + return Result.error("group-0","小组已不存在"); + } + boolean isHead=xmGroupService.checkUserIsTeamHeadOrAss(xmGroupVo,user.getUserid()); + if(isHead==false){ + return Result.error("not-leader-ass","组长、副组长、组长助理以上人员可以修改小组成员。"); + } + } + }else{ + if(!StringUtils.hasText(gu.getProjectId())){ + return Result.error("projectId-0","请上送小组归属项目编号"); + } + + XmProject xmProject=this.xmProjectService.getProjectFromCache(gu.getProjectId()); + if(xmProject==null){ + return Result.error("product-0","产品已不存在"); + } + if(!xmGroupService.checkUserIsProjectAdm(xmProject, user.getUserid())){ + XmGroupVo xmGroupVo=this.xmGroupService.getProductGroupFromCache(xmProject.getId(),gu.getGroupId()); + if(xmGroupVo==null){ + return Result.error("group-0","小组已不存在"); + } + boolean isHead=xmGroupService.checkUserIsTeamHeadOrAss(xmGroupVo,user.getUserid()); + if(isHead==false){ + return Result.error("not-leader-ass","组长、副组长、组长助理以上人员可以修改小组成员。"); + } + } + } + xmGroupUserService.updateSomeFieldByPk(gu0); + + if("0".equals(pgClass)){ + + xmGroupService.clearProjectGroup(gu.getProjectId()); + xmRecordService.addXmGroupRecord(gu.getProjectId(), gu.getGroupId(),"项目-团队-修改小组成员信息", "变更["+gu.getUsername()+"]"); + }else { + + xmGroupService.clearProductGroup(gu.getProductId()); + xmRecordService.addXmGroupRecord(gu.getProductId(), gu.getGroupId(),"项目-团队-修改小组成员信息", "变更["+gu.getUsername()+"]"); + } + + + } + + + @ApiOperation( value = "根据主键列表批量新增xm_group_user信息",notes="batchAddXmProjectGroupUser,仅需要上传主键字段") + @ApiResponses({ + @ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}") + }) + @RequestMapping(value="/batchAdd",method=RequestMethod.POST) + public Result batchAddXmProjectGroupUser(@RequestBody List gus) { + + if(gus==null || gus.size()==0){ + return Result.error("data-0","请上送要删除的小组成员"); + } + + + if(gus.stream().filter(i->!StringUtils.hasText(i.getUserid())||!StringUtils.hasText(i.getGroupId())).findAny().isPresent()){ + return Result.error("userid-or-groupId-0","请上送用户编号及小组编号"); + }else{ + for (XmGroupUser gu : gus) { + if (!"1".equals(gu.getPgClass()) && !StringUtils.hasText(gu.getProjectId())) { + return Result.error("projectId-0", "项目编号不能为空"); + } else if ("1".equals(gu.getPgClass()) && !StringUtils.hasText(gu.getProductId())) { + return Result.error("productId-0", "产品编号不能为空"); + } + if (!StringUtils.hasText(gu.getObranchId())) { + return Result.error("obranchId-0", "用户归属机构号不能为空"); + } + if (!StringUtils.hasText(gu.getUserid())) { + return Result.error("userid-0", "用户编号不能为空"); + } + if (!StringUtils.hasText(gu.getUsername())) { + return Result.error("username-0", "用户名称不能为空"); + } + if (!StringUtils.hasText(gu.getGroupId())) { + return Result.error("groupId-0", "要加入的组编号不能为空"); + } + } + } + List gusDb=this.xmGroupUserService.selectListByIds(gus); + //过滤掉已经存在的 + List gusNoExists=gus.stream().filter(i->!(gusDb.stream().filter(k->k.getGroupId().equals(i.getGroupId())&&k.getUserid().equals(i.getUserid()))).findAny().isPresent()).collect(Collectors.toList()); + if(gusNoExists.size()==0){ + return Result.error("user-had-exists","成功添加0个组员。以下用户已在小组中,不用再添加。【"+gusDb.stream().map(i->i.getUsername()).collect(Collectors.joining(","))+"】"); + } + User user=LoginUtils.getCurrentUserInfo(); + XmGroupUser gu=gusNoExists.get(0); + String productId=gu.getProductId(); + String projectId=gu.getProjectId(); + String pgClass=gu.getPgClass(); + List gus2=new ArrayList<>(); + XmProduct xmProduct=null; + XmProject xmProject=null; + if("1".equals(pgClass)){ + xmProduct=this.xmProductService.getProductFromCache(gu.getProductId()); + if(xmProduct==null){ + return Result.error("product-0","产品已不存在"); + } + gus2=gusNoExists.stream().filter(i->productId.equals(i.getProductId())).collect(Collectors.toList()); + if(gus2.size()projectId.equals(i.getProjectId())).collect(Collectors.toList()); + if(gus2.size() groupIds=gusNoExists.stream().map(i->i.getGroupId()).collect(Collectors.toSet()); + List canAddUsers=new ArrayList<>(); + Map> groupUsersMap=new HashMap<>(); + List noQx=new ArrayList<>(); + for (String groupId : groupIds) { + if("1".equals(pgClass)){ + boolean isPm=xmGroupService.checkUserIsProductAdm(xmProduct,user.getUserid()); + if(!isPm){ + XmGroupVo xmGroupVo=this.xmGroupService.getProductGroupFromCache(xmProduct.getId(),groupId); + if(xmGroupVo==null){ + continue; + } + boolean isHead=xmGroupService.checkUserIsTeamHeadOrAss(xmGroupVo,user.getUserid()); + if(isHead==false){ + continue; + } + } + }else { + boolean isPm=xmGroupService.checkUserIsProjectAdm(xmProject,user.getUserid()); + if(!isPm){ + XmGroupVo xmGroupVo=this.xmGroupService.getProjectGroupFromCache(xmProject.getId(),groupId); + if(xmGroupVo==null){ + continue; + } + boolean isHead=xmGroupService.checkUserIsTeamHeadOrAss(xmGroupVo,user.getUserid()); + if(isHead==false){ + continue; + } + } + } + List cdus=gus2.stream().filter(i->groupId.equals(i.getGroupId())).collect(Collectors.toList()); + canAddUsers.addAll(cdus); + groupUsersMap.put(groupId,cdus); + } + noQx=gus.stream().filter(i->!canAddUsers.stream().filter(k->k.getUserid().equals(i.getUserid()) && k.getGroupId().equals(i.getGroupId())).findAny().isPresent()).collect(Collectors.toList()); + List msg=new ArrayList<>(); + msg.add("成功新增"+canAddUsers.size()+"个小组用户."); + if(canAddUsers.size()>0){ + xmGroupUserService.batchInsert(canAddUsers); + } + if(noQx.size()>0){ + msg.add("不是项目经理、小组长,无权限操作以下"+noQx.size()+"个用户,【"+noQx.stream().map(i->i.getUsername()).collect(Collectors.joining(","))+"】"); + } + if(gusDb.size()>0){ + msg.add("以下"+gusDb.size()+"个小组用户已在组里,无需再添加。【"+gusDb.stream().map(i->i.getUsername()).collect(Collectors.joining(","))+"】"); + } + if(canAddUsers.size()!=0){ + return Result.ok(msg.stream().collect(Collectors.joining(" "))); + }else{ + return Result.error(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()); + pushMsgService.pushJoinChannelGroupMsg(user.getBranchId(),groupId, users); + if("0".equals(pgClass)){ + + xmGroupService.clearProjectGroup(projectId); + xmRecordService.addXmGroupRecord(projectId,groupId, "项目-团队-新增小组成员", "新增组员["+groupUsers.stream().map(i->i.getUsername()).collect(Collectors.joining(","))+"]",user.getUserid(),null); + }else{ + xmGroupService.clearProductGroup(productId); + xmRecordService.addXmGroupRecord(productId,groupId, "产品-团队-新增小组成员", "新增组员["+groupUsers.stream().map(i->i.getUsername()).collect(Collectors.joining(","))+"]",user.getUserid(),null); + } + }); + + + return Result.ok(); + + } + + + @ApiOperation( value = "根据主键列表批量删除xm_group_user信息",notes="batchDelXmProjectGroupUser,仅需要上传主键字段") + @ApiResponses({ + @ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}") + }) + @RequestMapping(value="/batchDel",method=RequestMethod.POST) + public Result batchDelXmProjectGroupUser(@RequestBody List gus) { + + if(gus==null || gus.size()==0){ + return Result.error("data-0","请上送要删除的小组成员"); + } + + + List gusDb=this.xmGroupUserService.selectListByIds(gus); + if(gusDb.size()==0){ + return Result.error("data-0","要删除的数据已不存在。"); + } + User user=LoginUtils.getCurrentUserInfo(); + XmGroupUser gu=gusDb.get(0); + String productId=gu.getProductId(); + String projectId=gu.getProjectId(); + String pgClass=gu.getPgClass(); + List gus2=new ArrayList<>(); + XmProduct xmProduct=null; + XmProject xmProject=null; + if("1".equals(pgClass)){ + xmProduct=this.xmProductService.getProductFromCache(gu.getProductId()); + if(xmProduct==null){ + return Result.error("product-0","产品已不存在"); + } + gus2=gusDb.stream().filter(i->productId.equals(i.getProductId())).collect(Collectors.toList()); + if(gus2.size()projectId.equals(i.getProjectId())).collect(Collectors.toList()); + if(gus2.size() groupIds=gusDb.stream().map(i->i.getGroupId()).collect(Collectors.toSet()); + List canDelUsers=new ArrayList<>(); + Map> groupUsersMap=new HashMap<>(); + for (String groupId : groupIds) { + if("1".equals(pgClass)){ + boolean isPm=xmGroupService.checkUserIsProductAdm(xmProduct,user.getUserid()); + if(!isPm){ + XmGroupVo xmGroupVo=this.xmGroupService.getProductGroupFromCache(xmProduct.getId(),groupId); + if(xmGroupVo==null){ + continue; + } + boolean isHead=xmGroupService.checkUserIsTeamHeadOrAss(xmGroupVo,user.getUserid()); + if(isHead==false){ + continue; + } + } + }else { + boolean isPm=xmGroupService.checkUserIsProjectAdm(xmProject,user.getUserid()); + if(!isPm){ + XmGroupVo xmGroupVo=this.xmGroupService.getProjectGroupFromCache(xmProject.getId(),groupId); + if(xmGroupVo==null){ + continue; + } + boolean isHead=xmGroupService.checkUserIsTeamHeadOrAss(xmGroupVo,user.getUserid()); + if(isHead==false){ + continue; + } + } + } + List cdus=gus2.stream().filter(i->groupId.equals(i.getGroupId())).collect(Collectors.toList()); + canDelUsers.addAll(cdus); + groupUsersMap.put(groupId,cdus); + } + List msg=new ArrayList<>(); + msg.add("成功删除"+canDelUsers.size()+"个小组用户."); + if(canDelUsers.size()>0){ + xmGroupUserService.doBatchDelete(canDelUsers); + } + List noDelUsers=new ArrayList<>(); + if(canDelUsers.size()i.getUserid().equals(gu0.getUserid())&&i.getGroupId().equals(gu0.getGroupId())).findAny().isPresent()){ + noDelUsers.add(gu0.getUsername()); + } + } + msg.add("以下"+noDelUsers.size()+"个小组用户无权限删除。【"+noDelUsers.stream().collect(Collectors.toSet()).stream().collect(Collectors.joining(","))+"】"); + } + if(canDelUsers.size()!=0){ + return Result.ok(msg.stream().collect(Collectors.joining(" "))); + }else{ + return Result.error(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()); + pushMsgService.pushLeaveChannelGroupMsg(user.getBranchId(),groupId, users); + if("0".equals(pgClass)){ + + xmGroupService.clearProjectGroup(projectId); + xmRecordService.addXmGroupRecord(projectId,groupId, "项目-团队-删除小组成员", "删除组员["+groupUsers.stream().map(i->i.getUsername()).collect(Collectors.joining(","))+"]",user.getUserid(),null); + }else{ + xmGroupService.clearProductGroup(productId); + xmRecordService.addXmGroupRecord(productId,groupId, "产品-团队-删除小组成员", "删除组员["+groupUsers.stream().map(i->i.getUsername()).collect(Collectors.joining(","))+"]",user.getUserid(),null); + } + }); + + + return Result.ok("query-ok","查询成功").setData(datas).setTotal(page.getTotal()); + + } +} diff --git a/xm-core/src/main/java/com/xm/core/entity/XmGroup.java b/xm-core/src/main/java/com/xm/core/entity/XmGroup.java new file mode 100644 index 00000000..6fd83b02 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/entity/XmGroup.java @@ -0,0 +1,141 @@ +package com.xm.core.entity; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.mdp.core.dao.annotation.TableIds; +import com.baomidou.mybatisplus.annotation.TableName; +import org.apache.ibatis.type.Alias; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; + +/** + * @author code-gen + * @since 2023-11-10 + */ +@Data +@TableName("xm_group") +@ApiModel(description="团队表") +public class XmGroup implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + @TableId(type = IdType.ASSIGN_ID) + + @ApiModelProperty(notes="主键,主键",allowEmptyValue=true,example="",allowableValues="") + String id; + + + @ApiModelProperty(notes="团队名称",allowEmptyValue=true,example="",allowableValues="") + String groupName; + + + @ApiModelProperty(notes="项目编号-属于产品线则可为空",allowEmptyValue=true,example="",allowableValues="") + String projectId; + + + @ApiModelProperty(notes="项目团队类型编号",allowEmptyValue=true,example="",allowableValues="") + String pgTypeId; + + + @ApiModelProperty(notes="团队类型名称",allowEmptyValue=true,example="",allowableValues="") + String pgTypeName; + + + @ApiModelProperty(notes="团队负责人",allowEmptyValue=true,example="",allowableValues="") + String leaderUserid; + + + @ApiModelProperty(notes="负责人姓名",allowEmptyValue=true,example="",allowableValues="") + String leaderUsername; + + + @ApiModelProperty(notes="创建时间",allowEmptyValue=true,example="",allowableValues="") + Date ctime; + + + @ApiModelProperty(notes="更新时间",allowEmptyValue=true,example="",allowableValues="") + Date ltime; + + + @ApiModelProperty(notes="产品编号,属于项目组的团队则可为空",allowEmptyValue=true,example="",allowableValues="") + String productId; + + + @ApiModelProperty(notes="归属机构编号",allowEmptyValue=true,example="",allowableValues="") + String branchId; + + + @ApiModelProperty(notes="团队类别0-项目小组,1-产品小组,2-团队;团队下挂项目团队或者产品团队。产品团队下只能挂产品团队,项目团队下只能挂项目团队",allowEmptyValue=true,example="",allowableValues="") + String pgClass; + + + @ApiModelProperty(notes="上级团队编号",allowEmptyValue=true,example="",allowableValues="") + String pgroupId; + + + @ApiModelProperty(notes="级别0级1级2级3级4级",allowEmptyValue=true,example="",allowableValues="") + Integer lvl; + + + @ApiModelProperty(notes="上级编号路径逗号分割,0,开始,本组编号+逗号结束",allowEmptyValue=true,example="",allowableValues="") + String pidPaths; + + + @ApiModelProperty(notes="是否为模板",allowEmptyValue=true,example="",allowableValues="") + String isTpl; + + + @ApiModelProperty(notes="副组长编号",allowEmptyValue=true,example="",allowableValues="") + String assUserid; + + + @ApiModelProperty(notes="副组长姓名",allowEmptyValue=true,example="",allowableValues="") + String assUsername; + + + @ApiModelProperty(notes="下级团队数量",allowEmptyValue=true,example="",allowableValues="") + Integer childrenCnt; + + + @ApiModelProperty(notes="组员数量",allowEmptyValue=true,example="",allowableValues="") + Integer userCnt; + + + @ApiModelProperty(notes="权限码",allowEmptyValue=true,example="",allowableValues="") + String qxCode; + + + @ApiModelProperty(notes="是否计算工作量0否1是",allowEmptyValue=true,example="",allowableValues="") + String calcWorkload; + + + @ApiModelProperty(notes="节点类型0管理团队、1执行团队",allowEmptyValue=true,example="",allowableValues="") + String ntype; + + + @ApiModelProperty(notes="协作公司编号",allowEmptyValue=true,example="",allowableValues="") + String crowBranchId; + + + @ApiModelProperty(notes="协作公司名称",allowEmptyValue=true,example="",allowableValues="") + String crowBranchName; + + + @ApiModelProperty(notes="是否众包团队",allowEmptyValue=true,example="",allowableValues="") + String isCrow; + + /** + *主键 + **/ + public XmGroup(String id) { + this.id = id; + } + + /** + * 团队表 + **/ + public XmGroup() { + } + +} \ No newline at end of file diff --git a/xm-core/src/main/java/com/xm/core/entity/XmGroupState.java b/xm-core/src/main/java/com/xm/core/entity/XmGroupState.java new file mode 100644 index 00000000..2fb57222 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/entity/XmGroupState.java @@ -0,0 +1,178 @@ +package com.xm.core.entity; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.mdp.core.dao.annotation.TableIds; +import com.baomidou.mybatisplus.annotation.TableName; +import org.apache.ibatis.type.Alias; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import java.math.BigDecimal; + +/** + * @author code-gen + * @since 2023-11-10 + */ +@Data +@TableName("xm_group_state") +@ApiModel(description="团队状态表,无需前端维护,所有数据由汇总统计得出") +public class XmGroupState implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + @TableId(type = IdType.ASSIGN_ID) + + @ApiModelProperty(notes="团队编号,主键",allowEmptyValue=true,example="",allowableValues="") + String groupId; + + + @ApiModelProperty(notes="开始时间",allowEmptyValue=true,example="",allowableValues="") + Date planStartTime; + + + @ApiModelProperty(notes="结束时间",allowEmptyValue=true,example="",allowableValues="") + Date planEndTime; + + + @ApiModelProperty(notes="实际开始时间",allowEmptyValue=true,example="",allowableValues="") + Date actStartTime; + + + @ApiModelProperty(notes="实际结束时间",allowEmptyValue=true,example="",allowableValues="") + Date actEndTime; + + + @ApiModelProperty(notes="计划工作量,根据关联任务汇总",allowEmptyValue=true,example="",allowableValues="") + BigDecimal planWorkload; + + + @ApiModelProperty(notes="实际工作量,根据关联任务汇总",allowEmptyValue=true,example="",allowableValues="") + BigDecimal actWorkload; + + + @ApiModelProperty(notes="计划成本,根据关联任务汇总",allowEmptyValue=true,example="",allowableValues="") + BigDecimal planCostAmount; + + + @ApiModelProperty(notes="实际成本金额根据关联任务汇总",allowEmptyValue=true,example="",allowableValues="") + BigDecimal actCostAmount; + + + @ApiModelProperty(notes="总体完成比例0-100之间,根据taskType进行汇总",allowEmptyValue=true,example="",allowableValues="") + BigDecimal finishRate; + + + @ApiModelProperty(notes="需求完成率0-100之间,根据taskType进行汇总",allowEmptyValue=true,example="",allowableValues="") + BigDecimal demandRate; + + + @ApiModelProperty(notes="设计完成率0-100之间,根据taskType进行汇总",allowEmptyValue=true,example="",allowableValues="") + BigDecimal designRate; + + + @ApiModelProperty(notes="开发完成率0-100之间,根据taskType进行汇总",allowEmptyValue=true,example="",allowableValues="") + BigDecimal devRate; + + + @ApiModelProperty(notes="uat测试完成率0-100之间,根据taskType进行汇总",allowEmptyValue=true,example="",allowableValues="") + BigDecimal uatRate; + + + @ApiModelProperty(notes="sit测试完成率0-100之间,根据taskType进行汇总",allowEmptyValue=true,example="",allowableValues="") + BigDecimal sitRate; + + + @ApiModelProperty(notes="创建时间",allowEmptyValue=true,example="",allowableValues="") + Date ctime; + + + @ApiModelProperty(notes="汇总时间",allowEmptyValue=true,example="",allowableValues="") + Date calcTime; + + + @ApiModelProperty(notes="工时数",allowEmptyValue=true,example="",allowableValues="") + BigDecimal planWorkhours; + + + @ApiModelProperty(notes="总人数",allowEmptyValue=true,example="",allowableValues="") + BigDecimal planWorkerCnt; + + + @ApiModelProperty(notes="总关闭bugs",allowEmptyValue=true,example="",allowableValues="") + Integer closedBugs; + + + @ApiModelProperty(notes="激活bugs",allowEmptyValue=true,example="",allowableValues="") + Integer activeBugs; + + + @ApiModelProperty(notes="已确认bugs总数",allowEmptyValue=true,example="",allowableValues="") + Integer confirmedBugs; + + + @ApiModelProperty(notes="已解决bugs总数",allowEmptyValue=true,example="",allowableValues="") + Integer resolvedBugs; + + + @ApiModelProperty(notes="测试案例总数",allowEmptyValue=true,example="",allowableValues="") + Integer testCases; + + + @ApiModelProperty(notes="测试中案例总数",allowEmptyValue=true,example="",allowableValues="") + Integer execCases; + + + @ApiModelProperty(notes="设计中案例总数",allowEmptyValue=true,example="",allowableValues="") + Integer designCases; + + + @ApiModelProperty(notes="完成案例总数",allowEmptyValue=true,example="",allowableValues="") + Integer finishCases; + + + @ApiModelProperty(notes="关联迭代数",allowEmptyValue=true,example="",allowableValues="") + Integer iterationCnt; + + + @ApiModelProperty(notes="任务数",allowEmptyValue=true,example="",allowableValues="") + Integer taskCnt; + + + @ApiModelProperty(notes="完成的任务数",allowEmptyValue=true,example="",allowableValues="") + Integer finishTaskCnt; + + + @ApiModelProperty(notes="业务日期yyyy-MM-dd字符串",allowEmptyValue=true,example="",allowableValues="") + String bizDate; + + + @ApiModelProperty(notes="bug总数",allowEmptyValue=true,example="",allowableValues="") + Integer bugCnt; + + + @ApiModelProperty(notes="项目编号",allowEmptyValue=true,example="",allowableValues="") + String projectId; + + + @ApiModelProperty(notes="项目名称",allowEmptyValue=true,example="",allowableValues="") + String projectName; + + + @ApiModelProperty(notes="团队名称",allowEmptyValue=true,example="",allowableValues="") + String groupName; + + /** + *团队编号 + **/ + public XmGroupState(String groupId) { + this.groupId = groupId; + } + + /** + * 团队状态表,无需前端维护,所有数据由汇总统计得出 + **/ + public XmGroupState() { + } + +} \ No newline at end of file diff --git a/xm-core/src/main/java/com/xm/core/entity/XmGroupUser.java b/xm-core/src/main/java/com/xm/core/entity/XmGroupUser.java new file mode 100644 index 00000000..619868ba --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/entity/XmGroupUser.java @@ -0,0 +1,90 @@ +package com.xm.core.entity; +import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.mdp.core.dao.annotation.TableIds; +import com.baomidou.mybatisplus.annotation.TableName; +import org.apache.ibatis.type.Alias; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; + +/** + * @author code-gen + * @since 2023-11-10 + */ +@Data +@TableName("xm_group_user") +@ApiModel(description="团队成员表") +public class XmGroupUser implements java.io.Serializable { + + private static final long serialVersionUID = 1L; + @TableIds + + @ApiModelProperty(notes="团队编号,主键",allowEmptyValue=true,example="",allowableValues="") + String groupId; + @TableIds + + @ApiModelProperty(notes="团队成员编号,主键",allowEmptyValue=true,example="",allowableValues="") + String userid; + + + @ApiModelProperty(notes="加入时间",allowEmptyValue=true,example="",allowableValues="") + Date joinTime; + + + @ApiModelProperty(notes="团队成员",allowEmptyValue=true,example="",allowableValues="") + String username; + + + @ApiModelProperty(notes="离队时间",allowEmptyValue=true,example="",allowableValues="") + Date outTime; + + + @ApiModelProperty(notes="当前状态0参与中1已退出团队",allowEmptyValue=true,example="",allowableValues="") + String status; + + + @ApiModelProperty(notes="组员原归属机构编号",allowEmptyValue=true,example="",allowableValues="") + String obranchId; + + + @ApiModelProperty(notes="是否私人加入0否1是",allowEmptyValue=true,example="",allowableValues="") + String isPri; + + + @ApiModelProperty(notes="排序号--从1开始",allowEmptyValue=true,example="",allowableValues="") + Integer seqNo; + + + @ApiModelProperty(notes="项目编号",allowEmptyValue=true,example="",allowableValues="") + String projectId; + + + @ApiModelProperty(notes="产品编号",allowEmptyValue=true,example="",allowableValues="") + String productId; + + + @ApiModelProperty(notes="0-项目小组,1-产品小组,2-团队",allowEmptyValue=true,example="",allowableValues="") + String pgClass; + + + @ApiModelProperty(notes="原归属机构名称",allowEmptyValue=true,example="",allowableValues="") + String obranchName; + + /** + *团队编号,团队成员编号 + **/ + public XmGroupUser(String groupId,String userid) { + this.groupId = groupId; + this.userid = userid; + } + + /** + * 团队成员表 + **/ + public XmGroupUser() { + } + +} \ No newline at end of file diff --git a/xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.java b/xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.java new file mode 100644 index 00000000..b1707f67 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.java @@ -0,0 +1,28 @@ +package com.xm.core.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +import com.xm.core.entity.XmGroup; +/** + * @author maimeng-mdp code-gen + * @since 2023-11-10 + */ +public interface XmGroupMapper extends BaseMapper { + + /** + * 自定义查询,支持多表关联 + * @param page 分页条件 + * @param ew 一定要,并且必须加@Param("ew")注解 + * @param ext 如果xml中需要根据某些值进行特殊处理,可以通过这个进行传递,非必须,注解也可以不加 + * @return + */ + List> selectListMapByWhere(IPage page, @Param("ew") QueryWrapper ew,@Param("ext") Map ext); + +} + diff --git a/xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.xml b/xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.xml new file mode 100644 index 00000000..00556181 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.java b/xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.java new file mode 100644 index 00000000..810e42c8 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.java @@ -0,0 +1,28 @@ +package com.xm.core.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.xm.core.entity.XmGroupState; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; +/** + * @author maimeng-mdp code-gen + * @since 2023-11-10 + */ +public interface XmGroupStateMapper extends BaseMapper { + + /** + * 自定义查询,支持多表关联 + * @param page 分页条件 + * @param ew 一定要,并且必须加@Param("ew")注解 + * @param ext 如果xml中需要根据某些值进行特殊处理,可以通过这个进行传递,非必须,注解也可以不加 + * @return + */ + List> selectListMapByWhere(IPage page, @Param("ew") QueryWrapper ew,@Param("ext") Map ext); + + int loadTasksToXmProjectGroupState(String projectId); +} + diff --git a/xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.xml b/xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.xml new file mode 100644 index 00000000..3d98147f --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.java b/xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.java new file mode 100644 index 00000000..107b614c --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.java @@ -0,0 +1,30 @@ +package com.xm.core.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.xm.core.entity.XmGroupUser; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; +/** + * @author maimeng-mdp code-gen + * @since 2023-11-10 + */ +public interface XmGroupUserMapper extends BaseMapper { + + /** + * 自定义查询,支持多表关联 + * @param page 分页条件 + * @param ew 一定要,并且必须加@Param("ew")注解 + * @param ext 如果xml中需要根据某些值进行特殊处理,可以通过这个进行传递,非必须,注解也可以不加 + * @return + */ + List> selectListMapByWhere(IPage page, @Param("ew") QueryWrapper ew,@Param("ext") Map ext); + + List selectGroupUserListByProjectId(String projectId); + + List selectGroupUserListByProductId(String productId); +} + diff --git a/xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.xml b/xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.xml new file mode 100644 index 00000000..6c3a92fc --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file 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 4d87a253..65a64fa3 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 @@ -1,10 +1,13 @@ package com.xm.core.service; 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.xm.core.mapper.XmGroupMapper; import com.xm.core.service.client.SysClient; import com.xm.core.service.push.XmPushMsgService; import org.springframework.beans.factory.annotation.Autowired; @@ -21,7 +24,7 @@ import java.util.Map; * 实体 XmProjectGroup 表 XM.xm_group 当前主键(包括多主键): id; ***/ @Service("xm.core.xmGroupService") -public class XmGroupService { +public class XmGroupService extends BaseService { @Autowired diff --git a/xm-core/src/main/java/com/xm/core/service/XmGroupStateService.java b/xm-core/src/main/java/com/xm/core/service/XmGroupStateService.java new file mode 100644 index 00000000..2d409766 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/service/XmGroupStateService.java @@ -0,0 +1,36 @@ +package com.xm.core.service; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mdp.core.service.BaseService; +import com.xm.core.entity.XmBranchStateHis; +import com.xm.core.entity.XmGroupState; +import com.xm.core.mapper.XmGroupStateMapper; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.
+ * 组织 com.qqkj 顶级模块 xm 大模块 core 小模块
+ * 实体 XmProjectGroupState 表 XM.xm_group_state 当前主键(包括多主键): id; + ***/ +@Service("xm.core.xmGroupStateService") +public class XmGroupStateService extends BaseService { + + /** + * 计算bug、task、测试案例、等数据 + * @param projectId + * @return + */ + public int loadTasksToXmProjectGroupState(String projectId) { + + return baseMapper.loadTasksToXmProjectGroupState( projectId); + } + + public List> selectListMapByWhere(IPage page, QueryWrapper qw, Map ext) { + return baseMapper.selectListMapByWhere(page,qw,ext); + } +} + diff --git a/xm-core/src/main/java/com/xm/core/service/XmGroupUserService.java b/xm-core/src/main/java/com/xm/core/service/XmGroupUserService.java new file mode 100644 index 00000000..ef47de09 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/service/XmGroupUserService.java @@ -0,0 +1,38 @@ +package com.xm.core.service; + +import com.mdp.core.service.BaseService; +import com.xm.core.entity.XmGroupUser; +import com.xm.core.mapper.XmGroupUserMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +/** + * 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.
+ * 组织 com.qqkj 顶级模块 oa 大模块 xm 小模块
+ * 实体 XmProjectGroupUser 表 XM.xm_group_user 当前主键(包括多主键): id; + ***/ +@Service("xm.core.xmGroupUserService") +public class XmGroupUserService extends BaseService { + + + @Autowired + XmRecordService xmRecordService; + + public List selectGroupUserListByProjectId(String projectId) { + return baseMapper.selectGroupUserListByProjectId( projectId); + } + + public List selectGroupUserListByProductId(String productId) { + return baseMapper.selectGroupUserListByProductId( productId); + } + + + public void doBatchDelete(List canDelUsers) { + super.batchDelete(canDelUsers); + } + + /** 请在此类添加自定义函数 */ + +} + diff --git a/xm-core/src/main/java/com/xm/core/service/cache/XmGroupCacheService.java b/xm-core/src/main/java/com/xm/core/service/cache/XmGroupCacheService.java new file mode 100644 index 00000000..736619a8 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/service/cache/XmGroupCacheService.java @@ -0,0 +1,197 @@ +package com.xm.core.service.cache; + +import com.mdp.mq.sp.Publish; +import com.xm.core.vo.XmGroupVo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.Calendar; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +@Service +public class XmGroupCacheService { + + @Autowired + RedisTemplate redisTemplate; + + Map> prjCache =new ConcurrentHashMap<>(); + Map> prdCache =new ConcurrentHashMap<>(); + + @Autowired + Publish publish; + + String currPrdDateKey=""; + public String getProductKey(String productId){ + Calendar currCal=Calendar.getInstance(); + String dateKey=currCal.get(Calendar.YEAR)+"-"+currCal.get(Calendar.DAY_OF_YEAR)+"_prd"; + String finalKey=this.getCacheKey()+":"+dateKey+":"+productId; + if(dateKey.equals(currPrdDateKey)){ + return finalKey; + }else { + currPrdDateKey=dateKey; + this.redisTemplate.expire(finalKey,24,TimeUnit.HOURS); + return finalKey; + } + } + String currPrjDateKey=""; + public String getProjectKey(String projectId){ + Calendar currCal=Calendar.getInstance(); + String dateKey=currCal.get(Calendar.YEAR)+"-"+currCal.get(Calendar.DAY_OF_YEAR)+"_prj"; + String finalKey=this.getCacheKey()+":"+dateKey+":"+projectId; + if(dateKey.equals(currPrjDateKey)){ + return finalKey; + }else { + currPrjDateKey=dateKey; + this.redisTemplate.expire(finalKey,24,TimeUnit.HOURS); + return finalKey; + } + } + String getCacheKey() { + return "xm_group"; + } + + public List getProjectGroups(String projectId){ + String key=this.getProjectKey(projectId); + List groupVoList=this.prjCache.get(key); + if(groupVoList==null){ + groupVoList= (List) redisTemplate.opsForHash().values(key); + if(groupVoList!=null){ + this.prjCache.put(key,groupVoList); + } + return groupVoList; + }else { + return groupVoList; + } + + + } + public XmGroupVo getProjectGroup(String projectId, String groupId){ + String key=this.getProjectKey(projectId); + return (XmGroupVo) redisTemplate.opsForHash().get(key,groupId); + } + public void putProjectGroup(XmGroupVo group){ + String key=this.getProjectKey(group.getProjectId()); + redisTemplate.opsForHash().put(key, group.getId(), group); + } + + /** + * + * @param projectId + */ + public void clearProjectGroup(String projectId){ + String key=this.getProjectKey(projectId); + this.clearProjectGroups(projectId); + } + public void putProjectGroups(String projectId,List groups){ + + String key=this.getProjectKey(projectId); + if(groups==null || groups.size()==0){ + this.clearProjectGroups(projectId); + return; + } + for (XmGroupVo group : groups) { + String hashKey= group.getId(); + redisTemplate.opsForHash().put(key, hashKey, group); + } + if(groups==null){ + this.prjCache.remove(key); + }else{ + this.prjCache.put(key,groups); + } + publish.push("XM_GROUP_PRJ_CACHE",projectId); + } + public void clearProjectGroups(String projectId){ + String key=this.getProjectKey(projectId); + Set keySet=redisTemplate.opsForHash().keys(key); + if(keySet!=null && keySet.size()>0){ + redisTemplate.opsForHash().delete(key,keySet.toArray()); + } + this.prjCache.remove(key); + publish.push("XM_GROUP_PRJ_CACHE",projectId); + } + + public List getProductGroups(String productId){ + String key=this.getProductKey(productId); + List groupVoList=this.prdCache.get(key); + if(groupVoList==null){ + + groupVoList= (List) redisTemplate.opsForHash().values(key); + if(groupVoList!=null){ + this.prdCache.put(key,groupVoList); + } + return groupVoList; + }else { + return groupVoList; + } + } + public XmGroupVo getProductGroup(String productId, String groupId){ + String key=this.getProductKey(productId); + return (XmGroupVo) redisTemplate.opsForHash().get(key,groupId); + } + public void putProductGroup(XmGroupVo group){ + String key=this.getProductKey(group.getProductId()); + redisTemplate.opsForHash().put(key, group.getId(), group); + } + public void clearProductGroup(String productId){ + String key=this.getProductKey(productId); + this.clearProductGroups(productId); + } + public void putProductGroups(String productId,List groups){ + String key=this.getProductKey(productId); + if(groups==null || groups.size()==0){ + this.clearProductGroups(productId); + return; + } + for (XmGroupVo group : groups) { + String hashKey= group.getId(); + redisTemplate.opsForHash().put(key, hashKey, group); + } + if(groups==null){ + this.prdCache.remove(key); + }else{ + this.prdCache.put(key,groups); + } + publish.push("XM_GROUP_PRD_CACHE",productId); + } + public void clearProductGroups(String productId){ + String key=this.getProductKey(productId); + Set keySet=redisTemplate.opsForHash().keys(key); + if(keySet!=null && keySet.size()>0){ + redisTemplate.opsForHash().delete(key,keySet.toArray()); + } + this.prdCache.remove(key); + publish.push("XM_GROUP_PRD_CACHE",productId); + } + + public void clearLocalPrjectCache(String projectId) { + this.prjCache.remove(getProjectKey(projectId)); + } + + public void clearLocalProductCache(String productId) { + this.prdCache.remove(getProductKey(productId)); + } + + /*每30分钟清除一次过期的本地缓存*/ + @Scheduled(cron = "* */30 * * * *") + public void timer() { + String currPrdKey=this.getCacheKey()+":"+currPrdDateKey+":"; + + String currPrjKey=this.getCacheKey()+":"+currPrjDateKey+":"; + for (String key : this.prdCache.keySet()) { + if(!key.startsWith(currPrdKey)){ + this.prdCache.remove(key); + } + } + for (String key : this.prjCache.keySet()) { + if(!key.startsWith(currPrjKey)){ + this.prjCache.remove(key); + } + } + } +} diff --git a/xm-core/src/main/java/com/xm/core/vo/XmGroupVo.java b/xm-core/src/main/java/com/xm/core/vo/XmGroupVo.java new file mode 100644 index 00000000..72c9f222 --- /dev/null +++ b/xm-core/src/main/java/com/xm/core/vo/XmGroupVo.java @@ -0,0 +1,16 @@ +package com.xm.core.vo; + +import com.xm.core.entity.XmGroup; +import com.xm.core.entity.XmGroupUser; +import io.swagger.annotations.ApiModel; + +import java.util.List; + +@ApiModel(description="xm_group") +public class XmGroupVo extends XmGroup { + List groupUsers; + + public List getGroupUsers() { return groupUsers; } + + public void setGroupUsers(List groupUsers) { this.groupUsers = groupUsers; } +} \ No newline at end of file