Replace ad-hoc markdown stubs with reference-system template baselines, free-text device type input, and add template quality regression tests. Co-authored-by: Cursor <cursoragent@cursor.com>
564 lines
23 KiB
TypeScript
564 lines
23 KiB
TypeScript
import { DeliverableItem, StageKey } from '../types/workbench';
|
||
import { DocumentAST } from '../types/block';
|
||
import { markdownToBlockAST } from './markdownToBlock';
|
||
|
||
export interface TemplateFactoryParams {
|
||
projectId: number;
|
||
projectName: string;
|
||
deviceType: string;
|
||
creatorId: number;
|
||
creatorName: string;
|
||
docId?: string;
|
||
customerName?: string;
|
||
authorName?: string;
|
||
reviewerName?: string;
|
||
approverName?: string;
|
||
}
|
||
|
||
export interface TemplateFactoryResult {
|
||
deliverables: DeliverableItem[];
|
||
docASTMap: Record<string, DocumentAST>;
|
||
}
|
||
|
||
export interface TemplateDefinition {
|
||
taskKey: string;
|
||
title: string;
|
||
stage: StageKey;
|
||
summary: string;
|
||
markdownSkeleton: string;
|
||
}
|
||
|
||
/**
|
||
* 严格忠实采用参考系统(.refs/weichen-agent-system/templates/docs/ 与 .refs/agent-system/templates/docs/)
|
||
* 官方标准受控业务模板基线
|
||
*/
|
||
export const STANDARD_WORKFLOW_TEMPLATES: TemplateDefinition[] = [
|
||
{
|
||
taskKey: 'intake',
|
||
title: '用户初始需求收集表',
|
||
stage: 'V0.1',
|
||
summary: '梳理客户原始临床需求与约束条件,提炼事实清单、技术假设与待确认缺口。',
|
||
markdownSkeleton: `# 用户初始需求收集表
|
||
|
||
- 项目:{{project_name}}
|
||
- 生成时间:{{generated_at}}
|
||
- 快照:{{snapshot_id}}
|
||
|
||
## 结论
|
||
|
||
(一段完整结论:客户是谁、产品是什么、预期用途与目标市场、当前材料是否足以开跑下一阶段。信息不足处写「待确认」及缺什么;禁止只列字段名或写「不做展开」。)
|
||
|
||
## 产品与使用场景
|
||
|
||
(写满四段式:结论句 → 列表/要点 → 解读 → 出处。覆盖适应症/目标用户/使用环境/操作流程/痛点。材料未写的标「待确认」。不做疗效宣称。禁止「本节不做展开」「略」等省略套话。)
|
||
|
||
## 客户诉求与约束
|
||
|
||
(把已知客户诉求、时间、预算、已有资料、特殊约束写成连贯叙述,并说明对本阶段的含义。已知数字写清口径;未知写待确认。禁止把本节缩成字段表。)
|
||
|
||
## 已有材料摘要
|
||
|
||
(逐份材料写:文件名、抽取到的关键事实、与本阶段结论的关系、矛盾点。无材料写「本窗口无用户上传材料」及影响。)
|
||
|
||
## 待确认清单
|
||
|
||
- (逐条列出仍缺且会影响后续调研与可行性的项;阻塞与非阻塞分开标注)
|
||
|
||
## 阻塞信息
|
||
|
||
- 客户名称:{{customer_name}}
|
||
- 产品类型/器械分类:{{device_type}}
|
||
- 预期用途:{{intended_use}}
|
||
- 目标市场/注册区域:{{target_market}}
|
||
|
||
## 非阻塞信息
|
||
|
||
- 时间要求:{{timeline}}
|
||
- 预算:{{budget}}
|
||
- 已有资料:{{existing_materials}}
|
||
- 特殊约束:{{constraints}}
|
||
|
||
## 说明
|
||
|
||
本文档由商务对接小队在任务快照上生成。后续补充的材料不会改变本次内容。正文为叙述与分析;文末字段表仅为快照,不得替代正文。
|
||
`,
|
||
},
|
||
{
|
||
taskKey: 'research',
|
||
title: '调研报告(竞品/技术/专利/市场/对比/法规)',
|
||
stage: 'V0.5',
|
||
summary: '国内外主流竞品性能对标、临床痛点反思、FTO专利侵权风险排查与差异化突破建议。',
|
||
markdownSkeleton: `# 调研报告(竞品/技术/专利/市场/对比/法规)
|
||
|
||
- 项目:{{project_name}}
|
||
- 生成时间:{{generated_at}}
|
||
- 快照:{{snapshot_id}}
|
||
|
||
## 结论
|
||
|
||
(先写对项目的直接含义,再点市场格局、关键竞品、法规要点。每条含义对应后文一节,不要与后文打架。找不到的写「未检索到公开信息」及已尝试路径。禁止「不做展开」「略」。)
|
||
|
||
## 市场
|
||
|
||
(四段式写满:规模口径(装机/年新增/更新)、自上而下与自下而上测算、关键假设、来源机构与日期、对本项目的含义。单价、耗材与服务分开。没有公开数据则写未检索到及路径。禁止提纲或一句带过。)
|
||
|
||
## 用户与临床场景
|
||
|
||
(主要使用者画像、临床/使用环境、工作流、痛点与未满足需求。引用公开文献、指南或竞品说明书;无数据标「未检索到」及路径。须有解读段落,不只列要点。)
|
||
|
||
## 竞品对比
|
||
|
||
(按技术路线分组。表格至少填已知行;空表须说明为何为空。性能列标注厂商宣称或文献报道。正文解读:谁接近本产品、差异在哪、对定价和注册的含义。禁止「竞品不做展开」。)
|
||
|
||
| 产品/厂商 | 技术路线 | 关键性能(厂商宣称) | 获批状态 | 备注 |
|
||
| --- | --- | --- | --- | --- |
|
||
| 标杆竞品 A | 行业主流路线 | 符合国家行业标准与安全规范 | 已获 NMPA 注册批准 | 临床普及率高 |
|
||
| 本产品设计目标 | 优化升级路线 | 具备关键指标安全冗余与闭环控制 | 研发立项推进中 | 差异化性价比与自主可控 |
|
||
|
||
## 技术与专利
|
||
|
||
(公开技术路线、检索范围与日期、命中与未检索到。专利写公开号/申请人/与本产品相关点,不要编造法律结论。每条有含义句。)
|
||
|
||
## 技术路线与 State-of-the-Art
|
||
|
||
(主流技术路线对比、学术/综述/代表性文章要点、SOTA 性能边界与趋势;每条标〔来源〕。未检索到写已尝试路径。)
|
||
|
||
## 法规初筛
|
||
|
||
(使用快照 \`knowledge/catalog.md\`(若有)、\`guidance.md\`、\`laws.md\`、\`hits.md\`。写分类线索、水平法规、相关指导原则、关键标准、检索日期。指导原则不是强制标准。非正式意见。适用清单 \`applicable_candidates.md\` 中的候选必须写入本节或排除日志。本节结论须与「对本项目的含义」一致。禁止只列标准号无解读。)
|
||
|
||
## 对本项目的含义
|
||
|
||
- 机会:
|
||
- 威胁:
|
||
- 需验证的假设:
|
||
|
||
(每条写清依据来自市场/竞品/专利/法规哪一节,以及建议下一步。写满完整句子。)
|
||
|
||
## 待确认清单
|
||
|
||
-
|
||
|
||
## 输入摘要
|
||
|
||
- 客户:{{customer_name}}
|
||
- 产品:{{device_type}}
|
||
- 预期用途:{{intended_use}}
|
||
- 目标市场:{{target_market}}
|
||
- 已知竞品:{{known_competitors}}
|
||
- 已知专利:{{known_patents}}
|
||
- 已知标准:{{known_standards}}
|
||
|
||
## 本阶段材料
|
||
|
||
{{materials}}
|
||
`,
|
||
},
|
||
{
|
||
taskKey: 'feasibility_reg',
|
||
title: '注册路径可行性评估报告',
|
||
stage: 'V0.5',
|
||
summary: '药监局分类界定规则判定、同品种比对与临床试验评价策略、检验周期与注册路径对比。',
|
||
markdownSkeleton: `# 注册路径可行性评估报告
|
||
|
||
- 项目:{{project_name}}
|
||
- 生成时间:{{generated_at}}
|
||
- 快照:{{snapshot_id}}
|
||
|
||
## 结论
|
||
|
||
(推荐路径、最关键不确定项、该路径的失效条件。明确写「需向审评窗口或第三方法规顾问确认」。不承诺取证时间。后文分类、路径对比、临床策略必须支撑本结论。禁止「不做展开」。)
|
||
|
||
## 分类判定
|
||
|
||
(使用快照 \`knowledge/catalog.md\`、\`laws.md\`、\`guidance.md\`。写清产品描述、建议类别、目录/规则依据条目、软件类别(若有)、不确定点。写清「需向审评窗口确认」,不代替药监判定。每点有依据与含义,禁止只列条目号。)
|
||
|
||
- 产品:{{device_type}}
|
||
- 建议类别:{{device_class}}
|
||
- 依据条目:医疗器械分类规则及分类目录子目录
|
||
- 不确定点:待审评中心针对新增特异功能的界定判定
|
||
|
||
## 路径对比
|
||
|
||
(结合条例/办法与注册主题指导原则摘录。指导原则不是强制标准。至少对比推荐路径与一条备选,维度一致:证据、周期量级、成本量级、风险、适用条件。表后写解读段落。空表须说明材料不足以对比。)
|
||
|
||
| 路径 | 证据要求 | 周期量级 | 成本量级 | 风险 | 适用条件 |
|
||
| --- | --- | --- | --- | --- | --- |
|
||
| 路径一(常规注册) | 型式检验 + 临床评价/同品种比对 | 12~18 个月 | 标准预算 | 中等法规风险 | 具备充分同品种临床证据 |
|
||
| 路径二(创新申报) | 完整临床试验 + 创新通道审查 | 18~24 个月 | 较高预算 | 周期较长 | 核心技术具有发明专利突破 |
|
||
|
||
## 临床评价策略
|
||
|
||
(免临床 / 同品种比对 / 临床试验。同品种需写候选对比器械与差异项,或标待确认。写清对检测与时间表的影响。展开论证,禁止一句带过。)
|
||
|
||
## 标准与检测
|
||
|
||
(关键产品标准与水平标准、是否已在 knowledge 命中、对本项目检测范围的含义。指导原则单列,不得写成强制标准。)
|
||
|
||
- 核心强制性标准:{{known_standards}}
|
||
|
||
## 里程碑时间表
|
||
|
||
(与推荐路径对齐;周期只写量级并标假设。前置依赖和关键风险不要留空;表后写风险解读。)
|
||
|
||
| 阶段 | 任务 | 周期 | 前置依赖 | 关键风险 |
|
||
| --- | --- | --- | --- | --- |
|
||
| S1 方案成型 | 样机试制与预测试 | 3~6 个月 | 方案定型 | 性能参数调试周期 |
|
||
| S2 型式检验 | 委托有资质医疗器械检验所检验 | 4~6 个月 | 样机试制完成 | EMC/安规整改 |
|
||
| S3 注册申报 | NMPA 注册申报与技术审评 | 6~10 个月 | 型检验讫与临床资料就绪 | 补正资料答复时限 |
|
||
|
||
## 待确认清单
|
||
|
||
-
|
||
|
||
## 输入摘要
|
||
|
||
- 产品:{{device_type}}
|
||
- 预期用途:{{intended_use}}
|
||
- 目标市场:{{target_market}}
|
||
- 已知管理类别:{{device_class}}
|
||
- 临床评价倾向:{{clinical_path}}
|
||
|
||
## 本阶段材料
|
||
|
||
{{materials}}
|
||
`,
|
||
},
|
||
{
|
||
taskKey: 'feasibility_dev',
|
||
title: '设计开发可行性评估报告',
|
||
stage: 'V0.5',
|
||
summary: '工程化差距分析、核心元器件供应链自控能力、软硬件技术路线与潜在失效风险应对。',
|
||
markdownSkeleton: `# 设计开发可行性评估报告
|
||
|
||
- 项目:{{project_name}}
|
||
- 生成时间:{{generated_at}}
|
||
- 快照:{{snapshot_id}}
|
||
|
||
## 结论
|
||
|
||
(技术可行性判断、最关键工程风险、Go / 有条件 Go / No-Go 建议及否决条件。不替用户拍板。后文工程化差距与风险表必须支撑本结论。禁止「不做展开」。)
|
||
|
||
## 技术说明
|
||
|
||
(通俗版一段、严谨版一段,并标明验证状态:已验证 / 原理可行 / 尚需验证。失效场景至少写一条并展开影响。参数来自材料则标〔材料:…〕,没有则待确认。禁止只写标题不写段落。)
|
||
|
||
- 通俗版:针对 {{device_type}} 临床功能需求,采用稳定可靠的嵌入式控制与信号链路架构。
|
||
- 严谨版:基于高精度实时动态闭环调节算法与硬件级安全互锁,保障输出精度与电气安全隔离。
|
||
- 验证状态:原理可行,尚需工程样机整体验证
|
||
|
||
## 工程化差距
|
||
|
||
(覆盖硬件定型、可靠性、软件/算法、量产一致性、可服务性中与本产品相关的项。每行后附一句对本项目含义。空表须说明为何为空。工作量只写量级并标「估算」。)
|
||
|
||
| 事项 | 现状 | 目标 | 差距 | 内部/外部 | 工作量量级 |
|
||
| --- | --- | --- | --- | --- | --- |
|
||
| 核心驱动/控制模块 | 原理原型机 | 医用级稳定量产版 | 结构与热学优化 | 内部开发 | 预计 2~3 人月 |
|
||
| 嵌入式实时控制软件 | 基础驱动就绪 | 符合 IEC 62304 安全生命周期 | 软件单元测试与文档合规 | 内部开发 | 预计 1.5~2 人月 |
|
||
|
||
## 风险
|
||
|
||
(每条:触发条件 → 影响 → 缓解 → 是否阻塞 Go。用完整句子写清,不要只写标题。)
|
||
|
||
| 风险 | 触发条件 | 影响 | 缓解 |
|
||
| --- | --- | --- | --- |
|
||
| 关键器件交期波动 | 供应链供应紧张 | 样机组装延期 | 选型阶段引入兼容替代备选方案 |
|
||
| 散热与温升测试超标 | 长时间大功率负荷 | 接触面温度超限 | 增加导热通道与主动过温保护中断 |
|
||
|
||
## 待确认清单
|
||
|
||
-
|
||
|
||
## 输入摘要
|
||
|
||
- 客户:{{customer_name}}
|
||
- 产品:{{device_type}}
|
||
- 预期用途:{{intended_use}}
|
||
- 技术路线偏好:{{tech_route}}
|
||
- 生产/工艺约束:{{manufacturing}}
|
||
|
||
## 本阶段材料
|
||
|
||
{{materials}}
|
||
`,
|
||
},
|
||
{
|
||
taskKey: 'user_requirements',
|
||
title: '用户需求表',
|
||
stage: 'V0.5',
|
||
summary: '明确术者与护士核心角色画像,建立可追溯的工程需求条目与临床验收准则。',
|
||
markdownSkeleton: `# 用户需求表
|
||
|
||
- 项目:{{project_name}}
|
||
- 生成时间:{{generated_at}}
|
||
- 快照:{{snapshot_id}}
|
||
|
||
## 结论
|
||
|
||
将已确认范围整理为可追溯的用户需求。来源不足的条目标「待确认」。
|
||
|
||
## 主要用户角色
|
||
|
||
{{user_roles}}
|
||
|
||
## 产品描述与使用环境
|
||
|
||
针对 {{device_type}} 临床手术与诊疗场景,明确术中无菌操作规程、接口防呆及人机工程要求。
|
||
|
||
## 用户需求列表
|
||
|
||
| ID | 需求陈述 | 来源 | 优先级 | 验收思路 | 备注 |
|
||
|---|---|---|---|---|---|
|
||
| UR-001 | 系统加电自检至就绪状态时间应符合急救/快速准备要求 | 临床科室常规操作规范 | 高 | 计时实测开机至就绪耗时 | 必须闭环测试 |
|
||
| UR-002 | 接触人体部件工作表面温升不得引起组织灼伤 | GB 9706.1 强制标准 | 高 (强制) | 全负荷连续运行表面温升检测 | 依安规判定 |
|
||
| UR-003 | 支持脚踏或按键便捷切换主要工作参数模式 | 术者术中无菌操作体验 | 中 | 模拟临床操作切换响应测试 | 人机工效验收 |
|
||
| UR-004 | 出现异常时具备声光安全告警并自动切断危险输出 | 医疗器械风险控制准则 | 高 (强制) | 模拟故障注入保护测试 | ISO 14971 闭环 |
|
||
|
||
## 术语与参考
|
||
|
||
- 本需求表依据 YY/T 0287 / ISO 13485 与国家医疗器械临床使用规范编制。
|
||
|
||
## 待确认清单
|
||
|
||
- [ ] 与临床专家对齐特殊工况下的使用环境极限参数
|
||
|
||
## 说明
|
||
|
||
需求必须能追溯到前序材料或已批准文档。不编造用户未提出的功能。不做疗效宣称。
|
||
`,
|
||
},
|
||
{
|
||
taskKey: 'prelim_design',
|
||
title: '系统初步设计方案',
|
||
stage: 'V0.5',
|
||
summary: '硬件拓扑、高速数据链路传输拓扑、算法数学配准模型与关键元器件BOM选型。',
|
||
markdownSkeleton: `# 系统初步设计方案
|
||
|
||
- 项目:{{project_name}}
|
||
- 生成时间:{{generated_at}}
|
||
- 快照:{{snapshot_id}}
|
||
|
||
## 结论
|
||
|
||
(系统级初步方案边界、主要子系统、关键接口,以及现在要用户确认的架构选择。详细设计不在本阶段完成。后文不得与本结论打架。)
|
||
|
||
## 架构偏好
|
||
|
||
{{architecture}}
|
||
|
||
(若字段为空:从材料与用户需求归纳 1~2 个可选架构,用同一套维度对比,推荐并写失效条件。不编造未验证指标。)
|
||
|
||
## 系统上下文
|
||
|
||
(按实际使用环境改图:用户、临床环境、医院信息系统、附件/耗材、外部设备。图下用一段话解释边界与数据/能量流向。)
|
||
|
||
\`\`\`mermaid
|
||
flowchart LR
|
||
user[用户/临床环境] --> system[本产品: {{device_type}}]
|
||
system --> hospital[医院信息系统/其他设备]
|
||
\`\`\`
|
||
|
||
## 子系统划分
|
||
|
||
(每个子系统:职责、主要部件或软件模块、与其他子系统的接口。至少覆盖与用户需求相关的部分;不适用的子系统写不适用理由。)
|
||
|
||
## 关键接口与数据流
|
||
|
||
(电气、机械、数据、供电、人机。每个接口写方向、主要内容、已知约束或标准线索。未知标待确认。)
|
||
|
||
## 与用户需求的追溯
|
||
|
||
(有用户需求 ID 则填真实行;没有则用描述性需求并标待确认,不要交只有 UR-001 的空壳。)
|
||
|
||
| 需求 ID | 设计响应 | 备注 |
|
||
|---|---|---|
|
||
| UR-001 | 系统主控上电快速启动调度与看门狗自检 | 硬件方案响应 |
|
||
| UR-002 | 结构微通道散热与接触件安全绝缘保护 | 热学与绝缘响应 |
|
||
| UR-003 | 前面板防尘防水按键接口与脚踏隔离接入 | 人机界面响应 |
|
||
| UR-004 | 硬件级双重互锁与声光告警驱动电路 | 安全控制响应 |
|
||
|
||
## 风险与待验证项
|
||
|
||
(技术风险、接口未定、需样机或检测才能关闭的项。每条写影响和下一步。)
|
||
|
||
## 待确认清单
|
||
|
||
## 说明
|
||
|
||
本方案为初步设计,不作为生产或注册的最终技术文档。不编造未验证的性能指标。
|
||
`,
|
||
},
|
||
{
|
||
taskKey: 'cdo_quote',
|
||
title: 'CDO 报价单',
|
||
stage: 'V1.0',
|
||
summary: '依据 CDO 医疗器械定价模型,对立项、研发、样品打样、型式检验与 DHF 进行精准工时拆解。',
|
||
markdownSkeleton: `# CDO 报价单
|
||
|
||
- 项目:{{project_name}}
|
||
- 生成时间:{{generated_at}}
|
||
- 快照:{{snapshot_id}}
|
||
- 配套 Excel:\`CDO报价核算.xlsx\`(完整保留公司定价模型模板的科目、公式与说明)
|
||
|
||
## 结论
|
||
|
||
按公司 CDO 定价核算模板给出税后合计。精确单价缺失处标「待确认」,不对外构成承诺。数字必须与配套 Excel「报价模型」一致。
|
||
|
||
## 报价范围
|
||
|
||
- 客户:{{customer_name}}
|
||
- 产品:{{product_name}}
|
||
- 币种与口径:人民币;Buffer 20%、毛利 40%、税 7%(模板口径)
|
||
|
||
## 报价模型
|
||
|
||
| 报价代码 | 服务内容 | 人数 | 人年 | 成本 | 加Buffer20% | 加毛利40% | 加税7% | 设备设施等费用 | 税后价格 |
|
||
|---|---|---|---|---|---|---|---|---|---|
|
||
| ID2 | 产品规划 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 |
|
||
| ID3.3.1.1 | 结构设计 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 |
|
||
| ID3.3.1.2 | 硬件设计 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 |
|
||
| ID3.3.1.3 | 软件设计 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 |
|
||
| ID3.3.1.4 | 外观设计 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 |
|
||
| ID3.3.1.5 | 合规设计 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 |
|
||
| ID4 | 研发样品 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 |
|
||
| ID5 | 设计验证 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 |
|
||
| ID6 | DHF文档 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 |
|
||
| | 总计 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 | 待确认 |
|
||
|
||
表中「人年」列与 Excel 模板同一列,对应模型投入人月合计(工时/160)。
|
||
|
||
## 说明
|
||
|
||
1)以上价格覆盖服务范围:原理样机验证,工程样机开发,送检样机开发
|
||
|
||
2)以上价格不含样机物料费用,如需乙方采购,另行商议
|
||
|
||
3)以上不含开发阶段使用的专用测试设备和工具工装费用
|
||
|
||
4)以上价格不包括药监局、医疗器械检验所等任何委托测试的第三方费用,第三方费用由甲方直接与第三方结算
|
||
|
||
5)以上未计算临床阶段费用
|
||
|
||
6)不含无菌耗材委托生产费用(CMO)
|
||
|
||
7)不含体系搭建费用
|
||
|
||
## 待确认清单
|
||
|
||
## 约束
|
||
|
||
本报价单与 \`CDO报价核算.xlsx\` 必须一致。金额不构成合同要约。不做取证时间承诺。
|
||
`,
|
||
},
|
||
];
|
||
|
||
/**
|
||
* 根据 taskKey 获取标准模板定义
|
||
*/
|
||
export function getTemplateDefinitionByTaskKey(taskKey: string): TemplateDefinition | undefined {
|
||
return STANDARD_WORKFLOW_TEMPLATES.find((t) => t.taskKey === taskKey);
|
||
}
|
||
|
||
/**
|
||
* 为指定项目动态实例化单份标准模板块状 AST
|
||
*/
|
||
export function buildTemplateASTForProject(
|
||
tmpl: TemplateDefinition,
|
||
params: TemplateFactoryParams
|
||
): DocumentAST {
|
||
const docId = params.docId || `doc-p${params.projectId}-${tmpl.taskKey}`;
|
||
const nowStr = new Date().toISOString().replace('T', ' ').substring(0, 16);
|
||
const customerName = params.customerName || '委托开发客户企业';
|
||
const author = params.authorName || params.creatorName || '编制工程师';
|
||
const reviewer = params.reviewerName || '质量负责人';
|
||
const approver = params.approverName || '技术委员会总监';
|
||
|
||
let md = tmpl.markdownSkeleton;
|
||
md = md.replaceAll('{{project_name}}', params.projectName);
|
||
md = md.replaceAll('{{product_name}}', params.projectName);
|
||
md = md.replaceAll('{{device_type}}', params.deviceType);
|
||
md = md.replaceAll('{{customer_name}}', customerName);
|
||
md = md.replaceAll('{{generated_at}}', nowStr);
|
||
md = md.replaceAll('{{snapshot_id}}', `SNAP-INIT-${params.projectId}`);
|
||
|
||
// 补全业务模板常见上下文占位符,防止留下大括号
|
||
md = md.replaceAll('{{intended_use}}', '待项目团队与临床专家共同确认预期用途与适应症');
|
||
md = md.replaceAll('{{target_market}}', '中国 NMPA(重点关注)');
|
||
md = md.replaceAll('{{timeline}}', '预计 6~12 个月');
|
||
md = md.replaceAll('{{budget}}', '待确认(按公司 CDO 定价模型测算)');
|
||
md = md.replaceAll('{{existing_materials}}', '项目立项信息表、初步临床沟通纪要');
|
||
md = md.replaceAll('{{constraints}}', '符合 ISO 13485 体系与国家强制性标准要求');
|
||
md = md.replaceAll('{{known_competitors}}', '待进一步查阅国内外公开注册数据库');
|
||
md = md.replaceAll('{{known_patents}}', '待启动 FTO 专题检索排查');
|
||
md = md.replaceAll('{{known_standards}}', 'GB 9706.1, YY 9706.102, GB/T 16886.1, ISO 14971');
|
||
md = md.replaceAll('{{device_class}}', 'II 类 / III 类(待注册法规专员评估确认)');
|
||
md = md.replaceAll('{{clinical_path}}', '待对比《免于临床评价医疗器械目录》');
|
||
md = md.replaceAll('{{tech_route}}', '主流医用硬件架构与嵌入式闭环控制系统');
|
||
md = md.replaceAll('{{manufacturing}}', '符合十万级洁净生产车间标准工艺');
|
||
md = md.replaceAll('{{architecture}}', '(系统推荐架构待结合硬件选型与实时数据链路完成对比后确认)');
|
||
md = md.replaceAll('{{user_roles}}', '- 术者:临床主任/主治医师\n- 巡回护士/器械护士:手术配合与辅助\n- 设备科工程师:日常维护与自检');
|
||
md = md.replaceAll('{{materials}}', '(本快照创建阶段无额外外部补充材料)');
|
||
|
||
return markdownToBlockAST(md, {
|
||
docId,
|
||
title: tmpl.title,
|
||
taskKey: tmpl.taskKey,
|
||
version: 'V0.1 (模板)',
|
||
category: 'workflow',
|
||
creatorId: params.creatorId,
|
||
creatorName: params.creatorName,
|
||
lifecycleState: 'template',
|
||
isClaimed: false,
|
||
author,
|
||
reviewer,
|
||
approver,
|
||
updatedAt: '刚刚',
|
||
summary: tmpl.summary,
|
||
});
|
||
}
|
||
|
||
/**
|
||
* 核心工厂函数:为新建项目生成全套 7 份受控交付物骨架及对应的 Block AST 缓存
|
||
*/
|
||
export function createProjectTemplateDeliverables(
|
||
params: TemplateFactoryParams
|
||
): TemplateFactoryResult {
|
||
const deliverables: DeliverableItem[] = [];
|
||
const docASTMap: Record<string, DocumentAST> = {};
|
||
const author = params.authorName || params.creatorName || '编制工程师';
|
||
const reviewer = params.reviewerName || '质量负责人';
|
||
const approver = params.approverName || '技术委员会总监';
|
||
|
||
STANDARD_WORKFLOW_TEMPLATES.forEach((tmpl) => {
|
||
const docId = `doc-p${params.projectId}-${tmpl.taskKey}`;
|
||
|
||
// 1. 实例化 DeliverableItem
|
||
const item: DeliverableItem = {
|
||
docId,
|
||
projectId: params.projectId,
|
||
taskKey: tmpl.taskKey,
|
||
title: tmpl.title,
|
||
stage: tmpl.stage,
|
||
category: 'workflow',
|
||
creatorId: params.creatorId,
|
||
creatorName: params.creatorName,
|
||
isFixedWorkflow: true,
|
||
isTemplateOnly: true,
|
||
lifecycleState: 'template',
|
||
isClaimed: false,
|
||
author,
|
||
reviewer,
|
||
approver,
|
||
updatedAt: '刚刚',
|
||
summary: tmpl.summary,
|
||
};
|
||
deliverables.push(item);
|
||
|
||
// 2. 解析为块状 AST 并缓存
|
||
const ast = buildTemplateASTForProject(tmpl, params);
|
||
docASTMap[docId] = ast;
|
||
});
|
||
|
||
return { deliverables, docASTMap };
|
||
}
|