Просмотр исходного кода

fix(frontend): 报告详情/确认页被检测人选择面板始终列出全部成员

原逻辑:存在候选匹配(candidates>0 && showCandidatesOnly)时全量成员列表被隐藏,用户无法看到并选择所有家庭成员。现改为:候选区(带匹配度)之上/下始终展示全量成员列表,并用 otherMembers computed 对候选区已展示的成员去重,避免重复显示。同时移除已无用的 showCandidatesOnly 字段与赋值。
liaoxg 1 месяц назад
Родитель
Сommit
0a40be1371
2 измененных файлов с 54 добавлено и 15 удалено
  1. 27 10
      cfc-frontend/pages/health/report-confirm.vue
  2. 27 5
      cfc-frontend/pages/health/report-detail.vue

+ 27 - 10
cfc-frontend/pages/health/report-confirm.vue

@@ -68,11 +68,12 @@
             </view>
             </view>
           </view>
           </view>
 
 
-          <!-- 全量家庭成员列表(后备) -->
-          <view class="member-list" v-if="familyMembers.length > 0 && (candidates.length === 0 || !showCandidatesOnly)">
+          <!-- 全量家庭成员列表(始终显示,候选区已展示的成员去重) -->
+          <view class="member-list" v-if="familyMembers.length > 0">
+            <text class="member-list-hint" v-if="candidates.length > 0">全部成员({{ otherMembers.length }} 人)</text>
             <view
             <view
               class="member-item"
               class="member-item"
-              v-for="(member, mIdx) in familyMembers"
+              v-for="(member, mIdx) in otherMembers"
               :key="mIdx"
               :key="mIdx"
               :class="{ 'member-selected': selectedMemberId === (member.userId || member.id) }"
               :class="{ 'member-selected': selectedMemberId === (member.userId || member.id) }"
               @click="selectAndClose(member)"
               @click="selectAndClose(member)"
@@ -389,7 +390,6 @@ export default {
       matchConfidence: null,
       matchConfidence: null,
       matchLabel: '',
       matchLabel: '',
       candidates: [],
       candidates: [],
-      showCandidatesOnly: false,
       // 被检测人选择面板
       // 被检测人选择面板
       showMemberPanel: false,
       showMemberPanel: false,
       selectedMemberObj: null,
       selectedMemberObj: null,
@@ -444,6 +444,23 @@ export default {
       if (this.needBind) return '需手动绑定'
       if (this.needBind) return '需手动绑定'
       return this.extractedName || '未识别'
       return this.extractedName || '未识别'
     },
     },
+    /** 全量成员减去候选区已展示的成员,避免重复 */
+    otherMembers() {
+      var candIds = {}
+      for (var i = 0; i < this.candidates.length; i++) {
+        var c = this.candidates[i]
+        var cid = c.id || c.userId
+        if (cid !== null && cid !== undefined) candIds[cid] = true
+      }
+      var list = []
+      for (var j = 0; j < this.familyMembers.length; j++) {
+        var m = this.familyMembers[j]
+        var mid = m.userId || m.id
+        if (mid !== null && mid !== undefined && candIds[mid]) continue
+        list.push(m)
+      }
+      return list
+    },
     // 指标按类型(category)分组,保持解析顺序,统计需处理(非正常)数量
     // 指标按类型(category)分组,保持解析顺序,统计需处理(非正常)数量
     indicatorGroups() {
     indicatorGroups() {
       var groups = []
       var groups = []
@@ -545,11 +562,6 @@ export default {
       }
       }
     }
     }
 
 
-    // 有候选时优先展示候选列表
-    if (this.candidates.length > 0) {
-      this.showCandidatesOnly = true
-    }
-
     // 始终加载家庭成员(面板始终可点击,needBind=false 也允许改选)
     // 始终加载家庭成员(面板始终可点击,needBind=false 也允许改选)
     this.loadFamilyMembers()
     this.loadFamilyMembers()
 
 
@@ -607,7 +619,6 @@ export default {
       this.matchConfidence = detail.confidence !== undefined && detail.confidence !== null ? parseFloat(detail.confidence) : null
       this.matchConfidence = detail.confidence !== undefined && detail.confidence !== null ? parseFloat(detail.confidence) : null
       this.matchLabel = detail.matchLabel || ''
       this.matchLabel = detail.matchLabel || ''
       this.candidates = detail.candidates || []
       this.candidates = detail.candidates || []
-      this.showCandidatesOnly = this.candidates.length > 0
 
 
       // 始终加载家庭成员
       // 始终加载家庭成员
       this.loadFamilyMembers()
       this.loadFamilyMembers()
@@ -1118,6 +1129,12 @@ export default {
   flex-wrap: wrap;
   flex-wrap: wrap;
   gap: 16rpx;
   gap: 16rpx;
 }
 }
+.member-list-hint {
+  width: 100%;
+  font-size: 24rpx;
+  color: #999;
+  margin-bottom: 8rpx;
+}
 .member-item {
 .member-item {
   display: flex;
   display: flex;
   flex-direction: column;
   flex-direction: column;

+ 27 - 5
cfc-frontend/pages/health/report-detail.vue

@@ -84,11 +84,12 @@
                 </view>
                 </view>
               </view>
               </view>
 
 
-              <!-- 全量家庭成员列表(后备) -->
-              <view class="member-list" v-if="familyMembers.length > 0 && (candidates.length === 0 || !showCandidatesOnly)">
+              <!-- 全量家庭成员列表(始终显示,候选区已展示的成员去重) -->
+              <view class="member-list" v-if="familyMembers.length > 0">
+                <text class="member-list-hint" v-if="candidates.length > 0">全部成员({{ otherMembers.length }} 人)</text>
                 <view
                 <view
                   class="member-item"
                   class="member-item"
-                  v-for="(member, mIdx) in familyMembers"
+                  v-for="(member, mIdx) in otherMembers"
                   :key="mIdx"
                   :key="mIdx"
                   :class="{ 'member-selected': selectedMemberId === (member.userId || member.id) }"
                   :class="{ 'member-selected': selectedMemberId === (member.userId || member.id) }"
                   @click="selectAndClose(member)"
                   @click="selectAndClose(member)"
@@ -415,7 +416,6 @@ export default {
       matchConfidence: null,
       matchConfidence: null,
       matchLabel: '',
       matchLabel: '',
       candidates: [],
       candidates: [],
-      showCandidatesOnly: false,
       showMemberPanel: false,
       showMemberPanel: false,
       showAutoCreateForm: false,
       showAutoCreateForm: false,
       newMember: { name: '', gender: 'male', age: '' },
       newMember: { name: '', gender: 'male', age: '' },
@@ -469,6 +469,23 @@ export default {
       if (this.extractedName) return this.extractedName + (this.needBind ? '(待绑定)' : '')
       if (this.extractedName) return this.extractedName + (this.needBind ? '(待绑定)' : '')
       return '未选择'
       return '未选择'
     },
     },
+    /** 全量成员减去候选区已展示的成员,避免重复 */
+    otherMembers() {
+      var candIds = {}
+      for (var i = 0; i < this.candidates.length; i++) {
+        var c = this.candidates[i]
+        var cid = c.id || c.userId
+        if (cid !== null && cid !== undefined) candIds[cid] = true
+      }
+      var list = []
+      for (var j = 0; j < this.familyMembers.length; j++) {
+        var m = this.familyMembers[j]
+        var mid = m.userId || m.id
+        if (mid !== null && mid !== undefined && candIds[mid]) continue
+        list.push(m)
+      }
+      return list
+    },
     canConfirm() {
     canConfirm() {
       if (this.parsing) return false
       if (this.parsing) return false
       if (this.needBind && !this.selectedMemberId && !this.createdMemberId) return false
       if (this.needBind && !this.selectedMemberId && !this.createdMemberId) return false
@@ -628,7 +645,6 @@ export default {
       self.matchedMemberId = detail.matchedMemberId || null
       self.matchedMemberId = detail.matchedMemberId || null
       self.needBind = !!detail.needBind
       self.needBind = !!detail.needBind
       self.candidates = detail.candidates || []
       self.candidates = detail.candidates || []
-      self.showCandidatesOnly = !!detail.showCandidatesOnly
       self.loadFamilyMembers()
       self.loadFamilyMembers()
       if (!self.needBind) {
       if (!self.needBind) {
         self.selectedMemberId = self.matchedMemberId
         self.selectedMemberId = self.matchedMemberId
@@ -1277,6 +1293,12 @@ export default {
   flex-wrap: wrap;
   flex-wrap: wrap;
   gap: 16rpx;
   gap: 16rpx;
 }
 }
+.member-list-hint {
+  width: 100%;
+  font-size: 24rpx;
+  color: #999;
+  margin-bottom: 8rpx;
+}
 .member-item {
 .member-item {
   display: flex;
   display: flex;
   flex-direction: column;
   flex-direction: column;