8 changed files with 24 additions and 1543 deletions
-
3xm-core/src/main/java/com/xm/core/ctrl/XmProjectController.java
-
3xm-core/src/main/java/com/xm/core/ctrl/XmTaskController.java
-
920xm-core/src/main/java/com/xm/core/entity/XmPhase.java
-
26xm-core/src/main/java/com/xm/core/service/XmGroupService.java
-
588xm-core/src/main/java/com/xm/core/service/XmPhaseService.java
-
4xm-core/src/main/java/com/xm/core/service/XmProductService.java
-
2xm-core/src/main/java/com/xm/core/service/XmProjectService.java
-
21xm-core/src/main/java/com/xm/core/vo/XmPhaseVo.java
@ -1,920 +0,0 @@ |
|||
package com.xm.core.entity; |
|||
|
|||
import io.swagger.annotations.ApiModel; |
|||
import io.swagger.annotations.ApiModelProperty; |
|||
|
|||
import java.math.BigDecimal; |
|||
import java.util.Date; |
|||
|
|||
/** |
|||
* 组织 com 顶级模块 xm 大模块 core 小模块 <br> |
|||
* 实体 XmPhase所有属性名: <br> |
|||
* id,name,remark,parentId,branchId,projectId,beginDate,endDate,budgetHours,budgetStaffNu,ctime,budgetNouserAt,budgetIuserAt,budgetOuserAt,baselineId,bizProcInstId,bizFlowState,budgetWorkload,actWorkload,actIuserWorkload,actOuserWorkload,taskType,planType,seqNo,budgetIuserWorkload,budgetOuserWorkload,actNouserAt,actIuserAt,budgetIuserPrice,budgetOuserPrice,budgetOuserCnt,budgetIuserCnt,actRate,pstatus,actOuserAt,taskCnt,finishTaskCnt,iterationCnt,calcTime,taskBudgetWorkload,taskBudgetAt,mngUserid,mngUsername,milestone,pleaf,tagIds,tagNames,ntype,childrenCnt,ltime,isKeyPath,pidPaths,lvl,isTpl,phaseClass,productId,budgetAt,calcType,actAt;<br> |
|||
* 表 xm_phase 项目、产品计划表(将计划并入任务表,暂时作废),合并进任务表了的所有字段名: <br> |
|||
* id,name,remark,parent_id,branch_id,project_id,begin_date,end_date,budget_hours,budget_staff_nu,ctime,budget_nouser_at,budget_iuser_at,budget_ouser_at,baseline_id,biz_proc_inst_id,biz_flow_state,budget_workload,act_workload,act_iuser_workload,act_ouser_workload,task_type,plan_type,seq_no,budget_iuser_workload,budget_ouser_workload,act_nouser_at,act_iuser_at,budget_iuser_price,budget_ouser_price,budget_ouser_cnt,budget_iuser_cnt,act_rate,pstatus,act_out_user_at,task_cnt,finish_task_cnt,iteration_cnt,calc_time,task_budget_workload,task_budget_at,mng_userid,mng_username,milestone,pleaf,tag_ids,tag_names,ntype,children_cnt,ltime,is_key_path,pid_paths,lvl,is_tpl,phase_class,product_id,budget_at,calc_type,act_at;<br> |
|||
* 当前主键(包括多主键):<br> |
|||
* id;<br> |
|||
*/ |
|||
@ApiModel(description="项目、产品计划表(将计划并入任务表,暂时作废),合并进任务表了") |
|||
public class XmPhase implements java.io.Serializable { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
@ApiModelProperty(notes="阶段主键,主键",allowEmptyValue=true,example="",allowableValues="") |
|||
String id; |
|||
|
|||
|
|||
@ApiModelProperty(notes="阶段名称",allowEmptyValue=true,example="",allowableValues="") |
|||
String name; |
|||
|
|||
@ApiModelProperty(notes="备注",allowEmptyValue=true,example="",allowableValues="") |
|||
String remark; |
|||
|
|||
@ApiModelProperty(notes="上级阶段编号",allowEmptyValue=true,example="",allowableValues="") |
|||
String parentId; |
|||
|
|||
@ApiModelProperty(notes="机构编号",allowEmptyValue=true,example="",allowableValues="") |
|||
String branchId; |
|||
|
|||
@ApiModelProperty(notes="当前项目编号,如果是项目计划,必填项目",allowEmptyValue=true,example="",allowableValues="") |
|||
String projectId; |
|||
|
|||
@ApiModelProperty(notes="开始时间",allowEmptyValue=true,example="",allowableValues="") |
|||
Date beginDate; |
|||
|
|||
@ApiModelProperty(notes="结束时间",allowEmptyValue=true,example="",allowableValues="") |
|||
Date endDate; |
|||
|
|||
@ApiModelProperty(notes="工时(上到下控制大于儿子总数)-应该大于或等于task中总工时",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal budgetHours; |
|||
|
|||
@ApiModelProperty(notes="投入人员数(上到下控制大于儿子总数)-应该大于或等于task中总人数",allowEmptyValue=true,example="",allowableValues="") |
|||
Integer budgetStaffNu; |
|||
|
|||
@ApiModelProperty(notes="创建时间",allowEmptyValue=true,example="",allowableValues="") |
|||
Date ctime; |
|||
|
|||
@ApiModelProperty(notes="非人力成本总预算(上到下控制大于儿子总数)-应该大于或等于task中非人力总成本",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal budgetNouserAt; |
|||
|
|||
@ApiModelProperty(notes="内部人力成本总预算(上到下控制大于儿子总数)-应该大于或等于task中内部人力总成本",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal budgetIuserAt; |
|||
|
|||
@ApiModelProperty(notes="外购人力成本总预算(上到下控制大于儿子总数)-应该大于或等于task中外购总成本",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal budgetOuserAt; |
|||
|
|||
@ApiModelProperty(notes="项目级基线",allowEmptyValue=true,example="",allowableValues="") |
|||
String baselineId; |
|||
|
|||
@ApiModelProperty(notes="当前流程实例编号",allowEmptyValue=true,example="",allowableValues="") |
|||
String bizProcInstId; |
|||
|
|||
@ApiModelProperty(notes="当前流程状态0初始1审批中2审批通过3审批不通过4流程取消或者删除",allowEmptyValue=true,example="",allowableValues="") |
|||
String bizFlowState; |
|||
|
|||
@ApiModelProperty(notes="总工作量单位人时上到下控制大于儿子总数-应该大于或者等于task中的预算总工作量",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal budgetWorkload; |
|||
|
|||
@ApiModelProperty(notes="已完成工作量单位人时-从task中的实际工作量算出",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal actWorkload; |
|||
|
|||
@ApiModelProperty(notes="实际内部人力工作量-来自任务表合计",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal actIuserWorkload; |
|||
|
|||
@ApiModelProperty(notes="实际外购人力工作量-来自任务表合计",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal actOuserWorkload; |
|||
|
|||
@ApiModelProperty(notes="0售前方案1投标2需求3设计4开发5测试6验收7部署8运维--来自基础数据表taskType",allowEmptyValue=true,example="",allowableValues="") |
|||
String taskType; |
|||
|
|||
@ApiModelProperty(notes="计划类型w1-周,w2-2周,w3-3周,m1-1月,m2-2月,q1-季,q2-半年,y1-年",allowEmptyValue=true,example="",allowableValues="") |
|||
String planType; |
|||
|
|||
@ApiModelProperty(notes="顺序号",allowEmptyValue=true,example="",allowableValues="") |
|||
String seqNo; |
|||
|
|||
@ApiModelProperty(notes="内部人力工作量总预算(上到下控制大于儿子总数)-应该大于或等于task中内部人力总成本",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal budgetIuserWorkload; |
|||
|
|||
@ApiModelProperty(notes="外购人力工作量总预算(上到下控制大于儿子总数)-应该大于或等于task中外购总成本",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal budgetOuserWorkload; |
|||
|
|||
@ApiModelProperty(notes="实际非人力成本-来自任务表合计",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal actNouserAt; |
|||
|
|||
@ApiModelProperty(notes="实际内部人力成本-来自任务表合计",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal actIuserAt; |
|||
|
|||
@ApiModelProperty(notes="内部人力成本单价元/人时",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal budgetIuserPrice; |
|||
|
|||
@ApiModelProperty(notes="外购人力成本单价元/人时",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal budgetOuserPrice; |
|||
|
|||
@ApiModelProperty(notes="外购人数",allowEmptyValue=true,example="",allowableValues="") |
|||
Integer budgetOuserCnt; |
|||
|
|||
@ApiModelProperty(notes="内部人数",allowEmptyValue=true,example="",allowableValues="") |
|||
Integer budgetIuserCnt; |
|||
|
|||
@ApiModelProperty(notes="实际进度0-100",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal actRate; |
|||
|
|||
@ApiModelProperty(notes="阶段状态0初始1执行中2完工3关闭4删除中5已删除6暂停",allowEmptyValue=true,example="",allowableValues="") |
|||
String pstatus; |
|||
|
|||
@ApiModelProperty(notes="实际外部人力成本",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal actOuserAt; |
|||
|
|||
@ApiModelProperty(notes="任务数",allowEmptyValue=true,example="",allowableValues="") |
|||
Integer taskCnt; |
|||
|
|||
@ApiModelProperty(notes="完成的任务数",allowEmptyValue=true,example="",allowableValues="") |
|||
Integer finishTaskCnt; |
|||
|
|||
@ApiModelProperty(notes="迭代数",allowEmptyValue=true,example="",allowableValues="") |
|||
Integer iterationCnt; |
|||
|
|||
@ApiModelProperty(notes="统计数据时间",allowEmptyValue=true,example="",allowableValues="") |
|||
Date calcTime; |
|||
|
|||
@ApiModelProperty(notes="从任务汇总的预算工作量",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal taskBudgetWorkload; |
|||
|
|||
@ApiModelProperty(notes="从任务汇总的预算金额",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal taskBudgetAt; |
|||
|
|||
@ApiModelProperty(notes="管理者编号",allowEmptyValue=true,example="",allowableValues="") |
|||
String mngUserid; |
|||
|
|||
@ApiModelProperty(notes="管理者姓名",allowEmptyValue=true,example="",allowableValues="") |
|||
String mngUsername; |
|||
|
|||
@ApiModelProperty(notes="是否里程碑0否1是",allowEmptyValue=true,example="",allowableValues="") |
|||
String milestone; |
|||
|
|||
@ApiModelProperty(notes="节点是否为叶子节点",allowEmptyValue=true,example="",allowableValues="") |
|||
String pleaf; |
|||
|
|||
@ApiModelProperty(notes="标签编号,逗号分割",allowEmptyValue=true,example="",allowableValues="") |
|||
String tagIds; |
|||
|
|||
@ApiModelProperty(notes="标签名称,逗号分割",allowEmptyValue=true,example="",allowableValues="") |
|||
String tagNames; |
|||
|
|||
@ApiModelProperty(notes="节点类型0-任务,1-任务集。任务集下建任务,任务下不允许建立任何子节点",allowEmptyValue=true,example="",allowableValues="") |
|||
String ntype; |
|||
|
|||
@ApiModelProperty(notes="儿子节点个数",allowEmptyValue=true,example="",allowableValues="") |
|||
Integer childrenCnt; |
|||
|
|||
@ApiModelProperty(notes="更新时间",allowEmptyValue=true,example="",allowableValues="") |
|||
Date ltime; |
|||
|
|||
@ApiModelProperty(notes="是否为关键路径上的节点",allowEmptyValue=true,example="",allowableValues="") |
|||
String isKeyPath; |
|||
|
|||
@ApiModelProperty(notes="父级id逗号分割,最后一个为本节点节点编号,以,号结尾",allowEmptyValue=true,example="",allowableValues="") |
|||
String pidPaths; |
|||
|
|||
@ApiModelProperty(notes="层级0-顶级,1-一级,2-二级,3-三级,4-四级。总共5级",allowEmptyValue=true,example="",allowableValues="") |
|||
Integer lvl; |
|||
|
|||
@ApiModelProperty(notes="是否为模板",allowEmptyValue=true,example="",allowableValues="") |
|||
String isTpl; |
|||
|
|||
@ApiModelProperty(notes="计划分类0项目1产品",allowEmptyValue=true,example="",allowableValues="") |
|||
String phaseClass; |
|||
|
|||
@ApiModelProperty(notes="如果是产品计划,必填产品编号,其它的可不填",allowEmptyValue=true,example="",allowableValues="") |
|||
String productId; |
|||
|
|||
@ApiModelProperty(notes="预算金额",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal budgetAt; |
|||
|
|||
@ApiModelProperty(notes="叶子节点数据收集方式0-不计算,1-由任务汇总,2-手工填报",allowEmptyValue=true,example="",allowableValues="") |
|||
String calcType; |
|||
|
|||
@ApiModelProperty(notes="实际金额,如手工填写,则为填写金额,否则为汇总金额",allowEmptyValue=true,example="",allowableValues="") |
|||
BigDecimal actAt; |
|||
|
|||
/**阶段主键**/ |
|||
public XmPhase(String id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
/**项目、产品计划表(将计划并入任务表,暂时作废),合并进任务表了**/ |
|||
public XmPhase() { |
|||
} |
|||
|
|||
/** |
|||
* 阶段主键 |
|||
**/ |
|||
public void setId(String id) { |
|||
this.id = id; |
|||
} |
|||
/** |
|||
* 阶段名称 |
|||
**/ |
|||
public void setName(String name) { |
|||
this.name = name; |
|||
} |
|||
/** |
|||
* 备注 |
|||
**/ |
|||
public void setRemark(String remark) { |
|||
this.remark = remark; |
|||
} |
|||
/** |
|||
* 上级阶段编号 |
|||
**/ |
|||
public void setParentId(String parentId) { |
|||
this.parentId = parentId; |
|||
} |
|||
/** |
|||
* 机构编号 |
|||
**/ |
|||
public void setBranchId(String branchId) { |
|||
this.branchId = branchId; |
|||
} |
|||
/** |
|||
* 当前项目编号,如果是项目计划,必填项目 |
|||
**/ |
|||
public void setProjectId(String projectId) { |
|||
this.projectId = projectId; |
|||
} |
|||
/** |
|||
* 开始时间 |
|||
**/ |
|||
public void setBeginDate(Date beginDate) { |
|||
this.beginDate = beginDate; |
|||
} |
|||
/** |
|||
* 结束时间 |
|||
**/ |
|||
public void setEndDate(Date endDate) { |
|||
this.endDate = endDate; |
|||
} |
|||
/** |
|||
* 工时(上到下控制大于儿子总数)-应该大于或等于task中总工时 |
|||
**/ |
|||
public void setBudgetHours(BigDecimal budgetHours) { |
|||
this.budgetHours = budgetHours; |
|||
} |
|||
/** |
|||
* 投入人员数(上到下控制大于儿子总数)-应该大于或等于task中总人数 |
|||
**/ |
|||
public void setBudgetStaffNu(Integer budgetStaffNu) { |
|||
this.budgetStaffNu = budgetStaffNu; |
|||
} |
|||
/** |
|||
* 创建时间 |
|||
**/ |
|||
public void setCtime(Date ctime) { |
|||
this.ctime = ctime; |
|||
} |
|||
/** |
|||
* 非人力成本总预算(上到下控制大于儿子总数)-应该大于或等于task中非人力总成本 |
|||
**/ |
|||
public void setBudgetNouserAt(BigDecimal budgetNouserAt) { |
|||
this.budgetNouserAt = budgetNouserAt; |
|||
} |
|||
/** |
|||
* 内部人力成本总预算(上到下控制大于儿子总数)-应该大于或等于task中内部人力总成本 |
|||
**/ |
|||
public void setBudgetIuserAt(BigDecimal budgetIuserAt) { |
|||
this.budgetIuserAt = budgetIuserAt; |
|||
} |
|||
/** |
|||
* 外购人力成本总预算(上到下控制大于儿子总数)-应该大于或等于task中外购总成本 |
|||
**/ |
|||
public void setBudgetOuserAt(BigDecimal budgetOuserAt) { |
|||
this.budgetOuserAt = budgetOuserAt; |
|||
} |
|||
/** |
|||
* 项目级基线 |
|||
**/ |
|||
public void setBaselineId(String baselineId) { |
|||
this.baselineId = baselineId; |
|||
} |
|||
/** |
|||
* 当前流程实例编号 |
|||
**/ |
|||
public void setBizProcInstId(String bizProcInstId) { |
|||
this.bizProcInstId = bizProcInstId; |
|||
} |
|||
/** |
|||
* 当前流程状态0初始1审批中2审批通过3审批不通过4流程取消或者删除 |
|||
**/ |
|||
public void setBizFlowState(String bizFlowState) { |
|||
this.bizFlowState = bizFlowState; |
|||
} |
|||
/** |
|||
* 总工作量单位人时上到下控制大于儿子总数-应该大于或者等于task中的预算总工作量 |
|||
**/ |
|||
public void setBudgetWorkload(BigDecimal budgetWorkload) { |
|||
this.budgetWorkload = budgetWorkload; |
|||
} |
|||
/** |
|||
* 已完成工作量单位人时-从task中的实际工作量算出 |
|||
**/ |
|||
public void setActWorkload(BigDecimal actWorkload) { |
|||
this.actWorkload = actWorkload; |
|||
} |
|||
/** |
|||
* 实际内部人力工作量-来自任务表合计 |
|||
**/ |
|||
public void setActIuserWorkload(BigDecimal actIuserWorkload) { |
|||
this.actIuserWorkload = actIuserWorkload; |
|||
} |
|||
/** |
|||
* 实际外购人力工作量-来自任务表合计 |
|||
**/ |
|||
public void setActOuserWorkload(BigDecimal actOuserWorkload) { |
|||
this.actOuserWorkload = actOuserWorkload; |
|||
} |
|||
/** |
|||
* 0售前方案1投标2需求3设计4开发5测试6验收7部署8运维--来自基础数据表taskType |
|||
**/ |
|||
public void setTaskType(String taskType) { |
|||
this.taskType = taskType; |
|||
} |
|||
/** |
|||
* 计划类型w1-周,w2-2周,w3-3周,m1-1月,m2-2月,q1-季,q2-半年,y1-年 |
|||
**/ |
|||
public void setPlanType(String planType) { |
|||
this.planType = planType; |
|||
} |
|||
/** |
|||
* 顺序号 |
|||
**/ |
|||
public void setSeqNo(String seqNo) { |
|||
this.seqNo = seqNo; |
|||
} |
|||
/** |
|||
* 内部人力工作量总预算(上到下控制大于儿子总数)-应该大于或等于task中内部人力总成本 |
|||
**/ |
|||
public void setBudgetIuserWorkload(BigDecimal budgetIuserWorkload) { |
|||
this.budgetIuserWorkload = budgetIuserWorkload; |
|||
} |
|||
/** |
|||
* 外购人力工作量总预算(上到下控制大于儿子总数)-应该大于或等于task中外购总成本 |
|||
**/ |
|||
public void setBudgetOuserWorkload(BigDecimal budgetOuserWorkload) { |
|||
this.budgetOuserWorkload = budgetOuserWorkload; |
|||
} |
|||
/** |
|||
* 实际非人力成本-来自任务表合计 |
|||
**/ |
|||
public void setActNouserAt(BigDecimal actNouserAt) { |
|||
this.actNouserAt = actNouserAt; |
|||
} |
|||
/** |
|||
* 实际内部人力成本-来自任务表合计 |
|||
**/ |
|||
public void setActIuserAt(BigDecimal actIuserAt) { |
|||
this.actIuserAt = actIuserAt; |
|||
} |
|||
/** |
|||
* 内部人力成本单价元/人时 |
|||
**/ |
|||
public void setBudgetIuserPrice(BigDecimal budgetIuserPrice) { |
|||
this.budgetIuserPrice = budgetIuserPrice; |
|||
} |
|||
/** |
|||
* 外购人力成本单价元/人时 |
|||
**/ |
|||
public void setBudgetOuserPrice(BigDecimal budgetOuserPrice) { |
|||
this.budgetOuserPrice = budgetOuserPrice; |
|||
} |
|||
/** |
|||
* 外购人数 |
|||
**/ |
|||
public void setBudgetOuserCnt(Integer budgetOuserCnt) { |
|||
this.budgetOuserCnt = budgetOuserCnt; |
|||
} |
|||
/** |
|||
* 内部人数 |
|||
**/ |
|||
public void setBudgetIuserCnt(Integer budgetIuserCnt) { |
|||
this.budgetIuserCnt = budgetIuserCnt; |
|||
} |
|||
/** |
|||
* 实际进度0-100 |
|||
**/ |
|||
public void setActRate(BigDecimal actRate) { |
|||
this.actRate = actRate; |
|||
} |
|||
/** |
|||
* 阶段状态0初始1执行中2完工3关闭4删除中5已删除6暂停 |
|||
**/ |
|||
public void setPstatus(String pstatus) { |
|||
this.pstatus = pstatus; |
|||
} |
|||
/** |
|||
* 实际外部人力成本 |
|||
**/ |
|||
public void setActOuserAt(BigDecimal actOuserAt) { |
|||
this.actOuserAt = actOuserAt; |
|||
} |
|||
/** |
|||
* 任务数 |
|||
**/ |
|||
public void setTaskCnt(Integer taskCnt) { |
|||
this.taskCnt = taskCnt; |
|||
} |
|||
/** |
|||
* 完成的任务数 |
|||
**/ |
|||
public void setFinishTaskCnt(Integer finishTaskCnt) { |
|||
this.finishTaskCnt = finishTaskCnt; |
|||
} |
|||
/** |
|||
* 迭代数 |
|||
**/ |
|||
public void setIterationCnt(Integer iterationCnt) { |
|||
this.iterationCnt = iterationCnt; |
|||
} |
|||
/** |
|||
* 统计数据时间 |
|||
**/ |
|||
public void setCalcTime(Date calcTime) { |
|||
this.calcTime = calcTime; |
|||
} |
|||
/** |
|||
* 从任务汇总的预算工作量 |
|||
**/ |
|||
public void setTaskBudgetWorkload(BigDecimal taskBudgetWorkload) { |
|||
this.taskBudgetWorkload = taskBudgetWorkload; |
|||
} |
|||
/** |
|||
* 从任务汇总的预算金额 |
|||
**/ |
|||
public void setTaskBudgetAt(BigDecimal taskBudgetAt) { |
|||
this.taskBudgetAt = taskBudgetAt; |
|||
} |
|||
/** |
|||
* 管理者编号 |
|||
**/ |
|||
public void setMngUserid(String mngUserid) { |
|||
this.mngUserid = mngUserid; |
|||
} |
|||
/** |
|||
* 管理者姓名 |
|||
**/ |
|||
public void setMngUsername(String mngUsername) { |
|||
this.mngUsername = mngUsername; |
|||
} |
|||
/** |
|||
* 是否里程碑0否1是 |
|||
**/ |
|||
public void setMilestone(String milestone) { |
|||
this.milestone = milestone; |
|||
} |
|||
/** |
|||
* 节点是否为叶子节点 |
|||
**/ |
|||
public void setPleaf(String pleaf) { |
|||
this.pleaf = pleaf; |
|||
} |
|||
/** |
|||
* 标签编号,逗号分割 |
|||
**/ |
|||
public void setTagIds(String tagIds) { |
|||
this.tagIds = tagIds; |
|||
} |
|||
/** |
|||
* 标签名称,逗号分割 |
|||
**/ |
|||
public void setTagNames(String tagNames) { |
|||
this.tagNames = tagNames; |
|||
} |
|||
/** |
|||
* 节点类型0-任务,1-任务集。任务集下建任务,任务下不允许建立任何子节点 |
|||
**/ |
|||
public void setNtype(String ntype) { |
|||
this.ntype = ntype; |
|||
} |
|||
/** |
|||
* 儿子节点个数 |
|||
**/ |
|||
public void setChildrenCnt(Integer childrenCnt) { |
|||
this.childrenCnt = childrenCnt; |
|||
} |
|||
/** |
|||
* 更新时间 |
|||
**/ |
|||
public void setLtime(Date ltime) { |
|||
this.ltime = ltime; |
|||
} |
|||
/** |
|||
* 是否为关键路径上的节点 |
|||
**/ |
|||
public void setIsKeyPath(String isKeyPath) { |
|||
this.isKeyPath = isKeyPath; |
|||
} |
|||
/** |
|||
* 父级id逗号分割,最后一个为本节点节点编号,以,号结尾 |
|||
**/ |
|||
public void setPidPaths(String pidPaths) { |
|||
this.pidPaths = pidPaths; |
|||
} |
|||
/** |
|||
* 层级0-顶级,1-一级,2-二级,3-三级,4-四级。总共5级 |
|||
**/ |
|||
public void setLvl(Integer lvl) { |
|||
this.lvl = lvl; |
|||
} |
|||
/** |
|||
* 是否为模板 |
|||
**/ |
|||
public void setIsTpl(String isTpl) { |
|||
this.isTpl = isTpl; |
|||
} |
|||
/** |
|||
* 计划分类0项目1产品 |
|||
**/ |
|||
public void setPhaseClass(String phaseClass) { |
|||
this.phaseClass = phaseClass; |
|||
} |
|||
/** |
|||
* 如果是产品计划,必填产品编号,其它的可不填 |
|||
**/ |
|||
public void setProductId(String productId) { |
|||
this.productId = productId; |
|||
} |
|||
/** |
|||
* 预算金额 |
|||
**/ |
|||
public void setBudgetAt(BigDecimal budgetAt) { |
|||
this.budgetAt = budgetAt; |
|||
} |
|||
/** |
|||
* 叶子节点数据收集方式0-不计算,1-由任务汇总,2-手工填报 |
|||
**/ |
|||
public void setCalcType(String calcType) { |
|||
this.calcType = calcType; |
|||
} |
|||
/** |
|||
* 实际金额,如手工填写,则为填写金额,否则为汇总金额 |
|||
**/ |
|||
public void setActAt(BigDecimal actAt) { |
|||
this.actAt = actAt; |
|||
} |
|||
|
|||
/** |
|||
* 阶段主键 |
|||
**/ |
|||
public String getId() { |
|||
return this.id; |
|||
} |
|||
/** |
|||
* 阶段名称 |
|||
**/ |
|||
public String getName() { |
|||
return this.name; |
|||
} |
|||
/** |
|||
* 备注 |
|||
**/ |
|||
public String getRemark() { |
|||
return this.remark; |
|||
} |
|||
/** |
|||
* 上级阶段编号 |
|||
**/ |
|||
public String getParentId() { |
|||
return this.parentId; |
|||
} |
|||
/** |
|||
* 机构编号 |
|||
**/ |
|||
public String getBranchId() { |
|||
return this.branchId; |
|||
} |
|||
/** |
|||
* 当前项目编号,如果是项目计划,必填项目 |
|||
**/ |
|||
public String getProjectId() { |
|||
return this.projectId; |
|||
} |
|||
/** |
|||
* 开始时间 |
|||
**/ |
|||
public Date getBeginDate() { |
|||
return this.beginDate; |
|||
} |
|||
/** |
|||
* 结束时间 |
|||
**/ |
|||
public Date getEndDate() { |
|||
return this.endDate; |
|||
} |
|||
/** |
|||
* 工时(上到下控制大于儿子总数)-应该大于或等于task中总工时 |
|||
**/ |
|||
public BigDecimal getBudgetHours() { |
|||
return this.budgetHours; |
|||
} |
|||
/** |
|||
* 投入人员数(上到下控制大于儿子总数)-应该大于或等于task中总人数 |
|||
**/ |
|||
public Integer getBudgetStaffNu() { |
|||
return this.budgetStaffNu; |
|||
} |
|||
/** |
|||
* 创建时间 |
|||
**/ |
|||
public Date getCtime() { |
|||
return this.ctime; |
|||
} |
|||
/** |
|||
* 非人力成本总预算(上到下控制大于儿子总数)-应该大于或等于task中非人力总成本 |
|||
**/ |
|||
public BigDecimal getBudgetNouserAt() { |
|||
return this.budgetNouserAt; |
|||
} |
|||
/** |
|||
* 内部人力成本总预算(上到下控制大于儿子总数)-应该大于或等于task中内部人力总成本 |
|||
**/ |
|||
public BigDecimal getBudgetIuserAt() { |
|||
return this.budgetIuserAt; |
|||
} |
|||
/** |
|||
* 外购人力成本总预算(上到下控制大于儿子总数)-应该大于或等于task中外购总成本 |
|||
**/ |
|||
public BigDecimal getBudgetOuserAt() { |
|||
return this.budgetOuserAt; |
|||
} |
|||
/** |
|||
* 项目级基线 |
|||
**/ |
|||
public String getBaselineId() { |
|||
return this.baselineId; |
|||
} |
|||
/** |
|||
* 当前流程实例编号 |
|||
**/ |
|||
public String getBizProcInstId() { |
|||
return this.bizProcInstId; |
|||
} |
|||
/** |
|||
* 当前流程状态0初始1审批中2审批通过3审批不通过4流程取消或者删除 |
|||
**/ |
|||
public String getBizFlowState() { |
|||
return this.bizFlowState; |
|||
} |
|||
/** |
|||
* 总工作量单位人时上到下控制大于儿子总数-应该大于或者等于task中的预算总工作量 |
|||
**/ |
|||
public BigDecimal getBudgetWorkload() { |
|||
return this.budgetWorkload; |
|||
} |
|||
/** |
|||
* 已完成工作量单位人时-从task中的实际工作量算出 |
|||
**/ |
|||
public BigDecimal getActWorkload() { |
|||
return this.actWorkload; |
|||
} |
|||
/** |
|||
* 实际内部人力工作量-来自任务表合计 |
|||
**/ |
|||
public BigDecimal getActIuserWorkload() { |
|||
return this.actIuserWorkload; |
|||
} |
|||
/** |
|||
* 实际外购人力工作量-来自任务表合计 |
|||
**/ |
|||
public BigDecimal getActOuserWorkload() { |
|||
return this.actOuserWorkload; |
|||
} |
|||
/** |
|||
* 0售前方案1投标2需求3设计4开发5测试6验收7部署8运维--来自基础数据表taskType |
|||
**/ |
|||
public String getTaskType() { |
|||
return this.taskType; |
|||
} |
|||
/** |
|||
* 计划类型w1-周,w2-2周,w3-3周,m1-1月,m2-2月,q1-季,q2-半年,y1-年 |
|||
**/ |
|||
public String getPlanType() { |
|||
return this.planType; |
|||
} |
|||
/** |
|||
* 顺序号 |
|||
**/ |
|||
public String getSeqNo() { |
|||
return this.seqNo; |
|||
} |
|||
/** |
|||
* 内部人力工作量总预算(上到下控制大于儿子总数)-应该大于或等于task中内部人力总成本 |
|||
**/ |
|||
public BigDecimal getBudgetIuserWorkload() { |
|||
return this.budgetIuserWorkload; |
|||
} |
|||
/** |
|||
* 外购人力工作量总预算(上到下控制大于儿子总数)-应该大于或等于task中外购总成本 |
|||
**/ |
|||
public BigDecimal getBudgetOuserWorkload() { |
|||
return this.budgetOuserWorkload; |
|||
} |
|||
/** |
|||
* 实际非人力成本-来自任务表合计 |
|||
**/ |
|||
public BigDecimal getActNouserAt() { |
|||
return this.actNouserAt; |
|||
} |
|||
/** |
|||
* 实际内部人力成本-来自任务表合计 |
|||
**/ |
|||
public BigDecimal getActIuserAt() { |
|||
return this.actIuserAt; |
|||
} |
|||
/** |
|||
* 内部人力成本单价元/人时 |
|||
**/ |
|||
public BigDecimal getBudgetIuserPrice() { |
|||
return this.budgetIuserPrice; |
|||
} |
|||
/** |
|||
* 外购人力成本单价元/人时 |
|||
**/ |
|||
public BigDecimal getBudgetOuserPrice() { |
|||
return this.budgetOuserPrice; |
|||
} |
|||
/** |
|||
* 外购人数 |
|||
**/ |
|||
public Integer getBudgetOuserCnt() { |
|||
return this.budgetOuserCnt; |
|||
} |
|||
/** |
|||
* 内部人数 |
|||
**/ |
|||
public Integer getBudgetIuserCnt() { |
|||
return this.budgetIuserCnt; |
|||
} |
|||
/** |
|||
* 实际进度0-100 |
|||
**/ |
|||
public BigDecimal getActRate() { |
|||
return this.actRate; |
|||
} |
|||
/** |
|||
* 阶段状态0初始1执行中2完工3关闭4删除中5已删除6暂停 |
|||
**/ |
|||
public String getPstatus() { |
|||
return this.pstatus; |
|||
} |
|||
/** |
|||
* 实际外部人力成本 |
|||
**/ |
|||
public BigDecimal getActOuserAt() { |
|||
return this.actOuserAt; |
|||
} |
|||
/** |
|||
* 任务数 |
|||
**/ |
|||
public Integer getTaskCnt() { |
|||
return this.taskCnt; |
|||
} |
|||
/** |
|||
* 完成的任务数 |
|||
**/ |
|||
public Integer getFinishTaskCnt() { |
|||
return this.finishTaskCnt; |
|||
} |
|||
/** |
|||
* 迭代数 |
|||
**/ |
|||
public Integer getIterationCnt() { |
|||
return this.iterationCnt; |
|||
} |
|||
/** |
|||
* 统计数据时间 |
|||
**/ |
|||
public Date getCalcTime() { |
|||
return this.calcTime; |
|||
} |
|||
/** |
|||
* 从任务汇总的预算工作量 |
|||
**/ |
|||
public BigDecimal getTaskBudgetWorkload() { |
|||
return this.taskBudgetWorkload; |
|||
} |
|||
/** |
|||
* 从任务汇总的预算金额 |
|||
**/ |
|||
public BigDecimal getTaskBudgetAt() { |
|||
return this.taskBudgetAt; |
|||
} |
|||
/** |
|||
* 管理者编号 |
|||
**/ |
|||
public String getMngUserid() { |
|||
return this.mngUserid; |
|||
} |
|||
/** |
|||
* 管理者姓名 |
|||
**/ |
|||
public String getMngUsername() { |
|||
return this.mngUsername; |
|||
} |
|||
/** |
|||
* 是否里程碑0否1是 |
|||
**/ |
|||
public String getMilestone() { |
|||
return this.milestone; |
|||
} |
|||
/** |
|||
* 节点是否为叶子节点 |
|||
**/ |
|||
public String getPleaf() { |
|||
return this.pleaf; |
|||
} |
|||
/** |
|||
* 标签编号,逗号分割 |
|||
**/ |
|||
public String getTagIds() { |
|||
return this.tagIds; |
|||
} |
|||
/** |
|||
* 标签名称,逗号分割 |
|||
**/ |
|||
public String getTagNames() { |
|||
return this.tagNames; |
|||
} |
|||
/** |
|||
* 节点类型0-任务,1-任务集。任务集下建任务,任务下不允许建立任何子节点 |
|||
**/ |
|||
public String getNtype() { |
|||
return this.ntype; |
|||
} |
|||
/** |
|||
* 儿子节点个数 |
|||
**/ |
|||
public Integer getChildrenCnt() { |
|||
return this.childrenCnt; |
|||
} |
|||
/** |
|||
* 更新时间 |
|||
**/ |
|||
public Date getLtime() { |
|||
return this.ltime; |
|||
} |
|||
/** |
|||
* 是否为关键路径上的节点 |
|||
**/ |
|||
public String getIsKeyPath() { |
|||
return this.isKeyPath; |
|||
} |
|||
/** |
|||
* 父级id逗号分割,最后一个为本节点节点编号,以,号结尾 |
|||
**/ |
|||
public String getPidPaths() { |
|||
return this.pidPaths; |
|||
} |
|||
/** |
|||
* 层级0-顶级,1-一级,2-二级,3-三级,4-四级。总共5级 |
|||
**/ |
|||
public Integer getLvl() { |
|||
return this.lvl; |
|||
} |
|||
/** |
|||
* 是否为模板 |
|||
**/ |
|||
public String getIsTpl() { |
|||
return this.isTpl; |
|||
} |
|||
/** |
|||
* 计划分类0项目1产品 |
|||
**/ |
|||
public String getPhaseClass() { |
|||
return this.phaseClass; |
|||
} |
|||
/** |
|||
* 如果是产品计划,必填产品编号,其它的可不填 |
|||
**/ |
|||
public String getProductId() { |
|||
return this.productId; |
|||
} |
|||
/** |
|||
* 预算金额 |
|||
**/ |
|||
public BigDecimal getBudgetAt() { |
|||
return this.budgetAt; |
|||
} |
|||
/** |
|||
* 叶子节点数据收集方式0-不计算,1-由任务汇总,2-手工填报 |
|||
**/ |
|||
public String getCalcType() { |
|||
return this.calcType; |
|||
} |
|||
/** |
|||
* 实际金额,如手工填写,则为填写金额,否则为汇总金额 |
|||
**/ |
|||
public BigDecimal getActAt() { |
|||
return this.actAt; |
|||
} |
|||
|
|||
} |
|||
@ -1,588 +0,0 @@ |
|||
package com.xm.core.service; |
|||
|
|||
import com.mdp.core.entity.Tips; |
|||
import com.mdp.core.service.BaseService; |
|||
import com.mdp.core.utils.NumberUtil; |
|||
import com.mdp.safe.client.entity.User; |
|||
import com.mdp.safe.client.utils.LoginUtils; |
|||
import com.xm.core.entity.XmPhase; |
|||
import com.xm.core.vo.XmGroupVo; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.transaction.annotation.Transactional; |
|||
import org.springframework.util.StringUtils; |
|||
|
|||
import java.math.BigDecimal; |
|||
import java.util.*; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* 父类已经支持增删改查操作,因此,即使本类什么也不写,也已经可以满足一般的增删改查操作了.<br> |
|||
* 组织 com.qqkj 顶级模块 oa 大模块 xm 小模块 <br> |
|||
* 实体 XmProjectPhase 表 XM.xm_phase 当前主键(包括多主键): id; |
|||
***/ |
|||
@Service("xm.core.xmProjectPhaseService") |
|||
public class XmPhaseService extends BaseService { |
|||
|
|||
/** 请在此类添加自定义函数 */ |
|||
|
|||
@Autowired |
|||
XmRecordService xmRecordService; |
|||
|
|||
@Autowired |
|||
XmGroupService groupService; |
|||
/** |
|||
* 查询项目及计划总预算,用于判断是否超出预算 |
|||
*/ |
|||
public Map<String,Object> selectTotalProjectAndPhaseBudgetCost(String projectId,List<String> excludePhaseIds){ |
|||
Map<String,Object> p=new HashMap<>(); |
|||
p.put("projectId", projectId); |
|||
p.put("excludePhaseIds", excludePhaseIds); |
|||
return this.selectOne("selectTotalProjectAndPhaseBudgetCost", p); |
|||
} |
|||
public Tips checkUserHasQxToOperProjectPhase(String projectId,String mngUserid,String mngUsername,String myUserid){ |
|||
Tips tips = new Tips("成功"); |
|||
List<XmGroupVo> groupVoList=groupService.getProjectGroupVoList(projectId); |
|||
User user = LoginUtils.getCurrentUserInfo(); |
|||
boolean meIsPm=groupService.checkUserIsProjectManager(groupVoList,user.getUserid()); |
|||
boolean meIsTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,user.getUserid(),user.getUserid()); |
|||
if( !meIsPm && !meIsTeamHead ){ |
|||
tips.setFailureMsg("您不是组长、也不是项目管理者,不允许设置计划负责人"); |
|||
return tips; |
|||
} |
|||
boolean meIsHisTeamHead=groupService.checkUserIsOtherUserTeamHead(groupVoList,mngUserid,myUserid); |
|||
if( !meIsPm && !meIsHisTeamHead ){ |
|||
tips.setFailureMsg("您不是"+mngUsername+"的组长,不允许设置其为计划负责人"); |
|||
return tips; |
|||
} |
|||
return tips; |
|||
} |
|||
@Transactional |
|||
public int insert(XmPhase parameter) { |
|||
int i= super.insert(parameter); |
|||
if(StringUtils.hasText(parameter.getParentId())){ |
|||
sumParents(parameter); |
|||
} |
|||
|
|||
return i; |
|||
} |
|||
|
|||
|
|||
@Transactional |
|||
public int deleteByPk(XmPhase parameter) { |
|||
int i= super.deleteByPk(parameter); |
|||
if(StringUtils.hasText(parameter.getParentId())){ |
|||
sumParents(parameter); |
|||
} |
|||
return i; |
|||
} |
|||
|
|||
/** |
|||
* 判断新增预算是否超出项目总预算 |
|||
* @param projectId |
|||
* @param addPhaseBudgetCost |
|||
* @param addBudgetIuserAt |
|||
* @param addBudgetOuserAt |
|||
* @param addBudgetNouserAt |
|||
* @param excludePhaseIds |
|||
* @return |
|||
*/ |
|||
public Tips judgetProjectBudget(String projectId, BigDecimal addPhaseBudgetCost, BigDecimal addBudgetIuserAt, BigDecimal addBudgetOuserAt, BigDecimal addBudgetNouserAt, List<String> excludePhaseIds){ |
|||
Tips tips=new Tips("检查预算成功"); |
|||
Map<String,Object> g=this.selectTotalProjectAndPhaseBudgetCost(projectId,excludePhaseIds); |
|||
BigDecimal phaseBudgetCost=BigDecimal.ZERO; |
|||
BigDecimal zero=BigDecimal.ZERO; |
|||
|
|||
if(addPhaseBudgetCost==null) { |
|||
addPhaseBudgetCost=BigDecimal.ZERO; |
|||
} |
|||
if(addBudgetIuserAt==null) { |
|||
addBudgetIuserAt=BigDecimal.ZERO; |
|||
} |
|||
if(addBudgetOuserAt==null) { |
|||
addBudgetOuserAt=BigDecimal.ZERO; |
|||
} |
|||
if(addBudgetNouserAt==null) { |
|||
addBudgetNouserAt=BigDecimal.ZERO; |
|||
} |
|||
if(g==null || g.isEmpty()){ |
|||
|
|||
} |
|||
BigDecimal phaseBudgetIuserAt=NumberUtil.getBigDecimal(g.get("phaseBudgetIuserAt"),zero); |
|||
BigDecimal phaseBudgetOuserAt=NumberUtil.getBigDecimal(g.get("phaseBudgetOuserAt"),zero); |
|||
BigDecimal phaseBudgetNouserAt=NumberUtil.getBigDecimal(g.get("phaseBudgetNouserAt"),zero); |
|||
|
|||
BigDecimal planIuserAt=NumberUtil.getBigDecimal(g.get("planIuserAt"),zero); |
|||
BigDecimal planOuserAt=NumberUtil.getBigDecimal(g.get("planOuserAt"),zero); |
|||
BigDecimal planNouserAt=NumberUtil.getBigDecimal(g.get("planNouserAt"),zero); |
|||
BigDecimal planTotalCost=NumberUtil.getBigDecimal(g.get("planTotalCost"),zero); |
|||
|
|||
if(addBudgetIuserAt.add(phaseBudgetIuserAt).compareTo(planIuserAt)>0) { |
|||
tips.setFailureMsg("内部人力预算超出项目内部人力预算"+addBudgetIuserAt.add(phaseBudgetIuserAt).subtract(planIuserAt)+"元"); |
|||
return tips; |
|||
} |
|||
if(addBudgetOuserAt.add(phaseBudgetOuserAt).compareTo(planOuserAt)>0) { |
|||
tips.setFailureMsg("外部人力预算超出项目外部人力预算"+addBudgetOuserAt.add(phaseBudgetOuserAt).subtract(planOuserAt)+"元"); |
|||
return tips; |
|||
} |
|||
if(addBudgetNouserAt.add(phaseBudgetNouserAt).compareTo(planNouserAt)>0) { |
|||
tips.setFailureMsg("非人力预算超出项目非人力预算"+addBudgetNouserAt.add(phaseBudgetNouserAt).subtract(planNouserAt)+"元"); |
|||
return tips; |
|||
} |
|||
|
|||
BigDecimal phaseBudgetAt=phaseBudgetCost.add(phaseBudgetIuserAt).add(phaseBudgetOuserAt).add(phaseBudgetNouserAt); |
|||
phaseBudgetAt=phaseBudgetAt.add(addPhaseBudgetCost); |
|||
if(phaseBudgetAt.compareTo(planTotalCost)>0) { |
|||
tips.setFailureMsg("计划总体预算超出项目总预算"+phaseBudgetAt.subtract(planTotalCost)+"元"); |
|||
return tips; |
|||
}else { |
|||
return tips; |
|||
} |
|||
|
|||
} |
|||
@Transactional |
|||
public int[] doBatchDelete(List<XmPhase> batchValues) { |
|||
int[] result= super.batchDelete(batchValues); |
|||
batchSumParents(batchValues); |
|||
return result; |
|||
} |
|||
|
|||
public XmPhase autoCalcWorkload(XmPhase phase) { |
|||
BigDecimal phaseBudgetHours=NumberUtil.getBigDecimal(phase.getBudgetHours(),BigDecimal.ZERO); |
|||
BigDecimal phaseBudgetIuserCnt=NumberUtil.getBigDecimal(phase.getBudgetIuserCnt(),BigDecimal.ZERO); |
|||
BigDecimal phaseBudgetOuserCnt=NumberUtil.getBigDecimal(phase.getBudgetOuserCnt(),BigDecimal.ZERO); |
|||
phase.setBudgetIuserWorkload(phaseBudgetIuserCnt.multiply(phaseBudgetHours)); |
|||
phase.setBudgetOuserWorkload(phaseBudgetOuserCnt.multiply(phaseBudgetHours)); |
|||
phase.setBudgetWorkload(phase.getBudgetIuserWorkload().add(phase.getBudgetOuserWorkload())); |
|||
return phase; |
|||
|
|||
} |
|||
/** |
|||
* 计算bug、task、测试案例、等数据 |
|||
* @param projectId |
|||
* @return |
|||
*/ |
|||
public int loadTasksToXmProjectPhase(String projectId) { |
|||
|
|||
return this.update("loadTasksToXmProjectPhase", projectId); |
|||
} |
|||
|
|||
/** |
|||
* 计算bug、task、测试案例、等数据 |
|||
* @param productId |
|||
* @return |
|||
*/ |
|||
public int loadTasksToXmProductPhase(String productId) { |
|||
|
|||
return this.update("loadTasksToXmProductPhase", productId); |
|||
} |
|||
public Long checkExistsTask(String phaseId) { |
|||
Long i= this.selectOne("checkExistsTask", phaseId); |
|||
return i; |
|||
} |
|||
public void updateChildrenCntByIds(List<String> ids) { |
|||
super.update("updateChildrenCntByIds",ids); |
|||
} |
|||
|
|||
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(XmPhase delNode, List<XmPhase> delNodes) { |
|||
if(delNode==null){ |
|||
return true; |
|||
} |
|||
if(delNode.getChildrenCnt()==null||delNode.getChildrenCnt()<=0){ |
|||
return true; |
|||
} |
|||
List<XmPhase> childList=delNodes.stream().filter(i->delNode.getId().equals(i.getParentId())).collect(Collectors.toList()); |
|||
if(childList==null||childList.size()<delNode.getChildrenCnt()){ |
|||
return false; |
|||
} |
|||
for (XmPhase n : childList) { |
|||
if (!this.checkCanDelAllChild(n, delNodes)) { |
|||
return false; |
|||
} |
|||
} |
|||
return true; |
|||
|
|||
} |
|||
@Transactional |
|||
public void batchInsertOrUpdate(List<XmPhase> inserts, List<XmPhase> updates) { |
|||
List<XmPhase> addList=inserts; |
|||
List<XmPhase> editList=updates; |
|||
List<XmPhase> all=new ArrayList<>(); |
|||
if(addList.size()>0) { |
|||
all.addAll(addList); |
|||
this.batchInsert(addList); |
|||
|
|||
} |
|||
if(editList.size()>0) { |
|||
all.addAll(editList); |
|||
this.batchUpdate(editList); |
|||
} |
|||
this.batchSumParents(all); |
|||
} |
|||
|
|||
public void calcKeyPaths(String projectId) { |
|||
|
|||
} |
|||
|
|||
@Transactional |
|||
public void doBatchInsert(List<XmPhase> xmProjectPhases) { |
|||
for (XmPhase xmProjectPhase : xmProjectPhases) { |
|||
long childrenCnt=xmProjectPhases.stream().filter(i->xmProjectPhase.getId().equals(i.getParentId())).count(); |
|||
xmProjectPhase.setChildrenCnt(Integer.valueOf(childrenCnt+"")); |
|||
if(childrenCnt>0){ |
|||
xmProjectPhase.setNtype("1"); |
|||
} |
|||
} |
|||
super.batchInsert(xmProjectPhases); |
|||
batchSumParents(xmProjectPhases); |
|||
} |
|||
|
|||
|
|||
public List<XmPhase> parentIdPathsCalcBeforeSave(List<XmPhase> nodes) { |
|||
List<XmPhase> noExistsList=nodes.stream().filter(i->!nodes.stream().filter(k->k.getId().equals(i.getParentId())).findAny().isPresent()).collect(Collectors.toList()); |
|||
noExistsList=noExistsList.stream().filter(i->StringUtils.hasText(i.getParentId())).collect(Collectors.toList()); |
|||
Map<String,String> hadCalcMap=new HashMap<>(); |
|||
for (XmPhase node : noExistsList) { |
|||
if(hadCalcMap.containsKey(node.getParentId())){ |
|||
String idPaths=hadCalcMap.get(node.getParentId()); |
|||
node.setPidPaths(idPaths+node.getId()+","); |
|||
}else{ |
|||
this.parentIdPathsCalcBeforeSave(node); |
|||
String idPaths=node.getPidPaths(); |
|||
idPaths=idPaths.substring(0,idPaths.length()-node.getId().length()-1); |
|||
hadCalcMap.put(node.getParentId(),idPaths); |
|||
} |
|||
} |
|||
for (XmPhase node : nodes) { |
|||
if(!StringUtils.hasText(node.getParentId())){ |
|||
node.setPidPaths("0,"+node.getId()+","); |
|||
continue; |
|||
} |
|||
if(hadCalcMap.containsKey(node.getParentId())){ |
|||
String idPaths=hadCalcMap.get(node.getParentId()); |
|||
node.setPidPaths(idPaths+node.getId()+","); |
|||
}else{ |
|||
List<XmPhase> pnodeList=this.getParentList(node,nodes); |
|||
if(pnodeList==null ||pnodeList.size()==0){ |
|||
node.setPidPaths("0,"+node.getParentId()+","+node.getId()+","); |
|||
continue; |
|||
} |
|||
XmPhase topParent=pnodeList.get(pnodeList.size()-1); |
|||
String idPath="0,"; |
|||
if(hadCalcMap.containsKey(topParent.getParentId())){ |
|||
idPath=hadCalcMap.get(topParent.getParentId()); |
|||
} |
|||
for (int i = pnodeList.size() - 1; i >= 0; i--) { |
|||
idPath=idPath+pnodeList.get(i).getId()+","; |
|||
} |
|||
node.setPidPaths(idPath+node.getId()+","); |
|||
} |
|||
} |
|||
for (XmPhase node : nodes) { |
|||
String idPaths=node.getPidPaths(); |
|||
String[] idpss=idPaths.split(","); |
|||
node.setLvl(idpss.length-1); |
|||
} |
|||
return nodes; |
|||
} |
|||
|
|||
public static void main(String[] args) { |
|||
String idpaths="0,1,2,3,"; |
|||
String[] idpss=idpaths.split(","); |
|||
int lvl=idpss.length; |
|||
|
|||
} |
|||
|
|||
public Tips parentIdPathsCalcBeforeSave(XmPhase currNode) { |
|||
Tips tips = new Tips("成功"); |
|||
if (!StringUtils.hasText(currNode.getParentId()) || "0".equals(currNode.getParentId())) { |
|||
currNode.setPidPaths("0," + currNode.getId() + ","); |
|||
currNode.setLvl(1); |
|||
return tips; |
|||
} else { |
|||
List<XmPhase> parentList=this.getParentList(currNode); |
|||
if(parentList==null ||parentList.size()==0){ |
|||
currNode.setPidPaths("0,"+currNode.getParentId()+","+currNode.getId()+","); |
|||
currNode.setLvl(2); |
|||
return tips; |
|||
} |
|||
String idPath="0,"; |
|||
for (int i = parentList.size() - 1; i >= 0; i--) { |
|||
idPath=idPath+parentList.get(i).getId()+","; |
|||
} |
|||
currNode.setPidPaths(idPath+currNode.getId()+","); |
|||
|
|||
String idPaths=currNode.getPidPaths(); |
|||
String[] idpss=idPaths.split(","); |
|||
currNode.setLvl(idpss.length-1); |
|||
} |
|||
return tips; |
|||
} |
|||
|
|||
private List<XmPhase> getParentList(XmPhase currNode){ |
|||
List<XmPhase> parentList=new ArrayList<>(); |
|||
XmPhase current=currNode; |
|||
while (true){ |
|||
if(!StringUtils.hasText(current.getParentId()) || "0".equals(current.getParentId())){ |
|||
return parentList; |
|||
} |
|||
XmPhase query=new XmPhase(); |
|||
query.setId(current.getParentId()); |
|||
current=this.selectOneObject(query); |
|||
if(current==null){ |
|||
return parentList; |
|||
} |
|||
parentList.add(current); |
|||
} |
|||
} |
|||
|
|||
private List<XmPhase> getParentList(XmPhase currNode, List<XmPhase> nodes){ |
|||
List<XmPhase> parentList=new ArrayList<>(); |
|||
XmPhase current=currNode; |
|||
while (true){ |
|||
if(!StringUtils.hasText(current.getParentId()) || "0".equals(current.getParentId())){ |
|||
return parentList; |
|||
} |
|||
XmPhase query=new XmPhase(); |
|||
query.setId(current.getParentId()); |
|||
Optional<XmPhase> optional=nodes.stream().filter(i->i.getId().equals(query.getId())).findFirst(); |
|||
if(!optional.isPresent()){ |
|||
current=optional.get(); |
|||
parentList.add(current); |
|||
}else { |
|||
return parentList; |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
@Transactional |
|||
public void sumParents(XmPhase node){ |
|||
String id=node.getId(); |
|||
String pidPaths=node.getPidPaths(); |
|||
if(!StringUtils.hasText(pidPaths)){ |
|||
return; |
|||
} |
|||
if(!pidPaths.startsWith("0,")){ |
|||
return; |
|||
} |
|||
if("0".equals(node.getNtype())){ |
|||
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<XmPhase> xmProjectPhases) { |
|||
List<Set<String>> list=new ArrayList<>(); |
|||
for (XmPhase node : xmProjectPhases) { |
|||
String id=node.getId(); |
|||
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); |
|||
} |
|||
|
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
} |
|||
|
|||
@Transactional |
|||
public void editByPk(XmPhase xmProjectPhase) { |
|||
super.updateByPk(xmProjectPhase); |
|||
this.sumParents(xmProjectPhase); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 判断新增预算是否超出产品总预算 |
|||
* @param productId |
|||
* @param addPhaseBudgetCost |
|||
* @param addBudgetIuserAt |
|||
* @param addBudgetOuserAt |
|||
* @param addBudgetNouserAt |
|||
* @param excludePhaseIds |
|||
* @return |
|||
*/ |
|||
public Tips judgetProductBudget(String productId,BigDecimal addPhaseBudgetCost,BigDecimal addBudgetIuserAt,BigDecimal addBudgetOuserAt,BigDecimal addBudgetNouserAt,List<String> excludePhaseIds){ |
|||
Tips tips=new Tips("检查预算成功"); |
|||
Map<String,Object> g=this.selectTotalProductAndPhaseBudgetCost(productId,excludePhaseIds); |
|||
BigDecimal phaseBudgetCost=BigDecimal.ZERO; |
|||
BigDecimal zero=BigDecimal.ZERO; |
|||
|
|||
if(addPhaseBudgetCost==null) { |
|||
addPhaseBudgetCost=BigDecimal.ZERO; |
|||
} |
|||
if(addBudgetIuserAt==null) { |
|||
addBudgetIuserAt=BigDecimal.ZERO; |
|||
} |
|||
if(addBudgetOuserAt==null) { |
|||
addBudgetOuserAt=BigDecimal.ZERO; |
|||
} |
|||
if(addBudgetNouserAt==null) { |
|||
addBudgetNouserAt=BigDecimal.ZERO; |
|||
} |
|||
BigDecimal phaseBudgetIuserAt=NumberUtil.getBigDecimal(g.get("phaseBudgetIuserAt"),zero); |
|||
BigDecimal phaseBudgetOuserAt=NumberUtil.getBigDecimal(g.get("phaseBudgetOuserAt"),zero); |
|||
BigDecimal phaseBudgetNouserAt=NumberUtil.getBigDecimal(g.get("phaseBudgetNouserAt"),zero); |
|||
|
|||
/** |
|||
* |
|||
p.pbudget_workload, |
|||
p.pbudget_amount, |
|||
p.pmenu_budget_workload, |
|||
p.pmenu_budget_amount |
|||
*/ |
|||
BigDecimal pbudgetWorkload=NumberUtil.getBigDecimal(g.get("pbudgetWorkload"),zero); |
|||
BigDecimal planTotalCost=NumberUtil.getBigDecimal(g.get("pbudgetAmount"),zero); |
|||
|
|||
|
|||
BigDecimal phaseBudgetAt=phaseBudgetCost.add(phaseBudgetIuserAt).add(phaseBudgetOuserAt).add(phaseBudgetNouserAt); |
|||
phaseBudgetAt=phaseBudgetAt.add(addPhaseBudgetCost); |
|||
if(phaseBudgetAt.compareTo(planTotalCost)>0) { |
|||
tips.setFailureMsg("计划总体预算超出产品总预算"+phaseBudgetAt.subtract(planTotalCost)+"元"); |
|||
return tips; |
|||
}else { |
|||
return tips; |
|||
} |
|||
|
|||
} |
|||
|
|||
/** |
|||
* 查询产品及计划总预算,用于判断是否超出预算 |
|||
*/ |
|||
public Map<String,Object> selectTotalProductAndPhaseBudgetCost(String productId,List<String> excludePhaseIds){ |
|||
Map<String,Object> p=new HashMap<>(); |
|||
p.put("productId", productId); |
|||
p.put("excludePhaseIds", excludePhaseIds); |
|||
return this.selectOne("selectTotalProductAndPhaseBudgetCost", p); |
|||
} |
|||
public Map<String,Object> selectPhaseBudgetCost(String phaseId,List<String> excludePhaseIds){ |
|||
Map<String,Object> p=new HashMap<>(); |
|||
p.put("id", phaseId); |
|||
p.put("excludePhaseIds", excludePhaseIds); |
|||
return this.selectOne("selectPhaseBudgetCost", p); |
|||
} |
|||
|
|||
public void calcPhaseBudgetAmount(XmPhase phase){ |
|||
if(phase.getBudgetIuserAt()==null){ |
|||
phase.setBudgetIuserAt(BigDecimal.ZERO); |
|||
} |
|||
if(phase.getBudgetNouserAt()==null){ |
|||
phase.setBudgetNouserAt(BigDecimal.ZERO); |
|||
} |
|||
if(phase.getBudgetOuserAt()==null){ |
|||
phase.setBudgetOuserAt(BigDecimal.ZERO); |
|||
} |
|||
if(phase.getBudgetAt()==null){ |
|||
phase.setBudgetAt(BigDecimal.ZERO); |
|||
} |
|||
phase.setBudgetAt(phase.getBudgetIuserAt().add(phase.getBudgetNouserAt()).add(phase.getBudgetOuserAt())); |
|||
} |
|||
|
|||
/** |
|||
* res2.id, |
|||
* res2.phase_budget_workload, |
|||
* res2.phase_budget_nouser_at, |
|||
* res2.phase_budget_iuser_at, |
|||
* res2.phase_budget_ouser_at, |
|||
* res2.phase_budget_at, |
|||
* res0.child_phase_budget_workload, |
|||
* res0.child_phase_budget_nouser_at, |
|||
* res0.child_phase_budget_iuser_at, |
|||
* res0.child_phase_budget_ouser_at, |
|||
* res0.child_phase_budget_at |
|||
* @param parentPhaseId |
|||
* @param phaseBudgetCost |
|||
* @param phaseBudgetIuserAt |
|||
* @param phaseBudgetOuserAt |
|||
* @param phaseBudgetNouserAt |
|||
* @param excludePhaseIds |
|||
* @return |
|||
*/ |
|||
public Tips judgetPhaseBudget(String parentPhaseId, BigDecimal phaseBudgetCost, BigDecimal phaseBudgetIuserAt, BigDecimal phaseBudgetOuserAt, BigDecimal phaseBudgetNouserAt, List<String> excludePhaseIds) { |
|||
Tips tips= new Tips("检查通过"); |
|||
Map<String,Object> phaseBudget=this.selectPhaseBudgetCost(parentPhaseId,excludePhaseIds); |
|||
if(phaseBudget==null || phaseBudget.isEmpty()){ |
|||
tips.setFailureMsg("计划不存在"); |
|||
}else{ |
|||
BigDecimal childBudgetAt=NumberUtil.getBigDecimal(phaseBudget.get("childBudgetAt"),BigDecimal.ZERO); |
|||
|
|||
BigDecimal phaseBudgetAt=NumberUtil.getBigDecimal(phaseBudget.get("phaseBudgetAt"),BigDecimal.ZERO); |
|||
|
|||
if(childBudgetAt.add(phaseBudgetCost).compareTo(phaseBudgetAt)>0){ |
|||
tips.setFailureMsg("预算金额超出剩余预算金额"+childBudgetAt.add(phaseBudgetCost).subtract(phaseBudgetAt)+"元"); |
|||
} |
|||
} |
|||
return tips; |
|||
} |
|||
|
|||
public int loaMenusToXmProductPhase(String productId) { |
|||
return super.update("loaMenusToXmProductPhase",productId); |
|||
} |
|||
} |
|||
|
|||
@ -1,21 +0,0 @@ |
|||
package com.xm.core.vo; |
|||
|
|||
import com.xm.core.entity.XmPhase; |
|||
|
|||
public class XmPhaseVo extends XmPhase { |
|||
private static final long serialVersionUID = 1534268338972176747L; |
|||
|
|||
/** |
|||
* addSub,edit,delete |
|||
*/ |
|||
String opType=""; |
|||
|
|||
public String getOpType() { |
|||
return opType; |
|||
} |
|||
|
|||
public void setOpType(String opType) { |
|||
this.opType = opType; |
|||
} |
|||
|
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue