- 家庭用户:昵称(必填)、身份证(选填)、性别(切换按钮)、出生年月(date picker)、身高(必填)、体重(选填) - 非家庭用户:姓名、单位、性别、年龄只读展示,身高(必填)、体重(选填) - 提交时完整展开接口原始数据覆盖修改字段 - 去掉新增页专属的抽屉选择、确认弹框、身份证校验 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
190 lines
4.9 KiB
TypeScript
190 lines
4.9 KiB
TypeScript
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<string, any> | null,
|
|
|
|
form: {
|
|
name: '',
|
|
idCard: '',
|
|
gender: '',
|
|
age: '',
|
|
height: '',
|
|
weight: '',
|
|
sex: 0,
|
|
} as MemberForm,
|
|
},
|
|
|
|
onLoad(options: Record<string, string>) {
|
|
const { userId } = options
|
|
if (!userId) {
|
|
wx.showToast({ title: '缺少用户信息', icon: 'none' })
|
|
setTimeout(() => wx.navigateBack(), 1500)
|
|
return
|
|
}
|
|
this.setData({ userId })
|
|
get<Record<string, any>>('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<string, any> = {
|
|
...(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' })
|
|
})
|
|
}
|
|
})
|