陈裕财 2 years ago
parent
commit
e4024041b8
  1. 462
      xm-core/src/main/java/com/xm/core/ctrl/XmGroupController.java
  2. 150
      xm-core/src/main/java/com/xm/core/ctrl/XmGroupStateController.java
  3. 598
      xm-core/src/main/java/com/xm/core/ctrl/XmGroupUserController.java
  4. 141
      xm-core/src/main/java/com/xm/core/entity/XmGroup.java
  5. 178
      xm-core/src/main/java/com/xm/core/entity/XmGroupState.java
  6. 90
      xm-core/src/main/java/com/xm/core/entity/XmGroupUser.java
  7. 28
      xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.java
  8. 17
      xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.xml
  9. 28
      xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.java
  10. 17
      xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.xml
  11. 30
      xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.java
  12. 17
      xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.xml
  13. 5
      xm-core/src/main/java/com/xm/core/service/XmGroupService.java
  14. 36
      xm-core/src/main/java/com/xm/core/service/XmGroupStateService.java
  15. 38
      xm-core/src/main/java/com/xm/core/service/XmGroupUserService.java
  16. 197
      xm-core/src/main/java/com/xm/core/service/cache/XmGroupCacheService.java
  17. 16
      xm-core/src/main/java/com/xm/core/vo/XmGroupVo.java

462
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分别为:<br>
* 新增: xm/xmGroup/add <br>
* 查询: xm/xmGroup/list<br>
* 模糊查询: xm/xmGroup/listKey<br>
* 修改: xm/xmGroup/edit <br>
* 删除: xm/xmGroup/del<br>
* 批量删除: xm/xmGroup/batchDel<br>
* 组织 com.qqkj 顶级模块 oa 大模块 xm 小模块 <br>
* 实体 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<String,Object> params) {
RequestUtils.transformArray(params, "ids");
IPage page=QueryTools.initPage(params);
List<XmGroupVo> 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<String,Object> 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<XmBranchStateHis> qw = QueryTools.initQueryWrapper(XmBranchStateHis.class , params);
List<Map<String,Object>> 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<XmGroup> xmGroups) {
List<XmGroup> 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<XmGroup> hasChildNodes=new ArrayList<>();
List<XmGroup> noQxs=new ArrayList<>();
List<XmGroup> canDelNodes=new ArrayList<>();
id=groupDb.getProjectId();
XmProject prject=this.xmProjectService.getProjectFromCache(id);
Map<String,String> 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());
}
*/
}

150
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分别为:<br>
* 新增: core/xmGroupState/add <br>
* 查询: core/xmGroupState/list<br>
* 模糊查询: core/xmGroupState/listKey<br>
* 修改: core/xmGroupState/edit <br>
* 删除: core/xmGroupState/del<br>
* 批量删除: core/xmGroupState/batchDel<br>
* 组织 com.qqkj 顶级模块 xm 大模块 core 小模块 <br>
* 实体 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<String,Object> params){
RequestUtils.transformArray(params, "ids");
IPage page= QueryTools.initPage(params);
QueryWrapper<XmBranchStateHis> qw = QueryTools.initQueryWrapper(XmBranchStateHis.class , params);
List<Map<String,Object>> 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<String,Object> 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<XmProjectGroupState> xmGroupStates) {
xmGroupStateService.batchDelete(xmGroupStates);
return Result.ok();
}
*/
}

598
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分别为:<br>
* 新增: core/xmGroupUser/add <br>
* 查询: core/xmGroupUser/list<br>
* 模糊查询: core/xmGroupUser/listKey<br>
* 修改: core/xmGroupUser/edit <br>
* 删除: core/xmGroupUser/del<br>
* 批量删除: core/xmGroupUser/batchDel<br>
* 组织 com.qqkj 顶级模块 xm 大模块 core 小模块 <br>
* 实体 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<String,Object> params){
RequestUtils.transformArray(params, "ids");
IPage page= QueryTools.initPage(params);
User user=LoginUtils.getCurrentUserInfo();
params.put("branchId",user.getBranchId());
QueryWrapper<XmBranchStateHis> qw = QueryTools.initQueryWrapper(XmBranchStateHis.class , params);
List<Map<String,Object>> 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<String,Object> usermap=new HashMap<>();
usermap.put("userid", gu.getUserid());
usermap.put("username", gu.getUsername());
List<Map<String,Object>> 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<String,Object> usermap=new HashMap<>();
usermap.put("userid", gu.getUserid());
usermap.put("username", gu.getUsername());
List<Map<String,Object>> 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<XmGroupUser> 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<XmGroupUser> gusDb=this.xmGroupUserService.selectListByIds(gus);
//过滤掉已经存在的
List<XmGroupUser> 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<XmGroupUser> 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()<gusNoExists.size()){
return Result.error("data-0","批量新增只能新增同一个产品的成员。");
}
}else {
xmProject=this.xmProjectService.getProjectFromCache(gu.getProjectId());
if(xmProject==null){
return Result.error("project-0","项目已不存在");
}
gus2=gusNoExists.stream().filter(i->projectId.equals(i.getProjectId())).collect(Collectors.toList());
if(gus2.size()<gusNoExists.size()){
return Result.error("data-0","批量新增只能新增同一个项目的成员。");
}
}
Set<String> groupIds=gusNoExists.stream().map(i->i.getGroupId()).collect(Collectors.toSet());
List<XmGroupUser> canAddUsers=new ArrayList<>();
Map<String,List<XmGroupUser>> groupUsersMap=new HashMap<>();
List<XmGroupUser> 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<XmGroupUser> 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<String> 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<Map<String,Object>> 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<XmGroupUser> gus) {
if(gus==null || gus.size()==0){
return Result.error("data-0","请上送要删除的小组成员");
}
List<XmGroupUser> 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<XmGroupUser> 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()<gusDb.size()){
return Result.error("data-0","批量删除只能删除同一个产品的成员。");
}
}else {
xmProject=this.xmProjectService.getProjectFromCache(gu.getProjectId());
if(xmProject==null){
return Result.error("project-0","项目已不存在");
}
gus2=gusDb.stream().filter(i->projectId.equals(i.getProjectId())).collect(Collectors.toList());
if(gus2.size()<gusDb.size()){
return Result.error("data-0","批量删除只能删除同一个项目的成员。");
}
}
Set<String> groupIds=gusDb.stream().map(i->i.getGroupId()).collect(Collectors.toSet());
List<XmGroupUser> canDelUsers=new ArrayList<>();
Map<String,List<XmGroupUser>> 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<XmGroupUser> cdus=gus2.stream().filter(i->groupId.equals(i.getGroupId())).collect(Collectors.toList());
canDelUsers.addAll(cdus);
groupUsersMap.put(groupId,cdus);
}
List<String> msg=new ArrayList<>();
msg.add("成功删除"+canDelUsers.size()+"个小组用户.");
if(canDelUsers.size()>0){
xmGroupUserService.doBatchDelete(canDelUsers);
}
List<String> noDelUsers=new ArrayList<>();
if(canDelUsers.size()<gus.size()){
for (XmGroupUser gu0 : gus) {
if(!canDelUsers.stream().filter(i->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<Map<String,Object>> 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());
}
}

141
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() {
}
}

178
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() {
}
}

90
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() {
}
}

28
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<XmGroup> {
/**
* 自定义查询支持多表关联
* @param page 分页条件
* @param ew 一定要并且必须加@Param("ew")注解
* @param ext 如果xml中需要根据某些值进行特殊处理可以通过这个进行传递非必须注解也可以不加
* @return
*/
List<Map<String,Object>> selectListMapByWhere(IPage page, @Param("ew") QueryWrapper ew,@Param("ext") Map<String,Object> ext);
}

17
xm-core/src/main/java/com/xm/core/mapper/XmGroupMapper.xml

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xm.core.mapper.XmGroupMapper">
<select id="selectListMapByWhere" resultType="HashMap">
select * from xm_group res
<where>
${@com.mdp.Util@trimWhere(ew.customSqlSegment)}
<!--下面可以添加更多查询条件,正常的if 条件都是支持的-->
</where>
<!--下面双引号内可以添加默认排序,如果前端没有上传排序,将使用引号内的排序规则-->
${@com.mdp.Util@trimOrderBy(ew.customSqlSegment,'')}
<!--下面双引号内可以添加默认分组,如果前端没有上传分组,将使用引号内的分组规则-->
${@com.mdp.Util@trimGroupBy(ew.customSqlSegment,'')}
</select>
</mapper>

28
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<XmGroupState> {
/**
* 自定义查询支持多表关联
* @param page 分页条件
* @param ew 一定要并且必须加@Param("ew")注解
* @param ext 如果xml中需要根据某些值进行特殊处理可以通过这个进行传递非必须注解也可以不加
* @return
*/
List<Map<String,Object>> selectListMapByWhere(IPage page, @Param("ew") QueryWrapper ew,@Param("ext") Map<String,Object> ext);
int loadTasksToXmProjectGroupState(String projectId);
}

17
xm-core/src/main/java/com/xm/core/mapper/XmGroupStateMapper.xml

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xm.core.mapper.XmGroupStateMapper">
<select id="selectListMapByWhere" resultType="HashMap">
select * from xm_group_state res
<where>
${@com.mdp.Util@trimWhere(ew.customSqlSegment)}
<!--下面可以添加更多查询条件,正常的if 条件都是支持的-->
</where>
<!--下面双引号内可以添加默认排序,如果前端没有上传排序,将使用引号内的排序规则-->
${@com.mdp.Util@trimOrderBy(ew.customSqlSegment,'')}
<!--下面双引号内可以添加默认分组,如果前端没有上传分组,将使用引号内的分组规则-->
${@com.mdp.Util@trimGroupBy(ew.customSqlSegment,'')}
</select>
</mapper>

30
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<XmGroupUser> {
/**
* 自定义查询支持多表关联
* @param page 分页条件
* @param ew 一定要并且必须加@Param("ew")注解
* @param ext 如果xml中需要根据某些值进行特殊处理可以通过这个进行传递非必须注解也可以不加
* @return
*/
List<Map<String,Object>> selectListMapByWhere(IPage page, @Param("ew") QueryWrapper ew,@Param("ext") Map<String,Object> ext);
List<XmGroupUser> selectGroupUserListByProjectId(String projectId);
List<XmGroupUser> selectGroupUserListByProductId(String productId);
}

17
xm-core/src/main/java/com/xm/core/mapper/XmGroupUserMapper.xml

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xm.core.mapper.XmGroupUserMapper">
<select id="selectListMapByWhere" resultType="HashMap">
select * from xm_group_user res
<where>
${@com.mdp.Util@trimWhere(ew.customSqlSegment)}
<!--下面可以添加更多查询条件,正常的if 条件都是支持的-->
</where>
<!--下面双引号内可以添加默认排序,如果前端没有上传排序,将使用引号内的排序规则-->
${@com.mdp.Util@trimOrderBy(ew.customSqlSegment,'')}
<!--下面双引号内可以添加默认分组,如果前端没有上传分组,将使用引号内的分组规则-->
${@com.mdp.Util@trimGroupBy(ew.customSqlSegment,'')}
</select>
</mapper>

5
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<XmGroupMapper, XmGroup> {
@Autowired

36
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;
/**
* 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.<br>
* 组织 com.qqkj 顶级模块 xm 大模块 core 小模块 <br>
* 实体 XmProjectGroupState XM.xm_group_state 当前主键(包括多主键): id;
***/
@Service("xm.core.xmGroupStateService")
public class XmGroupStateService extends BaseService<XmGroupStateMapper, XmGroupState> {
/**
* 计算bugtask测试案例等数据
* @param projectId
* @return
*/
public int loadTasksToXmProjectGroupState(String projectId) {
return baseMapper.loadTasksToXmProjectGroupState( projectId);
}
public List<Map<String, Object>> selectListMapByWhere(IPage page, QueryWrapper<XmBranchStateHis> qw, Map<String, Object> ext) {
return baseMapper.selectListMapByWhere(page,qw,ext);
}
}

38
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;
/**
* 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.<br>
* 组织 com.qqkj 顶级模块 oa 大模块 xm 小模块 <br>
* 实体 XmProjectGroupUser XM.xm_group_user 当前主键(包括多主键): id;
***/
@Service("xm.core.xmGroupUserService")
public class XmGroupUserService extends BaseService<XmGroupUserMapper,XmGroupUser> {
@Autowired
XmRecordService xmRecordService;
public List<XmGroupUser> selectGroupUserListByProjectId(String projectId) {
return baseMapper.selectGroupUserListByProjectId( projectId);
}
public List<XmGroupUser> selectGroupUserListByProductId(String productId) {
return baseMapper.selectGroupUserListByProductId( productId);
}
public void doBatchDelete(List<XmGroupUser> canDelUsers) {
super.batchDelete(canDelUsers);
}
/** 请在此类添加自定义函数 */
}

197
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<String, List<XmGroupVo>> prjCache =new ConcurrentHashMap<>();
Map<String, List<XmGroupVo>> 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<XmGroupVo> getProjectGroups(String projectId){
String key=this.getProjectKey(projectId);
List<XmGroupVo> groupVoList=this.prjCache.get(key);
if(groupVoList==null){
groupVoList= (List<XmGroupVo>) 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<XmGroupVo> 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<String> 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<XmGroupVo> getProductGroups(String productId){
String key=this.getProductKey(productId);
List<XmGroupVo> groupVoList=this.prdCache.get(key);
if(groupVoList==null){
groupVoList= (List<XmGroupVo>) 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<XmGroupVo> 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<String> 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);
}
}
}
}

16
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<XmGroupUser> groupUsers;
public List<XmGroupUser> getGroupUsers() { return groupUsers; }
public void setGroupUsers(List<XmGroupUser> groupUsers) { this.groupUsers = groupUsers; }
}
Loading…
Cancel
Save