Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于任务上移、下移、升级、降级的处理 #1

Open
oatw opened this issue Mar 5, 2021 · 0 comments
Open

关于任务上移、下移、升级、降级的处理 #1

oatw opened this issue Mar 5, 2021 · 0 comments
Assignees
Labels
enhancement New feature or request

Comments

@oatw
Copy link
Owner

oatw commented Mar 5, 2021

Kickoff中更新wbs的内置处理机制

对任务层级或顺序的更新,本质上是更新wbs

对不同场景下wbs的更新,Kickoff内置了一套默认更新机制,同时支持通过before-update事件对默认更新机制进行拦截。

wbs更新为自身后代级别wbs不符逻辑性,直接默认更新失败,不同场景下内置的更新机制所执行的程序逻辑为:

场景一:不改变从属的父级任务关系更新wbs,如3.2.2 -> 3.2.1

  1. 在计入目标任务的条件下:按照目标任务旧wbs查找其后代任务,计算所有任务的新wbs,并记录下所有任务实例和新、旧wbs;
  2. 在不计入目标任务的条件下:如为向后移动,递减计算目标任务新、旧wbs范围内的任务(包含当前wbs等于新wbs的任务)及它们后代任务的新wbs;如为向前移动,递增计算目标任务新、旧wbs范围内的任务(包含当前wbs等于新wbs的任务)及他们后代任务的新wbs,并记录下所有任务实例和新、旧wbs;
  3. 查找所有dependencies中含有记录中旧wbs的任务,按照记录中对应的新wbs计算新dependencies,并记录下所有任务实例和新、旧dependencies,如果存在与前面步骤记录中相同的任务实例,则合并记录项;
  4. 按记录项依次触发before-update事件,如任一事件被阻止,则取消整个更新事务;反之,按照记录项依次更新任务实例,并触发after-touchafter-update事件。

场景二:更新wbs为顶级任务wbs,如3.2.2 -> 1

  1. 在不计入目标任务的条件下:按目标任务旧wbs查找其祖先任务,冒泡计算祖先任务的正确周期,并记录周期不正确的祖先任务实例和新、旧end,如果该祖先任务有非里程碑子任务,且有beginning/end晚于该祖先任务最晚子任务ends2f/f2f型前置任务关系,则计算从该祖先任务的dependencies中删除对应前置任务wbs后的新dependencies,并记录新、旧dependencies;
  2. 在计入目标任务的条件下:按照目标任务旧wbs查找其后代任务,计算所有任务的新wbs,并记录下所有任务实例和新、旧wbs;
  3. 在不计入目标任务的条件下:按目标任务旧wbs查找其后方兄弟任务,递减计算并记录兄弟任务和兄弟任务后代任务的实例及新、旧wbs;
  4. 在计入目标任务的条件下:按照目标任务新wbs查找其新的后方兄弟任务,递增计算并记录兄弟任务和兄弟任务后代任务的实例及新、旧wbs,如果存在与前面步骤中相同的任务实例,则使用记录中的新wbs作为计算基准,覆盖原记录中相同任务实例的新、旧wbs;
  5. 查找所有dependencies中含有记录中旧wbs的任务,按照记录中对应的新wbs计算查找到的任务的新dependencies,如果该任务实例在前面步骤中记录过dependencies,则使用记录中的对应新dependencies作为计算基准,并记录下所有任务实例和新、旧dependencies,如果存在与之前步骤中相同的任务实例,则合并记录项;
  6. 按记录项依次触发before-update事件,如任一事件被阻止,则取消整个更新事务;反之,按照记录项依次更新任务实例,并触发after-touchafter-update事件。

场景三:改变从属的父级任务关系更新wbs,如3.2.2 -> 2.1或3.2.2 -> 3.2或2.1 -> 3.2.2

  1. 在不计入目标任务的条件下:按目标任务旧wbs查找其祖先任务,冒泡计算祖先任务的正确周期,并记录周期不正确的祖先任务实例和新、旧end,如果该祖先任务有非里程碑子任务,且有beginning/end晚于该祖先任务最晚子任务ends2f/f2f型前置任务关系,则计算从该祖先任务的dependencies中删除对应前置任务wbs后的新dependencies,并记录新、旧dependencies;
  2. 在计入目标任务的条件下:按目标任务新wbs查找其祖先任务,冒泡计算祖先任务的正确周期,并记录周期不正确的祖先任务实例和新、旧end/beginning,如果该祖先任务有非里程碑子任务,且有beginning/end晚于该祖先任务最晚子任务ends2f/f2f前置任务关系,或beginning/end晚于该祖先任务最早子任务beginnings2s/f2s型前置任务关系,则计算该祖先任务dependencies中删除对应前置任务wbs后的新dependencies,如果新的dependencies中包含目标任务或目标任务后代任务的旧wbs,需顺次执行删除计算。如果目标任务或目标任务后代任务的dependencies中有该祖先任务的wbs,则计算目标任务或其后代任务dependencies中删除该祖先任务wbs后的新dependencies。如果前面步骤中记录过对应任务实例的dependencies,则以记录中的新dependencies作为以上删除计算的基础。完成计算后,在记录中新增或合并该任务实例及新、旧dependencies;
  3. 在计入目标任务的条件下:按照目标任务旧wbs查找其后代任务,计算所有任务的新wbs,并记录下所有任务实例和新、旧wbs,如果目标任务存在于前面步骤的记录中,则合并记录项;
  4. 在不计入目标任务的条件下:按目标任务旧wbs查找其后方兄弟任务,递减计算并记录兄弟任务和兄弟任务后代任务的实例及新、旧wbs,如果兄弟任务或其后代任务存在于前面步骤的记录中,则合并记录项;
  5. 在计入目标任务的条件下:按照目标任务新wbs查找其新的后方兄弟任务,递增计算并记录兄弟任务和兄弟任务后代任务的实例及新、旧wbs,如果存在与前面步骤中相同的任务实例,则使用记录中的新wbs作为计算基准,覆盖原记录中相同任务实例的新、旧wbs;
  6. 查找所有dependencies中含有记录中旧wbs的任务,按照记录中对应的新wbs计算查找到的任务的新dependencies,如果该任务实例在前面步骤中记录过dependencies,则使用记录中的对应新dependencies作为计算基准,并记录下所有任务实例和新、旧dependencies,如果存在与之前步骤中相同的任务实例,则合并记录项;
  7. 按记录项依次触发before-update事件,如任一事件被阻止,则取消整个更新事务;反之,按照记录项依次更新任务实例,并触发after-touchafter-update事件。

根据以上程序执行过程的梳理,核心方法需至少实现三个:

  • propagateAncestors:计算祖先周期,已实现。
  • calcDependencies:计算前置依赖,已实现。
  • collectUniqueResource:搜集事务记录,需要支持同任务实例的记录项合并、wbs覆盖更新、dependencies合并更新。
@oatw oatw added the enhancement New feature or request label Mar 5, 2021
@oatw oatw self-assigned this Mar 5, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant