diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmProjectPhaseController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmProjectPhaseController.java index e5471f02..a9d1d474 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmProjectPhaseController.java +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmProjectPhaseController.java @@ -442,18 +442,20 @@ public class XmProjectPhaseController { if(exists>0) { noDelList.add(phase.getPhaseName()); }else { - Long checkExistsChildren =xmProjectPhaseService.checkExistsChildren(phase.getId()); - if(checkExistsChildren>0) { - hasChildList.add(phase.getPhaseName()); - }else { - delPhases.add(phase); - delCount=delCount+1; - xmRecordService.addXmPhaseRecord(phase.getProjectId(), phase.getId(), "项目-计划-删除计划", "删除计划"+phase.getPhaseName(),JSON.toJSONString(phase),null); - } - + delPhases.add(phase); } } - if(delPhases.size()>0){ + List canDelNodes=new ArrayList<>(); + for (XmProjectPhase phase : delPhases) { + + boolean canDelAllChild =xmProjectPhaseService.checkCanDelAllChild(phase,xmProjectPhases); + if(!canDelAllChild) { + hasChildList.add(phase.getPhaseName()); + }else { + canDelNodes.add(phase); + } + } + if(canDelNodes.size()>0){ this.xmProjectPhaseService.doBatchDelete(delPhases); } String noQxTips=""; diff --git a/xm-core/src/main/java/com/xm/core/ctrl/XmTaskController.java b/xm-core/src/main/java/com/xm/core/ctrl/XmTaskController.java index c7b23129..887011ea 100644 --- a/xm-core/src/main/java/com/xm/core/ctrl/XmTaskController.java +++ b/xm-core/src/main/java/com/xm/core/ctrl/XmTaskController.java @@ -1037,13 +1037,13 @@ public class XmTaskController { List msgs=new ArrayList<>(); msgs.add("删除了"+canDelNodes.size()+"个任务。"); if(hadChildNodes.size()>0){ - msgs.add("以下"+hadChildNodes.size()+"个任务,【"+hadChildNodes.stream().map(i->i.getName()).collect(Collectors.joining(","))+"】存在未删除的子任务,不能删除。"); + msgs.add("以下"+hadChildNodes.size()+"个任务存在未删除的子任务,不能删除。【"+hadChildNodes.stream().map(i->i.getName()).collect(Collectors.joining(","))+"】"); } if(noAllowNodes.size()>0){ - msgs.add("以下"+noAllowNodes.size()+"个任务,【"+noAllowNodes.stream().map(i->i.getName()).collect(Collectors.joining(","))+"】您无权删除。"); + msgs.add("以下"+noAllowNodes.size()+"个任务您无权删除。 【"+noAllowNodes.stream().map(i->i.getName()).collect(Collectors.joining(","))+"】"); } if(existsExecuserList.size()>0){ - msgs.add("以下"+existsExecuserList.size()+"个任务,【"+existsExecuserList.stream().map(i->i.getName()).collect(Collectors.joining(","))+"】存在待结算的执行人,不能删除。"); + msgs.add("以下"+existsExecuserList.size()+"个任务存在待结算的执行人,不能删除。【"+existsExecuserList.stream().map(i->i.getName()).collect(Collectors.joining(","))+"】"); } if(canDelNodes.size()==0){ tips.setFailureMsg(msgs.stream().collect(Collectors.joining("\n"))); diff --git a/xm-core/src/main/java/com/xm/core/service/XmProjectPhaseService.java b/xm-core/src/main/java/com/xm/core/service/XmProjectPhaseService.java index f5cd4c96..d9236854 100644 --- a/xm-core/src/main/java/com/xm/core/service/XmProjectPhaseService.java +++ b/xm-core/src/main/java/com/xm/core/service/XmProjectPhaseService.java @@ -148,14 +148,8 @@ public class XmProjectPhaseService extends BaseService { @Transactional public int[] doBatchDelete(List batchValues) { int[] result= super.batchDelete(batchValues); - - List list= batchValues.stream().filter(i->!batchValues.stream().filter(k->k.getId().equals(i.getParentPhaseId())).findAny().isPresent()).collect(Collectors.toList()); - list=list.stream().filter(i-> StringUtils.hasText(i.getParentPhaseId())).collect(Collectors.toList()); - if(list.size()>0){ - this.updateChildrenCntByIds(list.stream().map(i->i.getParentPhaseId()).collect(Collectors.toSet()).stream().collect(Collectors.toList())); batchSumParents(batchValues); - } - return result; + return result; } public XmProjectPhase autoCalcWorkload(XmProjectPhase phase) { @@ -188,12 +182,37 @@ public class XmProjectPhaseService extends BaseService { public void updatePhaseChildrenCntByPhaseId(String phaseId){ super.update("updatePhaseChildrenCntByPhaseId",phaseId); } - + public Long checkExistsChildren(String phaseId) { Long i= this.selectOne("checkExistsChildren", phaseId); return i; } + /** + * 检查是否能删除干净所有儿子孙子节点。 + * @param delNode 当前删除节点 + * @param delNodes 本批量需要删除的全部节点 + * @return + */ + public boolean checkCanDelAllChild(XmProjectPhase delNode, List delNodes) { + if(delNode==null){ + return true; + } + if(delNode.getChildrenCnt()==null||delNode.getChildrenCnt()<=0){ + return true; + } + List childList=delNodes.stream().filter(i->delNode.getId().equals(i.getParentPhaseId())).collect(Collectors.toList()); + if(childList==null||childList.size() xmProjectPhases) { List addList=new ArrayList<>(); @@ -396,9 +415,9 @@ public class XmProjectPhaseService extends BaseService { } @Transactional - public void batchSumParents(List xmTasks) { + public void batchSumParents(List xmProjectPhases) { List> list=new ArrayList<>(); - for (XmProjectPhase node : xmTasks) { + for (XmProjectPhase node : xmProjectPhases) { String id=node.getId(); String pidPaths=node.getPidPaths(); if(!StringUtils.hasText(pidPaths)){ @@ -424,12 +443,21 @@ public class XmProjectPhaseService extends BaseService { 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--) { - allSet.addAll(list.get(i)); - } - if(allSet.size()>0){ - super.update("sumParents",allSet.stream().collect(Collectors.toList())); + 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); + } + + } + } diff --git a/xm-core/src/main/resources/mybatis/mapper/xm/core/dao/XmProjectPhaseMapper.xml b/xm-core/src/main/resources/mybatis/mapper/xm/core/dao/XmProjectPhaseMapper.xml index bf9f2994..dea0acc0 100644 --- a/xm-core/src/main/resources/mybatis/mapper/xm/core/dao/XmProjectPhaseMapper.xml +++ b/xm-core/src/main/resources/mybatis/mapper/xm/core/dao/XmProjectPhaseMapper.xml @@ -100,6 +100,7 @@ SELECT t.project_id, t.parent_phase_id, + count(1) as children_cnt, sum(t.phase_act_inner_user_workload) as phase_act_inner_user_workload, sum(t.phase_act_out_user_workload) as phase_act_out_user_workload, sum(t.phase_act_workload) as phase_act_workload, @@ -123,10 +124,52 @@ res.act_rate= tc.act_rate, res.task_budget_workload=tc.task_budget_workload, res.task_budget_at=tc.task_budget_at, - res.calc_time=now() + res.calc_time=now(), + res.children_cnt=ifnull(tc.children_cnt,0) where res.id=#{item} and res.ntype='1' + + UPDATE XM.xm_project_phase res + LEFT JOIN ( + SELECT + t.project_id, + t.parent_phase_id, + count(1) as children_cnt, + sum(t.phase_act_inner_user_workload) as phase_act_inner_user_workload, + sum(t.phase_act_out_user_workload) as phase_act_out_user_workload, + sum(t.phase_act_workload) as phase_act_workload, + sum(t.act_inner_user_at) as act_inner_user_at, + sum(t.act_out_user_at) as act_out_user_at, + sum(ifnull(t.act_rate,0)*ifnull(t.task_budget_workload,0))/ifnull(sum(ifnull(t.task_budget_workload,0.000001)),999999) as act_rate, + sum(t.task_budget_workload) as task_budget_workload, + sum(t.task_budget_at) as task_budget_at + FROM xm_project_phase t + WHERE + t.parent_phase_id in + + #{item} + + GROUP BY + t.project_id, + t.parent_phase_id + ) AS tc ON res.project_id = tc.project_id and res.id=tc.parent_phase_id + SET res.phase_act_inner_user_workload = tc.phase_act_inner_user_workload, + res.phase_act_out_user_workload = tc.phase_act_out_user_workload, + res.phase_act_workload = tc.phase_act_workload, + res.act_inner_user_at = tc.act_inner_user_at, + res.act_out_user_at = tc.act_out_user_at, + res.act_rate= tc.act_rate, + res.task_budget_workload=tc.task_budget_workload, + res.task_budget_at=tc.task_budget_at, + res.calc_time=now(), + res.children_cnt=ifnull(tc.children_cnt,0) + where res.id in + + #{item} + + and res.ntype='1' +