feat(review): seed 10 real medical device projects with dual workflows, multi-role dialogues and fix account-switch chat isolation

This commit is contained in:
WeiCHEN
2026-09-11 00:47:23 +08:00
parent dc12bc5794
commit 0d3cc6a6ce
8 changed files with 3735 additions and 9 deletions
@@ -0,0 +1,463 @@
-- 10 个示例医疗器械项目数据初始化脚本 (针对项目评审全流程落地)
BEGIN;
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES (6001, 'PROJ-WANGJING-0021', '膝骨关节炎综合治疗仪', '中国中医科学院望京医院骨伤科', '中药离子导入与多频温控电热综合治疗设备', '用于早中期膝骨关节炎患者的局部经皮靶向定向透药导入、穴位多频电刺激止痛与温热理疗', '中国 NMPA II类 (YY 0601-2007 中药定向透药治疗仪, GB 9706.1-2020, YY 0505-2012)', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6001, 'main', 'active', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'active', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6001, 'product_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6001, 'test_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6001-pm-01', 6001, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', 'doc-proj6001-system_reqs', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6001-tm-01', 6001, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', 'doc-proj6001-test_manager', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES (6001, 'doc-proj6001-test_manager', 1, 'doc-proj6001-system_reqs', 1, '8f74e4bc4391ec4a6fdfb62e3a634d537063f34e1dbcfdeec8f79760bf52ae4a', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES (6002, 'PROJ-TINAVI-0050', '移动式C形臂X射线机', '北京天智航医疗科技股份有限公司', '骨科手术三维透视导航配准高频X射线成像系统', '用于骨科创伤与脊柱微创手术中实时高频脉冲透视、三维空间重构及导航配准标记点追踪', '中国 NMPA III类 (GB 9706.1-2020, GB 9706.103, GB 9706.254, YY 0505)', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6002, 'main', 'active', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'active', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6002, 'product_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6002, 'test_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6002-pm-01', 6002, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', 'doc-proj6002-system_reqs', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6002-tm-01', 6002, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', 'doc-proj6002-test_manager', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES (6002, 'doc-proj6002-test_manager', 1, 'doc-proj6002-system_reqs', 1, '483e0647c100d48ef5ef84bc9d1a7765a1cd8cedb81d15f61cae567f5cccc2ea', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES (6003, 'PROJ-ROBOT-0025', '移动式远程查房听问诊系统', '解放军总医院第一医学中心急诊重症监护室', '移动式隔离病区智能巡诊查房与电子听诊系统', '用于传染病隔离病房及危重监护室中远程医生自主导航移动巡诊、高保真电子听诊心肺音与音视频问诊', '中国 NMPA II类 (GB 9706.1-2020, YY 0505, 机器人安全通用要求)', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6003, 'main', 'active', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'active', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6003, 'product_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6003, 'test_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6003-pm-01', 6003, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', 'doc-proj6003-system_reqs', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6003-tm-01', 6003, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', 'doc-proj6003-test_manager', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES (6003, 'doc-proj6003-test_manager', 1, 'doc-proj6003-system_reqs', 1, '13ad277e56bd20a2ef06e6d71ecabbffe6236083569103a4646b477f8740d5e8', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES (6004, 'PROJ-XHJ-0089', '一次性使用高频手术电极', '常州祥合洁医疗科技有限公司', '无源微创高频腹腔镜手术电极附件', '与兼容的高频手术设备主机配套,用于内窥镜或普腹手术中对人体软组织进行电切、电凝止血与剥离', '中国 NMPA II类 (GB 9706.202-2021 高频手术设备专标, GB/T 16886, GB 9706.1)', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6004, 'main', 'active', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'active', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6004, 'product_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6004, 'test_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6004-pm-01', 6004, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', 'doc-proj6004-system_reqs', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6004-tm-01', 6004, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', 'doc-proj6004-test_manager', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES (6004, 'doc-proj6004-test_manager', 1, 'doc-proj6004-system_reqs', 1, 'fbd0fab840ef3ee0fc7dfebd81aa1aa86774282ea195604133bce4c1a6df8c31', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES (6005, 'PROJ-ENDO-0029', '自动化牙髓根管治疗仪', '首都医科大学附属北京口腔医院牙体牙髓科', '牙科电动根管自适应预备与根尖阻抗测距一体化系统', '用于牙科牙体牙髓病及根尖周病治疗中根管的机用镍钛锉旋转往复预备扩锉与根尖孔生理狭窄区精确定位', '中国 NMPA II类 (YY 0836-2011 牙科根管预备机, YY 0505, GB 9706.1-2020)', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6005, 'main', 'active', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'active', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6005, 'product_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6005, 'test_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6005-pm-01', 6005, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', 'doc-proj6005-system_reqs', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6005-tm-01', 6005, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', 'doc-proj6005-test_manager', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES (6005, 'doc-proj6005-test_manager', 1, 'doc-proj6005-system_reqs', 1, 'b8c9a0363ecc46659fb79409eed60c06431044abb25a865b24e8136017dde9a6', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES (6006, 'PROJ-ARNAV-0035', '智能手术AR导航系统', '水木东方自研医疗器械研发中心 (转化医学实验室)', '独立医疗器械软件 (SaMD, II类医疗器械)', '用于显微外科与骨科导航中将术前三维 CT/MRI 重建解剖结构与光学透视 AR 眼镜实时精准配准叠加', '中国 NMPA II类 (YY/T 0664-2020 软件生存周期, GB/T 25000.51, 医疗器械网络安全)', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6006, 'main', 'active', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'active', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6006, 'product_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6006, 'test_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6006-pm-01', 6006, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', 'doc-proj6006-system_reqs', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6006-tm-01', 6006, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', 'doc-proj6006-test_manager', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES (6006, 'doc-proj6006-test_manager', 1, 'doc-proj6006-system_reqs', 1, '37eb3e2b0ba16369fd8c94f88c40d6cbca8635bf998acd1be75dd069a1599056', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES (6007, 'PROJ-LT-0068', '等离子射频手术电极', '北京蓝汀医疗器械开发有限公司', '微创关节与耳鼻喉低温等离子多极射频刀头', '与等离子射频手术主机配合,在生理盐水导电介质中激发低温等离子体薄层,用于微创软组织的精确消融打孔与凝血', '中国 NMPA II类 (YY 9706.202, GB 9706.1-2020, GB/T 16886)', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6007, 'main', 'active', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'active', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6007, 'product_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6007, 'test_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6007-pm-01', 6007, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', 'doc-proj6007-system_reqs', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6007-tm-01', 6007, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', 'doc-proj6007-test_manager', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES (6007, 'doc-proj6007-test_manager', 1, 'doc-proj6007-system_reqs', 1, '8930ba436f8126ee65975896fc8f8deb63a4c04495df38252fccb1913a74b74e', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES (6008, 'PROJ-PLASMA-0092', '低温等离子体手术系统', '天津医科大学总医院耳鼻咽喉头颈外科', '医用多功能低温等离子手术发生器与控制系统', '用于耳鼻咽喉、关节外科、脊柱微创手术中通过 100kHz 射频激发低温等离子体对软组织进行分子键裂解消融、精确切割与双极电凝止血', '中国 NMPA III类 (GB 9706.1-2020, YY 9706.202, YY 0505)', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6008, 'main', 'active', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'active', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6008, 'product_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6008, 'test_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6008-pm-01', 6008, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', 'doc-proj6008-system_reqs', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6008-tm-01', 6008, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', 'doc-proj6008-test_manager', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES (6008, 'doc-proj6008-test_manager', 1, 'doc-proj6008-system_reqs', 1, 'f5e59970599eaa44aae8270654e019f8dcb517e519bee1828581992e681f6eaf', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES (6009, 'PROJ-ESWT-0095', '体外气压弹道冲击波治疗仪', '北京大学第三医院运动医学研究所', '气压弹道式体外冲击波组织损伤治疗设备', '用于慢性软组织肌腱止点病变、跟腱炎、足底筋膜炎、肩周炎的局部无创高能压力脉冲松解与骨肌镇痛', '中国 NMPA II类 (YY 0650-2008 体外冲击波治疗机专标, GB 9706.1-2020, YY 0505)', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6009, 'main', 'active', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'active', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6009, 'product_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6009, 'test_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6009-pm-01', 6009, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', 'doc-proj6009-system_reqs', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6009-tm-01', 6009, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', 'doc-proj6009-test_manager', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES (6009, 'doc-proj6009-test_manager', 1, 'doc-proj6009-system_reqs', 1, '2044a120873753211b08d80a8ade4153e41c7928342128f7128332dd7df1d252', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES (6010, 'PROJ-MSK-0108', '肌骨超声影像处理软件', '中日友好医院超声诊断科与风湿免疫科', '独立超声影像处理辅助分析软件 (SaMD, II类医疗器械)', '用于风湿关节炎及运动损伤中高频肌骨超声图像的滑膜增生厚度、肌腱断端撕裂间距及血流多普勒信号的智能测量与报告生成', '中国 NMPA II类 (YY/T 0664-2020, GB/T 25000.51, 医疗器械软件指导原则)', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6010, 'main', 'active', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'active', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6010, 'product_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES (6010, 'test_manager', 'ready', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = 'ready', enabled = true, updated_at = now();
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6010-pm-01', 6010, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', 'doc-proj6010-system_reqs', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('run-proj6010-tm-01', 6010, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', 'doc-proj6010-test_manager', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES (6010, 'doc-proj6010-test_manager', 1, 'doc-proj6010-system_reqs', 1, '69cd6354e2d88fec777a00e1fe5c6ee9e297ba0119615ba9482b09ee311f7373', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
COMMIT;
+11
View File
@@ -250,6 +250,17 @@ func (s *Server) handleGetProjectLineage(w http.ResponseWriter, r *http.Request)
http.Error(w, `{"error":"ERR_INTERNAL","message":"`+err.Error()+`"}`, http.StatusInternalServerError)
return
}
if len(lineages) == 0 {
idStr := r.PathValue("id")
if id, _ := strconv.ParseInt(idStr, 10, 64); id > 0 {
hyphenDocID := fmt.Sprintf("doc-proj%d-test_manager", id)
if hyphenDocID != docID {
if fb, fbErr := s.pwSvc.GetLineageForDownstream(r.Context(), hyphenDocID, 0); fbErr == nil && len(fb) > 0 {
lineages = fb
}
}
}
}
if lineages == nil {
lineages = make([]*projectworkflow.DocumentLineage, 0)
}
+665
View File
@@ -0,0 +1,665 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
生成 10 个医疗器械示例项目的完整数据包 (前端 Seed JSON + 后端 SQL 导入脚本)
涵盖:
1. 项目基础信息与工作流状态 (main, product_manager, test_manager)
2. 多角色生动、自然、各具专业特色的对话记录 (张工 u1, 李主管 u2, 王总监 u3)
3. 真实 40KB~90KB 的《系统需求规格书》与《系统验证方案及计划》Markdown 全文
4. 文档血缘 (document_lineage) 与工作流运行记录 (workflow_runs)
"""
import hashlib
import json
import os
import sys
PROJECT_DEFS = [
{
"id": 6001,
"code": "PROJ-WANGJING-0021",
"key": "wangjing",
"name": "膝骨关节炎综合治疗仪",
"short_name": "膝骨关节炎综合治疗仪 (望京医院)",
"customer": "中国中医科学院望京医院骨伤科",
"device_type": "中药离子导入与多频温控电热综合治疗设备",
"intended_use": "用于早中期膝骨关节炎患者的局部经皮靶向定向透药导入、穴位多频电刺激止痛与温热理疗",
"target_market": "中国 NMPA II类 (YY 0601-2007 中药定向透药治疗仪, GB 9706.1-2020, YY 0505-2012)",
"path": "/Volumes/新加卷/WeiCHEN-Backup/01-Projects/ShuiMuDongFang/2026-08-17 飞书智能体/.tmp/dual-agent/望京医院",
"highlight_tech": "双通道脉冲离子导入极性自适应换相技术,温控范围 38℃~45℃ ±0.5℃,输出隔离耐压 4000V",
"srs_title": "膝骨关节炎综合治疗仪系统需求规格书",
"svp_title": "膝骨关节炎综合治疗仪系统验证方案及计划",
"chat_topics": {
"u1": [
("张工,今天刚从望京医院骨伤科调研回来,临床主任提出两点核心诉求:第一是中药凝胶离子透药时极化导致皮肤灼痛红斑,第二是希望理疗温热和电脉冲必须具备双重独立限温硬件切断保护。",
"已收到望京医院骨伤科的最新临床反馈!我已将这两项关键技术诉求关联至项目事实黑板:\n1. 【离子渗透防灼伤】:将采用「双极性非对称周期换相脉冲算法」,换相周期 30s~120s 可调,大幅消除极板电荷积累与电化学灼伤;\n2. 【双重物理限温】:MCU 采用闭环 NTC 数字 PID 控温(38℃~45℃),贴片回路串联双金属温控开关(47℃ 硬件不可逆硬切断),符合 YY 0601 与 GB 9706.1 接触表面限温要求。\n\n智能体小队(organizer、engineer、regulatory、writer)已就位,是否立即为您生成第一版受控《系统需求规格书》?"),
("请深入分析一下:YY 0601-2007 对输出直流分量和漏电流有严格限值,我们在变压器隔离和驱动桥设计上该怎么落规?",
"关于 YY 0601-2007 与 GB 9706.1-2020 输出端电气绝缘与患者漏电流的合规设计,技术解析如下:\n\n### 一、法规限值基线\n- 患者漏电流(正常状态):直流 < 10 μA,交流 < 100 μA(BF型应用部分);\n- 单一故障状态(S.F.C.):漏电流必须 < 500 μA;\n- YY 0601 规定透药通道开路电压不得超过 100 V,最大有效输出电流不得超过 50 mA。\n\n### 二、硬件工程拓扑\n1. **全隔离驱动**:采用变压器原副边电气绝缘(爬电距离 ≥ 5.0 mm,电气间隙 ≥ 3.2 mm,耐压 4000 VAC 1分钟);\n2. **输出级防直流失步**:在电极输出端串接无极性低等效串联电阻(ESR)安规隔直电容(耐压 250V),即便 MCU PWM 异常封波,也能彻底杜绝纯直流进入人体组织;\n3. **动态阻抗检测**:实时检测电极脱落(阻抗 > 5 kΩ 自动封波)与短路保护(阻抗 < 50 Ω 限流 < 5 mA)。"),
("很好,参数完整。请启动【智能产品经理】工作流,生成完整的受控《系统需求规格书》(RD-SR)。",
"已启动【智能产品经理工作流】编制任务!\n\n- 步骤1/5: 需求提炼(已提取 39 项用户需求)\n- 步骤2/5: 规格分解(完成电气、温控、软件、结构 117 项 REQ 条目)\n- 步骤3/5: 强标论证(对齐 YY 0601、GB 9706.1、YY 0505)\n- 步骤4/5: 全文编制(完成 12 个规范章节,含环境与包材要求)\n- 步骤5/5: 可测性终审(门禁通过率 100%,无 TODO 占位符)\n\n正式成果《膝骨关节炎综合治疗仪系统需求规格书》已生成并载入交付物受控大盘(doc-proj6001-system_reqs),现已提交李主管审核。"),
("李主管和王总监已审批通过规格书!请切换到【智能测试经理】工作流,以已批准的规格书为基准,编制完整的《系统验证方案及计划》(RD-SVP)。",
"已原子切换至【智能测试经理】工作流焦点!\n系统检测到前置依赖《系统需求规格书》(RD-SR, V1.0, 状态: approved) 已就绪,已放行前置质量门禁。\n\n测试经理智能体正在遍历 117 项系统规格条目,自动生成映射验证用例库(涵盖温控精度试验、输出波形与电流密度试验、电磁兼容试验、安规耐压与漏电流试验、软件压力与故障注入测试)。\n\n成果《膝骨关节炎综合治疗仪系统验证方案及计划》已生成完毕(doc-proj6001-test_manager)!系统已建立与上游规格书的文档血缘追踪链路,版本与 SHA-256 均已安全锁定。")
]
}
},
{
"id": 6002,
"code": "PROJ-TINAVI-0050",
"key": "tianzhihang",
"name": "移动式C形臂X射线机",
"short_name": "移动式C形臂X射线机 (天智航)",
"customer": "北京天智航医疗科技股份有限公司",
"device_type": "骨科手术三维透视导航配准高频X射线成像系统",
"intended_use": "用于骨科创伤与脊柱微创手术中实时高频脉冲透视、三维空间重构及导航配准标记点追踪",
"target_market": "中国 NMPA III类 (GB 9706.1-2020, GB 9706.103, GB 9706.254, YY 0505)",
"path": "/Volumes/新加卷/WeiCHEN-Backup/01-Projects/ShuiMuDongFang/2026-08-17 飞书智能体/.tmp/dual-agent/天智航",
"highlight_tech": "高压发生器 50kW / 120kV / 0.1s脉冲曝光,平板探测器 30cm×30cm 像元 100μm,激光交叉十字线投照精度 ±0.5mm",
"srs_title": "移动式C形臂X射线机系统需求规格书",
"svp_title": "移动式C形臂X射线机系统验证方案及计划",
"chat_topics": {
"u1": [
("参谋你好,天智航骨科手术机器人对配套 C 臂提出了硬性指标:透视中心空间重复定位精度必须优于 0.3mm,且每次三维扫描辐射累积剂量较传统连续透视降低 30% 以上。",
"天智航的指标非常明确!手术机器人配准对 C 臂空间刚性及剂量控制提出了极致要求:\n1. 【空间精度】:必须采用航空级高刚度碳纤维平衡复合弧形臂轨道,搭配高分辨率绝对值编码器(重复定位精度 < 0.2mm);\n2. 【超低剂量脉冲透视】:采用自适应微剂量脉冲曝光技术(1~15 fps 可调,脉宽 < 10ms),配合智能滤线栅与三维去散射线网格重建算法,辐射剂量较连续透视可实测降低 35%~50%;\n3. 【通讯互锁接口】:必须建立标准光学隔离 DICOM 3.0 / RD-Interface 手术机器人控制总线。\n\n智能体小队已就位,建议立即编制《系统需求规格书》锁定专标 GB 9706.254 与 GB 9706.103 辐射防护条款。"),
("请补充分析:C 臂沿轨道滑动和摆动时,电缆拖链与高压电缆弯折寿命以及平衡机构防滑落安全保护如何规范?",
"关于 C 臂机械运动防坠落与电缆寿命工程规格:\n\n### 一、防坠落重力平衡机构设计\n- 采用高精度双恒力弹簧预紧机构与冗余电磁断电刹车(抱闸):在发生意外断电或驱动皮带断裂时,机械抱闸在 10 ms 内强行抱紧,C 臂下坠滑移量不得大于 1.0 mm,完全满足 GB 9706.1 机械危险防护标准;\n- 轨道两端设置双级机械聚氨酯防撞缓冲块及双路极限行程微动开关(硬件级互锁中断高压驱动)。\n\n### 二、高压电缆与信号拖链寿命\n- 高压电缆弯曲半径必须 ≥ 8 倍外径,拖链采用低粉尘超高柔性静音尼龙护套;\n- 规定满行程(滑动 130°、轨道旋转 ±180°)机械疲劳试验寿命必须通过 100,000 次无内部绝缘破损与高压打火。"),
("请启动智能产品经理工作流,产出正式版《系统需求规格书》(RD-SR)。",
"已触发【智能产品经理工作流】!\n正在调取天智航原始用户需求(RDDHF0201-0050),完成 99 项规格条目分解及 X 射线专标(GB 9706.254)条文对齐。\n\n已成功生成《移动式C形臂X射线机系统需求规格书》(doc-proj6002-system_reqs)并锁定受控状态!正文包括球管热容量、平板成像特性、激光指示器波长、电磁制动扭矩及辐射泄漏率等严苛技术要求。"),
("规格书经李主管审核与王总监批准已正式受控生效。请立即启动【智能测试经理】工作流,输出配套的系统验证方案。",
"收到!系统校验前置《系统需求规格书》已处于批准态,前置依赖门禁通过!\n\n智能测试经理已启动执行:\n1. 提取 136 项可测性技术指标;\n2. 编制《移动式C形臂X射线机系统验证方案及计划》(doc-proj6002-test_manager);\n3. 覆盖高压重复性试验、X射线空气比释动能率试验、空间分辨率线对卡实测(≥ 3.2 lp/mm)、跌落与抗倾翻稳定性试验;\n4. 建立与规格书各 REQ- 的双向追溯矩阵(Traceability Matrix)及 SHA-256 数据指纹。")
]
}
},
{
"id": 6003,
"code": "PROJ-ROBOT-0025",
"key": "xunzun",
"name": "移动式远程查房听问诊系统",
"short_name": "巡诊机器人 (ICU远程查房)",
"customer": "解放军总医院第一医学中心急诊重症监护室",
"device_type": "移动式隔离病区智能巡诊查房与电子听诊系统",
"intended_use": "用于传染病隔离病房及危重监护室中远程医生自主导航移动巡诊、高保真电子听诊心肺音与音视频问诊",
"target_market": "中国 NMPA II类 (GB 9706.1-2020, YY 0505, 机器人安全通用要求)",
"path": "/Volumes/新加卷/WeiCHEN-Backup/01-Projects/ShuiMuDongFang/2026-08-17 飞书智能体/.tmp/dual-agent/巡诊机器人",
"highlight_tech": "激光SLAM自主建图避障导航,多自由度听诊机械臂接触力控 0.5N~2.0N,电子听诊器 20Hz~2000Hz 动态降噪",
"srs_title": "移动式远程查房听问诊系统系统需求规格书",
"svp_title": "移动式远程查房听问诊系统系统验证方案及计划",
"chat_topics": {
"u1": [
("总医院 ICU 主任在现场演示中提出:机器人在病床狭窄过道(最小通过宽度 70cm)必须保证不能发生任何刮碰,且电子听诊器采集心音时,必须滤除病房呼吸机和监护仪的气泵低频啸叫。",
"这两点直击重症监护巡诊机器人的痛点!技术应对策略如下:\n1. 【窄道防刮碰】:采用「双 3D-LiDAR + 前向 ToF 深度相机 + 超声环测」全融合避障方案,最小通行净宽由原 80cm 压降至 65cm,并在机械底盘外缘包裹医用硅胶缓冲压力接触带(触碰即停,制动响应时间 < 20ms);\n2. 【心肺音自适应降噪】:电子听诊头内置压电薄膜传感器与环境噪声参考麦克风,采用自适应谱减法与自适应 LMS 滤波,可精准滤除 50Hz/100Hz 工频干扰与呼吸机气泵(20~200Hz 宽带脉冲噪音),心音特征保留度 > 95%。\n\n小队已准备好编制受控系统需求规格书。"),
("听诊机械臂接触患者胸部时,如果患者咳嗽或者突然翻身,如何保证绝对安全?力反馈安全策略是什么?",
"机械臂接触人体的安全策略遵循严格的三级保护机制:\n\n1. **一级力控闭环**:听诊臂末端配置六维力传感器,微处理器实时运行阻抗力控算法,设定目标接触压力为 1.2 N ± 0.3 N;当患者咳嗽导致胸壁突然突起(瞬时压力 > 3.0 N)时,机械臂在 5 ms 内主动后撤卸力;\n2. **二级物理滑移离合器**:关节驱动链内置机械阻尼过载脱扣器,任何方向外力超过 8 N 时机械脱扣自由回弹;\n3. **三级软件超时防护**:单次听诊贴合持续时间不得超过 45s,超时强制收回至归位安全锚点。完全满足机器人医疗器械接触安全准则。"),
("请启动【智能产品经理】工作流,生成规格书。",
"【智能产品经理工作流】执行完毕!已生成《移动式远程查房听问诊系统系统需求规格书》(doc-proj6003-system_reqs)。涵盖激光导航定位精度(重复定位误差 < 15mm)、音视频端到端延迟(< 150ms)、听诊器声学频响曲线(20Hz~2000Hz)、锂电池连续工作巡航(≥ 8小时)等 133 项规格。"),
("经审核批准后,请触发【智能测试经理】工作流,产出系统验证方案。",
"已切换至【智能测试经理】工作流!前置依赖核验完成(规格书状态为 approved)。\n测试经理已生成《移动式远程查房听问诊系统系统验证方案及计划》(doc-proj6003-test_manager),包含:倾翻与越障试验(越过 10mm 门槛)、机械臂接触力超载主动后退试验、心肺音仿真发生器对比失真度测试(THD < 1.0%)、网络弱网丢包模拟试验。文档血缘已绑定!")
]
}
},
{
"id": 6004,
"code": "PROJ-XHJ-0089",
"key": "xianghejie",
"name": "一次性使用高频手术电极",
"short_name": "一次性高频手术电极 (祥合洁)",
"customer": "常州祥合洁医疗科技有限公司",
"device_type": "无源微创高频腹腔镜手术电极附件",
"intended_use": "与兼容的高频手术设备主机配套,用于内窥镜或普腹手术中对人体软组织进行电切、电凝止血与剥离",
"target_market": "中国 NMPA II类 (GB 9706.202-2021 高频手术设备专标, GB/T 16886, GB 9706.1)",
"path": "/Volumes/新加卷/WeiCHEN-Backup/01-Projects/ShuiMuDongFang/2026-08-17 飞书智能体/.tmp/dual-agent/祥合洁电极",
"highlight_tech": "涂覆全氟医用绝缘层耐击穿电压 > 3000Vrms,电极刀头采用防粘耐腐 316L/钨合金,手柄密封防水 IPX7",
"srs_title": "一次性使用高频手术电极系统需求规格书",
"svp_title": "一次性使用高频手术电极系统验证方案及计划",
"chat_topics": {
"u1": [
("张工汇报:祥合洁电极重点在型检中的高温高频绝缘耐压和生物相容性,刀杆在 300℃ 高温切凝后绝缘层不能脱落或碳化击穿。",
"收到!针对微创高频电极两大生命线指标:\n1. 【耐高频高压击穿】:依据 GB 9706.202-2021,绝缘套管耐压必须经受高频峰值电压(典型 3500 Vpeak)测试,泄漏电流不得灼伤内窥镜鞘管和腹壁组织;\n2. 【绝缘层耐热抗老化】:采用交联氟塑料热缩护套或聚醚醚酮(PEEK),在模拟连续电凝 60 秒后,绝缘电阻仍保持 > 100 MΩ;\n3. 【生物相容性】:刀头与手柄符合 GB/T 16886 细胞毒性(≤ 1级)、皮内刺激与迟发型超敏反应全阴性。\n\n智能体小队将以此基准构建需求规格书。"),
("请详细说明按 GB 9706.202 进行高频电极高压试验的配置要求与检验方法。",
"GB 9706.202-2021 对高频附件绝缘强度的检测规范:\n- 试验在 0.9% 生理盐水浴中进行,浸没深度覆盖有效工作杆部分(除裸露电极尖端 5mm 外);\n- 施加 1.2 倍额定附件高频峰值工作电压(如标称 3000V 则施加 3600Vpeak,频率 300kHz~1MHz)持续 60 秒;\n- 试验期间不得出现火花放电、飞弧或绝缘套管烧穿孔洞,高频漏电流必须低于 50 mA。\n该检验规程已作为强制条目纳入规格书。"),
("请启动【智能产品经理】工作流,生成受控需求规格书。",
"已完成【智能产品经理工作流】全流程编排!正式生成《一次性使用高频手术电极系统需求规格书》(doc-proj6004-system_reqs)。涵盖刀尖几何公差(±0.05mm)、插头插拔力(5N~25N)、电极抗弯曲强度(承受 20N 侧向力无永久塑性变形)等 46 项工程指标。"),
("规格书批准生效,请切换至【智能测试经理】工作流生成验证方案与计划。",
"已切换【智能测试经理】工作流,前置依赖已确认!\n成功生成《一次性使用高频手术电极系统验证方案及计划》(doc-proj6004-test_manager)。方案涵盖高压介电强度试验、环氧乙烷灭菌残留量实测(EO ≤ 10 μg/g)、无菌包装热封密封剥离力测试(1.5N/15mm~3.5N/15mm)及高频组织切割热损伤深度病理切片对比试验。血缘链路完整。")
]
}
},
{
"id": 6005,
"code": "PROJ-ENDO-0029",
"key": "yamui",
"name": "自动化牙髓根管治疗仪",
"short_name": "自动化牙髓根管治疗仪 (北京口腔医院)",
"customer": "首都医科大学附属北京口腔医院牙体牙髓科",
"device_type": "牙科电动根管自适应预备与根尖阻抗测距一体化系统",
"intended_use": "用于牙科牙体牙髓病及根尖周病治疗中根管的机用镍钛锉旋转往复预备扩锉与根尖孔生理狭窄区精确定位",
"target_market": "中国 NMPA II类 (YY 0836-2011 牙科根管预备机, YY 0505, GB 9706.1-2020)",
"path": "/Volumes/新加卷/WeiCHEN-Backup/01-Projects/ShuiMuDongFang/2026-08-17 飞书智能体/.tmp/dual-agent/自动化牙髓治疗仪",
"highlight_tech": "双频根尖阻抗测量精度 ±0.1mm,自适应扭矩控制 0.2~5.0 N·cm,超载在 20ms 内自动反转防断针",
"srs_title": "自动化牙髓根管治疗仪系统需求规格书",
"svp_title": "自动化牙髓根管治疗仪系统验证方案及计划",
"chat_topics": {
"u1": [
("北京口腔医院专家要求:根管治疗仪必须彻底解决器械断针风险,在弯曲根管遇到阻力时扭矩响应必须毫秒级反转,且在充盈次氯酸钠溶液湿润环境下测距不失准。",
"收到!牙髓根管治疗的两个世界级难点已被准确定位:\n1. 【断针预防与恒扭矩响应】:微电机驱动器必须采用 10kHz 高频矢量电流采样,闭环扭矩响应时间控制在 15 ms 以内;一旦实时扭矩逼近设定安全阈值(如 2.5 N·cm),立即自动触发「往复旋转(Reciprocating)」或「自动反转退锉(Auto-Reverse)」,杜绝镍钛器械扭转疲劳断裂;\n2. 【湿润根管测距】:采用高低双频(0.5kHz 与 4.0kHz)交流阻抗比率积分测距算法,即使根管内存在血液、脓液或次氯酸钠冲洗液,根尖孔狭窄区距离精度仍稳定保持在 ±0.2 mm 以内。\n\n智能体小队立即以此生成系统规格书。"),
("请梳理弯曲根管模型下疲劳循环寿命测试和反转延迟时间具体的测试方法与接受准则。",
"依据 YY 0836 与临床根管器械标准:\n- 采用不锈钢仿真弯曲人工根管模型(弯曲角度 45° 与 60°,曲率半径 5mm);\n- 设定电机转速 350 rpm,限扭 2.0 N·cm,测试 100 次阻滞加载,记录从阻滞发生到电机反向旋转的响应延迟时间,接受准则:延时不得大于 20 ms;\n- 进行 500 次循环扩锉,镍钛锉不得发生断裂或塑性解旋畸变。条目已入库。"),
("请启动智能产品经理工作流编制《系统需求规格书》。",
"已执行【智能产品经理工作流】!已输出《自动化牙髓根管治疗仪系统需求规格书》(doc-proj6005-system_reqs)。涵盖转速范围(100~1000 rpm ±10%)、弯机头 16:1 减速比配合公差、机身防水防喷溅、高压蒸汽灭菌(134℃,3分钟)耐受性等 62 项技术要求。"),
("规格书经评审已批准!请启动【智能测试经理】工作流,建立系统验证方案并绑定血缘。",
"已启动【智能测试经理】工作流!前置门禁顺利通过。\n正式产出《自动化牙髓根管治疗仪系统验证方案及计划》(doc-proj6005-test_manager)。包含转矩校准误差测试、多频阻抗测量一致性测试、反转防断针疲劳考核、手柄高温灭菌 250 次循环验证试验等 62 项完整测试用例,血缘与哈希值均已持久化。")
]
}
},
{
"id": 6006,
"code": "PROJ-ARNAV-0035",
"key": "ziyanar",
"name": "智能手术AR导航系统",
"short_name": "智能手术AR导航系统 (自研AR)",
"customer": "水木东方自研医疗器械研发中心 (转化医学实验室)",
"device_type": "独立医疗器械软件 (SaMD, II类医疗器械)",
"intended_use": "用于显微外科与骨科导航中将术前三维 CT/MRI 重建解剖结构与光学透视 AR 眼镜实时精准配准叠加",
"target_market": "中国 NMPA II类 (YY/T 0664-2020 软件生存周期, GB/T 25000.51, 医疗器械网络安全)",
"path": "/Volumes/新加卷/WeiCHEN-Backup/01-Projects/ShuiMuDongFang/2026-08-17 飞书智能体/.tmp/dual-agent/自研AR",
"highlight_tech": "双目光学透视配准空间误差 < 0.8mm,运动到成像端到端延迟 < 20ms,立体渲染帧率稳定 90fps",
"srs_title": "智能手术AR导航系统系统需求规格书",
"svp_title": "智能手术AR导航系统系统验证方案及计划",
"chat_topics": {
"u1": [
("研发组汇报:自研AR外科导航软件需要进入注册体系。主任强调头戴AR眩晕感和配准漂移问题,要求空间重叠精度必须小于 1mm,帧率不能低于 60fps。",
"收到!作为高精度的医疗 AR 导航软件(SaMD),针对眩晕与空间精度制定如下规格:\n1. 【空间配准精度】:结合红外光学追踪仪与眼镜端 SLAM 重定位,三维空间靶点配准均方根误差(TRE)控制在 ≤ 0.8 mm;\n2. 【运动到光子延迟(M2P)】:全链路优化图像渲染管线与异步时间扭曲(ATW),端到端延迟压至 ≤ 18 ms,消除医生手术视野视差错位与眩晕感;\n3. 【软件合规】:完全按照 YY/T 0664-2020 软件安全性级别(B级)及《医疗器械网络安全指导原则》实施。"),
("请针对软件算法异常(如定位丢失、标记物遮挡)时的人机界面安全警示与容错逻辑给出规格。",
"软件容错与安全机制规约:\n- 当红外反光标记点被手术器械遮挡超过 2 帧(约 22 ms)时,屏幕虚景必须在 5 ms 内切换为半透明闪烁警示态,并弹出文字警告「跟踪信号中断,请勿依据当前虚景下刀」;\n- 若遮挡持续超过 500 ms,自动隐藏虚景模型,杜绝误导操作;\n- 系统支持双目独立标定参数动态补偿算法,满足 GB/T 25000.51 软件容错性准则。"),
("请启动【智能产品经理】工作流,生成受控软件需求规格书。",
"已执行【智能产品经理工作流】!正式输出《智能手术AR导航系统系统需求规格书》(doc-proj6006-system_reqs)。涵盖 DICOM 数据导入解析校验、三维表面网格重构(Marching Cubes)、刚体变换配准算法、网络数据传输安全(TLS 1.3)等 57 项规范指标。"),
("软件需求规格书已获李主管与王总监审批,请启动【智能测试经理】工作流生成软件验证方案。",
"已切换至【智能测试经理】工作流!前置依赖已核验闭环。\n正式生成《智能手术AR导航系统系统验证方案及计划》(doc-proj6006-test_manager),包含空间标定精度实测、白盒覆盖率要求(语句覆盖 100%、分支覆盖 85%)、故障注入(模拟 DICOM 缺失、网络丢包、标记物反光污染)及持续 72 小时压力内存泄漏监测用例。血缘已牢固绑定!")
]
}
},
{
"id": 6007,
"code": "PROJ-LT-0068",
"key": "lanting",
"name": "等离子射频手术电极",
"short_name": "等离子射频手术电极 (蓝汀)",
"customer": "北京蓝汀医疗器械开发有限公司",
"device_type": "微创关节与耳鼻喉低温等离子多极射频刀头",
"intended_use": "与等离子射频手术主机配合,在生理盐水导电介质中激发低温等离子体薄层,用于微创软组织的精确消融打孔与凝血",
"target_market": "中国 NMPA II类 (YY 9706.202, GB 9706.1-2020, GB/T 16886)",
"path": "/Volumes/新加卷/WeiCHEN-Backup/01-Projects/ShuiMuDongFang/2026-08-17 飞书智能体/.tmp/dual-agent/蓝汀电极",
"highlight_tech": "双极/多极同轴高频等离子体激发,组织消融工作温度 40℃~70℃,集成冲洗与负压吸引通道",
"srs_title": "等离子射频手术电极系统需求规格书",
"svp_title": "等离子射频手术电极系统验证方案及计划",
"chat_topics": {
"u1": [
("蓝汀电极样机测试发现两个问题:一是刀头等离子薄层激发点火时存在高频微弧闪络;二是抽吸通道容易被碳化软组织碎屑堵塞。",
"这两个问题非常典型,属于等离子射频电极的工艺核心:\n1. 【等离子微弧稳定与阻抗匹配】:刀头电极与回路电极间距严格控制在 0.8 mm ± 0.05 mm,采用耐等离子轰击的高纯陶瓷绝缘体(Al2O3 ≥ 99.5%),并在表面采用激光微织构技术,使得高频等离子体在 0.9% 生理盐水下可在 100 kHz 激发均匀薄层,消除集中电弧火花;\n2. 【防堵塞抽吸一体化设计】:抽吸口采用喇叭口渐变孔径(内径 1.2mm 扩至 1.8mm),配合特氟龙内壁涂层,阻力降低 40%,杜绝碎屑黏附。\n\n智能体小队将据此整理规格书。"),
("请确认按 YY 9706.202 对等离子电极的高频漏电流及耐受持续消融的寿命要求。",
"依据标准与技术指标:\n- 高频患者漏电流在开路及额定负载下必须 ≤ 100 mA;\n- 刀头在额定最高功率(如 250W)下,连续激发等离子消融 10 秒、间歇 10 秒,循环 100 次后,陶瓷绝缘体无破裂碎裂,电极无脱落熔损,气密性(-80 kPa 维持 10s 泄漏 < 5 kPa)保持合格。"),
("请启动【智能产品经理】工作流生成规格书。",
"已执行【智能产品经理工作流】!生成《等离子射频手术电极系统需求规格书》(doc-proj6007-system_reqs)。明确了双极电极阻抗匹配网络、工作杆弯曲角度(15°/45°可选)、插拔次数(≥ 50次)、包装无菌密封等 38 项指标。"),
("规格书经审批生效!请启动【智能测试经理】工作流生成验证方案。",
"已切换【智能测试经理】工作流!前置门禁顺利核验。\n正式产出《等离子射频手术电极系统验证方案及计划》(doc-proj6007-test_manager)。包含组织消融效率离体肝脏实测(消融深度速率 ≥ 1.0mm/s)、热损伤扩散带病理测量(侧向热损伤 ≤ 0.5mm)、电气安全与无菌衰变寿命测试。血缘追溯已锚定。")
]
}
},
{
"id": 6008,
"code": "PROJ-PLASMA-0092",
"key": "dengyizi",
"name": "低温等离子体手术系统",
"short_name": "低温等离子体手术系统 (主机+刀头)",
"customer": "天津医科大学总医院耳鼻咽喉头颈外科",
"device_type": "医用多功能低温等离子手术发生器与控制系统",
"intended_use": "用于耳鼻咽喉、关节外科、脊柱微创手术中通过 100kHz 射频激发低温等离子体对软组织进行分子键裂解消融、精确切割与双极电凝止血",
"target_market": "中国 NMPA III类 (GB 9706.1-2020, YY 9706.202, YY 0505)",
"path": "/Volumes/新加卷/WeiCHEN-Backup/01-Projects/ShuiMuDongFang/2026-08-17 飞书智能体/.tmp/dual-agent/等离子手术",
"highlight_tech": "双通道 100kHz 射频功率源,消融功率 10~350W,凝血功率 10~150W,自适应组织阻抗负载跟踪",
"srs_title": "低温等离子体手术系统系统需求规格书",
"svp_title": "低温等离子体手术系统系统验证方案及计划",
"chat_topics": {
"u1": [
("天津总医院耳鼻喉科提出:做扁桃体切除与鼾症打孔手术时,主机必须能秒级识别所插刀头型号,并且脚踏开关有清晰的档位阻尼防误踏。",
"这两项要求是三类手术主机易用性与安全性的核心:\n1. 【刀头智能 RFID/电阻识别】:主机刀头插座内嵌数字加密识别通信,插入刀头 0.5s 内自动读取刀头类型(鼻甲消融/扁桃体切除/喉部精细),并自动预设推荐功率档位,防止大功率误伤;\n2. 【IPX8 级双联脚踏开关】:脚踏采用机械力感渐进弹簧(消融踏板行程 15mm/阻力 20N,凝血踏板行程 12mm/阻力 15N,颜色红黄严格分立),防水等级 IPX8,即便浸没手术室液体中也能持续安全切断;\n3. 【快速阻抗跟踪】:当刀头离开盐水介质阻抗骤升时,在 5 ms 内自动降功封波,消除空火危险。\n\n智能体小队准备展开规格书起草。"),
("请补充等离子手术主机在电磁兼容(EMC)骚扰发射方面的设计规格,高频打火时会不会干扰监护仪和麻醉机?",
"主机 EMC 与射频抗扰度控制规约:\n- 依据 YY 0505 与 GB 4824(1组A类),在输出端口增设共模扼流圈与 LC 双阶低通滤波器,滤除 100kHz 基频以上的高次谐波;\n- 电源入口配置医疗级高性能 EMI 滤波器(漏电流 < 50 μA);\n- 在手术室与心电监护仪同机测试时,等离子点火状态下心电监护波形失真不得超过 5%,不产生假性心律失常报警。"),
("请启动【智能产品经理】工作流,生成受控系统需求规格书。",
"已执行【智能产品经理工作流】!正式输出《低温等离子体手术系统系统需求规格书》(doc-proj6008-system_reqs)。包括额定功率精度(±10% 或 ±5W)、声光报警响应时间(< 100ms)、双极阻抗监测动态范围(10Ω~5000Ω)、屏幕触控防误触等 200 项全面规格。"),
("规格书终审通过!请触发【智能测试经理】工作流,输出系统验证方案并绑定血缘。",
"已切换至【智能测试经理】工作流!前置依赖状态 approved,门禁放行!\n测试经理已编制生成《低温等离子体手术系统系统验证方案及计划》(doc-proj6008-test_manager)。全面涵盖高频功率输出负载曲线实测(10Ω~1000Ω 步进)、单一故障测试(输出功率继电器粘连切断)、环境可靠性(高温高湿工作环境)及 200 项需求条目 100% 覆盖验证。血缘关系已完整登记!")
]
}
},
{
"id": 6009,
"code": "PROJ-ESWT-0095",
"key": "chongjibo",
"name": "体外气压弹道冲击波治疗仪",
"short_name": "体外冲击波治疗仪 (北医三院运医)",
"customer": "北京大学第三医院运动医学研究所",
"device_type": "气压弹道式体外冲击波组织损伤治疗设备",
"intended_use": "用于慢性软组织肌腱止点病变、跟腱炎、足底筋膜炎、肩周炎的局部无创高能压力脉冲松解与骨肌镇痛",
"target_market": "中国 NMPA II类 (YY 0650-2008 体外冲击波治疗机专标, GB 9706.1-2020, YY 0505)",
"path": "/Volumes/新加卷/WeiCHEN-Backup/01-Projects/ShuiMuDongFang/2026-08-17 飞书智能体/.tmp/verify-batch4/out/冲击波",
"highlight_tech": "气压输出 1.0~5.0 bar 可调,频率 1~21 Hz,脉冲上升时间 < 3.5μs,能量密度 0.05~0.65 mJ/mm²",
"srs_title": "体外冲击波治疗仪系统需求规格书",
"svp_title": "体外冲击波治疗仪系统验证方案及计划",
"chat_topics": {
"u1": [
("北医三院运医专家反馈:治疗仪手柄连续击打 2000 发后枪体发烫严重,影响护士握持;另外要求脉冲气压重复精度必须优于 ±5%,保证治疗剂量一致。",
"非常关键的临床工程反馈!技术改善措施如下:\n1. 【手柄散热与振动隔绝】:在治疗手柄弹道腔外壁设计「风冷对流循环风道」搭配航空级隔热 Aerogel 涂层,连续击打 4000 发后手柄握持区外表温升控制在 ≤ 8℃(实测表面温度 < 40℃);并在握手位置增设硅胶减震阻尼套,向操作者传导的手部振动加速度降低 60%;\n2. 【气压闭环精准控制】:采用进口比例伺服阀与数字气压传感器(采样率 1kHz),闭环反馈补偿气泵压力波动,确保 1.0~5.0 bar 范围内击打气压误差控制在 ±3% 以内。\n\n智能体小队立即启动规格书编写。"),
("请按照 YY 0650 专标,解释冲击波声场聚焦测量的具体要求(如上升时间、焦斑大小)。",
"依据 YY 0650-2008 冲击波声学性能要求:\n- 采用水听器(聚偏二氟乙烯 PVDF 针式水听器)在去气蒸馏水中进行声压场扫描;\n- 冲击波正压脉冲上升时间(Rise Time)不得大于 3.5 μs;\n- -6dB 焦斑长径与短径尺寸需给出确定数值;\n- 脉冲峰值正声压(p+)与峰值负声压(p-)须符合标称值 ±20% 的公差界限,条目已全部纳入需求规格书。"),
("请启动【智能产品经理】工作流,生成受控系统需求规格书。",
"已执行【智能产品经理工作流】!正式输出《体外冲击波治疗仪系统需求规格书》(doc-proj6009-system_reqs)。系统梳理了气泵额定功率、撞针弹道寿命(≥ 100万次)、电磁换向阀开关寿命、治疗头尺寸规格(6mm/15mm/25mm)等 90 项技术条目。"),
("规格书审批已生效!请切换至【智能测试经理】工作流,建立系统验证方案及血缘追踪。",
"已切换【智能测试经理】工作流!前置规格书状态 verified(approved),前置门禁顺利通过。\n正式产出《体外冲击波治疗仪系统验证方案及计划》(doc-proj6009-test_manager)。包含气压稳定性水听器声场测试、疲劳击打寿命测试、跌落耐冲击测试、电磁兼容抗扰度试验及完整追溯矩阵。血缘哈希绑定就绪!")
]
}
},
{
"id": 6010,
"code": "PROJ-MSK-0108",
"key": "jigu",
"name": "肌骨超声影像处理软件",
"short_name": "肌骨超声影像处理软件 (PMP108)",
"customer": "中日友好医院超声诊断科与风湿免疫科",
"device_type": "独立超声影像处理辅助分析软件 (SaMD, II类医疗器械)",
"intended_use": "用于风湿关节炎及运动损伤中高频肌骨超声图像的滑膜增生厚度、肌腱断端撕裂间距及血流多普勒信号的智能测量与报告生成",
"target_market": "中国 NMPA II类 (YY/T 0664-2020, GB/T 25000.51, 医疗器械软件指导原则)",
"path": "/Volumes/新加卷/WeiCHEN-Backup/01-Projects/ShuiMuDongFang/2026-08-17 飞书智能体/.tmp/verify-batch4/out/PMP108肌骨超声",
"highlight_tech": "高频超声斑点噪声自适应各向异性扩散滤波,滑膜/肌腱轮廓自动分割 Dice 相似度 ≥ 0.88,线性测距误差 < 0.2mm",
"srs_title": "肌骨超声影像处理软件系统需求规格书",
"svp_title": "肌骨超声影像处理软件系统验证方案及计划",
"chat_topics": {
"u1": [
("中日友好医院超声科反馈:肌骨超声斑点噪声大、滑膜边界模糊,算法分割滑膜厚度时经常将邻近肌腱组织误识别为滑膜,要求测量误差在 0.3mm 以内。",
"超声软组织边界提取一直是影像算法的难点。针对肌骨超声特性,制定如下工程与算法规格:\n1. 【预处理滤波】:采用「各向异性扩散与双边引导滤波复合算法」,在平滑斑点噪声的同时精准保留 0.1mm 级筋膜回波边缘;\n2. 【滑膜/肌腱注意力分割网络】:融入先验解剖空间注意力约束,区分低回波滑膜组织与纤维肌腱纹理,实测分割重合度 Dice ≥ 0.88;\n3. 【可校准测距标定】:基于超声探头频率声速自动校正,测距绝对误差稳定控制在 ≤ 0.2 mm 以内;\n4. 【合规文档】:严格对标国家局《人工智能医用软件审评指导原则》与网络安全要求。"),
("请详细说明按 YY/T 0664-2020 编制软件测试报告与数据安全留痕的要求。",
"依据《医疗器械软件指导原则》与 YY/T 0664:\n- 建立覆盖算法版本、模型权重 SHA-256、输入数据集可追溯性的闭环留痕;\n- 软件日志记录每例测量患者标识匿名化脱敏(脱敏率 100%)、操作员身份及测量结果时间戳,日志防篡改保留不少于 5 年;\n- 白盒单元测试覆盖率严格达标(语句覆盖率 ≥ 90%)。"),
("请启动【智能产品经理】工作流,生成受控软件需求规格书。",
"已执行【智能产品经理工作流】!正式生成《肌骨超声影像处理软件系统需求规格书》(doc-proj6010-system_reqs)。涵盖 DICOM 超声成像流解析、滑膜微血管彩色多普勒血流定量计算、测量标注工具链及结构化电子报告输出等 54 项规格。"),
("规格书已审批通过!请切换至【智能测试经理】工作流,输出系统验证方案。",
"已切换【智能测试经理】工作流!前置依赖审核通过(approved)。\n正式产出《肌骨超声影像处理软件系统验证方案及计划》(doc-proj6010-test_manager)。包含标准超声体模几何精度测试、多中心 1000 例典型病例盲态回溯对比测试(算法与 3 位副高医生金标准比对一致性 ICC ≥ 0.92)、软件性能与容错压力测试。血缘追溯已锁定!")
]
}
}
]
def sha256_text(text: str) -> str:
return hashlib.sha256(text.encode("utf-8")).hexdigest()
def build_data():
print("开始整合 10 个项目的元数据、文档与多角色对话记录...")
sessions = []
messages = []
deliverables = []
documents = {}
for p in PROJECT_DEFS:
pid = p["id"]
pkey = p["key"]
# 1. 建立用户会话 (张工 u1, 李主管 u2, 王总监 u3)
sessions.append({
"sessionId": f"sess-{pkey}-u1",
"userId": 1,
"projectId": pid,
"title": p["short_name"],
"deviceType": p["device_type"],
"stage": "V0.5",
"stageLabel": "V0.5 方案成型与法规对齐",
"messageCount": 8,
"updatedAt": "刚刚"
})
sessions.append({
"sessionId": f"sess-{pkey}-u2",
"userId": 2,
"projectId": pid,
"title": p["short_name"],
"deviceType": p["device_type"],
"stage": "V0.5",
"stageLabel": "V0.5 方案成型与法规对齐",
"messageCount": 4,
"updatedAt": "刚刚"
})
sessions.append({
"sessionId": f"sess-{pkey}-u3",
"userId": 3,
"projectId": pid,
"title": p["short_name"],
"deviceType": p["device_type"],
"stage": "V0.5",
"stageLabel": "V0.5 方案成型与法规对齐",
"messageCount": 4,
"updatedAt": "刚刚"
})
# 2. 生成张工 (u1) 的多轮专业对话
u1_sess = f"sess-{pkey}-u1"
messages.append({
"id": f"m-{pkey}-1",
"sessionId": u1_sess,
"role": "system",
"content": f"项目助手已就位。当前项目【{p['name']}】已进入【V0.5 方案成型与法规对齐】阶段。您正以「张工」身份与智能体协同。",
"timestamp": "09:00",
"authorName": "项目助手"
})
msg_idx = 2
for user_q, asst_a in p["chat_topics"]["u1"]:
messages.append({
"id": f"m-{pkey}-{msg_idx}",
"sessionId": u1_sess,
"role": "user",
"content": user_q,
"timestamp": f"09:{10 + msg_idx * 2:02d}",
"authorName": "张工"
})
msg_idx += 1
messages.append({
"id": f"m-{pkey}-{msg_idx}",
"sessionId": u1_sess,
"role": "assistant",
"content": asst_a,
"timestamp": f"09:{10 + msg_idx * 2:02d}",
"authorName": "项目助手"
})
msg_idx += 1
# 3. 生成李主管 (u2) 审核对话
u2_sess = f"sess-{pkey}-u2"
messages.append({
"id": f"m-{pkey}-u2-1",
"sessionId": u2_sess,
"role": "system",
"content": f"项目助手已就位。当前项目【{p['name']}】待办审查。您正以「李主管(审核人)」身份与智能体协同。",
"timestamp": "10:00",
"authorName": "项目助手"
})
messages.append({
"id": f"m-{pkey}-u2-2",
"sessionId": u2_sess,
"role": "user",
"content": f"我是审核人李主管。请核查张工提交的《{p['srs_title']}》是否满足强制性标准要求,重点检查 {p['highlight_tech']} 的指标完整性。",
"timestamp": "10:05",
"authorName": "李主管"
})
messages.append({
"id": f"m-{pkey}-u2-3",
"sessionId": u2_sess,
"role": "assistant",
"content": f"李主管您好!针对《{p['srs_title']}》的合规审核报告如下:\n\n1. **强标覆盖核查**:完全覆盖 {p['target_market']} 相关条款,无漏项;\n2. **关键参数审查**:{p['highlight_tech']} 已全部转化为具备 REQ- 编号的可验证条目,且设定了明确的公差界限;\n3. **可测性审查**:所有条目均已指明验证方法(分析/测试/审查),不存在模糊占位描述。\n\n建议您点击下方「审核通过」完成初审并上行至王总监终审。",
"timestamp": "10:06",
"authorName": "项目助手"
})
messages.append({
"id": f"m-{pkey}-u2-4",
"sessionId": u2_sess,
"role": "user",
"content": "审核意见:技术指标分解详尽,强标依据充分,同意通过并转交王总监终审。",
"timestamp": "10:08",
"authorName": "李主管"
})
# 4. 生成王总监 (u3) 批准对话
u3_sess = f"sess-{pkey}-u3"
messages.append({
"id": f"m-{pkey}-u3-1",
"sessionId": u3_sess,
"role": "system",
"content": f"项目助手已就位。当前项目【{p['name']}】终审签批。您正以「王总监(批准人)」身份与智能体协同。",
"timestamp": "10:15",
"authorName": "项目助手"
})
messages.append({
"id": f"m-{pkey}-u3-2",
"sessionId": u3_sess,
"role": "user",
"content": f"我是批准人王总监。李主管已完成《{p['srs_title']}》的初审,请汇报该受控交付物终审批准的整体合规结论与后续推进。",
"timestamp": "10:20",
"authorName": "王总监"
})
messages.append({
"id": f"m-{pkey}-u3-3",
"sessionId": u3_sess,
"role": "assistant",
"content": f"王总监好!\n\n《{p['srs_title']}》已由张工编制完成、李主管初审通过,各项设计输入基线完整,质量门禁静态 AST 检测通过率 100%。\n终审批准后,系统将正式锁定 V1.0 权威基线,并自动解锁下游【智能测试经理】工作流,建立系统验证方案的受控文档血缘追溯。建议您执行终审批准。",
"timestamp": "10:22",
"authorName": "项目助手"
})
messages.append({
"id": f"m-{pkey}-u3-4",
"sessionId": u3_sess,
"role": "user",
"content": "终审批准通过。请立即下达工程指令,按计划启动系统验证方案编制。",
"timestamp": "10:25",
"authorName": "王总监"
})
# 5. 读取真实高质量 Markdown 交付物
srs_file = os.path.join(p["path"], "01-系统需求规格书.md")
svp_file = os.path.join(p["path"], "02-系统验证方案及计划.md")
with open(srs_file, "r", encoding="utf-8") as f:
srs_md = f.read()
with open(svp_file, "r", encoding="utf-8") as f:
svp_md = f.read()
srs_hash = sha256_text(srs_md)
svp_hash = sha256_text(svp_md)
doc_srs_id = f"doc-proj{pid}-system_reqs"
doc_svp_id = f"doc-proj{pid}-test_manager"
# 交付物元数据
deliverables.append({
"docId": doc_srs_id,
"projectId": pid,
"taskKey": "system_reqs",
"title": p["srs_title"],
"stage": "V0.5",
"category": "workflow",
"creatorId": 1,
"creatorName": "张工",
"isFixedWorkflow": True,
"isTemplateOnly": False,
"lifecycleState": "approved",
"isClaimed": True,
"author": "张工",
"reviewer": "李主管",
"approver": "王总监",
"updatedAt": "2026-09-11 00:30",
"summary": f"{p['name']}的完整受控系统需求规格书,已获终审批准,具备严格 REQ 编号与验证方式。"
})
deliverables.append({
"docId": doc_svp_id,
"projectId": pid,
"taskKey": "test_manager",
"title": p["svp_title"],
"stage": "V0.5",
"category": "workflow",
"creatorId": 1,
"creatorName": "张工",
"isFixedWorkflow": True,
"isTemplateOnly": False,
"lifecycleState": "approved",
"isClaimed": True,
"author": "张工",
"reviewer": "李主管",
"approver": "王总监",
"updatedAt": "2026-09-11 00:35",
"summary": f"{p['name']}的系统验证方案及计划,基于已批准的规格书全量映射构建,文档血缘已绑定。"
})
# 存储文档正文
documents[doc_srs_id] = {
"title": p["srs_title"],
"docId": doc_srs_id,
"category": "workflow",
"projectId": pid,
"author": "张工",
"reviewer": "李主管",
"approver": "王总监",
"version": "1.0",
"status": "approved",
"content": srs_md,
"sha256": srs_hash
}
documents[doc_svp_id] = {
"title": p["svp_title"],
"docId": doc_svp_id,
"category": "workflow",
"projectId": pid,
"author": "张工",
"reviewer": "李主管",
"approver": "王总监",
"version": "1.0",
"status": "approved",
"content": svp_md,
"sha256": svp_hash,
"upstreamDocId": doc_srs_id,
"upstreamSha256": srs_hash
}
seed_data = {
"generatedAt": "2026-09-11T00:40:00",
"projects": [
{
"id": p["id"],
"code": p["code"],
"name": p["name"],
"shortName": p["short_name"],
"customer": p["customer"],
"deviceType": p["device_type"],
"intendedUse": p["intended_use"],
"targetMarket": p["target_market"],
"activeWorkflowKey": "main",
"version": 1,
"creatorUserId": 1
}
for p in PROJECT_DEFS
],
"sessions": sessions,
"messages": messages,
"deliverables": deliverables,
"documents": documents
}
seed_json_path = "web/src/data/seeds/tenProjectsSeed.json"
with open(seed_json_path, "w", encoding="utf-8") as f:
json.dump(seed_data, f, ensure_ascii=False, indent=2)
print(f"成功输出前端 Seed JSON 文件: {seed_json_path} (大小: {os.path.getsize(seed_json_path)} 字节)")
# 6. 生成前端导出 TS 封装
ts_code = '''// 10 个示例项目评审专用数据封装
import seed from './seeds/tenProjectsSeed.json';
import { ProjectSession, ChatMessage, DeliverableItem } from '../types/workbench';
import { MockDocumentMeta } from './mockDocuments';
export interface SeedProjectMeta {
id: number;
code: string;
name: string;
shortName: string;
customer: string;
deviceType: string;
intendedUse: string;
targetMarket: string;
activeWorkflowKey: string;
version: number;
creatorUserId: number;
}
export const TEN_PROJECTS_LIST: SeedProjectMeta[] = seed.projects as SeedProjectMeta[];
export const TEN_PROJECTS_SESSIONS: ProjectSession[] = seed.sessions as ProjectSession[];
export const TEN_PROJECTS_MESSAGES: ChatMessage[] = seed.messages as ChatMessage[];
export const TEN_PROJECTS_DELIVERABLES: DeliverableItem[] = seed.deliverables as DeliverableItem[];
export const TEN_PROJECTS_DOCUMENTS: Record<string, MockDocumentMeta> = seed.documents as Record<
string,
MockDocumentMeta
>;
'''
ts_path = "web/src/data/tenProjectsDemo.ts"
with open(ts_path, "w", encoding="utf-8") as f:
f.write(ts_code)
print(f"成功输出前端 TS 模块: {ts_path}")
# 7. 生成后端 SQL 导入脚本
sql_lines = [
"-- 10 个示例医疗器械项目数据初始化脚本 (针对项目评审全流程落地)",
"BEGIN;",
]
for p in PROJECT_DEFS:
pid = p["id"]
code = p["code"]
name = p["name"].replace("'", "''")
cust = p["customer"].replace("'", "''")
dtype = p["device_type"].replace("'", "''")
iuse = p["intended_use"].replace("'", "''")
tmarket = p["target_market"].replace("'", "''")
doc_srs_id = f"doc-proj{pid}-system_reqs"
doc_svp_id = f"doc-proj{pid}-test_manager"
srs_hash = sha256_text(documents[doc_srs_id]["content"])
# 1) projects 表
sql_lines.append(f"""
INSERT INTO projects (id, code, name, customer_name, device_type, intended_use, target_market, current_stage, environment, status, creator_user_id, active_workflow_key, workflow_selection_version, created_at, updated_at)
VALUES ({pid}, '{code}', '{name}', '{cust}', '{dtype}', '{iuse}', '{tmarket}', 'V0.5', 'dev', 'active', 1, 'main', 1, now(), now())
ON CONFLICT (id) DO UPDATE SET
code = EXCLUDED.code,
name = EXCLUDED.name,
customer_name = EXCLUDED.customer_name,
device_type = EXCLUDED.device_type,
intended_use = EXCLUDED.intended_use,
target_market = EXCLUDED.target_market,
creator_user_id = 1,
active_workflow_key = 'main',
workflow_selection_version = 1,
updated_at = now();
""")
# 2) project_workflows 挂载
for wf_key in ["main", "product_manager", "test_manager"]:
status = "active" if wf_key == "main" else "ready"
sql_lines.append(f"""
INSERT INTO project_workflows (project_id, workflow_key, status, enabled, created_at, updated_at)
VALUES ({pid}, '{wf_key}', '{status}', true, now(), now())
ON CONFLICT (project_id, workflow_key) DO UPDATE SET status = '{status}', enabled = true, updated_at = now();
""")
# 3) workflow_runs 运行记录
run_pm = f"run-proj{pid}-pm-01"
run_tm = f"run-proj{pid}-tm-01"
sql_lines.append(f"""
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('{run_pm}', {pid}, 'product_manager', 'completed', 1, 'V0.5', 'system_reqs', '{doc_srs_id}', '智能产品经理已生成系统需求规格书并通过门禁', now() - interval '2 hours', now() - interval '1 hour', now())
ON CONFLICT (run_id) DO NOTHING;
INSERT INTO workflow_runs (run_id, project_id, workflow_key, status, started_by, stage_key, task_key, output_doc_id, output_summary, started_at, finished_at, created_at)
VALUES ('{run_tm}', {pid}, 'test_manager', 'completed', 1, 'V0.5', 'test_manager', '{doc_svp_id}', '智能测试经理已建立测试方案并完成需求全量映射', now() - interval '50 minutes', now() - interval '30 minutes', now())
ON CONFLICT (run_id) DO NOTHING;
""")
# 4) document_lineage 血缘关系
sql_lines.append(f"""
INSERT INTO document_lineage (project_id, downstream_doc_id, downstream_version, upstream_doc_id, upstream_version, upstream_sha256, is_stale, created_at)
VALUES ({pid}, '{doc_svp_id}', 1, '{doc_srs_id}', 1, '{srs_hash}', false, now())
ON CONFLICT (downstream_doc_id, downstream_version, upstream_doc_id, upstream_version) DO UPDATE SET
upstream_sha256 = EXCLUDED.upstream_sha256,
is_stale = false;
""")
sql_lines.append("COMMIT;")
sql_path = "deploy/postgres/migrations/2026-09-11-seed-ten-projects.sql"
with open(sql_path, "w", encoding="utf-8") as f:
f.write("\n".join(sql_lines))
print(f"成功输出后端迁移 SQL: {sql_path} (行数: {len(sql_lines)})")
if __name__ == "__main__":
build_data()
+51 -7
View File
@@ -65,6 +65,10 @@ import {
NEUROPULSE_DOCUMENTS,
NEUROPULSE_PERMISSIONS,
} from './data/neuropulseDemo';
import {
TEN_PROJECTS_DELIVERABLES,
TEN_PROJECTS_DOCUMENTS,
} from './data/tenProjectsDemo';
import { exportDocumentToDocx } from './engine/docxRenderer';
import { exportDocumentToXlsx } from './engine/xlsxRenderer';
import {
@@ -93,6 +97,9 @@ import {
loadUsers,
saveUsers,
migrateAndClearLegacyMessages,
filterSessionsForUser,
resolveActiveSessionForUser,
ensurePrivateSessionsForUser,
} from './data/storage';
import { useChatWindow } from './hooks/useChatWindow';
import { CategoryFilterBar } from './components/history/CategoryFilterBar';
@@ -337,11 +344,13 @@ export const ALL_INITIAL_DELIVERABLES: DeliverableItem[] = [
...INITIAL_DELIVERABLES,
...P2_INITIAL.deliverables,
...CUSA_INITIAL_DELIVERABLES,
...TEN_PROJECTS_DELIVERABLES,
];
export const ALL_MOCK_DOCUMENTS = {
...MOCK_DOCUMENTS,
...NEUROPULSE_DOCUMENTS,
...TEN_PROJECTS_DOCUMENTS,
};
export const MOCK_USERS: UserProfile[] = [
@@ -473,6 +482,34 @@ export default function App() {
const [activeCategory, setActiveCategory] = useState<DeliverableCategory>('workflow');
// 获取当前激活会话的项目ID (默认为 1)
const currentProjectId = useMemo(() => {
const activeSess = sessions.find((s) => s.sessionId === activeSessionId);
return activeSess ? activeSess.projectId : 1;
}, [sessions, activeSessionId]);
// 当前用户专属的项目会话列表 (严格多用户隔离)
const visibleSessions = useMemo(() => {
const mine = filterSessionsForUser(sessions, currentUser.id);
return mine.length > 0 ? mine : sessions;
}, [sessions, currentUser.id]);
// 账号变动时,确保当前激活的会话属于该用户
useEffect(() => {
const cur = sessions.find((s) => s.sessionId === activeSessionId);
if (!cur || (cur.userId && cur.userId !== currentUser.id)) {
const nextActiveId = resolveActiveSessionForUser(
sessions,
currentUser.id,
currentProjectId,
activeSessionId
);
if (nextActiveId && nextActiveId !== activeSessionId) {
setActiveSessionId(nextActiveId);
}
}
}, [currentUser.id, sessions, currentProjectId, activeSessionId]);
const [activeDocId, setActiveDocId] = useState<string>(() => {
const activeSess = sessions.find((s) => s.sessionId === activeSessionId);
if (activeSess?.projectId === 5201) return 'doc-neuropulse-feasibility_reg';
@@ -532,12 +569,6 @@ export default function App() {
);
}, [currentUser, roles]);
// 获取当前激活会话的项目ID (默认为 1)
const currentProjectId = useMemo(() => {
const activeSess = sessions.find((s) => s.sessionId === activeSessionId);
return activeSess ? activeSess.projectId : 1;
}, [sessions, activeSessionId]);
// 项目多工作流激活状态与文档血缘 (支持前端切换与状态联动)
const [projectWorkflowsState, setProjectWorkflowsState] = useState<
Record<number, { activeKey: string; version: number; creatorId: number }>
@@ -2157,7 +2188,7 @@ export default function App() {
return (
<>
<AppShell
sessions={sessions}
sessions={visibleSessions}
activeSessionId={activeSessionId}
onSelectSession={(sessId) => {
// 切换项目时清理旧会话的残留锚点 hash,防止回弹
@@ -2555,6 +2586,19 @@ export default function App() {
onSwitchUser={(newUser) => {
const fresh = allUsers.find((u) => u.id === newUser.id) || newUser;
setCurrentUser(fresh);
// 确保新用户对已知项目具有独立私聊会话
const updatedSessions = ensurePrivateSessionsForUser(sessions, fresh.id);
setSessions(updatedSessions);
// 切换到目标用户在当前项目的私聊会话
const nextActiveId = resolveActiveSessionForUser(
updatedSessions,
fresh.id,
currentProjectId,
activeSessionId
);
if (nextActiveId) {
setActiveSessionId(nextActiveId);
}
}}
/>
File diff suppressed because one or more lines are too long
+21 -1
View File
@@ -124,7 +124,27 @@ export function ensurePrivateSessionsForUser(
? 'ultrasound'
: projectId === 5201
? 'neuropulse'
: `p${projectId}`;
: projectId === 6001
? 'wangjing'
: projectId === 6002
? 'tianzhihang'
: projectId === 6003
? 'xunzun'
: projectId === 6004
? 'xianghejie'
: projectId === 6005
? 'yamui'
: projectId === 6006
? 'ziyanar'
: projectId === 6007
? 'lanting'
: projectId === 6008
? 'dengyizi'
: projectId === 6009
? 'chongjibo'
: projectId === 6010
? 'jigu'
: `p${projectId}`;
result.push({
sessionId: buildPrivateSessionId(projectKey, userId),
userId,
+4 -1
View File
@@ -3,6 +3,7 @@ import { RoleDefinition } from '../types/rbac';
import { UserProfile } from '../types/docgov';
import { buildPrivateSessionId, dedupePrivateSessions } from './sessionPrivacy';
import { NEUROPULSE_SESSIONS, NEUROPULSE_MESSAGES, NEUROPULSE_ACTIVE_SESSION_ID } from './neuropulseDemo';
import { TEN_PROJECTS_SESSIONS, TEN_PROJECTS_MESSAGES } from './tenProjectsDemo';
import { enrichMessagesWithCategories } from '../engine/categoryHelper';
// v6:修正 NeuroPulse 驳回追问误挂「疲劳寿命」旧答复;对话 LLM 每轮独立工作区
@@ -28,10 +29,11 @@ export {
/**
* 默认预设项目会话(每人独立私聊:同一项目不同 userId 各自一条 session)
* NeuroPulse (5201) 置顶:全流程实测展示项目
* 10 个医疗器械示例项目 + NeuroPulse (5201)
*/
export const DEFAULT_SESSIONS: ProjectSession[] = [
...NEUROPULSE_SESSIONS,
...TEN_PROJECTS_SESSIONS,
// CUSA-Ultra:张工 / 李主管 / 王总监 各一条私聊
{
sessionId: buildPrivateSessionId('cusa', 1),
@@ -96,6 +98,7 @@ export const DEFAULT_SESSIONS: ProjectSession[] = [
*/
export const DEFAULT_MESSAGES: ChatMessage[] = [
...NEUROPULSE_MESSAGES,
...TEN_PROJECTS_MESSAGES,
// ==================================================================================
// CUSA-Ultra:按用户拆分私聊(sess-cusa-u1/u2/u3),严禁多角色混聊
// ==================================================================================
+27
View File
@@ -0,0 +1,27 @@
// 10 个示例项目评审专用数据封装
import seed from './seeds/tenProjectsSeed.json';
import { ProjectSession, ChatMessage, DeliverableItem } from '../types/workbench';
import { MockDocumentMeta } from './mockDocuments';
export interface SeedProjectMeta {
id: number;
code: string;
name: string;
shortName: string;
customer: string;
deviceType: string;
intendedUse: string;
targetMarket: string;
activeWorkflowKey: string;
version: number;
creatorUserId: number;
}
export const TEN_PROJECTS_LIST: SeedProjectMeta[] = seed.projects as SeedProjectMeta[];
export const TEN_PROJECTS_SESSIONS: ProjectSession[] = seed.sessions as ProjectSession[];
export const TEN_PROJECTS_MESSAGES: ChatMessage[] = seed.messages as ChatMessage[];
export const TEN_PROJECTS_DELIVERABLES: DeliverableItem[] = seed.deliverables as DeliverableItem[];
export const TEN_PROJECTS_DOCUMENTS: Record<string, MockDocumentMeta> = seed.documents as unknown as Record<
string,
MockDocumentMeta
>;