registration.vue 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. <template>
  2. <div class="app-container">
  3. <el-button type="primary" style="float:right;margin:0 0 6px 0;">新增患者</el-button>
  4. <el-form ref="form" :rules="rules" :model="form" label-width="134px" class="clearfix" >
  5. <div class="dataTitle">一般资料</div>
  6. <el-row >
  7. <el-col :span="4" align="center">
  8. <el-upload style="width:100%;"
  9. :data="uploadData"
  10. class="uploadHead"
  11. :multiple="false"
  12. action="https://upload.qiniup.com"
  13. :show-file-list="false"
  14. :on-error="handleAvatarError"
  15. :on-success="handleAvatarSuccess"
  16. list-type="picture-card"
  17. :before-upload="beforeAvatarUpload">
  18. <img width="100%" height="100%" v-if="imageUrl" :src="imageUrl" class="avatar">
  19. <i class="el-icon-plus" v-else></i>
  20. </el-upload>
  21. <el-dialog :visible.sync="dialogVisible">
  22. <img width="100%" :src="dialogImageUrl" alt="">
  23. </el-dialog>
  24. <el-upload
  25. :data="uploadData"
  26. :multiple="false"
  27. action="https://upload.qiniup.com"
  28. :show-file-list="false"
  29. :on-error="handleAvatarError"
  30. :on-success="handleAvatarSuccess"
  31. :before-upload="beforeAvatarUpload">
  32. <el-button class="uploadHeadBtn" type="primary" >上传头像</el-button>
  33. </el-upload>
  34. <el-form-item prop="avatar">
  35. <el-input v-model="form.avatar" type="hidden" placeholder=""></el-input>
  36. </el-form-item>
  37. </el-col>
  38. <el-col :span="20" >
  39. <el-row :gutter="10">
  40. <el-col :span="8">
  41. <el-form-item label="患者类型 : " class="is-required" prop="patientType">
  42. <el-select v-model="form.patientType" placeholder="请选择患者类型">
  43. <el-option v-for="item in styleOptions" :key="item.id" :label="item.name" :value="item.id"/>
  44. </el-select>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="8">
  48. <el-form-item label="透析号 : " class="is-required" prop="dialysisNo" >
  49. <el-input v-model="form.dialysisNo" placeholder="填写或自动生成" style="width:47%;float:left;margin-right: 1%;" ></el-input>
  50. <el-button type="primary" @click="generatedialysisno">自动生成</el-button>
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="8">
  54. <el-form-item label="住院(门诊)号 : " class="is-required" prop="admissionNumber" >
  55. <el-input v-model="form.admissionNumber"></el-input>
  56. </el-form-item>
  57. </el-col>
  58. </el-row>
  59. <el-row :gutter="10">
  60. <el-col :span="8">
  61. <el-form-item label="患者来源 : " class="is-required" prop="source" >
  62. <el-radio-group v-model="form.source">
  63. <el-radio v-for="item in sourceOptions" :key="item.value" :label="item.value" :value="item.value" >{{item.label}}</el-radio>
  64. </el-radio-group>
  65. </el-form-item>
  66. </el-col>
  67. <el-col :span="8">
  68. <el-form-item label="病区 : " >
  69. <el-select v-model="form.partition" placeholder="请选择病区 ">
  70. <el-option v-for="item in partitionOptions" :key="item.id" :label="item.name" :value="item.id"/>
  71. </el-select>
  72. </el-form-item>
  73. </el-col>
  74. <el-col :span="8">
  75. <el-form-item label="床位 : " >
  76. <el-input v-model="form.bed"></el-input>
  77. </el-form-item>
  78. </el-col>
  79. </el-row>
  80. <el-row :gutter="10">
  81. <el-col :span="8">
  82. <el-form-item label="姓名 : " class="is-required" prop="name" >
  83. <el-input v-model="form.name" ></el-input>
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="8">
  87. <el-form-item label="性别 : " class="is-required" prop="gender" >
  88. <el-radio-group v-model="form.gender">
  89. <el-radio v-for="item in sexOptions" :key="item.value" :label="item.value" :value="item.value" >{{item.label}}</el-radio>
  90. </el-radio-group>
  91. </el-form-item>
  92. </el-col>
  93. <el-col :span="8">
  94. <el-form-item label="婚姻状况 : " >
  95. <el-select v-model="form.maritalStatus" placeholder="请选择婚姻状况">
  96. <el-option v-for="item in maritalOptions" :key="item.id" :label="item.name" :value="item.id"/>
  97. </el-select>
  98. </el-form-item>
  99. </el-col>
  100. </el-row>
  101. <el-row :gutter="10">
  102. <el-col :span="8">
  103. <el-form-item label="身份证号 : " class="is-required" prop="idCardNo" >
  104. <el-input v-model="form.idCardNo" @blur="checkIdCardNo" ></el-input>
  105. </el-form-item>
  106. </el-col>
  107. <el-col :span="8">
  108. <el-form-item label="出生日期 : " class="is-required" prop="birth" >
  109. <el-date-picker v-model="form.birth" type="date" placeholder="选择日期" :suffix-icon="'el-icon-menu'" @change="hadSelectBirth" format="yyyy-MM-dd" value-format="yyyy-MM-dd"></el-date-picker>
  110. </el-form-item>
  111. </el-col>
  112. <el-col :span="8">
  113. <el-form-item label="年龄 : " >
  114. <el-input v-model="form.age" ></el-input>
  115. </el-form-item>
  116. </el-col>
  117. </el-row>
  118. <el-row :gutter="10">
  119. <el-col :span="8">
  120. <el-form-item label="报销方式 : " >
  121. <el-select v-model="form.reimbursementWayID" >
  122. <el-option v-for="item in wayOptions" :key="item.id" :label="item.name" :value="item.id"/>
  123. </el-select>
  124. </el-form-item>
  125. </el-col>
  126. <el-col :span="8">
  127. <el-form-item label="医保号 : " >
  128. <el-input v-model="form.healthCareNo" ></el-input>
  129. </el-form-item>
  130. </el-col>
  131. <el-col :span="8">
  132. <el-form-item label="医保到期日期 : " >
  133. <el-date-picker v-model="form.healthCareDueDate" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"></el-date-picker>
  134. </el-form-item>
  135. </el-col>
  136. </el-row>
  137. <el-row :gutter="10">
  138. <el-col :span="8">
  139. <el-form-item label="身高(cm) : " >
  140. <el-input maxlength="5" v-model="form.height" @change="checkHeight"></el-input>
  141. </el-form-item>
  142. </el-col>
  143. <el-col :span="8" style="clearfix">
  144. <el-form-item label="血型 : " style="width:60%;float:left;">
  145. <el-select v-model="form.blood" >
  146. <el-option v-for="item in typeOptions" :key="item.id" :label="item.name" :value="item.id"/>
  147. </el-select>
  148. </el-form-item>
  149. <el-form-item label="RH : " style="width:40%;float:left;" label-width="50px" >
  150. <el-select v-model="form.rh" >
  151. <el-option v-for="item in rhOptions" :key="item.id" :label="item.name" :value="item.id"/>
  152. </el-select>
  153. </el-form-item>
  154. </el-col>
  155. <el-col :span="8">
  156. <el-form-item label="医保到期提醒日期 : " >
  157. <el-date-picker v-model="form.healthCareDueAlertDate" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"></el-date-picker>
  158. </el-form-item>
  159. </el-col>
  160. </el-row>
  161. <el-row :gutter="10">
  162. <el-col :span="8">
  163. <el-form-item label="文化程度 : " >
  164. <el-select v-model="form.education" >
  165. <el-option v-for="item in educationOptions" :key="item.id" :label="item.name" :value="item.id"/>
  166. </el-select>
  167. </el-form-item>
  168. </el-col>
  169. <el-col :span="8">
  170. <el-form-item label="职业 : " >
  171. <el-select v-model="form.profession" >
  172. <el-option v-for="item in professionOptions" :key="item.id" :label="item.name" :value="item.id"/>
  173. </el-select>
  174. </el-form-item>
  175. </el-col>
  176. </el-row>
  177. </el-col>
  178. </el-row>
  179. <div class="dataTitle">联系方式</div>
  180. <el-row :gutter="10">
  181. <el-col :span="6">
  182. <el-form-item label="电话(本人): ">
  183. <el-input v-model="form.phone" maxlength="20"></el-input>
  184. </el-form-item>
  185. </el-col>
  186. <el-col :span="6">
  187. <el-form-item label="电话(家属): ">
  188. <el-input v-model="form.homeTelephone" maxlength="20"></el-input>
  189. </el-form-item>
  190. </el-col>
  191. <el-col :span="6">
  192. <el-form-item label="家庭住址 : ">
  193. <el-input v-model="form.homeAddress"></el-input>
  194. </el-form-item>
  195. </el-col>
  196. <el-col :span="6">
  197. <el-form-item label="工作单位 : ">
  198. <el-input v-model="form.work"></el-input>
  199. </el-form-item>
  200. </el-col>
  201. </el-row>
  202. <div class="dataTitle">治疗信息</div>
  203. <el-row :gutter="10">
  204. <el-col :span="6">
  205. <el-form-item label="接受日期 : " >
  206. <el-date-picker v-model="form.receivingDate" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"></el-date-picker>
  207. </el-form-item>
  208. </el-col>
  209. <el-col :span="6">
  210. <el-form-item label="首次透析日期 : " >
  211. <el-date-picker v-model="form.firstDialysisDate" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="selectFirstDialysisDate"></el-date-picker>
  212. </el-form-item>
  213. </el-col>
  214. <el-col :span="6">
  215. <el-form-item label="透析龄 : ">
  216. <el-input v-model="form.dialysisAge"></el-input>
  217. </el-form-item>
  218. </el-col>
  219. <el-col :span="6">
  220. <el-form-item label="诱导期 : " >
  221. <el-select v-model="form.induction" >
  222. <el-option v-for="item in inductionOptions" :key="item.id" :label="item.name" :value="item.id"/>
  223. </el-select>
  224. </el-form-item>
  225. </el-col>
  226. </el-row>
  227. <el-row :gutter="10">
  228. <el-col :span="6">
  229. <el-form-item label="初始透析次数 : " >
  230. <el-input v-model="form.initial"></el-input>
  231. </el-form-item>
  232. </el-col>
  233. <el-col :span="6">
  234. <el-form-item label="透析总次数 : " >
  235. <el-input v-model="form.dialysisTotal"></el-input>
  236. </el-form-item>
  237. </el-col>
  238. <el-col :span="12">
  239. <el-form-item label="传染病 : ">
  240. <el-checkbox-group v-model="form.contagions">
  241. <el-checkbox v-for="item in contagionList" :label="item.id" :key="item.id" :value="item.id">{{item.name}}</el-checkbox>
  242. </el-checkbox-group>
  243. </el-form-item>
  244. </el-col>
  245. </el-row>
  246. <el-row :gutter="10">
  247. <el-col :span="6">
  248. <el-form-item label="主治医生 : ">
  249. <el-select v-model="form.doctor" >
  250. <el-option v-for="item in doctorOptions" :key="item.value" :label="item.label" :value="item.value"/>
  251. </el-select>
  252. </el-form-item>
  253. </el-col>
  254. <el-col :span="6">
  255. <el-form-item label="主管护士 : ">
  256. <el-select v-model="form.nurse" >
  257. <el-option v-for="item in nurseOptions" :key="item.value" :label="item.label" :value="item.value"/>
  258. </el-select>
  259. </el-form-item>
  260. </el-col>
  261. <el-col :span="6">
  262. <el-form-item label="跌倒评估 : ">
  263. <el-input v-model="form.assessment"></el-input>
  264. </el-form-item>
  265. </el-col>
  266. <el-col :span="6">
  267. <el-form-item label="慢性病 : ">
  268. <el-checkbox-group
  269. v-model="form.diseases"
  270. >
  271. <el-checkbox v-for="item in checkDisease" :label="item.id" :key="item.id" :value="item.id" >{{item.name}}</el-checkbox>
  272. </el-checkbox-group>
  273. </el-form-item>
  274. </el-col>
  275. </el-row>
  276. <el-row :gutter="10">
  277. <el-col :span="24">
  278. <el-form-item label="诊断 : ">
  279. <textarea v-model="form.diagnose" class="textarea"></textarea>
  280. </el-form-item>
  281. </el-col>
  282. </el-row>
  283. <!-- <el-row :gutter="10">
  284. <el-col :span="24">
  285. <el-form-item label="登记人员 : ">
  286. <span>{{form.nurse}} 护士</span>
  287. </el-form-item>
  288. </el-col>
  289. </el-row> -->
  290. <el-row >
  291. <el-col :span="24" align="center">
  292. <el-form-item>
  293. <el-button type="primary" @click="onSubmit('form')">保存</el-button>
  294. <el-button>保存并继续新增</el-button>
  295. <el-button>取消</el-button>
  296. </el-form-item>
  297. </el-col>
  298. </el-row>
  299. </el-form>
  300. </div>
  301. </template>
  302. <script>
  303. import { getToken } from "@/api/qiniu";
  304. import { getFileExtension,isCardNo,jsGetAge,isPositiveInteger,dialysisAge } from '@/utils/tools';
  305. import { generateDialysisNo,createPatient } from '@/api/patient';
  306. export default {
  307. data() {
  308. return {
  309. formSubmit:true,
  310. uploadData:{token:'',key:''},
  311. imageUrl: "https://ubmcmm.baidustatic.com/media/v1/0f000a-WueD1p8fNOLDxM6.jpg",
  312. dialogImageUrl: "",
  313. qiniuDomain:'https://images.shengws.com/',
  314. dialogVisible: false,
  315. form: {
  316. avatar:'https://ubmcmm.baidustatic.com/media/v1/0f000a-WueD1p8fNOLDxM6.jpg',
  317. patientType: '',
  318. dialysisNo: "",
  319. admissionNumber: "",
  320. source: "",
  321. partition: "",
  322. bed: "",
  323. name: "",
  324. gender: "",
  325. maritalStatus: "",
  326. idCardNo: "",
  327. birth: "",
  328. age: "",
  329. reimbursementWayID: "",
  330. healthCareNo: "",
  331. healthCareDueDate: "",
  332. height: "",
  333. blood: "",
  334. rh:"",
  335. healthCareDueAlertDate: "",
  336. education: "",
  337. profession: "",
  338. phone: "",
  339. homeTelephone: "",
  340. homeAddress: "",
  341. work: "",
  342. receivingDate: "",
  343. firstDialysisDate: "",
  344. dialysisAge: "",
  345. induction: "",
  346. initial: "",
  347. dialysisTotal: "",
  348. contagions:[],
  349. doctor: "",
  350. nurse: "",
  351. assessment: "",
  352. diseases: [],
  353. diagnose:'',
  354. registrars:"",
  355. },
  356. typeOptions: null,
  357. styleOptions: null,
  358. sourceOptions: [
  359. { value: 1, label: "门诊" },
  360. { value: 2, label: "住院" }
  361. ],
  362. partitionOptions: null,
  363. sexOptions: [{ value: 1, label: "男" }, { value: 2, label: "女" }],
  364. maritalOptions: null,
  365. wayOptions: null,
  366. educationOptions: null,
  367. professionOptions: null,
  368. inductionOptions: null,
  369. doctorOptions: [
  370. { value: 1, label: "张三" },
  371. { value: 2, label: "李四" },
  372. { value: 3, label: "王五" },
  373. { value: 4, label: "麻子" }
  374. ],
  375. nurseOptions: [
  376. { value: 1, label: "张三" },
  377. { value: 2, label: "张三" },
  378. { value: 3, label: "李四" },
  379. { value: 4, label: "王五" }
  380. ],
  381. rhOptions: null,
  382. checkDisease: null,
  383. contagionList: null,
  384. loading:null,
  385. rules:{
  386. avatar:[
  387. { required: true, message: '请上传头像', trigger: 'blur' },
  388. ],
  389. patientType:[
  390. { required: true, message: '请选择患者类型', trigger: 'blur' },
  391. ],
  392. dialysisNo:[
  393. { required: true, message: '请填写透析号', trigger: 'blur' },
  394. ],
  395. admissionNumber:[
  396. { required: true, message: '请填写住院(门诊)号', trigger: 'blur' },
  397. ],
  398. source:[
  399. { required: true, message: '请选择患者来源', trigger: 'blur' },
  400. ],
  401. name:[
  402. { required: true, message: '请填写姓名', trigger: 'blur' },
  403. ],
  404. gender:[
  405. { required: true, message: '请选择性别', trigger: 'blur' },
  406. ],
  407. idCardNo:[
  408. { required: true, message: '请填写身份证号', trigger: 'blur' },
  409. ],
  410. birth:[
  411. { required: true, message: '请填写生日', trigger: 'blur' },
  412. ]
  413. }
  414. };
  415. },
  416. created(){
  417. this.styleOptions = this.$store.getters.patient_types;
  418. this.partitionOptions = this.$store.getters.partitions;
  419. this.maritalOptions = this.$store.getters.marital_options;
  420. this.wayOptions = this.$store.getters.reimbursement_ways;
  421. this.typeOptions = this.$store.getters.blood_types;
  422. this.rhOptions = this.$store.getters.rh;
  423. this.educationOptions = this.$store.getters.education_types;
  424. this.professionOptions = this.$store.getters.profession_options;
  425. this.inductionOptions = this.$store.getters.induction_options;
  426. this.contagionList = this.$store.getters.contagions;
  427. this.checkDisease = this.$store.getters.disease;
  428. },
  429. methods: {
  430. onSubmit(formName) {
  431. if (!this.formSubmit) {
  432. return false;
  433. }
  434. this.$refs[formName].validate((valid) => {
  435. if (valid) {
  436. this.formSubmit = false;
  437. createPatient(this.form).then(response => {
  438. if (response.data.state==0) {
  439. this.$message.error(response.data.msg);
  440. this.formSubmit = true;
  441. return false;
  442. }else {
  443. this.formSubmit = false;
  444. this.$notify({
  445. title: '成功',
  446. message: '新增患者成功',
  447. type: 'success',
  448. duration: 2000
  449. })
  450. this.$refs[formName].resetFields();
  451. this.$router.push({path:"/patients/patient"});
  452. return false;
  453. }
  454. }).catch(err => {
  455. this.$message.error("网络异常");
  456. this.formSubmit = true;
  457. return false;
  458. })
  459. } else {
  460. this.formSubmit = true;
  461. return false;
  462. }
  463. });
  464. },
  465. handleRemove(file, fileList) {
  466. console.log(file, fileList);
  467. },
  468. handlePictureCardPreview(file) {
  469. this.dialogImageUrl = file.url;
  470. this.dialogVisible = true;
  471. },
  472. handleAvatarError(err, file, fileList){
  473. this.$message.error(err);
  474. this.loading.close();
  475. return false;
  476. },
  477. handleAvatarSuccess(res, file) {
  478. // this.imageUrl = URL.createObjectURL(file.raw);
  479. this.imageUrl = this.qiniuDomain + res.url;
  480. this.form.avatar = this.qiniuDomain + res.url;
  481. this.loading.close();
  482. },
  483. beforeAvatarUpload(file) {
  484. // const isJPG = file.type === "image/jpeg";
  485. var fileType = file.type
  486. const isJPG = fileType.indexOf("image")>-1;
  487. const isLt2M = file.size / 1024 / 1024 < 6;
  488. if (!isJPG) {
  489. this.$message.error("只能上传图片");
  490. return false;
  491. }
  492. if (!isLt2M) {
  493. this.$message.error("上传头像图片大小不能超过 6MB!");
  494. return false;
  495. }
  496. var date = new Date();
  497. var ext = getFileExtension(file.name);
  498. var key = date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getHours() + "/" + date.getMinutes() + "/" + date.getSeconds() + "/" + "_s_" + file.uid+"?imageView2/2/w/500/h/500/q/90" + "." + ext;
  499. this.loading = this.$loading({
  500. lock: true,
  501. text: '上传中...',
  502. spinner: 'el-icon-loading',
  503. background: 'rgba(0, 0, 0, 0.7)'
  504. });
  505. const _self = this
  506. return new Promise((resolve, reject) => {
  507. getToken().then(response => {
  508. const token = response.data.data.uptoken
  509. _self._data.uploadData.token = token
  510. _self._data.uploadData.key = key
  511. resolve(true)
  512. }).catch(err => {
  513. console.log(err)
  514. reject(false)
  515. this.loading.close();
  516. })
  517. })
  518. },
  519. generatedialysisno(){
  520. generateDialysisNo().then(response => {
  521. this.form.dialysisNo = response.data.data.no + '';
  522. })
  523. },
  524. checkIdCardNo(){
  525. if(!isCardNo(this.form.idCardNo)){
  526. this.$message.error("身份证号码信息有误!");
  527. this.form.birth = '';
  528. return false
  529. }
  530. var thisLen = this.form.idCardNo.length;
  531. var birth = '';
  532. if (thisLen==15) {
  533. birth = "19"+this.form.idCardNo.substr(6,6);
  534. }else {
  535. birth = this.form.idCardNo.substr(6,8);
  536. }
  537. this.form.birth = birth.substr(0,4)+'-'+birth.substr(4,2)+'-'+birth.substr(6,2);
  538. this.form.age = jsGetAge(this.form.birth,'-');
  539. },
  540. hadSelectBirth(){
  541. this.form.age = jsGetAge(this.form.birth,'-');
  542. },
  543. checkHeight() {
  544. if (!isPositiveInteger(this.form.height)) {
  545. this.$message.error("身高请填写正整数!");
  546. return false
  547. }
  548. },
  549. selectFirstDialysisDate(){
  550. this.form.dialysisAge = dialysisAge(this.form.firstDialysisDate);
  551. }
  552. },
  553. };
  554. </script>
  555. <style rel="stylesheet/scss" lang="scss" scoped>
  556. .uploadHead {
  557. margin-top: 25%;
  558. }
  559. .uploadHeadBtn {
  560. width: 148px;
  561. margin-top: 10px;
  562. }
  563. .el-form-item {
  564. margin-bottom: 17px !important;
  565. .el-select {
  566. width: 100%;
  567. }
  568. .el-date-editor.el-input {
  569. width: 100%;
  570. }
  571. .textarea {
  572. width: 100%;
  573. height: 70px;
  574. border-color: #dcdfe6;
  575. padding: 5px;
  576. border-radius: 4px;
  577. }
  578. }
  579. .el-form{
  580. .el-col-6,.el-col-8{
  581. height: 59px!important;
  582. }
  583. }
  584. .el-select-dropdown{
  585. z-index: 998!important;
  586. }
  587. </style>