refactor: task_tree 阶段顺序改为从 SDL_ROLES 动态生成(next_role 链推导,自动排除 qc 门禁),不再写死 _phase_order

This commit is contained in:
ymq 2026-08-18 17:47:08 +08:00
parent 1403bced52
commit 9da322c5c3

View File

@ -25,14 +25,32 @@ _state_zh = {
'failed': '失败', 'waiting': '等待中', 'submitted': '已提交', 'failed': '失败', 'waiting': '等待中', 'submitted': '已提交',
'review': '审核中', 'rejected': '已驳回', 'paused': '已暂停', 'cancelled': '已取消', 'review': '审核中', 'rejected': '已驳回', 'paused': '已暂停', 'cancelled': '已取消',
} }
# 阶段顺序(role 规范名 → 中文名) # 阶段顺序:从产线角色集(SDL_ROLES)动态生成,用 next_role 链推导线性角色(自动排除 qc 门禁)。
_phase_order = [ def _get_phase_order():
('agent.requirement', '需求阶段'), try:
('agent.design', '设计阶段'), from pipeline_core import list_roles
('agent.develop', '开发阶段'), roles = list_roles("sdlc_general") or []
('agent.test', '测试阶段'), role_map = {r.name: r for r in roles}
('agent.deploy', '部署阶段'), next_set = {getattr(r, 'next_role', '') for r in roles if getattr(r, 'next_role', '')}
] heads = [r for r in roles if r.name not in next_set and getattr(r, 'next_role', '')]
order = []
seen = set()
cur = heads[0] if heads else None
while cur and cur.name not in seen:
seen.add(cur.name)
desc = getattr(cur, 'description', '') or cur.name
order.append((cur.name, desc))
cur = role_map.get(getattr(cur, 'next_role', ''))
return order
except Exception:
return [
('agent.requirement', '需求阶段'),
('agent.design', '设计阶段'),
('agent.develop', '开发阶段'),
('agent.deploy_test', '测试环境部署'),
('agent.test', '测试阶段'),
('agent.deploy_prod', '生产环境部署'),
]
def _iter_of(task): def _iter_of(task):
@ -128,7 +146,7 @@ async with DBPools().sqlorContext(dbname) as sor:
r = (getattr(t, 'role', '') or '').strip() r = (getattr(t, 'role', '') or '').strip()
role_cnt[r] = role_cnt.get(r, 0) + 1 role_cnt[r] = role_cnt.get(r, 0) + 1
nodes = [] nodes = []
for rn, rzh in _phase_order: for rn, rzh in _get_phase_order():
if rn in role_cnt: if rn in role_cnt:
nodes.append({ nodes.append({
"id": "iter:{}:phase:{}".format(iter_id, rn), "id": "iter:{}:phase:{}".format(iter_id, rn),