ai-c/pages/medical-apply/medical-apply.js
2026-02-02 18:21:32 +08:00

316 lines
8.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// pages/medical-apply/medical-apply.js
// 陪诊就医申请页面
const api = require('../../utils/api')
Page({
data: {
statusBarHeight: 44,
navBarHeight: 44,
totalNavHeight: 88,
showForm: true,
applyStatus: 'none', // none, pending, approved, rejected
statusTitle: '',
statusDesc: '',
isReapply: false,
agreed: false,
formData: {
avatar: '',
realName: '',
gender: '',
age: '',
idCard: '',
city: '',
hospital: '',
healthCert: '',
idFront: '',
idBack: '',
otherCert: '',
introduction: '',
phone: '',
emergencyContact: '',
emergencyPhone: ''
},
canSubmit: false
},
onLoad(options) {
// 获取系统信息设置导航栏高度
const systemInfo = wx.getSystemInfoSync()
const statusBarHeight = systemInfo.statusBarHeight || 44
const menuButton = wx.getMenuButtonBoundingClientRect()
const navBarHeight = menuButton.height + (menuButton.top - statusBarHeight) * 2
const totalNavHeight = statusBarHeight + navBarHeight
this.setData({
statusBarHeight,
navBarHeight,
totalNavHeight,
isReapply: options.isReapply === 'true'
})
this.checkApplyStatus()
},
// 返回上一页
goBack() {
wx.navigateBack()
},
// 检查申请状态
async checkApplyStatus() {
const token = wx.getStorageSync('auth_token')
if (!token) {
this.setData({ applyStatus: 'none' })
return
}
wx.showLoading({ title: '加载中...' })
try {
// 调用陪诊就医申请状态API如果后端已实现
const res = await api.request('/medical/apply')
if (res.success && res.data) {
const data = res.data
if (data.status === 'approved') {
this.setData({
applyStatus: 'approved',
statusTitle: '申请已通过',
statusDesc: '恭喜您成为陪诊师!'
})
} else if (data.status === 'pending') {
this.setData({
applyStatus: 'pending',
statusTitle: '审核中',
statusDesc: '您的申请正在审核中,请耐心等待'
})
} else if (data.status === 'rejected') {
this.setData({
applyStatus: 'rejected',
statusTitle: '申请未通过',
statusDesc: data.rejectReason || '很抱歉,您的申请未通过审核'
})
}
}
} catch (err) {
console.log('获取申请状态失败可能API未实现:', err)
this.setData({ applyStatus: 'none' })
} finally {
wx.hideLoading()
}
},
// 重新申请
reapply() {
this.setData({
isReapply: true,
applyStatus: 'none'
})
},
// 选择头像
chooseAvatar() {
this.doChooseMedia('avatar')
},
// 上传证书
uploadCert(e) {
const type = e.currentTarget.dataset.type
this.doChooseMedia(type)
},
// 选择媒体文件
doChooseMedia(field) {
wx.chooseMedia({
count: 1,
mediaType: ['image'],
sourceType: ['album', 'camera'],
success: async (res) => {
const tempFilePath = res.tempFiles[0].tempFilePath
wx.showLoading({ title: '上传中...' })
try {
// 1. 自动压缩图片
const compressed = await wx.compressImage({
src: tempFilePath,
quality: 80
}).catch(err => {
console.warn('压缩图片失败:', err)
return { tempFilePath }
})
// 2. 上传到服务器,使用允许的目录 'image'
const uploadRes = await api.uploadFile(compressed.tempFilePath, 'image')
if (uploadRes.success && uploadRes.data) {
const fieldMap = {
'avatar': 'formData.avatar',
'idFront': 'formData.idFront',
'idBack': 'formData.idBack',
'healthCert': 'formData.healthCert',
'otherCert': 'formData.otherCert'
}
this.setData({
[fieldMap[field]]: uploadRes.data.url
})
this.checkCanSubmit()
wx.showToast({ title: '上传成功', icon: 'success' })
} else {
wx.showToast({
title: uploadRes.message || '上传失败',
icon: 'none'
})
}
} catch (err) {
console.error('上传过程出错:', err)
wx.showToast({
title: err.message || '上传出错',
icon: 'none'
})
} finally {
wx.hideLoading()
}
}
})
},
// 输入变化
onInputChange(e) {
const field = e.currentTarget.dataset.field
const value = e.detail.value
this.setData({
[`formData.${field}`]: value
})
this.checkCanSubmit()
},
// 选择性别
selectGender(e) {
const gender = e.currentTarget.dataset.gender
this.setData({
'formData.gender': gender
})
this.checkCanSubmit()
},
// 切换协议同意状态
toggleAgreement() {
this.setData({
agreed: !this.data.agreed
})
this.checkCanSubmit()
},
// 查看协议
viewAgreement() {
wx.navigateTo({
url: '/pages/agreement/agreement?code=medical_service'
})
},
// 检查是否可以提交
checkCanSubmit() {
const { formData, agreed } = this.data
// 验证身份证号格式
const idCardValid = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/.test(formData.idCard)
const canSubmit =
formData.realName &&
formData.gender &&
formData.age &&
formData.idCard && idCardValid &&
formData.city &&
formData.hospital &&
formData.healthCert &&
formData.idFront &&
formData.idBack &&
formData.introduction &&
formData.introduction.length >= 50 &&
formData.phone &&
formData.phone.length === 11 &&
agreed
this.setData({ canSubmit })
},
// 提交申请
async submitApply() {
if (!this.data.canSubmit) return
const { formData } = this.data
// 验证手机号
if (!/^1[3-9]\d{9}$/.test(formData.phone)) {
wx.showToast({ title: '请输入正确的手机号', icon: 'none' })
return
}
// 验证年龄
const age = parseInt(formData.age)
if (age < 18 || age > 60) {
wx.showToast({ title: '年龄需在18-60岁之间', icon: 'none' })
return
}
// 验证身份证号
if (!/^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/.test(formData.idCard)) {
wx.showToast({ title: '请输入正确的身份证号', icon: 'none' })
return
}
wx.showLoading({ title: '提交中...' })
try {
const res = await api.request('/medical/apply', {
method: 'POST',
data: {
avatar: formData.avatar,
realName: formData.realName,
gender: formData.gender,
age: age,
idCard: formData.idCard,
city: formData.city,
hospital: formData.hospital,
healthCert: formData.healthCert,
idFront: formData.idFront,
idBack: formData.idBack,
otherCert: formData.otherCert,
introduction: formData.introduction,
phone: formData.phone,
emergencyContact: formData.emergencyContact,
emergencyPhone: formData.emergencyPhone
}
})
if (res.success || res.code === 0) {
wx.showToast({ title: '申请已提交', icon: 'success' })
this.setData({
applyStatus: 'pending',
statusTitle: '审核中',
statusDesc: '您的申请正在审核中,请耐心等待',
isReapply: false
})
} else {
wx.showToast({ title: res.message || '提交失败', icon: 'none' })
}
} catch (err) {
console.error('提交申请失败:', err)
// 如果API未实现显示提示
if (err.code === 404 || err.message?.includes('not found')) {
wx.showModal({
title: '提示',
content: '陪诊就医服务即将开放,敬请期待!',
showCancel: false,
confirmText: '我知道了',
confirmColor: '#b06ab3'
})
} else {
wx.showToast({ title: err.message || '提交失败', icon: 'none' })
}
} finally {
wx.hideLoading()
}
}
})