import { connect } from 'herculex'; import { checkPhone, checkIdCard } from './check'; import { editCard, createCard, createPatient, patientUpdate, getPatientList, getLoginUserCardList } from './service'; import doLogin from '../../utils/doLogin'; import history from '../../utils/history'; import loadOcr from '../../utils/loadOcr'; import getEncryptStr from '../../utils/getEncryptStr'; import { reportCmPV_YL } from '../../utils/cloudMonitorHelper'; const caIcon = 'https://gw.alipayobjects.com/mdn/rms_373ab8/afts/img/A*w6MrS5tmnFAAAAAAAAAAAAAAARQnAQ'; const bookIcon = 'https://gw.alipayobjects.com/mdn/rms_373ab8/afts/img/A*nta9QpHSTvkAAAAAAAAAAAAAARQnAQ'; const getDefaultForm = () => ({ id: '', name: '', sex: '男', idCardNo: '', relationShip: '', phoneNumber: '', idCardType: '身份证', /* 新增卡字段 */ type: '', cardNum: '', defaultCard: '', phoneRsa: '', fullNameRsa: '', idcardNoRsa: '' }); const copy = data => JSON.parse(JSON.stringify(data)); Component(connect({ mapStateToProps: { userInfo: ({ $global }) => $global.userInfo || {} } })({ props: { componentData: {} }, data: { caIcon, bookIcon, show: false, routeState: null, medicCardsList: [], isAuthSuccess: false, editForm: getDefaultForm(), genders: [{ label: '男', value: '男' }, { label: '女', value: '女' }], certTypes: [{ id: 1, name: '身份证' }] }, didMount() { const { componentData } = this.props; const { editForm, routeState } = componentData || {}; const state = {}; if (routeState) { state.routeState = routeState; } /* 编辑 */ if (editForm) { state.editForm = this.initData(editForm); } this.setData(state); /* 埋点服务预警 */ reportCmPV_YL({ title: '在线建档' }); }, methods: { isEditCard() { const { $routeConfig } = this.$page; const { query } = $routeConfig; return query.editType === 'card'; }, initData(data) { const _data = {}; const defaultData = getDefaultForm(); Object.keys(defaultData).forEach(key => { const value = data[key] || defaultData[key]; if (value) _data[key] = value; }); return _data; }, onClosePopup() { this.setData({ show: false }); }, onTap() { this.onClosePopup(); }, async onRelationChange({ id, name }) { let isAuthSuccess = false; const { editForm: _editForm } = this.data; let editForm = copy(_editForm); /* 如果是从本人切换到其他关系上的需要清空数据 */ if (_editForm.relationShip === '本人' && id !== 1) { editForm = getDefaultForm(); } editForm.relationShip = name; /* 如果为本人,唤起授权 */ if (id === 1) { const { userInfo } = this.data; // 判断用户是否已经登陆 if (userInfo.isLogin) { isAuthSuccess = true; } else { isAuthSuccess = await doLogin.call(this, { scopes: 'auth_user' }); } if (isAuthSuccess) { const { phone, gender = 'm', idCardNo, fullName, phoneRsa, fullNameRsa, idcardNoRsa } = this.data.userInfo; editForm.name = fullName; editForm.idCardNo = idCardNo; editForm.phoneNumber = phone; editForm.phoneRsa = phoneRsa; editForm.fullNameRsa = fullNameRsa; editForm.idcardNoRsa = idcardNoRsa; editForm.sex = gender === 'm' ? '男' : '女'; } } this.setData({ isAuthSuccess, editForm: { ...editForm } }); }, /* 一键清除 */ clearInput(value, key) { // eslint-disable-next-line no-param-reassign value = value || ''; const { editForm } = this.data; const oldValue = editForm[key] || ''; return oldValue.indexOf('*') < 0 ? value : ''; }, /* 输入姓名 */ onNameInput({ detail }) { this.setData({ 'editForm.name': this.clearInput(detail.value, 'name') }); }, /* 选择性别 */ onSexChange(item) { this.setData({ 'editForm.sex': item }); }, /* 选择证件类别 */ onCertTypeChange({ detail }) { const { value } = detail; const { certTypes = [] } = this.data; const { name = '' } = certTypes[value]; this.setData({ 'editForm.certTypes': name }); }, /* 输入身份证 */ onCardNoInput({ detail }) { this.setData({ 'editForm.idCardNo': this.clearInput(detail.value, 'idCardNo') }); }, /* 输入电话号码 */ onPhoneInput({ detail }) { this.setData({ 'editForm.phoneNumber': this.clearInput(detail.value, 'phoneNumber') }); }, async onCardChange({ cardNum }) { this.resolveFn && this.resolveFn(cardNum); }, showTip(msg) { my.showToast({ content: msg, duration: 3000 }); return false; }, showSuccess(msg) { my.showToast({ type: 'success', content: msg, duration: 1500 }); }, showError(msg) { my.showToast({ type: 'fail', content: msg, duration: 1500 }); }, vailForm(form) { const { idCardNo = '', phoneNumber = '' } = form; const { sex, name, idCardType, relationShip } = form; const rest = { sex, name, idCardType, relationShip }; const values = Object.values(rest); if (values.filter(v => !!v).length !== values.length) { return this.showTip('将页面上的信息填写完整!'); } if (!checkIdCard(idCardNo)) { return this.showTip('身份证格式不正确!'); } if (!checkPhone(phoneNumber)) { return this.showTip('手机号格式不正确!'); } return true; }, /* * 获取非脱敏的字段 * */ restForm(form) { const _form = {}; Object.keys(form).forEach(key => { const value = form[key] || ''; if (value.indexOf('*') < 0) _form[key] = value; }); return _form; }, // 保存就诊人 async patientSave() { const { editForm, isAuthSuccess } = this.data; /* 如果不是本人,校验字段 */ if (!isAuthSuccess) { if (!this.vailForm(editForm)) return; } /* 获取非脱敏的字段 */ const form = this.restForm(editForm); /* 不是编辑的情况,才需要选择就诊卡 */ if (!editForm.id && !this.isEditCard()) { form.bindCardNum = await this.onCheckCard(form); } await this.onSubmit(this.initData(form)); }, /* 提交 */ async onSubmit(_form) { const { routeState } = this.data; /* 加密数据 */ const form = { ..._form, idCardNo: await getEncryptStr(_form.idCardNo), phoneNumber: await getEncryptStr(_form.phoneNumber) }; let msg = ''; try { my.showLoading(); const isEditCard = this.isEditCard(); /* 如果有id 或者绑定的卡id为编辑 */ if (form.id || form.cardNum) { if (isEditCard) { msg = '就诊卡编辑成功'; await editCard(form); } else { msg = '就诊人编辑成功'; await patientUpdate(form); } } else if (isEditCard) { msg = '就诊卡添加成功'; await createCard(form); } else { msg = '就诊人添加成功'; await createPatient(form); } this.goNav(routeState); this.showSuccess(msg); } catch (e) { this.showError(e.msg); } my.hideLoading(); }, goNav(state) { if (state) { const { routeType = 'push', ...rest } = state; /* routeType push/replace */ if (history[routeType]) { history[routeType](rest); } } else { my.navigateBack(); } }, /* 获取就诊卡 */ async onCheckCard() { const { editForm, isAuthSuccess } = this.data; my.showLoading(); const { idCardNo } = editForm; return new Promise(async resolve => { const medicCardsList = isAuthSuccess ? await getLoginUserCardList() : await this.getCardByIdCardNo(idCardNo); /* 如果卡大于一张 */ if (medicCardsList.length <= 1) { return resolve(''); } my.hideLoading(); this.resolveFn = resolve; this.setData({ show: true, medicCardsList }); }); }, /* 根据idCardNo查询某个就诊人的就诊卡 */ async getCardByIdCardNo(idCardNo) { const value = await getEncryptStr(idCardNo); const list = await getPatientList({ idCardNo: value }); if (!list.length) return []; const { medicCards = [] } = list[0]; return medicCards; }, choosePhoneContact() { my.choosePhoneContact({ success: ({ mobile }) => { this.setData({ 'editForm.phoneNumber': mobile.replace(/(\s|-|\+)/g, '') }); } }); }, async onLaunchOcr() { const { readIDCard, IDCardTypes } = await loadOcr(); readIDCard({ bizId: 'ocr_01', type: IDCardTypes.FRONT }).then(res => { if (res.error) { return Promise.reject(res.error); } const { num: { data: idCardNo }, name: { data: realName }, sex: { data: userSex } } = res.data; this.setData({ 'editForm.sex': userSex, 'editForm.name': realName, 'editForm.idCardNo': idCardNo }); }).catch(e => { this.showTip(e.message || '识别身份证失败'); }); } } }));