|
|
@@ -46,6 +46,19 @@
|
|
|
<view class="section-title">📋 健康问卷</view>
|
|
|
<view class="hint-text">填写健康现状,方案将参考这些信息。可跳过,但填写后方案更精准。</view>
|
|
|
|
|
|
+ <!-- 多成员分别填写:成员切换 tab -->
|
|
|
+ <view class="member-tabs" v-if="selectedMembers.length > 1">
|
|
|
+ <view v-for="m in selectedMembers" :key="m.memberId"
|
|
|
+ class="member-tab" :class="{ active: m.memberId === activeFormMemberId }"
|
|
|
+ @click="switchMember(m.memberId)">
|
|
|
+ <text>{{ m.name }}</text>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="form-member-hint" v-if="selectedMembers.length > 1">
|
|
|
+ <text class="form-member-label">正在为「{{ currentMemberName }}」填写</text>
|
|
|
+ <text class="form-member-save">每个成员独立保存,切换后自动保留</text>
|
|
|
+ </view>
|
|
|
+
|
|
|
<!-- 基础体征 -->
|
|
|
<view class="form-section">
|
|
|
<view class="form-title">基础体征</view>
|
|
|
@@ -364,6 +377,9 @@ export default {
|
|
|
medRows: [{ name: '', startDate: '', durationText: '', time: '' }],
|
|
|
currentMonth: '',
|
|
|
monthEnd: '',
|
|
|
+ // 多成员分别填写:memberId → 各自的表单快照 { form, lipidCholesterol, selectedDiseases, medRows }
|
|
|
+ memberFormMap: {},
|
|
|
+ activeFormMemberId: '',
|
|
|
// 方案数据
|
|
|
planData: {},
|
|
|
sections: {
|
|
|
@@ -412,6 +428,27 @@ export default {
|
|
|
},
|
|
|
selectedNames: function() {
|
|
|
return this.selectedDiseases.map(function(d) { return d.name })
|
|
|
+ },
|
|
|
+ selectedMembers: function() {
|
|
|
+ var self = this
|
|
|
+ var out = []
|
|
|
+ this.selectedMemberIds.forEach(function(id) {
|
|
|
+ var found = null
|
|
|
+ for (var i = 0; i < self.executors.length; i++) {
|
|
|
+ if (String(self.executors[i].memberId) === String(id)) { found = self.executors[i]; break }
|
|
|
+ }
|
|
|
+ if (found) out.push(found)
|
|
|
+ })
|
|
|
+ return out
|
|
|
+ },
|
|
|
+ currentMemberName: function() {
|
|
|
+ var members = this.selectedMembers
|
|
|
+ for (var i = 0; i < members.length; i++) {
|
|
|
+ if (String(members[i].memberId) === String(this.activeFormMemberId)) {
|
|
|
+ return members[i].name
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return '成员'
|
|
|
}
|
|
|
},
|
|
|
onLoad: function(options) {
|
|
|
@@ -436,8 +473,7 @@ export default {
|
|
|
this.currentMonth = y + '-' + mStr
|
|
|
var lastDay = new Date(y, m, 0).getDate()
|
|
|
this.monthEnd = y + '-' + mStr + '-' + (lastDay < 10 ? '0' + lastDay : '' + lastDay)
|
|
|
- // 加载健康问卷已有数据
|
|
|
- this.loadHealthForm()
|
|
|
+ // 注意:健康问卷数据由 loadExecutors 内按成员异步加载(含当前成员快照恢复),此处不重复调用
|
|
|
// 自动执行
|
|
|
if (options.autoExecute === '1') {
|
|
|
setTimeout(function() { self.doAutoExecute() }, 1500)
|
|
|
@@ -464,6 +500,11 @@ export default {
|
|
|
} else {
|
|
|
self.selectedMemberIds = self.selectedMemberIds.map(function(id) { return String(id) })
|
|
|
}
|
|
|
+ // 默认当前填写成员为第一个选中成员
|
|
|
+ if (!self.activeFormMemberId || self.selectedMemberIds.indexOf(String(self.activeFormMemberId)) < 0) {
|
|
|
+ self.activeFormMemberId = self.selectedMemberIds[0] || ''
|
|
|
+ }
|
|
|
+ self.loadHealthForm(self.activeFormMemberId)
|
|
|
}
|
|
|
self._executorsLoaded = true
|
|
|
}).catch(function() { self.executors = []; self._executorsLoaded = true })
|
|
|
@@ -495,23 +536,81 @@ export default {
|
|
|
this.generatePlan()
|
|
|
},
|
|
|
|
|
|
- // ===== 健康问卷方法 (从 health-status-form.vue 移植) =====
|
|
|
- loadHealthForm: function() {
|
|
|
+ // ===== 健康问卷方法 (从 health-status-form.vue 移植,支持按成员加载) =====
|
|
|
+ loadHealthForm: function(memberId) {
|
|
|
var self = this
|
|
|
- getHealthStatus().then(function(res) {
|
|
|
+ var mid = memberId || self.activeFormMemberId || ''
|
|
|
+ // 已有该成员的本地快照 → 直接恢复
|
|
|
+ if (mid && self.memberFormMap[mid]) {
|
|
|
+ self.applyFormSnapshot(self.memberFormMap[mid])
|
|
|
+ return
|
|
|
+ }
|
|
|
+ getHealthStatus(mid || undefined).then(function(res) {
|
|
|
if (res && res.code === 200 && res.data) {
|
|
|
var d = res.data
|
|
|
- self.form.heightCm = d.heightCm || ''
|
|
|
- self.form.weightKg = d.weightKg || ''
|
|
|
- self.form.bloodPressure = d.bloodPressure || ''
|
|
|
- self.form.bloodGlucose = d.bloodGlucose || ''
|
|
|
- self.form.notes = d.notes || ''
|
|
|
- self.lipidCholesterol = self.parseLipidCholesterol(d.bloodLipids)
|
|
|
- self.loadDiseases(d.diseaseHistory)
|
|
|
- self.medRows = self.parseMeds(d.medications)
|
|
|
+ var snapshot = {
|
|
|
+ form: {
|
|
|
+ heightCm: d.heightCm || '',
|
|
|
+ weightKg: d.weightKg || '',
|
|
|
+ bloodPressure: d.bloodPressure || '',
|
|
|
+ bloodGlucose: d.bloodGlucose || '',
|
|
|
+ notes: d.notes || ''
|
|
|
+ },
|
|
|
+ lipidCholesterol: self.parseLipidCholesterol(d.bloodLipids),
|
|
|
+ selectedDiseases: [],
|
|
|
+ medRows: self.parseMeds(d.medications)
|
|
|
+ }
|
|
|
+ self.memberFormMap[mid || '__account'] = snapshot
|
|
|
+ self.loadDiseasesInto(snapshot.selectedDiseases, d.diseaseHistory)
|
|
|
+ if (mid) self.applyFormSnapshot(snapshot)
|
|
|
+ else self.applyFormSnapshot({
|
|
|
+ form: snapshot.form,
|
|
|
+ lipidCholesterol: snapshot.lipidCholesterol,
|
|
|
+ selectedDiseases: snapshot.selectedDiseases,
|
|
|
+ medRows: snapshot.medRows
|
|
|
+ })
|
|
|
}
|
|
|
}).catch(function() {})
|
|
|
},
|
|
|
+ // 切换成员时先保存当前编辑内容,再加载目标成员快照
|
|
|
+ switchMember: function(memberId) {
|
|
|
+ var self = this
|
|
|
+ if (String(memberId) === String(self.activeFormMemberId)) return
|
|
|
+ // 保存当前成员到快照
|
|
|
+ self.memberFormMap[self.activeFormMemberId || '__account'] = {
|
|
|
+ form: JSON.parse(JSON.stringify(self.form)),
|
|
|
+ lipidCholesterol: self.lipidCholesterol,
|
|
|
+ selectedDiseases: JSON.parse(JSON.stringify(self.selectedDiseases)),
|
|
|
+ medRows: JSON.parse(JSON.stringify(self.medRows))
|
|
|
+ }
|
|
|
+ self.activeFormMemberId = String(memberId)
|
|
|
+ // 目标成员已有快照 → 恢复;无则按该成员从服务端加载
|
|
|
+ if (self.memberFormMap[self.activeFormMemberId]) {
|
|
|
+ self.applyFormSnapshot(self.memberFormMap[self.activeFormMemberId])
|
|
|
+ } else {
|
|
|
+ self.resetFormFields()
|
|
|
+ self.loadHealthForm(self.activeFormMemberId)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ applyFormSnapshot: function(snapshot) {
|
|
|
+ if (!snapshot) return
|
|
|
+ this.form = JSON.parse(JSON.stringify(snapshot.form || {}))
|
|
|
+ this.lipidCholesterol = snapshot.lipidCholesterol || ''
|
|
|
+ this.selectedDiseases = JSON.parse(JSON.stringify(snapshot.selectedDiseases || []))
|
|
|
+ this.medRows = snapshot.medRows && snapshot.medRows.length > 0 ? JSON.parse(JSON.stringify(snapshot.medRows)) : [{ name: '', startDate: '', durationText: '', time: '' }]
|
|
|
+ var self = this
|
|
|
+ this.selectedDiseases.forEach(function(item) {
|
|
|
+ var gk = self.findGroupKey(item.name)
|
|
|
+ if (gk && self.expandedGroups.indexOf(gk) < 0) self.expandedGroups.push(gk)
|
|
|
+ })
|
|
|
+ },
|
|
|
+ resetFormFields: function() {
|
|
|
+ this.form = { heightCm: '', weightKg: '', bloodPressure: '', bloodGlucose: '', notes: '' }
|
|
|
+ this.lipidCholesterol = ''
|
|
|
+ this.selectedDiseases = []
|
|
|
+ this.medRows = [{ name: '', startDate: '', durationText: '', time: '' }]
|
|
|
+ this.diseaseInput = ''
|
|
|
+ },
|
|
|
parseLipidCholesterol: function(json) {
|
|
|
try {
|
|
|
var arr = JSON.parse(json || '[]')
|
|
|
@@ -521,14 +620,14 @@ export default {
|
|
|
} catch (e) {}
|
|
|
return ''
|
|
|
},
|
|
|
- loadDiseases: function(json) {
|
|
|
+ loadDiseasesInto: function(targetList, json) {
|
|
|
var self = this
|
|
|
try {
|
|
|
var arr = JSON.parse(json || '[]')
|
|
|
if (arr instanceof Array) {
|
|
|
arr.forEach(function(item) {
|
|
|
if (item.name && self.selectedNames.indexOf(item.name) < 0) {
|
|
|
- self.selectedDiseases.push({
|
|
|
+ targetList.push({
|
|
|
name: item.name,
|
|
|
diagnosedAt: item.diagnosedAt || '',
|
|
|
custom: false
|
|
|
@@ -647,19 +746,25 @@ export default {
|
|
|
removeMed: function(idx) {
|
|
|
if (this.medRows.length > 1) this.medRows.splice(idx, 1)
|
|
|
},
|
|
|
- buildHealthPayload: function() {
|
|
|
+ buildHealthPayload: function(snapshot) {
|
|
|
+ var s = snapshot || {
|
|
|
+ form: this.form,
|
|
|
+ lipidCholesterol: this.lipidCholesterol,
|
|
|
+ selectedDiseases: this.selectedDiseases,
|
|
|
+ medRows: this.medRows
|
|
|
+ }
|
|
|
var lipids = []
|
|
|
- if (this.lipidCholesterol) {
|
|
|
- lipids.push({ name: '总胆固醇', value: parseFloat(this.lipidCholesterol), unit: 'mmol/L', note: '' })
|
|
|
+ if (s.lipidCholesterol) {
|
|
|
+ lipids.push({ name: '总胆固醇', value: parseFloat(s.lipidCholesterol), unit: 'mmol/L', note: '' })
|
|
|
}
|
|
|
var diseases = []
|
|
|
- this.selectedDiseases.forEach(function(item) {
|
|
|
+ ;(s.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) {
|
|
|
+ ;(s.medRows || []).forEach(function(item) {
|
|
|
if (item.name) {
|
|
|
var m = { name: item.name }
|
|
|
if (item.startDate) m.startDate = item.startDate
|
|
|
@@ -669,33 +774,79 @@ export default {
|
|
|
}
|
|
|
})
|
|
|
var payload = {}
|
|
|
- if (this.form.heightCm) payload.heightCm = Number(this.form.heightCm)
|
|
|
- if (this.form.weightKg) payload.weightKg = Number(this.form.weightKg)
|
|
|
- if (this.form.bloodPressure) payload.bloodPressure = this.form.bloodPressure
|
|
|
- if (this.form.bloodGlucose) payload.bloodGlucose = Number(this.form.bloodGlucose)
|
|
|
+ if (s.form.heightCm) payload.heightCm = Number(s.form.heightCm)
|
|
|
+ if (s.form.weightKg) payload.weightKg = Number(s.form.weightKg)
|
|
|
+ if (s.form.bloodPressure) payload.bloodPressure = s.form.bloodPressure
|
|
|
+ if (s.form.bloodGlucose) payload.bloodGlucose = Number(s.form.bloodGlucose)
|
|
|
if (lipids.length > 0) payload.bloodLipids = JSON.stringify(lipids)
|
|
|
if (diseases.length > 0) payload.diseaseHistory = JSON.stringify(diseases)
|
|
|
if (meds.length > 0) payload.medications = JSON.stringify(meds)
|
|
|
- if (this.form.notes) payload.notes = this.form.notes
|
|
|
+ if (s.form.notes) payload.notes = s.form.notes
|
|
|
return payload
|
|
|
},
|
|
|
+ // 当前成员快照(无改动数据时返回 null)
|
|
|
+ snapshotForMember: function(memberId) {
|
|
|
+ var key = String(memberId)
|
|
|
+ // 优先用已保存的成员快照,其次当前活动表单
|
|
|
+ if (this.memberFormMap[key]) {
|
|
|
+ var s = this.memberFormMap[key]
|
|
|
+ var p = this.buildHealthPayload(s)
|
|
|
+ return this.hasPayload(p) ? p : null
|
|
|
+ }
|
|
|
+ // 活动成员直接用当前表单
|
|
|
+ if (key === String(this.activeFormMemberId)) {
|
|
|
+ var activePayload = this.buildHealthPayload()
|
|
|
+ return this.hasPayload(activePayload) ? activePayload : null
|
|
|
+ }
|
|
|
+ return null
|
|
|
+ },
|
|
|
+ hasPayload: function(payload) {
|
|
|
+ if (!payload) return false
|
|
|
+ return payload.heightCm || payload.weightKg || payload.bloodPressure || payload.bloodGlucose ||
|
|
|
+ payload.bloodLipids || payload.diseaseHistory || payload.medications || payload.notes
|
|
|
+ },
|
|
|
+ // 先保存当前活动成员的编辑内容到快照,再逐个成员保存健康档案,最后生成方案
|
|
|
saveAndGenerate: function() {
|
|
|
var self = this
|
|
|
- var payload = this.buildHealthPayload()
|
|
|
- // 血压格式校验
|
|
|
- if (this.form.bloodPressure && !/^\d{2,3}\/\d{2,3}$/.test(this.form.bloodPressure)) {
|
|
|
- uni.showToast({ title: '血压格式应为 120/80', icon: 'none' })
|
|
|
- return
|
|
|
+ // 保存当前活动成员到快照
|
|
|
+ if (self.activeFormMemberId) {
|
|
|
+ self.memberFormMap[self.activeFormMemberId] = {
|
|
|
+ form: JSON.parse(JSON.stringify(self.form)),
|
|
|
+ lipidCholesterol: self.lipidCholesterol,
|
|
|
+ selectedDiseases: JSON.parse(JSON.stringify(self.selectedDiseases)),
|
|
|
+ medRows: JSON.parse(JSON.stringify(self.medRows))
|
|
|
+ }
|
|
|
}
|
|
|
- self.loading = true
|
|
|
- saveHealthStatus(payload).then(function(res) {
|
|
|
- if (res && res.code === 200) {
|
|
|
- uni.showToast({ title: '健康信息已保存', icon: 'success' })
|
|
|
+ // 血压格式校验(检查所有成员)
|
|
|
+ var members = self.selectedMemberIds.slice()
|
|
|
+ for (var i = 0; i < members.length; i++) {
|
|
|
+ var payload = self.snapshotForMember(members[i])
|
|
|
+ if (payload && payload.bloodPressure && !/^\d{2,3}\/\d{2,3}$/.test(payload.bloodPressure)) {
|
|
|
+ uni.showToast({ title: '血压格式应为 120/80', icon: 'none' })
|
|
|
+ return
|
|
|
}
|
|
|
- // 无论保存是否成功,都继续生成方案
|
|
|
+ }
|
|
|
+ self.loading = true
|
|
|
+ var saveTasks = []
|
|
|
+ members.forEach(function(mid) {
|
|
|
+ var payload = self.snapshotForMember(mid)
|
|
|
+ if (!payload) return
|
|
|
+ payload.memberId = mid
|
|
|
+ saveTasks.push(saveHealthStatus(payload))
|
|
|
+ })
|
|
|
+ if (saveTasks.length === 0) {
|
|
|
+ // 无健康数据,直接生成方案
|
|
|
+ self.loading = false
|
|
|
+ self.generatePlan()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ Promise.all(saveTasks).then(function() {
|
|
|
+ uni.showToast({ title: '健康信息已保存', icon: 'success' })
|
|
|
+ self.loading = false
|
|
|
self.generatePlan()
|
|
|
}).catch(function() {
|
|
|
// 保存失败也继续生成
|
|
|
+ self.loading = false
|
|
|
self.generatePlan()
|
|
|
})
|
|
|
},
|
|
|
@@ -897,6 +1048,8 @@ export default {
|
|
|
this.diseaseInput = ''
|
|
|
this.medRows = [{ name: '', startDate: '', durationText: '', time: '' }]
|
|
|
this.expandedGroups = this.diseaseGroups.slice(0, 3).map(function(g) { return g.key })
|
|
|
+ this.memberFormMap = {}
|
|
|
+ this.activeFormMemberId = ''
|
|
|
this.loadExecutors()
|
|
|
},
|
|
|
goBack: function() {
|