liyuliangjiazai 3 місяців тому
батько
коміт
b076424e1d

+ 107 - 0
code/ajyApp/pages/device/deviceInfo/mixins/plan-mixin.js

@@ -0,0 +1,107 @@
+/**
+ * 方案管理 mixin
+ * 负责:方案列表加载、子方案选择、模式切换时刷新方案
+ */
+import { getCareList, getCareDetail } from '@/utils/api/care.js'
+
+export default {
+	data() {
+		return {
+			planList: [], // 当前模式下的方案列表
+			selectedPlan: null, // 当前选中的方案 { id, name, description }
+			isShowPlanDrawer: false, // 方案选择弹窗
+			planLoading: false
+		}
+	},
+	methods: {
+		/**
+		 * 切换模式 - 覆盖原始changeMode,加入方案加载逻辑
+		 */
+		changeMode(mode) {
+			this.isShowDrawer2 = false
+			if (this.modeType === mode) return
+			this.modeType = mode
+			// 切换模式时重置方案选择
+			this.selectedPlan = null
+			this.planList = []
+			// 非休闲模式加载对应方案列表
+			if (mode !== 0) {
+				this.loadPlanList(mode)
+			}
+			// 停止音频(休闲模式专属)
+			if (mode !== 0 && this._stopAudioOnModeChange) {
+				this._stopAudioOnModeChange()
+			}
+		},
+
+		/**
+		 * 加载指定模式的方案列表
+		 * @param {Number} mode - 1专业 2自定义 3专家
+		 */
+		async loadPlanList(mode) {
+			this.planLoading = true
+			try {
+				// modeType映射为后端模式标识
+				const modeMap = {
+					1: 'PROFESSIONAL',
+					2: 'CUSTOM',
+					3: 'EXPERT'
+				}
+				const res = await getCareList({ modeType: modeMap[mode] || '' })
+				if (res && res.records) {
+					this.planList = res.records.map(item => ({
+						id: item.id,
+						name: item.title || item.name || '未命名方案',
+						description: item.description || item.remark || '',
+						steps: item.stepCount || item.steps || 0,
+						duration: item.totalDuration || 0
+					}))
+				} else {
+					this.planList = []
+				}
+			} catch (e) {
+				console.error('加载方案列表失败', e)
+				this.planList = []
+			}
+			this.planLoading = false
+		},
+
+		/** 打开方案选择弹窗 */
+		showPlanDrawer() {
+			if (this.planList.length === 0 && this.modeType !== 0) {
+				this.loadPlanList(this.modeType)
+			}
+			this.isShowPlanDrawer = true
+		},
+
+		/** 选择方案 */
+		selectPlan(plan) {
+			this.selectedPlan = plan
+			this.isShowPlanDrawer = false
+			// 选中方案后,可在此触发方案数据加载到curCase
+			this._applyPlanToCase(plan)
+		},
+
+		/**
+		 * 将方案数据应用到当前穴位配置
+		 * TODO: 后续对接方案详情接口,获取具体步骤和穴位坐标
+		 */
+		async _applyPlanToCase(plan) {
+			if (!plan || !plan.id) return
+			try {
+				const res = await getCareDetail(plan.id)
+				if (res && res.steps) {
+					this.curCase = res.steps.map(step => ({
+						id: step.acupointId || step.id,
+						time: step.duration || 15,
+						_x: step.x || 0,
+						_y: step.y || 0
+					}))
+					this.curCaseIndex = 0
+				}
+			} catch (e) {
+				console.error('加载方案详情失败', e)
+			}
+		}
+	}
+}

+ 29 - 0
code/ajyApp/utils/api/care.js

@@ -0,0 +1,29 @@
+/**
+ * 调理方案模块 API
+ */
+import http from '@/utils/http'
+
+/**
+ * 获取调理方案列表(分页)
+ * @param {Object} params - { modeType, page, size }
+ * @param {string} params.modeType - 模式标识: PROFESSIONAL / CUSTOM / EXPERT
+ * @param {number} [params.page=0] - 页码
+ * @param {number} [params.size=100] - 每页数量
+ * @returns {Promise<{records, total}>}
+ */
+export function getCareList(params = {}) {
+	return http.post('/userCare/careList', {
+		page: params.page || 0,
+		size: params.size || 100,
+		modeType: params.modeType || ''
+	})
+}
+
+/**
+ * 获取调理方案详情
+ * @param {string|number} id - 方案ID
+ * @returns {Promise<{steps: Array}>}
+ */
+export function getCareDetail(id) {
+	return http.get('/userCare/careDetail', { data: { id } })
+}