Selaa lähdekoodia

fix(frontend): 根治 family/member/list 与 tasks/history 重复调用——index-home loadFamilyFeed 改为只查第一个孩子、parent-index/child-index 合并 getChildren+loadFamilyMembersVisible 为单次 getFamilyMemberList

- index-home: loadFamilyFeed 从遍历所有孩子改为只查第一个孩子(避免 N 个孩子 = N 次 /api/tasks/history)
- child-index: loadData 中 getChildren() 改为 getFamilyMemberList({visibleOnly:true}) 一次调用,同步设置 familyMembersVisible,跳过后续 loadFamilyMembersVisible()
- parent-index: dashboard 成功路径同步设置 familyMembersVisible + _membersVisibleSet,降级路径合并 getFamilyMemberList+getChildren 为单次调用并派生 children
liaoxg 2 viikkoa sitten
vanhempi
sitoutus
118172e8e5

+ 8 - 4
cfc-frontend/pages/home-pages/child-index.vue

@@ -543,8 +543,12 @@ export default {
         }
         }
         this.nickname = (userInfo && userInfo.nickname) ? userInfo.nickname : '小朋友'
         this.nickname = (userInfo && userInfo.nickname) ? userInfo.nickname : '小朋友'
 
 
-        const childrenRes = await getChildren()
-        const children = childrenRes.data || []
+        const childrenRes = await getFamilyMemberList({ visibleOnly: true })
+        var allMembers = childrenRes.data || []
+        if (!Array.isArray(allMembers)) allMembers = []
+        // 同步设置 familyMembersVisible,避免 loadFamilyMembersVisible() 再调一次
+        this.familyMembersVisible = allMembers
+        const children = allMembers.filter(function(m) { return m.effectiveRole === 'child' || m.source !== 'parent' })
         if (children.length === 0) {
         if (children.length === 0) {
           this.hasChildren = false
           this.hasChildren = false
           this.loading = false
           this.loading = false
@@ -653,8 +657,8 @@ export default {
           console.log('获取沙盘数据失败', e)
           console.log('获取沙盘数据失败', e)
         }
         }
 
 
-        // 加载家庭成员
-        this.loadFamilyMembersVisible()
+        // 家庭成员已在上方 loadData 开头通过 getFamilyMemberList 一次获取,不再重复调用
+        // this.loadFamilyMembersVisible()
 
 
         // 加载维度活动
         // 加载维度活动
         try {
         try {

+ 9 - 13
cfc-frontend/pages/home-pages/parent-index.vue

@@ -737,22 +737,29 @@ export default {
             if (dashData.familyId) {
             if (dashData.familyId) {
               this._familyId = dashData.familyId
               this._familyId = dashData.familyId
             }
             }
+            // 从仪表盘同步设置 familyMembersVisible(含家长本人),避免后续 loadFamilyMembersVisible() 再调 getFamilyMemberList
+            var dashMembers = dashData.members || dashData.familyMembers || filteredChildren
+            this.familyMembersVisible = dashMembers
+            _membersVisibleSet = true
             dashboardLoaded = true
             dashboardLoaded = true
           }
           }
         } catch (e) {
         } catch (e) {
           console.log('获取仪表盘数据失败,降级到单独接口', e)
           console.log('获取仪表盘数据失败,降级到单独接口', e)
         }
         }
 
 
-        // 降级:使用原有单独接口
+        // 降级:使用原有单独接口(仅调用一次 getFamilyMemberList,合并 children 与 familyMembers 派生)
         if (!dashboardLoaded) {
         if (!dashboardLoaded) {
           try {
           try {
             const currentUserId = uni.getStorageSync('userId')
             const currentUserId = uni.getStorageSync('userId')
             const membersRes = await getFamilyMemberList({ visibleOnly: true, includeFamily: true })
             const membersRes = await getFamilyMemberList({ visibleOnly: true, includeFamily: true })
             const data = membersRes.data || {}
             const data = membersRes.data || {}
-            const members = data.members || []
+            var members = data.members || data || []
+            if (!Array.isArray(members)) members = []
             const parents = members.filter(function(p) { return p.source === 'parent' && p.id && p.id !== currentUserId }).map(function(p) { return { ...p, role: 'parent' } })
             const parents = members.filter(function(p) { return p.source === 'parent' && p.id && p.id !== currentUserId }).map(function(p) { return { ...p, role: 'parent' } })
             const children = members.filter(function(c) { return c.source !== 'parent' && c.id }).map(function(c) { return { ...c, role: 'child' } })
             const children = members.filter(function(c) { return c.source !== 'parent' && c.id }).map(function(c) { return { ...c, role: 'child' } })
             this.familyMembers = [].concat(parents, children)
             this.familyMembers = [].concat(parents, children)
+            // 从同一响应派生 children,避免再调 getChildren()(= getFamilyMemberList({}))
+            this.children = children
             // 同步设置 familyMembersVisible,避免 loadFamilyMembersVisible() 重复调用 getFamilyMemberList
             // 同步设置 familyMembersVisible,避免 loadFamilyMembersVisible() 重复调用 getFamilyMemberList
             this.familyMembersVisible = members
             this.familyMembersVisible = members
             _membersVisibleSet = true
             _membersVisibleSet = true
@@ -764,17 +771,6 @@ export default {
           } catch (e) {
           } catch (e) {
             console.log('获取家庭成员失败', e)
             console.log('获取家庭成员失败', e)
           }
           }
-
-          if (this.children.length === 0) {
-            try {
-              const childrenRes = await getChildren()
-              const rawChildren = childrenRes.data || []
-              this.children = rawChildren
-              // 不自动选孩子:默认显示家长自己,等待用户从 FamilyMemberStrip 选择
-            } catch (e) {
-              console.log('获取孩子列表失败', e)
-            }
-          }
         }
         }
 
 
         const reviewRes = await getPendingReviewTasks()
         const reviewRes = await getPendingReviewTasks()

+ 19 - 28
cfc-frontend/pages/index-home/index.vue

@@ -790,41 +790,32 @@ membershipDays: 0,
     },
     },
     loadFamilyFeed: function() {
     loadFamilyFeed: function() {
       var self = this
       var self = this
-      // 仅对孩子成员(effectiveRole === 'child')拉取任务历史,避免对家长也发起请求
+      // 仅对第一个孩子拉取任务历史(避免 N 个孩子 N 次 /api/tasks/history 请求)
       var children = (self.children || []).filter(function(m) { return m.effectiveRole === 'child' })
       var children = (self.children || []).filter(function(m) { return m.effectiveRole === 'child' })
       if (children.length === 0) {
       if (children.length === 0) {
         self.familyFeed = []
         self.familyFeed = []
         return
         return
       }
       }
-      var promises = children.map(function(child) {
-        return getTaskHistory(child.id, 1, 3).then(function(res) {
-          var tasks = []
-          if (res.code === 200) {
-            var data = res.data
-            tasks = (data && data.records) ? data.records : (Array.isArray(data) ? data : [])
+      var child = children[0]
+      getTaskHistory(child.id, 1, 3).then(function(res) {
+        var tasks = []
+        if (res.code === 200) {
+          var data = res.data
+          tasks = (data && data.records) ? data.records : (Array.isArray(data) ? data : [])
+        }
+        var feed = tasks.filter(function(t) { return t.status === 'completed' }).map(function(t) {
+          var points = t.pointsEarned || t.points || 0
+          var timeStr = ''
+          if (t.completedAt && typeof t.completedAt === 'string') {
+            timeStr = t.completedAt.substring(11, 16)
           }
           }
-          return tasks.filter(function(t) { return t.status === 'completed' }).map(function(t) {
-            var points = t.pointsEarned || t.points || 0
-            var timeStr = ''
-            if (t.completedAt && typeof t.completedAt === 'string') {
-              timeStr = t.completedAt.substring(11, 16)
-            }
-            return {
-              text: '✅ ' + (child.nickname || '小名') + ' 完成「' + (t.title || '任务') + '」 +' + points + '分',
-              time: timeStr,
-              type: 'task'
-            }
-          })
-        }).catch(function() { return [] })
-      })
-      Promise.all(promises).then(function(results) {
-        var all = []
-        for (var i = 0; i < results.length; i++) {
-          for (var j = 0; j < results[i].length; j++) {
-            all.push(results[i][j])
+          return {
+            text: '✅ ' + (child.nickname || '小名') + ' 完成「' + (t.title || '任务') + '」 +' + points + '分',
+            time: timeStr,
+            type: 'task'
           }
           }
-        }
-        self.familyFeed = all.slice(0, 10)
+        })
+        self.familyFeed = feed.slice(0, 10)
       }).catch(function() {
       }).catch(function() {
         self.familyFeed = []
         self.familyFeed = []
       })
       })