refactor(dialogue): implement task dispatch notifications and consecutive assistant messages with confirmation cards
This commit is contained in:
@@ -514,7 +514,7 @@ def build_data():
|
||||
"deviceType": p["device_type"],
|
||||
"stage": "V0.5",
|
||||
"stageLabel": "V0.5 方案成型与法规对齐",
|
||||
"messageCount": 9,
|
||||
"messageCount": 10,
|
||||
"updatedAt": "刚刚"
|
||||
})
|
||||
sessions.append({
|
||||
@@ -525,7 +525,7 @@ def build_data():
|
||||
"deviceType": p["device_type"],
|
||||
"stage": "V0.5",
|
||||
"stageLabel": "V0.5 方案成型与法规对齐",
|
||||
"messageCount": 5,
|
||||
"messageCount": 7,
|
||||
"updatedAt": "刚刚"
|
||||
})
|
||||
sessions.append({
|
||||
@@ -536,7 +536,7 @@ def build_data():
|
||||
"deviceType": p["device_type"],
|
||||
"stage": "V0.5",
|
||||
"stageLabel": "V0.5 方案成型与法规对齐",
|
||||
"messageCount": 5,
|
||||
"messageCount": 7,
|
||||
"updatedAt": "刚刚"
|
||||
})
|
||||
|
||||
@@ -577,10 +577,23 @@ def build_data():
|
||||
|
||||
msg_idx = 2
|
||||
for pair_idx, (user_q, asst_a) in enumerate(p["chat_topics"]["u1"]):
|
||||
# 第一轮对话为上传 URS 需求文档 (挂载真实文件附件及可点击 docId)
|
||||
if pair_idx == 0:
|
||||
user_q = script["u1_initial"].format(urs_name=p["urs_file"]["name"])
|
||||
|
||||
# 在切换测试经理前插入系统审批通过进度通知
|
||||
if pair_idx == 3:
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-{msg_idx}",
|
||||
"sessionId": u1_sess,
|
||||
"role": "assistant",
|
||||
"category": "task",
|
||||
"intentTag": "🔔 流程进展 · 规格书终审通过",
|
||||
"content": f"【流程进展通知】王总监已正式终审批准《{p['srs_title']}》,V1.0 权威基线受控生效(approved)!下游【智能测试经理】工作流已放行解锁,可基于已批准基线编制验证方案。",
|
||||
"timestamp": "09:22",
|
||||
"authorName": "项目助手"
|
||||
})
|
||||
msg_idx += 1
|
||||
|
||||
user_msg = {
|
||||
"id": f"m-{pkey}-{msg_idx}",
|
||||
"sessionId": u1_sess,
|
||||
@@ -682,7 +695,8 @@ def build_data():
|
||||
messages.append(asst_msg)
|
||||
msg_idx += 1
|
||||
|
||||
# 3. 生成李主管 (u2) 审核对话 (调阅张工共享的 URS 文档并挂载【审核确认卡】)
|
||||
# 3. 生成李主管 (u2) 审核对话
|
||||
# 流程:张工提审后系统自动向李主管派发待办 -> 李主管针对性提问 -> 产生连续 2 条助手消息(回复报告 + 审核卡) -> 李主管签署 -> 助手闭环
|
||||
u2_sess = f"sess-{pkey}-u2"
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u2-1",
|
||||
@@ -692,9 +706,21 @@ def build_data():
|
||||
"timestamp": "10:00",
|
||||
"authorName": "项目助手"
|
||||
})
|
||||
# 3.1 系统派发提审待办通知
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u2-2",
|
||||
"sessionId": u2_sess,
|
||||
"role": "assistant",
|
||||
"category": "task",
|
||||
"intentTag": "🔔 待办任务 · 规格书合规初审",
|
||||
"content": f"【待办任务派发 · 系统需求规格书合规初审】\n\n编制人张工已完成《{p['srs_title']}》编制并提交合规初审。\n- **设计输入依据**:已关联张工共享的 URS 原文《{p['urs_file']['name']}》(需求溯源覆盖率 100%)\n- **核心技术指标**:{p['highlight_tech']}\n- **对标强制性标准**:{p['target_market']}\n\n请审核人李主管对技术指标分解充分性、公差边界及强标符合性进行复核并出具审核决策。",
|
||||
"timestamp": "10:02",
|
||||
"authorName": "项目助手"
|
||||
})
|
||||
# 3.2 李主管调阅提问
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u2-3",
|
||||
"sessionId": u2_sess,
|
||||
"role": "user",
|
||||
"category": "review",
|
||||
"intentTag": "🔍 调阅 URS 对标合规审查",
|
||||
@@ -707,13 +733,25 @@ def build_data():
|
||||
"timestamp": "10:05",
|
||||
"authorName": "李主管"
|
||||
})
|
||||
# 3.3 连续助手消息 1: 详细合规审核报告回复
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u2-3",
|
||||
"id": f"m-{pkey}-u2-4",
|
||||
"sessionId": u2_sess,
|
||||
"role": "assistant",
|
||||
"category": "review",
|
||||
"intentTag": "📋 URS 溯源覆盖核查与合规审核",
|
||||
"content": f"李主管您好!针对张工共享的 URS 输入《{p['urs_file']['name']}》与所编制《{p['srs_title']}》的合规对标审核报告如下:\n\n1. **URS 需求条目覆盖度**:原文档提取的全部临床与工程需求已全量转译,覆盖率 100%,已分配全局唯一受控编号(REQ-001 ~ REQ-XXX);\n2. **关键参数与公差界限**:核心技术亮点({p['highlight_tech']})均已设定精确公差区间与安全切断保护;\n3. **强制性标准审查**:完全符合 {p['target_market']} 现行有效版本,无漏项;\n4. **可检验性审查**:所有条目均已指明验证方法(分析/型检/测试),无模糊占位描述。\n\n已为您生成技术与合规审核门禁卡片,请您核验后执行确认:",
|
||||
"intentTag": "📋 URS 溯源覆盖核查报告",
|
||||
"content": f"李主管您好!针对张工共享的 URS 输入《{p['urs_file']['name']}》与所编制《{p['srs_title']}》的合规对标审核报告如下:\n\n1. **URS 需求条目覆盖度**:原文档提取的全部临床与工程需求已全量转译,覆盖率 100%,已分配全局唯一受控编号(REQ-001 ~ REQ-XXX);\n2. **关键参数与公差界限**:核心技术亮点({p['highlight_tech']})均已设定精确公差区间与安全切断保护;\n3. **强制性标准审查**:完全符合 {p['target_market']} 现行有效版本,无漏项;\n4. **可检验性审查**:所有条目均已指明验证方法(分析/型检/测试),无模糊占位描述。",
|
||||
"timestamp": "10:06",
|
||||
"authorName": "项目助手"
|
||||
})
|
||||
# 3.4 连续助手消息 2: 挂载合规审核确认卡片
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u2-5",
|
||||
"sessionId": u2_sess,
|
||||
"role": "assistant",
|
||||
"category": "review",
|
||||
"intentTag": "🛡️ 合规初审门禁卡片",
|
||||
"content": "技术与合规审查均已达标,已为您生成审核门禁卡片,请您核验后执行确认通过或驳回修订:",
|
||||
"timestamp": "10:06",
|
||||
"authorName": "项目助手",
|
||||
"interactiveCard": {
|
||||
@@ -748,8 +786,9 @@ def build_data():
|
||||
"resolvedAt": "2026-09-11T00:26:00.000Z"
|
||||
}
|
||||
})
|
||||
# 3.5 李主管确认签署
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u2-4",
|
||||
"id": f"m-{pkey}-u2-6",
|
||||
"sessionId": u2_sess,
|
||||
"role": "user",
|
||||
"category": "review",
|
||||
@@ -761,8 +800,9 @@ def build_data():
|
||||
"timestamp": "10:08",
|
||||
"authorName": "李主管"
|
||||
})
|
||||
# 3.6 助手确认归档并闭环
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u2-5",
|
||||
"id": f"m-{pkey}-u2-7",
|
||||
"sessionId": u2_sess,
|
||||
"role": "assistant",
|
||||
"category": "review",
|
||||
@@ -775,7 +815,8 @@ def build_data():
|
||||
"authorName": "项目助手"
|
||||
})
|
||||
|
||||
# 4. 生成王总监 (u3) 批准对话 (确认 URS 输入基线到 SRS 的闭环并挂载【终审批准卡】)
|
||||
# 4. 生成王总监 (u3) 批准对话
|
||||
# 流程:李主管初审通过后系统向王总监派发终审待办 -> 王总监调阅问询 -> 连续 2 条助手消息(汇报 + 批准卡) -> 王总监签批 -> 助手确认基线生效闭环
|
||||
u3_sess = f"sess-{pkey}-u3"
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u3-1",
|
||||
@@ -785,9 +826,21 @@ def build_data():
|
||||
"timestamp": "10:15",
|
||||
"authorName": "项目助手"
|
||||
})
|
||||
# 4.1 系统派发终审待办通知
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u3-2",
|
||||
"sessionId": u3_sess,
|
||||
"role": "assistant",
|
||||
"category": "task",
|
||||
"intentTag": "🔔 待办任务 · 规格书终审签批",
|
||||
"content": f"【待办任务派发 · 系统需求规格书终审签批】\n\n《{p['srs_title']}》已由编制人张工完成编制、审核人李主管初审通过。\n- **设计输入追溯**:对标 URS《{p['urs_file']['name']}》,需求闭环覆盖率 100%\n- **初审意见**:已核验强标符合性与指标公差,建议批准锁定 V1.0 权威基线\n\n请批准人王总监审阅并执行终审签批决策。",
|
||||
"timestamp": "10:18",
|
||||
"authorName": "项目助手"
|
||||
})
|
||||
# 4.2 王总监宏观把关问询
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u3-3",
|
||||
"sessionId": u3_sess,
|
||||
"role": "user",
|
||||
"category": "review",
|
||||
"intentTag": "👑 终审签批与基线决策",
|
||||
@@ -798,13 +851,25 @@ def build_data():
|
||||
"timestamp": "10:20",
|
||||
"authorName": "王总监"
|
||||
})
|
||||
# 4.3 连续助手消息 1: 终审质量门禁与溯源闭环汇报
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u3-3",
|
||||
"id": f"m-{pkey}-u3-4",
|
||||
"sessionId": u3_sess,
|
||||
"role": "assistant",
|
||||
"category": "review",
|
||||
"intentTag": "📊 终审质量门禁汇报",
|
||||
"content": f"王总监好!《{p['srs_title']}》基于原始用户需求文档《{p['urs_file']['name']}》编制,经张工编制、李主管初审通过:\n1. **设计输入溯源闭环率**:100%,静态 AST 检测通过率 100%;\n2. **关键指标界限**:核心亮点({p['highlight_tech']})均已设定精确公差区间与安全切断;\n3. **强标符合性**:{p['target_market']} 现行标准条款全部对齐。",
|
||||
"timestamp": "10:22",
|
||||
"authorName": "项目助手"
|
||||
})
|
||||
# 4.4 连续助手消息 2: 挂载终审批准确认卡
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u3-5",
|
||||
"sessionId": u3_sess,
|
||||
"role": "assistant",
|
||||
"category": "review",
|
||||
"intentTag": "🎯 权威基线受控发布终审",
|
||||
"content": f"王总监好!\n\n《{p['srs_title']}》基于原始用户需求文档《{p['urs_file']['name']}》编制,经张工编制、李主管初审通过,设计输入溯源闭环率 100%,质量门禁静态 AST 检测通过率 100%。\n终审批准后,系统将正式锁定 V1.0 权威基线,并自动解锁下游【智能测试经理】工作流,建立系统验证方案的受控文档血缘追溯。请您审阅并执行终审批准:",
|
||||
"content": "终审批准后,系统将正式锁定 V1.0 权威基线,并自动解锁下游【智能测试经理】工作流,建立系统验证方案的受控文档血缘追溯。请您审阅并执行终审批准:",
|
||||
"timestamp": "10:22",
|
||||
"authorName": "项目助手",
|
||||
"interactiveCard": {
|
||||
@@ -833,8 +898,9 @@ def build_data():
|
||||
"resolvedAt": "2026-09-11T00:28:00.000Z"
|
||||
}
|
||||
})
|
||||
# 4.5 王总监签署指令
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u3-4",
|
||||
"id": f"m-{pkey}-u3-6",
|
||||
"sessionId": u3_sess,
|
||||
"role": "user",
|
||||
"category": "review",
|
||||
@@ -844,8 +910,9 @@ def build_data():
|
||||
"timestamp": "10:25",
|
||||
"authorName": "王总监"
|
||||
})
|
||||
# 4.6 助手闭环生效汇报
|
||||
messages.append({
|
||||
"id": f"m-{pkey}-u3-5",
|
||||
"id": f"m-{pkey}-u3-7",
|
||||
"sessionId": u3_sess,
|
||||
"role": "assistant",
|
||||
"category": "review",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -46,6 +46,28 @@ describe('用户上传文档私密归档与共享流转测试', () => {
|
||||
assert.ok(!m.content.includes('我是审核人李主管'), `不得出现生硬自我介绍: ${m.content}`);
|
||||
assert.ok(!m.content.includes('我是批准人王总监'), `不得出现生硬自我介绍: ${m.content}`);
|
||||
});
|
||||
|
||||
// 6. 验证系统流程联动:提审待办派发与审核人处的连续两条助手消息 (第一条专业回复,第二条确认卡)
|
||||
seed.projects.forEach((proj: any) => {
|
||||
const pid = proj.id;
|
||||
const u2Sess = seed.sessions.find((s: any) => s.projectId === pid && s.userId === 2);
|
||||
assert.ok(u2Sess, `项目 ${pid} 必须存在李主管会话`);
|
||||
const u2Msgs = seed.messages.filter((m: any) => m.sessionId === u2Sess!.sessionId);
|
||||
assert.equal(u2Msgs.length, 7, `李主管会话必须包含 7 条完整流转消息`);
|
||||
assert.match(u2Msgs[1].content, /待办任务派发 · 系统需求规格书.*初审/, '必须包含系统自动派发的初审待办通知');
|
||||
assert.equal(u2Msgs[3].role, 'assistant', '第 4 条为合规答复');
|
||||
assert.equal(u2Msgs[4].role, 'assistant', '第 5 条连续为助手消息');
|
||||
assert.ok(u2Msgs[4].interactiveCard, '连续第 2 条助手消息必须挂载初审确认卡');
|
||||
|
||||
const u3Sess = seed.sessions.find((s: any) => s.projectId === pid && s.userId === 3);
|
||||
assert.ok(u3Sess, `项目 ${pid} 必须存在王总监会话`);
|
||||
const u3Msgs = seed.messages.filter((m: any) => m.sessionId === u3Sess!.sessionId);
|
||||
assert.equal(u3Msgs.length, 7, `王总监会话必须包含 7 条完整流转消息`);
|
||||
assert.match(u3Msgs[1].content, /待办任务派发 · 系统需求规格书终审签批/, '必须包含系统自动派发的终审待办通知');
|
||||
assert.equal(u3Msgs[3].role, 'assistant', '第 4 条为质量门禁汇报');
|
||||
assert.equal(u3Msgs[4].role, 'assistant', '第 5 条连续为助手消息');
|
||||
assert.ok(u3Msgs[4].interactiveCard, '连续第 2 条助手消息必须挂载终审批准确认卡');
|
||||
});
|
||||
});
|
||||
|
||||
it('用户上传附件自动生成私密交付物并在 AST 中建立隔离,支持流转至项目参考库', () => {
|
||||
|
||||
Reference in New Issue
Block a user