Home.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <template>
  2. <div ref="headerRef">
  3. <div v-show="!isDualScreen">
  4. <emr-select-pat :pat-info="patientInfo" @selected="selected"/>
  5. 住院号:
  6. <el-input v-model="query.patNo" style="width: 120px"/>
  7. 次数 ({{ query.times }}) :
  8. <emr-leave-hospital-patient @rowClick="disPatients"/>
  9. <el-button @click="allPatientsInTheHospital">全院患者</el-button>
  10. <el-button @click="patientListDrawer = !patientListDrawer">患者列表</el-button>
  11. 出院天数:{{ dischargeDays }}
  12. <span style="color: red">出院七天后就无法编辑患者病历</span>
  13. </div>
  14. </div>
  15. <div v-if="show">
  16. <div ref="divRef">
  17. <huan-zhe-xin-xi v-show="!isDualScreen"
  18. :huan-zhe-xin-xi="patientInfo"
  19. @isShow="patientInfoIsShow"/>
  20. </div>
  21. <emr-main
  22. ref="emrMainRef"
  23. :huan-zhe-xin-xi="patientInfo"
  24. :max-height="maxHeight"
  25. :is-dual-screen="isDualScreen"/>
  26. </div>
  27. <emr-patient-list @rowClick="listRowClick" v-model="patientListDrawer"/>
  28. </template>
  29. <script setup name='Home'>
  30. import EmrMain from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/EmrMain";
  31. import {getDisPatient, getPatientInfo} from "@/api/inpatient/patient";
  32. import router from "@/router";
  33. import HuanZheXinXi from "@/components/zhu-yuan-yi-sheng/HuanZheXinXi";
  34. import {BizException, ExceptionEnum} from "@/utils/BizException";
  35. import {getDischargeTimes, isDisReqEdit} from "@/api/zhu-yuan-yi-sheng/emr-patient";
  36. import {getServerDateApi} from "@/api/public-api";
  37. import {subtractTime} from "@/utils/date";
  38. import {
  39. emrConfig,
  40. query,
  41. resolveRoute
  42. } from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-init";
  43. import EmrPatientList from "@/components/zhu-yuan-yi-sheng/emr/EmrPatientList.vue";
  44. import EmrLeaveHospitalPatient from "@/components/zhu-yuan-yi-sheng/emr/EmrLeaveHospitalPatient.vue";
  45. import EmrSelectPat from "@/components/zhu-yuan-yi-sheng/EmrSelectPat.vue";
  46. import sleep from "@/utils/sleep";
  47. const divRef = ref(null)
  48. const headerRef = ref(null)
  49. const emrMainRef = ref(null)
  50. // 最大高度
  51. let maxHeight = $ref()
  52. // 是否显示页面
  53. let show = $ref(false)
  54. // 获取患者信息
  55. let patientInfo = $ref({})
  56. // 距离今天的出院天数
  57. let dischargeDays = $ref(0)
  58. // 患者列表 list
  59. let patientListDrawer = $ref(false)
  60. // 是否是双屏
  61. let isDualScreen = $ref(false)
  62. const selected = ({inpatientNo, admissTimes}) => {
  63. query.value.patNo = inpatientNo
  64. query.value.times = admissTimes
  65. query.value.maxTimes = admissTimes
  66. allPatientsInTheHospital()
  67. }
  68. // 点击查询出院患者
  69. const disPatients = async () => {
  70. if (query.value.times === 0 || !query.value.patNo) {
  71. BizException(ExceptionEnum.MESSAGE_ERROR, '请输入住院号,住院次数不能为 0 ')
  72. }
  73. query.value.state = 2
  74. let te = JSON.stringify(query.value)
  75. await router.push({
  76. name: 'emrEditor',
  77. query: {
  78. pat: window.btoa(te)
  79. }
  80. })
  81. await routerFunc()
  82. }
  83. // 解析路由数据
  84. const routerFunc = async () => {
  85. show = false
  86. if (router.currentRoute.value.query.pat) {
  87. resolveRoute(router.currentRoute.value.query.pat)
  88. if (query.value.state !== 2) {
  89. patientInfo = await getPatientInfo(query.value.patNo);
  90. }
  91. if (query.value.state === 1) {
  92. await queryActPatient()
  93. } else if (query.value.state === 2) {
  94. await queryDisPatient()
  95. } else if (query.value.state === 3) {
  96. await queryAllPatients(true)
  97. } else if (query.value.state === 4) {
  98. await queryAllPatients(false)
  99. }
  100. await nextTick()
  101. } else {
  102. show = false
  103. }
  104. }
  105. // 查询在院患者数据
  106. const queryActPatient = async () => {
  107. show = true
  108. }
  109. // 查询出院患者信息
  110. const queryDisPatient = async () => {
  111. patientInfo = await getDisPatient(query.value.patNo, query.value.times)
  112. dischargeDays = subtractTime(await getServerDateApi(), patientInfo.disDate)
  113. // 如果患者的出院时间大于 7 天就只能看病历和打印病历了
  114. emrConfig.value.editor = dischargeDays <= 7;
  115. // 如果超过了七天就去查看是否有申请编辑
  116. if (!emrConfig.value.editor) {
  117. emrConfig.value.editor = await isDisReqEdit(query.value.patNo + '_' + query.value.times)
  118. }
  119. show = true;
  120. }
  121. // 点击全院患者数据
  122. const allPatientsInTheHospital = async () => {
  123. if (!query.value.patNo) {
  124. BizException(ExceptionEnum.MESSAGE_ERROR, '请输入住院号。 ')
  125. }
  126. query.value.state = 3
  127. let te = JSON.stringify(query.value)
  128. await router.push({
  129. name: 'emrEditor',
  130. query: {
  131. pat: window.btoa(te)
  132. }
  133. })
  134. await routerFunc()
  135. }
  136. const queryAllPatients = async (flag) => {
  137. query.value.times = patientInfo.admissTimes
  138. query.value.maxTimes = patientInfo.admissTimes
  139. show = true
  140. emrConfig.value.editor = flag
  141. }
  142. const listRowClick = async (val) => {
  143. let temp = {
  144. patNo: val.inpatientNo,
  145. times: val.admissTimes,
  146. maxTimes: val.admissTimes,
  147. state: 4
  148. }
  149. let te = JSON.stringify(temp)
  150. await router.push({
  151. name: 'emrEditor',
  152. query: {
  153. pat: window.btoa(te)
  154. }
  155. })
  156. await routerFunc()
  157. }
  158. const patientInfoIsShow = (flag, height) => {
  159. maxHeight = window.innerHeight - height - 24
  160. }
  161. onMounted(async () => {
  162. await nextTick()
  163. await routerFunc()
  164. //向父项目传值
  165. window.parent.postMessage("电子病历加载完成。", "*");
  166. window.dualScreenMode = () => {
  167. isDualScreen = true
  168. emrMainRef.value.closeBothSides()
  169. }
  170. })
  171. </script>
  172. <style scoped lang="scss">
  173. </style>