hookehuyr

docs(parse): 清理审核文档并更新 parse-docs 脚本

主要变更:
- 清理 CHANGELOG.md (移除历史记录,保持精简)
- 移除旧的 pending 审核文件
- 删除 scripts/README.md
- 更新 parse-docs.js 脚本
- 更新 README.md 和 to-parse/README.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
......@@ -430,6 +430,8 @@ export default {
5. 认证失败会自动跳转到 `/pages/login/index`
6. **所有函数必须有 JSDoc 注释** - 详见 `~/.claude/rules/code-commenting.md`
7. 业务路由以 `src/app.config.js` 为准,计划类文档仅保留历史记录
8. 文档解析成功后原始文档会自动归档到 `docs/to-parse/archived/YYYY-MM-DD/`
9. 待审核文件按原始文档名分目录存放于 `docs/parse-audit/pending/<原始文档名>/`
## ✅ 优化建议
......
## [2026-02-15] - 多产品文档解析支持
### 新增
- 新增 `product-splitter.js` 产品边界检测模块
- 支持产品代码前缀识别(GS、GC、FA、LV2 等)
- 支持产品命名模式(以"計劃"、"保障"、"保险"、"壽險"结尾)
- 自动检测和分割多产品文档
# CHANGELOG
## [2026-02-15] - 待审核文件按文档分目录
### 优化
- 增强 `parse-docs.js` 多产品处理能力
- `parseSingleFile()` 支持返回多产品数组
- `generateAuditFile()` 支持产品索引参数生成独立文件名
- 单文件模式 (`--file=`) 正确处理多产品结果
- `buildParseSummary()` 统计多产品数量
- 优化 `smart-field-extractor.js` 结构
- 新增 `smartExtractFieldsForProduct()` 单产品提取函数
- 移除重复的函数定义,统一调用接口
---
**详细信息**
- **影响文件**: scripts/product-splitter.js, scripts/parse-docs.js, scripts/smart-field-extractor.js
- **技术栈**: Node.js, 正则表达式, 多产品分割
- **测试状态**: 已测试(解析 计划书模版2.docx 成功识别 4 个产品)
- **备注**: 每个产品生成独立的审核文件,便于人工逐一确认
---
## [2026-02-15] - 智能字段提取器完善
### 新增
- 实现 `smartExtractList()` 智能列表提取函数
- 支持基于起始模式和结束关键词的列表边界识别
### 修复
- 修复 `insurance_period``withdrawal_modes` 字段的 `postProcess` 函数类型处理问题
- 优化 `payment_periods` 字段的过滤逻辑,排除"投保年龄"等无效项
---
**详细信息**
- **影响文件**: scripts/smart-field-extractor.js
- **技术栈**: Node.js, 正则表达式, 智能提取
- **测试状态**: 单元测试通过
- **备注**: 提升了字段提取的准确性和健壮性
---
## [2026-02-14] - 消息功能全面优化
### 优化
- 优化消息列表卡片布局,提升信息可读性
- 简化消息列表逻辑,移除冗余代码
- 优化消息详情页布局,避免内容重复显示
- 统一消息页面样式和交互体验
---
**详细信息**
- **影响文件**: src/pages/message/index.vue, src/pages/message-detail/index.vue
- **技术栈**: Vue 3, Taro 4, NutUI
- **测试状态**: 已通过
- **备注**: 提升用户阅读体验,代码更简洁可维护
---
## [2026-02-14] - Git 工作流与版本管理优化
### 优化
- 使用 standard-version 替代自定义版本更新脚本
- 配置 standard-version 不自动生成 CHANGELOG(由人工维护)
- 完善版本发布流程和 Git 工作流文档
- 移除旧的版本自动更新脚本
### 新增
- 配置 conventional commits 规范
- 完善版本管理最佳实践文档
---
**详细信息**
- **影响文件**: .versionrc.json, package.json, scripts/ (removed)
- **技术栈**: standard-version, conventional commits
- **测试状态**: 已验证
- **备注**: 统一版本管理工具,简化发布流程
---
## [2026-02-14] - 文档解析使用说明完善
### 优化
- 补充解析链路与使用思路,明确审核与合并边界
- 更新解析命令说明与默认行为
---
**详细信息**
- **影响文件**: docs/to-parse/README.md, README.md
- **技术栈**: 文档维护
- **测试状态**: 未运行(仅文档更新)
- **备注**: 使用方式与链路更清晰
---
## [2026-02-14] - 文档解析审核流程落地
### 优化
- 修复审核模板重复定义与内容断裂,统一字段命名与展示结构
- 完善审核流程指引,明确 pending/approved 目录治理与合并步骤
- 默认解析仅生成待审核文件,写入配置需显式开启
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, docs/to-parse/README.md, docs/tasks/plan/改进文档解析工具-添加审核流程.md, README.md
- **技术栈**: Node.js, 文档维护
- **测试状态**: pnpm test 通过;pnpm lint 30 warnings
- **备注**: 已生成待审核文件并完成可读性校验
---
## [2026-02-14] - 文档解析审核方案整理
### 优化
- 整理审核流程文档并对齐字段命名与目录规范
- 补充审核模板修复重点与解析策略改进点
---
**详细信息**
- **影响文件**: docs/tasks/plan/改进文档解析工具-添加审核流程.md, README.md
- **技术栈**: 文档维护
- **测试状态**: 未运行(仅文档更新)
- **备注**: 明确审核流程现状与修复范围
---
## [2026-02-14] - markitdown 文档解析服务集成
### 新增
- 集成 markitdown CLI 工具支持 PDF/DOCX 文档解析
- 创建 parse-config.js 统一配置管理模块
- 添加配置状态检查命令 `npm run parse:docs:status`
- 创建 .env.example 环境变量模板
- 新增 scripts/README.md 使用指南
### 优化
- MD/TXT 文件直接读取,无需 markitdown 处理
- PDF/DOCX 文件通过 markitdown CLI 转换
- 添加 markitdown 失败时的本地库回退机制
---
**详细信息**
- **影响文件**: scripts/parse-config.js, scripts/parse-docs.js, scripts/.env.example, scripts/README.md, package.json
- **技术栈**: Node.js, Python (markitdown v0.1.4), child_process
- **测试状态**: 已通过(MD 文件解析验证)
- **备注**: markitdown CLI 已安装,配置已启用 (type: 'cli')
---
## [2026-02-14] - 空表单回退规则补齐
### 修复
- 空 schema 自动回退默认 schema,避免生成空表单
- 生成结果中空 schema 配置回填为默认 schema 引用
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, scripts/parse-docs.test.js, src/utils/parsers/config-generator.js, src/config/plan-templates.js, README.md
- **技术栈**: Node.js, Vitest
- **测试状态**: pnpm test 通过;pnpm lint 30 warnings
- **备注**: form_schema 为空结构时将使用对应类型默认 schema
---
## [2026-02-14] - 解析文件过滤
### 修复
- 解析待处理目录时跳过 README.md
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, README.md
- **技术栈**: Node.js
- **测试状态**: pnpm test 通过;pnpm lint 30 warnings
- **备注**: 仅过滤 docs/to-parse/README.md
---
## [2026-02-14] - 搜索测试 Mock 开关修正
### 修复
- 搜索页单测固定使用真实 API Mock,避免被全局 Mock 开关干扰
---
**详细信息**
- **影响文件**: src/pages/search/index.test.js
- **技术栈**: Vitest
- **测试状态**: pnpm test 通过;pnpm lint 30 warnings
- **备注**: 用例统一 mock USE_MOCK_DATA=false
---
## [2026-02-14] - 解析配置字段补齐
### 新增
- 解析配置生成按保险类型注入 form_schema 与 submit_mapping
- 补充解析生成默认 schema/mapping 输出测试
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, scripts/parse-docs.test.js, src/utils/parsers/config-generator.js, README.md
- **技术栈**: Node.js, Vitest
- **测试状态**: pnpm test 失败(search 页面 2 项断言);pnpm lint 30 warnings
- **备注**: 解析生成不会再输出空的 form_schema/submit_mapping
---
## [2026-02-14] - Mock 数据结构优化
### 新增
- 添加测试商品置顶功能(savings-product-30b41aae)
- 产品列表 Mock 数据新增 form_sn 和 created_time 字段
### 修复
- 修复 Mock 数据结构与真实 API 一致性
- 将 category_id 改为 categories 数组结构
- 移除多余字段(name, description, premium)
---
**详细信息**
- **影响文件**: src/utils/mockData.js
- **技术栈**: Mock 数据生成
- **测试状态**: 已通过
- **备注**: 测试商品固定在第一页第一位,便于测试
---
## [2026-02-14] - 测试计划书解析验证
### 新增
- 成功解析 docs/to-parse/测试计划书-智享未来.md 并生成计划书配置
---
**详细信息**
- **影响文件**: src/config/plan-templates.js, docs/to-parse/测试计划书-智享未来.md
- **技术栈**: Node.js, 文档解析脚本
- **测试状态**: pnpm run parse:docs -- --file="测试计划书-智享未来.md" 通过
- **备注**: 解析产物已写入 plan-templates 配置
---
## [2026-02-14] - 文档解析改造回归测试
### 测试
- pnpm test 通过(Vitest 全量用例)
- pnpm lint 通过(30 个现存警告)
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, scripts/parse-docs.test.js, src/pages/search/index.test.js, src/components/list/LoadMoreList/index.vue
- **技术栈**: Vitest, ESLint
- **测试状态**: pnpm test 通过;pnpm lint 30 warnings
- **备注**: 测试中出现 NutUI/Taro 组件解析警告与 Taro API mock 警告,但用例通过
---
## [2026-02-14] - 运营与审计完善
### 新增
- 解析摘要输出(成功/失败/耗时)并生成审计日志与变更摘要
- 使用说明补充解析摘要与审计日志位置
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, scripts/parse-docs.test.js, docs/to-parse/README.md, docs/tasks/文档解析改造-tasks.md, README.md
- **技术栈**: Node.js, Vitest, 文档维护
- **测试状态**: pnpm test 通过;pnpm lint 30 warnings
- **备注**: 每次解析都有可追溯审计记录
---
## [2026-02-14] - 测试与验证完善
### 新增
- 补充解析流程集成测试与 updateConfigContent 边界测试
- 新增 fixtures 文档样本说明并补齐相关文档入口
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, scripts/parse-docs.test.js, docs/to-parse/README.md, docs/tasks/文档解析改造-tasks.md, README.md
- **技术栈**: Node.js, Vitest, 文档维护
- **测试状态**: 已通过(pnpm test),ESLint 存在现有警告
- **备注**: 解析流程测试可重复运行,覆盖冲突与插入边界路径
---
## [2026-02-14] - 生成与写入稳态化
### 新增
- 结构化定位 PLAN_TEMPLATES 插入位置并支持 dry-run 变更预览
- 增加重复 form_sn 冲突检测与阻断写入
- 完善备份记录并支持回滚入口
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, scripts/parse-docs.test.js, docs/tasks/文档解析改造-tasks.md, README.md
- **技术栈**: Node.js, Vitest
- **测试状态**: 已通过(pnpm test),ESLint 存在现有警告
- **备注**: 解析写入路径更稳定,新增冲突保护与预览模式
---
## [2026-02-14] - 结构化解析校验接入
### 新增
- 接入 JSON Schema 校验并输出缺失字段报告
- 校验失败阻断解析结果写入配置
- 单测覆盖校验通过与失败路径
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, scripts/parse-docs.test.js, package.json, docs/tasks/文档解析改造-tasks.md, README.md
- **技术栈**: Node.js, Ajv, Vitest
- **测试状态**: 已通过(pnpm test),ESLint 存在现有警告
- **备注**: 校验规则覆盖核心字段并保留扩展字段
---
## [2026-02-14] - 文本抽取管线接入
### 新增
- 接入 PDF 文本抽取与页数元信息
- 接入 Docx 文本抽取并输出警告信息
- 统一抽取结果结构并增加抽取失败回退
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, scripts/parse-docs.test.js, package.json, docs/tasks/文档解析改造-tasks.md, README.md
- **技术栈**: Node.js, Vitest
- **测试状态**: 已通过(pnpm test),ESLint 存在现有警告
- **备注**: .doc 文件提示转换为 .docx,OCR 预留未启用
---
## [2026-02-14] - 文档解析输出定义完善
### 更新
- 明确解析输出 JSON 结构并补齐示例与约束
- 生成 form_sn 改为稳定的 slug + hash 规则
- 配置生成支持 form_schema 与 submit_mapping 输出
---
**详细信息**
- **影响文件**: scripts/parse-docs.js, scripts/parse-docs.test.js, docs/plan/plan-form-schema-usage.md, docs/tasks/文档解析改造-tasks.md, README.md
- **技术栈**: Node.js, Vitest, 文档维护
- **测试状态**: 已通过(pnpm test),ESLint 存在现有警告
- **备注**: 解析输出结构对齐 Schema 与提交映射配置
---
## [2026-02-14] - 文档解析改造任务清单
### 新增
- 新增文档解析改造任务清单,细化步骤与验收标准
---
**详细信息**
- **影响文件**: docs/tasks/文档解析改造-tasks.md, README.md
- **技术栈**: 文档维护
- **测试状态**: 不适用
- **备注**: 任务完成后按清单勾选便于回顾
---
## [2026-02-14] - 优化计划书字段配置管理
### 新增
- planFieldValidation.js - 字段验证系统,支持必填、长度、范围、正则、自定义验证
- useFieldDependencies.js - 字段关联系统,管理显示/隐藏、启用/禁用
- planFieldValidation.test.js - 完整单元测试(40个用例)
### 修复
- 修复 ESLint 错误:使用 Number.isNaN 代替全局 isNaN
### 测试
- 单元测试全部通过(40/40)
- ESLint 检查通过
---
**详细信息**
- **影响文件**: src/utils/planFieldValidation.js, src/composables/useFieldDependencies.js
- **技术栈**: Vitest, Vue 3 Composition API
- **测试状态**: 已通过
- **备注**: 提取可复用验证逻辑,支持同步/异步验证
---
## [2026-02-14] - 表单状态常量化
### 重构
- 新增 `src/config/constants/orderStatus.js` 统一管理订单状态
- 提取 `mapOrderStatus``getStatusText``isValidStatus` 工具函数
- 重构 `usePlanView.js` 使用常量替代硬编码状态值
---
**详细信息**
- **影响文件**: src/composables/usePlanView.js, src/config/constants/orderStatus.js
- **技术栈**: Vue 3, Taro
- **测试状态**: 已通过
- **备注**: 提升代码可维护性,避免魔法数字
---
## [2026-02-14] - 人寿/重疾模板 Schema 化
### 更新
- 人寿与重疾模板改为 Schema 自动渲染与校验
- 人寿/重疾产品配置增加 form_schema 入口
- 使用文档补充人寿/重疾示例
- README 同步最新更新
---
**详细信息**
- **影响文件**: src/config/plan-templates.js, src/components/plan/PlanTemplates/LifeInsuranceTemplate.vue, src/components/plan/PlanTemplates/CriticalIllnessTemplate.vue, docs/plan/plan-form-schema-usage.md, README.md
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 待测试
- **备注**: 保障类产品字段新增仅需调整 Schema 配置
---
## [2026-02-14] - 计划书 Schema 注释与使用文档
## [2026-02-14] - 计划书表单重构
### 重构
- 重构 PlanFormContainer.vue 的 submit 函数,使用模板配置的 submit_mapping
- 新增完整的储蓄计划书模板 SavingsTemplate.vue
- 在 plan-templates.js 中添加详细的字段映射配置
### 文档
- 更新 README.md 和 CHANGELOG.md
- 新增 plan-form-schema-usage.md 使用说明文档
---
**详细信息**
- **影响文件**: src/components/plan/PlanFormContainer.vue, src/components/plan/PlanTemplates/SavingsTemplate.vue, src/config/plan-templates.js, docs/plan/plan-form-schema-usage.md, README.md
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 待测试
- **备注**: Schema 配置与提交映射均有详细说明
---
### 新增
- 补充计划书 Schema 与提交映射的详细注释与 JSDoc
- 新增计划书 Schema 使用文档,便于新增保险类型
---
**详细信息**
- **影响文件**: src/config/plan-templates.js, src/components/plan/PlanTemplates/SavingsTemplate.vue, src/components/plan/PlanFormContainer.vue, docs/plan/plan-form-schema-usage.md, README.md
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 待测试
- **备注**: Schema 配置与提交映射均有详细说明
---
## [2026-02-14] - 计划书表单 Schema 化(方案 2)
### 更新
- 储蓄类模板使用表单 Schema 自动字段渲染与校验
- 提交字段映射迁移到模板配置,统一处理金额转换
- 移除模式切换清空逻辑改为配置驱动
---
**详细信息**
- **影响文件**: src/config/plan-templates.js, src/components/plan/PlanTemplates/SavingsTemplate.vue, src/components/plan/PlanFormContainer.vue, README.md
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 待测试
- **备注**: 储蓄类产品字段新增仅需调整配置
---
## [2026-02-14] - 文档对齐与业务说明更新
### 更新
- 同步 README 的业务模块与页面清单
- 修正文档导航中的 API 集成日志入口
- 重写新人入门指南为业务与路由上手文档
- 对齐登录页路径说明与认证调试文档
- 更新前端开发计划中的当前路由与模块概览
- 对齐鉴权重构文档的登录页说明
- 记录项目开发计划与调整版为历史版本并补充当前业务说明
- README 补充路由与计划文档对齐说明
---
**详细信息**
- **影响文件**: README.md, QUICKSTART.md, docs/README.md, docs/guides/新人入门指南.md, docs/guides/认证调试指南.md, docs/plan/前端开发计划.md, docs/plan/前端开发计划-调整版.md, docs/specs/2026-02-02-auth-refactoring.md
- **技术栈**: 文档维护
- **测试状态**: 不适用
- **备注**: 与现有路由与页面模块保持一致
---
## [2026-02-14] - 提取方式字段重命名
### 更新
- 将提取方式字段从 `specified_amount_type` 统一重命名为 `withdrawal_method`
- 同步更新计划书模板与相关文档的字段描述
---
**详细信息**
- **影响文件**: src/components/plan/PlanTemplates/SavingsTemplate.vue, docs/plan/plan-entry-architecture.md, docs/lessons-learned/plan-entry-module-summary.md
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 待测试
- **备注**: 中文字段名保持为"提取方式"
---
## [2026-02-14] - 修复文件扩展名解析逻辑
### 修复
- 修复 JPEG 图片文件显示为 "DOC" 标签的问题
- 优化 `extractExtensionFromFile` 函数的 fallback 逻辑
- 移除首页、搜索页、周热门资料页的错误扩展名提取逻辑
---
**详细信息**
- **影响文件**: src/utils/documentIcons.js, src/pages/index/index.vue, src/pages/search/index.vue, src/pages/week-hot-material/index.vue
- **技术栈**: Vue 3, Taro 4, 文件处理
- **测试状态**: 待测试
- **备注**:
- 问题根源:`fileName.split('.')` 对 "IMG_6395大" 返回文件名本身而非扩展名
- 解决方案:让组件内部使用 `extractExtensionFromFile` 自动从 downloadUrl 解析扩展名
- 优先级:extension 字段 > fileName > src > downloadUrl
- 涉及页面:首页周热门资料、搜索页文件结果
---
## [2026-02-13] - 收藏页空名称处理
### 修复
- 修复收藏页数据 `name` 字段为 `null` 时显示空白的问题
- 添加默认标题"未命名文件"兜底处理
---
**详细信息**
- **影响文件**: src/pages/favorites/index.vue
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 已通过
- **备注**: 使用 `map` 方法在数据获取后立即处理,保持模板简洁
---
## [2026-02-13] - 登录权限检查与提示文案优化
### 新增
- 为首页网格导航"计划书"按钮添加登录权限检查
- 未登录用户点击时显示友好的登录提示弹窗
### 优化
- 优化默认登录权限提示文案:从"登录后即可查看完整内容"改为"登录后即可使用完整功能"
- 文案更通用,同时适用于查看型和操作型场景
- 提升文案与实际操作的匹配度
---
**详细信息**
- **影响文件**: src/config/permissions.js, src/pages/index/index.vue
- **技术栈**: Vue 3, Taro 4, Composables
- **测试状态**: 已通过
- **备注**:
- 首页网格导航使用自定义提示:"计划书功能需要登录后才能使用,是否立即登录?"
- 其他"制作计划书"按钮使用优化后的默认文案
- 修改后覆盖首页、产品中心、产品详情、搜索页的所有计划书相关操作
---
## [2026-02-13] - 文件操作反馈功能配置同步
### 修复
- 修复文件操作失败时"去反馈"按钮导致的 `showModal` 参数错误
- 导入 `features` 配置使用命名导入(修复构建警告)
- 根据 `features.feedback` 动态控制"去反馈"按钮显示
- 根据配置动态调整提示文案(移除"前往意见反馈"提示)
- 根据配置决定是否跳转反馈页面
---
**详细信息**
- **影响文件**: src/composables/useFileOperation.js
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 已通过
- **备注**: 修复了当 `feedback: false` 时文件操作失败提示出现的参数错误
---
## [2026-02-13] - 储蓄类模板提取计划逻辑修正
### 修复
- 修正储蓄类产品模板的提取计划逻辑错误
- 移除"是否生成说明"字段与"款项提取"配置的强依赖关系
- "是否希望生成一份允许减少名义金额的提取说明?"现在作为独立字段,不影响提取方案配置
- 移除错误的 watch 监听器,该监听器在选择"否"时会错误地清除所有提取计划字段
- 更新校验逻辑:`withdrawal_enabled` 字段改为可选,不再强制校验
### 文档
- 更新 `docs/plan/plan-entry-architecture.md` 架构文档
- 从"三层结构"改为"字段结构说明",明确字段1为独立字段
- 新增组件设计代码示例,移除错误的 `v-if` 条件和 watch 监听器
---
**详细信息**
- **影响文件**: src/components/plan/PlanTemplates/SavingsTemplate.vue, docs/plan/plan-entry-architecture.md
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 待测试
- **备注**: 提取方案配置现在始终显示(当配置启用时),不受"是否生成说明"字段影响
---
## [2026-02-13] - 消息详情页布局与状态优化
### 优化
- 优化计划书信息布局:长文本自动换行,避免挤压左侧标签
- 添加计划书状态颜色标识:待处理(橙)、处理中(蓝)、已生成(绿)、已查看(灰)
---
**详细信息**
- **影响文件**: src/pages/message-detail/index.vue
- **技术栈**: Vue 3, Less, Flexbox
- **测试状态**: 已通过
- **备注**: 状态样式与计划列表页保持一致
---
## [2026-02-13] - 功能开关配置
### 配置
- 添加功能开关到 `src/config/features.js`
- `contactService: false` - 隐藏帮助中心联系客服
- `feedback: false` - 隐藏我的页面意见反馈
- 帮助中心页面 (`src/pages/help-center/index.vue`):
- 导入 `features.js` 配置
- 使用 `v-if="features.contactService"` 控制联系客服显示
- 我的页面 (`src/pages/mine/index.vue`):
- 导入 `features.js` 配置
- 使用计算属性过滤菜单项
- 修改 `v-for` key 为 `item.key` 提高稳定性
### 修复
- 移除 TypeScript 类型的 JSDoc 注释(`@type {boolean}`),修复 eslint 警告
---
**详细信息**
- **影响文件**: src/config/features.js, src/pages/help-center/index.vue, src/pages/mine/index.vue
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 已通过 (npm lint + npm test)
- **备注**: 当功能开放时,只需在 features.js 中将对应开关改为 true 即可
---
## [2026-02-13] - 首页标题样式调整
### 优化
- 调整首页"臻奇荟"标题位置至左上方(顶部间距从 180rpx 减小至 128rpx)
- 优化标题对齐方式,适配整体页面布局
---
**详细信息**
- **影响文件**: src/pages/index/index.vue
- **技术栈**: Vue 3, TailwindCSS
- **测试状态**: 已通过
- **备注**: 保持原有高度占位,防止布局塌陷
---
## [2026-02-13] - 统一权限检查与移除重复代码
### 新增
- ListItemActions 组件集成权限检查逻辑
### 优化
- 移除 material-list 页面中重复的 usePermission 调用
- 权限检查完全由 ListItemActions 组件内部处理
- 添加 ListItemActions 组件 README 文档
---
**详细信息**
- **影响文件**: src/pages/material-list/index.vue, src/components/list/ListItemActions/index.vue, src/components/list/ListItemActions/README.md
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 已通过
- **备注**: 组件自包含业务逻辑模式,父组件无需重复权限检查
---
## [2026-02-13] - 搜索页登录提示优化
### 优化
- 搜索页使用自定义登录提示术语"搜索功能需要登录后才能使用"
- 支持通过 customOptions 参数覆盖默认权限提示内容
---
**详细信息**
- **影响文件**: src/pages/search/index.vue
- **技术栈**: Vue 3, Taro 4
- **测试状态**: 已通过
- **备注**: getPermissionConfig 支持自定义内容覆盖
---
## [2026-02-13] - 资料查看权限与搜索页测试对齐
### 新增
- 统一动作级权限映射,支持页面查看权限扩展
- 资料查看入口增加登录权限校验与回调路径记录
### 优化
- 搜索页测试对齐当前实现并补充接口 Mock
---
**详细信息**
- **影响文件**: src/composables/usePermission.js, src/config/permissions.js, src/components/cards/MaterialCard.vue, src/pages/material-list/index.vue, src/pages/search/index.test.js, vitest.config.js, package.json
- **技术栈**: Vue 3, Taro 4, Pinia, Vitest
- **测试状态**: 已通过(npm test)
- **备注**: lint 存在历史 warning 未处理
---
## [2026-02-13] - 我的页面消息红点显示
### 新增
- 我的页面消息菜单项添加未读红点显示
- 新增 `showMessageBadge` 计算属性,从 `userStore.unreadMsgCount` 读取未读状态
- 添加 `.menu-badge` 样式,与 TabBar 红点保持一致
### 优化
- 为菜单项添加 `key` 属性,便于识别特定菜单项
- 红点逻辑与 TabBar 完全一致,确保同步显示
---
**详细信息**
- **影响文件**: src/pages/mine/index.vue
- **技术栈**: Vue 3, Pinia
- **测试状态**: 已通过
- **备注**: 红点在 `unreadMsgCount > 0` 时显示
---
## [2026-02-12] - 优化反馈列表和消息页面图片加载
### 新增
- 新增 `optimizeImageUrl` 工具函数,自动为 CDN 图片添加缩略图优化参数
- 支持自定义缩略图宽度和图片质量
- 只处理 `cdn.ipadbiz.cn` 的图片
- 非 CDN 图片保持原样返回
### 优化
- **反馈列表图片优化**:列表中使用 200px 缩略图(质量70),点击预览时才加载原图
- 显著减少列表加载时的带宽消耗
- 提升列表滚动性能
- **消息详情页优化**:优化布局和样式
- 调整背景色为浅灰色 `bg-gray-50`
- 增加卡片式布局,添加圆角和阴影
- 优化标题、时间、内容的视觉层级
- 调整字号和行高提升阅读体验
- **消息列表优化**:重构卡片布局,提升信息可读性
- 第一行:标题(或内容预览)+ 未读红点
- 添加状态标签(未读/已读)
- 第二行:内容预览(截取前 60 字)
- 右侧:时间 + 时钟图标
---
**详细信息**
- **影响文件**: src/utils/tools.js, src/pages/feedback-list/index.vue, src/pages/message-detail/index.vue, src/pages/message/index.vue
- **技术栈**: Vue 3, Taro, CDN 图片优化
- **测试状态**: 已通过
- **备注**: 性能收益 - 列表加载节省 ~99% 图片流量
---
> 本文档记录 Manulife WeApp 项目的所有重要变更。
## [2026-02-13] - 添加文档解析工具临时文件到 gitignore
### 配置
- 忽略 `docs/parse-backup/` 备份目录
- 忽略 `docs/to-parse/*.md` 待处理文档
- 保留 `docs/to-parse/README.md` 说明文件
---
**详细信息**
- **影响文件**: .gitignore
- **技术栈**: Git
- **测试状态**: N/A
- **备注**: 避免将临时文档和备份文件提交到版本控制
- 待审核文件按原始文档名分目录生成,避免 pending 混乱
- 更新审核文件位置说明(docs/to-parse/README.md 与 README.md)
......
# 产品配置审核 - 计划书模版2.docx
**解析时间**: 2026/2/14 23:58:54
**原始文件**: 计划书模版2.docx
**数据来源**: docs/to-parse/计划书模版2.docx
---
## 📋 产品基本信息
| 字段 | 提取值 | 需要确认 |
|------|--------|---------|
| 产品名称 | 计划书模版2 | ✅ 请核对产品名称 |
| 产品类型 | savings | ✅ 请确认产品类型 |
| 币种 | USD | ✅ 请确认币种 |
| form_sn | `savings-2-55bcffc2` | ✅ 请确认 form_sn 唯一性 |
| 缴费年期 | ["整付"] | ✅ 请确认缴费年期选项 |
| 年龄范围 | 0-75岁 | ✅ 请确认年龄范围 |
| 保险期间 | 终身 | ✅ 请确认保险期间 |
### 💰 储蓄类产品特有字段
| 字段 | 提取值 | 需要确认 |
|------|--------|---------|
| 提取方式 | ["指定提取金额","最高固定提取金额"] | ✅ 请确认提取方式 |
| 提取期 | ["1年","3年","5年","10年"] | ✅ 请确认提取期选项 |
---
## 🤖 智能字段提取报告
### 匹配统计
- ✅ 成功匹配: 3 字段
- ⚠️ 使用默认值: 4 字段
- ❌ 未匹配(需人工补充): 1 字段
### ✅ 已成功匹配的字段
- product_type
- payment_periods
- withdrawal_modes
### ⚠️ 使用默认值的字段
- **currency**: 未找到字段 "currency",使用默认值: "USD"
- **age_range**: 未找到字段 "age_range",使用默认值: {"min":0,"max":75}
- **insurance_period**: 未找到字段 "insurance_period",使用默认值: "终身"
- **product_name**: 未找到产品名称,使用文件名: "计划书模版2"
### ❌ 未匹配字段(需要人工补充)
#### product_name
- **原因**: 未找到匹配内容
- **建议值**:
- 从文档标题提取
- 从第一行提取
- 手动输入产品全称
---
## 🧾 配置预览
```javascript
{
"product_name": "计划书模版2",
"product_type": "savings",
"currency": "USD",
"form_sn": "savings-2-55bcffc2",
"payment_periods": [
"整付"
],
"age_range": {
"min": 0,
"max": 75
},
"insurance_period": "终身",
"is_savings": true,
"withdrawal_modes": [
"指定提取金额",
"最高固定提取金额"
],
"withdrawal_periods": [
"1年",
"3年",
"5年",
"10年"
]
}
```
---
## 📝 表单字段 (form_schema)
```javascript
{
"base_fields": [],
"withdrawal_fields": [],
"reset_map": {}
}
```
---
## 🔄 提交字段映射 (submit_mapping)
```javascript
{}
```
---
## 🧩 生成配置片段
```javascript
/**
* 计划书模版2
* @added 2026-02-14T15:58:54.707Z
* @source docs/to-parse/计划书模版2.docx
*/
'savings-2-55bcffc2': {
name: '计划书模版2',
component: 'SavingsTemplate',
category: 'savings',
config: {
currency: 'USD',
payment_periods: ["整付"],
age_range: { min: 0, max: 75 },
insurance_period: '终身',
withdrawal_plan: {
enabled: true,
currencies: ['HKD', 'USD', 'CNY'],
default_currency: 'USD',
withdrawal_modes: ["指定提取金额","最高固定提取金额"],
withdrawal_periods: ["1年","3年","5年","10年"]
},
form_schema: savingsFormSchema,
submit_mapping: savingsSubmitMapping
}
}
```
---
## ✅ 审核检查清单
### 基础信息
- [ ] 产品名称正确
- [ ] 产品类型正确(savings/critical-illness/life-insurance)
- [ ] 币种正确(USD/CNY/HKD/EUR)
- [ ] form_sn 唯一且符合命名规范
### 缴费与年龄
- [ ] 缴费年期选项完整且正确
- [ ] 年龄范围合理
- [ ] 保险期间正确
### 储蓄类特有(如适用)
- [ ] 提取方式正确
- [ ] 提取期选项完整
- [ ] 表单字段定义完整
- [ ] 提交字段映射正确
---
## 📋 审核后操作
### 确认无误
```bash
# 1. 移动到 approved 目录
mv docs/parse-audit/pending/2026-02-14-计划书模版2.md \
docs/parse-audit/approved/
# 2. 合并到正式配置
# 手动复制或使用工具合并到 src/config/plan-templates.js
# 3. 删除待审核文件(可选)
rm docs/parse-audit/pending/2026-02-14-计划书模版2.md
```
### 需要修改
1. 编辑本文件修正内容
2. 重新提交审核
### 放弃本次解析
```bash
rm docs/parse-audit/pending/2026-02-14-计划书模版2.md
```
---
## 审核状态
- [ ] 待审核
- [ ] 已通过
- [ ] 已拒绝
## 审核意见
```text
```
# 产品配置审核 - 计划书模版3.docx
**解析时间**: 2026/2/14 23:58:54
**原始文件**: 计划书模版3.docx
**数据来源**: docs/to-parse/计划书模版3.docx
---
## 📋 产品基本信息
| 字段 | 提取值 | 需要确认 |
| -------- | ---------------------- | ------------------------ |
| 产品名称 | 计划书模版3 | ✅ 请核对产品名称 |
| 产品类型 | savings | ✅ 请确认产品类型 |
| 币种 | USD | ✅ 请确认币种 |
| form_sn | `savings-3-8f4f27ad` | ✅ 请确认 form_sn 唯一性 |
| 缴费年期 | ["5年"] | ✅ 请确认缴费年期选项 |
| 年龄范围 | 0-75岁 | ✅ 请确认年龄范围 |
| 保险期间 | 终身 | ✅ 请确认保险期间 |
### 💰 储蓄类产品特有字段
| 字段 | 提取值 | 需要确认 |
| -------- | ------------------------------- | ------------------- |
| 提取方式 | ["年龄指定金额","最高固定金额"] | ✅ 请确认提取方式 |
| 提取期 | ["1年","3年","5年","10年"] | ✅ 请确认提取期选项 |
---
## 🤖 智能字段提取报告
### 匹配统计
- ✅ 成功匹配: 1 字段
- ⚠️ 使用默认值: 5 字段
- ❌ 未匹配(需人工补充): 1 字段
### ✅ 已成功匹配的字段
- payment_periods
### ⚠️ 使用默认值的字段
- **product_type**: 未找到字段 "product_type",使用默认值: "savings"
- **currency**: 未找到字段 "currency",使用默认值: "USD"
- **age_range**: 未找到字段 "age_range",使用默认值: {"min":0,"max":75}
- **insurance_period**: 未找到字段 "insurance_period",使用默认值: "终身"
- **product_name**: 未找到产品名称,使用文件名: "计划书模版3"
### ❌ 未匹配字段(需要人工补充)
#### product_name
- **原因**: 未找到匹配内容
- **建议值**:
- 从文档标题提取
- 从第一行提取
- 手动输入产品全称
---
## 🧾 配置预览
```javascript
{
"product_name": "计划书模版3",
"product_type": "savings",
"currency": "USD",
"form_sn": "savings-3-8f4f27ad",
"payment_periods": [
"5年"
],
"age_range": {
"min": 0,
"max": 75
},
"insurance_period": "终身",
"is_savings": true,
"withdrawal_modes": [
"年龄指定金额",
"最高固定金额"
],
"withdrawal_periods": [
"1年",
"3年",
"5年",
"10年"
]
}
```
---
## 📝 表单字段 (form_schema)
```javascript
{
"base_fields": [],
"withdrawal_fields": [],
"reset_map": {}
}
```
---
## 🔄 提交字段映射 (submit_mapping)
```javascript
{}
```
---
## 🧩 生成配置片段
```javascript
/**
* 计划书模版3
* @added 2026-02-14T15:58:54.729Z
* @source docs/to-parse/计划书模版3.docx
*/
'savings-3-8f4f27ad': {
name: '计划书模版3',
component: 'SavingsTemplate',
category: 'savings',
config: {
currency: 'USD',
payment_periods: ["5年"],
age_range: { min: 0, max: 75 },
insurance_period: '终身',
withdrawal_plan: {
enabled: true,
currencies: ['HKD', 'USD', 'CNY'],
default_currency: 'USD',
withdrawal_modes: ["年龄指定金额","最高固定金额"],
withdrawal_periods: ["1年","3年","5年","10年"]
},
form_schema: savingsFormSchema,
submit_mapping: savingsSubmitMapping
}
}
```
---
## ✅ 审核检查清单
### 基础信息
- [ ] 产品名称正确
- [ ] 产品类型正确(savings/critical-illness/life-insurance)
- [ ] 币种正确(USD/CNY/HKD/EUR)
- [ ] form_sn 唯一且符合命名规范
### 缴费与年龄
- [ ] 缴费年期选项完整且正确
- [ ] 年龄范围合理
- [ ] 保险期间正确
### 储蓄类特有(如适用)
- [ ] 提取方式正确
- [ ] 提取期选项完整
- [ ] 表单字段定义完整
- [ ] 提交字段映射正确
---
## 📋 审核后操作
### 确认无误
```bash
# 1. 移动到 approved 目录
mv docs/parse-audit/pending/2026-02-14-计划书模版3.md \
docs/parse-audit/approved/
# 2. 合并到正式配置
# 手动复制或使用工具合并到 src/config/plan-templates.js
# 3. 删除待审核文件(可选)
rm docs/parse-audit/pending/2026-02-14-计划书模版3.md
```
### 需要修改
1. 编辑本文件修正内容
2. 重新提交审核
### 放弃本次解析
```bash
rm docs/parse-audit/pending/2026-02-14-计划书模版3.md
```
---
## 审核状态
- [ ] 待审核
- [ ] 已通过
- [ ] 已拒绝
## 审核意见
```text
```
# 产品配置审核 - 计划书模版2.docx
**解析时间**: 2026/2/15 00:41:27
**解析时间**: 2026/2/15 10:20:30
**原始文件**: 计划书模版2.docx
**数据来源**: docs/to-parse/计划书模版2.docx
......@@ -116,7 +116,7 @@
```javascript
/**
* 宏摯傳承保障計劃 - 性別, 年齡, 出生年月日
* @added 2026-02-14T16:41:27.878Z
* @added 2026-02-15T02:20:30.982Z
* @source docs/to-parse/计划书模版2.docx
*/
'savings-product-ef3dd50b': {
......@@ -169,14 +169,14 @@
### 确认无误
```bash
# 1. 移动到 approved 目录
mv docs/parse-audit/pending/2026-02-14-计划书模版2-宏摯傳承保障計劃-性別-年齡-出生年月日.md \
mv docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-宏摯傳承保障計劃-性別-年齡-出生年月日.md \
docs/parse-audit/approved/
# 2. 合并到正式配置
# 手动复制或使用工具合并到 src/config/plan-templates.js
# 3. 删除待审核文件(可选)
rm docs/parse-audit/pending/2026-02-14-计划书模版2-宏摯傳承保障計劃-性別-年齡-出生年月日.md
rm docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-宏摯傳承保障計劃-性別-年齡-出生年月日.md
```
### 需要修改
......@@ -185,7 +185,7 @@ rm docs/parse-audit/pending/2026-02-14-计划书模版2-宏摯傳承保障計劃
### 放弃本次解析
```bash
rm docs/parse-audit/pending/2026-02-14-计划书模版2-宏摯傳承保障計劃-性別-年齡-出生年月日.md
rm docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-宏摯傳承保障計劃-性別-年齡-出生年月日.md
```
---
......
# 产品配置审核 - 计划书模版2.docx
**解析时间**: 2026/2/15 00:41:27
**解析时间**: 2026/2/15 10:20:30
**原始文件**: 计划书模版2.docx
**数据来源**: docs/to-parse/计划书模版2.docx
......@@ -114,7 +114,7 @@
```javascript
/**
* 宏摯家傳承保險計劃- 性別, 年齡, 出生年月日
* @added 2026-02-14T16:41:27.893Z
* @added 2026-02-15T02:20:30.997Z
* @source docs/to-parse/计划书模版2.docx
*/
'savings-product-aaaa60f8': {
......@@ -167,14 +167,14 @@
### 确认无误
```bash
# 1. 移动到 approved 目录
mv docs/parse-audit/pending/2026-02-14-计划书模版2-宏摯家傳承保險計劃-性別-年齡-出生年月日.md \
mv docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-宏摯家傳承保險計劃-性別-年齡-出生年月日.md \
docs/parse-audit/approved/
# 2. 合并到正式配置
# 手动复制或使用工具合并到 src/config/plan-templates.js
# 3. 删除待审核文件(可选)
rm docs/parse-audit/pending/2026-02-14-计划书模版2-宏摯家傳承保險計劃-性別-年齡-出生年月日.md
rm docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-宏摯家傳承保險計劃-性別-年齡-出生年月日.md
```
### 需要修改
......@@ -183,7 +183,7 @@ rm docs/parse-audit/pending/2026-02-14-计划书模版2-宏摯家傳承保險計
### 放弃本次解析
```bash
rm docs/parse-audit/pending/2026-02-14-计划书模版2-宏摯家傳承保險計劃-性別-年齡-出生年月日.md
rm docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-宏摯家傳承保險計劃-性別-年齡-出生年月日.md
```
---
......
# 产品配置审核 - 计划书模版2.docx
**解析时间**: 2026/2/15 00:41:27
**解析时间**: 2026/2/15 10:20:30
**原始文件**: 计划书模版2.docx
**数据来源**: docs/to-parse/计划书模版2.docx
......@@ -114,7 +114,7 @@
```javascript
/**
* 宏浚傳承保障計劃
* @added 2026-02-14T16:41:27.893Z
* @added 2026-02-15T02:20:30.997Z
* @source docs/to-parse/计划书模版2.docx
*/
'savings-product-d1581522': {
......@@ -167,14 +167,14 @@
### 确认无误
```bash
# 1. 移动到 approved 目录
mv docs/parse-audit/pending/2026-02-14-计划书模版2-宏浚傳承保障計劃.md \
mv docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-宏浚傳承保障計劃.md \
docs/parse-audit/approved/
# 2. 合并到正式配置
# 手动复制或使用工具合并到 src/config/plan-templates.js
# 3. 删除待审核文件(可选)
rm docs/parse-audit/pending/2026-02-14-计划书模版2-宏浚傳承保障計劃.md
rm docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-宏浚傳承保障計劃.md
```
### 需要修改
......@@ -183,7 +183,7 @@ rm docs/parse-audit/pending/2026-02-14-计划书模版2-宏浚傳承保障計劃
### 放弃本次解析
```bash
rm docs/parse-audit/pending/2026-02-14-计划书模版2-宏浚傳承保障計劃.md
rm docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-宏浚傳承保障計劃.md
```
---
......
# 产品配置审核 - 计划书模版2.docx
**解析时间**: 2026/2/15 00:41:27
**解析时间**: 2026/2/15 10:20:30
**原始文件**: 计划书模版2.docx
**数据来源**: docs/to-parse/计划书模版2.docx
......@@ -115,7 +115,7 @@
```javascript
/**
* 赤霞珠終身壽險計劃2基本人壽保障選項
* @added 2026-02-14T16:41:27.893Z
* @added 2026-02-15T02:20:30.997Z
* @source docs/to-parse/计划书模版2.docx
*/
'savings-2-031c1237': {
......@@ -168,14 +168,14 @@
### 确认无误
```bash
# 1. 移动到 approved 目录
mv docs/parse-audit/pending/2026-02-14-计划书模版2-赤霞珠終身壽險計劃2基本人壽保障選項.md \
mv docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-赤霞珠終身壽險計劃2基本人壽保障選項.md \
docs/parse-audit/approved/
# 2. 合并到正式配置
# 手动复制或使用工具合并到 src/config/plan-templates.js
# 3. 删除待审核文件(可选)
rm docs/parse-audit/pending/2026-02-14-计划书模版2-赤霞珠終身壽險計劃2基本人壽保障選項.md
rm docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-赤霞珠終身壽險計劃2基本人壽保障選項.md
```
### 需要修改
......@@ -184,7 +184,7 @@ rm docs/parse-audit/pending/2026-02-14-计划书模版2-赤霞珠終身壽險計
### 放弃本次解析
```bash
rm docs/parse-audit/pending/2026-02-14-计划书模版2-赤霞珠終身壽險計劃2基本人壽保障選項.md
rm docs/parse-audit/pending/计划书模版2/2026-02-15-计划书模版2-赤霞珠終身壽險計劃2基本人壽保障選項.md
```
---
......
......@@ -24,3 +24,6 @@
{"at":"2026-02-14T16:39:56.947Z","mode":"single","options":{"dry_run":true},"summary":{"total_docs":1,"total_products":4,"success":4,"failed":0,"duration_ms":46,"success_list":[{"form_sn":"savings-product-ef3dd50b","product_name":"宏摯傳承保障計劃 - 性別, 年齡, 出生年月日","file":"计划书模版2.docx"},{"form_sn":"savings-product-aaaa60f8","product_name":"宏摯家傳承保險計劃- 性別, 年齡, 出生年月日","file":"计划书模版2.docx"},{"form_sn":"savings-product-d1581522","product_name":"宏浚傳承保障計劃","file":"计划书模版2.docx"},{"form_sn":"savings-2-031c1237","product_name":"赤霞珠終身壽險計劃2基本人壽保障選項","file":"计划书模版2.docx"}],"failed_list":[]},"change_summary":{"ok":false,"dry_run":false,"updated_count":0,"form_sn_list":[],"conflicts":[],"reason":"insert_not_found"}}
{"at":"2026-02-14T16:41:18.047Z","mode":"single","options":{"dry_run":true},"summary":{"total_docs":1,"total_products":4,"success":4,"failed":0,"duration_ms":46,"success_list":[{"form_sn":"savings-product-ef3dd50b","product_name":"宏摯傳承保障計劃 - 性別, 年齡, 出生年月日","file":"计划书模版2.docx"},{"form_sn":"savings-product-aaaa60f8","product_name":"宏摯家傳承保險計劃- 性別, 年齡, 出生年月日","file":"计划书模版2.docx"},{"form_sn":"savings-product-d1581522","product_name":"宏浚傳承保障計劃","file":"计划书模版2.docx"},{"form_sn":"savings-2-031c1237","product_name":"赤霞珠終身壽險計劃2基本人壽保障選項","file":"计划书模版2.docx"}],"failed_list":[]},"change_summary":{"ok":true,"dry_run":true,"updated_count":4,"form_sn_list":["savings-product-ef3dd50b","savings-product-aaaa60f8","savings-product-d1581522","savings-2-031c1237"],"conflicts":[],"reason":null,"diff_preview":"--- plan-templates.js\n+++ plan-templates.js\n+ /**\n+ * 宏摯傳承保障計劃 - 性別, 年齡, 出生年月日\n+ * @added 2026-02-14T16:41:18.029Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-ef3dd50b': {\n+ name: '宏摯傳承保障計劃 - 性別, 年齡, 出生年月日',\n+ component: 'SavingsTemplate',\n+ category: 'savings',\n+ config: {\n+ currency: 'USD',\n+ payment_periods: [\"整付\",\"3年\",\"5年\",\"10年\",\"15年\"],\n+ age_range: { min: 0, max: 75 },\n+ insurance_period: '终身',\n+ withdrawal_plan: {\n+ enabled: true,\n+ currencies: ['HKD', 'USD', 'CNY'],\n+ default_currency: 'USD',\n+ withdrawal_modes: [\"最高固定提取金额\"],\n+ withdrawal_periods: [\"1年\",\"3年\",\"5年\",\"10年\"]\n+ },\n+ form_schema: savingsFormSchema,\n+ submit_mapping: savingsSubmitMapping\n+ }\n+ },\n+ \n+ /**\n+ * 宏摯家傳承保險計劃- 性別, 年齡, 出生年月日\n+ * @added 2026-02-14T16:41:18.044Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-aaaa60f8': {\n+ name: '宏摯家傳承保險計劃- 性別, 年齡, 出生年月日',\n+ component: 'SavingsTemplate',\n+ category: 'savings',\n+ config: {\n+ currency: 'USD',\n+ payment_periods: [\"整付\",\"3年\",\"5年\"],\n+ age_range: { min: 0, max: 75 },\n+ insurance_period: '终身',\n+ withdrawal_plan: {\n+ enabled: true,\n+ currencies: ['HKD', 'USD', 'CNY'],\n+ default_currency: 'USD',\n+ withdrawal_modes: [\"年龄指定金额\",\"最高固定金额\"],\n+ withdrawal_periods: [\"1年\",\"3年\",\"5年\",\"10年\"]\n+ },\n+ form_schema: savingsFormSchema,\n+ submit_mapping: savingsSubmitMapping\n+ }\n+ },\n+ \n+ /**\n+ * 宏浚傳承保障計劃\n+ * @added 2026-02-14T16:41:18.044Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-d1581522': {"}}
{"at":"2026-02-14T16:41:27.896Z","mode":"single","options":{"dry_run":true},"summary":{"total_docs":1,"total_products":4,"success":4,"failed":0,"duration_ms":47,"success_list":[{"form_sn":"savings-product-ef3dd50b","product_name":"宏摯傳承保障計劃 - 性別, 年齡, 出生年月日","file":"计划书模版2.docx"},{"form_sn":"savings-product-aaaa60f8","product_name":"宏摯家傳承保險計劃- 性別, 年齡, 出生年月日","file":"计划书模版2.docx"},{"form_sn":"savings-product-d1581522","product_name":"宏浚傳承保障計劃","file":"计划书模版2.docx"},{"form_sn":"savings-2-031c1237","product_name":"赤霞珠終身壽險計劃2基本人壽保障選項","file":"计划书模版2.docx"}],"failed_list":[]},"change_summary":{"ok":true,"dry_run":true,"updated_count":4,"form_sn_list":["savings-product-ef3dd50b","savings-product-aaaa60f8","savings-product-d1581522","savings-2-031c1237"],"conflicts":[],"reason":null,"diff_preview":"--- plan-templates.js\n+++ plan-templates.js\n+ /**\n+ * 宏摯傳承保障計劃 - 性別, 年齡, 出生年月日\n+ * @added 2026-02-14T16:41:27.878Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-ef3dd50b': {\n+ name: '宏摯傳承保障計劃 - 性別, 年齡, 出生年月日',\n+ component: 'SavingsTemplate',\n+ category: 'savings',\n+ config: {\n+ currency: 'USD',\n+ payment_periods: [\"整付\",\"3年\",\"5年\",\"10年\",\"15年\"],\n+ age_range: { min: 0, max: 75 },\n+ insurance_period: '终身',\n+ withdrawal_plan: {\n+ enabled: true,\n+ currencies: ['HKD', 'USD', 'CNY'],\n+ default_currency: 'USD',\n+ withdrawal_modes: [\"最高固定提取金额\"],\n+ withdrawal_periods: [\"1年\",\"3年\",\"5年\",\"10年\"]\n+ },\n+ form_schema: savingsFormSchema,\n+ submit_mapping: savingsSubmitMapping\n+ }\n+ },\n+ \n+ /**\n+ * 宏摯家傳承保險計劃- 性別, 年齡, 出生年月日\n+ * @added 2026-02-14T16:41:27.893Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-aaaa60f8': {\n+ name: '宏摯家傳承保險計劃- 性別, 年齡, 出生年月日',\n+ component: 'SavingsTemplate',\n+ category: 'savings',\n+ config: {\n+ currency: 'USD',\n+ payment_periods: [\"整付\",\"3年\",\"5年\"],\n+ age_range: { min: 0, max: 75 },\n+ insurance_period: '终身',\n+ withdrawal_plan: {\n+ enabled: true,\n+ currencies: ['HKD', 'USD', 'CNY'],\n+ default_currency: 'USD',\n+ withdrawal_modes: [\"年龄指定金额\",\"最高固定金额\"],\n+ withdrawal_periods: [\"1年\",\"3年\",\"5年\",\"10年\"]\n+ },\n+ form_schema: savingsFormSchema,\n+ submit_mapping: savingsSubmitMapping\n+ }\n+ },\n+ \n+ /**\n+ * 宏浚傳承保障計劃\n+ * @added 2026-02-14T16:41:27.893Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-d1581522': {"}}
{"at":"2026-02-15T02:10:06.819Z","mode":"batch","options":{"dry_run":true},"summary":{"total_docs":2,"total_products":5,"success":5,"failed":0,"duration_ms":73,"success_list":[{"form_sn":"savings-product-ef3dd50b","product_name":"宏摯傳承保障計劃 - 性別, 年齡, 出生年月日","file":"计划书模版2.docx"},{"form_sn":"savings-product-aaaa60f8","product_name":"宏摯家傳承保險計劃- 性別, 年齡, 出生年月日","file":"计划书模版2.docx"},{"form_sn":"savings-product-d1581522","product_name":"宏浚傳承保障計劃","file":"计划书模版2.docx"},{"form_sn":"savings-2-031c1237","product_name":"赤霞珠終身壽險計劃2基本人壽保障選項","file":"计划书模版2.docx"},{"form_sn":"savings-3-8f4f27ad","product_name":"计划书模版3","file":"计划书模版3.docx"}],"failed_list":[],"total":5},"change_summary":{"ok":true,"dry_run":true,"updated_count":5,"form_sn_list":["savings-product-ef3dd50b","savings-product-aaaa60f8","savings-product-d1581522","savings-2-031c1237","savings-3-8f4f27ad"],"conflicts":[],"reason":null,"diff_preview":"--- plan-templates.js\n+++ plan-templates.js\n+ /**\n+ * 宏摯傳承保障計劃 - 性別, 年齡, 出生年月日\n+ * @added 2026-02-15T02:10:06.768Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-ef3dd50b': {\n+ name: '宏摯傳承保障計劃 - 性別, 年齡, 出生年月日',\n+ component: 'SavingsTemplate',\n+ category: 'savings',\n+ config: {\n+ currency: 'USD',\n+ payment_periods: [\"整付\",\"3年\",\"5年\",\"10年\",\"15年\"],\n+ age_range: { min: 0, max: 75 },\n+ insurance_period: '终身',\n+ withdrawal_plan: {\n+ enabled: true,\n+ currencies: ['HKD', 'USD', 'CNY'],\n+ default_currency: 'USD',\n+ withdrawal_modes: [\"最高固定提取金额\"],\n+ withdrawal_periods: [\"1年\",\"3年\",\"5年\",\"10年\"]\n+ },\n+ form_schema: savingsFormSchema,\n+ submit_mapping: savingsSubmitMapping\n+ }\n+ },\n+ \n+ /**\n+ * 宏摯家傳承保險計劃- 性別, 年齡, 出生年月日\n+ * @added 2026-02-15T02:10:06.803Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-aaaa60f8': {\n+ name: '宏摯家傳承保險計劃- 性別, 年齡, 出生年月日',\n+ component: 'SavingsTemplate',\n+ category: 'savings',\n+ config: {\n+ currency: 'USD',\n+ payment_periods: [\"整付\",\"3年\",\"5年\"],\n+ age_range: { min: 0, max: 75 },\n+ insurance_period: '终身',\n+ withdrawal_plan: {\n+ enabled: true,\n+ currencies: ['HKD', 'USD', 'CNY'],\n+ default_currency: 'USD',\n+ withdrawal_modes: [\"年龄指定金额\",\"最高固定金额\"],\n+ withdrawal_periods: [\"1年\",\"3年\",\"5年\",\"10年\"]\n+ },\n+ form_schema: savingsFormSchema,\n+ submit_mapping: savingsSubmitMapping\n+ }\n+ },\n+ \n+ /**\n+ * 宏浚傳承保障計劃\n+ * @added 2026-02-15T02:10:06.803Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-d1581522': {"}}
{"at":"2026-02-15T02:19:44.455Z","mode":"batch","options":{"dry_run":true},"summary":{"total_docs":1,"total_products":1,"success":1,"failed":0,"duration_ms":39,"success_list":[{"form_sn":"savings-3-8f4f27ad","product_name":"计划书模版3","file":"计划书模版3.docx"}],"failed_list":[],"total":1},"change_summary":{"ok":true,"dry_run":true,"updated_count":1,"form_sn_list":["savings-3-8f4f27ad"],"conflicts":[],"reason":null,"diff_preview":"--- plan-templates.js\n+++ plan-templates.js\n+ /**\n+ * 计划书模版3\n+ * @added 2026-02-15T02:19:44.438Z\n+ * @source docs/to-parse/计划书模版3.docx\n+ */\n+ 'savings-3-8f4f27ad': {\n+ name: '计划书模版3',\n+ component: 'SavingsTemplate',\n+ category: 'savings',\n+ config: {\n+ currency: 'USD',\n+ payment_periods: [\"5年\",\"8年\",\"12年\",\"15年\"],\n+ age_range: { min: 0, max: 75 },\n+ insurance_period: '终身',\n+ withdrawal_plan: {\n+ enabled: true,\n+ currencies: ['HKD', 'USD', 'CNY'],\n+ default_currency: 'USD',\n+ withdrawal_modes: [\"年龄指定金额\",\"最高固定金额\"],\n+ withdrawal_periods: [\"1年\",\"3年\",\"5年\",\"10年\"]\n+ },\n+ form_schema: savingsFormSchema,\n+ submit_mapping: savingsSubmitMapping\n+ }\n+ }"}}
{"at":"2026-02-15T02:20:31.001Z","mode":"batch","options":{"dry_run":true},"summary":{"total_docs":1,"total_products":4,"success":4,"failed":0,"duration_ms":47,"success_list":[{"form_sn":"savings-product-ef3dd50b","product_name":"宏摯傳承保障計劃 - 性別, 年齡, 出生年月日","file":"计划书模版2.docx"},{"form_sn":"savings-product-aaaa60f8","product_name":"宏摯家傳承保險計劃- 性別, 年齡, 出生年月日","file":"计划书模版2.docx"},{"form_sn":"savings-product-d1581522","product_name":"宏浚傳承保障計劃","file":"计划书模版2.docx"},{"form_sn":"savings-2-031c1237","product_name":"赤霞珠終身壽險計劃2基本人壽保障選項","file":"计划书模版2.docx"}],"failed_list":[],"total":4},"change_summary":{"ok":true,"dry_run":true,"updated_count":4,"form_sn_list":["savings-product-ef3dd50b","savings-product-aaaa60f8","savings-product-d1581522","savings-2-031c1237"],"conflicts":[],"reason":null,"diff_preview":"--- plan-templates.js\n+++ plan-templates.js\n+ /**\n+ * 宏摯傳承保障計劃 - 性別, 年齡, 出生年月日\n+ * @added 2026-02-15T02:20:30.982Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-ef3dd50b': {\n+ name: '宏摯傳承保障計劃 - 性別, 年齡, 出生年月日',\n+ component: 'SavingsTemplate',\n+ category: 'savings',\n+ config: {\n+ currency: 'USD',\n+ payment_periods: [\"整付\",\"3年\",\"5年\",\"10年\",\"15年\"],\n+ age_range: { min: 0, max: 75 },\n+ insurance_period: '终身',\n+ withdrawal_plan: {\n+ enabled: true,\n+ currencies: ['HKD', 'USD', 'CNY'],\n+ default_currency: 'USD',\n+ withdrawal_modes: [\"最高固定提取金额\"],\n+ withdrawal_periods: [\"1年\",\"3年\",\"5年\",\"10年\"]\n+ },\n+ form_schema: savingsFormSchema,\n+ submit_mapping: savingsSubmitMapping\n+ }\n+ },\n+ \n+ /**\n+ * 宏摯家傳承保險計劃- 性別, 年齡, 出生年月日\n+ * @added 2026-02-15T02:20:30.997Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-aaaa60f8': {\n+ name: '宏摯家傳承保險計劃- 性別, 年齡, 出生年月日',\n+ component: 'SavingsTemplate',\n+ category: 'savings',\n+ config: {\n+ currency: 'USD',\n+ payment_periods: [\"整付\",\"3年\",\"5年\"],\n+ age_range: { min: 0, max: 75 },\n+ insurance_period: '终身',\n+ withdrawal_plan: {\n+ enabled: true,\n+ currencies: ['HKD', 'USD', 'CNY'],\n+ default_currency: 'USD',\n+ withdrawal_modes: [\"年龄指定金额\",\"最高固定金额\"],\n+ withdrawal_periods: [\"1年\",\"3年\",\"5年\",\"10年\"]\n+ },\n+ form_schema: savingsFormSchema,\n+ submit_mapping: savingsSubmitMapping\n+ }\n+ },\n+ \n+ /**\n+ * 宏浚傳承保障計劃\n+ * @added 2026-02-15T02:20:30.997Z\n+ * @source docs/to-parse/计划书模版2.docx\n+ */\n+ 'savings-product-d1581522': {"}}
......
......@@ -34,10 +34,16 @@ pnpm run parse:docs:file -- --file="产品说明书.pdf" --write-config
### 3. 查看结果
解析成功后会生成待审核文件,位置如下:
解析成功后会生成待审核文件,位置如下(按原始文档名分目录)
```
docs/parse-audit/pending/
docs/parse-audit/pending/<原始文档名>/
```
解析成功后原始文档会自动归档到:
```
docs/to-parse/archived/YYYY-MM-DD/
```
审核通过后再手动合并到 `src/config/plan-templates.js`,或使用 `--write-config` 明确写入。
......@@ -103,3 +109,4 @@ docs/parsed-backup/parse-audit.jsonl
1. **文档命名**:建议使用有意义的文件名,方便识别产品
2. **手动审核**:生成后请检查配置是否正确
3. **版本控制**:生成的配置会自动备份
4. **二次解析**:需要重新解析时,将归档文件移回 `docs/to-parse/`
......
# 文档解析工具使用指南
## 功能概述
文档解析工具用于将保险产品文档(PDF、DOCX)自动解析为计划书配置,支持智能识别产品类型、币种、缴费年期等信息。
## 快速开始
### 1. 查看待处理文档
```bash
npm run parse:docs:list
```
### 2. 查看配置状态
```bash
npm run parse:docs:status
```
输出示例:
```
🔧 文档解析服务配置状态:
──────────────────────────────────────────────────
📄 markitdown: ❌ 未配置
🤖 AI 服务: ❌ 未配置
──────────────────────────────────────────────────
💡 配置提示:
1. 使用 markitdown: 安装 Python 并运行 "pip install markitdown"
2. 配置 AI 服务: 设置环境变量(.env 文件)
```
### 3. 解析所有文档
```bash
npm run parse:docs
```
### 4. 解析单个文档
```bash
npm run parse:docs:file="产品说明书.pdf"
```
## 配置 AI 服务(可选)
如需启用智能解析功能,请配置以下环境变量:
### 方法 1: 使用 .env 文件
```bash
# 复制示例配置
cp scripts/.env.example scripts/.env
# 编辑 .env 文件,填写 API Key
vim scripts/.env
```
### 方法 2: 使用环境变量
```bash
export AI_SERVICE_TYPE=openai
export OPENAI_API_KEY=sk-your-key-here
npm run parse:docs
```
## 支持的 AI 服务
| 服务 | 说明 | 环境变量 |
|------|------|---------|
| OpenAI | GPT-4/GPT-3.5 | `OPENAI_API_KEY` |
| Anthropic | Claude 3 Sonnet | `ANTHROPIC_API_KEY` |
| OpenRouter | 聚合服务 | `OPENROUTER_API_KEY` |
## 解析流程
1. **文档转换**:将 PDF/DOCX 转换为可读文本
2. **AI 解析**:从文本中提取结构化配置(产品类型、币种、年期等)
3. **生成代码**:生成 `plan-templates.js` 配置代码
4. **更新配置**:自动更新到配置文件
## 当前状态
-**基础功能**:支持 PDF、DOCX 文本提取
-**启发式推断**:根据文件名和内容推断产品类型和币种
-**AI 解析**:待集成 AI 服务(需要配置 API Key)
## 文档位置
待解析文档放在:`docs/to-parse/` 文件夹
支持格式:`.pdf`, `.docx`, `.doc`, `.txt`, `.md`
......@@ -36,6 +36,7 @@ import { splitByProducts, findProductTitles, generateSplitReport } from './produ
// ========== 配置区 ==========
const DOCS_DIR = path.resolve(process.cwd(), 'docs/to-parse')
const DOCS_ARCHIVE_DIR = path.resolve(process.cwd(), 'docs/to-parse/archived')
const CONFIG_FILE = path.resolve(process.cwd(), 'src/config/plan-templates.js')
const BACKUP_DIR = path.resolve(process.cwd(), 'docs/parsed-backup')
......@@ -91,6 +92,29 @@ function getFileMeta(filePath, extraMeta = {}) {
}
}
function buildArchiveFilePath(fileName) {
const date = new Date().toISOString().split('T')[0]
const archiveDir = path.join(DOCS_ARCHIVE_DIR, date)
ensureDir(archiveDir)
let targetPath = path.join(archiveDir, fileName)
if (fs.existsSync(targetPath)) {
const ext = path.extname(fileName)
const baseName = path.basename(fileName, ext)
targetPath = path.join(archiveDir, `${baseName}-${Date.now()}${ext}`)
}
return targetPath
}
function archiveParsedFile(filePath) {
if (!fs.existsSync(filePath)) {
return null
}
ensureDir(DOCS_ARCHIVE_DIR)
const archivePath = buildArchiveFilePath(path.basename(filePath))
fs.renameSync(filePath, archivePath)
return archivePath
}
function buildExtractResult(filePath, text, warnings = [], extraMeta = {}) {
return {
text,
......@@ -750,6 +774,14 @@ async function parseSingleFile(filePath) {
})
}
const shouldArchive = results.length > 0 && results.every(r => r.success)
if (shouldArchive) {
const archivedPath = archiveParsedFile(filePath)
if (archivedPath) {
console.log("📦 已归档原始文档: " + archivedPath)
}
}
// 单产品时返回单个结果对象(保持向后兼容)
// 多产品时返回数组
if (configs.length === 1) {
......@@ -786,6 +818,8 @@ async function generateAuditFile(fileName, config, code, productIndex = 0, total
const date = new Date().toISOString().split('T')[0]
const baseFileName = fileName.replace(/\.[^/.]+$/, '')
const pendingDir = path.join(AUDIT_PENDING_DIR, baseFileName)
ensureDir(pendingDir)
// 多产品文档时,为每个产品生成独立文件
let auditFileName
......@@ -799,7 +833,7 @@ async function generateAuditFile(fileName, config, code, productIndex = 0, total
} else {
auditFileName = `${date}-${baseFileName}.md`
}
const auditFilePath = path.join(AUDIT_PENDING_DIR, auditFileName)
const auditFilePath = path.join(pendingDir, auditFileName)
const formSn = generateFormSn(config)
const formSchemaPreview = config.form_schema ? JSON.stringify(config.form_schema, null, 2) : '// 请手动补充'
const submitMappingPreview = config.submit_mapping ? JSON.stringify(config.submit_mapping, null, 2) : '// 请手动补充'
......@@ -945,14 +979,14 @@ ${code.trim()}
### 确认无误
\`\`\`bash
# 1. 移动到 approved 目录
mv docs/parse-audit/pending/${auditFileName} \\
mv docs/parse-audit/pending/${baseFileName}/${auditFileName} \\
docs/parse-audit/approved/
# 2. 合并到正式配置
# 手动复制或使用工具合并到 src/config/plan-templates.js
# 3. 删除待审核文件(可选)
rm docs/parse-audit/pending/${auditFileName}
rm docs/parse-audit/pending/${baseFileName}/${auditFileName}
\`\`\`
### 需要修改
......@@ -961,7 +995,7 @@ rm docs/parse-audit/pending/${auditFileName}
### 放弃本次解析
\`\`\`bash
rm docs/parse-audit/pending/${auditFileName}
rm docs/parse-audit/pending/${baseFileName}/${auditFileName}
\`\`\`
---
......@@ -1302,6 +1336,7 @@ export function buildParseSummary(results, duration_ms) {
}
})
summary.total = summary.total_products
return summary
}
......