Преглед изворни кода

feat(health): 健康现状档案 v2 — 疾病史两源预置清单分类多选+确诊时间,用药开始年月自动计算时长
- 疾病史:DISEASE_PRESETS(10项) → DISEASE_GROUPS(8组54项,★菌群源),分类折叠多选,★角标说明
- 确诊时间:年月选择器(fields=month, end限当前月),存 diagnosedAt(yyyy-MM)
- 用药:startDate年月 + durationText自动计算(<12月→X个月, ≥12→X年),记不清可手动兜底
- 后端零变更(JSON列透传),v1旧数据({name,note}/{name,time})回显兼容
- 新增 computed.selectedNames + 17 个 CSS 类

iwt пре 2 месеци
родитељ
комит
689fedaef2

+ 31 - 3
cfc-frontend/pages/health/health-status-form.vue

@@ -203,6 +203,11 @@ export default {
       saving: false
     }
   },
+  computed: {
+    selectedNames: function() {
+      return this.selectedDiseases.map(function(d) { return d.name })
+    }
+  },
   onLoad: function() {
     var now = new Date()
     var y = now.getFullYear()
@@ -371,13 +376,19 @@ export default {
         lipids.push({ name: '总胆固醇', value: parseFloat(this.lipidCholesterol), unit: 'mmol/L', note: '' })
       }
       var diseases = []
-      this.diseaseNames.forEach(function(name) {
-        diseases.push({ name: name, note: '' })
+      this.selectedDiseases.forEach(function(item) {
+        var d = { name: item.name }
+        if (item.diagnosedAt) d.diagnosedAt = item.diagnosedAt
+        diseases.push(d)
       })
       var meds = []
       this.medRows.forEach(function(item) {
         if (item.name) {
-          meds.push({ name: item.name, time: item.time || '' })
+          var m = { name: item.name }
+          if (item.startDate) m.startDate = item.startDate
+          if (item.durationText) m.durationText = item.durationText
+          if (item.time) m.time = item.time
+          meds.push(m)
         }
       })
       var payload = {}
@@ -426,6 +437,23 @@ export default {
 .hs-tip-text { font-size: 26rpx; color: #8A6D3B; line-height: 1.6; }
 .form-section { margin: 0 30rpx 24rpx; background: #fff; border-radius: 16rpx; padding: 24rpx; }
 .form-title { font-size: 30rpx; font-weight: bold; color: #333; margin-bottom: 20rpx; }
+.disease-group { margin-bottom: 8rpx; }
+.group-head { display: flex; align-items: center; justify-content: space-between; padding: 12rpx 0; }
+.group-title { font-size: 28rpx; font-weight: bold; color: #333; }
+.group-arrow { font-size: 24rpx; color: #999; }
+.risk-badge { margin-left: 6rpx; color: #E64340; font-size: 24rpx; }
+.selected-area { margin-top: 16rpx; padding: 16rpx; background: #FFF7E6; border-radius: 12rpx; }
+.selected-title { font-size: 26rpx; color: #8A6D3B; margin-bottom: 8rpx; }
+.sel-row { display: flex; align-items: center; justify-content: space-between; padding: 10rpx 0; border-bottom: 1rpx solid #F0E6D0; }
+.sel-name { font-size: 28rpx; color: #333; flex: 1; }
+.sel-diag { font-size: 26rpx; color: #F97316; }
+.sel-del { font-size: 30rpx; color: #E64340; margin-left: 16rpx; }
+.med-row { border: 1rpx solid #F0F0F0; border-radius: 12rpx; padding: 16rpx; margin-bottom: 16rpx; }
+.med-line { display: flex; align-items: center; margin-bottom: 12rpx; }
+.med-line:last-child { margin-bottom: 0; }
+.med-picker { font-size: 26rpx; color: #F97316; padding: 8rpx 16rpx; background: #F5F7FA; border-radius: 10rpx; }
+.med-forget { font-size: 26rpx; color: #999; margin-left: 16rpx; }
+.med-duration { font-size: 26rpx; color: #8A6D3B; }
 .form-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 20rpx; }
 .form-label { font-size: 28rpx; color: #555; }
 .form-input { flex: 1; margin-left: 30rpx; height: 68rpx; background: #F5F7FA; border-radius: 10rpx; padding: 0 20rpx; font-size: 28rpx; text-align: right; }

+ 2 - 2
docs/superpowers/PROJECT-OVERVIEW.md

@@ -84,7 +84,7 @@
 | 新用户注册引导 + 个人信息按需补充/回写 | Phase 1 | ✅ 已实施(注册解耦最小集 + 个人中心卡片 + 功能场景就地补充自动回写 + 无家庭引导组件) | `specs/2026-08-04-registration-profile-backfill-design.md` + `plans/2026-08-04-registration-profile-backfill.md` |
 | 通关解锁(测试门禁+引导解锁) | Phase 1 | 🟡 设计稿 v2.1(三关递进:自检→个人沙盘 / 邀请家人→全家沙盘 / 创建家人→孩子微行动;沙盘加个人/全家切换开关;增值关卡含购物/会员/上传报告,各关均有奖励;后台可配置) | `specs/2026-08-10-unlock-gates-design.md` |
 | 首页重构(主动健康漏斗) | Phase 5 | ✅ 已实施(四段式漏斗:了解区自测卡/发现区沙盘+上传报告/行动区旅程卡+今日任务+我的任务+家庭挑战+会员/内容区快捷栏+动态+阅读+商品;未登录态零改动) | `specs/2026-08-18-homepage-health-funnel-design.md` + `plans/2026-08-18-homepage-health-funnel.md` |
-| 当前状态调研(健康现状档案 v2) | Phase 5 | 🔄 v2 计划待执行(v1 已实施:health_status 表+档案页+出方案弹窗;v2 重设计:疾病史改两源预置清单 8 组 54 项分类折叠多选+确诊时间年月,用药加开始年月自动计算时长+记不清兜底;后端零变更) | `specs/2026-08-13-health-status-survey-design.md` + `plans/2026-08-18-health-status-survey-v2.md` |
+| 当前状态调研(健康现状档案 v2) | Phase 5 | 🟢 已实施(v1 已实施:health_status 表+档案页+出方案弹窗;v2 疾病史:8 组 54 项两源预置清单分类折叠多选+确诊时间年月,用药:开始年月自动计算时长+记不清兜底;后端零变更) | `specs/2026-08-13-health-status-survey-design.md` + `plans/2026-08-18-health-status-survey-v2.md` |
 
 ---
 
@@ -356,7 +356,7 @@
 | `2026-08-15-sku-price-cents-and-spec-selector-design.md` | ✅ 已实施(7 Tasks:实体/DTO/订单/购物车/迁移/管理端/小程序,5 commits) | SKU 规格价格统一分单位 + 详情页规格按钮修复设计 |
 | `2026-08-18-homepage-health-funnel-design.md` | ✅ 已实施(四段式漏斗:了解区自测卡/发现区沙盘+上传报告/行动区聚合/内容区降级;未登录态零改动) | 首页重构 — 主动健康漏斗(了解→发现→改变) |
 | `2026-08-13-health-status-survey-design.md` | 🔄 v2 设计已定稿(2026-08-18;v1 已实施;v2 疾病史两源预置清单+确诊时间+服药时长) | 当前状态调研 — 健康现状档案 |
-| `2026-08-18-health-status-survey-v2.md` | 🔄 计划待执行(单文件改 health-status-form.vue;8 组 54 项预置清单分类多选+确诊时间;用药年月+时长自动计算;后端零变更) | 当前状态调研 — 健康现状档案 v2 |
+| `2026-08-18-health-status-survey-v2.md` | 🟢 已实施(单文件改 health-status-form.vue;8 组 54 项预置清单分类多选+确诊时间;用药年月+时长自动计算;后端零变更;v1 旧数据兼容) | 当前状态调研 — 健康现状档案 v2 |
 
 ### 实施计划(plans/)