实施例
所述正向计算包括四个算法:正向计算算法、calculateTask函数、getTimeByFowardTasks函数和getTimeByParentFowardTasks函数。
正向计算算法用于根据项目中任务之间的依赖关系,由前向后正推,计算项目各个任务的最早开始时间和最早完成时间。
输入:项目的唯一标识projectid,项目的日历标识calendarid,nodeMap。
输出:计算后的项目任务对象的集合,它包括所有任务的最早开始时间、最早完成时间。
过程描述:
(1)通过项目的唯一标识,提取和收集数据,得到集合fRMap、childMap、parentMap、dataMap。
(2)遍历该项目所包含的所有任务。
(3)若nodeMap中不包含遍历的当前任务,执行函数calculateTask(nodeMap,fRMap,childMap,parentMap,dataMap,iid,calendarid),其中iid是指当前任务的唯一标识,其余参数含义参见数据结构表;否则,不做操作,继续下一个遍历。
(4)遍历过项目所有任务,结束遍历。返回计算结果。
calculateTask函数
函数名称:calculateTask(Map nodeMap,Map fRMap,MapchildMap,Map parentMap,Map dataMap,String dataId,Stringcalendarid)。
描述:本方法用于计算指定任务的最早开始、完成时间。
输入:即102的数据,其中nodeMap、fRMap、childMap、parentMap、dataMap含义参见数据结构表,dataId为指定任务的唯一标识,calendarid为项目的日历标识。
输出:指定的简单任务对象,它包括该任务的最早开始时间和最早完成时间。
函数过程描述:如图1所示。
(1)该组件由101开始,接受102的数据输入,进入判断块103,103作出判断,如果nodeMap包含dataId,进入块119,结束该过程;否则,继续执行(2)。
(2)进入判断块104,104作出判断,若指定任务是作业任务,继续执行步骤(3);否则,如果指定任务是摘要任务,转向步骤(9)。
(3)进入105块,执行函数getTimeByFowardTasks(nodeMap,fRMap,childMap,parentMap,dataMap,dataId,calendarid),根据当前任务的前置任务计算它的最早开始时间,返回候选最早开始时间s1。
(4)进入计算候选开始时间循环,此循环是根据当前任务的父任务和祖先任务的前置任务计算得到当前任务最早开始时间的结果集R,取其中的最大值,赋给s2,即MAX(R)→s2,s2即为候选的最早开始时间。块106是循环的开始,块110是循环的结束,循环终止的条件是遍历当前任务的父或祖先完毕。107块为获取当前任务的下一个父或祖先,108块以它的父或祖先唯一标识为输入参数执行函数getTimeByParentFowardTasks(nodeMap,fRMap,childMap,parentMap,dataMap,piid,dataId,calendarid),piid为它的父任务或祖先任务的唯一标识,获得返回值temp。块109用s2记录最大的最早开始时间。
(5)块111从候选的最早开始时间s1、s2中取较大的一个最为最早开始时间s,若s大于系统最小值MIN,则取s作为该任务的最早开始时间,否则,取该任务的计划开始时间作为它的最早开始时间。
(6)块112依据日历,以工期不变的原则,用最早开始时间计算最早完成时间。
(7)块112根据限制类型和限制日期对计算所得的最早开始时间、最早完成时间进行调整。
(8)块112用计算所得值更新其对应的任务对象,并将当前任务唯一标识dataId和该标识对应的任务对象作为名值对存入nodeMap。
(9)对于摘要任务而言,块113以dataId为键值在childMap检索其子任务唯一标识的集合childList。
(10)进入“计算最早开始时间和最早完成时间”循环,块114是循环的开始,块117是循环的结束,在该循环中,遍历childList集合,对于集合中的每一个值childIid,调用块115,执行函数calculateTask(nodeMap,fRMap,childMap,parentMap,dataMap,childIid,calendarid),计算其子任务的最早开始时间、最早完成时间,然后块116记录最小的最早开始时间,赋给s,即为该任务的最早开始时间,计算最大的最早完成时间,赋给f,即为该任务的最早完成时间。
(11)块118通过日历计算工期,用计算所得值更新其对应的任务对象,并将当前任务唯一标识dataId和该标识对应的任务对象作为名值对存入nodeMap。
(12)块119结束该过程。
getTimeByFowardTasks函数描述
函数名称:getTimeByFowardTasks(Map nodeMap,Map fRMap,Map childMap,Map parentMap,Map dataMap,String dataId,Stringcalendarid)。
getTimeByFowardTasks函数用于根据指定任务的前置任务计算得出该任务的候选最早开始时间。
输入:块202的数据,nodeMap、fRMap、childMap、parentMap、dataMap含义参见数据结构表,指定任务的唯一标识dataId,项目的日历标识calendarid。
输出:根据指定任务的前置任务计算得出的该任务的候选最早开始时间。
函数描述:如图2所示。
(1)由201开始,接受块202的输入,块203申请局部变量startTime,用系统的最小值MIN去初始化它。
(2)块204以dataId为键值对fRMap进行检索,得到该任务对应的前置任务的集合S。
(3)遍历集合S,判断块205作出判断,若集合S中还有元素未被遍历到,继续执行(4);否则,转到(7)。
(4)块206取出其前置任务唯一标识fiid,执行函数calculateTask(nodeMap,fRMap,childMap,parentMap,dataMap,fiid,calendarid),计算当前任务的前置任务的最早开始时间和最早完成时间。
(5)块207根据前置任务的最早开始、完成时间和相应的逻辑关系类型计算当前任务的最早开始时间,所得值记为time。
(6)块208做处理,如果time>startTime,startTime=time,转到(3)。
(7)结束遍历。
(8)块209返回startTime。
(9)块210结束该过程。
getTimeByParentFowardTasks函数描述
函数名称:getTimeByParentFowardTasks(Map nodeMap,MapfRMap,Map childMap,Map parentMap,Map dataMap,String piid,StringdataId,String calendarid)。
getTimeByParentFowardTasks函数用于根据当前任务的指定父或祖先的前置任务计算得出该任务的候选最早开始时间。
输入:块302数据,nodeMap、fRMap、childMap、parentMap、dataMap含义参见数据结构表,指定任务的父任务或祖先任务的唯一标识piid,指定任务的唯一标识dataId,项目的日历标识calendarid。
输出:根据当前任务的父或祖先的前置任务计算得出该任务的候选最早开始时间。
函数描述:如图3所示。
(1)块303接受数据输入,申请局部变量startTime,用系统的最小值MIN去初始化它。
(2)块304以piid为键值对fRMap进行检索,得到父任务或祖先任务对应的前置任务集合S。
(3)遍历集合S,判断块305作出判断,若集合S中还有元素未被遍历到,继续执行(4);否则,转到(7)。
(4)块306取出其前置任务唯一标识fiid,执行函数calculateTask(nodeMap,fRMap,childMap,parentMap,dataMap,fiid,calendarid),计算当前任务的父或祖先的前置任务的最早开始时间和最早完成时间。
(5)块307根据父或祖先的前置任务的最早开始、完成时间和相应的逻辑关系类型计算当前任务的最早开始时间,所得值记为time。
(6)块308做处理,如果time>startTime,startTime=time,转到(3)。
(7)结束遍历。
(8)块309返回startTime。
(9)块310结束该过程。
反向计算包括反向计算算法、calculateLastTime函数、getTimeBySubsequenceTasks函数、getTimeByParentSubsequenceTasks函数。
反向计算算法用于根据项目中任务之间的依赖关系,由后向前逆推,计算项目各个任务的最晚开始时间和最晚完成时间。
输入:项目的唯一标识projectid,项目的日历标识calendarid,lastMap。
输出:计算后的项目任务对象的集合,它包括所有任务的最晚开始时间、最晚完成时间。
过程描述:
(1)通过项目的唯一标识,提取和收集数据,得到集合sRMap、childMap、parentMap、dataMap。
(2)获得项目的完成时间,即正向计算算法中计算得出的所有任务中最早完成时间的最大值,记为maxTime。
(3)寻找最早完成时间等于maxTime的作业任务,并用其最早开始时间初始化其最晚开始时间,用最早完成时间初始化其最晚完成时间,将此计划对象放入lastMap。
(4)遍历该项目所包含的所有任务。
(5)若lastMap中不包含遍历的当前任务,执行函数calculateLastTime(lastMap,sRMap,childMap,parentMap,dataMap,iid,maxTime,calendarid),其中iid是指当前任务的唯一标识,maxTime为项目结束时间,calendarid为项目日历id;否则,不做操作,继续下一个遍历。
(6)遍历过项目所有任务,结束遍历。
(7)返回计算结果。
calculateLastTime函数描述
函数名称:calculateLastTime(Map lastMap,Map sRMap,MapchildMap,Map parentMap,Map dataMap,String dataId,longmaxTime,String calendarid)。
calculateLastTime函数用于计算指定任务的最晚开始时间和最晚完成时间。
输入:即402的数据,其中nodeMap、fRMap、childMap、parentMap、dataMap参见数据结构表,dataId为指定任务的唯一标识,calendarid为项目的日历标识,maxTime为项目的结束时间。
输出:指定的任务数据对象,它包括该任务的最晚开始时间和最晚完成时间。
过程描述:如图4所示。
(1)该组件由401开始,接受402的数据输入,进入判断块403,403作出判断,如果lastMap包含dataId,进入块419,结束该过程;否则,继续执行(2)。
(2)进入判断块404,404作出判断,若任务是作业任务,继续执行步骤(3);否则,如果指定任务是摘要任务,转向步骤(9)。
(3)进入505块,执行函数getTimeBySubsequenceTasks(lastMap,sRMap,childMap,parentMap,dataMap,dataId,maxTime,calendarid),根据当前任务的后置任务计算它的候选最晚开始时间s1,该函数在下边给出。
(4)进入计算候选最晚开始时间循环,此循环是根据当前任务的父任务和祖先任务的后置任务计算得到当前任务最晚开始时间的结果集R,取其中的最小值,赋给s2,即MIN(R)→s2,s2即为候选的最晚开始时间。块406是循环的开始,块410是循环的结束,循环终止的条件是遍历当前任务的父或祖先完毕。407块为获取当前任务的下一个父或祖先,408块以它的父或祖先唯一标识为输入参数执行函数getTimeByParentSubsequenceTasks(lastMap,sRMap,childMap,parentMap,dataMap,piid,dataId,maxTime,calendarid),piid为它的父任务或祖先任务的唯一标识,dataId为当前任务iid,获得返回值temp,该函数在下边给出。块409用s2记录最大的最早开始时间。
(5)块411从候选的最早开始时间s1、s2中取较小的一个最为最晚开始时间s,若s小于系统最大值MAX,则取s作为该任务的最晚开始时间,否则,取该项目的结束时间作为它的最晚完成时间。
(6)块412依据日历,以工期不变的原则,计算最晚开始时间或最晚完成时间。
(7)块412根据限制类型和限制日期对计算所得的最晚开始时间、最晚完成时间进行调整。
(8)块412用计算所得值更新其对应的任务对象,并将当前任务唯一标识dataId和该标识对应的任务对象作为名值对存入lastMap。
(9)对于摘要任务而言,块413以dataId为键值在childMap检索其子任务唯一标识的集合childList。
(10)进入“计算最晚开始时间和最晚完成时间”循环,块414是循环的开始,块417是循环的结束,在该循环中,遍历childList集合,对于集合中的每一个值childIid,调用块415,执行函数calculateLastTime(lastMap,sRMap,childMap,parentMap,dataMap,childIid,maxTime,calendarid),计算其子任务的最晚开始时间、最晚完成时间,然后块416记录最小的最晚开始时间,赋给s,即为该任务的最晚开始时间,计算最大的最晚完成时间,赋给f,即为该任务的最晚完成时间。
(11)块418通过日历计算工期,用计算所得值更新其对应的任务对象,并将当前任务唯一标识dataId和该标识对应的任务对象作为名值对存入lastMap。
(12)块419结束该过程。
getTimeBySubsequenceTasks函数描述
函数名称:getTimeBySubsequenceTasks(Map lastMap,MapsRMap,Map childMap,Map parentMap,Map dataMap,StringdataId,long maxTime,String calendarid)。
getTimeBySubsequenceTasks函数用于根据指定任务的后置任务计算得出该任务的候选最晚开始时间。
输入:块502的数据,lastMap、sRMap、childMap、parentMap、dataMap含义参见数据结构表,指定任务的唯一标识dataId,项目结束时间maxTime,项目的日历标识calendarid。
输出:根据指定任务的后置任务计算得出的该任务的候选最晚开始时间。
算法描述:如图5所示。
(1)由501开始,接受块502的输入,块503申请局部变量startTime,用系统的最大值MAX去初始化它。
(2)504以dataId为键值对sRMap进行检索,得到该任务对应的后置任务的集合S。
(3)遍历集合S,判断块505作出判断,若集合S中还有元素未被遍历到,继续执行(4);否则,转到(9)。
(4)块506取出其后置任务唯一标识siid,若lastMap包含siid,转到(5);否则,执行函数calculateLastTime(nodeMap,sRMap,childMap,parentMap,dataMap,siid,maxTime,calendarid),计算当前任务的后置任务的最晚开始时间和最晚完成时间。
(5)块507根据后置任务的最晚开始、完成时间和相应的逻辑关系类型计算当前任务的最晚开始时间,所得值记为time,然后根据工期不变计算其最晚完成时间,即为lastTime。
(6)块508判断,若lastTime>maxTime,转到(7);否则转到(8)。
(7)块509用maxTime作为当前任务的最晚完成时间,工期不变计算其最晚开始时间time,转到(8)。
(8)块510做处理,如果time<startTime,startTime=time,否则startTime不做改变;转到(3)。
(9)结束遍历。
(10)块511返回startTime。
(11)块512结束该过程。
getTimeByParentSubsequenceTasks函数描述
函数名称:getTimeByParentSubsequenceTasks(Map lastMap,MapsRMap,Map childMap,Map parentMap,Map dataMap,String piid,StringdataId,long maxTime,String calendarid)。
getTimeByParentSubsequenceTasks函数用于根据指定任务的父或祖先的后置任务计算得出的该任务的候选最晚开始时间。
输入:块602数据,lastMap、sRMap、childMap、parentMap、dataMap,它们的含义参见数据结构表,指定任务的父任务或祖先任务的唯一标识piid,指定任务的唯一标识dataId,项目的结束日期maxTime,项目的日历标识calendarid。
输出:根据指定任务的父或祖先的后置任务计算得出该任务的候选最晚开始时间。
算法描述:如图6所示。
(1)由601开始,接受块602的输入,块603申请局部变量startTime,用系统的最大值MAX去初始化它。
(2)604以piid为键值对sRMap进行检索,得到当前任务的父或祖先任务的后置任务的集合S。
(3)遍历集合S,判断块605作出判断,若集合S中还有元素未被遍历到,继续执行(4);否则,转到(9)。
(4)块606取出其后置任务唯一标识siid,若lastMap包含siid,转到(5);否则,执行函数calculateLastTime(lastMap,sRMap,childMap,parentMap,dataMap,siid,maxTime,calendarid),计算当前任务的父或祖先前置任务的最晚开始时间和最晚完成时间。
(5)块607根据后置任务的最晚开始、完成时间和相应的逻辑关系类型计算当前任务的最晚开始时间,所得值记为time,然后根据工期不变计算其最晚完成时间,即为lastTime。
(6)块608判断,若lastTime>maxTime,转到(7),否则转到(8)。
(7)块609用maxTime作为当前任务的最晚完成时间,工期不变计算其最晚开始时间time转到(8)。
(8)块610做处理,如果time<startTime,startTime=time,否则,startTime不做改变,转到(3)。
(9)结束遍历。
(10)块611返回startTime。
(11)块612结束该过程。
最终计算包括最终计算算法和calculateExpectTask函数算法。
最终计算算法用于根据项目中任务之间的依赖关系,由前向后正推,利用正向计算和反向计算的结果计算项目各个任务的最终的开始时间和完成时间。
输入:项目的唯一标识projectid,项目的日历标识calendarid,computeMap。
输出:计算后的项目任务对象的集合,它包括所有任务的开始时间、完成时间。
过程描述:
(1)通过项目的唯一标识,提取和收集数据,得到集合fRMap、childMap、parentMap、dataMap。
(2)遍历该项目所包含的所有任务。
(3)若computeMap中不包含遍历的当前任务,执行函数calculateExpectTask(computeMap,fRMap,childMap,parentMap,dataMap,iid,calendarid),其中iid是指当前任务的唯一标识,calendarid为项目日历id;否则,不做操作,继续下一个遍历。
(4)遍历过项目所有任务,结束遍历。
(5)返回计算结果。
calculateExpectTask函数描述
函数名称:calculateExpectTask(Map computeMap,Map fRMap,Map childMap,Map parentMap,Map dataMap,String dataId,Stringcalendarid)。
calculateExpectTask函数用于计算指定任务的开始时间、完成时间。
输入:computeMap、fRMap、childMap、parentMap、dataMap含义参见数据结构表,dataId为指定任务的唯一标识,calendarid为项目的日历标识。
输出:指定的任务数据对象,它包括该任务的开始时间和完成时间。
过程描述:
其算法描述过程与正向计算算法描述节的calculateTask函数基本一致,只存在几点差异:
(1)输入的nodeMap变为computeMap。
(2)参与计算和最后更新的属性为开始时间、完成时间。
(3)calculateExpectTask对calculateTask函数步骤(7)做了修改,即对根据限制类型和限制日期调整任务开始时间、完成时间的逻辑做了些修改。
关键路径算法包括关键路径算法。
关键路径算法用于根据项目中任务的最早开始、完成时间,最晚开始、完成时间,开始、完成时间来确定关键任务。
输入:项目所有简单任务对象集合dataMap。
输出:作了是否关键任务标记的简单任务对象集合。
过程描述:
(1)遍历指定项目简单任务对象集合dataMap。
(2)获得简单对象task,若task为作业任务,并且其最晚开始时间小于或等于开始时间,将它标记为关键任务;否则,将它标记为非关键任务。
(3)结束遍历
(4)返回做了标记的简单任务对象集合。