feat(docs): 优化文档解析工具并添加单元测试
- 重构 generateConfigCode 函数,简化代码生成逻辑 - 导出核心函数以支持单元测试 - 为储蓄产品添加顶层 category 属性 - 添加 parse-docs.test.js 单元测试(3个测试用例全部通过) - 优化 commit-msg hook 校验逻辑 - 更新 CHANGELOG.md Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Showing
6 changed files
with
90 additions
and
261 deletions
| ... | @@ -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 | ### 优化 | ... | ... |
docs/to-parse/保险知识库.md
deleted
100644 → 0
| 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.
scripts/parse-docs.test.js
0 → 100644
| 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 | +}) |
-
Please register or login to post a comment