diff --git a/wwwroot/api/bid_task_tree.dspy b/wwwroot/api/bid_task_tree.dspy index 5078ef3..7d53832 100644 --- a/wwwroot/api/bid_task_tree.dspy +++ b/wwwroot/api/bid_task_tree.dspy @@ -163,16 +163,20 @@ async with DBPools().sqlorContext(dbname) as sor: latest_qc[qt] = rv groups = {} for t in role_tasks: - key = (_params_of(t).get('analysis_dim') or '').strip() or '__legacy__' + key = (_params_of(t).get('analysis_dim') or '').strip() + if not key: + # 无维度:人工定向修正任务单独成组,其余归遗留全量解析 + key = '__manual__' if '修正' in (getattr(t, 'title', '') or '') else '__legacy__' groups.setdefault(key, []).append(t) for key in groups: groups[key].sort(key=lambda x: str(getattr(x, 'created_at', '') or '')) dim_labels = { 'scoring': '评分项与得分规则', 'quals': '资质清单与要求', 'reqs_outline': '投标文件要求与章节骨架', 'cost_benefit': '成本收益分析', - '__legacy__': '全量解析(维度拆分前)', + '__legacy__': '全量解析(维度拆分前)', '__manual__': '人工定向修正', } - order = ['scoring', 'quals', 'reqs_outline', 'cost_benefit', '__legacy__'] + order = ['scoring', 'quals', 'reqs_outline', 'cost_benefit', + '__manual__', '__legacy__'] nodes = [] for key in order + [k for k in groups if k not in order]: if key not in groups: @@ -200,7 +204,8 @@ async with DBPools().sqlorContext(dbname) as sor: tail = "任务" + _state_zh.get(final_state, final_state) nodes.append({ "id": "grp:" + role + ":" + key, - "label": "{}({} 轮)最新[{}]".format(label, len(ts), tail), + "label": "{}({} {})最新[{}]".format( + label, len(ts), '个任务' if key == '__manual__' else '轮', tail), "is_leaf": False, }) return json.dumps(nodes, ensure_ascii=False) @@ -341,7 +346,9 @@ async with DBPools().sqlorContext(dbname) as sor: continue if (getattr(t, 'parent_id', '') or '').strip(): continue - k = (_params_of2(t).get('analysis_dim') or '').strip() or '__legacy__' + k = (_params_of2(t).get('analysis_dim') or '').strip() + if not k: + k = '__manual__' if '修正' in (getattr(t, 'title', '') or '') else '__legacy__' if k == key: ts.append(t) ts.sort(key=lambda x: str(getattr(x, 'created_at', '') or '')) @@ -378,12 +385,19 @@ async with DBPools().sqlorContext(dbname) as sor: qc_label = "→ QC %.1f 分 %s" % (sc, '通过' if passed else '未通过') else: rnd = i + 1 - qc_label = '→ 未审核/审核记录未关联' + qc_label = '' upd = t_upd[5:16] + if key == '__manual__': + lbl = "%s [任务%s] %s" % (_state_icons.get(st, '\u2b1c'), + _state_zh.get(st, st), + (getattr(t, 'title', '') or '')[:40]) + else: + lbl = "第%d轮 %s [任务%s] %s %s" % ( + rnd, _state_icons.get(st, '\u2b1c'), _state_zh.get(st, st), + qc_label or '→ 未审核/审核记录未关联', upd) nodes.append({ "id": tid, - "label": "第%d轮 %s [任务%s] %s %s" % ( - rnd, _state_icons.get(st, '\u2b1c'), _state_zh.get(st, st), qc_label, upd), + "label": lbl, "is_leaf": not (step_cnt.get(tid, 0) > 0 or del_cnt.get(tid, 0) > 0), }) return json.dumps(nodes, ensure_ascii=False)