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>
Showing
3 changed files
with
199 additions
and
0 deletions
docs/tasks/plan/字段条件显示系统扩展.md
0 → 100644
| 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 |
src/config/__tests__/plan-conditions.test.js
0 → 100644
This diff is collapsed. Click to expand it.
src/config/plan-conditions.js
0 → 100644
This diff is collapsed. Click to expand it.
-
Please register or login to post a comment