/** * 职业与生活页 U07(Phase 04 P04-T22) * * 重构要点(遵循 AGENTS.md 不变量): * - 数据:profileService.getProfile + userStore.updateProfile(第 9 条) * - 草稿恢复:onLoad 读 ONBOARDING_DRAFT.lifestyle,保存前写回(验收条件"Draft退出后可恢复") * - 下一步:跳 profile-photos */ const { userStore, appStore } = require('../../stores'); const { profileService } = require('../../services'); const { ROUTE, STORAGE_KEYS } = require('../../constants'); const OCCUPATION_CATEGORY_OPTIONS = [ '机关事业单位', '教育', '医疗', '企业职员', '技术人员', '个体经营', '自由职业', '服务行业', '农业', '其他', ]; const WORK_REGION_OPTIONS = ['丹阳', '镇江市区', '镇江其他辖区', '南京', '不限']; const SMOKING_OPTIONS = [ { value: 'never', label: '不吸烟' }, { value: 'occasional', label: '偶尔' }, { value: 'often', label: '经常' }, ]; const DRINKING_OPTIONS = [ { value: 'never', label: '不饮酒' }, { value: 'occasional', label: '偶尔' }, { value: 'often', label: '经常' }, ]; const LONG_TERM_OPTIONS = [ { value: 'yes', label: '是' }, { value: 'no', label: '否' }, ]; const FUTURE_DANYANG_OPTIONS = [ { value: 'willing', label: '愿意' }, { value: 'uncertain', label: '不确定' }, { value: 'unwilling', label: '不愿意' }, ]; Page({ data: { statusBarHeight: 20, navBarHeight: 44, loading: false, saving: false, occupationCategory: '', workRegion: '', smokingStatus: '', drinkingStatus: '', longTermDanyang: '', futureDanyang: '', // 选项 occupationCategoryOptions: OCCUPATION_CATEGORY_OPTIONS, workRegionOptions: WORK_REGION_OPTIONS, smokingOptions: SMOKING_OPTIONS, drinkingOptions: DRINKING_OPTIONS, longTermOptions: LONG_TERM_OPTIONS, futureDanyangOptions: FUTURE_DANYANG_OPTIONS, occupationCategoryIndex: -1, workRegionIndex: -1, smokingIndex: -1, drinkingIndex: -1, longTermIndex: -1, futureDanyangIndex: -1, }, onLoad() { this._initSystemInfo(); this._applyDraft(); this.loadProfile(); }, _initSystemInfo() { try { const sysInfo = wx.getSystemInfoSync(); this.setData({ statusBarHeight: sysInfo.statusBarHeight || 20, navBarHeight: 44, }); } catch (e) { /* 使用默认值 */ } }, async loadProfile() { this.setData({ loading: true }); try { const profile = await profileService.getProfile(); this._mergeProfile(profile); } catch (err) { /* 首次填写无资料 */ } finally { this.setData({ loading: false }); } }, _mergeProfile(profile) { if (!profile) return; const d = this._readDraft(); const occupationCategory = d.occupationCategory || profile.occupationCategory || ''; const workRegion = d.workRegion || profile.workRegion || ''; const smokingStatus = d.smokingStatus || profile.smokingStatus || ''; const drinkingStatus = d.drinkingStatus || profile.drinkingStatus || ''; const longTermDanyang = d.longTermDanyang || profile.longTermDanyang || ''; const futureDanyang = d.futureDanyang || profile.futureDanyang || ''; this.setData({ occupationCategory, workRegion, smokingStatus, drinkingStatus, longTermDanyang, futureDanyang, occupationCategoryIndex: OCCUPATION_CATEGORY_OPTIONS.indexOf(occupationCategory), workRegionIndex: WORK_REGION_OPTIONS.indexOf(workRegion), smokingIndex: SMOKING_OPTIONS.findIndex((o) => o.value === smokingStatus), drinkingIndex: DRINKING_OPTIONS.findIndex((o) => o.value === drinkingStatus), longTermIndex: LONG_TERM_OPTIONS.findIndex((o) => o.value === longTermDanyang), futureDanyangIndex: FUTURE_DANYANG_OPTIONS.findIndex((o) => o.value === futureDanyang), }); }, // ============ 草稿 ============ _readDraft() { try { const draft = wx.getStorageSync(STORAGE_KEYS.ONBOARDING_DRAFT) || {}; return draft.lifestyle || {}; } catch (e) { return {}; } }, _applyDraft() { const d = this._readDraft(); if (!d || Object.keys(d).length === 0) return; this.setData({ occupationCategory: d.occupationCategory || '', workRegion: d.workRegion || '', smokingStatus: d.smokingStatus || '', drinkingStatus: d.drinkingStatus || '', longTermDanyang: d.longTermDanyang || '', futureDanyang: d.futureDanyang || '', occupationCategoryIndex: OCCUPATION_CATEGORY_OPTIONS.indexOf(d.occupationCategory || ''), workRegionIndex: WORK_REGION_OPTIONS.indexOf(d.workRegion || ''), smokingIndex: SMOKING_OPTIONS.findIndex((o) => o.value === (d.smokingStatus || '')), drinkingIndex: DRINKING_OPTIONS.findIndex((o) => o.value === (d.drinkingStatus || '')), longTermIndex: LONG_TERM_OPTIONS.findIndex((o) => o.value === (d.longTermDanyang || '')), futureDanyangIndex: FUTURE_DANYANG_OPTIONS.findIndex((o) => o.value === (d.futureDanyang || '')), }); }, _writeDraft() { try { const draft = wx.getStorageSync(STORAGE_KEYS.ONBOARDING_DRAFT) || {}; draft.lifestyle = { occupationCategory: this.data.occupationCategory, workRegion: this.data.workRegion, smokingStatus: this.data.smokingStatus, drinkingStatus: this.data.drinkingStatus, longTermDanyang: this.data.longTermDanyang, futureDanyang: this.data.futureDanyang, }; draft.currentStep = 'lifestyle'; wx.setStorageSync(STORAGE_KEYS.ONBOARDING_DRAFT, draft); } catch (e) { /* ignore */ } }, // ============ 表单交互 ============ onOccupationCategoryChange(e) { const idx = Number(e.detail.value); this.setData({ occupationCategoryIndex: idx, occupationCategory: OCCUPATION_CATEGORY_OPTIONS[idx] }); }, onWorkRegionChange(e) { const idx = Number(e.detail.value); this.setData({ workRegionIndex: idx, workRegion: WORK_REGION_OPTIONS[idx] }); }, onSmokingChange(e) { const idx = Number(e.detail.value); this.setData({ smokingIndex: idx, smokingStatus: SMOKING_OPTIONS[idx].value }); }, onDrinkingChange(e) { const idx = Number(e.detail.value); this.setData({ drinkingIndex: idx, drinkingStatus: DRINKING_OPTIONS[idx].value }); }, onLongTermChange(e) { const idx = Number(e.detail.value); this.setData({ longTermIndex: idx, longTermDanyang: LONG_TERM_OPTIONS[idx].value }); }, onFutureDanyangChange(e) { const idx = Number(e.detail.value); this.setData({ futureDanyangIndex: idx, futureDanyang: FUTURE_DANYANG_OPTIONS[idx].value }); }, // ============ 导航 ============ onBack() { this._writeDraft(); wx.navigateBack(); }, async onNext() { if (this.data.saving) return; const { occupationCategory, workRegion, smokingStatus, drinkingStatus, longTermDanyang, futureDanyang } = this.data; if (!occupationCategory) return appStore.toast('请选择职业类别'); if (!workRegion) return appStore.toast('请选择工作区域'); this.setData({ saving: true }); this._writeDraft(); try { await userStore.updateProfile({ occupationCategory, workRegion, smokingStatus, drinkingStatus, longTermDanyang, futureDanyang, }); this.setData({ saving: false }); wx.navigateTo({ url: ROUTE.ONBOARDING.PROFILE_PHOTOS }); } catch (err) { this.setData({ saving: false }); appStore.toastError(err, '保存失败'); } }, });