hookehuyr

feat(parse-docs): 添加MCP解析切换功能和审核流程

1 +# 改进文档解析工具-添加审核流程
2 +
3 +**创建时间**: 2026-02-14
4 +**负责人**: Claude Code
5 +**优先级**: 🔴 高
6 +
7 +---
8 +
9 +## 背景分析
10 +
11 +### 当前问题
12 +使用 `pnpm parse:docs --file="计划书模版2.docx"` 解析文档时存在以下问题:
13 +
14 +1. **解析不准确**:mammoth解析.docx提取的内容与实际文档内容不符
15 + - 缺少产品基本信息(name, type, currency)
16 + - 字段定义提取不完整(form_schema, submit_mapping)
17 + - 结构化表格数据提取困难
18 +
19 +2. **缺少审核环节**
20 + - 当前流程:解析 → 直接生成配置代码
21 + - 问题:无法验证解析准确性,直接写入配置文件风险高
22 +
23 +3. **用户需求**
24 + - 需要"人工辅助"的半自动化方式
25 + - 在自动解析和直接生成配置之间增加审核环节
26 +
27 +---
28 +
29 +## 解决方案
30 +
31 +### 方案设计
32 +采用 **"解析 → 审核 → 生成"** 三步流程,支持多种解析方式:
33 +
34 +```
35 +┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
36 +│ 选择解析方式 │ → │ 生成待审核文件 │ → │ 人工审核后移动 │
37 +│ mammoth/MCP │ │ (markdown) │ │ 到正式配置 │
38 +└─────────────────┘ └─────────────────┘ └─────────────────┘
39 +```
40 +
41 +#### 解析方式对比
42 +
43 +| 特性 | mammoth | MCP文档解析 |
44 +|------|---------|-------------|
45 +| **准确性** | 基础(纯文本提取) | 高(AI理解结构) |
46 +| **结构化** | 弱(需手动处理) | 强(自动识别字段) |
47 +| **表格解析** | 一般(markdown表格) | 好(保留结构) |
48 +| **速度** | 快(本地解析) | 慢(网络请求) |
49 +| **成本** | 免费 | 可能需要API Key |
50 +
51 +#### 使用场景
52 +- **mammoth**: 快速预览、简单文档、离线使用
53 +- **MCP**: 复杂文档、准确度要求高、有网络连接
54 +
55 +### 技术实现
56 +
57 +#### 1. 改进extractProductBasicInfo
58 +尝试从多个位置提取产品基本信息:
59 +
60 +```javascript
61 +// 尝试从文档标题、表格、特定文本模式提取
62 +async function extractProductBasicInfo(content, fileName) {
63 + const info = {
64 + name: '',
65 + type: 'savings', // 默认储蓄型
66 + currency: 'USD',
67 + form_sn: generateFormSn(fileName)
68 + }
69 +
70 + // 策略1: 从文档标题提取
71 + const titleMatch = content.match(/^#\s+(.+)$/m)
72 + if (titleMatch) {
73 + info.name = cleanProductName(titleMatch[1].trim())
74 + }
75 +
76 + // 策略2: 从表格中提取"币种"信息
77 + const currencyMatch = content.match(/币种[::]\s*([A-Z]{3})/i)
78 + if (currencyMatch) {
79 + info.currency = currencyMatch[1]
80 + }
81 +
82 + // 策略3: 从表格中提取"产品类型"信息
83 + if (content.includes('重疾') || content.includes('危疾')) {
84 + info.type = 'critical-illness'
85 + } else if (content.includes('人寿')) {
86 + info.type = 'life-insurance'
87 + }
88 +
89 + return info
90 +}
91 +```
92 +
93 +#### 2. 实现generateAuditFile
94 +生成结构化的待审核markdown文件:
95 +
96 +```javascript
97 +async function generateAuditFile(fileName, config, code) {
98 + const auditDir = 'docs/parse-audit/pending/'
99 + const dateStr = new Date().toISOString().split('T')[0].replace(/:/g, '-')
100 + const auditFileName = `${dateStr}-${fileName.replace(/\.[^/.]+$/, '')}.md`
101 + const auditFilePath = path.join(auditDir, auditFileName)
102 +
103 + const content = `# 产品配置审核 - ${fileName}
104 +
105 +**解析时间**: ${new Date().toLocaleString('zh-CN')}
106 +
107 +---
108 +
109 +## 📋 产品基本信息
110 +
111 +| 字段 | 提取值 | 需要确认 |
112 +|------|--------|---------|
113 +| 产品名称 | ${config.name || '未提取'} | ✅ 请核对产品名称 |
114 +| 产品类型 | ${config.type || '未提取'} | ✅ 请确认产品类型 |
115 +| 币种 | ${config.currency || 'USD'} | ✅ 请确认币种 |
116 +| form_sn | \`${config.form_sn || '未生成'}` | 请确认form_sn唯一性 |
117 +
118 +---
119 +
120 +## 📝 表单字段 (form_schema)
121 +
122 +\`\`\`javascript
123 +${code.form_schema || '// 请手动补充'}
124 +\`\`\`
125 +
126 +---
127 +
128 +## 🔄 提交字段映射 (submit_mapping)
129 +
130 +\`\`\`javascript
131 +${code.submit_mapping || '// 请手动补充'}
132 +\`\`\`
133 +
134 +---
135 +
136 +## ✅ 审核检查清单
137 +
138 +- [ ] 产品名称正确
139 +- [ ] 产品类型正确(savings/critical-illness/life-insurance)
140 +- [ ] 币种正确(USD/CNY/HKD/EUR)
141 +- [ ] form_sn 唯一且符合命名规范
142 +- [ ] 缴费年期选项完整
143 +- [ ] 年龄范围合理
144 +- [ ] 提取计划配置(如适用)
145 +- [ ] 表单字段定义完整
146 +- [ ] 提交字段映射正确
147 +
148 +---
149 +
150 +## 📋 审核后操作
151 +
152 +### 确认无误
153 +\`\`\`bash
154 +# 1. 移动配置到正式文件
155 +mv docs/parse-audit/pending/${auditFileName} \\
156 + src/config/plan-templates.backup.js
157 +
158 +# 2. 合并到正式配置
159 +# 手动复制或使用工具合并
160 +
161 +# 3. 删除待审核文件
162 +rm docs/parse-audit/pending/${auditFileName}
163 +\`\`\`
164 +
165 +### 需要修改
166 +1. 编辑本文件修正内容
167 +2. 重新提交审核
168 +
169 +### 放弃本次解析
170 +\`\`\`bash
171 +rm docs/parse-audit/pending/${auditFileName}
172 +\`\`\`
173 +`
174 +
175 +---
176 +
177 +**生成工具**: Claude Code - parse-docs.js
178 +`
179 +
180 + return fs.writeFileSync(auditFilePath, content, 'utf-8')
181 +}
182 +```
183 +
184 +---
185 +
186 +## 实施计划
187 +
188 +### 阶段1: 改进解析逻辑 (30分钟)
189 +- [ ] 改进extractProductBasicInfo函数
190 + - [ ] 添加文档标题提取
191 + - [ ] 添加币种信息提取
192 + - [ ] 添加产品类型推断
193 + - [ ] 测试验证提取效果
194 +
195 +### 阶段2: 实现审核文件生成 (20分钟)
196 +- [ ] 实现generateAuditFile函数
197 + - [ ] 创建待审核目录结构
198 + - [ ] 测试生成markdown格式
199 + - [ ] 添加文件路径返回
200 +
201 +### 阶段3: 集成到主流程 (10分钟)
202 +- [ ] 更新parse-docs.js主函数
203 + - [ ] 添加成功提示和审核引导
204 + - [ ] 错误处理和日志输出
205 +
206 +### 阶段4: 测试验证 (10分钟)
207 +- [ ] 使用实际文档测试
208 +- [ ] 验证生成的审核文件格式
209 + - [ ] 确认目录结构正确
210 +
211 +---
212 +
213 +## 预期成果
214 +
215 +1. **更准确的信息提取**
216 + - 产品基本信息提取率提升
217 + - 减少人工补充工作
218 +
219 +2. **结构化审核流程**
220 + - 清晰的待审核markdown格式
221 + - 明确的审核检查清单
222 + - 简单的审核后操作指引
223 +
224 +3. **更好的用户体验**
225 + - 成功提示包含下一步操作
226 + - 降低配置错误风险
227 +
228 +---
229 +
230 +## 风险评估
231 +
232 +| 风险 | 影响 | 应对措施 |
233 +|------|------|---------|
234 +| 提取仍不准确 | 需要大量人工补充 | 提供清晰的标记和默认值 |
235 +| 审核文件过多 | 难以管理 | 定期清理已审核文件 |
236 +| 目录权限问题 | 无法写入文件 | 提前创建目录并检查权限 |
237 +
238 +---
239 +
240 +## 后续优化
241 +
242 +1. **交互式审核**
243 + - 提供命令行工具逐步引导填写缺失信息
244 + - 支持编辑现有审核文件
245 +
246 +2. **智能推断**
247 + - 基于历史配置推断产品类型
248 + - 从表格结构自动推断字段定义
249 +
250 +3. **版本对比**
251 + - 检测配置变更并生成差异报告
252 + - 支持配置回滚
253 +
254 +---
255 +
256 +## 相关文档
257 +- [mamoth使用文档](https://github.com/mwilliamtohman/mammoth)
258 +- [计划书模板配置规范](../../src/config/CLAUDE.md)
259 +- [代码注释规范](~/.claude/rules/code-commenting.md)
This diff is collapsed. Click to expand it.