diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmMenuController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmMenuController.java index 8b71eace..90c33322 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmMenuController.java +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmMenuController.java @@ -313,7 +313,7 @@ public class XmMenuController { XmMenu xmMenuParentDb=this.xmTaskService.selectOneObject(new XmMenu(xmMenuDb.getPmenuId())); if(xmMenuParentDb!=null){ if(!"1".equals(xmMenuParentDb.getNtype())){ - ResponseHelper.failed("pmenu-ntype-0","上级任务"+xmMenuParentDb.getMenuName()+"属于不是需求集,不能下挂需求集"); + ResponseHelper.failed("pmenu-ntype-0","上级需求"+xmMenuParentDb.getMenuName()+"不是需求集,不能下挂需求集"); } } } @@ -346,41 +346,29 @@ public class XmMenuController { Map m = new HashMap<>(); Tips tips=new Tips("成功删除"+xmMenus.size()+"条数据"); try{ - List hasTasksMenus=new ArrayList<>(); List hasChildMenus=new ArrayList<>(); List canDelList=new ArrayList<>(); - for (XmMenu xmMenu : xmMenus) { - XmMenu query=new XmMenu(); - query.setPmenuId(xmMenu.getMenuId()); - long childCount=xmMenuService.countByWhere(query); - if(childCount>0) { + List xmMenusDb=this.xmMenuService.selectListByIds(xmMenus.stream().map(i->i.getMenuId()).collect(Collectors.toList())); + for (XmMenu xmMenu : xmMenusDb) { + boolean canDel=this.xmMenuService.checkCanDelAllChild(xmMenu,xmMenusDb); + if(canDel){ + canDelList.add(xmMenu); + }else{ hasChildMenus.add(xmMenu.getMenuName()); - }else { - XmTask xmTask = new XmTask(); - xmTask.setMenuId(xmMenu.getMenuId()); - long taskCount=xmTaskService.countByWhere(xmTask); - if(taskCount>0) { - hasTasksMenus.add(xmMenu.getMenuName()); - }else { - canDelList.add(xmMenu); - } - - } } if(canDelList.size()>0) { xmMenuService.doBatchDelete(canDelList); } - String msg="成功删除"+canDelList.size()+"个需求信息"; - if(hasTasksMenus.size()>0 ) { - msg=msg+",【"+StringUtils.arrayToDelimitedString(hasTasksMenus.toArray(), ",")+"】存在任务关联,不允许删除"; - } + String msg="成功删除"+canDelList.size()+"个需求信息。\n"; if(hasChildMenus.size()>0 ) { - msg=msg+",【"+StringUtils.arrayToDelimitedString(hasChildMenus.toArray(), ",")+"】存在子需求,不允许删除"; - } - tips.setOkMsg(msg); - - + msg=msg+"以下"+hasChildMenus.size()+"个需求存在子需求,不允许删除。【"+StringUtils.arrayToDelimitedString(hasChildMenus.toArray(), ",")+"】"; + } + if(canDelList.size()==0){ + tips.setFailureMsg(msg); + }else{ + tips.setOkMsg(msg); + } }catch (BizException e) { tips=e.getTips(); logger.error("",e); diff --git a/xm-core/src/main/java/com/xm/core/service/XmMenuService.java b/xm-core/src/main/java/com/xm/core/service/XmMenuService.java index e8555a5a..e7339aea 100644 --- a/xm-core/src/main/java/com/xm/core/service/XmMenuService.java +++ b/xm-core/src/main/java/com/xm/core/service/XmMenuService.java @@ -5,6 +5,7 @@ import com.mdp.core.service.BaseService; import com.xm.core.entity.XmMenu; import com.xm.core.entity.XmTask; import com.xm.core.vo.XmMenuVo; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; @@ -20,6 +21,9 @@ import java.util.stream.Collectors; @Service("xm.core.xmMenuService") public class XmMenuService extends BaseService { + @Autowired + XmMenuStateService xmMenuStateService; + /** * 连同功能关联的计划数据一起带出 * @param xmMenu @@ -57,22 +61,22 @@ public class XmMenuService extends BaseService { editList.add(vo); } } + List xmMenuList=new ArrayList<>(); if(addList.size()>0) { + xmMenuList.addAll(addList.stream().map(i->(XmMenu)i).collect(Collectors.toList())); this.batchInsert(addList); - - List list= addList.stream().filter(i->!xmMenus.stream().filter(k->k.getMenuId().equals(i.getPmenuId())).findAny().isPresent()).collect(Collectors.toList()); - list=list.stream().filter(i-> StringUtils.hasText(i.getPmenuId())).collect(Collectors.toList()); - if(list.size()>0){ - this.updateChildrenCntByIds(list.stream().map(i->i.getPmenuId()).collect(Collectors.toSet()).stream().collect(Collectors.toList())); - } + this.xmMenuStateService.batchLoadXmMenuToState(xmMenus.get(0).getProductId()); } if(editList.size()>0) { + xmMenuList.addAll(editList.stream().map(i->(XmMenu)i).collect(Collectors.toList())); this.batchUpdate(editList); } + if(xmMenuList.size()>0){ + this.xmMenuStateService.batchSumParents(xmMenuList); + } } public List< Map> queryTaskUsersByMenuId(String menuId) { - // TODO Auto-generated method stub - return this.selectList("queryTaskUsersByMenuId", menuId); + return this.selectList("queryTaskUsersByMenuId", menuId); } public List selectExistIterationMenus(List menuIds) { @@ -189,45 +193,64 @@ public class XmMenuService extends BaseService { @Transactional public int insert(XmMenu xmMenu) { int i= super.insert(xmMenu); - if(StringUtils.hasText(xmMenu.getPmenuId())){ - this.updateMenuChildrenCntByMenuId(xmMenu.getPmenuId()); - } + xmMenuStateService.batchLoadXmMenuToState(xmMenu.getProductId()); + xmMenuStateService.sumParents(xmMenu); return i; } @Transactional public int updateByPk(XmMenu xmMenu) { int i= super.updateByPk(xmMenu); - - if(StringUtils.hasText(xmMenu.getPmenuId())){ - this.updateMenuChildrenCntByMenuId(xmMenu.getPmenuId()); - } return i; } @Transactional public void doBatchInsert(List xmMenus) { super.batchInsert(xmMenus); - List list= xmMenus.stream().filter(i->!xmMenus.stream().filter(k->k.getMenuId().equals(i.getPmenuId())).findAny().isPresent()).collect(Collectors.toList()); - list=list.stream().filter(i->StringUtils.hasText(i.getPmenuId())).collect(Collectors.toList()); - if(list.size()>0){ - this.updateChildrenCntByIds(list.stream().map(i->i.getPmenuId()).collect(Collectors.toSet()).stream().collect(Collectors.toList())); - } + this.xmMenuStateService.batchLoadXmMenuToState(xmMenus.get(0).getProductId()); + this.xmMenuStateService.batchSumParents(xmMenus); + } @Transactional public void doBatchDelete(List canDelList) { super.batchDelete(canDelList); - - List list= canDelList.stream().filter(i->!canDelList.stream().filter(k->k.getMenuId().equals(i.getPmenuId())).findAny().isPresent()).collect(Collectors.toList()); - list=list.stream().filter(i->StringUtils.hasText(i.getPmenuId())).collect(Collectors.toList()); - if(list.size()>0){ - this.updateChildrenCntByIds(list.stream().map(i->i.getPmenuId()).collect(Collectors.toSet()).stream().collect(Collectors.toList())); - } + this.xmMenuStateService.batchSumParents(canDelList); } @Transactional public void doBatchDeleteByProductIds(List productIds) { super.delete("doBatchDeleteByProductIds",productIds); } + + + /** + * 检查是否能删除干净所有儿子孙子节点。 + * @param delNode 当前删除节点 + * @param delNodes 本批量需要删除的全部节点 + * @return + */ + public boolean checkCanDelAllChild(XmMenu delNode, List delNodes) { + if(delNode==null){ + return true; + } + if(delNode.getChildrenCnt()==null||delNode.getChildrenCnt()<=0){ + return true; + } + List childList=delNodes.stream().filter(i->delNode.getMenuId().equals(i.getPmenuId())).collect(Collectors.toList()); + if(childList==null||childList.size() selectListByIds(List ids) { + return super.selectList("selectListByIds",ids); + } } diff --git a/xm-core/src/main/java/com/xm/core/service/XmMenuStateService.java b/xm-core/src/main/java/com/xm/core/service/XmMenuStateService.java index 6c3abc9a..6f0342f3 100644 --- a/xm-core/src/main/java/com/xm/core/service/XmMenuStateService.java +++ b/xm-core/src/main/java/com/xm/core/service/XmMenuStateService.java @@ -2,14 +2,18 @@ package com.xm.core.service; import com.mdp.core.entity.Tips; import com.mdp.core.service.BaseService; +import com.mdp.core.utils.DateUtils; import com.mdp.safe.client.entity.User; import com.mdp.safe.client.utils.LoginUtils; import com.xm.core.entity.XmMenu; import com.xm.core.entity.XmMenuState; +import com.xm.core.entity.XmTask; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import java.util.*; +import java.util.stream.Collectors; /** * 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.
@@ -64,6 +68,7 @@ public class XmMenuStateService extends BaseService { state.setPlanStartTime(new Date()); state.setCtime(new Date()); state.setLtime(new Date()); + state.setBizDate(DateUtils.getDate("yyyy-MM-dd")); state.setCuserid(user.getUserid()); state.setCusername(user.getUsername()); state.setProductName(productName); @@ -73,7 +78,95 @@ public class XmMenuStateService extends BaseService { this.batchInsert(addStates); return tips; - } + } + + + public long batchLoadXmMenuToState(String productId){ + long i=super.insert("batchLoadXmMenuToState",map("bizDate",DateUtils.getDate("yyyy-MM-dd"),"productId",productId)); + return i; + } + + @Transactional + public void sumParents(XmMenu node){ + String id=node.getMenuId(); + String pidPaths=node.getPidPaths(); + if(!StringUtils.hasText(pidPaths)){ + return; + } + if(!pidPaths.startsWith("0,")){ + return; + } + if("0".equals(node.getNtype())&&pidPaths.endsWith(id+",")){ + pidPaths=pidPaths.substring(2,pidPaths.indexOf(id)); + }else{ + pidPaths=pidPaths.substring(2); + } + + if(!StringUtils.hasText(pidPaths)){ + return; + } + String[] pidPathss=pidPaths.split(","); + List pidPathsList=new ArrayList<>(); + for (int i = pidPathss.length-1; i >=0; i--) { + pidPathsList.add(pidPathss[i]); + } + if(pidPathsList.size()>0){ + super.update("sumParents",pidPathsList ); + } + + } + @Transactional + public void batchSumParents(List xmMenus) { + List> list=new ArrayList<>(); + for (XmMenu node : xmMenus) { + String id=node.getMenuId(); + String pidPaths=node.getPidPaths(); + if(!StringUtils.hasText(pidPaths)){ + continue; + } + if(!pidPaths.startsWith("0,")){ + continue; + } + if("0".equals(node.getNtype())){ + pidPaths=pidPaths.substring(2,pidPaths.indexOf(id)); + }else{ + pidPaths=pidPaths.substring(2); + } + + if(!StringUtils.hasText(pidPaths)){ + continue; + } + String[] pidPathss=pidPaths.split(","); + for (int i = 0; i ()); + } + Set set=list.get(i); + set.add(pidPathss[i]); + } + if(list.size()<=0){ + return; + } + Set allSet=new HashSet<>(); + for (int i = list.size() - 1; i >= 0; i--) { + Set set=list.get(i); + if(set.size()>0){ + List ids=set.stream().filter(k->!allSet.contains(k)).collect(Collectors.toList()); + if(ids.size()>0){ + allSet.addAll(ids.stream().collect(Collectors.toSet())); + super.update("batchSumParents", ids); + } + + } + + } + + + } + + } + + /** * 计算bug、task、测试案例、等数据 * @param productId diff --git a/xm-core/src/main/resources/mybatis/mapper/xm/core/dao/XmMenuStateMapper.xml b/xm-core/src/main/resources/mybatis/mapper/xm/core/dao/XmMenuStateMapper.xml index 17a934d2..86fa2ecc 100644 --- a/xm-core/src/main/resources/mybatis/mapper/xm/core/dao/XmMenuStateMapper.xml +++ b/xm-core/src/main/resources/mybatis/mapper/xm/core/dao/XmMenuStateMapper.xml @@ -18,6 +18,112 @@ {call load_tasks_to_xm_menu_state(#{productId,mode=IN})} + + + + update xm_menu_state s inner join + (select m.pmenu_id, + sum(ss.plan_workload) as plan_workload , + sum(ss.plan_cost_amount) as plan_cost_amount , + sum(ss.act_workload) as act_workload , + sum(ss.act_cost_amount) as act_cost_amount , + sum(ifnull(ss.finish_rate,0) * ifnull(ss.plan_workload,0))/ifnull(sum(ifnull(ss.plan_workload,0.00001)),9999) as finish_rate , + sum(ss.task_cnt) as task_cnt , + sum(ss.finish_task_cnt) as finish_task_cnt , + sum(ss.project_cnt) as project_cnt , + sum(ss.iteration_cnt) as iteration_cnt , + sum(ss.test_cases) as test_cases , + sum(ss.exec_cases) as exec_cases , + sum(ss.design_cases) as design_cases , + sum(ss.finish_cases) as finish_cases , + sum(ss.bug_cnt) as bug_cnt , + sum(ss.active_bugs) as active_bugs , + sum(ss.confirmed_bugs) as confirmed_bugs , + sum(ss.resolved_bugs) as resolved_bugs , + sum(ss.closed_bugs) as closed_bugs + from xm_menu_state ss inner join xm_menu m on ss.menu_id=m.menu_id where m.pmenu_id in + + #{item} + + + group by m.pmenu_id) s2 on s2.pmenu_id=s.menu_id + set s.plan_workload=s2.plan_workload, + s.plan_cost_amount=s2.plan_cost_amount, + s.act_workload=s2.act_workload, + s.act_cost_amount=s2.act_cost_amount, + s.finish_rate=s2.finish_rate, + s.task_cnt=s2.task_cnt, + s.finish_task_cnt=s2.finish_task_cnt, + s.project_cnt=s2.project_cnt, + s.iteration_cnt=s2.iteration_cnt, + + s.test_cases=s2.test_cases, + s.exec_cases=s2.exec_cases, + s.design_cases=s2.design_cases, + s.finish_cases=s2.finish_cases, + + s.bug_cnt=s2.bug_cnt, + s.active_bugs=s2.active_bugs, + s.confirmed_bugs=s2.confirmed_bugs, + s.resolved_bugs=s2.resolved_bugs, + s.closed_bugs=s2.closed_bugs + where s.menu_id in + + #{item} + + + + + + update xm_menu_state s inner join + (select m.pmenu_id, + sum(ss.plan_workload) as plan_workload , + sum(ss.plan_cost_amount) as plan_cost_amount , + sum(ss.act_workload) as act_workload , + sum(ss.act_cost_amount) as act_cost_amount , + sum(ifnull(ss.finish_rate,0) * ifnull(ss.plan_workload,0))/ifnull(sum(ifnull(ss.plan_workload,0.00001)),9999) as finish_rate , + sum(ss.task_cnt) as task_cnt , + sum(ss.finish_task_cnt) as finish_task_cnt , + sum(ss.project_cnt) as project_cnt , + sum(ss.iteration_cnt) as iteration_cnt , + sum(ss.test_cases) as test_cases , + sum(ss.exec_cases) as exec_cases , + sum(ss.design_cases) as design_cases , + sum(ss.finish_cases) as finish_cases , + sum(ss.bug_cnt) as bug_cnt , + sum(ss.active_bugs) as active_bugs , + sum(ss.confirmed_bugs) as confirmed_bugs , + sum(ss.resolved_bugs) as resolved_bugs , + sum(ss.closed_bugs) as closed_bugs + from xm_menu_state ss inner join xm_menu m on ss.menu_id=m.menu_id where m.pmenu_id =#{item} + + group by m.pmenu_id) s2 on s2.pmenu_id=s.menu_id + set s.plan_workload=s2.plan_workload, + s.plan_cost_amount=s2.plan_cost_amount, + s.act_workload=s2.act_workload, + s.act_cost_amount=s2.act_cost_amount, + s.finish_rate=s2.finish_rate, + s.task_cnt=s2.task_cnt, + s.finish_task_cnt=s2.finish_task_cnt, + s.project_cnt=s2.project_cnt, + s.iteration_cnt=s2.iteration_cnt, + + s.test_cases=s2.test_cases, + s.exec_cases=s2.exec_cases, + s.design_cases=s2.design_cases, + s.finish_cases=s2.finish_cases, + + s.bug_cnt=s2.bug_cnt, + s.active_bugs=s2.active_bugs, + s.confirmed_bugs=s2.confirmed_bugs, + s.resolved_bugs=s2.resolved_bugs, + s.closed_bugs=s2.closed_bugs + where s.menu_id = #{item} + + + + insert into xm_menu_state (id,product_id,menu_id,biz_date) select CONCAT(#{bizDate},i.menu_id),i.product_id,i.menu_id,#{bizDate} from xm_menu i left join xm_menu_state s on s.product_id=i.product_id and s.menu_id=i.menu_id where i.product_id=#{productId} and s.menu_id is null +