|
@@ -294,7 +294,7 @@ import shareMixin from '../../components/share-mixin.js'
|
|
|
export default {
|
|
export default {
|
|
|
mixins: [fontScaleMixin, shareMixin],
|
|
mixins: [fontScaleMixin, shareMixin],
|
|
|
components: { LoginGuideCard, DimensionActivities, DimensionProducts, ArticleBookshelf },
|
|
components: { LoginGuideCard, DimensionActivities, DimensionProducts, ArticleBookshelf },
|
|
|
- data() { return { memberId: '', todayDate: '', hasIncomplete: false, incompleteCount: 0, progressItems: [], recentTasks: [], streakDays: 0, activeChallenges: 0, completeness: 0, cautionCount: 0,
|
|
|
|
|
|
|
+ data() { return { memberId: '', todayDate: '', hasIncomplete: false, incompleteCount: 0, progressItems: [], recentTasks: [], todayTaskList: [], streakDays: 0, activeChallenges: 0, completeness: 0, cautionCount: 0,
|
|
|
healthArticles: [],
|
|
healthArticles: [],
|
|
|
growthArticles: [],
|
|
growthArticles: [],
|
|
|
isLoggedIn: false } },
|
|
isLoggedIn: false } },
|
|
@@ -330,6 +330,14 @@ export default {
|
|
|
var url = m[item.key]
|
|
var url = m[item.key]
|
|
|
// 情绪打卡已合并至 mind-detail 情绪打卡页,成长上下文需带上 memberId
|
|
// 情绪打卡已合并至 mind-detail 情绪打卡页,成长上下文需带上 memberId
|
|
|
if (url && item.key === 'emotion' && this.memberId) url = url + '?memberId=' + this.memberId
|
|
if (url && item.key === 'emotion' && this.memberId) url = url + '?memberId=' + this.memberId
|
|
|
|
|
+ // 健康打卡类(饮食/运动/睡眠):有当日未完成任务则补传 taskId+memberId,
|
|
|
|
|
+ // 打卡提交后后端据 taskId 回写任务进度/直接完成;无任务时退化为纯记录打卡
|
|
|
|
|
+ if (url && item.taskId && (item.key === 'diet' || item.key === 'exercise' || item.key === 'sleep')) {
|
|
|
|
|
+ var qs = 'taskId=' + item.taskId
|
|
|
|
|
+ var mid = item.taskMemberId || this.memberId
|
|
|
|
|
+ if (mid) qs = qs + '&memberId=' + mid
|
|
|
|
|
+ url = url + '?' + qs
|
|
|
|
|
+ }
|
|
|
if (url) uni.navigateTo({ url: url })
|
|
if (url) uni.navigateTo({ url: url })
|
|
|
},
|
|
},
|
|
|
getTaskKey: function(task, idx) { return (task && task.id) ? ('t' + task.id) : ('tk' + idx) },
|
|
getTaskKey: function(task, idx) { return (task && task.id) ? ('t' + task.id) : ('tk' + idx) },
|
|
@@ -339,13 +347,29 @@ export default {
|
|
|
if (!d) return ''
|
|
if (!d) return ''
|
|
|
return (d.getMonth() + 1) + '/' + d.getDate() + ' ' + this.pad(d.getHours()) + ':' + this.pad(d.getMinutes())
|
|
return (d.getMonth() + 1) + '/' + d.getDate() + ' ' + this.pad(d.getHours()) + ':' + this.pad(d.getMinutes())
|
|
|
},
|
|
},
|
|
|
|
|
+ /** 当日任务统一取数入口:一次请求供"今日成长打卡联动 taskId"与"今日任务预览"共用,避免同页重复调用 /api/tasks/today */
|
|
|
|
|
+ async fetchTodayTasks() {
|
|
|
|
|
+ var self = this
|
|
|
|
|
+ try {
|
|
|
|
|
+ var res = await getTodayTasks(self.memberId)
|
|
|
|
|
+ self.todayTaskList = (res && res.code === 200 && res.data) ? (res.data || []) : []
|
|
|
|
|
+ } catch(e) { self.todayTaskList = [] }
|
|
|
|
|
+ },
|
|
|
|
|
+ /** 按 actionType 取当日未完成任务(pending / in_progress),无则返回 null */
|
|
|
|
|
+ findTaskByAction: function(actionType) {
|
|
|
|
|
+ var list = this.todayTaskList || []
|
|
|
|
|
+ for (var i = 0; i < list.length; i++) {
|
|
|
|
|
+ var t = list[i]
|
|
|
|
|
+ if (!t || !t.id || t.actionType !== actionType) continue
|
|
|
|
|
+ if (t.status === 'pending' || t.status === 'in_progress') return t
|
|
|
|
|
+ }
|
|
|
|
|
+ return null
|
|
|
|
|
+ },
|
|
|
async loadRecentTasks() {
|
|
async loadRecentTasks() {
|
|
|
var self = this
|
|
var self = this
|
|
|
try {
|
|
try {
|
|
|
- var res = await getTodayTasks(self.memberId ? { memberId: self.memberId } : {})
|
|
|
|
|
- if (res && res.code === 200 && res.data) {
|
|
|
|
|
- self.recentTasks = (res.data || []).slice(0, 3)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if (!self.todayTaskList) await self.fetchTodayTasks()
|
|
|
|
|
+ self.recentTasks = (self.todayTaskList || []).slice(0, 3)
|
|
|
} catch(e) {}
|
|
} catch(e) {}
|
|
|
},
|
|
},
|
|
|
goActivityDetail: function(act) { uni.navigateTo({ url: '/pages/activity/activity-detail/activity-detail?id=' + act.id }) },
|
|
goActivityDetail: function(act) { uni.navigateTo({ url: '/pages/activity/activity-detail/activity-detail?id=' + act.id }) },
|
|
@@ -399,6 +423,8 @@ export default {
|
|
|
async loadProgressItems() {
|
|
async loadProgressItems() {
|
|
|
var self = this
|
|
var self = this
|
|
|
var items = []
|
|
var items = []
|
|
|
|
|
+ // 取当日未完成任务(pending / in_progress),供下方健康打卡项挂载 taskId
|
|
|
|
|
+ await self.fetchTodayTasks()
|
|
|
var dietDone = false
|
|
var dietDone = false
|
|
|
try {
|
|
try {
|
|
|
var dParams = self.memberId ? { memberId: self.memberId } : {}
|
|
var dParams = self.memberId ? { memberId: self.memberId } : {}
|
|
@@ -461,6 +487,20 @@ export default {
|
|
|
}
|
|
}
|
|
|
} catch(e) {}
|
|
} catch(e) {}
|
|
|
items.push({ key: 'checkin', icon: '💰', label: '记账', done: checkinDone, actionText: '去打卡' })
|
|
items.push({ key: 'checkin', icon: '💰', label: '记账', done: checkinDone, actionText: '去打卡' })
|
|
|
|
|
+ // 健康打卡类:挂载当日对应类型的未完成任务(actionType 同口径),
|
|
|
|
|
+ // 完成度判定仍以记录查询为准(上方 dietDone/exerciseDone/sleepDone),此处仅用于跳转联动
|
|
|
|
|
+ var actionTypeMap = { diet: 'diet', exercise: 'exercise', sleep: 'sleep' }
|
|
|
|
|
+ for (var ki = 0; ki < items.length; ki++) {
|
|
|
|
|
+ var it = items[ki]
|
|
|
|
|
+ if (!it) continue
|
|
|
|
|
+ var at = actionTypeMap[it.key]
|
|
|
|
|
+ if (!at) continue
|
|
|
|
|
+ var tk = self.findTaskByAction(at)
|
|
|
|
|
+ if (tk) {
|
|
|
|
|
+ it.taskId = tk.id
|
|
|
|
|
+ it.taskMemberId = tk.familyMemberId || tk.executorId || self.memberId
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
self.progressItems = items.filter(function(it) { return it && it.key })
|
|
self.progressItems = items.filter(function(it) { return it && it.key })
|
|
|
self.incompleteCount = 0
|
|
self.incompleteCount = 0
|
|
|
for (var pi = 0; pi < items.length; pi++) if (items[pi] && !items[pi].done) self.incompleteCount++
|
|
for (var pi = 0; pi < items.length; pi++) if (items[pi] && !items[pi].done) self.incompleteCount++
|