const auth = require('../../../utils/auth'); const competition = require('../../../utils/competition'); const PHONE_RE = /^1[3-9]\d{9}$/; Page({ data: { loading: true, submitting: false, uploading: false, profile: {}, levels: [], levelNames: [], levelIndex: 0, roleOptions: [], selectedRoles: [], name: '', mobile: '', verificationCode: '', region: [], regionText: '', regionCodes: [], certificateUrl: '', auditStatusText: '', auditRemark: '' }, onLoad() { this.loadData(); }, onPullDownRefresh() { this.loadData().finally(() => wx.stopPullDownRefresh()); }, loadData() { this.setData({ loading: true }); return Promise.all([ competition.fetchRefereeProfileOptions(), competition.fetchRefereeProfile() ]).then(([options, profile]) => { const levels = Array.isArray(options && options.levels) ? options.levels : []; const roles = Array.isArray(options && options.roles) ? options.roles : []; const rawRoles = profile.roles != null ? profile.roles : profile.roleValues; const selectedRoles = competition.splitRefereeRoles(rawRoles); const regionNames = [profile.provinceName, profile.cityName, profile.districtName].filter(Boolean); const levelIndex = Math.max(0, levels.findIndex((item) => Number(item.value) === Number(profile.level))); this.setData({ profile, levels, levelNames: levels.map((item) => item.label || item.name || String(item.value)), levelIndex, roleOptions: roles.map((item) => Object.assign({}, item, { checked: selectedRoles.includes(Number(item.value)) })), selectedRoles, name: profile.name || '', mobile: profile.mobile || '', region: regionNames, regionText: regionNames.join(' / '), regionCodes: [profile.provinceCode, profile.cityCode, profile.districtCode].filter(Boolean), certificateUrl: profile.certificateUrl || '', auditStatusText: profile.auditStatusText || '', auditRemark: profile.auditRemark || '' }); }).catch((err) => wx.showToast({ title: (err && err.message) || '裁判资料加载失败', icon: 'none' })) .finally(() => this.setData({ loading: false })); }, onNameInput(e) { this.setData({ name: (e.detail.value || '').trim() }); }, onMobileInput(e) { this.setData({ mobile: (e.detail.value || '').trim() }); }, onCodeInput(e) { this.setData({ verificationCode: (e.detail.value || '').trim() }); }, onRegionChange(e) { const region = e.detail.value || []; this.setData({ region, regionText: region.filter(Boolean).join(' / '), regionCodes: e.detail.code || [] }); }, onLevelChange(e) { this.setData({ levelIndex: Number(e.detail.value) || 0 }); }, onRoleChange(e) { const selectedRoles = (e.detail.value || []).map(Number); this.setData({ selectedRoles, roleOptions: this.data.roleOptions.map((item) => Object.assign({}, item, { checked: selectedRoles.includes(Number(item.value)) })) }); }, onSendCode() { if (!PHONE_RE.test(this.data.mobile)) { wx.showToast({ title: '请输入正确的手机号', icon: 'none' }); return; } auth.sendVerificationCode(this.data.mobile) .then(() => wx.showToast({ title: '验证码已发送', icon: 'success' })) .catch((err) => wx.showToast({ title: (err && err.message) || '验证码发送失败', icon: 'none' })); }, onUploadCertificate() { wx.chooseMedia({ count: 1, mediaType: ['image'], success: (res) => { const filePath = res && res.tempFiles && res.tempFiles[0] && res.tempFiles[0].tempFilePath; if (!filePath) return; this.setData({ uploading: true }); auth.uploadFile(filePath) .then((certificateUrl) => this.setData({ certificateUrl })) .catch((err) => wx.showToast({ title: (err && err.message) || '证书上传失败', icon: 'none' })) .finally(() => this.setData({ uploading: false })); } }); }, onSubmit() { if (this.data.submitting) return; const { name, mobile, verificationCode, region, regionCodes, levels, levelIndex, certificateUrl, selectedRoles } = this.data; if (!name) return wx.showToast({ title: '请输入姓名', icon: 'none' }); if (mobile && !PHONE_RE.test(mobile)) return wx.showToast({ title: '请输入正确的手机号', icon: 'none' }); if (region.length !== 3 || regionCodes.length !== 3) return wx.showToast({ title: '请选择完整所在地区', icon: 'none' }); if (!levels[levelIndex]) return wx.showToast({ title: '请选择裁判级别', icon: 'none' }); if (!certificateUrl) return wx.showToast({ title: '请上传裁判证书', icon: 'none' }); if (!selectedRoles.length) return wx.showToast({ title: '请至少选择一个裁判角色', icon: 'none' }); const payload = { name, mobile: mobile || undefined, verificationCode: verificationCode || undefined, provinceCode: String(regionCodes[0]), provinceName: region[0], cityCode: String(regionCodes[1]), cityName: region[1], districtCode: String(regionCodes[2]), districtName: region[2], level: Number(levels[levelIndex].value), certificateUrl, roles: selectedRoles }; this.setData({ submitting: true }); competition.submitRefereeProfile(payload) .then((profile) => { wx.showToast({ title: '裁判资料已提交', icon: 'success' }); if (profile) this.setData({ auditStatusText: profile.auditStatusText || '待审核', auditRemark: profile.auditRemark || '' }); }) .catch((err) => wx.showToast({ title: (err && err.message) || '提交失败', icon: 'none' })) .finally(() => this.setData({ submitting: false })); } });