Browse Source

添加节点类型、标签等

master
陈裕财 4 years ago
parent
commit
c2ee672b0b
  1. 165
      xm-core/src/main/java/com/xm/core/ctrl/XmProductPhaseController.java
  2. 223
      xm-core/src/main/java/com/xm/core/ctrl/XmProjectPhaseController.java
  3. 4
      xm-core/src/main/java/com/xm/core/service/XmProjectPhaseService.java

165
xm-core/src/main/java/com/xm/core/ctrl/XmProductPhaseController.java

@ -244,21 +244,17 @@ public class XmProductPhaseController {
m.put("tips", tips); m.put("tips", tips);
return m; return m;
} }
BigDecimal phaseBudgetCost=BigDecimal.ZERO;
BigDecimal zero=BigDecimal.ZERO;
String productId=xmProjectPhase.getProductId();
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<>(); List<String> excludePhaseIds=new ArrayList<>();
excludePhaseIds.add(xmProjectPhase.getId()); excludePhaseIds.add(xmProjectPhase.getId());
if(!StringUtils.hasText(xmProjectPhase.getParentPhaseId())){//如果为顶级计划预算不能大于产品总预算
Tips judgetTips=xmProjectPhaseService.judgetProductBudget(productId, phaseBudgetCost,phaseBudgetInnerUserAt,phaseBudgetOutUserAt,phaseBudgetNouserAt,excludePhaseIds);
if(!judgetTips.isOk()){
return ResponseHelper.failed(judgetTips);
xmProjectPhaseService.parentIdPathsCalcBeforeSave(xmProjectPhase);
if(xmProjectPhase.getLvl()==1){
tips=xmProjectPhaseService.judgetProductBudget(xmProduct.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);
} }
}else{
XmProjectPhase parentDb=xmProjectPhaseService.selectOneObject(new XmProjectPhase(xmProjectPhase.getParentPhaseId())); XmProjectPhase parentDb=xmProjectPhaseService.selectOneObject(new XmProjectPhase(xmProjectPhase.getParentPhaseId()));
if(parentDb==null){ if(parentDb==null){
return ResponseHelper.failed("p-no-exists","上级计划不存在"); return ResponseHelper.failed("p-no-exists","上级计划不存在");
@ -266,14 +262,8 @@ public class XmProductPhaseController {
if(!"1".equals(parentDb.getNtype())){ if(!"1".equals(parentDb.getNtype())){
return ResponseHelper.failed("p-ntype-no-1","上级【"+parentDb.getPhaseName()+"】不是计划集,不能在其之下建立子计划"); 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); xmProjectPhaseService.insert(xmProjectPhase);
xmRecordService.addProductPhaseRecord(productId, xmProjectPhase.getId(), "产品-计划-新增计划", "新增计划"+xmProjectPhase.getPhaseName(),JSON.toJSONString(xmProjectPhase),null);
xmRecordService.addProductPhaseRecord(xmProduct.getId(), xmProjectPhase.getId(), "产品-计划-新增计划", "新增计划"+xmProjectPhase.getPhaseName(),JSON.toJSONString(xmProjectPhase),null);
m.put("data",xmProjectPhase); m.put("data",xmProjectPhase);
}catch (BizException e) { }catch (BizException e) {
tips=e.getTips(); tips=e.getTips();
@ -370,25 +360,20 @@ public class XmProductPhaseController {
m.put("tips", tips); m.put("tips", tips);
return m; return m;
} }
BigDecimal phaseBudgetCost=BigDecimal.ZERO;
String productId=null;
BigDecimal zero=BigDecimal.ZERO;
productId=xmProjectPhase.getProductId();
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<>(); List<String> excludePhaseIds=new ArrayList<>();
excludePhaseIds.add(xmProjectPhase.getId()); excludePhaseIds.add(xmProjectPhase.getId());
Tips judgetTips=xmProjectPhaseService.judgetBudget(productId, phaseBudgetCost,phaseBudgetInnerUserAt,phaseBudgetOutUserAt,phaseBudgetNouserAt,excludePhaseIds);
if(judgetTips.isOk()) {
if(xmProjectPhase.getLvl()==1){
tips=this.xmProjectPhaseService.judgetProductBudget(xmProduct.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); xmProjectPhase=xmProjectPhaseService.autoCalcWorkload(xmProjectPhase);
xmProjectPhaseService.editByPk(xmProjectPhase); xmProjectPhaseService.editByPk(xmProjectPhase);
xmRecordService.addProductPhaseRecord(xmProjectPhase.getProductId(), xmProjectPhase.getId(), "产品-计划-修改计划", "修改计划"+xmProjectPhase.getPhaseName(),JSON.toJSONString(xmProjectPhase),null); xmRecordService.addProductPhaseRecord(xmProjectPhase.getProductId(), xmProjectPhase.getId(), "产品-计划-修改计划", "修改计划"+xmProjectPhase.getPhaseName(),JSON.toJSONString(xmProjectPhase),null);
}else {
tips=judgetTips;
}
m.put("data",xmProjectPhase); m.put("data",xmProjectPhase);
}catch (BizException e) { }catch (BizException e) {
tips=e.getTips(); tips=e.getTips();
@ -520,47 +505,74 @@ public class XmProductPhaseController {
List<XmProjectGroupVo> groupVoList=groupService.getProductGroupVoList(xmProjectPhase.getProductId()); List<XmProjectGroupVo> groupVoList=groupService.getProductGroupVoList(xmProjectPhase.getProductId());
User user = LoginUtils.getCurrentUserInfo(); User user = LoginUtils.getCurrentUserInfo();
boolean meIsPm=groupService.checkUserIsProductAdm(xmProduct,user.getUserid()); boolean meIsPm=groupService.checkUserIsProductAdm(xmProduct,user.getUserid());
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid());
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHeadOrAss(groupVoList,user.getUserid(),user.getUserid());
if( !meIsPm && !meIsTeamHead ){ if( !meIsPm && !meIsTeamHead ){
tips.setFailureMsg("您不是组长、也不是产品管理者,不允许批量导入计划"); tips.setFailureMsg("您不是组长、也不是产品管理者,不允许批量导入计划");
m.put("tips", tips); m.put("tips", tips);
return m; return m;
} }
BigDecimal phaseBudgetCost=BigDecimal.ZERO;
BigDecimal phaseBudgetInnerUserAt=BigDecimal.ZERO;
BigDecimal phaseBudgetOutUserAt=BigDecimal.ZERO;
BigDecimal phaseBudgetNouserAt=BigDecimal.ZERO;
String productId=null; String productId=null;
BigDecimal zero=BigDecimal.ZERO;
for (XmProjectPhase g : xmProjectPhases) { for (XmProjectPhase g : xmProjectPhases) {
productId=g.getProductId(); productId=g.getProductId();
g.setMngUserid(user.getUserid()); g.setMngUserid(user.getUserid());
g.setMngUsername(user.getUsername()); 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); g=xmProjectPhaseService.autoCalcWorkload(g);
} }
Tips judgetTips=xmProjectPhaseService.judgetBudget(productId, 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.judgetProductBudget(productId,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) { for (XmProjectPhase projectPhase : xmProjectPhases) {
projectPhase.setMngUsername(user.getUsername()); projectPhase.setMngUsername(user.getUsername());
projectPhase.setMngUserid(user.getUserid()); projectPhase.setMngUserid(user.getUserid());
projectPhase.setCtime(new Date()); projectPhase.setCtime(new Date());
projectPhase.setLtime(new Date()); projectPhase.setLtime(new Date());
} }
xmProjectPhaseService.parentIdPathsCalcBeforeSave(xmProjectPhases);
xmProjectPhaseService.doBatchInsert(xmProjectPhases); xmProjectPhaseService.doBatchInsert(xmProjectPhases);
for (XmProjectPhase phase : xmProjectPhases) { for (XmProjectPhase phase : xmProjectPhases) {
xmRecordService.addProductPhaseRecord(phase.getProductId(), phase.getId(), "产品-计划-新增计划", "新增计划"+phase.getPhaseName(),JSON.toJSONString(phase),null); xmRecordService.addProductPhaseRecord(phase.getProductId(), phase.getId(), "产品-计划-新增计划", "新增计划"+phase.getPhaseName(),JSON.toJSONString(phase),null);
} }
}else {
tips=judgetTips;
} }
}catch (BizException e) { }catch (BizException e) {
@ -600,26 +612,52 @@ public class XmProductPhaseController {
m.put("tips", tips); m.put("tips", tips);
return m; return m;
} }
BigDecimal phaseBudgetCost=BigDecimal.ZERO;
BigDecimal phaseBudgetInnerUserAt=BigDecimal.ZERO;
BigDecimal phaseBudgetOutUserAt=BigDecimal.ZERO;
BigDecimal phaseBudgetNouserAt=BigDecimal.ZERO;
String productId=null; String productId=null;
BigDecimal zero=BigDecimal.ZERO;
List<String> excludePhaseIds=new ArrayList<>(); List<String> excludePhaseIds=new ArrayList<>();
for (XmProjectPhase g : xmProjectPhases) { for (XmProjectPhase g : xmProjectPhases) {
productId=g.getProductId(); productId=g.getProductId();
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); g=xmProjectPhaseService.autoCalcWorkload(g);
excludePhaseIds.add(g.getId());
} }
phaseBudgetCost=phaseBudgetCost.add(phaseBudgetInnerUserAt).add(phaseBudgetOutUserAt).add(phaseBudgetNouserAt);
Tips judgetTips=xmProjectPhaseService.judgetBudget(productId, 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.judgetProductBudget(productId,phaseTotalBudgetAt,null,null,null,l1Phases.stream().map(i->i.getId()).collect(Collectors.toList()));
if(!tips.isOk()){
return ResponseHelper.failed(tips);
}
}
for (XmProjectPhaseVo projectPhase : xmProjectPhases) { for (XmProjectPhaseVo projectPhase : xmProjectPhases) {
if(!"1".equals(projectPhase.getNtype()) && !"add".equals(projectPhase.getOpType())&& !"addSub".equals(projectPhase.getOpType())){ if(!"1".equals(projectPhase.getNtype()) && !"add".equals(projectPhase.getOpType())&& !"addSub".equals(projectPhase.getOpType())){
@ -641,9 +679,6 @@ public class XmProductPhaseController {
xmRecordService.addProductPhaseRecord(phase.getProductId(), phase.getId(), "产品-计划-修改计划预算", "修改计划"+phase.getPhaseName(),JSON.toJSONString(phase),null); xmRecordService.addProductPhaseRecord(phase.getProductId(), phase.getId(), "产品-计划-修改计划预算", "修改计划"+phase.getPhaseName(),JSON.toJSONString(phase),null);
} }
}else {
tips=judgetTips;
}
}catch (BizException e) { }catch (BizException e) {
tips=e.getTips(); tips=e.getTips();

223
xm-core/src/main/java/com/xm/core/ctrl/XmProjectPhaseController.java

@ -11,11 +11,9 @@ import com.mdp.qx.HasQx;
import com.mdp.safe.client.entity.User; import com.mdp.safe.client.entity.User;
import com.mdp.safe.client.utils.LoginUtils; import com.mdp.safe.client.utils.LoginUtils;
import com.xm.core.PubTool; import com.xm.core.PubTool;
import com.xm.core.entity.XmProject;
import com.xm.core.entity.XmProjectPhase; 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.XmProjectGroupVo;
import com.xm.core.vo.XmProjectPhaseVo; import com.xm.core.vo.XmProjectPhaseVo;
import io.swagger.annotations.*; import io.swagger.annotations.*;
@ -57,6 +55,8 @@ public class XmProjectPhaseController {
@Autowired @Autowired
private XmProjectService xmProjectService; private XmProjectService xmProjectService;
@Autowired @Autowired
XmRecordService xmRecordService; XmRecordService xmRecordService;
@ -155,10 +155,6 @@ public class XmProjectPhaseController {
tips.setFailureMsg("计划编号不能为空"); tips.setFailureMsg("计划编号不能为空");
m.put("tips", tips); m.put("tips", tips);
return m; return m;
}else if(StringUtils.isEmpty(xmProjectPhase.getId())) {
tips.setFailureMsg("计划编号不能为空");
m.put("tips", tips);
return m;
}else{ }else{
XmProjectPhase xmProjectPhaseQuery = new XmProjectPhase(xmProjectPhase.getId()); XmProjectPhase xmProjectPhaseQuery = new XmProjectPhase(xmProjectPhase.getId());
XmProjectPhase xmProjectPhaseDb=this.xmProjectPhaseService.selectOneObject(xmProjectPhaseQuery); XmProjectPhase xmProjectPhaseDb=this.xmProjectPhaseService.selectOneObject(xmProjectPhaseQuery);
@ -167,9 +163,10 @@ public class XmProjectPhaseController {
m.put("tips", tips); m.put("tips", tips);
return m; return m;
} }
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhaseDb.getProjectId());
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhaseDb.getProjectId()); List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhaseDb.getProjectId());
User user = LoginUtils.getCurrentUserInfo(); 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()); boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid());
if( !meIsPm && !meIsTeamHead ){ if( !meIsPm && !meIsTeamHead ){
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许设置计划负责人"); tips.setFailureMsg("您不是组长、也不是项目管理者,不允许设置计划负责人");
@ -188,6 +185,7 @@ public class XmProjectPhaseController {
xmProjectPhaseToUpdate.setMngUserid(xmProjectPhase.getMngUserid()); xmProjectPhaseToUpdate.setMngUserid(xmProjectPhase.getMngUserid());
xmProjectPhaseToUpdate.setMngUsername(xmProjectPhase.getMngUsername()); xmProjectPhaseToUpdate.setMngUsername(xmProjectPhase.getMngUsername());
this.xmProjectPhaseService.updateSomeFieldByPk(xmProjectPhaseToUpdate); 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.setMngUserid(user.getUserid());
xmProjectPhase.setMngUsername(user.getUsername()); xmProjectPhase.setMngUsername(user.getUsername());
} }
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId());
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(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()); boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid());
if( !meIsPm && !meIsTeamHead ){ if( !meIsPm && !meIsTeamHead ){
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许设置计划负责人"); tips.setFailureMsg("您不是组长、也不是项目管理者,不允许设置计划负责人");
@ -242,22 +241,17 @@ public class XmProjectPhaseController {
m.put("tips", tips); m.put("tips", tips);
return m; 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<>(); List<String> excludePhaseIds=new ArrayList<>();
excludePhaseIds.add(xmProjectPhase.getId()); 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);
} }
}else{
XmProjectPhase parentDb=xmProjectPhaseService.selectOneObject(new XmProjectPhase(xmProjectPhase.getParentPhaseId())); XmProjectPhase parentDb=xmProjectPhaseService.selectOneObject(new XmProjectPhase(xmProjectPhase.getParentPhaseId()));
if(parentDb==null){ if(parentDb==null){
return ResponseHelper.failed("p-no-exists","上级计划不存在"); return ResponseHelper.failed("p-no-exists","上级计划不存在");
@ -265,14 +259,8 @@ public class XmProjectPhaseController {
if(!"1".equals(parentDb.getNtype())){ if(!"1".equals(parentDb.getNtype())){
return ResponseHelper.failed("p-ntype-no-1","上级【"+parentDb.getPhaseName()+"】不是计划集,不能在其之下建立子计划"); 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); 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); m.put("data",xmProjectPhase);
}catch (BizException e) { }catch (BizException e) {
tips=e.getTips(); tips=e.getTips();
@ -295,9 +283,10 @@ public class XmProjectPhaseController {
Map<String,Object> m = new HashMap<>(); Map<String,Object> m = new HashMap<>();
Tips tips=new Tips("成功删除一条数据"); Tips tips=new Tips("成功删除一条数据");
try{ try{
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId());
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId());
User user = LoginUtils.getCurrentUserInfo(); 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()); boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid());
if( !meIsPm && !meIsTeamHead ){ if( !meIsPm && !meIsTeamHead ){
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许删除计划"); tips.setFailureMsg("您不是组长、也不是项目管理者,不允许删除计划");
@ -320,7 +309,7 @@ public class XmProjectPhaseController {
tips.setFailureMsg("存在"+xmProjectPhaseDb.getChildrenCnt()+"条子计划,不允许删除"); tips.setFailureMsg("存在"+xmProjectPhaseDb.getChildrenCnt()+"条子计划,不允许删除");
} else { } else {
xmProjectPhaseService.deleteByPk(xmProjectPhaseDb); 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<>(); Map<String,Object> m = new HashMap<>();
Tips tips=new Tips("成功更新一条数据"); Tips tips=new Tips("成功更新一条数据");
try{ try{
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId());
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId());
User user = LoginUtils.getCurrentUserInfo(); 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()); boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid());
if( !meIsPm && !meIsTeamHead ){ if( !meIsPm && !meIsTeamHead ){
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许修改计划"); tips.setFailureMsg("您不是组长、也不是项目管理者,不允许修改计划");
@ -367,25 +357,20 @@ public class XmProjectPhaseController {
m.put("tips", tips); m.put("tips", tips);
return m; 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<>(); List<String> excludePhaseIds=new ArrayList<>();
excludePhaseIds.add(xmProjectPhase.getId()); 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); xmProjectPhase=xmProjectPhaseService.autoCalcWorkload(xmProjectPhase);
xmProjectPhaseService.editByPk(xmProjectPhase); xmProjectPhaseService.editByPk(xmProjectPhase);
xmRecordService.addProjectPhaseRecord(xmProjectPhase.getProjectId(), xmProjectPhase.getId(), "项目-计划-修改计划", "修改计划"+xmProjectPhase.getPhaseName(),JSON.toJSONString(xmProjectPhase),null); xmRecordService.addProjectPhaseRecord(xmProjectPhase.getProjectId(), xmProjectPhase.getId(), "项目-计划-修改计划", "修改计划"+xmProjectPhase.getPhaseName(),JSON.toJSONString(xmProjectPhase),null);
}else {
tips=judgetTips;
}
m.put("data",xmProjectPhase); m.put("data",xmProjectPhase);
}catch (BizException e) { }catch (BizException e) {
tips=e.getTips(); tips=e.getTips();
@ -422,11 +407,12 @@ public class XmProjectPhaseController {
m.put("tips", tips); m.put("tips", tips);
return m; return m;
} }
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId());
List<String> existsTaskList=new ArrayList<>(); List<String> existsTaskList=new ArrayList<>();
List<String> hasChildList=new ArrayList<>(); List<String> hasChildList=new ArrayList<>();
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId());
User user = LoginUtils.getCurrentUserInfo(); 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()); boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid());
if( !meIsPm && !meIsTeamHead ){ if( !meIsPm && !meIsTeamHead ){
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许删除计划"); tips.setFailureMsg("您不是组长、也不是项目管理者,不允许删除计划");
@ -462,6 +448,8 @@ public class XmProjectPhaseController {
} }
if(canDelNodes.size()>0){ if(canDelNodes.size()>0){
this.xmProjectPhaseService.doBatchDelete(canDelNodes); 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<>(); List<String> msgs=new ArrayList<>();
msgs.add("成功删除"+canDelNodes.size()+"条数据。"); msgs.add("成功删除"+canDelNodes.size()+"条数据。");
@ -510,50 +498,78 @@ public class XmProjectPhaseController {
return m; return m;
} }
XmProjectPhase xmProjectPhase=xmProjectPhases.get(0); XmProjectPhase xmProjectPhase=xmProjectPhases.get(0);
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId());
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId());
User user = LoginUtils.getCurrentUserInfo(); 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 ){ if( !meIsPm && !meIsTeamHead ){
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许批量导入计划"); tips.setFailureMsg("您不是组长、也不是项目管理者,不允许批量导入计划");
m.put("tips", tips); m.put("tips", tips);
return m; return m;
} }
BigDecimal phaseBudgetCost=BigDecimal.ZERO;
BigDecimal phaseBudgetInnerUserAt=BigDecimal.ZERO;
BigDecimal phaseBudgetOutUserAt=BigDecimal.ZERO;
BigDecimal phaseBudgetNouserAt=BigDecimal.ZERO;
String projectId=null; String projectId=null;
BigDecimal zero=BigDecimal.ZERO;
for (XmProjectPhase g : xmProjectPhases) { for (XmProjectPhase g : xmProjectPhases) {
projectId=g.getProjectId(); projectId=g.getProjectId();
g.setMngUserid(user.getUserid()); g.setMngUserid(user.getUserid());
g.setMngUsername(user.getUsername()); 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); 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) { for (XmProjectPhase projectPhase : xmProjectPhases) {
projectPhase.setMngUsername(user.getUsername()); projectPhase.setMngUsername(user.getUsername());
projectPhase.setMngUserid(user.getUserid()); projectPhase.setMngUserid(user.getUserid());
projectPhase.setCtime(new Date()); projectPhase.setCtime(new Date());
projectPhase.setLtime(new Date()); projectPhase.setLtime(new Date());
} }
xmProjectPhaseService.parentIdPathsCalcBeforeSave(xmProjectPhases);
xmProjectPhaseService.doBatchInsert(xmProjectPhases); xmProjectPhaseService.doBatchInsert(xmProjectPhases);
for (XmProjectPhase phase : xmProjectPhases) { for (XmProjectPhase phase : xmProjectPhases) {
xmRecordService.addProjectPhaseRecord(phase.getProjectId(), phase.getId(), "项目-计划-新增计划", "新增计划"+phase.getPhaseName(),JSON.toJSONString(phase),null); xmRecordService.addProjectPhaseRecord(phase.getProjectId(), phase.getId(), "项目-计划-新增计划", "新增计划"+phase.getPhaseName(),JSON.toJSONString(phase),null);
} }
}else {
tips=judgetTips;
} }
}catch (BizException e) { }catch (BizException e) {
@ -583,35 +599,62 @@ public class XmProjectPhaseController {
return m; return m;
} }
XmProjectPhase xmProjectPhase=xmProjectPhases.get(0); XmProjectPhase xmProjectPhase=xmProjectPhases.get(0);
XmProject xmProject=this.xmProjectService.getProjectFromCache(xmProjectPhase.getProjectId());
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId()); List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(xmProjectPhase.getProjectId());
User user = LoginUtils.getCurrentUserInfo(); 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()); boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid());
if( !meIsPm && !meIsTeamHead ){ if( !meIsPm && !meIsTeamHead ){
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许修改计划预算"); tips.setFailureMsg("您不是组长、也不是项目管理者,不允许修改计划预算");
m.put("tips", tips); m.put("tips", tips);
return m; return m;
} }
BigDecimal phaseBudgetCost=BigDecimal.ZERO;
BigDecimal phaseBudgetInnerUserAt=BigDecimal.ZERO;
BigDecimal phaseBudgetOutUserAt=BigDecimal.ZERO;
BigDecimal phaseBudgetNouserAt=BigDecimal.ZERO;
String projectId=null; String projectId=null;
BigDecimal zero=BigDecimal.ZERO;
List<String> excludePhaseIds=new ArrayList<>(); List<String> excludePhaseIds=new ArrayList<>();
for (XmProjectPhase g : xmProjectPhases) { for (XmProjectPhase g : xmProjectPhases) {
projectId=g.getProjectId(); 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); 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) { for (XmProjectPhaseVo projectPhase : xmProjectPhases) {
if(!"1".equals(projectPhase.getNtype()) && !"add".equals(projectPhase.getOpType())&& !"addSub".equals(projectPhase.getOpType())){ 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); xmRecordService.addProjectPhaseRecord(phase.getProjectId(), phase.getId(), "项目-计划-修改计划预算", "修改计划"+phase.getPhaseName(),JSON.toJSONString(phase),null);
} }
}else {
tips=judgetTips;
}
}catch (BizException e) { }catch (BizException e) {
tips=e.getTips(); tips=e.getTips();
@ -660,14 +700,19 @@ public class XmProjectPhaseController {
String projectId=(String) params.get("projectId"); String projectId=(String) params.get("projectId");
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(projectId); List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(projectId);
User user = LoginUtils.getCurrentUserInfo(); 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()); boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid());
if( !meIsPm && !meIsTeamHead ){ if( !meIsPm && !meIsTeamHead ){
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许发起计划统计任务"); tips.setFailureMsg("您不是组长、也不是项目管理者,不允许发起计划统计任务");
m.put("tips", tips); m.put("tips", tips);
return m; return m;
} }
int i= xmProjectPhaseService.loadTasksToXmProjectPhase((String) params.get("projectId"));
int i= xmProjectPhaseService.loadTasksToXmProjectPhase(xmProject.getId());
xmRecordService.addProjectPhaseRecord(xmProject.getId(), "", "项目-计划-汇总统计", "计算项目计划进度","",null);
}catch (BizException e) { }catch (BizException e) {
tips=e.getTips(); tips=e.getTips();
logger.error("",e); logger.error("",e);
@ -679,11 +724,11 @@ public class XmProjectPhaseController {
return m; return m;
} }
@ApiOperation( value = "计算bug、task、测试案例、等数据",notes="loadTasksToXmProjectPhase")
@ApiOperation( value = "关键路径计算",notes="calcKeyPaths")
@ApiResponses({ @ApiResponses({
@ApiResponse(code = 200, message = "{tips:{isOk:true/false,msg:'成功/失败原因',tipscode:'失败时错误码'}") @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) @RequestMapping(value="/calcKeyPaths",method=RequestMethod.POST)
public Map<String,Object> calcKeyPaths(@RequestBody Map<String,Object> params) { public Map<String,Object> calcKeyPaths(@RequestBody Map<String,Object> params) {
Map<String,Object> m = new HashMap<>(); Map<String,Object> m = new HashMap<>();
@ -692,7 +737,9 @@ public class XmProjectPhaseController {
String projectId=(String) params.get("projectId"); String projectId=(String) params.get("projectId");
List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(projectId); List<XmProjectGroupVo> groupVoList=groupService.getProjectGroupVoList(projectId);
User user = LoginUtils.getCurrentUserInfo(); 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()); boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid());
if( !meIsPm && !meIsTeamHead ){ if( !meIsPm && !meIsTeamHead ){
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许发起关键路径计算任务"); tips.setFailureMsg("您不是组长、也不是项目管理者,不允许发起关键路径计算任务");
@ -700,6 +747,8 @@ public class XmProjectPhaseController {
return m; return m;
} }
xmProjectPhaseService.calcKeyPaths((String) params.get("projectId")); xmProjectPhaseService.calcKeyPaths((String) params.get("projectId"));
xmRecordService.addProjectPhaseRecord(xmProject.getId(), "", "项目-计划-关键路径计算", "计算项目计划关键路径","",null);
}catch (BizException e) { }catch (BizException e) {
tips=e.getTips(); tips=e.getTips();
logger.error("",e); logger.error("",e);

4
xm-core/src/main/java/com/xm/core/service/XmProjectPhaseService.java

@ -90,7 +90,7 @@ public class XmProjectPhaseService extends BaseService {
* @param excludePhaseIds * @param excludePhaseIds
* @return * @return
*/ */
public Tips judgetBudget(String projectId,BigDecimal addPhaseBudgetCost,BigDecimal addPhaseBudgetInnerUserAt,BigDecimal addPhaseBudgetOutUserAt,BigDecimal addPhaseBudgetNouserAt,List<String> excludePhaseIds){
public Tips judgetProjectBudget(String projectId, BigDecimal addPhaseBudgetCost, BigDecimal addPhaseBudgetInnerUserAt, BigDecimal addPhaseBudgetOutUserAt, BigDecimal addPhaseBudgetNouserAt, List<String> excludePhaseIds){
Tips tips=new Tips("检查预算成功"); Tips tips=new Tips("检查预算成功");
Map<String,Object> g=this.selectTotalProjectAndPhaseBudgetCost(projectId,excludePhaseIds); Map<String,Object> g=this.selectTotalProjectAndPhaseBudgetCost(projectId,excludePhaseIds);
BigDecimal phaseBudgetCost=BigDecimal.ZERO; BigDecimal phaseBudgetCost=BigDecimal.ZERO;
@ -575,5 +575,7 @@ public class XmProjectPhaseService extends BaseService {
} }
return tips; return tips;
} }
} }
Loading…
Cancel
Save