|
|
|
@ -11,11 +11,9 @@ import com.mdp.qx.HasQx; |
|
|
|
import com.mdp.safe.client.entity.User; |
|
|
|
import com.mdp.safe.client.utils.LoginUtils; |
|
|
|
import com.xm.core.PubTool; |
|
|
|
import com.xm.core.entity.XmProject; |
|
|
|
import com.xm.core.entity.XmProjectPhase; |
|
|
|
import com.xm.core.service.XmProjectGroupService; |
|
|
|
import com.xm.core.service.XmProjectPhaseService; |
|
|
|
import com.xm.core.service.XmProjectService; |
|
|
|
import com.xm.core.service.XmRecordService; |
|
|
|
import com.xm.core.service.*; |
|
|
|
import com.xm.core.vo.XmProjectGroupVo; |
|
|
|
import com.xm.core.vo.XmProjectPhaseVo; |
|
|
|
import io.swagger.annotations.*; |
|
|
|
@ -57,6 +55,8 @@ public class XmProjectPhaseController { |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private XmProjectService xmProjectService; |
|
|
|
|
|
|
|
|
|
|
|
@Autowired |
|
|
|
XmRecordService xmRecordService; |
|
|
|
|
|
|
|
@ -155,10 +155,6 @@ public class XmProjectPhaseController { |
|
|
|
tips.setFailureMsg("计划编号不能为空"); |
|
|
|
m.put("tips", tips); |
|
|
|
return m; |
|
|
|
}else if(StringUtils.isEmpty(xmProjectPhase.getId())) { |
|
|
|
tips.setFailureMsg("计划编号不能为空"); |
|
|
|
m.put("tips", tips); |
|
|
|
return m; |
|
|
|
}else{ |
|
|
|
XmProjectPhase xmProjectPhaseQuery = new XmProjectPhase(xmProjectPhase.getId()); |
|
|
|
XmProjectPhase xmProjectPhaseDb=this.xmProjectPhaseService.selectOneObject(xmProjectPhaseQuery); |
|
|
|
@ -167,9 +163,10 @@ public class XmProjectPhaseController { |
|
|
|
m.put("tips", tips); |
|
|
|
return m; |
|
|
|
} |
|
|
|
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhaseDb.getProjectId()); |
|
|
|
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhaseDb.getProjectId()); |
|
|
|
User user = LoginUtils.getCurrentUserInfo(); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectManager(groupVoList,user.getUserid()); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectAdm(xmProject,user.getUserid()); |
|
|
|
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid()); |
|
|
|
if( !meIsPm && !meIsTeamHead ){ |
|
|
|
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许设置计划负责人"); |
|
|
|
@ -188,6 +185,7 @@ public class XmProjectPhaseController { |
|
|
|
xmProjectPhaseToUpdate.setMngUserid(xmProjectPhase.getMngUserid()); |
|
|
|
xmProjectPhaseToUpdate.setMngUsername(xmProjectPhase.getMngUsername()); |
|
|
|
this.xmProjectPhaseService.updateSomeFieldByPk(xmProjectPhaseToUpdate); |
|
|
|
this.xmRecordService.addProjectPhaseRecord(xmProject.getId(),xmProjectPhase.getId(),"项目-计划-设置计划负责人","计划负责人由【"+xmProjectPhaseDb.getMngUsername()+"】变更为【"+xmProjectPhase.getMngUsername()+"】"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -227,9 +225,10 @@ public class XmProjectPhaseController { |
|
|
|
xmProjectPhase.setMngUserid(user.getUserid()); |
|
|
|
xmProjectPhase.setMngUsername(user.getUsername()); |
|
|
|
} |
|
|
|
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId()); |
|
|
|
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); |
|
|
|
|
|
|
|
boolean meIsPm=groupService.checkUserIsProjectManager(groupVoList,user.getUserid()); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectAdm(xmProject,user.getUserid()); |
|
|
|
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid()); |
|
|
|
if( !meIsPm && !meIsTeamHead ){ |
|
|
|
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许设置计划负责人"); |
|
|
|
@ -242,22 +241,17 @@ public class XmProjectPhaseController { |
|
|
|
m.put("tips", tips); |
|
|
|
return m; |
|
|
|
} |
|
|
|
BigDecimal phaseBudgetCost=BigDecimal.ZERO; |
|
|
|
String projectId=null; |
|
|
|
BigDecimal zero=BigDecimal.ZERO; |
|
|
|
projectId=xmProjectPhase.getProjectId(); |
|
|
|
BigDecimal phaseBudgetInnerUserAt=NumberUtil.getBigDecimal(xmProjectPhase.getPhaseBudgetInnerUserAt(),zero); |
|
|
|
BigDecimal phaseBudgetOutUserAt=NumberUtil.getBigDecimal(xmProjectPhase.getPhaseBudgetOutUserAt(),zero); |
|
|
|
BigDecimal phaseBudgetNouserAt=NumberUtil.getBigDecimal(xmProjectPhase.getPhaseBudgetNouserAt(),zero); |
|
|
|
phaseBudgetCost=phaseBudgetCost.add(phaseBudgetInnerUserAt).add(phaseBudgetOutUserAt).add(phaseBudgetNouserAt); |
|
|
|
List<String> excludePhaseIds=new ArrayList<>(); |
|
|
|
excludePhaseIds.add(xmProjectPhase.getId()); |
|
|
|
if(!StringUtils.hasText(xmProjectPhase.getParentPhaseId())){//如果为顶级计划,预算不能大于产品总预算 |
|
|
|
Tips judgetTips=xmProjectPhaseService.judgetBudget(projectId, phaseBudgetCost,phaseBudgetInnerUserAt,phaseBudgetOutUserAt,phaseBudgetNouserAt,excludePhaseIds); |
|
|
|
if(!judgetTips.isOk()){ |
|
|
|
return ResponseHelper.failed(judgetTips); |
|
|
|
} |
|
|
|
xmProjectPhaseService.parentIdPathsCalcBeforeSave(xmProjectPhase); |
|
|
|
if(xmProjectPhase.getLvl()==1){ |
|
|
|
tips=xmProjectPhaseService.judgetProjectBudget(xmProject.getId(),xmProjectPhase.getPhaseBudgetAt(),null,null,null,excludePhaseIds); |
|
|
|
}else { |
|
|
|
tips=xmProjectPhaseService.judgetPhaseBudget(xmProjectPhase.getParentPhaseId(),xmProjectPhase.getPhaseBudgetAt(),null,null,null,excludePhaseIds); |
|
|
|
} |
|
|
|
if(!tips.isOk()){ |
|
|
|
return ResponseHelper.failed(tips); |
|
|
|
} |
|
|
|
XmProjectPhase parentDb=xmProjectPhaseService.selectOneObject(new XmProjectPhase(xmProjectPhase.getParentPhaseId())); |
|
|
|
if(parentDb==null){ |
|
|
|
return ResponseHelper.failed("p-no-exists","上级计划不存在"); |
|
|
|
@ -265,14 +259,8 @@ public class XmProjectPhaseController { |
|
|
|
if(!"1".equals(parentDb.getNtype())){ |
|
|
|
return ResponseHelper.failed("p-ntype-no-1","上级【"+parentDb.getPhaseName()+"】不是计划集,不能在其之下建立子计划"); |
|
|
|
} |
|
|
|
Tips judgetTips=xmProjectPhaseService.judgetPhaseBudget(xmProjectPhase.getParentPhaseId(), phaseBudgetCost,phaseBudgetInnerUserAt,phaseBudgetOutUserAt,phaseBudgetNouserAt,excludePhaseIds); |
|
|
|
if(!judgetTips.isOk()){ |
|
|
|
return ResponseHelper.failed(judgetTips); |
|
|
|
} |
|
|
|
} |
|
|
|
xmProjectPhaseService.parentIdPathsCalcBeforeSave(xmProjectPhase); |
|
|
|
xmProjectPhaseService.insert(xmProjectPhase); |
|
|
|
xmRecordService.addProjectPhaseRecord(projectId, xmProjectPhase.getId(), "项目-计划-新增计划", "新增计划"+xmProjectPhase.getPhaseName(),JSON.toJSONString(xmProjectPhase),null); |
|
|
|
xmRecordService.addProjectPhaseRecord(xmProject.getId(), xmProjectPhase.getId(), "项目-计划-新增计划", "新增计划"+xmProjectPhase.getPhaseName(),JSON.toJSONString(xmProjectPhase),null); |
|
|
|
m.put("data",xmProjectPhase); |
|
|
|
}catch (BizException e) { |
|
|
|
tips=e.getTips(); |
|
|
|
@ -295,9 +283,10 @@ public class XmProjectPhaseController { |
|
|
|
Map<String,Object> m = new HashMap<>(); |
|
|
|
Tips tips=new Tips("成功删除一条数据"); |
|
|
|
try{ |
|
|
|
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId()); |
|
|
|
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); |
|
|
|
User user = LoginUtils.getCurrentUserInfo(); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectManager(groupVoList,user.getUserid()); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectAdm(xmProject,user.getUserid()); |
|
|
|
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid()); |
|
|
|
if( !meIsPm && !meIsTeamHead ){ |
|
|
|
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许删除计划"); |
|
|
|
@ -320,7 +309,7 @@ public class XmProjectPhaseController { |
|
|
|
tips.setFailureMsg("存在"+xmProjectPhaseDb.getChildrenCnt()+"条子计划,不允许删除"); |
|
|
|
} else { |
|
|
|
xmProjectPhaseService.deleteByPk(xmProjectPhaseDb); |
|
|
|
xmRecordService.addProjectPhaseRecord(xmProjectPhaseDb.getProjectId(), xmProjectPhaseDb.getId(), "项目-计划-删除计划", "删除计划"+xmProjectPhaseDb.getPhaseName(),JSON.toJSONString(xmProjectPhaseDb),null); |
|
|
|
xmRecordService.addProjectPhaseRecord(xmProjectPhaseDb.getProjectId(), xmProjectPhaseDb.getId(), "项目-计划-删除计划", "删除计划"+xmProjectPhaseDb.getPhaseName(),"",JSON.toJSONString(xmProjectPhaseDb)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -348,9 +337,10 @@ public class XmProjectPhaseController { |
|
|
|
Map<String,Object> m = new HashMap<>(); |
|
|
|
Tips tips=new Tips("成功更新一条数据"); |
|
|
|
try{ |
|
|
|
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId()); |
|
|
|
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); |
|
|
|
User user = LoginUtils.getCurrentUserInfo(); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectManager(groupVoList,user.getUserid()); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectAdm(xmProject,user.getUserid()); |
|
|
|
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid()); |
|
|
|
if( !meIsPm && !meIsTeamHead ){ |
|
|
|
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许修改计划"); |
|
|
|
@ -367,25 +357,20 @@ public class XmProjectPhaseController { |
|
|
|
m.put("tips", tips); |
|
|
|
return m; |
|
|
|
} |
|
|
|
BigDecimal phaseBudgetCost=BigDecimal.ZERO; |
|
|
|
String projectId=null; |
|
|
|
BigDecimal zero=BigDecimal.ZERO; |
|
|
|
projectId=xmProjectPhase.getProjectId(); |
|
|
|
BigDecimal phaseBudgetInnerUserAt=NumberUtil.getBigDecimal(xmProjectPhase.getPhaseBudgetInnerUserAt(),zero); |
|
|
|
BigDecimal phaseBudgetOutUserAt=NumberUtil.getBigDecimal(xmProjectPhase.getPhaseBudgetOutUserAt(),zero); |
|
|
|
BigDecimal phaseBudgetNouserAt=NumberUtil.getBigDecimal(xmProjectPhase.getPhaseBudgetNouserAt(),zero); |
|
|
|
phaseBudgetCost=phaseBudgetCost.add(phaseBudgetInnerUserAt).add(phaseBudgetOutUserAt).add(phaseBudgetNouserAt); |
|
|
|
List<String> excludePhaseIds=new ArrayList<>(); |
|
|
|
excludePhaseIds.add(xmProjectPhase.getId()); |
|
|
|
Tips judgetTips=xmProjectPhaseService.judgetBudget(projectId, phaseBudgetCost,phaseBudgetInnerUserAt,phaseBudgetOutUserAt,phaseBudgetNouserAt,excludePhaseIds); |
|
|
|
if(judgetTips.isOk()) { |
|
|
|
if(xmProjectPhase.getLvl()==1){ |
|
|
|
tips=this.xmProjectPhaseService.judgetProjectBudget(xmProject.getId(),xmProjectPhase.getPhaseBudgetAt(),null,null,null,excludePhaseIds); |
|
|
|
}else{ |
|
|
|
tips=this.xmProjectPhaseService.judgetPhaseBudget(xmProjectPhase.getParentPhaseId(),xmProjectPhase.getPhaseBudgetAt(),null,null,null,excludePhaseIds); |
|
|
|
} |
|
|
|
if(!tips.isOk()) { |
|
|
|
return ResponseHelper.failed(tips); |
|
|
|
} |
|
|
|
xmProjectPhase=xmProjectPhaseService.autoCalcWorkload(xmProjectPhase); |
|
|
|
xmProjectPhaseService.editByPk(xmProjectPhase); |
|
|
|
xmRecordService.addProjectPhaseRecord(xmProjectPhase.getProjectId(), xmProjectPhase.getId(), "项目-计划-修改计划", "修改计划"+xmProjectPhase.getPhaseName(),JSON.toJSONString(xmProjectPhase),null); |
|
|
|
|
|
|
|
}else { |
|
|
|
tips=judgetTips; |
|
|
|
} |
|
|
|
m.put("data",xmProjectPhase); |
|
|
|
}catch (BizException e) { |
|
|
|
tips=e.getTips(); |
|
|
|
@ -422,11 +407,12 @@ public class XmProjectPhaseController { |
|
|
|
m.put("tips", tips); |
|
|
|
return m; |
|
|
|
} |
|
|
|
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId()); |
|
|
|
List<String> existsTaskList=new ArrayList<>(); |
|
|
|
List<String> hasChildList=new ArrayList<>(); |
|
|
|
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); |
|
|
|
User user = LoginUtils.getCurrentUserInfo(); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectManager(groupVoList,user.getUserid()); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectAdm(xmProject,user.getUserid()); |
|
|
|
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid()); |
|
|
|
if( !meIsPm && !meIsTeamHead ){ |
|
|
|
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许删除计划"); |
|
|
|
@ -462,6 +448,8 @@ public class XmProjectPhaseController { |
|
|
|
} |
|
|
|
if(canDelNodes.size()>0){ |
|
|
|
this.xmProjectPhaseService.doBatchDelete(canDelNodes); |
|
|
|
xmRecordService.addProjectPhaseRecord(xmProjectPhase.getProjectId(), "", "项目-计划-批量删除计划", "批量删除计划"+canDelNodes.stream().map(i->i.getPhaseName()).collect(Collectors.joining(",")),"",JSON.toJSONString(canDelNodes)); |
|
|
|
|
|
|
|
} |
|
|
|
List<String> msgs=new ArrayList<>(); |
|
|
|
msgs.add("成功删除"+canDelNodes.size()+"条数据。"); |
|
|
|
@ -510,50 +498,78 @@ public class XmProjectPhaseController { |
|
|
|
return m; |
|
|
|
} |
|
|
|
XmProjectPhase xmProjectPhase=xmProjectPhases.get(0); |
|
|
|
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId()); |
|
|
|
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); |
|
|
|
User user = LoginUtils.getCurrentUserInfo(); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectManager(groupVoList,user.getUserid()); |
|
|
|
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid()); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectAdm(xmProject,user.getUserid()); |
|
|
|
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHeadOrAss(groupVoList,user.getUserid(),user.getUserid()); |
|
|
|
if( !meIsPm && !meIsTeamHead ){ |
|
|
|
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许批量导入计划"); |
|
|
|
m.put("tips", tips); |
|
|
|
return m; |
|
|
|
} |
|
|
|
BigDecimal phaseBudgetCost=BigDecimal.ZERO; |
|
|
|
BigDecimal phaseBudgetInnerUserAt=BigDecimal.ZERO; |
|
|
|
BigDecimal phaseBudgetOutUserAt=BigDecimal.ZERO; |
|
|
|
BigDecimal phaseBudgetNouserAt=BigDecimal.ZERO; |
|
|
|
String projectId=null; |
|
|
|
BigDecimal zero=BigDecimal.ZERO; |
|
|
|
for (XmProjectPhase g : xmProjectPhases) { |
|
|
|
projectId=g.getProjectId(); |
|
|
|
g.setMngUserid(user.getUserid()); |
|
|
|
g.setMngUsername(user.getUsername()); |
|
|
|
phaseBudgetInnerUserAt=phaseBudgetInnerUserAt.add(NumberUtil.getBigDecimal(g.getPhaseBudgetInnerUserAt(),zero)); |
|
|
|
phaseBudgetOutUserAt=phaseBudgetOutUserAt.add(NumberUtil.getBigDecimal(g.getPhaseBudgetOutUserAt(),zero)); |
|
|
|
phaseBudgetNouserAt=phaseBudgetNouserAt.add(NumberUtil.getBigDecimal(g.getPhaseBudgetNouserAt(),zero)); |
|
|
|
phaseBudgetCost=phaseBudgetCost.add(phaseBudgetInnerUserAt).add(phaseBudgetOutUserAt).add(phaseBudgetNouserAt); |
|
|
|
g=xmProjectPhaseService.autoCalcWorkload(g); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
Tips judgetTips=xmProjectPhaseService.judgetBudget(projectId, phaseBudgetCost,phaseBudgetInnerUserAt,phaseBudgetOutUserAt,phaseBudgetNouserAt,null); |
|
|
|
if(judgetTips.isOk()) { |
|
|
|
xmProjectPhaseService.parentIdPathsCalcBeforeSave(xmProjectPhases); |
|
|
|
List<XmProjectPhase> l1Phases=xmProjectPhases.stream().filter(i->1==i.getLvl()).collect(Collectors.toList()); |
|
|
|
if(l1Phases==null ||l1Phases.size()==0){//如果是导入到某个计划之下, |
|
|
|
//找到导入的树中最上面的节点 |
|
|
|
List<XmProjectPhase> noExists=xmProjectPhases.stream().filter(i->!xmProjectPhases.stream().filter(k->k.getId().equals(i.getParentPhaseId())).findAny().isPresent()).collect(Collectors.toList()); |
|
|
|
//根据同一个父亲归类 |
|
|
|
Map<String,List<XmProjectPhase>> map=new HashMap<>(); |
|
|
|
for (XmProjectPhase noExist : noExists) { |
|
|
|
List<XmProjectPhase> phases=map.get(noExist.getParentPhaseId()); |
|
|
|
if(phases==null){ |
|
|
|
phases=new ArrayList<>(); |
|
|
|
map.put(noExist.getParentPhaseId(),phases); |
|
|
|
} |
|
|
|
phases.add(noExist); |
|
|
|
} |
|
|
|
for (Map.Entry<String, List<XmProjectPhase>> kv : map.entrySet()) { |
|
|
|
String parentId=kv.getKey(); |
|
|
|
List<XmProjectPhase> children=kv.getValue(); |
|
|
|
BigDecimal phaseTotalBudgetAt=BigDecimal.ZERO; |
|
|
|
List<String> excludeIds=children.stream().map(i->i.getId()).collect(Collectors.toList()); |
|
|
|
for (XmProjectPhase child : children) { |
|
|
|
phaseTotalBudgetAt=phaseTotalBudgetAt.add(child.getPhaseBudgetAt()); |
|
|
|
} |
|
|
|
Tips tips2=xmProjectPhaseService.judgetPhaseBudget(parentId,phaseTotalBudgetAt,null,null,null,excludeIds); |
|
|
|
if(!tips2.isOk()){ |
|
|
|
tips2.setFailureMsg(tips2.getMsg()+" 相关计划为【"+children.stream().map(i->i.getPhaseName()).collect(Collectors.joining(","))+"】"); |
|
|
|
return ResponseHelper.failed(tips2); |
|
|
|
} |
|
|
|
} |
|
|
|
}else{//直接导入到项目之下,需要判断当前一级预算是否超出项目总预算 |
|
|
|
BigDecimal phaseTotalBudgetWorkload=BigDecimal.ZERO; |
|
|
|
BigDecimal phaseTotalBudgetAt=BigDecimal.ZERO; |
|
|
|
for (XmProjectPhase l1Phase : l1Phases) { |
|
|
|
phaseTotalBudgetWorkload=phaseTotalBudgetWorkload.add(l1Phase.getPhaseBudgetWorkload()); |
|
|
|
phaseTotalBudgetAt=phaseTotalBudgetAt.add(l1Phase.getPhaseBudgetAt()); |
|
|
|
} |
|
|
|
tips=xmProjectPhaseService.judgetProjectBudget(projectId,phaseTotalBudgetAt,null,null,null,l1Phases.stream().map(i->i.getId()).collect(Collectors.toList())); |
|
|
|
if(!tips.isOk()){ |
|
|
|
return ResponseHelper.failed(tips); |
|
|
|
} |
|
|
|
} |
|
|
|
if(tips.isOk()) { |
|
|
|
for (XmProjectPhase projectPhase : xmProjectPhases) { |
|
|
|
projectPhase.setMngUsername(user.getUsername()); |
|
|
|
projectPhase.setMngUserid(user.getUserid()); |
|
|
|
projectPhase.setCtime(new Date()); |
|
|
|
projectPhase.setLtime(new Date()); |
|
|
|
} |
|
|
|
xmProjectPhaseService.parentIdPathsCalcBeforeSave(xmProjectPhases); |
|
|
|
xmProjectPhaseService.doBatchInsert(xmProjectPhases); |
|
|
|
|
|
|
|
for (XmProjectPhase phase : xmProjectPhases) { |
|
|
|
xmRecordService.addProjectPhaseRecord(phase.getProjectId(), phase.getId(), "项目-计划-新增计划", "新增计划"+phase.getPhaseName(),JSON.toJSONString(phase),null); |
|
|
|
|
|
|
|
} |
|
|
|
}else { |
|
|
|
tips=judgetTips; |
|
|
|
} |
|
|
|
|
|
|
|
}catch (BizException e) { |
|
|
|
@ -583,35 +599,62 @@ public class XmProjectPhaseController { |
|
|
|
return m; |
|
|
|
} |
|
|
|
XmProjectPhase xmProjectPhase=xmProjectPhases.get(0); |
|
|
|
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId()); |
|
|
|
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); |
|
|
|
User user = LoginUtils.getCurrentUserInfo(); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectManager(groupVoList,user.getUserid()); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectAdm(xmProject,user.getUserid()); |
|
|
|
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid()); |
|
|
|
if( !meIsPm && !meIsTeamHead ){ |
|
|
|
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许修改计划预算"); |
|
|
|
m.put("tips", tips); |
|
|
|
return m; |
|
|
|
} |
|
|
|
BigDecimal phaseBudgetCost=BigDecimal.ZERO; |
|
|
|
BigDecimal phaseBudgetInnerUserAt=BigDecimal.ZERO; |
|
|
|
BigDecimal phaseBudgetOutUserAt=BigDecimal.ZERO; |
|
|
|
BigDecimal phaseBudgetNouserAt=BigDecimal.ZERO; |
|
|
|
String projectId=null; |
|
|
|
BigDecimal zero=BigDecimal.ZERO; |
|
|
|
List<String> excludePhaseIds=new ArrayList<>(); |
|
|
|
for (XmProjectPhase g : xmProjectPhases) { |
|
|
|
projectId=g.getProjectId(); |
|
|
|
phaseBudgetInnerUserAt=phaseBudgetInnerUserAt.add(NumberUtil.getBigDecimal(g.getPhaseBudgetInnerUserAt(),zero)); |
|
|
|
phaseBudgetOutUserAt=phaseBudgetOutUserAt.add(NumberUtil.getBigDecimal(g.getPhaseBudgetOutUserAt(),zero)); |
|
|
|
phaseBudgetNouserAt=phaseBudgetNouserAt.add(NumberUtil.getBigDecimal(g.getPhaseBudgetNouserAt(),zero)); |
|
|
|
g=xmProjectPhaseService.autoCalcWorkload(g); |
|
|
|
|
|
|
|
excludePhaseIds.add(g.getId()); |
|
|
|
} |
|
|
|
phaseBudgetCost=phaseBudgetCost.add(phaseBudgetInnerUserAt).add(phaseBudgetOutUserAt).add(phaseBudgetNouserAt); |
|
|
|
|
|
|
|
Tips judgetTips=xmProjectPhaseService.judgetBudget(projectId, phaseBudgetCost,phaseBudgetInnerUserAt,phaseBudgetOutUserAt,phaseBudgetNouserAt,excludePhaseIds); |
|
|
|
if(judgetTips.isOk()) { |
|
|
|
List<XmProjectPhase> l1Phases=xmProjectPhases.stream().filter(i->1==i.getLvl()).collect(Collectors.toList()); |
|
|
|
if(l1Phases==null ||l1Phases.size()==0){//如果是导入到某个计划之下, |
|
|
|
//找到导入的树中最上面的节点 |
|
|
|
List<XmProjectPhase> noExists=xmProjectPhases.stream().filter(i->!xmProjectPhases.stream().filter(k->k.getId().equals(i.getParentPhaseId())).findAny().isPresent()).collect(Collectors.toList()); |
|
|
|
//根据同一个父亲归类 |
|
|
|
Map<String,List<XmProjectPhase>> map=new HashMap<>(); |
|
|
|
for (XmProjectPhase noExist : noExists) { |
|
|
|
List<XmProjectPhase> phases=map.get(noExist.getParentPhaseId()); |
|
|
|
if(phases==null){ |
|
|
|
phases=new ArrayList<>(); |
|
|
|
map.put(noExist.getParentPhaseId(),phases); |
|
|
|
} |
|
|
|
phases.add(noExist); |
|
|
|
} |
|
|
|
for (Map.Entry<String, List<XmProjectPhase>> kv : map.entrySet()) { |
|
|
|
String parentId=kv.getKey(); |
|
|
|
List<XmProjectPhase> children=kv.getValue(); |
|
|
|
BigDecimal phaseTotalBudgetAt=BigDecimal.ZERO; |
|
|
|
List<String> excludeIds=children.stream().map(i->i.getId()).collect(Collectors.toList()); |
|
|
|
for (XmProjectPhase child : children) { |
|
|
|
phaseTotalBudgetAt=phaseTotalBudgetAt.add(child.getPhaseBudgetAt()); |
|
|
|
} |
|
|
|
Tips tips2=xmProjectPhaseService.judgetPhaseBudget(parentId,phaseTotalBudgetAt,null,null,null,excludeIds); |
|
|
|
if(!tips2.isOk()){ |
|
|
|
tips2.setFailureMsg(tips2.getMsg()+" 相关计划为【"+children.stream().map(i->i.getPhaseName()).collect(Collectors.joining(","))+"】"); |
|
|
|
return ResponseHelper.failed(tips2); |
|
|
|
} |
|
|
|
} |
|
|
|
}else{//直接导入到项目之下,需要判断当前一级预算是否超出项目总预算 |
|
|
|
BigDecimal phaseTotalBudgetWorkload=BigDecimal.ZERO; |
|
|
|
BigDecimal phaseTotalBudgetAt=BigDecimal.ZERO; |
|
|
|
for (XmProjectPhase l1Phase : l1Phases) { |
|
|
|
phaseTotalBudgetWorkload=phaseTotalBudgetWorkload.add(l1Phase.getPhaseBudgetWorkload()); |
|
|
|
phaseTotalBudgetAt=phaseTotalBudgetAt.add(l1Phase.getPhaseBudgetAt()); |
|
|
|
} |
|
|
|
tips=xmProjectPhaseService.judgetProjectBudget(projectId,phaseTotalBudgetAt,null,null,null,l1Phases.stream().map(i->i.getId()).collect(Collectors.toList())); |
|
|
|
if(!tips.isOk()){ |
|
|
|
return ResponseHelper.failed(tips); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
for (XmProjectPhaseVo projectPhase : xmProjectPhases) { |
|
|
|
if(!"1".equals(projectPhase.getNtype()) && !"add".equals(projectPhase.getOpType())&& !"addSub".equals(projectPhase.getOpType())){ |
|
|
|
@ -633,9 +676,6 @@ public class XmProjectPhaseController { |
|
|
|
xmRecordService.addProjectPhaseRecord(phase.getProjectId(), phase.getId(), "项目-计划-修改计划预算", "修改计划"+phase.getPhaseName(),JSON.toJSONString(phase),null); |
|
|
|
|
|
|
|
} |
|
|
|
}else { |
|
|
|
tips=judgetTips; |
|
|
|
} |
|
|
|
|
|
|
|
}catch (BizException e) { |
|
|
|
tips=e.getTips(); |
|
|
|
@ -660,14 +700,19 @@ public class XmProjectPhaseController { |
|
|
|
String projectId=(String) params.get("projectId"); |
|
|
|
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(projectId); |
|
|
|
User user = LoginUtils.getCurrentUserInfo(); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectManager(groupVoList,user.getUserid()); |
|
|
|
|
|
|
|
XmProject xmProject=this.xmProjectService.getProjectFromCache(projectId); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectAdm(xmProject,user.getUserid()); |
|
|
|
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid()); |
|
|
|
if( !meIsPm && !meIsTeamHead ){ |
|
|
|
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许发起计划统计任务"); |
|
|
|
m.put("tips", tips); |
|
|
|
return m; |
|
|
|
} |
|
|
|
int i= xmProjectPhaseService.loadTasksToXmProjectPhase((String) params.get("projectId")); |
|
|
|
int i= xmProjectPhaseService.loadTasksToXmProjectPhase(xmProject.getId()); |
|
|
|
xmRecordService.addProjectPhaseRecord(xmProject.getId(), "", "项目-计划-汇总统计", "计算项目计划进度","",null); |
|
|
|
|
|
|
|
|
|
|
|
}catch (BizException e) { |
|
|
|
tips=e.getTips(); |
|
|
|
logger.error("",e); |
|
|
|
@ -679,11 +724,11 @@ public class XmProjectPhaseController { |
|
|
|
return m; |
|
|
|
} |
|
|
|
|
|
|
|
@ApiOperation( value = "计算bug、task、测试案例、等数据",notes="loadTasksToXmProjectPhase") |
|
|
|
@ApiOperation( value = "关键路径计算",notes="calcKeyPaths") |
|
|
|
@ApiResponses({ |
|
|
|
@ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}") |
|
|
|
}) |
|
|
|
@HasQx(value = "xm_core_xmProjectPhase_loadTasksToXmProjectPhase",name = "计算各个计划对应的bug、task、测试案例等数据",categoryId = "admin-xm",categoryName = "管理端-项目管理系统") |
|
|
|
@HasQx(value = "xm_core_xmProjectPhase_calcKeyPaths",name = "关键路径计算",categoryId = "admin-xm",categoryName = "管理端-项目管理系统") |
|
|
|
@RequestMapping(value="/calcKeyPaths",method=RequestMethod.POST) |
|
|
|
public Map<String,Object> calcKeyPaths(@RequestBody Map<String,Object> params) { |
|
|
|
Map<String,Object> m = new HashMap<>(); |
|
|
|
@ -692,7 +737,9 @@ public class XmProjectPhaseController { |
|
|
|
String projectId=(String) params.get("projectId"); |
|
|
|
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(projectId); |
|
|
|
User user = LoginUtils.getCurrentUserInfo(); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectManager(groupVoList,user.getUserid()); |
|
|
|
|
|
|
|
XmProject xmProject=this.xmProjectService.getProjectFromCache(projectId); |
|
|
|
boolean meIsPm=groupService.checkUserIsProjectAdm(xmProject,user.getUserid()); |
|
|
|
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid()); |
|
|
|
if( !meIsPm && !meIsTeamHead ){ |
|
|
|
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许发起关键路径计算任务"); |
|
|
|
@ -700,6 +747,8 @@ public class XmProjectPhaseController { |
|
|
|
return m; |
|
|
|
} |
|
|
|
xmProjectPhaseService.calcKeyPaths((String) params.get("projectId")); |
|
|
|
xmRecordService.addProjectPhaseRecord(xmProject.getId(), "", "项目-计划-关键路径计算", "计算项目计划关键路径","",null); |
|
|
|
|
|
|
|
}catch (BizException e) { |
|
|
|
tips=e.getTips(); |
|
|
|
logger.error("",e); |
|
|
|
|