You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

445 lines
11 KiB

5 months ago
<!--
* @desc: 创建患者
* @Author: gaowenya
* @Date: 2023-06-20 14:27
* @LastEditors:
* @LastEditTime:
-->
<template>
<a-modal
class="patient-form"
:width="600"
:maskClosable="false"
:confirmLoading="confirmLoading"
:closable="false"
:destroyOnClose="true"
v-model="createVisible"
title="新建患者"
@ok="handleSubmit"
:footer="null"
>
<a-form-model
ref="form"
:model="form"
:label-col="{ span: 4 }"
:wrapper-col="{ span: 20 }"
labelAlign="left"
class="create-form"
:rules="rules"
>
<a-row :gutter="20">
<a-col :span="12">
<a-form-model-item label="姓名">
<a-input v-model="form.patientName" placeholder="请输入姓名" />
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="民族">
<a-select v-model="form.patientNation" placeholder="请选择民族">
<a-select-option
v-for="item in nationList"
:key="item"
:value="item"
>
{{ item }}
</a-select-option>
</a-select>
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="性别" >
<a-select v-model="form.patientGender" placeholder="请选择性别">
<a-select-option :value="0" ></a-select-option>
<a-select-option :value="1" ></a-select-option>
</a-select>
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="身高">
<a-input v-model="form.height" placeholder="请输入身高 (cm)" />
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="体重">
<a-input v-model="form.weight" placeholder="请输入体重 (kg)" />
</a-form-model-item>
</a-col>
<a-col :span="16">
<a-form-model-item label="身份证号" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" placeholder="请输入身份证号">
<keyboard
placeHolder="请输入手机号"
:index-num="indexNum"
@keyboard-input="handleKeyBoard"
:old-value="patientIdCardNo"
/>
</a-form-model-item>
</a-col>
<a-col :span="8" style="padding-top: 0.15vw;">
<a-button type="primary" class="idcard" @click="openCamera">扫描身份证</a-button>
</a-col>
<a-col :span="16">
<a-form-model-item label="联系方式" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" placeholder="请输入联系方式">
<a-input v-model="form.contract" placeholder="请输入联系方式" />
</a-form-model-item>
</a-col>
<a-col :span="24">
<a-divider />
</a-col>
<a-col :span="12">
<a-form-model-item label="急救类型" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
<a-select v-model="form.type" placeholder="请选择类型">
<a-select-option :value="0" >卒中急救</a-select-option>
<a-select-option :value="1" >胸痛</a-select-option>
<a-select-option :value="2" >创伤</a-select-option>
</a-select>
</a-form-model-item>
</a-col>
<a-col :span="12">
<a-form-model-item label="平车" >
<!-- <a-select v-model="form.carNo" placeholder="请选择平车号">
<a-select-option :value="0" ></a-select-option>
<a-select-option :value="1" ></a-select-option>
</a-select> -->
<a-select v-model="form.carNo" placeholder="请选择平车号">
<a-select-option
v-for="item in carList"
:key="item.id"
:value="item.deviceNo"
>
{{ item.deviceNo }}
</a-select-option>
</a-select>
</a-form-model-item>
</a-col>
<a-col :span="16">
<a-form-model-item label="绿道状态" :label-col="{ span: 5 }" :wrapper-col="{ span: 18 }">
<a-switch v-model="form.greenRoadFlag" />
</a-form-model-item>
</a-col>
<a-col :span="24" class="footer-btns" >
<a-button class="footer-btn" type="primary" block @click="handleSubmit">新建</a-button>
</a-col>
<a-col :span="24" class="footer-btns" >
<a-button class="footer-btn cencelBtn" block @click="close">取消</a-button>
</a-col>
</a-row>
</a-form-model>
</a-modal>
</template>
<script>
import keyboard from '@/components/keyboard.vue';
import { create, uploadIdcard, idcardInfo, idcardInfoBase64 } from 'api';
import { mapState } from 'vuex';
export default {
name: 'create',
components: {
keyboard,
},
props: ['firstAidData', 'carList', 'carNo'],
data() {
return {
indexNum: 0, //必填字段,为键盘索引,每个键盘必须具有唯一值
patientIdCardNo: '',
keyboard: false,
createVisible: false,
inputFile: '',
file: '',
form: {},
rules: {},
confirmLoading: false,
};
},
computed: {
...mapState('storm', ['nationList', 'anyringToken']),
},
methods: {
handleKeyBoard(value) {
//value为在输入框里面输入的值
this.patientIdCardNo = value;
},
open(data) {
console.log('open', data)
this.createVisible = true;
this.confirmLoading = false;
this.patientIdCardNo = '';
console.log(this.form)
this.form = data || {}
// #ifdef APP-PLUS
this.openCamera();
// #endif
},
close() {
this.createVisible = false;
this.confirmLoading = false;
this.patientIdCardNo = '';
},
openCamera() {
const cmr = plus.camera.getCamera();
const res = cmr.supportedImageResolutions[0];
const fmt = cmr.supportedImageFormats[0];
cmr.captureImage(
(path) => {
plus.io.resolveLocalFileSystemURL(
path,
(entry) => {
//压缩图片
this.compressImage(entry.toLocalURL(), entry.name);
},
(e) => {
plus.nativeUI.toast(
'读取拍照文件错误:' + e.message
);
}
);
},
(error) => {
// alert("Capture image failed: " + error.message);
},
{
resolution: res,
format: fmt,
filter: 'image',
}
);
},
//压缩图片
compressImage(url, filename) {
var name = '_doc/upload/' + filename;
plus.zip.compressImage(
{
src: url, //src: (String 类型 )压缩转换原始图片的路径
dst: name, //压缩转换目标图片的路径
quality: 90, //quality: (Number 类型 )压缩图片的质量.取值范围为1-100
overwrite: true, //overwrite: (Boolean 类型 )覆盖生成新文件
width: '250',
height: '320',
},
(zip) => {
//页面显示图片
this.showPics(zip.target, name);
},
(error) => {
plus.nativeUI.toast('压缩图片失败,请稍候再试');
}
);
},
//显示图片
showPics(url, name) {
let _this = this;
//根据路径读取到文件
plus.io.resolveLocalFileSystemURL(url, (entry) => {
entry.file((file) => {
var fileReader = new plus.io.FileReader();
fileReader.readAsDataURL(file);
fileReader.onloadend = (e) => {
var picUrl = e.target.result.toString();
this.idcardInfoBase64(picUrl);
};
});
});
},
dataURLToFile(dataUrl, fileName) {
const dataArr = dataUrl.split(',');
const mime = dataArr[0].match(/:(.*);/)[1];
const originStr = atob(dataArr[1]);
return new File([originStr], fileName, {
type: mime,
});
},
async idcardInfoBase64(url) {
let res = await idcardInfoBase64(url);
const { data, code, msg } = res;
if (code === 200) {
const { name, sex, idCardNo, nation } = data;
this.form.patientName = name
this.form.patientGender = sex
this.form.patientNation = nation
this.patientIdCardNo = idCardNo;
} else {
this.$message.error(res.msg);
}
},
// 上传前校检格式和大小
handleBeforeUpload(file) {
const isLt10M = file.size / 1024 / 1024 < 10000;
// 校检文件大小
if (!isLt10M) {
this.$message.error('上传头像图片大小不能超过 10MB!');
}
this.file = file;
return isLt10M;
},
// 上传成功回
async handleUploadAdd() {
if (!this.file) return '您还未选择文件';
// 使用FormData传参数和文件
var form = new FormData();
// 文件
form.append('file', this.file);
uploadIdcard(form).then((res) => {
if (res.code === 200) {
const { name, sex, idCardNo, nation } = res.data;
this.form.setFieldsValue({
['patientName']: name,
['patientGender']: sex,
['patientNation']: nation,
});
this.patientIdCardNo = idCardNo;
} else {
this.$message.error(res.msg);
}
});
},
onDelete() {
this.patientIdCardNo = '';
},
handleSubmit(e) {
e.preventDefault();
this.$refs.form.validate(async (valid) => {
if (valid) {
const reg =
/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
if ( !reg.test(this.patientIdCardNo) && this.patientIdCardNo ) {
this.$message.error('身份证格式不正确');
return;
}
if (typeof this.firstAidData.greenRoadFlag == 'boolean') {
this.firstAidData.greenRoadFlag = 0;
}
let res = await create({
param: {
...this.form,
patientIdCardNo: this.patientIdCardNo,
},
});
const { data, code, msg } = res;
if (code === 200) {
this.confirmLoading = true;
this.createVisible = false;
this.$message.success('创建成功');
this.$emit('on-success', data);
} else {
this.confirmLoading = false;
}
}
});
},
},
};
</script>
<style scoped lang="less">
.patient-form{
.create-form{
padding: 0 .6rem 1rem .6rem;
.ant-form-item{
margin-bottom: .5rem;
.ant-form-item-label{}
.ant-input{
font-size: 1rem;
border: none;
background: #F5F5F5;
border-radius: .3rem;
.acitve {
border: none !important;
}
}
.ant-select{
font-size: 1rem;
border:none;
background: #F5F5F5;
border-radius: 6px;
.ant-select-selection{
border:none;
background-color: #F5F5F5;
font-size:13px;
}
}
}
.footer-btns{
margin-top: 1.2rem;
padding: 0 1.5rem;
text-align:center;
.ant-btn.footer-btn{
width:80%;
border-radius: .8rem;
height: 3.64vw;
line-height: 3.64vw;
}
}
}
}
</style>
<style lang="less">
.patient-form{
.ant-modal-body{
padding-top: 0;
}
.ant-modal-content{
border-radius: 1rem;
overflow: hidden;
.ant-modal-header{
border-bottom: none;
padding-top: 2rem;
.ant-modal-title {
font-size: 2rem;
font-weight: bold;
font-family: Source Han Sans CN, Source Han Sans CN-Medium;
text-align: left;
color: #393d4e;
padding: 10px 0;
}
}
.ant-select{
.ant-select-selection,.inputText{
background-color: #F5F5F5;
border:none;
.acitve {
border: none !important;
}
}
.ant-input:hover{
border: none
}
.ant-select-arrow{
position: absolute;
top: 36%;
svg{
font-size: 1rem;
color: #ccc;
}
}
}
.input-container{
background-color: #F5F5F5;
border:none;
}
.ant-switch{
height: 2.73vw;
width: 4.55vw;
color: #f5f5f5;
background-color: #f5f5f5;
}
.ant-switch::after{
width: 2.3vw;
height: 2.3vw;
top: 1.5px;
}
.ant-switch-checked{
background-color:#34C759;
}
.cencelBtn{
background:#ddd;
}
}
}
</style>