| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- /**
- * 五行能量沙盘 — 成员切换与数值解析工具。
- *
- * 沙盘里的数据有三类:
- * - personalData:当前登录用户(或个人视角)的沙盘数据
- * - members:家庭沙盘返回的所有成员数据
- * - familyScores:家庭聚合数据
- *
- * 组件只负责渲染,成员列表、当前选中项和最终展示分数都通过这里的纯函数解析,
- * 避免“切换了成员但数值仍是本人”的问题。
- */
- function scoreOf(data) {
- return {
- body: data && data.bodyScore != null ? data.bodyScore : 0,
- mind: data && data.mindScore != null ? data.mindScore : 0,
- wisdom: data && data.wisdomScore != null ? data.wisdomScore : 0,
- action: data && data.actionScore != null ? data.actionScore : 0,
- wealth: data && data.wealthScore != null ? data.wealthScore : 0
- }
- }
- function memberKey(member) {
- if (!member) return ''
- if (member.memberId != null) {
- return String(member.memberId) + '|' + String(member.memberType || '')
- }
- return 'name|' + String(member.name || '')
- }
- export function dedupeMembers(members) {
- const list = Array.isArray(members) ? members : []
- const seen = {}
- const result = []
- for (let i = 0; i < list.length; i++) {
- const member = list[i]
- if (!member) continue
- const key = memberKey(member)
- if (seen[key]) continue
- seen[key] = true
- result.push(member)
- }
- return result
- }
- export function getSelfMember(personalData) {
- if (!personalData || !Array.isArray(personalData.members) || !personalData.members.length) {
- return null
- }
- return personalData.members[0]
- }
- export function findMemberById(members, memberId) {
- if (memberId == null) return null
- const list = dedupeMembers(members)
- for (let i = 0; i < list.length; i++) {
- if (String(list[i].memberId) === String(memberId)) return list[i]
- }
- return null
- }
- export function buildMemberOptions(members, personalData) {
- const self = getSelfMember(personalData)
- const selfId = self && self.memberId != null ? String(self.memberId) : null
- const options = [{
- key: 'personal',
- label: '本人',
- viewMode: 'personal',
- memberId: self && self.memberId != null ? self.memberId : null,
- member: null
- }]
- const list = dedupeMembers(members)
- for (let i = 0; i < list.length; i++) {
- const member = list[i]
- if (selfId != null && String(member.memberId) === selfId) continue
- options.push({
- key: 'member-' + memberKey(member),
- label: member.name || '家庭成员',
- viewMode: 'member',
- memberId: member.memberId,
- member
- })
- }
- options.push({
- key: 'family',
- label: '全家',
- viewMode: 'family',
- memberId: null,
- member: null
- })
- return options
- }
- export function resolveSandboxScores(viewMode, familyScores, personalData, currentMember) {
- let source = personalData
- if (viewMode === 'family') {
- source = familyScores
- } else if (viewMode === 'member' && currentMember) {
- source = currentMember
- }
- const s = scoreOf(source)
- return [s.body, s.mind, s.wisdom, s.action, s.wealth]
- }
- export function resolveSandboxOverall(viewMode, familyScores, personalData, currentMember) {
- let source = personalData
- if (viewMode === 'family') {
- source = familyScores
- } else if (viewMode === 'member' && currentMember) {
- source = currentMember
- }
- return source && source.overallScore != null ? source.overallScore : 0
- }
- /**
- * 太极图中心点击:本人 -> 其他成员 -> 全家 -> 本人。
- * 找不到当前项时从第一项重新开始,保证不会卡死。
- */
- export function nextSandboxSelection(options, viewMode, memberId) {
- const list = Array.isArray(options) && options.length ? options : [
- { key: 'personal', label: '本人', viewMode: 'personal', memberId: null },
- { key: 'family', label: '全家', viewMode: 'family', memberId: null }
- ]
- let current = -1
- for (let i = 0; i < list.length; i++) {
- const option = list[i]
- if (option.viewMode !== viewMode) continue
- if (viewMode === 'member' && String(option.memberId) !== String(memberId)) continue
- current = i
- break
- }
- const next = list[(current + 1) % list.length]
- return {
- viewMode: next.viewMode,
- memberId: next.memberId != null ? next.memberId : null,
- label: next.label
- }
- }
|