Browse Source

添加节点类型、标签等

master
陈裕财 4 years ago
parent
commit
81031ed8fa
  1. 40
      xm-core/src/main/java/com/xm/core/ctrl/XmMenuController.java
  2. 75
      xm-core/src/main/java/com/xm/core/service/XmMenuService.java
  3. 93
      xm-core/src/main/java/com/xm/core/service/XmMenuStateService.java
  4. 106
      xm-core/src/main/resources/mybatis/mapper/xm/core/dao/XmMenuStateMapper.xml

40
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<String,Object> m = new HashMap<>();
Tips tips=new Tips("成功删除"+xmMenus.size()+"条数据");
try{
List<String> hasTasksMenus=new ArrayList<>();
List<String> hasChildMenus=new ArrayList<>();
List<XmMenu> canDelList=new ArrayList<>();
for (XmMenu xmMenu : xmMenus) {
XmMenu query=new XmMenu();
query.setPmenuId(xmMenu.getMenuId());
long childCount=xmMenuService.countByWhere(query);
if(childCount>0) {
List<XmMenu> 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(), ",")+"】存在子需求,不允许删除";
msg=msg+"以下"+hasChildMenus.size()+"个需求存在子需求,不允许删除。【"+StringUtils.arrayToDelimitedString(hasChildMenus.toArray(), ",")+"】";
}
if(canDelList.size()==0){
tips.setFailureMsg(msg);
}else{
tips.setOkMsg(msg);
}
tips.setOkMsg(msg);
}catch (BizException e) {
tips=e.getTips();
logger.error("",e);

75
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<XmMenu> xmMenuList=new ArrayList<>();
if(addList.size()>0) {
xmMenuList.addAll(addList.stream().map(i->(XmMenu)i).collect(Collectors.toList()));
this.batchInsert(addList);
List<XmMenu> 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<String, Object>> queryTaskUsersByMenuId(String menuId) {
// TODO Auto-generated method stub
return this.selectList("queryTaskUsersByMenuId", menuId);
return this.selectList("queryTaskUsersByMenuId", menuId);
}
public List<XmMenu> selectExistIterationMenus(List<String> 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<XmMenu> xmMenus) {
super.batchInsert(xmMenus);
List<XmMenu> 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<XmMenu> canDelList) {
super.batchDelete(canDelList);
List<XmMenu> 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<String> productIds) {
super.delete("doBatchDeleteByProductIds",productIds);
}
/**
* 检查是否能删除干净所有儿子孙子节点
* @param delNode 当前删除节点
* @param delNodes 本批量需要删除的全部节点
* @return
*/
public boolean checkCanDelAllChild(XmMenu delNode, List<XmMenu> delNodes) {
if(delNode==null){
return true;
}
if(delNode.getChildrenCnt()==null||delNode.getChildrenCnt()<=0){
return true;
}
List<XmMenu> childList=delNodes.stream().filter(i->delNode.getMenuId().equals(i.getPmenuId())).collect(Collectors.toList());
if(childList==null||childList.size()<delNode.getChildrenCnt()){
return false;
}
for (XmMenu n : childList) {
if (!this.checkCanDelAllChild(n, delNodes)) {
return false;
}
}
return true;
}
public List<XmMenu> selectListByIds(List<String> ids) {
return super.selectList("selectListByIds",ids);
}
}

93
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;
/**
* 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.<br>
@ -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);
@ -74,6 +79,94 @@ public class XmMenuStateService extends BaseService {
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<String> 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<XmMenu> xmMenus) {
List<Set<String>> 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 <pidPathss.length; i++) {
if(list.size()<=i){
list.add(new HashSet<>());
}
Set<String> set=list.get(i);
set.add(pidPathss[i]);
}
if(list.size()<=0){
return;
}
Set<String> allSet=new HashSet<>();
for (int i = list.size() - 1; i >= 0; i--) {
Set<String> set=list.get(i);
if(set.size()>0){
List<String> 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);
}
}
}
}
}
/**
* 计算bugtask测试案例等数据
* @param productId

106
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>
<!-- 适合没有交叉的,没用父子关系的一批任务的更新 -->
<update id="batchSumParents" parameterType="List">
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
<foreach collection="list" index="index" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
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
<foreach collection="list" index="index" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</update>
<!-- 适合父子关系的一批任务的更新 -->
<update id="sumParents" parameterType="List">
<foreach collection="list" item="item" index="index" open="" separator=";" close="" >
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}
</foreach>
</update>
<insert id="batchLoadXmMenuToState" parameterType="HashMap">
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
</insert>
<!--结束 自定义sql函数区域-->

Loading…
Cancel
Save