import { get, put } from '../../utils/request/index' /** 表单数据模型 */ interface MemberForm { name: string idCard: string gender: string age: string height: string weight: string /** 1=男 2=女 */ sex: number } /** * 编辑用户页 * 根据用户 dataType 区分非家庭/家庭两种编辑模式 */ Page({ data: { userId: '', /** dataType === 1 为家庭用户 */ isFamily: false, /** 单位(非家庭用户) */ workNo: '', /** 出生年月 YYYY-MM-DD(家庭用户) */ birthday: '', /** 接口返回的原始用户数据,提交时以此为 base 覆盖修改字段 */ rawUser: null as Record | null, form: { name: '', idCard: '', gender: '', age: '', height: '', weight: '', sex: 0, } as MemberForm, }, onLoad(options: Record) { const { userId } = options if (!userId) { wx.showToast({ title: '缺少用户信息', icon: 'none' }) setTimeout(() => wx.navigateBack(), 1500) return } this.setData({ userId }) get>('weighingScale/v3/select/userinfo/byId', { id: userId }, { loading: true }) .then((res: any) => { const u = res.result if (!u) return const isFamily = u.dataType === 1 const sex = u.sex ?? 0 const gender = sex === 1 ? '男' : sex === 2 ? '女' : '' const age = this.calcAge(u.birthday ?? '') this.setData({ rawUser: u, isFamily, workNo: u.workNo ?? '', birthday: u.birthday ?? '', 'form.name': u.realname ?? '', 'form.idCard': u.idCard ?? '', 'form.gender': gender, 'form.age': String(age), 'form.height': String(u.height ?? ''), 'form.weight': String(u.weight ?? ''), 'form.sex': sex, }) }) .catch(() => { wx.showToast({ title: '加载用户信息失败', icon: 'none' }) }) }, /** 从生日字符串计算周岁 */ calcAge(birthday: string): number { if (!birthday) return 0 const parts = birthday.split('-').map(Number) const [year, month, day] = parts if (!year || !month || !day) return 0 const now = new Date() let age = now.getFullYear() - year const nowMonth = now.getMonth() + 1 const nowDay = now.getDate() if (nowMonth < month || (nowMonth === month && nowDay < day)) age -= 1 return Math.max(0, age) }, onNameInput(e: WechatMiniprogram.Input) { this.setData({ 'form.name': e.detail.value }) }, onIdCardInput(e: WechatMiniprogram.Input) { this.setData({ 'form.idCard': (e.detail.value || '').trim().toUpperCase() }) }, /** 家庭用户性别切换 */ onGenderTap(e: WechatMiniprogram.TouchEvent) { const value = e.currentTarget.dataset.value as string const sex = value === '男' ? 1 : 2 this.setData({ 'form.gender': value, 'form.sex': sex, }) }, onHeightInput(e: WechatMiniprogram.Input) { this.setData({ 'form.height': e.detail.value }) }, onWeightInput(e: WechatMiniprogram.Input) { this.setData({ 'form.weight': e.detail.value }) }, /** 出生年月变更,同步更新年龄 */ onBirthdayChange(e: WechatMiniprogram.PickerChange) { const birthday = e.detail.value as string const age = this.calcAge(birthday) this.setData({ birthday, 'form.age': String(age), }) }, onCancel() { wx.navigateBack() }, onSubmit() { const { name, idCard, gender, height, weight, sex } = this.data.form const { isFamily, rawUser } = this.data const heightNum = parseFloat(height) const weightNum = parseFloat(weight) // 昵称(仅家庭用户必填) if (isFamily && !name.trim()) { wx.showToast({ title: '请填写昵称', icon: 'none' }) return } // 家庭用户性别必选 if (isFamily && !gender) { wx.showToast({ title: '请选择性别', icon: 'none' }) return } // 家庭用户出生年月必填 if (isFamily && !this.data.birthday.trim()) { wx.showToast({ title: '请填写出生年月', icon: 'none' }) return } if (!height || isNaN(heightNum) || heightNum <= 0) { wx.showToast({ title: '请填写身高', icon: 'none' }) return } const connectDeviceInfoRaw = wx.getStorageSync('connectDeviceInfo') // 以接口原始返回为 base,覆盖编辑后的字段 const payload: Record = { ...(rawUser ?? {}), id: this.data.userId, realname: name.trim(), idCard, sex: this.data.form.sex, birthday: this.data.birthday, height: heightNum, weight: isNaN(weightNum) ? 0 : weightNum, connectDeviceInfo: connectDeviceInfoRaw ? JSON.stringify(connectDeviceInfoRaw) : (rawUser?.connectDeviceInfo ?? ''), } put('weighingScale/v3/edit/user', payload) .then(() => { wx.showToast({ title: '保存成功', icon: 'success' }) setTimeout(() => { const pages = getCurrentPages() const prevPage = pages[pages.length - 2] as any if (prevPage && prevPage.data?.sn) { prevPage._loadData(prevPage.data.sn) } wx.navigateBack() }, 1500) }) .catch(() => { wx.showToast({ title: '保存失败,请重试', icon: 'none' }) }) } })