hookehuyr

feat(plan): 添加字段条件显示系统扩展功能

- 新增条件规则引擎 (plan-conditions.js)
- 支持 eq/neq/gt/gte/lt/lte/in/not_in 等操作符
- 支持 AND/OR 逻辑组合
- 添加完整的单元测试 (plan-conditions.test.js)
- 添加功能扩展计划文档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 +# 字段条件显示系统扩展计划
2 +
3 +## 背景与目标
4 +
5 +### 当前问题
6 +- `show_when` 只支持简单的等于比较 (`equals`)
7 +- 不支持 OR 条件、嵌套条件
8 +- 不支持不等于、大于、小于等操作符
9 +- 隐藏字段的清理逻辑分散在 `reset_map`
10 +- 提交时可能包含隐藏字段的脏数据
11 +
12 +### 目标
13 +构建一个声明式的条件规则系统,支持复杂逻辑同时保持配置可读性。
14 +
15 +## 技术方案:方案 B - 条件规则引擎
16 +
17 +### 核心文件变更
18 +
19 +| 文件 | 操作 | 说明 |
20 +|------|------|------|
21 +| `src/config/plan-conditions.js` | 新建 | 条件操作符和评估引擎 |
22 +| `src/composables/useFieldDependencies.js` | 修改 | 集成新的条件评估器 |
23 +| `src/composables/usePlanSubmit.js` | 新建 | 提交时字段过滤逻辑 |
24 +| `src/config/plan-templates.js` | 修改 | 迁移现有配置到新格式 |
25 +| `src/composables/__tests__/plan-conditions.test.js` | 新建 | 条件引擎单元测试 |
26 +
27 +---
28 +
29 +## 阶段 1:核心条件引擎
30 +
31 +### 任务 1.1 创建条件操作符定义
32 +- [x] 创建 `src/config/plan-conditions.js`
33 +- [x] 定义比较操作符:`eq`, `ne`, `gt`, `gte`, `lt`, `lte`
34 +- [x] 定义集合操作符:`in`, `nin`
35 +- [x] 定义字符串操作符:`contains`, `startsWith`, `matches`
36 +- [x] 定义布尔操作符:`truthy`, `falsy`, `empty`, `notEmpty`
37 +- [x] 编写单元测试验证操作符正确性
38 +
39 +### 任务 1.2 实现条件评估函数
40 +- [x] 实现 `evaluateCondition(condition, formData)` 函数
41 +- [x] 支持简单条件:`{ field, op, value }`
42 +- [x] 支持 AND 逻辑:`{ and: [...] }`
43 +- [x] 支持 OR 逻辑:`{ or: [...] }`
44 +- [x] 支持 NOT 逻辑:`{ not: {...} }`
45 +- [x] 支持嵌套条件组合
46 +- [x] 编写单元测试覆盖各种条件场景
47 +
48 +### 任务 1.3 向后兼容处理
49 +- [x] 支持旧格式 `show_when: { field: 'x', equals: 'y' }`
50 +- [x] 支持旧格式数组 `show_when: [{ field: 'x', equals: 'y' }]`
51 +- [x] 自动转换为新格式
52 +
53 +---
54 +
55 +## 阶段 2:清理机制
56 +
57 +### 任务 2.1 字段清理规则
58 +- [x] 在字段定义中添加 `clear_when_hidden` 属性
59 +- [x] 实现 `clear_when_hidden: true` 自动清空
60 +- [x] 实现 `clear_when_hidden: false` 保留值
61 +- [x] 实现级联清理 `clear_when_hidden: { clear_dependents: [...] }`
62 +
63 +### 任务 2.2 提交时字段过滤
64 +- [x] 实现 `filterHiddenFields(formData, visibleFields)` 函数
65 +- [x] 只提交当前可见的字段
66 +- [x] 保持 API 兼容性
67 +
68 +### 任务 2.3 更新 useFieldDependencies
69 +- [x] 集成新的条件评估引擎
70 +- [x] 实现字段隐藏时的自动清理
71 +- [x] 更新 `isFieldVisible` 使用新引擎
72 +- [x] 保持 API 兼容性
73 +
74 +---
75 +
76 +## 阶段 3:配置迁移
77 +
78 +### 任务 3.1 迁移储蓄类模板
79 +- [x] 迁移 `savingsFormSchema.withdrawal_fields` 到新格式
80 +- [x] 删除 `reset_map`,使用 `clear_when_hidden` 替代
81 +- [x] 验证功能正常(测试通过 160/160)
82 +
83 +### 任务 3.2 迁移保障类模板
84 +- [x] 检查 `protectionFormSchema` 是否需要条件
85 +- [x] 按需添加条件规则(保障类暂无条件需求,无需迁移)
86 +
87 +### 任务 3.3 更新文档解析工具 ⚠️ 重要
88 +- [x] 更新 `src/utils/parsers/config-generator.js` 生成新格式配置
89 +- [x] 修改 `show_when` 生成逻辑,使用 `{ field, op, value }` 格式
90 +- [x] 停止生成 `reset_map`(已忽略)
91 +- [x] 测试通过(160/160)
92 +
93 +**说明**:MCP 文档解析服务保持不变,仅更新配置生成器输出格式。
94 +
95 +### 任务 3.4 更新文档
96 +- [x] 更新 `plan-templates.js` 顶部的使用说明
97 +- [x] 添加条件规则配置示例(已在 plan-templates.js 注释中说明)
98 +- [x] 添加常见场景示例(已在 savingsFormSchema 中实现)
99 +
100 +---
101 +
102 +## 阶段 4:测试与验证
103 +
104 +### 任务 4.1 单元测试
105 +- [ ] 条件操作符测试覆盖率 > 90%
106 +- [ ] 条件评估引擎测试覆盖率 > 90%
107 +- [ ] useFieldDependencies 测试更新
108 +
109 +### 任务 4.2 集成测试
110 +- [ ] 测试储蓄类产品完整流程
111 +- [ ] 测试字段显示/隐藏切换
112 +- [ ] 测试提交时字段过滤
113 +- [ ] 测试向后兼容性
114 +
115 +### 任务 4.3 真机验证
116 +- [ ] 微信开发者工具验证
117 +- [ ] 检查性能影响
118 +- [ ] 检查内存占用
119 +
120 +---
121 +
122 +## 配置格式示例
123 +
124 +### 新格式示例
125 +
126 +```javascript
127 +// 简单条件
128 +show_when: { field: 'smoker', op: 'eq', value: '是' }
129 +
130 +// 多条件 AND
131 +show_when: {
132 + and: [
133 + { field: 'smoker', op: 'eq', value: '是' },
134 + { field: 'age', op: 'gte', value: 30 }
135 + ]
136 +}
137 +
138 +// OR 条件
139 +show_when: {
140 + or: [
141 + { field: 'smoker', op: 'eq', value: '是' },
142 + { field: 'age', op: 'gt', value: 50 }
143 + ]
144 +}
145 +
146 +// 嵌套条件
147 +show_when: {
148 + and: [
149 + { field: 'product_type', op: 'in', value: ['A', 'B'] },
150 + {
151 + or: [
152 + { field: 'coverage', op: 'gte', value: 100000 },
153 + { field: 'payment_period', op: 'eq', value: '20年' }
154 + ]
155 + }
156 + ]
157 +}
158 +
159 +// 清理规则
160 +{
161 + id: 'withdrawal_amount',
162 + show_when: { field: 'withdrawal_mode', op: 'eq', value: '指定提取金额' },
163 + clear_when_hidden: true // 隐藏时清空
164 +}
165 +```
166 +
167 +### 旧格式(保持兼容)
168 +
169 +```javascript
170 +// 旧格式仍然支持
171 +show_when: { field: 'withdrawal_mode', equals: '指定提取金额' }
172 +show_when: [{ field: 'withdrawal_mode', equals: '指定提取金额' }]
173 +```
174 +
175 +---
176 +
177 +## 风险与注意事项
178 +
179 +1. **向后兼容**:必须保持现有配置格式可用
180 +2. **性能**:条件评估不能影响表单响应速度
181 +3. **可读性**:配置文件需要保持可理解性
182 +4. **测试覆盖**:每个操作符都需要充分测试
183 +
184 +---
185 +
186 +## 进度追踪
187 +
188 +| 阶段 | 状态 | 完成时间 |
189 +|------|------|---------|
190 +| 阶段 1:核心引擎 | ✅ 完成 | 2026-02-15 |
191 +| 阶段 2:清理机制 | ✅ 完成 | 2026-02-15 |
192 +| 阶段 3:配置迁移 | ✅ 完成 | 2026-02-15 |
193 +| 阶段 4:测试验证 | 🔄 待真机验证 | - |
194 +
195 +---
196 +
197 +**创建时间**: 2026-02-15
198 +**预计工期**: 3-4 天
199 +**维护者**: Claude Code
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.