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