hookehuyr

fix(plan): 修正储蓄类模板提取计划逻辑错误

- 移除"是否生成说明"字段与"款项提取"配置的强依赖关系
- "是否希望生成一份允许减少名义金额的提取说明?"现在作为独立字段
- 删除错误的 watch 监听器,该监听器在选择"否"时会错误清除字段
- 更新校验逻辑:withdrawal_enabled 改为可选字段
- 更新架构文档:修正三层结构描述为字段结构说明

影响文件:
- src/components/plan/PlanTemplates/SavingsTemplate.vue
- docs/plan/plan-entry-architecture.md

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 +## [2026-02-13] - 储蓄类模板提取计划逻辑修正
2 +
3 +### 修复
4 +- 修正储蓄类产品模板的提取计划逻辑错误
5 +- 移除"是否生成说明"字段与"款项提取"配置的强依赖关系
6 +- "是否希望生成一份允许减少名义金额的提取说明?"现在作为独立字段,不影响提取方案配置
7 +- 删除错误的 watch 监听器,该监听器在选择"否"时会错误地清除所有提取计划字段
8 +- 更新校验逻辑:`withdrawal_enabled` 字段改为可选,不再强制校验
9 +
10 +### 文档
11 +- 更新 `docs/plan/plan-entry-architecture.md` 架构文档
12 +- 从"三层结构"改为"字段结构说明",明确字段1为独立字段
13 +- 更新组件设计代码示例,移除错误的 `v-if` 条件和 watch 监听器
14 +
15 +---
16 +
17 +**详细信息**
18 +- **影响文件**: src/components/plan/PlanTemplates/SavingsTemplate.vue, docs/plan/plan-entry-architecture.md
19 +- **技术栈**: Vue 3, Taro 4
20 +- **测试状态**: 待测试
21 +- **备注**: 提取方案配置现在始终显示(当配置启用时),不受"是否生成说明"字段影响
22 +
23 +---
24 +
1 ## [2026-02-13] - 消息详情页布局与状态优化 25 ## [2026-02-13] - 消息详情页布局与状态优化
2 26
3 ### 优化 27 ### 优化
......
...@@ -70,12 +70,11 @@ ...@@ -70,12 +70,11 @@
70 class="mb-5" 70 class="mb-5"
71 /> 71 />
72 72
73 - <!-- 仅当选择"是"时才显示以下内容 --> 73 + <!-- 款项提取配置(始终显示,不受上面字段影响) -->
74 - <template v-if="form.withdrawal_enabled === '是'"> 74 + <h3 class="text-base font-semibold text-gray-900 mb-4">款项提取(允许减少名义金额)</h3>
75 - <h3 class="text-base font-semibold text-gray-900 mb-4">款项提取(允许减少名义金额)</h3>
76 75
77 - <!-- 提取选项:指定提取金额 / 最高固定提取金额 --> 76 + <!-- 提取选项:指定提取金额 / 最高固定提取金额 -->
78 - <PlanFieldRadio 77 + <PlanFieldRadio
79 v-model="form.withdrawal_mode" 78 v-model="form.withdrawal_mode"
80 label="提取选项" 79 label="提取选项"
81 :options="['指定提取金额', '最高固定提取金额']" 80 :options="['指定提取金额', '最高固定提取金额']"
...@@ -165,7 +164,6 @@ ...@@ -165,7 +164,6 @@
165 class="mb-5" 164 class="mb-5"
166 /> 165 />
167 </template> 166 </template>
168 - </template>
169 </div> 167 </div>
170 </div> 168 </div>
171 169
...@@ -364,25 +362,6 @@ const onWithdrawalModeChange = (mode) => { ...@@ -364,25 +362,6 @@ const onWithdrawalModeChange = (mode) => {
364 } 362 }
365 363
366 /** 364 /**
367 - * 监听提取计划启用状态变化
368 - * @description 当用户选择"否"时,清除所有提取计划相关字段
369 - */
370 -watch(
371 - () => form.withdrawal_enabled,
372 - (newValue) => {
373 - if (newValue === '否') {
374 - // 清除所有提取计划相关字段
375 - delete form.withdrawal_mode
376 - delete form.specified_amount_type
377 - delete form.withdrawal_start_age
378 - delete form.withdrawal_period
379 - delete form.annual_withdrawal_amount
380 - delete form.annual_increase_percentage
381 - }
382 - }
383 -)
384 -
385 -/**
386 * 百分比输入限制(实时) 365 * 百分比输入限制(实时)
387 * @description 限制百分比输入为有效数值,最多2位小数 366 * @description 限制百分比输入为有效数值,最多2位小数
388 * 只允许输入数字和一个小数点 367 * 只允许输入数字和一个小数点
...@@ -453,60 +432,57 @@ const validate = () => { ...@@ -453,60 +432,57 @@ const validate = () => {
453 432
454 // 提取计划校验 433 // 提取计划校验
455 if (props.config.withdrawal_plan?.enabled) { 434 if (props.config.withdrawal_plan?.enabled) {
456 - if (!form.withdrawal_enabled) { 435 + // withdrawal_enabled 只是一个可选字段,不需要校验
457 - Taro.showToast({ title: '请选择是否希望生成提取说明', icon: 'none' }) 436 + // 真正需要校验的是提取方案配置
437 +
438 + if (!form.withdrawal_mode) {
439 + Taro.showToast({ title: '请选择提取选项', icon: 'none' })
458 return false 440 return false
459 } 441 }
460 442
461 - if (form.withdrawal_enabled === '是') { 443 + // 根据选择的提取模式进行校验
462 - if (!form.withdrawal_mode) { 444 + if (form.withdrawal_mode === '指定提取金额') {
463 - Taro.showToast({ title: '请选择提取选项', icon: 'none' }) 445 + if (!form.specified_amount_type) {
446 + Taro.showToast({ title: '请选择提取方式', icon: 'none' })
464 return false 447 return false
465 } 448 }
466 449
467 - if (form.withdrawal_mode === '指定提取金额') { 450 + if (form.withdrawal_start_age === undefined || form.withdrawal_start_age === '') {
468 - if (!form.specified_amount_type) { 451 + Taro.showToast({ title: '请输入开始提取年龄', icon: 'none' })
469 - Taro.showToast({ title: '请选择提取方式', icon: 'none' }) 452 + return false
470 - return false 453 + }
471 - }
472 454
473 - if (form.withdrawal_start_age === undefined || form.withdrawal_start_age === '') { 455 + if (!form.withdrawal_period) {
474 - Taro.showToast({ title: '请输入开始提取年龄', icon: 'none' }) 456 + Taro.showToast({ title: '请选择提取期', icon: 'none' })
475 - return false 457 + return false
476 - } 458 + }
477 459
478 - if (!form.withdrawal_period) { 460 + if (form.specified_amount_type === '按年岁') {
479 - Taro.showToast({ title: '请选择提取期', icon: 'none' }) 461 + if (!form.annual_withdrawal_amount || form.annual_withdrawal_amount === '') {
462 + Taro.showToast({ title: '请输入每年提取金额', icon: 'none' })
480 return false 463 return false
481 } 464 }
482 - 465 + if (form.annual_increase_percentage === undefined || form.annual_increase_percentage === '') {
483 - if (form.specified_amount_type === '按年岁') { 466 + Taro.showToast({ title: '请输入每年递增提取之百分比', icon: 'none' })
484 - if (!form.annual_withdrawal_amount || form.annual_withdrawal_amount === '') {
485 - Taro.showToast({ title: '请输入每年提取金额', icon: 'none' })
486 - return false
487 - }
488 - if (form.annual_increase_percentage === undefined || form.annual_increase_percentage === '') {
489 - Taro.showToast({ title: '请输入每年递增提取之百分比', icon: 'none' })
490 - return false
491 - }
492 -
493 - // 验证百分比范围
494 - const percentage = parseFloat(form.annual_increase_percentage)
495 - if (Number.isNaN(percentage) || percentage < 0 || percentage > 100) {
496 - Taro.showToast({ title: '请输入0-100之间的百分比', icon: 'none' })
497 - return false
498 - }
499 - }
500 - } else if (form.withdrawal_mode === '最高固定提取金额') {
501 - if (form.withdrawal_start_age === undefined || form.withdrawal_start_age === '') {
502 - Taro.showToast({ title: '请输入开始提取年龄', icon: 'none' })
503 return false 467 return false
504 } 468 }
505 - if (!form.withdrawal_period) { 469 +
506 - Taro.showToast({ title: '请选择提取期', icon: 'none' }) 470 + // 验证百分比范围
471 + const percentage = parseFloat(form.annual_increase_percentage)
472 + if (Number.isNaN(percentage) || percentage < 0 || percentage > 100) {
473 + Taro.showToast({ title: '请输入0-100之间的百分比', icon: 'none' })
507 return false 474 return false
508 } 475 }
509 } 476 }
477 + } else if (form.withdrawal_mode === '最高固定提取金额') {
478 + if (form.withdrawal_start_age === undefined || form.withdrawal_start_age === '') {
479 + Taro.showToast({ title: '请输入开始提取年龄', icon: 'none' })
480 + return false
481 + }
482 + if (!form.withdrawal_period) {
483 + Taro.showToast({ title: '请选择提取期', icon: 'none' })
484 + return false
485 + }
510 } 486 }
511 } 487 }
512 488
......