From 9b011b82a74614e6aa59e83fb1b6658dc5294014 Mon Sep 17 00:00:00 2001 From: 17792275749 <812100002@qq.com> Date: Fri, 12 Jun 2026 08:33:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(editMember):=20=E5=AE=B6=E5=BA=AD=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=BC=96=E8=BE=91=E6=97=B6=E6=8E=A5=E5=85=A5=E8=BA=AB?= =?UTF-8?q?=E4=BB=BD=E8=AF=81=E6=9F=A5=E8=AF=A2=E4=B8=8E=E7=A1=AE=E8=AE=A4?= =?UTF-8?q?=E5=BC=B9=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- miniprogram/pages/editMember/editMember.json | 5 +- miniprogram/pages/editMember/editMember.ts | 184 ++++++++++++++++++- miniprogram/pages/editMember/editMember.wxml | 8 +- 3 files changed, 191 insertions(+), 6 deletions(-) diff --git a/miniprogram/pages/editMember/editMember.json b/miniprogram/pages/editMember/editMember.json index 238b4ac..00a9a93 100644 --- a/miniprogram/pages/editMember/editMember.json +++ b/miniprogram/pages/editMember/editMember.json @@ -1,3 +1,6 @@ { - "navigationBarTitleText": "编辑用户" + "navigationBarTitleText": "编辑用户", + "usingComponents": { + "user-info-confirm-modal": "/components/userInfoConfirmModal/userInfoConfirmModal" + } } diff --git a/miniprogram/pages/editMember/editMember.ts b/miniprogram/pages/editMember/editMember.ts index 48da46a..601f84c 100644 --- a/miniprogram/pages/editMember/editMember.ts +++ b/miniprogram/pages/editMember/editMember.ts @@ -1,4 +1,33 @@ import { get, put } from '../../utils/request/index' +import { lefuService } from '../../lefu/index' + +/** GET /weighingScale/v3/getUserInfoByIdcard 返回的 result 结构 */ +interface UserInfoFromServer { + id: string | null + userId: string + parentUserId: string | null + scaleDeviceId: string + deviceId: string | null + deviceType: string + dataType: number + userType: string | null + idCard: string + height: number + weight: number + birthday: string + sex: number + avatar: string | null + phone: string + thirdId: string | null + realname: string + bmi: number + workNo: string + remark: string | null + relationType: string | null + sn: string + delFlag: number + sex_dictText: string +} /** 表单数据模型 */ interface MemberForm { @@ -12,6 +41,14 @@ interface MemberForm { sex: number } +/** 身份证解析结果 */ +interface IdCardParsed { + gender: string + age: string + sex: number + birthday: string +} + /** * 编辑用户页 * 根据用户 dataType 区分非家庭/家庭两种编辑模式 @@ -27,6 +64,16 @@ Page({ birthday: '', /** 接口返回的原始用户数据,提交时以此为 base 覆盖修改字段 */ rawUser: null as Record | null, + /** 正在请求身份证查询接口 */ + querying: false, + /** 是否已完成一次身份证查询 */ + hasQueried: false, + /** 接口返回的用户信息 */ + serverResult: null as UserInfoFromServer | null, + /** 表单只读状态(code=101 时置为 true) */ + readonly: false, + /** 是否显示确认弹框 */ + showConfirmModal: false, form: { name: '', @@ -90,11 +137,33 @@ Page({ }, onNameInput(e: WechatMiniprogram.Input) { - this.setData({ 'form.name': e.detail.value }) + const name = e.detail.value + this.setData({ + 'form.name': name, + 'form.gender': '', + 'form.age': '', + serverResult: null, + hasQueried: false, + readonly: false + }) + if (this.data.isFamily && name.trim() && this.isIdCardValid(this.data.form.idCard)) { + this.fetchUserInfoByIdCard(name.trim(), this.data.form.idCard) + } }, onIdCardInput(e: WechatMiniprogram.Input) { - this.setData({ 'form.idCard': (e.detail.value || '').trim().toUpperCase() }) + const idCard = (e.detail.value || '').trim().toUpperCase() + this.setData({ + 'form.idCard': idCard, + 'form.gender': '', + 'form.age': '', + serverResult: null, + hasQueried: false, + readonly: false + }) + if (this.data.isFamily && this.data.form.name.trim() && this.isIdCardValid(idCard)) { + this.fetchUserInfoByIdCard(this.data.form.name.trim(), idCard) + } }, /** 家庭用户性别切换 */ @@ -115,6 +184,113 @@ Page({ this.setData({ 'form.weight': e.detail.value }) }, + isIdCardValid(idCard: string): boolean { + return /^\d{17}[\dX]$/.test(idCard) + }, + + parseIdCard(idCard: string): IdCardParsed { + const empty: IdCardParsed = { gender: '', age: '', sex: 0, birthday: '' } + if (!this.isIdCardValid(idCard)) return empty + + const genderCode = parseInt(idCard.charAt(16), 10) + const sex = genderCode % 2 === 1 ? 1 : 2 + const gender = sex === 1 ? '男' : '女' + + const year = parseInt(idCard.substr(6, 4), 10) + const month = parseInt(idCard.substr(10, 2), 10) + const day = parseInt(idCard.substr(12, 2), 10) + if (!year || month < 1 || month > 12 || day < 1 || day > 31) return empty + + const now = new Date() + let age = now.getFullYear() - year + if (now.getMonth() + 1 < month || (now.getMonth() + 1 === month && now.getDate() < day)) age -= 1 + if (age < 0 || age > 150) return empty + + const mm = String(month).padStart(2, '0') + const dd = String(day).padStart(2, '0') + return { gender, age: String(age), sex, birthday: `${year}-${mm}-${dd}` } + }, + + fetchUserInfoByIdCard(name: string, idCard: string) { + if (this.data.querying) return + this.setData({ querying: true, serverResult: null, hasQueried: false }) + + get('weighingScale/v3/getUserInfoByIdcard', { + sn: lefuService.deviceInfo?.serialNumber ?? '', + idCard, + realname: name + }, { loading: true }) + .then(res => { + const serverResult = res.result + if (!serverResult) { + wx.showToast({ title: res.message || '未查询到用户信息', icon: 'none' }) + const parsed = this.parseIdCard(idCard) + this.setData({ + hasQueried: true, + 'form.gender': parsed.gender, + 'form.age': parsed.age, + }) + return + } + if (serverResult.flag == 101) { + const parsed = this.parseIdCard(serverResult.idCard) + this.setData({ + serverResult, + hasQueried: true, + readonly: true, + showConfirmModal: true, + 'form.name': serverResult.realname ?? '', + 'form.idCard': serverResult.idCard ?? '', + 'form.gender': parsed.gender, + 'form.age': parsed.age, + 'form.height': serverResult.height ? String(serverResult.height) : '', + 'form.weight': serverResult.weight ? String(serverResult.weight) : '' + }) + return + } + if (serverResult.flag === null) { + const parsed = this.parseIdCard(serverResult.idCard) + const data: Record = { + serverResult, + hasQueried: true, + 'form.gender': parsed.gender, + 'form.age': parsed.age + } + if (serverResult.height) { + data['form.height'] = String(serverResult.height) + } + if (serverResult.weight) { + data['form.weight'] = String(serverResult.weight) + } + this.setData(data) + } + }) + .catch(() => {}) + .finally(() => { + this.setData({ querying: false }) + }) + }, + + onConfirmModalConfirm() { + this.setData({ showConfirmModal: false }) + this.onSubmit() + }, + + onConfirmModalCancel() { + this.setData({ + showConfirmModal: false, + readonly: false, + 'form.name': '', + 'form.idCard': '', + 'form.gender': '', + 'form.age': '', + 'form.height': '', + 'form.weight': '', + serverResult: null, + hasQueried: false, + }) + }, + /** 出生年月变更,同步更新年龄 */ onBirthdayChange(e: WechatMiniprogram.PickerChange) { const birthday = e.detail.value as string @@ -157,9 +333,11 @@ Page({ const connectDeviceInfoRaw = wx.getStorageSync('connectDeviceInfo') - // 以接口原始返回为 base,覆盖编辑后的字段 + // 以接口原始返回 + 身份证查询结果为 base,覆盖编辑后的字段 + const serverResult = this.data.serverResult const payload: Record = { ...(rawUser ?? {}), + ...(serverResult ?? {}), id: this.data.userId, realname: name.trim(), idCard, diff --git a/miniprogram/pages/editMember/editMember.wxml b/miniprogram/pages/editMember/editMember.wxml index a24cba4..b999132 100644 --- a/miniprogram/pages/editMember/editMember.wxml +++ b/miniprogram/pages/editMember/editMember.wxml @@ -102,7 +102,7 @@ * - + @@ -112,7 +112,7 @@ 身份证号码 - + @@ -183,4 +183,8 @@ 取消 保存用户信息 + + + +