FillCaseFrontSheet.vue 69 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612
  1. <template>
  2. <el-container>
  3. <el-header height="36px" style="margin-top: 8px">
  4. <el-select v-model="currentWard" @change="handleWardChange" style="width: 120px" filterable>
  5. <el-option v-for="item in userWards" :key="item.code" :value="item.code" :label="item.name"></el-option>
  6. </el-select>
  7. <el-select v-model="inOutStatus" style="width: 80px" @change="changeInOutStatus">
  8. <el-option v-for="item in inOutOptions" :key="item.code" :value="item.code" :label="item.name"></el-option>
  9. </el-select>
  10. <el-button type="primary" icon="el-icon-date" v-show="inOutStatus === 2" @click="showSelectDateRange = true"> 日期范围 </el-button>
  11. <el-divider direction="vertical"></el-divider>
  12. <el-input v-model="inpatientNo" style="width: 110px" placeholder="住院号" clearable></el-input>
  13. <el-button type="primary" icon="el-icon-search" @click="searchPatient">搜索患者</el-button>
  14. <el-divider direction="vertical"></el-divider>
  15. <el-button type="primary" icon="el-icon-edit" @click="openYbDiag" :disabled="inOutStatus === 2">医保诊断</el-button>
  16. <el-button type="primary" icon="el-icon-upload" @click="saveVerify(1)">保存首页</el-button>
  17. <el-button type="success" icon="el-icon-printer" @click="beforePrint(1)">打印正面</el-button>
  18. <el-button type="success" icon="el-icon-printer" @click="beforePrint(2)">打印反面</el-button>
  19. <el-button type="danger" icon="el-icon-document" @click="execSignApply">归档申请</el-button>
  20. </el-header>
  21. <el-container>
  22. <el-aside width="245px">
  23. <el-table :data="overview" :height="tableHeight" stripe highlight-current-row @row-click="fetchSheetInfo">
  24. <el-table-column prop="bedNo" label="床" width="30"></el-table-column>
  25. <el-table-column label="姓名" width="70">
  26. <template #default="scope">
  27. <img class="sex-icon" :src="scope.row.sex === 1 ? maleIcon : femaleIcon" />
  28. {{ scope.row.name }}
  29. </template>
  30. </el-table-column>
  31. <el-table-column label="住院号-次数" width="80">
  32. <template #default="scope">
  33. <span style="font-weight: bold; color: black">{{ scope.row.bah }}</span
  34. >-{{ scope.row.times }}
  35. </template>
  36. </el-table-column>
  37. <el-table-column prop="doctorName" label="医生" width="45"></el-table-column>
  38. </el-table>
  39. </el-aside>
  40. <el-main>
  41. <div style="display: flex">
  42. <div :style="mainInfo" id="scrollWrapper">
  43. <div id="page0">
  44. <h3 style="width: 100%; font-size: 17px; text-align: center">住 院 病 案 首 页</h3>
  45. <div style="width: 100%; height: 32px; line-height: 32px; font-size: 15px; text-align: center">
  46. 医疗机构: <span style="font-weight: 700">湖南泰和医院</span> (组织机构代码: <span style="font-weight: 700">43010150145</span>)
  47. </div>
  48. <div style="height: 25px; line-height: 25px; display: flex">
  49. <div>
  50. 医疗付费方式:
  51. <select v-model="patient.payMethod" style="width: 180px">
  52. <option v-for="(item, index) in dics.getPayMethod" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  53. </select>
  54. </div>
  55. <div style="width: 120px; margin-left: 12px">健康卡号: {{ patient.healthCardNo }}</div>
  56. <div style="width: 100px">第&nbsp;{{ patient.admissTimes }}&nbsp;次住院</div>
  57. <div style="width: 130px">病案号: {{ patient.bah }}</div>
  58. </div>
  59. </div>
  60. <div id="page1" style="border: 1px solid black; padding: 5px">
  61. <div>
  62. 姓名: <input id="name" v-model="patient.name" style="width: 70px" />
  63. 性别:
  64. <select id="sex" v-model="patient.sex">
  65. <option v-for="(item, index) in dics.getSexCode" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  66. </select>
  67. 出生日期: <input id="birthDate" v-model="patient.birthDate" style="width: 130px" /> 年龄:
  68. <input id="age" v-model="patient.age" style="width: 30px" />
  69. 国籍:
  70. <select id="country" v-model="patient.country">
  71. <option v-for="(item, index) in dics.getCountry" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  72. </select>
  73. </div>
  74. <div>
  75. (年龄不足 1 周岁的)年龄:
  76. <input id="ageDays" v-model="patient.ageDays" style="width: 50px" />天 新生儿出生体重:
  77. <input id="newBornWeight" v-model="patient.newBornWeight" style="width: 70px" />克 新生儿入院体重:
  78. <input id="newBornAdmissWeight" v-model="patient.newBornAdmissWeight" style="width: 70px" />克
  79. </div>
  80. <div>
  81. 出生地:
  82. <input id="birthPlaceName" v-model="patient.birthPlaceName" style="width: 230px" @click="showSearchData('birth')" />
  83. 籍贯:
  84. <input id="nativePlaceName" v-model="patient.nativePlaceName" style="width: 170px" @click="showSearchData('native')" />
  85. 民族:
  86. <select id="nation" v-model="patient.nation">
  87. <option v-for="(item, index) in dics.getNation" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  88. </select>
  89. </div>
  90. <div>
  91. 身份证号:
  92. <input id="socialNo" v-model="patient.socialNo" style="width: 160px" maxlength="18" />
  93. 职业:
  94. <select id="occupation" v-model="patient.occupation">
  95. <option v-for="(item, index) in dics.getOccupation" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  96. </select>
  97. 婚姻:
  98. <select id="marriage" v-model="patient.marriage">
  99. <option v-for="(item, index) in dics.getMarriageCode" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  100. </select>
  101. </div>
  102. <div>
  103. 现住址: <input id="livePlace" v-model="patient.livePlace" style="width: 300px" /> 电话: <input id="phone" v-model="patient.phone" style="width: 90px" />
  104. 邮编:
  105. <input id="addrZipCode" v-model="patient.addrZipCode" style="width: 70px" maxlength="6" />
  106. </div>
  107. <div>
  108. 户口地址:
  109. <input id="hkPlaceName" v-model="patient.hkPlaceName" style="width: 300px" @click="showGoSearchBtn1 = true" @blur="dismissShowSearch(1)" />
  110. <el-button icon="el-icon-search" type="primary" v-show="showGoSearchBtn1" @click="showSearchData('hk')"> 前往搜索 </el-button>
  111. 邮编:
  112. <input id="hkZipCode" v-model="patient.hkZipCode" style="width: 70px" maxlength="6" />
  113. </div>
  114. <div>
  115. 工作单位及地址:
  116. <input id="unitName" v-model="patient.unitName" style="margin-right: 0; width: 145px" />
  117. /<input id="unitPlace" v-model="patient.unitPlace" style="width: 145px" /> 单位电话: <input id="unitPhone" v-model="patient.unitPhone" style="width: 80px" />
  118. 邮编:
  119. <input id="unitZipCode" v-model="patient.unitZipCode" style="width: 50px" maxlength="6" />
  120. </div>
  121. <div>
  122. 联系人姓名: <input id="contactName" v-model="patient.contactName" style="width: 90px" />
  123. 联系人关系:
  124. <select id="contactRelation" v-model="patient.contactRelation">
  125. <option v-for="(item, index) in dics.getRelations" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  126. </select>
  127. </div>
  128. <div>
  129. 联系人地址:
  130. <input id="contactAddrName" v-model="patient.contactAddrName" style="width: 300px" @click="showGoSearchBtn2 = true" @blur="dismissShowSearch(2)" />
  131. <el-button icon="el-icon-search" type="primary" v-show="showGoSearchBtn2" @click="showSearchData('contact')">前往搜索 </el-button>
  132. 联系人电话: <input id="contactPhone" v-model="patient.contactPhone" style="width: 90px" />
  133. </div>
  134. <div>
  135. 入院途径:
  136. <select id="zyAdmissWay" v-model="patient.zyAdmissWay">
  137. <option v-for="(item, index) in dics.getAdmissWay" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  138. </select>
  139. 是否手术:
  140. <select id="hasSurgery" v-model="patient.hasSurgery" @change="hasSurgeryChanged(patient.hasSurgery)">
  141. <option v-for="itm in operations" :key="itm.code" :value="itm.code">{{ itm.name }}</option>
  142. </select>
  143. </div>
  144. <div>
  145. 入院时间:<input id="admissDate" v-model="patient.admissDate" readonly style="width: 135px" /> 入院科别:<input
  146. v-model="patient.admissDept"
  147. readonly
  148. style="width: 120px"
  149. />
  150. 病房:<input v-model="patient.admissWard" readonly style="width: 80px" /> 转科科别:<input v-model="patient.transDept" readonly style="width: 120px" />
  151. </div>
  152. <div>
  153. 出院时间:<input id="dismissDate" v-model="patient.dismissDate" readonly style="width: 135px" /> 出院科别:<input
  154. v-model="patient.dismissDept"
  155. readonly
  156. style="width: 120px"
  157. />
  158. 病房:<input v-model="patient.dismissWard" readonly style="width: 80px" /> 住院天数:<input id="admissDays" v-model="patient.admissDays" style="width: 70px" />
  159. </div>
  160. <div>
  161. 门(急)诊诊断:
  162. <input v-model="patient.clinicDiagStr" readonly style="width: 350px" @click="showSearchData('clinicdiag')" />
  163. 疾病编码:
  164. <input v-model="patient.clinicDiagCode" readonly style="width: 110px" @click="showSearchData('clinicdiag')" />
  165. </div>
  166. <div id="diagTable" style="height: max-content; display: flex; width: 720px">
  167. <div style="width: 360px">
  168. <table style="width: 100%; border: 1px solid black; border-collapse: collapse">
  169. <tr>
  170. <th>主要诊断</th>
  171. <th>疾病编码</th>
  172. <th>入院病情</th>
  173. <th>出院病情</th>
  174. </tr>
  175. <tr>
  176. <td>
  177. <input id="disdiagMain" style="border: none !important; width: 170px" v-model="patient.disdiagList[0].name" @click="onSearchDiagFocus(0)" readonly />
  178. <div v-show="showDel[0]" class="not-print" style="width: 100%; text-align: center">
  179. <el-button type="primary" icon="el-icon-edit" @click="showSearch = true">修改</el-button>
  180. </div>
  181. </td>
  182. <td style="text-align: center">
  183. <input style="border: none !important; width: 100px" v-model="patient.disdiagList[0].code" readonly />
  184. </td>
  185. <td>
  186. <select id="disdiagMainAdmStatus" style="border: none !important; width: 30px" v-model="patient.disdiagList[0].admissStatus">
  187. <option v-for="(item, index) in dics.getDisAdmissStatus" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.code }}&nbsp;&nbsp;</option>
  188. </select>
  189. </td>
  190. <td>
  191. <select style="border: none !important; width: 30px" v-model="patient.disdiagList[0].dismissStatus" @change="handleSelectCybq">
  192. <option v-for="(item, index) in dics.getDisdiagStatus" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.code }}&nbsp;&nbsp;</option>
  193. </select>
  194. </td>
  195. </tr>
  196. <tr>
  197. <th colspan="4">其他诊断</th>
  198. </tr>
  199. <tr v-for="n in 11" :key="n">
  200. <td>
  201. <input style="border: none !important; text-align: left; padding-left: 5px" v-model="patient.disdiagList[n].name" @click="onSearchDiagFocus(n)" readonly />
  202. <div v-show="showDel[n]" class="not-print" style="width: 100%; text-align: center">
  203. <el-button type="primary" circle icon="el-icon-edit" @click="showSearch = true"></el-button>
  204. <el-button type="danger" circle icon="el-icon-delete" @click="deleteDisdiag(n)"></el-button>
  205. <el-button type="success" circle icon="el-icon-plus" @click="insertDisdiag(n)"></el-button>
  206. </div>
  207. </td>
  208. <td>
  209. <input style="border: none !important; width: 90px" v-model="patient.disdiagList[n].code" readonly />
  210. </td>
  211. <td>
  212. <select style="border: none !important; width: 30px" v-model="patient.disdiagList[n].admissStatus">
  213. <option v-for="(item, index) in dics.getDisAdmissStatus" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.code }}&nbsp;&nbsp;</option>
  214. </select>
  215. </td>
  216. <td>
  217. <select style="border: none !important; width: 30px" v-model="patient.disdiagList[n].dismissStatus" @change="handleSelectCybq">
  218. <option v-for="(item, index) in dics.getDisdiagStatus" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.code }}&nbsp;&nbsp;</option>
  219. </select>
  220. </td>
  221. </tr>
  222. </table>
  223. </div>
  224. <div style="width: 360px">
  225. <table style="border: 1px solid black; border-collapse: collapse">
  226. <tr v-for="n in 14" :key="n">
  227. <td>
  228. <input style="border: none !important; width: 170px" v-model="patient.disdiagList[n + 11].name" @click="onSearchDiagFocus(n + 11)" readonly />
  229. <div v-show="showDel[n + 11]" class="not-print" style="width: 100%; text-align: center">
  230. <button circle @click="showSearch = true">
  231. <i class="el-icon-edit"></i>
  232. </button>
  233. <button circle @click="deleteDisdiag(n + 11)">
  234. <i class="el-icon-delete"></i>
  235. </button>
  236. <button circle @click="insertDisdiag(n + 11)">
  237. <i class="el-icon-upload"></i>
  238. </button>
  239. </div>
  240. </td>
  241. <td>
  242. <input style="border: none !important; width: 100px" v-model="patient.disdiagList[n + 11].code" readonly />
  243. </td>
  244. <td>
  245. <select style="border: none !important; width: 30px" v-model="patient.disdiagList[n + 11].admissStatus">
  246. <option v-for="(item, index) in dics.getDisAdmissStatus" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.code }}&nbsp;&nbsp;</option>
  247. </select>
  248. </td>
  249. <td>
  250. <select style="border: none !important; width: 30px" v-model="patient.disdiagList[n + 11].dismissStatus" @change="handleSelectCybq">
  251. <option v-for="(item, index) in dics.getDisdiagStatus" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.code }}&nbsp;&nbsp;</option>
  252. </select>
  253. </td>
  254. </tr>
  255. </table>
  256. </div>
  257. </div>
  258. <div style="border-bottom: 1px solid black; font-size: 12px">
  259. 备注:
  260. <span>入院病情:</span>1.有,2.临床未确定,3.情况不明,4.无 <span style="margin-left: 10px">出院病情:</span>1.治愈,2.好转,3.未愈,4.死亡,9.其他
  261. </div>
  262. <div>
  263. 损伤、中毒的外部原因:
  264. <input id="hurtReasonName" v-model="patient.hurtReasonName" style="width: 300px" @click="showSearchData('hurt')" />
  265. 疾病编码:
  266. <input id="hurtReasonCode" v-model="patient.hurtReasonCode" style="width: 110px" readonly />
  267. </div>
  268. <div>
  269. 病理诊断:
  270. <input id="pathologicDiagStr" v-model="patient.pathologicDiagStr" style="width: 300px" @click="showSearchData('pathologic')" />
  271. 病理编码:
  272. <input id="pathologicDiagCode" v-model="patient.pathologicDiagCode" style="width: 90px" readonly />
  273. 病理号: <input id="blh" v-model="patient.blh" style="width: 70px" />
  274. </div>
  275. <div>
  276. 药物过敏:
  277. <select id="allergy" v-model="patient.allergy" @change="onAllergyChanged">
  278. <option v-for="(item, index) in haveOrNot" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  279. </select>
  280. ,过敏药物:
  281. <input id="allergicMedicine" v-model="patient.allergicMedicine" style="width: 110px" />
  282. 死亡患者尸检:
  283. <select id="autopsy" v-model="patient.autopsy">
  284. <option v-for="(item, index) in autopsies" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  285. </select>
  286. </div>
  287. <div>
  288. 输血前四项: HbsAg
  289. <select id="hbsAg" v-model="patient.hbsAg">
  290. <option v-for="(item, index) in dics.getHbsag" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  291. </select>
  292. HCV-Ab
  293. <select id="hcvAb" v-model="patient.hcvAb" style="margin-left: 8px">
  294. <option v-for="(item, index) in dics.getHbsag" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  295. </select>
  296. HIV-Ab
  297. <select id="hivAb" v-model="patient.hivAb" style="margin-left: 8px">
  298. <option v-for="(item, index) in dics.getHbsag" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  299. </select>
  300. TP-Ab
  301. <select id="tpAb" v-model="patient.tpAb" style="margin-left: 8px">
  302. <option v-for="(item, index) in dics.getHbsag" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  303. </select>
  304. </div>
  305. <div>
  306. 血型:
  307. <select id="bloodType" v-model="patient.bloodType" @change="handleSelectBloodType">
  308. <option v-for="(item, index) in dics.getBloodType" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  309. </select>
  310. Rh:
  311. <select id="rh" v-model="patient.rh">
  312. <option v-for="(item, index) in dics.getHbsag" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  313. </select>
  314. </div>
  315. <div>
  316. 科室主任:
  317. <input id="deptLeaderName" style="width: 70px" v-model="patient.deptLeaderName" @click="showSearchData('deptleader')" />
  318. 主任(副主任)医师:
  319. <input id="leaderDoctorName" style="width: 70px" v-model="patient.leaderDoctorName" @click="showSearchData('leaderdoctor')" />
  320. 主治医师:
  321. <input id="mainDoctorName" style="width: 70px" v-model="patient.mainDoctorName" @click="showSearchData('maindoctor')" />
  322. 住院医师:
  323. <input id="admissDoctorName" style="width: 70px" v-model="patient.admissDoctorName" @click="showSearchData('admissdoctor')" />
  324. </div>
  325. <div>
  326. 责任护士:
  327. <input id="dutyNurseName" style="width: 70px" v-model="patient.dutyNurseName" @click="showSearchData('dutynurse')" />
  328. 进修医师:
  329. <input id="studyDoctorName" style="width: 70px" v-model="patient.studyDoctorName" @click="showSearchData('studydoctor')" />
  330. 实习医师:
  331. <input id="internshipDoctorName" style="width: 70px" v-model="patient.internshipDoctorName" @click="showSearchData('internshipdoctor')" />
  332. 编码员:
  333. <input style="width: 70px" v-model="patient.coderName" @click="showSearchData('coder')" />
  334. </div>
  335. <div>
  336. 病案质量:
  337. <select id="qualityControlLevel" v-model="patient.qualityControlLevel">
  338. <option v-for="(item, index) in dics.getQualityLevel" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  339. </select>
  340. 质控医师:
  341. <input id="qualityControlDoctorName" style="width: 70px" v-model="patient.qualityControlDoctorName" @click="showSearchData('qualitycontroldoctor')" />
  342. 质控护士:
  343. <input style="width: 70px" v-model="patient.qualityControlNurseName" @click="showSearchData('qualitycontrolnurse')" />
  344. 质控日期:
  345. <input id="qualityControlDate" style="width: 170px" type="date" v-model="patient.qualityControlDate" />
  346. </div>
  347. </div>
  348. <div id="page2" style="border: 1px solid black; padding: 5px">
  349. <table id="surgeryTable" style="border: 1px solid black; border-collapse: collapse; width: 100%">
  350. <tr>
  351. <th rowspan="2">手术及操作名称</th>
  352. <th rowspan="2" style="width: 70px">手术及操作日期</th>
  353. <th rowspan="2" style="width: 10px">手术级别</th>
  354. <th rowspan="2">手术及操作编码</th>
  355. <th colspan="3">手术及操作医师</th>
  356. <th rowspan="2" style="width: 30px">切口愈合等级</th>
  357. <th rowspan="2">麻醉方式</th>
  358. <th rowspan="2">麻醉医师</th>
  359. </tr>
  360. <tr>
  361. <th>术者</th>
  362. <th>I助</th>
  363. <th>II助</th>
  364. </tr>
  365. <tr v-for="n in 5" :key="n">
  366. <td style="padding: 3px">
  367. <textarea
  368. id="surgeryMain"
  369. style="border: none !important; width: 90px"
  370. rows="3"
  371. v-model="patient.surgeryList[n - 1].name"
  372. @click="onSearchSurgeryFocus(n - 1)"
  373. readonly
  374. ></textarea>
  375. <div v-show="showDel[n - 1]" class="not-print" style="width: 100%; text-align: center">
  376. <el-button type="primary" circle icon="el-icon-edit" @click="onEditSurgeryClick(n - 1)"></el-button>
  377. <el-button type="danger" circle icon="el-icon-delete" @click="deleteSurgery(n - 1)"></el-button>
  378. </div>
  379. </td>
  380. <td style="padding: 3px">
  381. <textarea
  382. style="border: none !important; width: 70px"
  383. v-model="patient.surgeryList[n - 1].date"
  384. rows="3"
  385. @click="showPickSurgeryDatetime(n - 1)"
  386. readonly
  387. ></textarea>
  388. </td>
  389. <td style="text-align-last: center">
  390. <select style="border: none !important; width: 30px" v-model="patient.surgeryList[n - 1].level">
  391. <option v-for="(item, index) in dics.getOperateScale" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.code }}</option>
  392. </select>
  393. </td>
  394. <td>
  395. <input v-model="patient.surgeryList[n - 1].code" style="border: none !important; width: 70px" readonly />
  396. </td>
  397. <td>
  398. <input style="border: none !important; width: 40px" v-model="patient.surgeryList[n - 1].operatorName" @click="showSearchSurgerior('operator', n)" />
  399. </td>
  400. <td style="width: 50px">
  401. <input style="border: none !important; width: 40px" v-model="patient.surgeryList[n - 1].assistantOneName" @click="showSearchSurgerior('assistantone', n)" />
  402. </td>
  403. <td style="width: 50px">
  404. <input style="border: none !important; width: 40px" v-model="patient.surgeryList[n - 1].assistantTwoName" @click="showSearchSurgerior('assistanttwo', n)" />
  405. </td>
  406. <td style="text-align-last: center">
  407. <select v-model="patient.surgeryList[n - 1].cutHeal" style="border: none !important">
  408. <option v-for="(item, index) in dics.getCutHealGrade" :key="index" :value="item.code">
  409. {{ item.code }}
  410. </option>
  411. </select>
  412. </td>
  413. <td>
  414. <select v-model="patient.surgeryList[n - 1].anaesthesia" style="border: none !important">
  415. <option v-for="(item, index) in dics.getAnaesthesia" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  416. </select>
  417. </td>
  418. <td>
  419. <input style="border: none !important; width: 40px" v-model="patient.surgeryList[n - 1].anaesthesiaorName" @click="showSearchSurgerior('anaesthesiaor', n)" />
  420. </td>
  421. </tr>
  422. </table>
  423. <div>
  424. 离院方式:
  425. <select id="zyDismissWay" v-model="patient.zyDismissWay" @change="onDismissWayChanged">
  426. <option v-for="(item, index) in dics.getZyDismissWay" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  427. </select>
  428. ,拟接收医疗机构名称:
  429. <input id="dismissDestination" v-model="patient.dismissDestination" style="width: 210px" />
  430. </div>
  431. <div>
  432. 是否有出院31天内再住院计划:
  433. <select id="admissAgainInOneMonth" v-model="patient.admissAgainInOneMonth" @change="onAdmissAgainChanged">
  434. <option v-for="(item, index) in haveOrNot" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  435. </select>
  436. ,目的:
  437. <input id="admissAgainPurpose" v-model="patient.admissAgainPurpose" style="width: 300px" />
  438. </div>
  439. <div>
  440. 颅脑损伤患者昏迷时间: 入院前<input id="comaDaysBeforeAdmiss" v-model="patient.comaDaysBeforeAdmiss" style="width: 30px" />天
  441. <input id="comaHoursBeforeAdmiss" v-model="patient.comaHoursBeforeAdmiss" style="width: 30px" />小时
  442. <input id="comaMinutesBeforeAdmiss" v-model="patient.comaMinutesBeforeAdmiss" style="width: 30px" />分钟 入院后<input
  443. v-model="patient.comaDaysAfterAdmiss"
  444. style="width: 30px"
  445. />天 <input id="comaHoursAfterAdmiss" v-model="patient.comaHoursAfterAdmiss" style="width: 30px" />小时
  446. <input id="comaMinutesAfterAdmiss" v-model="patient.comaMinutesAfterAdmiss" style="width: 30px" />分钟
  447. </div>
  448. <div>
  449. 住院费用(元): 总费用
  450. <input v-model="patient.totalCost" style="width: 110px" readonly />
  451. (自付金额:
  452. <input v-model="patient.selfPay" style="width: 110px" readonly />)
  453. </div>
  454. <div>
  455. 1.综合医疗服务类: (1)一般医疗服务费:
  456. <input v-model="patient.generalMedicalServiceFee" style="width: 70px" readonly />
  457. (2)一般治疗操作费:
  458. <input v-model="patient.generalTreatmentOperatingFee" style="width: 70px" readonly />
  459. (3)护理费:
  460. <input v-model="patient.careFee" style="width: 50px" readonly />
  461. </div>
  462. <div>
  463. (4)其他费:
  464. <input v-model="patient.elseFee" style="width: 70px" readonly />
  465. </div>
  466. <div>
  467. 2.诊断类: (5)病理诊断费:
  468. <input v-model="patient.pathologicDiagFee" style="width: 70px" readonly />
  469. (6)实验室诊断费:
  470. <input v-model="patient.experimentDiagFee" style="width: 70px" readonly />
  471. (7)影像学诊断费:
  472. <input v-model="patient.ctDiagFee" style="width: 70px" readonly />
  473. </div>
  474. <div>
  475. (8)临床诊断项目费:
  476. <input v-model="patient.clinicalDiagFee" style="width: 70px" readonly />
  477. </div>
  478. <div>
  479. 3.治疗类: (9)非手术治疗项目费:
  480. <input v-model="patient.notSurgicalFee" style="width: 70px" readonly />
  481. (临床物理治疗费:
  482. <input v-model="patient.clinicalPhysicalFee" style="width: 70px" readonly />)
  483. </div>
  484. <div>
  485. (10)手术治疗费:
  486. <input v-model="patient.surgicalFee" style="width: 70px" readonly />
  487. (麻醉费:
  488. <input v-model="patient.anesthetizeFee" style="width: 70px" readonly />
  489. &nbsp;&nbsp;手术费:
  490. <input v-model="patient.surgeryFee" style="width: 70px" readonly />)
  491. </div>
  492. <div>
  493. 4.康复类: (11)康复费:
  494. <input v-model="patient.recoverFee" style="width: 70px" readonly />
  495. </div>
  496. <div>
  497. 5.中医类: (12)中医治疗费:
  498. <input v-model="patient.tcmTreatmentFee" style="width: 70px" readonly />
  499. </div>
  500. <div>
  501. 6.西药类: (13)西药费:
  502. <input v-model="patient.westMedicineFee" style="width: 70px" readonly />
  503. </div>
  504. <div>
  505. 7.中药类: (14)中成药费:
  506. <input v-model="patient.chinesePatentMedicineFee" style="width: 70px" readonly />
  507. (15)中草药费:
  508. <input v-model="patient.chineseHerbalMedicineFee" style="width: 70px" readonly />
  509. </div>
  510. <div>
  511. 8.血液和血液制品类: (16)血费:
  512. <input v-model="patient.bloodFee" style="width: 50px" readonly />
  513. (17)白蛋白类制品费:
  514. <input v-model="patient.albuminProductsFee" style="width: 50px" readonly />
  515. (18)球蛋白类制品费:
  516. <input v-model="patient.globulinProductsFee" style="width: 50px" readonly />
  517. </div>
  518. <div>
  519. (19)凝血因子类制品费:
  520. <input v-model="patient.coagulationFactorProductsFee" style="width: 70px" readonly />
  521. (20)细胞因子类制品费:
  522. <input v-model="patient.cytokineProductsFee" style="width: 70px" readonly />
  523. </div>
  524. <div>
  525. 9.耗材类: (21)检查用一次性医用材料费:
  526. <input v-model="patient.costOfDisposableMedicalMaterialsForExamination" style="width: 70px" readonly />
  527. (22)治疗用一次性医用材料费:
  528. <input v-model="patient.costOfDisposableMedicalMaterialsForTreatment" style="width: 70px" readonly />
  529. </div>
  530. <div>
  531. (23)手术用一次性医用材料费:
  532. <input v-model="patient.costOfDisposableMedicalMaterialsForOperation" style="width: 70px" readonly />
  533. </div>
  534. <div>
  535. 10.其他类: (24)其他费:
  536. <input v-model="patient.otherFees" style="width: 70px" readonly />
  537. </div>
  538. <div>
  539. 主要诊断治愈好转情况:
  540. <span style="border-bottom: 1px solid black; padding: 0 5px">
  541. {{ filterDismissStatus(patient.disdiagList[0].dismissStatus) }}
  542. </span>
  543. </div>
  544. <div>
  545. 诊断符合情况: 门诊与出院
  546. <select id="diagConform1" v-model="patient.diagConform1" style="margin-right: 12px">
  547. <option v-for="(item, index) in dics.getDiagConform" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  548. </select>
  549. 入院与出院
  550. <select id="diagConform2" v-model="patient.diagConform2">
  551. <option v-for="(item, index) in dics.getDiagConform" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  552. </select>
  553. </div>
  554. <div>
  555. 术前与术后
  556. <select id="diagConform3" v-model="patient.diagConform3" style="margin-right: 12px">
  557. <option v-for="(item, index) in dics.getDiagConform" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  558. </select>
  559. 临床与病理
  560. <select id="diagConform4" v-model="patient.diagConform4" style="margin-right: 12px">
  561. <option v-for="(item, index) in dics.getDiagConform" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  562. </select>
  563. 放射与病理
  564. <select id="diagConform5" v-model="patient.diagConform5">
  565. <option v-for="(item, index) in dics.getDiagConform" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  566. </select>
  567. </div>
  568. <div>
  569. 抢救情况: 抢救
  570. <input id="rescueTimes" v-model="patient.rescueTimes" type="number" style="width: 90px" />次, 成功
  571. <input id="rescueSuccessTimes" v-model="patient.rescueSuccessTimes" type="number" style="width: 90px" />次
  572. </div>
  573. <div>
  574. 病例分型:
  575. <select id="caseClassification" v-model="patient.caseClassification" style="margin-right: 12px">
  576. <option v-for="(item, index) in dics.getCaseClassification" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  577. </select>
  578. 实施重症监护:
  579. <select id="hasIcu" v-model="patient.hasIcu" @change="handleSelectIcu">
  580. <option v-for="(item, index) in haveOrNot" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  581. </select>
  582. ,监护总时间:
  583. <input id="icuDays" v-model="patient.icuDays" style="width: 30px" />天 <input id="icuHours" v-model="patient.icuHours" style="width: 30px" />小时
  584. </div>
  585. <div>
  586. 单病种管理:
  587. <select id="monopathyManagement" v-model="patient.monopathyManagement" style="margin-right: 12px">
  588. <option v-for="(item, index) in yesOrNo" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  589. </select>
  590. 实施临床路径管理:
  591. <select id="clinicalPathwayManagement" v-model="patient.clinicalPathwayManagement" style="margin-right: 12px">
  592. <option v-for="(item, index) in dics.getClinicalPathwayManagement" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  593. </select>
  594. 实施DRGs管理:
  595. <select id="drgsManagement" v-model="patient.drgsManagement">
  596. <option v-for="(item, index) in dics.getDrgsManagement" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  597. </select>
  598. </div>
  599. <div>
  600. 抗生素使用:
  601. <select id="useAntibiotic" v-model="patient.useAntibiotic" style="margin-right: 12px">
  602. <option v-for="(item, index) in yesOrNo" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  603. </select>
  604. 细菌培养标本送检:
  605. <select id="bacilliculture" v-model="patient.bacilliculture" style="margin-right: 12px">
  606. <option value="1">&nbsp;&nbsp;是&nbsp;&nbsp;</option>
  607. <option value="2">&nbsp;&nbsp;否&nbsp;&nbsp;</option>
  608. </select>
  609. 法定传染病:
  610. <select id="statutoryEpidemic" v-model="patient.statutoryEpidemic">
  611. <option v-for="(item, index) in dics.getStatutoryEpidemic" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  612. </select>
  613. </div>
  614. <div>
  615. 肿瘤分期: T
  616. <select id="tumorLevelT" v-model="patient.tumorLevelT" style="margin-right: 12px">
  617. <option v-for="(item, index) in dics.getTumorLevelT" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  618. </select>
  619. N
  620. <select id="tumorLevelN" v-model="patient.tumorLevelN" style="margin-right: 12px">
  621. <option v-for="(item, index) in dics.getTumorLevelN" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  622. </select>
  623. M
  624. <select id="tumorLevelM" v-model="patient.tumorLevelM" style="margin-right: 12px">
  625. <option v-for="(item, index) in dics.getTumorLevelM" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  626. </select>
  627. 分期
  628. <select id="tumorLevel" v-model="patient.tumorLevel" style="margin-right: 18px">
  629. <option v-for="(item, index) in dics.getTumorLevel" :key="index" :value="item.code">&nbsp;&nbsp;{{ item.name }}&nbsp;&nbsp;</option>
  630. </select>
  631. 新生儿Apgar评分: <input style="margin-right: 0; width: 50px" v-model="patient.xxeApgar" />分
  632. </div>
  633. </div>
  634. </div>
  635. <span class="m-drawer">
  636. <el-drawer v-model="showMessageDrawer" title="首页保存/打印校验结果" size="260px" modal-class="modal-class">
  637. <div class="page-inner">
  638. <div v-if="forceVerifies.length === 0 && adviceVerifies.length === 0" class="no-verify-message">暂无校验内容</div>
  639. <div v-show="forceVerifies.length > 0" style="padding: 8px 0 4px 0; font-weight: bold">以下条目为强制要求,请完善。</div>
  640. <div v-for="(item, index) in forceVerifies" :key="index" class="message-item" :style="messageColor(index)" @click="handleClickMessage(item.code, index)">
  641. {{ index + 1 }}、{{ item.name }}
  642. </div>
  643. <div v-show="adviceVerifies.length > 0" style="padding: 8px 0 4px 0; font-weight: bold">以下条目为建议执行,不做强制要求。</div>
  644. <div v-for="(item, index) in adviceVerifies" :key="index" style="padding: 6px; margin-bottom: 6px; border-radius: 4px; background: #eea7a752; color: #ff2b2b">
  645. {{ index + 1 }}、{{ item.name }}
  646. </div>
  647. </div>
  648. </el-drawer>
  649. </span>
  650. <div class="rightside-btn" @click="showMessageDrawer = !showMessageDrawer">首页保存 / 打印校验结果</div>
  651. </div>
  652. <div id="headpage" style="opacity: 0; position: fixed">
  653. <HeadPage :patient="patient" :dics="dics" />
  654. </div>
  655. <div id="tailpage" style="opacity: 0; position: fixed">
  656. <TailPage :patient="patient" :dics="dics" />
  657. </div>
  658. </el-main>
  659. </el-container>
  660. <el-dialog v-model="showSelectDateRange" title="出院日期" width="320px">
  661. <div style="height: 20px"></div>
  662. 请选择出院日期范围:
  663. <div style="height: 10px"></div>
  664. <el-date-picker
  665. v-model="dateRange"
  666. type="daterange"
  667. range-separator="至"
  668. start-placeholder="开始日期"
  669. end-placeholder="结束日期"
  670. :shortcuts="shortcuts"
  671. style="width: 260px"
  672. ></el-date-picker>
  673. <div style="margin: 20px 0 10px 0; width: 100%; text-align: right">
  674. <el-button type="primary" icon="el-icon-check" @click="confirmDateRange">确定</el-button>
  675. </div>
  676. </el-dialog>
  677. <el-dialog v-model="showYbDiag" title="医保出院诊断" width="70%" top="30px">
  678. <div style="width: 100%; height: 30px; line-height: 30px; background: rgb(252, 160, 23); margin-bottom: 8px; border-radius: 8px; padding-left: 8px; color: white">
  679. <strong>主要诊断病种分值:{{ diseFamilyGrade }}</strong>
  680. </div>
  681. <el-tag type="info">医保诊断录入</el-tag>
  682. <el-tag style="margin-left: 12px">患者:{{ patient.name }}</el-tag>
  683. <el-tag style="margin-left: 8px">医疗类别:{{ patient.medTypeName }}</el-tag>
  684. <el-tag style="margin-left: 8px">险种类型:{{ patient.insutype }}</el-tag>
  685. <div style="height: 5px"></div>
  686. <el-input placeholder="在此搜索诊断" style="width: 160px" v-model="ybDiag.name" @click="showSearchData('ybDiag')"></el-input>
  687. <el-input placeholder="诊断编码" disabled style="width: 100px" v-model="ybDiag.code"></el-input>
  688. <el-select v-model="ybDiag.siDiagType" style="width: 100px" placeholder="诊断类别">
  689. <el-option v-for="item in diagTypes" :key="item.code" :value="item.code" :label="item.name"></el-option>
  690. </el-select>
  691. <el-select v-model="ybDiag.admissCond" style="width: 100px" placeholder="入院病情">
  692. <el-option v-for="item in admissConds" :key="item.code" :value="item.code" :label="item.name"></el-option>
  693. </el-select>
  694. <el-select v-model="ybDiag.cyzg" style="width: 120px" placeholder="出院转归">
  695. <el-option v-for="item in cyzgs" :key="item.code" :value="item.code" :label="item.name"></el-option>
  696. </el-select>
  697. <el-divider direction="vertical"></el-divider>
  698. <el-button type="primary" icon="el-icon-plus" @click="addToYbDiags">添加</el-button>
  699. <el-button type="success" icon="el-icon-upload" @click="saveYbDiags">保存</el-button>
  700. <el-table :data="ybDiags" stripe :height="200">
  701. <el-table-column type="index" label="序号" width="45"></el-table-column>
  702. <el-table-column prop="code" label="诊断编码"></el-table-column>
  703. <el-table-column prop="name" label="诊断名称"></el-table-column>
  704. <el-table-column prop="siDiagType" label="诊断类别" width="80"></el-table-column>
  705. <el-table-column prop="admissCond" label="入院病情" width="80"></el-table-column>
  706. <el-table-column prop="cyzg" label="出院转归" width="80"></el-table-column>
  707. <el-table-column prop="operId" label="录入人" width="70"></el-table-column>
  708. <el-table-column prop="opDate" label="录入日期"></el-table-column>
  709. <el-table-column label="操作">
  710. <template #default="scope">
  711. <el-button type="danger" icon="el-icon-delete" @click="deleteYbDiag(scope.$index)">删除</el-button>
  712. </template>
  713. </el-table-column>
  714. </el-table>
  715. <div style="height: 12px"></div>
  716. <el-tag type="info">病案首页诊断信息</el-tag>
  717. <el-table :data="patient.disdiagList" stripe :height="200">
  718. <el-table-column type="index" label="序号" width="45"></el-table-column>
  719. <el-table-column prop="code" label="诊断编码"></el-table-column>
  720. <el-table-column prop="name" label="诊断名称"></el-table-column>
  721. <el-table-column label="出院病情">
  722. <template #default="scope">
  723. {{ filterDismissStatus(scope.row.dismissStatus) }}
  724. </template>
  725. </el-table-column>
  726. </el-table>
  727. </el-dialog>
  728. <div v-drag>
  729. <el-dialog v-model="showSearch" title="数据搜索" width="730px">
  730. 检索依据:
  731. <el-select v-model="searchMethod" style="width: 100px">
  732. <el-option v-for="item in searchMethods" :key="item.code" :label="item.name" :value="item.code"></el-option>
  733. </el-select>
  734. &nbsp;&nbsp;&nbsp;&nbsp; 搜索内容:
  735. <el-input
  736. ref="searchInput"
  737. v-model="searchContent"
  738. prefix-icon="el-icon-search"
  739. placeholder="请输入搜索内容"
  740. style="width: 160px"
  741. clearable
  742. @input="executeSearch"
  743. ></el-input>
  744. <div v-if="showSurgeryRecommand" style="padding: 12px 0 4px 4px; color: gray">
  745. 根据患者主诊断
  746. <el-tag
  747. >{{ patient.disdiagList[0].code }} <span style="color: blue">{{ patient.disdiagList[0].name }}</span>
  748. </el-tag>
  749. ,推荐以下手术操作:
  750. </div>
  751. <el-table :data="searchResults" height="400" stripe highlight-current-row @row-click="handleSelectSearch">
  752. <el-table-column prop="code" label="编码" width="180"></el-table-column>
  753. <el-table-column prop="name" label="名称" width="430"></el-table-column>
  754. <el-table-column v-if="showSurgeryRecommand" prop="ssfz" label="手术分值" width="60"></el-table-column>
  755. </el-table>
  756. <div style="margin-top: 15px; width: 100%; text-align: right">
  757. <el-button type="primary" icon="el-icon-arrow-left" @click="lastPage" :disabled="showSurgeryRecommand || currentSRPage === 1">上一页 </el-button>
  758. <el-button type="primary" icon="el-icon-arrow-right" @click="nextPage" :disabled="showSurgeryRecommand || (currentSRPage > 1 && searchResults.length < 10)"
  759. >下一页
  760. </el-button>
  761. </div>
  762. </el-dialog>
  763. </div>
  764. <el-dialog v-model="showSurgeryDatetime" title="请选择手术时间" width="300px">
  765. <div style="height: 12px"></div>
  766. <el-date-picker v-model="surgeryDatetime" type="datetime" placeholder="选择日期时间"> </el-date-picker>
  767. <template #footer>
  768. <div>
  769. <el-button type="primary" icon="el-icon-success" @click="confirmSurgeryDatetime">确定</el-button>
  770. </div>
  771. </template>
  772. </el-dialog>
  773. </el-container>
  774. </template>
  775. <script setup name="FillCaseFrontSheet">
  776. import { yesOrNo, haveOrNot, searchMethods, autopsies, initShowDel, filterDismissStatus, clone } from './common'
  777. import { onMounted, reactive, ref, watchEffect } from 'vue'
  778. import store from '@/store'
  779. import { operations } from '@/data/index'
  780. import { initLodop, getLodop } from '@/utils/c-lodop'
  781. import {
  782. doSaveYbDiags,
  783. executePrintVerify,
  784. executeSaveVerify,
  785. fetchOutPatients,
  786. fetchSsfz,
  787. getAllDictionary,
  788. getPatientOverview,
  789. getSheetInfo,
  790. getUserWards,
  791. getYbDiags,
  792. sheetSearch,
  793. getSsfzSurgeriesByIcd,
  794. increaseDiagWeight,
  795. signApply,
  796. } from '@/api/case-front-sheet'
  797. import maleIcon from '@/assets/male-icon.png'
  798. import femaleIcon from '@/assets/female-icon.png'
  799. import { ElMessage } from 'element-plus'
  800. import { shortcuts } from '@/data/shortcuts'
  801. import { formatDate, formatDatetime, getDatetime, getOneMonthOffset } from '@/utils/date'
  802. import HeadPage from '../../../components/inpatient/frontsheet-printpage/HeadPage.vue'
  803. import TailPage from '../../../components/inpatient/frontsheet-printpage/TailPage.vue'
  804. const userWards = ref([])
  805. const currentWard = ref('')
  806. const inOutStatus = ref(1)
  807. const inOutOptions = initInOutOptions()
  808. const inpatientNo = ref('')
  809. const windowSize = store.state.app.windowSize
  810. const tableHeight = windowSize.h - 45
  811. const overview = ref([])
  812. const patient = ref({
  813. disdiagList: [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}],
  814. surgeryList: [{}, {}, {}, {}, {}],
  815. })
  816. const mainInfo = {
  817. height: windowSize.h - 45 + 'px',
  818. width: '753px',
  819. overflowX: 'hidden',
  820. padding: '0 20px',
  821. overflowY: 'scroll',
  822. }
  823. const dics = ref({})
  824. const showGoSearchBtn1 = ref(false)
  825. const showGoSearchBtn2 = ref(false)
  826. const showDel = initShowDel()
  827. const searchPatient = () => {
  828. if (!inpatientNo.value || inpatientNo.value.trim().length < 1) {
  829. ElMessage({
  830. message: '请输入要搜索的住院号',
  831. type: 'warning',
  832. duration: 2500,
  833. showClose: true,
  834. })
  835. return
  836. }
  837. let found = false
  838. for (let i = 0; i < overview.value.length; i++) {
  839. const item = overview.value[i]
  840. if (item.bah === inpatientNo.value.trim()) {
  841. fetchSheetInfo(item)
  842. found = true
  843. break
  844. }
  845. }
  846. if (!found) {
  847. ElMessage({
  848. message: '未找到住院号【' + inpatientNo.value.trim() + '】的患者信息',
  849. type: 'warning',
  850. duration: 2500,
  851. showClose: true,
  852. })
  853. }
  854. }
  855. const handleWardChange = () => {
  856. if (inOutStatus.value === 1) {
  857. fetchOverview()
  858. } else {
  859. confirmDateRange()
  860. }
  861. }
  862. const dateRange = ref([])
  863. const showSelectDateRange = ref(false)
  864. const changeInOutStatus = () => {
  865. if (inOutStatus.value === 1) {
  866. fetchOverview()
  867. } else {
  868. if (!dateRange.value || dateRange.value.length < 2) {
  869. const oneMonth = getOneMonthOffset()
  870. dateRange.value[0] = oneMonth.start
  871. dateRange.value[1] = oneMonth.end
  872. }
  873. showSelectDateRange.value = true
  874. }
  875. }
  876. const confirmDateRange = () => {
  877. if (!dateRange.value || dateRange.value.length < 2) {
  878. ElMessage({
  879. message: '请选择时间范围',
  880. type: 'warning',
  881. duration: 2500,
  882. showClose: true,
  883. })
  884. return
  885. }
  886. const param = {
  887. ward: currentWard.value,
  888. start: formatDate(dateRange.value[0]),
  889. end: formatDate(dateRange.value[1]),
  890. }
  891. fetchOutPatients(param).then((res) => {
  892. overview.value = res
  893. showSelectDateRange.value = false
  894. })
  895. }
  896. const fetchOverview = () => {
  897. getPatientOverview(currentWard.value).then((res) => {
  898. overview.value = res
  899. })
  900. }
  901. const fetchSheetInfo = (row) => {
  902. if (row.bah !== patient.value.bah || row.times !== patient.value.admissTimes) {
  903. forceVerifies.value = []
  904. adviceVerifies.value = []
  905. }
  906. row.inOutFlag = inOutStatus.value
  907. getSheetInfo(row).then((res) => {
  908. patient.value = res
  909. patient.value.bedNo = row.bedNo
  910. patient.value.sex = row.sex
  911. beforePrintSet.value = false
  912. })
  913. }
  914. const currentSRPage = ref(1)
  915. const showSearch = ref(false)
  916. const insertDiag = ref(false)
  917. watchEffect(() => {
  918. if (showSearch.value) {
  919. searchResults.value = []
  920. setTimeout(() => {
  921. showDel.value = initShowDel()
  922. searchInput.value.focus()
  923. }, 300)
  924. } else {
  925. insertDiag.value = false
  926. }
  927. })
  928. const searchInput = ref(null)
  929. const searchUrl = ref('')
  930. const searchTargetCode = ref('')
  931. const searchTargetName = ref('')
  932. const searchContent = ref('')
  933. const lastPage = () => {
  934. currentSRPage.value--
  935. fetchSearchData()
  936. }
  937. const nextPage = () => {
  938. currentSRPage.value++
  939. fetchSearchData()
  940. }
  941. const fetchSearchData = () => {
  942. const param = {
  943. method: searchMethod.value,
  944. target: searchUrl.value,
  945. content: searchContent.value,
  946. medType: patient.value.medType,
  947. page: currentSRPage.value,
  948. }
  949. sheetSearch(param).then((res) => {
  950. searchResults.value = res
  951. })
  952. }
  953. const executeSearch = () => {
  954. showSurgeryRecommand = false
  955. if (mainSurgeryFocused && searchContent.value === '' && patient.value.disdiagList[0].code) {
  956. getSsfzSurgeriesByIcd(patient.value.bah, patient.value.admissTimes, patient.value.disdiagList[0].code).then((res) => {
  957. searchResults.value = res
  958. showSurgeryRecommand = true
  959. })
  960. return
  961. }
  962. if (searchContent.value.length < 2 && searchContent.value !== '-') return
  963. currentSRPage.value = 1
  964. if (searchContent.value === '-') {
  965. searchResults.value = [{ code: '-', name: '-' }]
  966. } else {
  967. fetchSearchData()
  968. }
  969. }
  970. const showYbDiag = ref(false)
  971. const openYbDiag = () => {
  972. if (nullPatient()) {
  973. return
  974. }
  975. if (!patient.value.medType) {
  976. ElMessage({
  977. message: '自费病人无需填写医保诊断',
  978. type: 'warning',
  979. duration: 2500,
  980. showClose: true,
  981. })
  982. return
  983. }
  984. getYbDiags(patient.value.bah, patient.value.admissTimes).then((res) => {
  985. ybDiags.value = res
  986. showYbDiag.value = true
  987. })
  988. }
  989. const searchMethod = ref('alpha')
  990. const searchResults = ref([])
  991. const showSearchData = (flag) => {
  992. mainSurgeryFocused = false
  993. showSurgeryRecommand = false
  994. searchUrl.value = 'place'
  995. if (flag === 'birth') {
  996. searchTargetCode.value = 'birthPlace'
  997. searchTargetName.value = 'birthPlaceName'
  998. } else if (flag === 'native') {
  999. searchTargetCode.value = 'nativePlace'
  1000. searchTargetName.value = 'nativePlaceName'
  1001. } else if (flag === 'hk') {
  1002. searchTargetCode.value = 'hkPlace'
  1003. searchTargetName.value = 'hkPlaceName'
  1004. } else if (flag === 'contact') {
  1005. searchTargetCode.value = 'contactAddr'
  1006. searchTargetName.value = 'contactAddrName'
  1007. } else if (flag === 'hurt') {
  1008. searchUrl.value = 'hurtReason'
  1009. searchTargetCode.value = 'hurtReasonCode'
  1010. searchTargetName.value = 'hurtReasonName'
  1011. } else if (flag === 'pathologic') {
  1012. searchUrl.value = 'pathologicDiag'
  1013. searchTargetCode.value = 'pathologicDiagCode'
  1014. searchTargetName.value = 'pathologicDiagStr'
  1015. } else if (flag === 'deptleader') {
  1016. searchUrl.value = 'employee'
  1017. searchTargetCode.value = 'deptLeader'
  1018. searchTargetName.value = 'deptLeaderName'
  1019. } else if (flag === 'leaderdoctor') {
  1020. searchUrl.value = 'employee'
  1021. searchTargetCode.value = 'leaderDoctor'
  1022. searchTargetName.value = 'leaderDoctorName'
  1023. } else if (flag === 'maindoctor') {
  1024. searchUrl.value = 'employee'
  1025. searchTargetCode.value = 'mainDoctor'
  1026. searchTargetName.value = 'mainDoctorName'
  1027. } else if (flag === 'admissdoctor') {
  1028. searchUrl.value = 'employee'
  1029. searchTargetCode.value = 'admissDoctor'
  1030. searchTargetName.value = 'admissDoctorName'
  1031. } else if (flag === 'dutynurse') {
  1032. searchUrl.value = 'employee'
  1033. searchTargetCode.value = 'dutyNurse'
  1034. searchTargetName.value = 'dutyNurseName'
  1035. } else if (flag === 'studydoctor') {
  1036. searchUrl.value = 'employee'
  1037. searchTargetCode.value = 'studyDoctor'
  1038. searchTargetName.value = 'studyDoctorName'
  1039. } else if (flag === 'internshipdoctor') {
  1040. searchUrl.value = 'employee'
  1041. searchTargetCode.value = 'internshipDoctor'
  1042. searchTargetName.value = 'internshipDoctorName'
  1043. } else if (flag === 'coder') {
  1044. searchUrl.value = 'employee'
  1045. searchTargetCode.value = 'coder'
  1046. searchTargetName.value = 'coderName'
  1047. } else if (flag === 'qualitycontroldoctor') {
  1048. searchUrl.value = 'employee'
  1049. searchTargetCode.value = 'qualityControlDoctor'
  1050. searchTargetName.value = 'qualityControlDoctorName'
  1051. } else if (flag === 'qualitycontrolnurse') {
  1052. searchUrl.value = 'employee'
  1053. searchTargetCode.value = 'qualityControlNurse'
  1054. searchTargetName.value = 'qualityControlNurseName'
  1055. } else if (flag === 'ybDiag') {
  1056. searchUrl.value = 'diag'
  1057. searchTargetCode.value = 'ybDiagCode'
  1058. } else if (flag === 'clinicdiag') {
  1059. searchUrl.value = 'clinicdiag'
  1060. searchTargetCode.value = 'clinicDiagCode'
  1061. searchTargetName.value = 'clinicDiagStr'
  1062. }
  1063. showSearch.value = true
  1064. }
  1065. const showSurgeryDatetime = ref(false)
  1066. const surgeryDatetime = ref(null)
  1067. const currentSurgeryDatetimeIndex = ref(null)
  1068. const showPickSurgeryDatetime = (index) => {
  1069. currentSurgeryDatetimeIndex.value = index
  1070. showSurgeryDatetime.value = true
  1071. }
  1072. const confirmSurgeryDatetime = () => {
  1073. patient.value.surgeryList[currentSurgeryDatetimeIndex.value].date = formatDatetime(surgeryDatetime.value)
  1074. showSurgeryDatetime.value = false
  1075. }
  1076. const showSearchSurgerior = (flag, index) => {
  1077. mainSurgeryFocused = false
  1078. showSurgeryRecommand = false
  1079. if (flag === 'operator') {
  1080. searchTargetCode.value = 'surgeryOperatorCode' + (index - 1)
  1081. searchTargetName.value = 'surgeryOperatorName' + (index - 1)
  1082. } else if (flag === 'assistantone') {
  1083. searchTargetCode.value = 'surgeryAssistantOneCode' + (index - 1)
  1084. searchTargetName.value = 'surgeryAssistantOneName' + (index - 1)
  1085. } else if (flag === 'assistanttwo') {
  1086. searchTargetCode.value = 'surgeryAssistantTwoCode' + (index - 1)
  1087. searchTargetName.value = 'surgeryAssistantTwoName' + (index - 1)
  1088. } else {
  1089. searchTargetCode.value = 'surgeryAnaesthesiaorCode' + (index - 1)
  1090. searchTargetName.value = 'surgeryAnaesthesiaorName' + (index - 1)
  1091. }
  1092. searchUrl.value = 'employee'
  1093. showSearch.value = true
  1094. }
  1095. const diseFamilyGrade = ref(null)
  1096. const ybDiag = reactive({})
  1097. const cyzgs = initCyzgs()
  1098. const admissConds = initAdmissConds()
  1099. const diagTypes = initDiagTypes()
  1100. const handleSelectSearch = (item) => {
  1101. if (searchTargetCode.value.startsWith('surgery')) {
  1102. let no = searchTargetCode.value.charAt(searchTargetCode.value.length - 1)
  1103. switch (searchTargetCode.value.substr(0, searchTargetCode.value.length - 1)) {
  1104. case 'surgeryCode':
  1105. if (no > 0 && no < 5) {
  1106. patient.value.surgeryList[no] = clone(patient.value.surgeryList[no - 1])
  1107. }
  1108. patient.value.surgeryList[no].name = item.name
  1109. patient.value.surgeryList[no].code = item.code
  1110. patient.value.surgeryList[no].no = no
  1111. break
  1112. case 'surgeryOperatorCode':
  1113. patient.value.surgeryList[no].operator = item.code
  1114. patient.value.surgeryList[no].operatorName = item.name
  1115. break
  1116. case 'surgeryAssistantOneCode':
  1117. patient.value.surgeryList[no].assistantOne = item.code
  1118. patient.value.surgeryList[no].assistantOneName = item.name
  1119. break
  1120. case 'surgeryAssistantTwoCode':
  1121. patient.value.surgeryList[no].assistantTwo = item.code
  1122. patient.value.surgeryList[no].assistantTwoName = item.name
  1123. break
  1124. case 'surgeryAnaesthesiaorCode':
  1125. patient.value.surgeryList[no].anaesthesiaor = item.code
  1126. patient.value.surgeryList[no].anaesthesiaorName = item.name
  1127. break
  1128. }
  1129. } else if (searchTargetCode.value.startsWith('disdiags')) {
  1130. let no = Number(searchTargetCode.value.replace('disdiagsCode', ''))
  1131. if (insertDiag.value) {
  1132. for (let i = 26; i > no; i--) {
  1133. patient.value.disdiagList[i] = clone(patient.value.disdiagList[i - 1])
  1134. }
  1135. patient.value.disdiagList.splice(27)
  1136. insertDiag.value = false
  1137. }
  1138. patient.value.disdiagList[no].code = item.code
  1139. patient.value.disdiagList[no].name = item.name
  1140. patient.value.disdiagList[no].no = no
  1141. patient.value.disdiagList[no].admissStatus = patient.value.disdiagList[no].dismissStatus = '1'
  1142. patient.value.disdiagList[no].opIdCode = store.state.user.info.code
  1143. increaseDiagWeight(item.code)
  1144. } else if (searchTargetCode.value === 'ybDiagCode') {
  1145. ybDiag.code = item.code
  1146. ybDiag.name = item.name
  1147. ybDiag.cyzg = 0
  1148. if (!ybDiags.value || ybDiags.value.length === 0) {
  1149. fetchSsfz(item.code, patient.value.bah, patient.value.admissTimes).then((res) => {
  1150. diseFamilyGrade.value = res
  1151. })
  1152. }
  1153. } else if (searchTargetCode.value === 'clinicDiagCode') {
  1154. patient.value.clinicDiagCode = item.code
  1155. patient.value.clinicDiagStr = item.name
  1156. } else {
  1157. patient.value[searchTargetCode.value] = item.code
  1158. patient.value[searchTargetName.value] = item.name
  1159. if (searchTargetCode.value === 'birthPlace') {
  1160. patient.value.nativePlace = item.code
  1161. patient.value.nativePlaceName = item.name
  1162. }
  1163. }
  1164. searchContent.value = ''
  1165. showSearch.value = false
  1166. }
  1167. const ybDiags = ref([])
  1168. const addToYbDiags = () => {
  1169. if (!ybDiag.siDiagType) {
  1170. ElMessage({
  1171. message: '请选择诊断类别!',
  1172. type: 'warning',
  1173. duration: 2500,
  1174. showClose: true,
  1175. })
  1176. return
  1177. }
  1178. if (!ybDiag.admissCond) {
  1179. ElMessage({
  1180. message: '请选择入院病情!',
  1181. type: 'warning',
  1182. duration: 2500,
  1183. showClose: true,
  1184. })
  1185. return
  1186. }
  1187. const temp = clone(ybDiag)
  1188. temp.diagType = 13
  1189. temp.operId = store.state.user.info.code
  1190. temp.opDate = getDatetime()
  1191. temp.bzfx = '普通'
  1192. ybDiags.value.push(temp)
  1193. ybDiag.code = ybDiag.name = ybDiag.cyzg = ''
  1194. }
  1195. const deleteYbDiag = (index) => {
  1196. ybDiags.value.splice(index, 1)
  1197. }
  1198. const saveYbDiags = () => {
  1199. const param = {
  1200. bah: patient.value.bah,
  1201. times: patient.value.admissTimes,
  1202. ybDiags: ybDiags.value,
  1203. }
  1204. doSaveYbDiags(param).then(() => {
  1205. ElMessage({
  1206. message: '保存成功',
  1207. type: 'success',
  1208. duration: 2500,
  1209. showClose: true,
  1210. })
  1211. })
  1212. }
  1213. const onSearchDiagFocus = (n) => {
  1214. mainSurgeryFocused = false
  1215. showSurgeryRecommand = false
  1216. if (n > 0 && !patient.value.disdiagList[n - 1].code) {
  1217. ElMessage({
  1218. message: '请按顺序填写',
  1219. type: 'warning',
  1220. duration: 2500,
  1221. showClose: true,
  1222. })
  1223. return
  1224. }
  1225. searchUrl.value = 'normalDiag'
  1226. searchTargetCode.value = 'disdiagsCode' + n
  1227. searchTargetName.value = 'disdiagsName' + n
  1228. if (!patient.value.disdiagList[n].code) {
  1229. showSearch.value = true
  1230. } else {
  1231. showDel.value[n] = true
  1232. }
  1233. }
  1234. const showSurgeryRecommand = $ref(false)
  1235. const mainSurgeryFocused = $ref(false)
  1236. const onSearchSurgeryFocus = (n) => {
  1237. if (n > 0 && !patient.value.surgeryList[n - 1].code) {
  1238. ElMessage({
  1239. message: '请按顺序填写',
  1240. type: 'warning',
  1241. duration: 2500,
  1242. showClose: true,
  1243. })
  1244. return
  1245. }
  1246. mainSurgeryFocused = false
  1247. showSurgeryRecommand = false
  1248. searchUrl.value = 'surgery'
  1249. searchTargetCode.value = 'surgeryCode' + n
  1250. searchTargetName.value = 'surgeryName' + n
  1251. if (!patient.value.surgeryList[n].code) {
  1252. if (n === 0 && patient.value.disdiagList[0].code) {
  1253. mainSurgeryFocused = true
  1254. getSsfzSurgeriesByIcd(patient.value.bah, patient.value.admissTimes, patient.value.disdiagList[0].code).then((res) => {
  1255. searchResults.value = res
  1256. showSurgeryRecommand = true
  1257. })
  1258. }
  1259. showSearch.value = true
  1260. } else {
  1261. showDel.value[n] = true
  1262. }
  1263. }
  1264. const onEditSurgeryClick = (n) => {
  1265. showSearch.value = true
  1266. if (n === 0 && patient.value.disdiagList[0].code) {
  1267. mainSurgeryFocused = true
  1268. getSsfzSurgeriesByIcd(patient.value.bah, patient.value.admissTimes, patient.value.disdiagList[0].code).then((res) => {
  1269. searchResults.value = res
  1270. showSurgeryRecommand = true
  1271. })
  1272. } else {
  1273. mainSurgeryFocused = false
  1274. showSurgeryRecommand = false
  1275. }
  1276. }
  1277. const hasSurgeryChanged = (val) => {
  1278. if (val === '0') {
  1279. patient.value.diagConform3 = 0
  1280. }
  1281. }
  1282. const deleteDisdiag = (index) => {
  1283. showDel.value[index] = false
  1284. while (index < 26) {
  1285. patient.value.disdiagList[index] = patient.value.disdiagList[index + 1]
  1286. index++
  1287. }
  1288. patient.value.disdiagList[26] = {}
  1289. patient.value.disdiagList.splice(27)
  1290. }
  1291. const insertDisdiag = (index) => {
  1292. mainSurgeryFocused = false
  1293. showSurgeryRecommand = false
  1294. insertDiag.value = true
  1295. searchUrl.value = 'normalDiag'
  1296. searchTargetCode.value = 'disdiagsCode' + index
  1297. searchTargetName.value = 'disdiagsName' + index
  1298. showSearch.value = true
  1299. }
  1300. const deleteSurgery = (index) => {
  1301. showDel.value[index] = false
  1302. while (index < 4) {
  1303. patient.value.surgeryList[index] = patient.value.surgeryList[index + 1]
  1304. index++
  1305. }
  1306. patient.value.surgeryList[4] = {}
  1307. patient.value.surgeryList.splice(5)
  1308. }
  1309. const beforePrintSet = ref(false)
  1310. const nullPatient = () => {
  1311. if (!patient.value.bah) {
  1312. ElMessage({
  1313. message: '请先选择患者!',
  1314. type: 'warning',
  1315. duration: 2500,
  1316. showClose: true,
  1317. })
  1318. return true
  1319. }
  1320. return false
  1321. }
  1322. const forceVerifies = ref([])
  1323. const adviceVerifies = ref([])
  1324. const currentMessageIndex = ref(null)
  1325. const messageColor = (id) => {
  1326. return currentMessageIndex.value === id
  1327. ? {
  1328. background: '#ff2b2b',
  1329. color: 'white',
  1330. }
  1331. : {
  1332. background: '#eea7a752',
  1333. color: '#ff2b2b',
  1334. }
  1335. }
  1336. const scrollWrapper = $ref(null)
  1337. const handleClickMessage = (id, index) => {
  1338. currentMessageIndex.value = index
  1339. let ele = document.getElementById(id)
  1340. scrollWrapper.scrollTop = ele.offsetTop - 260
  1341. let i = 0
  1342. let timer = setInterval(() => {
  1343. ele.style.background = i % 2 == 0 ? 'rgb(238, 98, 5)' : 'transparent'
  1344. i++
  1345. if (i > 7) {
  1346. clearInterval(timer)
  1347. }
  1348. }, 500)
  1349. }
  1350. const showMessageDrawer = $ref(false)
  1351. const execSignApply = () => {
  1352. if (nullPatient()) return
  1353. signApply(patient.value)
  1354. .then((res) => {
  1355. ElMessage({
  1356. message: '申请成功',
  1357. type: 'success',
  1358. duration: 2500,
  1359. showClose: true,
  1360. })
  1361. })
  1362. .catch((e) => {
  1363. forceVerifies.value = e.data
  1364. showMessageDrawer = true
  1365. })
  1366. }
  1367. const saveVerify = (opType) => {
  1368. if (nullPatient()) return
  1369. beforePrintSet.value = false
  1370. const param = {
  1371. opType,
  1372. sheet: patient.value,
  1373. }
  1374. executeSaveVerify(param)
  1375. .then(() => {
  1376. ElMessage({
  1377. message: '操作成功。',
  1378. type: 'success',
  1379. duration: 2500,
  1380. showClose: true,
  1381. })
  1382. })
  1383. .catch((e) => {
  1384. forceVerifies.value = e.data
  1385. showMessageDrawer = true
  1386. })
  1387. }
  1388. const dismissShowSearch = (flag) => {
  1389. setTimeout(() => {
  1390. if (flag === 1) {
  1391. showGoSearchBtn1.value = false
  1392. } else {
  1393. showGoSearchBtn2.value = false
  1394. }
  1395. }, 100)
  1396. }
  1397. const beforePrint = (flag) => {
  1398. if (nullPatient()) return
  1399. const param = {
  1400. opType: 4,
  1401. sheet: patient.value,
  1402. }
  1403. executePrintVerify(param)
  1404. .then(() => {
  1405. execPrint(flag)
  1406. })
  1407. .catch((e) => {
  1408. forceVerifies.value = e.data.force
  1409. adviceVerifies.value = e.data.advice
  1410. showMessageDrawer = true
  1411. if (e.data.force.length === 0) {
  1412. execPrint(flag)
  1413. }
  1414. })
  1415. }
  1416. const execPrint = (flag) => {
  1417. LODOP = getLodop()
  1418. const prntStyle = `<style>*{font-size:10pt} table,th,td {border: 1px solid black;border-collapse: collapse;} td,th {height: 24px;padding-left: 4px;}</style>`
  1419. const prntContent = flag === 1 ? document.getElementById('headpage').innerHTML : document.getElementById('tailpage').innerHTML
  1420. let pagePrint = prntStyle + '<body>' + prntContent + '</body>'
  1421. LODOP.PRINT_INIT('casefrontsheet')
  1422. LODOP.SET_PRINT_PAGESIZE(1, '210mm', '297mm', '')
  1423. LODOP.SET_PRINT_MODE('FULL_WIDTH_FOR_OVERFLOW', true) // 整宽不变形
  1424. LODOP.ADD_PRINT_HTM('2mm', '5mm', '100%', '100%', pagePrint)
  1425. LODOP.SET_PRINT_STYLE('ItemType', 3)
  1426. LODOP.PREVIEW()
  1427. }
  1428. onMounted(() => {
  1429. scrollWrapper = document.getElementById('scrollWrapper')
  1430. initLodop()
  1431. getAllDictionary().then((res) => {
  1432. res.getOperations = operations
  1433. res.getYesOrNo = yesOrNo
  1434. res.getHaveOrNot = haveOrNot
  1435. res.getAutopsies = autopsies
  1436. dics.value = res
  1437. })
  1438. getUserWards().then((res) => {
  1439. userWards.value = res
  1440. if (res.length > 0) {
  1441. currentWard.value = res[0].code
  1442. fetchOverview()
  1443. }
  1444. })
  1445. })
  1446. function initInOutOptions() {
  1447. return [
  1448. { code: 1, name: '在院' },
  1449. { code: 2, name: '出院' },
  1450. ]
  1451. }
  1452. function initCyzgs() {
  1453. return [
  1454. { code: 0, name: '好转/治愈' },
  1455. { code: 1, name: '未愈' },
  1456. { code: 2, name: '转院(医院要求)' },
  1457. { code: 3, name: '转院(病人要求)' },
  1458. { code: 4, name: '转科' },
  1459. { code: 5, name: '无效' },
  1460. { code: 6, name: '死亡' },
  1461. { code: 7, name: '双向转诊' },
  1462. { code: 9, name: '其他' },
  1463. ]
  1464. }
  1465. function initAdmissConds() {
  1466. return [
  1467. { code: 1, name: '有' },
  1468. { code: 2, name: '临床未确定' },
  1469. { code: 3, name: '情况不明' },
  1470. { code: 4, name: '无' },
  1471. ]
  1472. }
  1473. function initDiagTypes() {
  1474. return [
  1475. { code: 1, name: '西医主要诊断' },
  1476. { code: 2, name: '西医其他诊断' },
  1477. { code: 3, name: '中医主病诊断' },
  1478. { code: 4, name: '中医主症诊断' },
  1479. ]
  1480. }
  1481. </script>
  1482. <style scoped>
  1483. :deep(.el-dialog__body) {
  1484. padding-top: 8px;
  1485. }
  1486. :deep(.el-drawer) {
  1487. border: 1px solid orange;
  1488. }
  1489. :deep(.el-drawer .el-icon) {
  1490. font-size: 20px;
  1491. color: orangered;
  1492. }
  1493. :deep(.el-drawer__header) {
  1494. margin-bottom: 8px;
  1495. }
  1496. :deep(.el-dialog__header) {
  1497. padding-bottom: 4px;
  1498. }
  1499. select,
  1500. input {
  1501. outline: none;
  1502. border: none;
  1503. height: 20px;
  1504. line-height: 20px;
  1505. border-radius: 0;
  1506. background: transparent;
  1507. border-bottom: 1px solid #333333;
  1508. -webkit-appearance: none;
  1509. -moz-appearance: none;
  1510. appearance: none;
  1511. }
  1512. input[type='number'] {
  1513. -moz-appearance: textfield;
  1514. }
  1515. select ::-ms-expand {
  1516. display: none;
  1517. }
  1518. textarea {
  1519. outline: none;
  1520. border: none;
  1521. background-color: transparent;
  1522. }
  1523. table th {
  1524. border: 1px solid black;
  1525. text-align: center;
  1526. }
  1527. table td {
  1528. border: 1px solid black;
  1529. }
  1530. .page-inner {
  1531. padding: 0 20px 10px 26px;
  1532. border-radius: 12px;
  1533. text-align: justify;
  1534. }
  1535. .message-item {
  1536. padding: 6px;
  1537. margin-bottom: 6px;
  1538. border-radius: 4px;
  1539. }
  1540. .message-item:hover {
  1541. cursor: pointer;
  1542. }
  1543. .rightside-btn {
  1544. display: flex;
  1545. align-items: center;
  1546. text-align: center;
  1547. color: white;
  1548. border-radius: 4px;
  1549. width: 20px;
  1550. height: 185px;
  1551. position: fixed;
  1552. background: rgb(238, 98, 5);
  1553. top: 260px;
  1554. right: 10px;
  1555. cursor: pointer;
  1556. }
  1557. .no-verify-message {
  1558. width: 100%;
  1559. text-align: center;
  1560. margin-top: 50px;
  1561. font-size: 18px;
  1562. color: gray;
  1563. }
  1564. :deep(.m-drawer .el-overlay) {
  1565. right: 0;
  1566. left: calc(100vw - 260px);
  1567. background: transparent !important;
  1568. }
  1569. </style>