DiscSettlement.vue 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349
  1. <template>
  2. <div class="layout_display_flex_y">
  3. <div>
  4. <el-button type="success" icon="RefreshRight" @click="rcvrcalcost">
  5. 费用接收重算
  6. </el-button>
  7. <el-button type="primary" icon="RefreshLeft" @click="showConventions">
  8. 撤销检验项目
  9. </el-button>
  10. <el-button type="success" icon="Money" @click="openCostList">
  11. 费用清单
  12. </el-button>
  13. <el-button type="success" icon="Timer" @click="beforeSettle(false)"
  14. >出院结算
  15. </el-button>
  16. <el-button type="info" icon="VideoPause" @click="beforeSettle(true)"
  17. >中间断账
  18. </el-button>
  19. <el-button
  20. type="warning"
  21. icon="Odometer"
  22. :disabled="!isAdmin"
  23. @click="cancelDismiss"
  24. >取消出院结算
  25. </el-button>
  26. <el-button
  27. v-if="isKqk"
  28. type="danger"
  29. icon="Tickets"
  30. @click="makeDismissOrder"
  31. >生成出院医嘱
  32. </el-button>
  33. <el-button type="danger" @click="rejectNotGeneratedMedicationListClick"
  34. >撤销未生成的药单
  35. </el-button>
  36. <el-button
  37. plain
  38. type="danger"
  39. title="医保出院结算时,若提示【服务提供者后端服务响应超时】,可使用此功能进行出院结算。"
  40. @click="executeTimeoutSettlement"
  41. >超时结算
  42. </el-button>
  43. </div>
  44. <el-divider content-position="left" class="el-divider_shorter">
  45. 患者基本信息
  46. </el-divider>
  47. <div>
  48. <el-descriptions :column="4" border>
  49. <el-descriptions-item>
  50. <template #label> 住院号</template>
  51. {{ patient.inpatientNo }}
  52. </el-descriptions-item>
  53. <el-descriptions-item>
  54. <template #label> 姓名</template>
  55. {{ patient.name }}
  56. </el-descriptions-item>
  57. <el-descriptions-item>
  58. <template #label>性别</template>
  59. {{ cptSex(patient.sex) }}
  60. </el-descriptions-item>
  61. <el-descriptions-item>
  62. <template #label> 病房</template>
  63. {{ patient.admissWardName }}
  64. </el-descriptions-item>
  65. <el-descriptions-item>
  66. <template #label> 床号</template>
  67. {{ patient.bedNo }}
  68. </el-descriptions-item>
  69. <el-descriptions-item>
  70. <template #label> 总费用</template>
  71. <span v-show="patient.inpatientNo">{{ patient.totalCharge }}</span>
  72. </el-descriptions-item>
  73. <el-descriptions-item>
  74. <template #label> 余额</template>
  75. <span v-html="getBalance(patient.balance)"></span>
  76. </el-descriptions-item>
  77. <el-descriptions-item>
  78. <template #label> 入院日期</template>
  79. {{ patient.admissDate }}
  80. </el-descriptions-item>
  81. <el-descriptions-item>
  82. <template #label> 手术</template>
  83. <span v-show="patient.inpatientNo">{{
  84. cptOperation(patient.operation)
  85. }}</span>
  86. </el-descriptions-item>
  87. <el-descriptions-item>
  88. <template #label> 医疗类别</template>
  89. {{ patient.medTypeName }}
  90. </el-descriptions-item>
  91. <el-descriptions-item>
  92. <template #label> 险种类型</template>
  93. {{ patient.insutypeName }}
  94. </el-descriptions-item>
  95. </el-descriptions>
  96. </div>
  97. <el-divider content-position="left" class="el-divider_shorter">
  98. 医保出院诊断
  99. </el-divider>
  100. <div class="layout_flex_1-y">
  101. <el-table :data="diags.yb" stripe height="100%">
  102. <el-table-column prop="disDiagNo" label="序号"></el-table-column>
  103. <el-table-column prop="disDiag" label="诊断编码"></el-table-column>
  104. <el-table-column
  105. prop="disDiagComment"
  106. label="诊断内容"
  107. ></el-table-column>
  108. <el-table-column
  109. prop="disDiagStatus"
  110. label="出院转归"
  111. ></el-table-column>
  112. <el-table-column prop="opName" label="录入人"></el-table-column>
  113. </el-table>
  114. </div>
  115. <el-divider content-position="left" class="el-divider_shorter">
  116. 病案首页诊断
  117. </el-divider>
  118. <div class="layout_flex_1-y">
  119. <el-table :data="diags.bl" stripe height="100%">
  120. <el-table-column prop="disDiagNo" label="序号"></el-table-column>
  121. <el-table-column prop="disDiag" label="诊断编码"></el-table-column>
  122. <el-table-column
  123. prop="disDiagComment"
  124. label="诊断内容"
  125. ></el-table-column>
  126. <el-table-column
  127. prop="disDiagStatusName"
  128. label="出院转归"
  129. ></el-table-column>
  130. <el-table-column prop="opName" label="录入人"></el-table-column>
  131. </el-table>
  132. </div>
  133. </div>
  134. <el-dialog
  135. title="请选择中间断账的日期和时间"
  136. v-model="showZjdzDate"
  137. width="500px"
  138. >
  139. <div style="height: 20px"></div>
  140. <el-date-picker
  141. v-model="patient.zjdzDatetime"
  142. type="datetime"
  143. placeholder="选择日期时间"
  144. ></el-date-picker>
  145. <div style="height: 30px"></div>
  146. <div style="width: 450px; text-align: right">
  147. <el-button type="info" icon="Close" @click="cancelSelectZjdzDate"
  148. >取消
  149. </el-button>
  150. <el-button type="success" icon="Check" @click="confirmSelectZjdzDate"
  151. >确定
  152. </el-button>
  153. </div>
  154. </el-dialog>
  155. <el-dialog
  156. :title="dismissBtnText + '申请'"
  157. v-model="showSettleApplyForm"
  158. width="600px"
  159. >
  160. <div v-if="settleApply.deathFlag" style="margin-bottom: 20px; color: red">
  161. 患者已停保。
  162. </div>
  163. <div style="margin-bottom: 20px">
  164. {{ dismissBtnText }}时间:
  165. <el-date-picker
  166. :disabled="!patient.midSetl"
  167. v-model="settleApply.settleDatetime"
  168. type="datetime"
  169. placeholder="请选择要断账的时间"
  170. ></el-date-picker>
  171. </div>
  172. <div style="margin-bottom: 20px">
  173. 使用个人账户:
  174. <el-radio size="large" v-model="settleApply.acctUsedFlag" label="0">
  175. 不使用个账
  176. </el-radio>
  177. <el-radio size="large" v-model="settleApply.acctUsedFlag" label="1">
  178. 使用本人个账
  179. </el-radio>
  180. <el-radio size="large" v-model="settleApply.acctUsedFlag" label="2">
  181. 使用共济人个账
  182. </el-radio>
  183. </div>
  184. <el-input
  185. type="textarea"
  186. v-model="settleApply.inputComment"
  187. placeholder="请输入申请理由"
  188. ></el-input>
  189. <div style="width: 450px; text-align: right; margin-top: 30px">
  190. <el-button type="info" icon="Close" @click="cancelSettleApply"
  191. >取消
  192. </el-button>
  193. <el-button type="success" icon="Check" @click="confirmSettleApply"
  194. >提交
  195. </el-button>
  196. </div>
  197. </el-dialog>
  198. <el-dialog
  199. :title="dismissBtnText"
  200. v-model="showActOrders"
  201. fullscreen
  202. @close="closeActOrder"
  203. class="el-dialog-fullscreen-fill"
  204. >
  205. <div class="layout_display_flex_y">
  206. <div class="layout_flex_1-y">
  207. <el-table :data="actOrders" @row-click="switchActOrder" height="100%">
  208. <el-table-column label="医嘱号" fixed>
  209. <template #default="scope">
  210. <span v-html="getOrderStatus(scope.row)"></span>
  211. </template>
  212. </el-table-column>
  213. <el-table-column
  214. property="list[0].orderName"
  215. label="医嘱名称"
  216. fixed
  217. ></el-table-column>
  218. <el-table-column
  219. property="list[0].frequCode"
  220. label="频率"
  221. ></el-table-column>
  222. <el-table-column property="cxFlag" label="撤销">
  223. <template #default="scope">
  224. <span v-html="getCxFlag(scope.row.cxFlag)"></span>
  225. </template>
  226. </el-table-column>
  227. <el-table-column
  228. property="list[0].drugSpecification"
  229. label="规格"
  230. ></el-table-column>
  231. <el-table-column
  232. property="list[0].startTime"
  233. label="开始时间"
  234. ></el-table-column>
  235. <el-table-column
  236. property="list[0].endTime"
  237. label="结束时间"
  238. ></el-table-column>
  239. <el-table-column
  240. property="list[0].chargeAmount"
  241. label="一次领量"
  242. ></el-table-column>
  243. <el-table-column
  244. property="list[0].supplyCode"
  245. label="给药方式"
  246. ></el-table-column>
  247. <el-table-column
  248. property="list[0].physician"
  249. label="医生"
  250. ></el-table-column>
  251. <el-table-column
  252. property="list[0].enterOper"
  253. label="录入人"
  254. ></el-table-column>
  255. <el-table-column
  256. property="list[0].orderCode"
  257. label="医嘱码"
  258. ></el-table-column>
  259. <el-table-column
  260. property="list[0].wardCode"
  261. label="病房"
  262. ></el-table-column>
  263. </el-table>
  264. </div>
  265. <div class="layout_flex_1-y">
  266. <el-table :data="actOrderDetail" height="100%">
  267. <el-table-column label="日期" fixed>
  268. <template #default="scope">
  269. <span v-html="getOrderDetailStatus(scope.row)"></span>
  270. </template>
  271. </el-table-column>
  272. <el-table-column
  273. property="chargeCode"
  274. label="收费码"
  275. ></el-table-column>
  276. <el-table-column
  277. property="chargeName"
  278. label="项目名称"
  279. ></el-table-column>
  280. <el-table-column
  281. property="drugSpecification"
  282. label="规格"
  283. ></el-table-column>
  284. <el-table-column property="chargeStatus" label="状态">
  285. <template #default="scope">
  286. {{ scope.row.chargeStatus }}
  287. </template>
  288. </el-table-column>
  289. <el-table-column
  290. property="chargeAmount"
  291. label="数量"
  292. ></el-table-column>
  293. <el-table-column property="chargeFee" label="金额"></el-table-column>
  294. <el-table-column property="pageNo" label="药品单号"></el-table-column>
  295. <el-table-column
  296. property="execUnit"
  297. label="执行科室"
  298. ></el-table-column>
  299. <el-table-column property="wardName" label="病区"></el-table-column>
  300. </el-table>
  301. </div>
  302. <div>
  303. <el-tag style="float: left; margin-top: 5px" v-cloak>
  304. <span style="background: orangered" class="color-span"></span
  305. >&nbsp;医技未确认
  306. <span style="background: dodgerblue" class="color-span"></span
  307. >&nbsp;未确认药
  308. <span style="background: orange" class="color-span"></span
  309. >&nbsp;未接收
  310. </el-tag>
  311. <div style="float: right; margin-top: 5px" v-cloak>
  312. <el-checkbox v-model="patient.deathFlag">患者已停保 </el-checkbox
  313. >&nbsp;&nbsp;
  314. <ReadCard
  315. :pat-no="patient.inpatientNo"
  316. biztype="01301"
  317. @success="afterReadCard"
  318. />
  319. <el-button type="primary" icon="DataAnalysis" @click="doCalFee"
  320. >费用计算
  321. </el-button>
  322. <el-button type="success" icon="Timer" @click="excuteDismiss"
  323. >{{ dismissBtnText }}
  324. </el-button>
  325. <el-button type="warning" icon="Close" @click="closeActOrder"
  326. >关闭
  327. </el-button>
  328. </div>
  329. </div>
  330. </div>
  331. </el-dialog>
  332. <el-dialog
  333. title="此患者费用清单存在负数"
  334. v-model="showNegativeFee"
  335. width="800px"
  336. >
  337. <div style="display: inline-block">
  338. <el-table
  339. :data="negativeFees.slice(0, negativeFees.length / 2 + 1)"
  340. empty-text=" "
  341. height="300"
  342. >
  343. <el-table-column
  344. property="code"
  345. label="费用"
  346. width="80"
  347. ></el-table-column>
  348. <el-table-column
  349. property="chargeCode"
  350. label="编码"
  351. width="80"
  352. ></el-table-column>
  353. <el-table-column
  354. property="name"
  355. label="名称"
  356. width="180"
  357. ></el-table-column>
  358. </el-table>
  359. </div>
  360. <div style="display: inline-block; margin-left: 8px">
  361. <el-table
  362. :data="
  363. negativeFees.slice(negativeFees.length / 2 + 1, negativeFees.length)
  364. "
  365. empty-text=" "
  366. height="300"
  367. >
  368. <el-table-column
  369. property="code"
  370. label="费用"
  371. width="80"
  372. ></el-table-column>
  373. <el-table-column
  374. property="chargeCode"
  375. label="编码"
  376. width="80"
  377. ></el-table-column>
  378. <el-table-column
  379. property="name"
  380. label="名称"
  381. width="180"
  382. ></el-table-column>
  383. </el-table>
  384. </div>
  385. </el-dialog>
  386. <el-dialog
  387. title="此患者有未处理的药单"
  388. v-model="showUnhandledDrugOrder"
  389. width="400px"
  390. >
  391. <el-table :data="negativeFees" empty-text=" " height="300">
  392. <el-table-column
  393. property="groupName"
  394. label="药房"
  395. width="120"
  396. ></el-table-column>
  397. <el-table-column
  398. property="pageNo"
  399. label="药单号"
  400. width="120"
  401. ></el-table-column>
  402. <el-table-column
  403. property="pageNoTy"
  404. label="退药单号"
  405. width="120"
  406. ></el-table-column>
  407. </el-table>
  408. </el-dialog>
  409. <el-dialog
  410. title="此患者有未处理的护士退药单"
  411. v-model="showUnhandledRefundDrugOrder"
  412. width="400px"
  413. >
  414. <el-table :data="negativeFees" empty-text=" " height="300">
  415. <el-table-column
  416. property="pageNoTy"
  417. label="退药单号"
  418. width="120"
  419. ></el-table-column>
  420. <el-table-column
  421. property="remark"
  422. label="说明"
  423. width="180"
  424. ></el-table-column>
  425. </el-table>
  426. </el-dialog>
  427. <el-dialog
  428. title="撤销检验项目"
  429. v-model="conventionsVisible"
  430. fullscreen
  431. @close="closeThreeConventions"
  432. class="el-dialog-fullscreen-fill"
  433. >
  434. <div class="layout_display_flex_y">
  435. <div class="layout_flex_1-y">
  436. <el-table
  437. :data="roughConventions"
  438. @row-click="clickConvention"
  439. highlight-current-row
  440. height="100%"
  441. @selection-change="handleSelectConvention"
  442. >
  443. <el-table-column type="selection"></el-table-column>
  444. <el-table-column
  445. property="inpatientNo"
  446. label="住院号"
  447. ></el-table-column>
  448. <el-table-column property="name" label="姓名"></el-table-column>
  449. <el-table-column property="bedNo" label="床号"></el-table-column>
  450. <el-table-column
  451. property="actOrderNo"
  452. label="医嘱号"
  453. ></el-table-column>
  454. <el-table-column
  455. property="occTime"
  456. label="医嘱日期"
  457. ></el-table-column>
  458. <el-table-column property="doctorName" label="医生"></el-table-column>
  459. <el-table-column
  460. property="orderName"
  461. label="医嘱名称"
  462. ></el-table-column>
  463. </el-table>
  464. </div>
  465. <div class="layout_flex_1-y">
  466. <el-table :data="conventionDetails" height="100%">
  467. <el-table-column label="选择" width="70">
  468. <template #default="scope">
  469. <input type="checkbox" disabled :checked="scope.row.checked" />
  470. </template>
  471. </el-table-column>
  472. <el-table-column property="name" label="姓名"></el-table-column>
  473. <el-table-column
  474. property="actOrderNo"
  475. label="医嘱号"
  476. ></el-table-column>
  477. <el-table-column
  478. property="orderName"
  479. label="医嘱名称"
  480. ></el-table-column>
  481. <el-table-column property="doctorName" label="医生"></el-table-column>
  482. <el-table-column
  483. property="occTime"
  484. label="医嘱日期"
  485. ></el-table-column>
  486. <el-table-column property="xmName" label="项目名称"></el-table-column>
  487. <el-table-column property="price" label="单价"></el-table-column>
  488. <el-table-column property="amount" label="数量"></el-table-column>
  489. <el-table-column property="fee" label="金额"></el-table-column>
  490. </el-table>
  491. </div>
  492. <div style="text-align: right; padding-top: 12px">
  493. <el-button type="success" @click="confirmRetractConventions"
  494. >撤销检验项目
  495. </el-button>
  496. <el-button type="warning" @click="closeThreeConventions"
  497. >关闭
  498. </el-button>
  499. </div>
  500. </div>
  501. </el-dialog>
  502. <el-dialog
  503. title="请选择出院医嘱的日期和时间"
  504. v-model="showDismissOrderDate"
  505. width="500px"
  506. >
  507. <el-date-picker
  508. v-model="patient.dismissOrderDate"
  509. type="datetime"
  510. placeholder="选择日期时间"
  511. ></el-date-picker>
  512. <div style="height: 30px"></div>
  513. <div style="width: 450px; text-align: right">
  514. <el-button type="info" icon="Close" @click="cancelSelectDismissOrderDate"
  515. >取消
  516. </el-button>
  517. <el-button
  518. type="success"
  519. icon="Check"
  520. @click="confirmSelectDismissOrderDate"
  521. >确定
  522. </el-button>
  523. </div>
  524. </el-dialog>
  525. <el-dialog
  526. title="出院预审有可疑数据"
  527. v-model="showPreDischargeErrors"
  528. width="600px"
  529. >
  530. <el-table :data="preDischargeErrors" empty-text=" " max-height="300">
  531. <el-table-column
  532. property="dept_name"
  533. label="科室"
  534. width="120"
  535. ></el-table-column>
  536. <el-table-column
  537. property="doctor_name"
  538. label="医生"
  539. width="120"
  540. ></el-table-column>
  541. <el-table-column
  542. property="return_code_message"
  543. label="描述"
  544. ></el-table-column>
  545. </el-table>
  546. <div style="margin-top: 20px">
  547. 是否继续为患者办理出院?
  548. <el-button
  549. type="primary"
  550. @click="executeDismissCalculate(false, null, null)"
  551. >继续办理
  552. </el-button>
  553. <el-button @click="cancelDischarge">取消办理</el-button>
  554. </div>
  555. </el-dialog>
  556. </template>
  557. <script setup>
  558. import {
  559. computed,
  560. onActivated,
  561. onDeactivated,
  562. onMounted,
  563. reactive,
  564. ref,
  565. watchEffect,
  566. } from "vue";
  567. import { cptOperation, cptSex } from "@/utils/computed";
  568. import {
  569. genDismissActOrder,
  570. getDisDiag,
  571. receiveAndRecalculateCost,
  572. } from "@/api/inpatient/patient";
  573. import {
  574. powersiPreDischarge,
  575. dismissCalculate,
  576. getActOrders,
  577. selfPayDismiss,
  578. } from "@/api/inpatient/dismiss";
  579. import { formatDatetime, getDatetime } from "@/utils/date";
  580. import { nullPatient } from "@/utils/validate";
  581. import { ElMessage, ElMessageBox } from "element-plus";
  582. import {
  583. dischargeProcessing,
  584. revokeSettlement,
  585. timeoutSettlement,
  586. } from "@/api/medical-insurance/si-inpatient";
  587. import { getSiPatInfo } from "@/api/medical-insurance/si-query";
  588. import {
  589. getDetailConventions,
  590. getRoughConventions,
  591. retractConventions,
  592. } from "@/api/inpatient/conventions";
  593. import { getGreatestRole } from "@/utils/permission";
  594. import {
  595. inpatientDischargeProcess,
  596. revokeInpatientSettlement,
  597. } from "@/api/medical-insurance/si-injury";
  598. import {
  599. selectSettleApply,
  600. submitSettleApply,
  601. } from "@/api/medical-insurance/si-settle-apply";
  602. import { baseinfo, setBaseinfo } from "@/data/inpatient";
  603. import ReadCard from "@/components/medical-insurance/readcard/Index.vue";
  604. import ChargeList from "@/components/medical-insurance/charge-list/Index.vue";
  605. import { rejectNotGeneratedMedicationList } from "@/api/inpatient/xiang-mu-lu-ru";
  606. import { useMedinsStore } from "@/pinia/medins-store";
  607. import { useUserStore } from "@/pinia/user-store";
  608. import { useDialog } from "@/components/cy/CyDialog/index";
  609. const isAdmin = getGreatestRole() < 10;
  610. const patient = computed(() => {
  611. return baseinfo();
  612. });
  613. const medinsStore = useMedinsStore();
  614. const injuryMode = computed(() => {
  615. return medinsStore.isInjuryMode;
  616. });
  617. const diags = initDiags();
  618. const fecthDisDiags = () => {
  619. getDisDiag(patient.value.inpatientNo, patient.value.admissTimes).then(res => {
  620. diags.yb = res.yb;
  621. diags.bl = res.bl;
  622. });
  623. };
  624. const clearDiags = () => {
  625. diags.yb = [];
  626. diags.bl = [];
  627. };
  628. const actived = ref(false);
  629. watchEffect(() => {
  630. if (actived.value) {
  631. if (patient.value.inpatientNo) {
  632. fecthDisDiags();
  633. } else {
  634. clearDiags();
  635. }
  636. }
  637. });
  638. onActivated(() => {
  639. actived.value = true;
  640. });
  641. onDeactivated(() => {
  642. actived.value = false;
  643. });
  644. const showZjdzDate = ref(false);
  645. const cancelSelectZjdzDate = () => {
  646. patient.value.zjdzDatetime = null;
  647. showZjdzDate.value = false;
  648. };
  649. const confirmSelectZjdzDate = () => {
  650. patient.value.zjdzDatetime = formatDatetime(patient.value.zjdzDatetime);
  651. ElMessageBox.confirm(
  652. "您选择的中间断账时间为【" + patient.value.zjdzDatetime + "】",
  653. "提示",
  654. {
  655. type: "warning",
  656. confirmButtonText: "确定",
  657. cancelButtonText: "取消",
  658. }
  659. ).then(() => {
  660. showZjdzDate.value = false;
  661. fetchActOrders();
  662. });
  663. };
  664. const cancelSettleApply = () => {
  665. patient.value.zjdzDatetime = null;
  666. settleApply.value = {};
  667. showSettleApplyForm.value = false;
  668. };
  669. const confirmSettleApply = () => {
  670. if (settleApply.value.type === 2 && !settleApply.value.settleDatetime) {
  671. ElMessage({
  672. message: "中间断账的时间不能为空!",
  673. type: "error",
  674. duration: 2500,
  675. showClose: true,
  676. });
  677. return;
  678. }
  679. if (!settleApply.value.inputComment) {
  680. ElMessage({
  681. message: "申请理由不能为空!",
  682. type: "error",
  683. duration: 2500,
  684. showClose: true,
  685. });
  686. return;
  687. }
  688. settleApply.value.settleDatetime = formatDatetime(
  689. settleApply.value.settleDatetime
  690. );
  691. let message = "是否确认提交" + dismissBtnText.value + "申请?";
  692. if (settleApply.value.type === 2) {
  693. message +=
  694. "您选择的中间断账时间为【" +
  695. settleApply.value.settleDatetime +
  696. "】,请仔细核对。";
  697. }
  698. ElMessageBox.confirm(message, "提示", {
  699. type: "warning",
  700. confirmButtonText: "确定",
  701. cancelButtonText: "取消",
  702. })
  703. .then(() => {
  704. submitSettleApply(settleApply.value).then(res => {
  705. ElMessage({
  706. message: res,
  707. type: "success",
  708. duration: 2500,
  709. showClose: true,
  710. });
  711. showSettleApplyForm.value = false;
  712. });
  713. })
  714. .catch(() => {});
  715. };
  716. const dismissBtnText = computed(() => {
  717. return patient.value.midSetl ? "中间断账" : "出院结算";
  718. });
  719. const dismissCalMsg = ref("");
  720. const actOrders = ref([]);
  721. const actOrderDetail = ref([]);
  722. const showActOrders = ref(false);
  723. const showSettleApplyForm = ref(false);
  724. const settleApply = ref({});
  725. const closeActOrder = () => {
  726. actOrders.value = actOrderDetail.value = [];
  727. dismissCalMsg.value = "";
  728. showActOrders.value = false;
  729. };
  730. const tempSortNo = ref(0);
  731. const executeDismissCalculate = (midSetl, disdate, sortNo) => {
  732. showPreDischargeErrors.value = false;
  733. dismissCalculate(patient.value)
  734. .then(() => {
  735. settleApply.value.patNo = patient.value.inpatientNo;
  736. settleApply.value.times = patient.value.admissTimes;
  737. settleApply.value.ledgerSn = patient.value.ledgerSn;
  738. settleApply.value.type = midSetl ? 2 : 1;
  739. settleApply.value.settleDatetime = disdate || setlDatetime.value;
  740. settleApply.value.acctUsedFlag = "0";
  741. settleApply.value.deathFlag = patient.value.deathFlag;
  742. settleApply.value.inputComment = midSetl ? null : "医嘱离院。";
  743. settleApply.value.sortNo = null === sortNo ? tempSortNo.value : sortNo;
  744. showSettleApplyForm.value = true;
  745. })
  746. .catch(res2 => {
  747. if (res2.code && res2.code === 1004) {
  748. negativeFees.value = res2.data;
  749. dismissCalMsg.value = res2.message;
  750. showNegativeFee.value = true;
  751. } else if (res2.code && res2.code === 1104) {
  752. negativeFees.value = res2.data;
  753. dismissCalMsg.value = res2.message;
  754. showUnhandledDrugOrder.value = true;
  755. } else if (res2.code && res2.code === 1105) {
  756. negativeFees.value = res2.data;
  757. dismissCalMsg.value = res2.message;
  758. showUnhandledRefundDrugOrder.value = true;
  759. } else {
  760. dismissCalMsg.value = res2.toString();
  761. }
  762. });
  763. };
  764. const preDischargeErrors = ref([]);
  765. const showPreDischargeErrors = ref(false);
  766. const setlDatetime = ref("");
  767. const cancelDischarge = () => {
  768. showPreDischargeErrors.value = false;
  769. preDischargeErrors.value = [];
  770. setlDatetime.value = "";
  771. };
  772. const preDischarge = (midSetl, settleDatetime, sortNo) => {
  773. if (midSetl) {
  774. executeDismissCalculate(midSetl, settleDatetime, sortNo);
  775. } else {
  776. powersiPreDischarge(makeVisitId())
  777. .then(() => {
  778. executeDismissCalculate(midSetl, settleDatetime, sortNo);
  779. })
  780. .catch(e => {
  781. setlDatetime.value = settleDatetime;
  782. preDischargeErrors.value = e.data;
  783. showPreDischargeErrors.value = true;
  784. });
  785. }
  786. };
  787. const makeVisitId = () => {
  788. return (
  789. patient.value.inpatientNo +
  790. "_" +
  791. patient.value.admissTimes +
  792. "_" +
  793. patient.value.ledgerSn
  794. );
  795. };
  796. const userInfo = useUserStore().userInfo;
  797. const userSid = useUserStore().getSid;
  798. const beforeSettle = midSetl => {
  799. if (nullPatient()) {
  800. return;
  801. }
  802. patient.value.midSetl = midSetl;
  803. selectSettleApply(patient.value).then(res => {
  804. tempSortNo.value = res.sortNo;
  805. if (null === res.status) {
  806. patient.value.sid = userSid;
  807. patient.value.zjdzDatetime = getDatetime();
  808. ElMessageBox.confirm("请确认患者状态:", "提示", {
  809. type: "warning",
  810. confirmButtonText: "患者未停保",
  811. cancelButtonText: "患者已停保",
  812. distinguishCancelAndClose: true,
  813. closeOnClickModal: false,
  814. closeOnPressEscape: false,
  815. })
  816. .then(() => {
  817. patient.value.deathFlag = false;
  818. preDischarge(midSetl, res.settleDatetime, res.sortNo);
  819. })
  820. .catch(action => {
  821. if (action === "cancel") {
  822. patient.value.deathFlag = true;
  823. preDischarge(midSetl, res.settleDatetime, res.sortNo);
  824. }
  825. });
  826. } else {
  827. switch (res.status) {
  828. case 0:
  829. ElMessageBox.alert(
  830. "医保科尚未处理此患者的" +
  831. dismissBtnText.value +
  832. "申请,请耐心等候或者致电医保科(内线电话:2102)。",
  833. "提示",
  834. {
  835. type: "warning",
  836. }
  837. );
  838. break;
  839. case 1:
  840. patient.value.acctUsedFlag = res.acctUsedFlag;
  841. patient.value.deathFlag = res.deathFlag;
  842. if (res.settleDatetime) {
  843. patient.value.zjdzDatetime = res.settleDatetime;
  844. fetchActOrders();
  845. } else {
  846. if (midSetl) {
  847. patient.value.zjdzDatetime = getDatetime();
  848. showZjdzDate.value = true;
  849. } else {
  850. fetchActOrders();
  851. }
  852. }
  853. break;
  854. case 2:
  855. ElMessageBox.confirm(
  856. "医保科驳回了此患者的" +
  857. dismissBtnText.value +
  858. "申请,驳回意见为【" +
  859. res.handleComment +
  860. "】",
  861. "提示",
  862. {
  863. type: "error",
  864. distinguishCancelAndClose: true,
  865. confirmButtonText: "我知道了",
  866. cancelButtonText: "重新提交",
  867. showCancelButton: true,
  868. }
  869. ).catch(action => {
  870. if (action === "cancel") {
  871. patient.value.sid = userSid;
  872. patient.value.zjdzDatetime = res.settleDatetime;
  873. ElMessageBox.confirm("请确认患者状态:", "提示", {
  874. type: "warning",
  875. confirmButtonText: "患者未停保",
  876. cancelButtonText: "患者已停保",
  877. })
  878. .then(() => {
  879. patient.value.deathFlag = false;
  880. executeDismissCalculate(
  881. midSetl,
  882. res.settleDatetime,
  883. res.sortNo
  884. );
  885. })
  886. .catch(() => {
  887. patient.value.deathFlag = true;
  888. executeDismissCalculate(
  889. midSetl,
  890. res.settleDatetime,
  891. res.sortNo
  892. );
  893. });
  894. }
  895. });
  896. break;
  897. }
  898. }
  899. });
  900. };
  901. const fetchActOrders = () => {
  902. getActOrders(patient.value.inpatientNo, patient.value.admissTimes).then(
  903. res => {
  904. actOrders.value = res;
  905. if (res.length > 0) {
  906. actOrderDetail.value = res[0].list;
  907. }
  908. showActOrders.value = true;
  909. }
  910. );
  911. };
  912. const switchActOrder = row => {
  913. actOrderDetail.value = row.list;
  914. };
  915. const showNegativeFee = ref(false);
  916. const showUnhandledDrugOrder = ref(false);
  917. const showUnhandledRefundDrugOrder = ref(false);
  918. const negativeFees = ref([]);
  919. const doCalFee = () => {
  920. patient.value.sid = userSid;
  921. dismissCalculate(patient.value)
  922. .then(res => {
  923. dismissCalMsg.value = "done";
  924. ElMessageBox.alert("计算成功。", "提示", {
  925. type: "success",
  926. });
  927. })
  928. .catch(res => {
  929. if (res.code && res.code === 1004) {
  930. negativeFees.value = res.data;
  931. dismissCalMsg.value = res.message;
  932. showNegativeFee.value = true;
  933. } else if (res.code && res.code === 1104) {
  934. negativeFees.value = res.data;
  935. dismissCalMsg.value = res.message;
  936. showUnhandledDrugOrder.value = true;
  937. } else if (res.code && res.code === 1105) {
  938. negativeFees.value = res.data;
  939. dismissCalMsg.value = res.message;
  940. showUnhandledRefundDrugOrder.value = true;
  941. } else {
  942. dismissCalMsg.value = res.toString();
  943. }
  944. });
  945. };
  946. const excuteDismiss = () => {
  947. if (dismissCalMsg.value !== "done") {
  948. const message =
  949. dismissCalMsg.value === "" ? "请先进行费用计算!" : dismissCalMsg.value;
  950. ElMessage({
  951. message: message,
  952. type: "error",
  953. duration: 2500,
  954. showClose: true,
  955. });
  956. return;
  957. }
  958. const param = {
  959. patNo: patient.value.inpatientNo,
  960. times: patient.value.admissTimes,
  961. ledgerSn: patient.value.ledgerSn,
  962. };
  963. getSiPatInfo(param).then(res => {
  964. patient.value.medType = res.medType;
  965. if (!res.mdtrtId) {
  966. ziFeiDismiss();
  967. } else {
  968. injuryMode.value ? injuryDismiss() : yibaoDismiss();
  969. }
  970. });
  971. };
  972. const injuryDismiss = () => {
  973. inpatientDischargeProcess(patient.value)
  974. .then(res => {
  975. ElMessageBox.alert(dismissBtnText.value + "成功。", "提示", {
  976. type: "success",
  977. });
  978. })
  979. .then(() => {
  980. afterDismiss();
  981. });
  982. };
  983. const ziFeiDismiss = () => {
  984. const param = {
  985. inpatientNo: patient.value.inpatientNo,
  986. admissTimes: patient.value.admissTimes,
  987. bedNo: patient.value.bedNo,
  988. deptCode: patient.value.admissDept,
  989. wardCode: patient.value.admissWard,
  990. midSetl: patient.value.midSetl,
  991. zjdzDatetime: patient.value.zjdzDatetime,
  992. };
  993. selfPayDismiss(param).then(() => {
  994. ElMessageBox.alert(dismissBtnText.value + "成功。", "提示", {
  995. type: "success",
  996. }).then(() => {
  997. afterDismiss();
  998. });
  999. });
  1000. };
  1001. const yibaoDismiss = () => {
  1002. if (!patient.value.acctUsedFlag) {
  1003. patient.value.acctUsedFlag = "0";
  1004. }
  1005. dischargeProcessing(patient.value).then(() => {
  1006. ElMessageBox.alert(dismissBtnText.value + "成功。", "提示", {
  1007. type: "success",
  1008. }).then(() => {
  1009. afterDismiss();
  1010. });
  1011. });
  1012. };
  1013. const executeTimeoutSettlement = () => {
  1014. timeoutSettlement(patient.value).then(() => {
  1015. ElMessageBox.alert(dismissBtnText.value + "成功。", "提示", {
  1016. type: "success",
  1017. }).then(() => {
  1018. afterDismiss();
  1019. });
  1020. });
  1021. };
  1022. const afterDismiss = () => {
  1023. if (patient.value.midSetl) {
  1024. patient.value.ledgerSn += 1;
  1025. }
  1026. showActOrders.value = false;
  1027. };
  1028. const conventionsVisible = ref(false);
  1029. const roughConventions = ref([]);
  1030. const conventionDetails = ref([]);
  1031. const selectedConventions = ref([]);
  1032. const showConventions = () => {
  1033. if (nullPatient()) return;
  1034. conventionDetails.value = [];
  1035. getRoughConventions(
  1036. patient.value.inpatientNo,
  1037. patient.value.admissTimes
  1038. ).then(res => {
  1039. roughConventions.value = res;
  1040. if (res.length > 0) {
  1041. clickConvention(res[0]);
  1042. }
  1043. conventionsVisible.value = true;
  1044. });
  1045. };
  1046. const clickConvention = row => {
  1047. getDetailConventions(row.inpatientNo, row.actOrderNo).then(res => {
  1048. conventionDetails.value = res;
  1049. if (selectedConventions.value.indexOf(row) > -1) {
  1050. conventionDetails.value.forEach(item => (item.checked = true));
  1051. }
  1052. });
  1053. };
  1054. const handleSelectConvention = val => {
  1055. selectedConventions.value = val;
  1056. };
  1057. const confirmRetractConventions = () => {
  1058. if (selectedConventions.value.length === 0) {
  1059. ElMessage({
  1060. message: "没有选中的条目。",
  1061. type: "warning",
  1062. duration: 2500,
  1063. showClose: true,
  1064. });
  1065. } else {
  1066. ElMessageBox.confirm("确定撤销选中的常规项目吗?", "提示", {
  1067. type: "warning",
  1068. confirmButtonText: "确定",
  1069. cancelButtonText: "放弃",
  1070. })
  1071. .then(() => {
  1072. let orders = [];
  1073. selectedConventions.value.forEach(item => {
  1074. orders.push(item.actOrderNo);
  1075. });
  1076. retractConventions(orders).then(() => {
  1077. ElMessage({
  1078. message: "撤销成功。",
  1079. type: "success",
  1080. duration: 2500,
  1081. showClose: true,
  1082. });
  1083. showConventions();
  1084. });
  1085. })
  1086. .catch(() => {});
  1087. }
  1088. };
  1089. const closeThreeConventions = () => {
  1090. roughConventions.value = conventionDetails.value = [];
  1091. conventionsVisible.value = false;
  1092. };
  1093. const afterReadCard = result => {
  1094. patient.value.mdtrtCertType = result.mdtrtCertType;
  1095. patient.value.readCardResult = result.readCardResult;
  1096. patient.value.readCardBizType = result.readCardBizType;
  1097. };
  1098. const cancelDismiss = () => {
  1099. ElMessageBox.confirm("确定取消此患者的医保结算?", "提示", {
  1100. confirmButtonText: "确定",
  1101. cancelButtonText: "放弃",
  1102. type: "warning",
  1103. }).then(() => {
  1104. if (injuryMode.value) {
  1105. revokeInpatientSettlement(patient.value).then(() => {
  1106. ElMessage({
  1107. message: "取消医保结算成功。",
  1108. type: "success",
  1109. duration: 2500,
  1110. showClose: true,
  1111. });
  1112. });
  1113. } else {
  1114. revokeSettlement(patient.value).then(() => {
  1115. ElMessage({
  1116. message: "取消医保结算成功。",
  1117. type: "success",
  1118. duration: 2500,
  1119. showClose: true,
  1120. });
  1121. });
  1122. }
  1123. }).catch(() => {});
  1124. };
  1125. const showDismissOrderDate = ref(false);
  1126. const cancelSelectDismissOrderDate = () => {
  1127. patient.value.dismissOrderDate = new Date();
  1128. showDismissOrderDate.value = false;
  1129. };
  1130. const confirmSelectDismissOrderDate = () => {
  1131. ElMessageBox.confirm(
  1132. "您选择的出院医嘱时间为:" +
  1133. formatDatetime(patient.value.dismissOrderDate) +
  1134. ",是否确认?",
  1135. "提示",
  1136. {
  1137. type: "warning",
  1138. confirmButtonText: "确定",
  1139. cancelButtonText: "取消",
  1140. }
  1141. )
  1142. .then(() => {
  1143. patient.value.dismissOrderDate = formatDatetime(
  1144. patient.value.dismissOrderDate
  1145. );
  1146. genDismissActOrder(patient.value)
  1147. .then(res => {
  1148. ElMessageBox.alert("生成出院医嘱成功!医嘱号为:" + res, "提示", {
  1149. type: "success",
  1150. confirmButtonText: "确定",
  1151. });
  1152. })
  1153. .then(() => {
  1154. showDismissOrderDate.value = false;
  1155. fecthDisDiags();
  1156. });
  1157. })
  1158. .catch(() => {});
  1159. };
  1160. const makeDismissOrder = () => {
  1161. if (nullPatient()) return;
  1162. patient.value.dismissOrderDate = new Date();
  1163. showDismissOrderDate.value = true;
  1164. };
  1165. const isKqk = computed(() => {
  1166. return userInfo.deptCode === "8000201" || userInfo.deptCode === "1090000";
  1167. });
  1168. const rcvrcalcost = () => {
  1169. if (nullPatient()) return;
  1170. receiveAndRecalculateCost(patient.value).then(res => {
  1171. setBaseinfo(res);
  1172. ElMessage({
  1173. type: "success",
  1174. message: "费用接收重算成功。",
  1175. duration: 2000,
  1176. showClose: true,
  1177. });
  1178. });
  1179. };
  1180. const rejectNotGeneratedMedicationListClick = () => {
  1181. if (nullPatient()) return;
  1182. ElMessageBox.confirm(
  1183. "请问是否要撤销所有未提交的药单,此操作不可逆。",
  1184. "提示",
  1185. {
  1186. type: "warning",
  1187. }
  1188. )
  1189. .then(() => {
  1190. rejectNotGeneratedMedicationList(
  1191. patient.value.inpatientNo,
  1192. patient.value.admissTimes
  1193. );
  1194. })
  1195. .catch(() => {});
  1196. };
  1197. function openCostList() {
  1198. useDialog(ChargeList, {
  1199. params: {
  1200. patNo: patient.value.inpatientNo,
  1201. times: patient.value.admissTimes,
  1202. },
  1203. confirmText: "打印",
  1204. cancelText: "关闭",
  1205. dialogProps: {
  1206. title: "费用清单",
  1207. fullscreen: true,
  1208. },
  1209. });
  1210. }
  1211. onMounted(() => {
  1212. if (patient.value.inpatientNo) {
  1213. fecthDisDiags();
  1214. }
  1215. });
  1216. function getBalance(val) {
  1217. if (!val) {
  1218. return "";
  1219. }
  1220. return val > 0
  1221. ? '<span style="color: green">' + val + "</span>"
  1222. : '<span style="color: red">' + val + "</span>";
  1223. }
  1224. function initDiags() {
  1225. return reactive({
  1226. yb: [],
  1227. bl: [],
  1228. });
  1229. }
  1230. function getOrderStatus(val) {
  1231. switch (val.chargeStatus) {
  1232. case 5: // 未确认药
  1233. return (
  1234. '<p style="background: dodgerblue; color: white;">' +
  1235. val.actOrderNo +
  1236. "</p>"
  1237. );
  1238. case 6: // 未接收
  1239. return (
  1240. '<p style="background: orange; color: white;">' +
  1241. val.actOrderNo +
  1242. "</p>"
  1243. );
  1244. case 8: // 医技未确认
  1245. return (
  1246. '<p style="background: orangered; color: white;">' +
  1247. val.actOrderNo +
  1248. "</p>"
  1249. );
  1250. default:
  1251. return "<p>" + val.actOrderNo + "</p>";
  1252. }
  1253. }
  1254. function getOrderDetailStatus(val) {
  1255. switch (val.chargeStatus) {
  1256. case 5: // 未确认药
  1257. return (
  1258. '<p style="background: dodgerblue; color: white;">' +
  1259. val.chargeDate +
  1260. "</p>"
  1261. );
  1262. case 6: // 未接收
  1263. return (
  1264. '<p style="background: orange; color: white;">' +
  1265. val.chargeDate +
  1266. "</p>"
  1267. );
  1268. case 8: // 医技未确认
  1269. return (
  1270. '<p style="background: orangered; color: white;">' +
  1271. val.chargeDate +
  1272. "</p>"
  1273. );
  1274. default:
  1275. return "<p>" + val.chargeDate + "</p>";
  1276. }
  1277. }
  1278. function getCxFlag(val) {
  1279. return val === "1"
  1280. ? '<p style="color: orangered;">是</p>'
  1281. : '<p style="color:green">否</p>';
  1282. }
  1283. </script>
  1284. <style scoped>
  1285. .m-divider {
  1286. height: 1px;
  1287. background-color: white;
  1288. width: 100%;
  1289. margin: 5px 0;
  1290. }
  1291. .color-span {
  1292. display: inline-block;
  1293. width: 30px;
  1294. height: 10px;
  1295. margin-left: 15px;
  1296. }
  1297. </style>