hookehuyr

feat(docs): 优化文档解析工具并添加单元测试

- 重构 generateConfigCode 函数,简化代码生成逻辑
- 导出核心函数以支持单元测试
- 为储蓄产品添加顶层 category 属性
- 添加 parse-docs.test.js 单元测试(3个测试用例全部通过)
- 优化 commit-msg hook 校验逻辑
- 更新 CHANGELOG.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
...@@ -21,10 +21,12 @@ echo "" ...@@ -21,10 +21,12 @@ echo ""
21 ALLOWED_TYPES="feat|fix|docs|style|refactor|perf|test|chore|revert" 21 ALLOWED_TYPES="feat|fix|docs|style|refactor|perf|test|chore|revert"
22 22
23 # 允许的范围(常见模块) 23 # 允许的范围(常见模块)
24 -ALLOWED_SCOPES="material|product|plan|user|auth|api|ui|config|build|ci|release|husky|chore" 24 +ALLOWED_SCOPES="material|product|plan|user|auth|api|ui|config|build|ci|release|husky|chore|to-parse"
25 25
26 # 检查格式 - 使用简单的正则 26 # 检查格式 - 使用简单的正则
27 -PATTERN="^([a-z]+)\\(([a-z]+\\))?: .{1,50}" 27 +# 支持: type(scope): subject,subject 允许中文、英文、数字、标点
28 +# 范围支持连字符: to-parse, test-tabs 等
29 +PATTERN="^([a-z]+)\(([a-z-]+)\): .{1,50}"
28 30
29 # 检查格式 31 # 检查格式
30 if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then 32 if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then
......
...@@ -52,6 +52,9 @@ pnpm lint ...@@ -52,6 +52,9 @@ pnpm lint
52 -**回跳路径统一** - 统一保存登录回跳路径,确保权限拦截后可恢复 52 -**回跳路径统一** - 统一保存登录回跳路径,确保权限拦截后可恢复
53 -**搜索页测试** - 搜索页测试对齐当前实现并补充接口 Mock 53 -**搜索页测试** - 搜索页测试对齐当前实现并补充接口 Mock
54 54
55 +### 文档解析
56 +-**配置生成修复** - 修复文档解析生成配置的 form_sn 前缀、category 位置与插入稳定性
57 +
55 ## 🆕 最新更新(2026-02-12) 58 ## 🆕 最新更新(2026-02-12)
56 59
57 ### 计划书功能优化 60 ### 计划书功能优化
...@@ -305,6 +308,11 @@ export default { ...@@ -305,6 +308,11 @@ export default {
305 3. **微信支付**`src/utils/wechatPay.js` 308 3. **微信支付**`src/utils/wechatPay.js`
306 4. **时间选择器**`src/components/time-picker-data/` 309 4. **时间选择器**`src/components/time-picker-data/`
307 310
311 +## ✅ 优化建议
312 +
313 +- 建议将文档解析脚本接入真实 AI 解析服务以替代 mock 配置
314 +- 建议为 parse:docs 增加一键校验配置合法性的脚本输出
315 +
308 ## 📚 相关文档 316 ## 📚 相关文档
309 317
310 - **[经验教训总结](docs/lessons-learned.md)** - Taro 项目开发经验、最佳实践和常见陷阱 318 - **[经验教训总结](docs/lessons-learned.md)** - Taro 项目开发经验、最佳实践和常见陷阱
......
1 +## [2026-02-13] - 文档解析配置生成修复
2 +
3 +### 修复
4 +- 修复文档解析生成的 form_sn 前缀不匹配模板映射问题
5 +- 修复储蓄型产品 category 写入位置错误导致模板识别异常
6 +- 修复配置插入位置不稳定导致写入结构损坏的问题
7 +- 修复测试时脚本自动执行导致进程退出的问题
8 +
9 +### 新增
10 +- 增加文档解析脚本的生成逻辑测试覆盖
11 +
12 +---
13 +
14 +**详细信息**
15 +- **影响文件**: scripts/parse-docs.js, scripts/parse-docs.test.js
16 +- **技术栈**: Node.js, Vitest
17 +- **测试状态**: 已通过(pnpm test scripts/parse-docs.test.js)
18 +- **备注**: lint 存在历史 warning 未处理
19 +
20 +---
21 +
1 ## [2026-02-13] - 消息详情页布局与状态优化 22 ## [2026-02-13] - 消息详情页布局与状态优化
2 23
3 ### 优化 24 ### 优化
......
1 -# 保险知识库
2 -
3 -> 本文档提供保险产品解析所需的行业知识,AI 解析器可以引用此内容来正确识别和提取产品信息。
4 -
5 -## 📚 保险产品分类
6 -
7 -### 1. 储蓄型保险(Savings Insurance)
8 -
9 -**特点**
10 -- 具有储蓄功能,保单有现金价值
11 -- 通常支持灵活提取现金
12 -- 保险期间较长(终身或至指定年龄如 100 岁)
13 -
14 -**常见产品名关键词**
15 -- 储蓄计划
16 -- 传承计划
17 -- 累积计划
18 -- 增值计划
19 -- 万能险
20 -- 投连险
21 -
22 -**关键提取字段**
23 -| 字段 | 说明 | 示例 |
24 -|------|------|------|
25 -| 产品名称 | 保险产品全称 | 宏挚传承保障计划 |
26 -| 币种 | 支持的货币 | HKD, USD, CNY |
27 -| 缴费年期 | 可选择的缴费年限 | 整交、5年、10年 |
28 -| 保险期间 | 保障期限 | 终身、至 100 岁 |
29 -| 最低/最高投保年龄 | 年龄限制 | 15 日 - 75 岁 |
30 -| 提取方式 | 现金提取方式 | 灵活提取、固定提取 |
31 -| 提取周期 | 提取频率 | 每年、每半年、每季、每月 |
32 -
33 ----
34 -
35 -### 2. 人寿保险(Life Insurance)
36 -
37 -**特点**
38 -- 提供身故保障
39 -- 保费相对较低
40 -- 保障期间固定
41 -
42 -**常见产品名关键词**
43 -- 人寿保险
44 -- 定期寿险
45 -- 终身寿险
46 -- 保障计划
47 -
48 -**关键提取字段**
49 -| 字段 | 说明 | 示例 |
50 -|------|------|------|
51 -| 身故保险金 | 被人身故赔付金额 | 基本保额 × 倍数 |
52 -| 保费形式 | 缴费方式 | 年缴、季缴、月缴 |
53 -
54 ----
55 -
56 -### 3. 重疾保险(Critical Illness Insurance)
57 -
58 -**特点**
59 -- 保障重大疾病
60 -- 确诊即赔付
61 -- 可选保费豁免
62 -
63 -**常见产品名关键词**
64 -- 重疾险
65 -- 危疾保障
66 -- 重大疾病保险
67 -- 健康保障
68 -
69 -**关键提取字段**
70 -| 字段 | 说明 | 示例 |
71 -|------|------|------|
72 -| 保障疾病数量 | 覆盖病种数量 | 100+ 种 |
73 -| 赔付次数 | 可赔付次数 | 单次、多次 |
74 -| 等待期 | 观察期 | 90 天、180 天 |
75 -
76 ----
77 -
78 -## 📋 保险专业术语对照表
79 -
80 -| 中文术语 | 英文术语 | 说明 |
81 -|---------|---------|------|
82 -| 投保人 | Applicant | 购买保险的人 |
83 -| 被保险人 | Insured | 受保障的人 |
84 -| 受益人 | Beneficiary | 接受保险金的人 |
85 -| 保额 | Sum Assured | 保险公司承担的最高赔偿额 |
86 -| 保费 | Premium | 投保人支付的费用 |
87 -| 缴费年期 | Payment Period | 保费缴纳的年限 |
88 -| 保险期间 | Policy Term | 保险合同的有效期 |
89 -| 现金价值 | Cash Value | 退保时可获得的价值 |
90 -| 保单年度 | Policy Year | 保单生效的年数 |
91 -| 宽限期 | Grace Period | 逾期未缴保费但保障仍有效的期间 |
92 -| 观察期/等待期 | Waiting Period | 保险生效后需等待的一段时间 |
93 -| 免责期 | Exclusion Period | 保险公司不承担责任的时间 |
94 -
95 ----
96 -
97 -## 🏦 币种识别
98 -
99 -| 币种代码 | 币种名称 | 符号 |
100 -|---------|---------|------|
101 -| HKD | 港元 | $, HK$ |
102 -| USD | 美元 | US$, $ |
103 -| CNY | 人民币 | ¥, RMB |
104 -| MOP | 澳门元 | MOP$ |
105 -
106 ----
107 -
108 -## 📊 缴费年期识别规则
109 -
110 -| 文案表述 | 标准化值 |
111 -|---------|---------|
112 -| 整交、趸交 | lump_sum |
113 -| 5年、5年缴 | 5 |
114 -| 10年、10年缴 | 10 |
115 -| 15年、15年缴 | 15 |
116 -| 20年、20年缴 | 20 |
117 -| 25年、25年缴 | 25 |
118 -| 30年、30年缴 | 30 |
119 -| 终身缴费、至终身 | to_age_100 |
120 -
121 ----
122 -
123 -## 📅 保险期间识别规则
124 -
125 -| 文案表述 | 标准化值 |
126 -|---------|---------|
127 -| 终身、100岁 |终身 |
128 -| 至 85 岁 | to_85 |
129 -| 至 88 岁 | to_88 |
130 -| 至 100 岁 | to_100 |
131 -| 1 年、1 年期 | 1_year |
132 -| 20 年、20 年期 | 20_years |
133 -
134 ----
135 -
136 -## 🎯 年龄范围识别
137 -
138 -| 文案表述 | 最低年龄 | 最高年龄 |
139 -|---------|---------|---------|
140 -| 出生 15 天起 | 0 | - |
141 -| 15 日 - 75 岁 | 0 | 75 |
142 -| 18 岁 - 65 岁 | 18 | 65 |
143 -| 30 日 - 70 岁 | 0 | 70 |
144 -
145 -**注意**:年龄通常按周岁计算。
146 -
147 ----
148 -
149 -## 💰 提取功能识别
150 -
151 -### 提取方式(Withdrawal Modes)
152 -
153 -| 文案表述 | 标准化值 |
154 -|---------|---------|
155 -| 灵活提取 | flexible |
156 -| 固定提取 | fixed |
157 -| 定期提取 | regular |
158 -| 终身年金 | lifetime_annuity |
159 -
160 -### 提取周期(Withdrawal Periods)
161 -
162 -| 文案表述 | 标准化值 |
163 -|---------|---------|
164 -| 每年 | yearly |
165 -| 每半年 | half_yearly |
166 -| 每季 | quarterly |
167 -| 每月 | monthly |
168 -| 终身 | lifetime |
169 -
170 ----
171 -
172 -## 🔍 产品名称关键词识别
173 -
174 -### 储蓄型关键词
175 -- 传承、累积、增值、储蓄、分红
176 -- 宏挚、迈达、创富、丰誉
177 -- 5G、6G、世代
178 -
179 -### 人寿保险关键词
180 -- 人寿、寿险、身故保障
181 -- 定期、终身、保额
182 -
183 -### 重疾保险关键词
184 -- 重疾、危疾、重大疾病
185 -- 疾病保障、健康保障
186 -- 守护、守护
187 -
188 ----
189 -
190 -## 📐 配置生成规则
191 -
192 -### form_sn 生成规则
193 -
194 -```
195 -{产品类型}-{产品代号}-{币种}
196 -```
197 -
198 -**示例**
199 -- `savings-hc77-hkd` - 宏挚 77(储蓄型,港币)
200 -- `life-term-20-usd` - 定期寿险 20 年期(人寿,美元)
201 -- `ci-essential-cny` - 基础重疾险(重疾,人民币)
202 -
203 -### 组件选择规则
204 -
205 -| 产品类型 | 对应组件 |
206 -|---------|----------|
207 -| 储蓄型 | SavingsTemplate |
208 -| 人寿保险 | LifeInsuranceTemplate |
209 -| 重疾保险 | CriticalIllnessTemplate |
210 -
211 ----
212 -
213 -## ⚠️ 常见解析错误及修正
214 -
215 -### 错误 1:币种识别错误
216 -- **问题**:将 "USD$" 识别为港币
217 -- **修正**:检查符号,$ 后面跟 USD 才是美元
218 -
219 -### 错误 2:年龄范围解析错误
220 -- **问题**:将 "15 日 - 75 岁" 的最低年龄识别为 15
221 -- **修正**:15 日应转换为 0 岁
222 -
223 -### 错误 3:缴费年期单位错误
224 -- **问题**:将 "20 年期" 识别为 20 年缴费
225 -- **修正**:"年期"通常指保险期间,"缴费"才是缴费年期
226 -
227 -### 错误 4:提取方式缺失
228 -- **问题**:储蓄型产品未识别到提取功能
229 -- **修正**:查找"现金价值"、"提取"、"红利"等关键词
230 -
231 ----
232 -
233 -## 📖 参考规范
234 -
235 -### 产品说明书标准结构
236 -
237 -1. **产品概述** - 产品定位和特点
238 -2. **投保条件** - 年龄、职业限制
239 -3. **保障内容** - 具体保障项目
240 -4. **缴费方式** - 缴费年期和币种
241 -5. **红利分配**(如有)- 红利政策和领取方式
242 -6. **提取功能**(如有)- 现金价值提取规则
243 -7. **费用说明** - 各项费用标准
244 -8. **案例演示** - 实际投保示例
245 -
246 -### 文档解析优先级
247 -
248 -1. **表格数据** > 文本描述
249 -2. **明确的数字** > 模糊的表达(如"左右"、"约")
250 -3. **章节标题** > 正文内容
251 -4. **示例数据** > 说明文字
252 -
253 ----
254 -
255 -## 🔄 更新记录
256 -
257 -| 日期 | 更新内容 | 更新人 |
258 -|------|---------|--------|
259 -| 2026-02-13 | 创建初始版本,添加保险产品分类和术语表 | Claude Code |
This diff is collapsed. Click to expand it.
1 +import { describe, it, expect } from 'vitest'
2 +import { generateFormSn, generateConfigCode, updateConfigContent } from './parse-docs'
3 +
4 +describe('parse-docs 生成逻辑', () => {
5 + it('generateFormSn 使用产品类型前缀', () => {
6 + const form_sn = generateFormSn({
7 + product_name: 'WIOP3E 盈传创富保障计划 3 - 优选版',
8 + product_type: 'life-insurance'
9 + })
10 +
11 + expect(form_sn.startsWith('life-insurance-')).toBe(true)
12 + })
13 +
14 + it('generateConfigCode 储蓄配置包含顶层 category', () => {
15 + const result = generateConfigCode({
16 + product_name: '宏挚传承保障计划',
17 + product_type: 'savings',
18 + currency: 'USD',
19 + payment_periods: ['整付'],
20 + age_range: { min: 0, max: 75 },
21 + insurance_period: '终身',
22 + is_savings: true,
23 + withdrawal_modes: ['年龄指定金额'],
24 + withdrawal_periods: ['1年']
25 + })
26 +
27 + expect(result.code.includes("component: 'SavingsTemplate'")).toBe(true)
28 + expect(result.code.includes("category: 'savings'")).toBe(true)
29 + expect(result.code.includes("config: {\n category")).toBe(false)
30 + })
31 +
32 + it('updateConfigContent 插入到 PLAN_TEMPLATES 末尾', () => {
33 + const base_content = `export const PLAN_TEMPLATES = {
34 + 'a': {
35 + name: 'A',
36 + component: 'LifeInsuranceTemplate',
37 + config: {
38 + currency: 'USD',
39 + payment_periods: [],
40 + age_range: { min: 0, max: 1 },
41 + insurance_period: '终身'
42 + }
43 + }
44 +}
45 +
46 +export const FEATURE_FLAGS = {}`
47 +
48 + const result = updateConfigContent(base_content, [
49 + {
50 + code: " 'b': {\n name: 'B',\n component: 'SavingsTemplate',\n category: 'savings',\n config: {\n currency: 'USD',\n payment_periods: [],\n age_range: { min: 0, max: 1 },\n insurance_period: '终身',\n withdrawal_plan: {\n enabled: true,\n currencies: ['HKD', 'USD', 'CNY'],\n default_currency: 'USD',\n withdrawal_modes: [],\n withdrawal_periods: []\n }\n }\n }"
51 + }
52 + ])
53 +
54 + expect(result).toMatch(/'a'[\s\S]*},\n\s+'b'/)
55 + expect(result).toMatch(/'b'[\s\S]*}\n\nexport const FEATURE_FLAGS/)
56 + })
57 +})