-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
enhancementNew feature or requestNew feature or request
Description
Kickoff中更新wbs的内置处理机制
对任务层级或顺序的更新,本质上是更新wbs。
对不同场景下wbs的更新,Kickoff内置了一套默认更新机制,同时支持通过before-update事件对默认更新机制进行拦截。
将wbs更新为自身后代级别wbs不符逻辑性,直接默认更新失败,不同场景下内置的更新机制所执行的程序逻辑为:
场景一:不改变从属的父级任务关系更新wbs,如3.2.2 -> 3.2.1
- 在计入目标任务的条件下:按照目标任务旧
wbs查找其后代任务,计算所有任务的新wbs,并记录下所有任务实例和新、旧wbs; - 在不计入目标任务的条件下:如为向后移动,递减计算目标任务新、旧
wbs范围内的任务(包含当前wbs等于新wbs的任务)及它们后代任务的新wbs;如为向前移动,递增计算目标任务新、旧wbs范围内的任务(包含当前wbs等于新wbs的任务)及他们后代任务的新wbs,并记录下所有任务实例和新、旧wbs; - 查找所有
dependencies中含有记录中旧wbs的任务,按照记录中对应的新wbs计算新dependencies,并记录下所有任务实例和新、旧dependencies,如果存在与前面步骤记录中相同的任务实例,则合并记录项; - 按记录项依次触发
before-update事件,如任一事件被阻止,则取消整个更新事务;反之,按照记录项依次更新任务实例,并触发after-touch和after-update事件。
场景二:更新wbs为顶级任务wbs,如3.2.2 -> 1
- 在不计入目标任务的条件下:按目标任务旧
wbs查找其祖先任务,冒泡计算祖先任务的正确周期,并记录周期不正确的祖先任务实例和新、旧end,如果该祖先任务有非里程碑子任务,且有beginning/end晚于该祖先任务最晚子任务end的s2f/f2f型前置任务关系,则计算从该祖先任务的dependencies中删除对应前置任务wbs后的新dependencies,并记录新、旧dependencies; - 在计入目标任务的条件下:按照目标任务旧
wbs查找其后代任务,计算所有任务的新wbs,并记录下所有任务实例和新、旧wbs; - 在不计入目标任务的条件下:按目标任务旧
wbs查找其后方兄弟任务,递减计算并记录兄弟任务和兄弟任务后代任务的实例及新、旧wbs; - 在计入目标任务的条件下:按照目标任务新
wbs查找其新的后方兄弟任务,递增计算并记录兄弟任务和兄弟任务后代任务的实例及新、旧wbs,如果存在与前面步骤中相同的任务实例,则使用记录中的新wbs作为计算基准,覆盖原记录中相同任务实例的新、旧wbs; - 查找所有
dependencies中含有记录中旧wbs的任务,按照记录中对应的新wbs计算查找到的任务的新dependencies,如果该任务实例在前面步骤中记录过dependencies,则使用记录中的对应新dependencies作为计算基准,并记录下所有任务实例和新、旧dependencies,如果存在与之前步骤中相同的任务实例,则合并记录项; - 按记录项依次触发
before-update事件,如任一事件被阻止,则取消整个更新事务;反之,按照记录项依次更新任务实例,并触发after-touch和after-update事件。
场景三:改变从属的父级任务关系更新wbs,如3.2.2 -> 2.1或3.2.2 -> 3.2或2.1 -> 3.2.2
- 在不计入目标任务的条件下:按目标任务旧
wbs查找其祖先任务,冒泡计算祖先任务的正确周期,并记录周期不正确的祖先任务实例和新、旧end,如果该祖先任务有非里程碑子任务,且有beginning/end晚于该祖先任务最晚子任务end的s2f/f2f型前置任务关系,则计算从该祖先任务的dependencies中删除对应前置任务wbs后的新dependencies,并记录新、旧dependencies; - 在计入目标任务的条件下:按目标任务新
wbs查找其祖先任务,冒泡计算祖先任务的正确周期,并记录周期不正确的祖先任务实例和新、旧end/beginning,如果该祖先任务有非里程碑子任务,且有beginning/end晚于该祖先任务最晚子任务end的s2f/f2f前置任务关系,或beginning/end晚于该祖先任务最早子任务beginning的s2s/f2s型前置任务关系,则计算该祖先任务dependencies中删除对应前置任务wbs后的新dependencies,如果新的dependencies中包含目标任务或目标任务后代任务的旧wbs,需顺次执行删除计算。如果目标任务或目标任务后代任务的dependencies中有该祖先任务的wbs,则计算目标任务或其后代任务dependencies中删除该祖先任务wbs后的新dependencies。如果前面步骤中记录过对应任务实例的dependencies,则以记录中的新dependencies作为以上删除计算的基础。完成计算后,在记录中新增或合并该任务实例及新、旧dependencies; - 在计入目标任务的条件下:按照目标任务旧
wbs查找其后代任务,计算所有任务的新wbs,并记录下所有任务实例和新、旧wbs,如果目标任务存在于前面步骤的记录中,则合并记录项; - 在不计入目标任务的条件下:按目标任务旧
wbs查找其后方兄弟任务,递减计算并记录兄弟任务和兄弟任务后代任务的实例及新、旧wbs,如果兄弟任务或其后代任务存在于前面步骤的记录中,则合并记录项; - 在计入目标任务的条件下:按照目标任务新
wbs查找其新的后方兄弟任务,递增计算并记录兄弟任务和兄弟任务后代任务的实例及新、旧wbs,如果存在与前面步骤中相同的任务实例,则使用记录中的新wbs作为计算基准,覆盖原记录中相同任务实例的新、旧wbs; - 查找所有
dependencies中含有记录中旧wbs的任务,按照记录中对应的新wbs计算查找到的任务的新dependencies,如果该任务实例在前面步骤中记录过dependencies,则使用记录中的对应新dependencies作为计算基准,并记录下所有任务实例和新、旧dependencies,如果存在与之前步骤中相同的任务实例,则合并记录项; - 按记录项依次触发
before-update事件,如任一事件被阻止,则取消整个更新事务;反之,按照记录项依次更新任务实例,并触发after-touch和after-update事件。
根据以上程序执行过程的梳理,核心方法需至少实现三个:
propagateAncestors:计算祖先周期,已实现。calcDependencies:计算前置依赖,已实现。collectUniqueResource:搜集事务记录,需要支持同任务实例的记录项合并、wbs覆盖更新、dependencies合并更新。
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request