MzRegister.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044
  1. <template>
  2. <div class="layout_container">
  3. <header class="round-header">
  4. <el-input
  5. v-model="patientId"
  6. style="width: 100px"
  7. clearable
  8. placeholder="门诊ID"
  9. >
  10. </el-input>
  11. <el-select
  12. v-model="medType"
  13. style="width: 110px"
  14. placeholder="医疗类别"
  15. @change="handleMedTypeChange"
  16. >
  17. <el-option
  18. v-for="item in medTypes"
  19. :key="item.code"
  20. :value="item.code"
  21. :label="item.name"
  22. ></el-option>
  23. </el-select>
  24. <el-cascader
  25. v-model="admdvsCascader"
  26. clearable
  27. filterable
  28. placeholder="参保地区"
  29. :options="allAdmdvses"
  30. @change="handleAdmdvsChange"
  31. :disabled="injuryMode === true"
  32. style="width: 160px"
  33. ></el-cascader>
  34. <el-select v-model="acctUsedFlag" style="width: 118px">
  35. <el-option label="不使用个账" value="0"></el-option>
  36. <el-option label="使用本人个账" value="1"></el-option>
  37. <el-option label="使用共济人个账" value="2"></el-option>
  38. </el-select>
  39. <el-select v-model="patMedInsPaused" style="width: 110px">
  40. <el-option label="患者正常参保" value="normal"></el-option>
  41. <el-option label="患者已停保" value="paused"></el-option>
  42. </el-select>
  43. <el-dropdown
  44. trigger="click"
  45. @command="receiptsOpts"
  46. style="margin-left: 8px"
  47. >
  48. <el-button type="primary">
  49. 处方&nbsp;
  50. <el-icon>
  51. <ArrowDown />
  52. </el-icon>
  53. </el-button>
  54. <template #dropdown>
  55. <el-dropdown-menu>
  56. <el-dropdown-item icon="Document" command="require"
  57. >获取门诊处方</el-dropdown-item
  58. >
  59. <el-dropdown-item icon="Delete" command="delete"
  60. >删除所有处方</el-dropdown-item
  61. >
  62. </el-dropdown-menu>
  63. </template>
  64. </el-dropdown>
  65. <ReadCard :pat-no="patientId" @success="afterReadCard" />
  66. <el-dropdown trigger="click" @command="register">
  67. <el-button type="primary">
  68. 登记&nbsp;
  69. <el-icon>
  70. <ArrowDown />
  71. </el-icon>
  72. </el-button>
  73. <template #dropdown>
  74. <el-dropdown-menu>
  75. <el-dropdown-item icon="CreditCard" command="execute"
  76. >医保登记</el-dropdown-item
  77. >
  78. <el-dropdown-item icon="RefreshLeft" command="revoke"
  79. >取消登记</el-dropdown-item
  80. >
  81. <el-dropdown-item divided icon="Help" command="emergencyRescue"
  82. >急诊抢救</el-dropdown-item
  83. >
  84. <el-dropdown-item icon="Refresh" command="rvkEmergencyRescue"
  85. >急诊抢救撤销</el-dropdown-item
  86. >
  87. </el-dropdown-menu>
  88. </template>
  89. </el-dropdown>
  90. <el-dropdown
  91. trigger="click"
  92. @command="receiptsOpts"
  93. style="margin-left: 8px"
  94. >
  95. <el-button type="primary">
  96. 上传&nbsp;
  97. <el-icon>
  98. <ArrowDown />
  99. </el-icon>
  100. </el-button>
  101. <template #dropdown>
  102. <el-dropdown-menu>
  103. <el-dropdown-item icon="Upload" command="upload"
  104. >医保处方上传</el-dropdown-item
  105. >
  106. <el-dropdown-item icon="RefreshLeft" command="retract"
  107. >撤销处方上传</el-dropdown-item
  108. >
  109. <el-dropdown-item divided icon="Edit" command="diags"
  110. >医保诊断补录</el-dropdown-item
  111. >
  112. </el-dropdown-menu>
  113. </template>
  114. </el-dropdown>
  115. <el-dropdown
  116. trigger="click"
  117. @command="settlement"
  118. style="margin-left: 8px"
  119. >
  120. <el-button type="primary">
  121. 结算&nbsp;
  122. <el-icon>
  123. <ArrowDown />
  124. </el-icon>
  125. </el-button>
  126. <template #dropdown>
  127. <el-dropdown-menu>
  128. <el-dropdown-item icon="SetUp" command="preSettlement"
  129. >试算</el-dropdown-item
  130. >
  131. <el-dropdown-item icon="Stamp" command="realSettlement"
  132. >结算</el-dropdown-item
  133. >
  134. <el-dropdown-item
  135. divided
  136. icon="RefreshLeft"
  137. command="cancelSettlement"
  138. >取消结算</el-dropdown-item
  139. >
  140. </el-dropdown-menu>
  141. </template>
  142. </el-dropdown>
  143. <el-button style="margin-left: 8px" type="success" @click="seeMzBlRecord"
  144. >门诊病历</el-button
  145. >
  146. <el-button type="danger" icon="Refresh" @click="clearinfo">
  147. 重置</el-button
  148. >
  149. </header>
  150. <div class="layout_main layout_container layout-horizontal">
  151. <aside style="display: flex">
  152. <div>
  153. <el-table
  154. ref="timesTable"
  155. :data="unPaidReceipts"
  156. highlight-current-row
  157. @row-click="clickTimes"
  158. empty-text="无"
  159. height="100%"
  160. >
  161. <el-table-column
  162. label="次数"
  163. prop="times"
  164. width="50"
  165. ></el-table-column>
  166. <el-table-column label="诊间" width="50">
  167. <template #default="scope">
  168. <span v-html="isMztczf(scope.row)"></span>
  169. </template>
  170. </el-table-column>
  171. </el-table>
  172. </div>
  173. <div>
  174. <el-table
  175. ref="ordersTable"
  176. :data="orderNos"
  177. highlight-current-row
  178. @row-click="clickOrderNo"
  179. empty-text="无"
  180. height="100%"
  181. >
  182. <el-table-column label="处方" width="50">
  183. <template #default="scope">
  184. <span v-html="colorStatus(scope.row)"></span>
  185. </template>
  186. </el-table-column>
  187. <el-table-column label="金额" width="60">
  188. <template #default="scope">
  189. {{ scope.row.totalFee.toFixed(2) }}
  190. </template>
  191. </el-table-column>
  192. <el-table-column label="操作" width="160">
  193. <template #default="scope">
  194. <button @click="markMzFees" :disabled="scope.row.status">
  195. 生成
  196. </button>
  197. <button
  198. @click="unmarkMzFees(scope.row)"
  199. :disabled="!scope.row.status"
  200. >
  201. 撤销
  202. </button>
  203. </template>
  204. </el-table-column>
  205. </el-table>
  206. </div>
  207. </aside>
  208. <div class="layout_main">
  209. <div style="height: 100%; padding: 30px; position: relative">
  210. <img
  211. v-if="mzVisit.settledFlag === 1"
  212. :src="mzSettled"
  213. alt=""
  214. class="tip-img"
  215. />
  216. <img
  217. v-if="mzVisit.vipFlag === '1'"
  218. :src="selfpayreceipt"
  219. alt=""
  220. class="tip-img"
  221. />
  222. <mz-receipt
  223. :mz-visit="mzVisit"
  224. :receipts="currentReceipts"
  225. show-checkbox
  226. />
  227. </div>
  228. </div>
  229. </div>
  230. </div>
  231. <el-dialog title="个人信息" v-model="showInsuinfo" width="65%">
  232. <el-tag>{{ injuryMode ? "工伤信息" : "参保信息" }}</el-tag>
  233. <div v-if="injuryMode">
  234. <el-table
  235. :data="injuryinfo"
  236. height="180"
  237. stripe
  238. @row-click="handleClickInjuryinfo"
  239. >
  240. <el-table-column label="证件号码" prop="aac002"></el-table-column>
  241. <el-table-column label="姓名" prop="aac003"></el-table-column>
  242. <el-table-column label="单位名称" prop="aab004"></el-table-column>
  243. <el-table-column label="受伤时间" prop="alc020"></el-table-column>
  244. <el-table-column label="认定申请时间" prop="alc017"></el-table-column>
  245. <el-table-column label="认定ID" prop="aaz127"></el-table-column>
  246. <el-table-column label="个人编号" prop="aac001"></el-table-column>
  247. <el-table-column label="参保统筹区" prop="baa027Name"></el-table-column>
  248. </el-table>
  249. </div>
  250. <div v-else>
  251. <el-table :data="psnBaseinfo.insuinfo" @row-click="handleClickInsuinfo">
  252. <el-table-column property="balc" label="余额"></el-table-column>
  253. <el-table-column label="险种类型" prop="insutypeName"></el-table-column>
  254. <el-table-column label="人员类别" prop="psnTypeName"></el-table-column>
  255. <el-table-column
  256. label="参保状态"
  257. prop="psnInsuStasName"
  258. ></el-table-column>
  259. <el-table-column
  260. property="psnInsuDate"
  261. label="个人参保日期"
  262. ></el-table-column>
  263. <el-table-column
  264. property="pausInsuDate"
  265. label="暂停参保日期"
  266. ></el-table-column>
  267. <el-table-column
  268. property="cvlservFlagName"
  269. label="公务员标志"
  270. ></el-table-column>
  271. <el-table-column
  272. property="insuplcAdmdvs"
  273. label="参保地医保区划"
  274. ></el-table-column>
  275. <el-table-column
  276. property="insuplcAdmdvsName"
  277. label="参保地名称"
  278. ></el-table-column>
  279. <el-table-column property="empName" label="单位名称"></el-table-column>
  280. </el-table>
  281. <div style="height: 16px"></div>
  282. <el-tag>身份信息</el-tag>
  283. <el-table :data="psnBaseinfo.idetinfo" stripe height="180">
  284. <el-table-column
  285. label="人员身份类别"
  286. prop="psnIdetTypeName"
  287. ></el-table-column>
  288. <el-table-column
  289. label="人员类别等级"
  290. prop="psnTypeLv"
  291. ></el-table-column>
  292. <el-table-column label="备注" prop="memo"></el-table-column>
  293. <el-table-column label="开始时间" prop="begntime"></el-table-column>
  294. <el-table-column label="结束时间" prop="endtime"></el-table-column>
  295. </el-table>
  296. </div>
  297. </el-dialog>
  298. <el-dialog
  299. title="请选择(慢特病备案信息)"
  300. v-model="showSpcChrAccts"
  301. width="40%"
  302. >
  303. <el-table :data="spcChrDiseAccts" @row-click="uploadFees">
  304. <el-table-column
  305. property="opspDiseCode"
  306. label="病种编码"
  307. ></el-table-column>
  308. <el-table-column
  309. property="opspDiseName"
  310. label="病种名称"
  311. ></el-table-column>
  312. <el-table-column property="begndate" label="生效日期"></el-table-column>
  313. <el-table-column property="enddate" label="失效日期"></el-table-column>
  314. </el-table>
  315. </el-dialog>
  316. <el-dialog title="请选择生育病种" v-model="showMatnDises" width="60%">
  317. <el-table :data="matnDises" @row-click="uploadFees" stripe height="360">
  318. <el-table-column property="code" label="病种编码"></el-table-column>
  319. <el-table-column property="name" label="病种名称"></el-table-column>
  320. <el-table-column property="insutype" label="险种类型"></el-table-column>
  321. <el-table-column property="limitAmt" label="疾病限额"></el-table-column>
  322. </el-table>
  323. </el-dialog>
  324. <el-dialog
  325. title="医保诊断补录"
  326. v-model="showInputDiags"
  327. width="60%"
  328. :close-on-click-modal="false"
  329. :close-on-press-escape="false"
  330. >
  331. <outpatient-diagnose-supply
  332. :med-type="medType"
  333. :mz-visit="mzVisit"
  334. @close="showInputDiags = false"
  335. ></outpatient-diagnose-supply>
  336. </el-dialog>
  337. <el-dialog v-model="showMdtrtGrpType" title="跨省患者请选择" width="360px">
  338. <div>
  339. &nbsp;&nbsp;&nbsp;&nbsp;就诊人群类型:
  340. <el-select v-model="expContent.MDTRT_GRP_TYPE" style="width: 160px">
  341. <el-option
  342. v-for="item in mdtrtGrpTypes"
  343. :key="item.key"
  344. :label="item.name"
  345. :value="item.code"
  346. ></el-option>
  347. </el-select>
  348. </div>
  349. <div style="margin-top: 12px">
  350. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;外伤标志:
  351. <el-select v-model="expContent.TRUM_FLAG" style="width: 160px">
  352. <el-option label="无" value="" key="trumFlag-N"></el-option>
  353. <el-option label="非外伤" value="0" key="trumFlag-0"></el-option>
  354. <el-option label="外伤" value="1" key="trumFlag-1"></el-option>
  355. </el-select>
  356. </div>
  357. <div style="margin-top: 12px">
  358. 涉及第三方标志:
  359. <el-select v-model="expContent.REL_TTP_FLAG" style="width: 160px">
  360. <el-option label="无" value="" key="relTtpFlag-N"></el-option>
  361. <el-option label="涉及" value="0" key="relTtpFlag-0"></el-option>
  362. <el-option label="不涉及" value="1" key="relTtpFlag-1"></el-option>
  363. </el-select>
  364. </div>
  365. <div style="margin-top: 12px">
  366. 门急诊转诊标志:
  367. <el-select v-model="expContent.OTP_ER_REFL_FLAG" style="width: 160px">
  368. <el-option label="无" value="" key="otpErReflFlag-N"></el-option>
  369. <el-option label="急诊" value="1" key="otpErReflFlag-1"></el-option>
  370. <el-option label="转诊" value="2" key="otpErReflFlag-2"></el-option>
  371. <el-option
  372. label="转诊合并急诊"
  373. value="3"
  374. key="otpErReflFlag-3"
  375. ></el-option>
  376. </el-select>
  377. </div>
  378. <div style="margin-top: 20px; width: 100%; text-align: right">
  379. <el-button @click="afterChooseMdtrtGrpType" type="primary" size="default"
  380. >确定</el-button
  381. >
  382. </div>
  383. </el-dialog>
  384. <mz-bl-record
  385. v-if="showMzBlRecord"
  386. :patient-id="patientId"
  387. :times="times"
  388. @closed="showMzBlRecord = false"
  389. ></mz-bl-record>
  390. <EmergencyRescue ref="emergencyRef" :param="emergencyParams" />
  391. </template>
  392. <script setup>
  393. import { onMounted, reactive, ref } from "vue";
  394. import { allAdmdvses } from "@/data/admdvs";
  395. import {
  396. deleteAllMzReceipts,
  397. deleteMzReceipt,
  398. getMzReceipts,
  399. insertSiMzFees,
  400. outpatientPreSettlement,
  401. outpatientRegistration,
  402. revokeOutpatientFeeDetails,
  403. revokeOutpatientRegistration,
  404. uploadOutpatientFeeDetails,
  405. outpatientSettlement,
  406. revokeOutpatientSettlement,
  407. } from "@/api/medical-insurance/si-outpatient";
  408. import { ElMessageBox, ElSelect } from "element-plus";
  409. import {
  410. obtainBasicPersonInfo,
  411. querySpecialChronicDiseasesAccreditation,
  412. queryMzMatnDises,
  413. } from "@/api/medical-insurance/si-query";
  414. import { getMedTypesByFlag } from "@/api/medical-insurance/si-dict";
  415. import ReadCard from "@/components/medical-insurance/readcard/Index.vue";
  416. import mzSettled from "@/assets/mz-settled.png";
  417. import selfpayreceipt from "@/assets/selfpayreceipt.png";
  418. import OutpatientDiagnoseSupply from "@/components/medical-insurance/outpatient-diagnose-supply/Index.vue";
  419. import {
  420. employeeInfoInquiry2,
  421. injuryOutpatientFeeUpload,
  422. injuryOutpatientRegister,
  423. injuryOutpatientSettlement,
  424. revokeInjuryOutpatientFee,
  425. revokeInjuryOutpatientRegistration,
  426. revokeInjuryOutpatientSettlement,
  427. } from "@/api/medical-insurance/si-injury";
  428. import MzBlRecord from "@/components/outpatient/MzBlRecord.vue";
  429. import MzReceipt from "@/components/outpatient/MzReceipt.vue";
  430. import { useUserStore } from "@/pinia/user-store";
  431. import { CyMessageBox } from "@/utils/cy-message-box";
  432. import { xcMessage } from "@/utils/xiaochan-element-plus";
  433. import { checkGeneratedFees } from "@/api/medical-insurance/emergency-rescue";
  434. import EmergencyRescue from "@/views/medical-insurance/outpatient/component/EmergencyRescue.vue";
  435. const medType = ref(null);
  436. const admdvs = ref(null);
  437. const certainAdmdvs = ref("");
  438. const medTypes = ref([]);
  439. const patientId = ref("");
  440. const times = ref(null);
  441. const unPaidReceipts = ref([]);
  442. const showInsuinfo = ref(false);
  443. const psnBaseinfo = ref({});
  444. const mzVisit = ref({});
  445. const receipts = ref({});
  446. const orderNos = ref([]);
  447. const currentReceipts = ref([]);
  448. const timesTable = ref(null);
  449. const ordersTable = ref(null);
  450. const currentOrder = ref({});
  451. const spcChrDiseAccts = ref([]);
  452. const showSpcChrAccts = ref(false);
  453. const matnDises = ref([]);
  454. const showMatnDises = ref(false);
  455. const showInputDiags = ref(false);
  456. const showMdtrtGrpType = ref(false);
  457. const patMedInsPaused = ref("normal");
  458. const expContent = reactive({
  459. MDTRT_GRP_TYPE: "",
  460. TRUM_FLAG: "",
  461. REL_TTP_FLAG: "",
  462. OTP_ER_REFL_FLAG: "",
  463. });
  464. const mdtrtGrpTypes = [
  465. { code: "", name: "普通患者", key: "mdtrtGrpTypes-N" },
  466. { code: "1", name: "新冠肺炎确诊患者", key: "mdtrtGrpTypes-1" },
  467. { code: "2", name: "其他国家突发公共事件", key: "mdtrtGrpTypes-2" },
  468. { code: "3", name: "新冠肺炎疑似患者", key: "mdtrtGrpTypes-3" },
  469. { code: "4", name: "无症状感染者", key: "mdtrtGrpTypes-4" },
  470. ];
  471. const injuryMode = computed(() => {
  472. return medType.value === "41" || medType.value === "46";
  473. });
  474. const injuryinfo = ref([]);
  475. const handleClickInjuryinfo = row => {
  476. row.patNo = patientId.value;
  477. row.times = times.value;
  478. row.ledgerSn = 0;
  479. row.aka130 = medType.value;
  480. if (row.aka130 === "41") {
  481. row.bka003 = "410";
  482. } else if (row.aka130 === "46") {
  483. row.bka003 = "461";
  484. }
  485. injuryOutpatientRegister(row).then(() => {
  486. showInsuinfo.value = false;
  487. xcMessage.success("登记成功");
  488. });
  489. };
  490. const nullPatientId = () => {
  491. if (!patientId.value) {
  492. xcMessage.warning("请输入门诊id号!");
  493. return true;
  494. }
  495. return false;
  496. };
  497. const clearExpContent = () => {
  498. expContent.MDTRT_GRP_TYPE = "";
  499. expContent.TRUM_FLAG = "";
  500. expContent.REL_TTP_FLAG = "";
  501. expContent.OTP_ER_REFL_FLAG = "";
  502. };
  503. const nullMedType = () => {
  504. if (!medType.value) {
  505. xcMessage.warning("请先选择医疗类别!");
  506. return true;
  507. }
  508. return false;
  509. };
  510. const admdvsCascader = ref([]);
  511. const handleMedTypeChange = val => {
  512. if (val === "41") {
  513. admdvsCascader.value = [];
  514. admdvs.value = null;
  515. }
  516. };
  517. const invalidateTips = () => {
  518. return nullPatientId() || nullTimes() || nullMedType();
  519. };
  520. const register = command => {
  521. if (invalidateTips()) {
  522. return;
  523. }
  524. clearExpContent();
  525. const param = {
  526. patNo: patientId.value,
  527. medType: medType.value,
  528. admdvs: admdvs.value,
  529. times: times.value,
  530. legderSn: 0,
  531. needSaving: 1,
  532. mdtrtCertType: readCardData.mdtrtCertType,
  533. readCardResult: readCardData.readCardResult,
  534. busCardInfo: readCardData.busCardInfo
  535. };
  536. if (command === "execute") {
  537. beforeRegister(param);
  538. } else if (command === "revoke") {
  539. revokeRegister(param);
  540. } else if (command === "emergencyRescue") {
  541. beforeEmergencyRescue(param);
  542. } else {
  543. revokeEmergencyRescue(param);
  544. }
  545. };
  546. function beforeEmergencyRescue(param) {
  547. if (param.medType !== "1301") {
  548. xcMessage.error("医疗类别请选择【急诊抢救】。");
  549. return;
  550. }
  551. checkGeneratedFees(param).then(() => {
  552. obtainBasicPersonInfo(param).then(res => {
  553. times.value = res.times;
  554. psnBaseinfo.value = res;
  555. showInsuinfo.value = true;
  556. });
  557. });
  558. }
  559. function beforeRegister(param) {
  560. if (param.medType === "1301") {
  561. xcMessage.error("医疗类别为【急诊抢救】的患者,请选择急诊抢救专用通道。");
  562. return;
  563. }
  564. if (injuryMode.value) {
  565. employeeInfoInquiry2(param).then(res => {
  566. injuryinfo.value = res;
  567. showInsuinfo.value = true;
  568. });
  569. } else {
  570. obtainBasicPersonInfo(param).then(res => {
  571. times.value = res.times;
  572. psnBaseinfo.value = res;
  573. showInsuinfo.value = true;
  574. });
  575. }
  576. }
  577. function revokeRegister(param) {
  578. if (injuryMode.value) {
  579. revokeInjuryOutpatientRegistration(param).then(res => {
  580. xcMessage.success(res);
  581. });
  582. } else {
  583. revokeOutpatientRegistration(param).then(res => {
  584. xcMessage.success(res);
  585. });
  586. }
  587. }
  588. const nullTimes = () => {
  589. if (!times.value) {
  590. xcMessage.warning("请先获取门诊处方!");
  591. return true;
  592. }
  593. return false;
  594. };
  595. const receiptsOpts = command => {
  596. if (nullPatientId()) {
  597. return;
  598. }
  599. if (command !== "require") {
  600. if (nullTimes()) {
  601. return;
  602. }
  603. }
  604. const param = {
  605. patNo: patientId.value,
  606. times: times.value,
  607. };
  608. switch (command) {
  609. case "require":
  610. fetchReceipts(param);
  611. break;
  612. case "delete":
  613. deleteAllMzReceipts(param).then(res => {
  614. xcMessage.success(res);
  615. fetchReceipts(param);
  616. });
  617. break;
  618. case "upload":
  619. if (injuryMode.value) {
  620. const param = {
  621. patNo: patientId.value,
  622. times: times.value,
  623. ledgerSn: 0,
  624. calType: 0,
  625. };
  626. injuryOutpatientFeeUpload(param).then(() => {
  627. injuryOutpatientSettlement(param).then(res => {
  628. const message =
  629. "处方总费用:" +
  630. res.totalCost +
  631. ",工伤报销金额:" +
  632. res.fundPay +
  633. "。";
  634. ElMessageBox.alert(message, "提示", {
  635. type: "success",
  636. showCancelButton: false,
  637. }).then(() => {});
  638. });
  639. });
  640. } else {
  641. qrySpcChrDiseAcct(param);
  642. }
  643. break;
  644. case "retract":
  645. if (injuryMode.value) {
  646. const param = {
  647. patNo: patientId.value,
  648. times: times.value,
  649. ledgerSn: 0,
  650. };
  651. revokeInjuryOutpatientFee(param).then(res => {
  652. xcMessage.success(res);
  653. });
  654. } else {
  655. revokeOutpatientFeeDetails(param).then(res => {
  656. xcMessage.success(res);
  657. });
  658. }
  659. break;
  660. case "diags":
  661. showInputDiags.value = true;
  662. break;
  663. }
  664. };
  665. const fetchReceipts = param => {
  666. clearReadCardData();
  667. getMzReceipts(param)
  668. .then(res => {
  669. unPaidReceipts.value = res;
  670. setTimeout(() => {
  671. timesTable.value.setCurrentRow(res[0]);
  672. clickTimes(res[0]);
  673. }, 100);
  674. })
  675. .catch(() => {
  676. unPaidReceipts.value = [];
  677. orderNos.value = [];
  678. currentReceipts.value = [];
  679. });
  680. };
  681. const markMzFees = () => {
  682. if (currentReceipts.value.length === 0) {
  683. xcMessage.warning("请先选择要保存的处方!");
  684. return;
  685. }
  686. ElMessageBox.confirm("是否将选中处方生成医保处方?", "提示", {
  687. type: "warning",
  688. confirmButtonText: "生成",
  689. cancelButtonText: "取消",
  690. })
  691. .then(() => {
  692. insertSiMzFees(currentReceipts.value).then(() => {
  693. currentOrder.value.status = true;
  694. xcMessage.success("已成功生成医保处方。");
  695. });
  696. })
  697. .catch(() => {});
  698. };
  699. const qrySpcChrDiseAcct = param => {
  700. if (medType.value === "51") {
  701. queryMzMatnDises().then(res => {
  702. matnDises.value = res;
  703. showMatnDises.value = true;
  704. });
  705. } else if (medType.value === "1401" || medType.value === "1402") {
  706. querySpecialChronicDiseasesAccreditation(param).then(res => {
  707. spcChrDiseAccts.value = res;
  708. showSpcChrAccts.value = true;
  709. });
  710. } else {
  711. uploadFees(param);
  712. }
  713. };
  714. const uploadFees = row => {
  715. if (medType.value === "51") {
  716. row.patNo = patientId.value;
  717. row.times = times.value;
  718. row.opspDiseCode = row.code;
  719. row.opspDiseName = row.name;
  720. }
  721. uploadOutpatientFeeDetails(row).then(res => {
  722. times.value = res.times;
  723. showSpcChrAccts.value = false;
  724. showMatnDises.value = false;
  725. if (patMedInsPaused.value === "normal") {
  726. mzPreSetl();
  727. } else {
  728. CyMessageBox.alert({
  729. type: "success",
  730. message: "上传成功",
  731. });
  732. }
  733. });
  734. };
  735. const readCardData = reactive({
  736. mdtrtCertType: null,
  737. readCardResult: null,
  738. readCardBizType: null,
  739. busCardInfo: null,
  740. });
  741. const clearReadCardData = () => {
  742. readCardData.mdtrtCertType = null;
  743. readCardData.readCardResult = null;
  744. readCardData.readCardBizType = null;
  745. };
  746. const afterReadCard = result => {
  747. readCardData.mdtrtCertType = result.mdtrtCertType;
  748. readCardData.readCardResult = result.readCardResult;
  749. readCardData.busCardInfo = result.busCardInfo;
  750. readCardData.readCardBizType = result.readCardBizType;
  751. };
  752. const emergencyRef = ref(null);
  753. const emergencyParams = ref({});
  754. const handleClickInsuinfo = row => {
  755. certainAdmdvs.value = row.insuplcAdmdvs;
  756. const param = {
  757. patNo: patientId.value,
  758. times: times.value,
  759. name: mzVisit.value.name,
  760. insutype: row.insutype,
  761. medType: medType.value,
  762. psnType: row.psnType,
  763. insuplcAdmdvs: row.insuplcAdmdvs,
  764. insuplcAdmdvsName: row.insuplcAdmdvsName,
  765. empName: row.empName,
  766. balc: row.balc,
  767. mdtrtCertType: readCardData.mdtrtCertType,
  768. readCardResult: readCardData.readCardResult,
  769. busCardInfo: readCardData.busCardInfo,
  770. readCardBizType: readCardData.readCardBizType,
  771. };
  772. if (param.medType === "1301") {
  773. emergencyRescueProcess(param);
  774. } else {
  775. normalOutpatientRegister(param);
  776. }
  777. };
  778. function emergencyRescueProcess(param) {
  779. showInsuinfo.value = false;
  780. emergencyParams.value = param;
  781. nextTick().then(() => {
  782. emergencyRef.value.start();
  783. });
  784. }
  785. function revokeEmergencyRescue(param) {
  786. if (param.medType !== "1301") {
  787. xcMessage.error("医疗类别请选择【急诊抢救】。");
  788. return;
  789. }
  790. emergencyParams.value = param;
  791. nextTick().then(() => {
  792. emergencyRef.value.revoke();
  793. });
  794. }
  795. function normalOutpatientRegister(param) {
  796. outpatientRegistration(param).then(res => {
  797. showInsuinfo.value = false;
  798. xcMessage.success(res);
  799. });
  800. }
  801. const clickOrderNo = row => {
  802. currentOrder.value = row;
  803. currentReceipts.value = receipts.value[row.orderNo];
  804. mzVisit.value.totalFee = row.totalFee.toFixed(2);
  805. };
  806. const clickTimes = row => {
  807. mzVisit.value = row.mzVisit;
  808. certainAdmdvs.value = mzVisit.value.admdvs;
  809. receipts.value = row.mzReceipts;
  810. orderNos.value = row.orderNos;
  811. times.value = row.times;
  812. currentReceipts.value = [];
  813. setTimeout(() => {
  814. ordersTable.value.setCurrentRow(orderNos.value[0]);
  815. clickOrderNo(orderNos.value[0]);
  816. }, 100);
  817. };
  818. const colorStatus = row => {
  819. return row.status
  820. ? `<span style="color: green">第${row.orderNo}张</span>`
  821. : `<span style="color: red">第${row.orderNo}张</span>`;
  822. };
  823. const unmarkMzFees = row => {
  824. ElMessageBox.confirm("是否将选中处方从医保处方中删除?", "提示", {
  825. type: "warning",
  826. confirmButtonText: "确定",
  827. cancelButtonText: "取消",
  828. })
  829. .then(() => {
  830. deleteMzReceipt(row).then(() => {
  831. currentOrder.value.status = false;
  832. xcMessage.success("已成功删除医保处方。");
  833. });
  834. })
  835. .catch(() => {});
  836. };
  837. const currentCommand = ref(null);
  838. const settlement = command => {
  839. if (nullPatientId() || nullTimes()) {
  840. return;
  841. }
  842. if (command === "cancelSettlement") {
  843. revokeMzSettle();
  844. } else {
  845. if (injuryMode.value) {
  846. const param = {
  847. patNo: patientId.value,
  848. times: times.value,
  849. ledgerSn: 0,
  850. calType: command === "preSettlement" ? 0 : 1,
  851. };
  852. injuryOutpatientSettlement(param).then(res => {
  853. const title = command === "preSettlement" ? "试算成功" : "结算成功";
  854. const message =
  855. "处方总费用:" +
  856. res.totalCost +
  857. ",工伤报销金额:" +
  858. res.fundPay +
  859. "。";
  860. ElMessageBox.alert(message, title, {
  861. type: "success",
  862. showCancelButton: false,
  863. }).then(() => {});
  864. });
  865. } else {
  866. if (certainAdmdvs.value && certainAdmdvs.value.startsWith("43")) {
  867. command === "preSettlement" ? mzPreSetl() : mzSettle();
  868. } else {
  869. currentCommand.value = command;
  870. showMdtrtGrpType.value = true;
  871. }
  872. }
  873. }
  874. };
  875. const afterChooseMdtrtGrpType = () => {
  876. if (currentCommand.value) {
  877. currentCommand.value === "preSettlement" ? mzPreSetl() : mzSettle();
  878. }
  879. showMdtrtGrpType.value = false;
  880. };
  881. const userStore = useUserStore();
  882. const mzPreSetl = () => {
  883. const param = {
  884. staffId: userStore.userInfo.code,
  885. patNo: patientId.value,
  886. times: times.value,
  887. acctUsedFlag: acctUsedFlag.value,
  888. mdtrtCertType: readCardData.mdtrtCertType,
  889. readCardResult: readCardData.readCardResult,
  890. readCardBizType: readCardData.readCardBizType,
  891. expContent: JSON.stringify(expContent),
  892. };
  893. outpatientPreSettlement(param).then(res => {
  894. const message =
  895. "医保处方总费用:" +
  896. res.totalCost +
  897. ",医保报销金额:" +
  898. res.fundPay +
  899. "。";
  900. ElMessageBox.alert(message, "试算成功", {
  901. type: "success",
  902. showCancelButton: false,
  903. }).then(() => {});
  904. });
  905. };
  906. const acctUsedFlag = ref("1");
  907. const mzSettle = () => {
  908. const param = {
  909. patNo: patientId.value,
  910. times: times.value,
  911. acctUsedFlag: acctUsedFlag.value,
  912. mdtrtCertType: readCardData.mdtrtCertType,
  913. readCardResult: readCardData.readCardResult,
  914. readCardBizType: readCardData.readCardBizType,
  915. busCardInfo: readCardData.busCardInfo,
  916. expContent: JSON.stringify(expContent),
  917. };
  918. outpatientSettlement(param).then(res => {
  919. clearReadCardData();
  920. const message =
  921. "医保处方总费用:" +
  922. res.totalCost +
  923. ",医保报销金额:" +
  924. res.fundPay +
  925. "。";
  926. ElMessageBox.alert(message, "结算成功", {
  927. type: "success",
  928. showCancelButton: false,
  929. }).then(() => {});
  930. });
  931. };
  932. const revokeMzSettle = () => {
  933. const param = {
  934. patNo: patientId.value,
  935. times: times.value,
  936. ledgerSn: 0,
  937. };
  938. if (injuryMode.value) {
  939. revokeInjuryOutpatientSettlement(param).then(res => {
  940. ElMessageBox.alert(res, "提示", {
  941. type: "success",
  942. showCancelButton: false,
  943. });
  944. });
  945. } else {
  946. revokeOutpatientSettlement(param).then(res => {
  947. ElMessageBox.alert("撤销门诊结算成功", "提示", {
  948. type: "success",
  949. showCancelButton: false,
  950. });
  951. });
  952. }
  953. };
  954. const isMztczf = row => {
  955. return row.zgmztczf === 1
  956. ? `<span style="color: green">医保</span>`
  957. : `<span>自费</span>`;
  958. };
  959. const clearinfo = () => {
  960. patientId.value = "";
  961. times.value = null;
  962. unPaidReceipts.value = [];
  963. psnBaseinfo.value = {};
  964. mzVisit.value = {};
  965. receipts.value = {};
  966. orderNos.value = [];
  967. currentReceipts.value = [];
  968. timesTable.value = null;
  969. ordersTable.value = null;
  970. currentOrder.value = {};
  971. spcChrDiseAccts.value = [];
  972. };
  973. const handleAdmdvsChange = val => {
  974. admdvs.value = val ? val[1] : null;
  975. };
  976. const showMzBlRecord = ref(false);
  977. function seeMzBlRecord() {
  978. if (nullTimes()) {
  979. return;
  980. }
  981. showMzBlRecord.value = true;
  982. }
  983. onMounted(() => {
  984. getMedTypesByFlag("clinic").then(res => {
  985. medTypes.value = res;
  986. });
  987. });
  988. </script>
  989. <style scoped lang="scss">
  990. .tip-img {
  991. z-index: 999;
  992. width: 230px;
  993. position: absolute;
  994. top: 160px;
  995. left: 260px;
  996. background: rgba(255, 255, 255, 0.5);
  997. }
  998. </style>