YzQueryCondition.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. <template>
  2. <div>
  3. <div style="display: flex;align-items: center">
  4. <el-button @click="queryYz" v-title="'重新查询患者的医嘱'">重置</el-button>
  5. <el-divider direction="vertical"/>
  6. <label>
  7. 显示范围:
  8. <select v-model="queryParam.displayRange" v-title="'显示范围'">
  9. <option :value="0" title="全部的医嘱">全部</option>
  10. <option :value="1" title="已经停止的医嘱">停止</option>
  11. <option :value="2" title="正在执行的长期医嘱">当前</option>
  12. <option :value="3" title="今天开的医嘱">今天</option>
  13. </select>
  14. </label>
  15. <label>
  16. 状态:
  17. <select v-model.number="queryParam.zhuangTai" title="医嘱的状态">
  18. <option :value="0">全部</option>
  19. <option :value="1">录入</option>
  20. <option :value="2">确认</option>
  21. <option :value="3">执行</option>
  22. <option :value="5">停止</option>
  23. </select>
  24. </label>
  25. <label>
  26. 药房:
  27. <select v-model="queryParam.groupNo" v-title="'在新增医嘱的时候,去指定的药房查询药品。'">
  28. <option value="73">住院</option>
  29. <option value="71">门诊</option>
  30. </select>
  31. </label>
  32. <el-divider direction="vertical"/>
  33. <el-button-group>
  34. <el-button type="primary"
  35. @click="addYiZhuClick"
  36. v-title="'添加医嘱,快捷键 ALT+A'">
  37. 添加
  38. </el-button>
  39. <el-button type="success"
  40. :loading="confirmLoading"
  41. @click="currentConfirmOrdersClick"
  42. v-title="'把录入状态的医嘱,变为确认状态。'"
  43. v-if="!isCydy()">
  44. 确认
  45. </el-button>
  46. <el-button type="success"
  47. @click="confirmTheDoctorSOrderWithMedicineClick"
  48. v-else
  49. v-title="'把录入状态的医嘱,变为确认状态。'">
  50. 确认带药
  51. </el-button>
  52. </el-button-group>
  53. <el-divider direction="vertical"/>
  54. <el-dropdown split-button
  55. type="danger"
  56. @click="deleteAnOrderByOrderNo"
  57. v-title="'在表格中选中了一条医嘱后这个方法才能有效果,(这个医嘱需要在工作台显示),也可以在点击表格后面的删按钮<br /><span style=\'color:#fffe00\'>限制:</span>只能删除自己开的,只能删除(录入、确认)状态的医嘱。'">
  58. 删除
  59. <template #dropdown>
  60. <el-dropdown-menu>
  61. <div
  62. v-title="'在表格中,点击前面的选择框,选中医嘱(多条或单挑),才能点击此按钮,限制:只能删除自己开的,只能删除(录入、确认)状态的医嘱。'">
  63. <el-dropdown-item @click="batchDeleteOrdersClick">
  64. 批量删除
  65. </el-dropdown-item>
  66. </div>
  67. </el-dropdown-menu>
  68. </template>
  69. </el-dropdown>
  70. <el-divider direction="vertical"/>
  71. <el-dropdown split-button
  72. @click="yzMitt.emit('clickOnTheOrderTemplate')"
  73. v-title="'获取医嘱的模板'">
  74. 模板
  75. <template #dropdown>
  76. <el-dropdown-menu>
  77. <div v-title="'维护自己创建的模板'">
  78. <el-dropdown-item @click="orderTemplateClick">
  79. 维护模板
  80. </el-dropdown-item>
  81. </div>
  82. <div v-title="'选中表格中的医嘱作为模板'">
  83. <el-dropdown-item @click="orderTemplateClickCopy">
  84. 选中医嘱做模板
  85. </el-dropdown-item>
  86. </div>
  87. </el-dropdown-menu>
  88. </template>
  89. </el-dropdown>
  90. </div>
  91. <div style="border-top: 1px solid #000; margin: 5px 0"/>
  92. <div>
  93. <el-dropdown split-button
  94. @click="clickToStopTheOrder"
  95. v-title="'批量停止医嘱,需要结束时间一栏的日期数据框变成红色则代表,是要停止这条医嘱。<br />' +
  96. '双击日期输入框,默认填充停止到当前时间,并选中医嘱,可点击输入框中的日历,去选择其他时间。<br />' +
  97. '鼠标右键数据框,可以取消停止。'">
  98. 批量停止
  99. <template #dropdown>
  100. <el-dropdown-menu>
  101. <div v-title="'跳转到这个患者,修改医嘱时间的申请页面。'">
  102. <el-dropdown-item @click="clickToModifyTheDoctorSOrderTime">
  103. 修改医嘱时间
  104. </el-dropdown-item>
  105. </div>
  106. </el-dropdown-menu>
  107. </template>
  108. </el-dropdown>
  109. <el-dropdown split-button v-title="'跳转到指定患者的数据页面'">
  110. 页面跳转
  111. <template #dropdown>
  112. <el-dropdown-menu>
  113. <el-dropdown-item @click="jumpToMedicalRecord">
  114. 病案首页
  115. </el-dropdown-item>
  116. <el-dropdown-item @click="openRationalDrugUse">
  117. 合理用药
  118. </el-dropdown-item>
  119. <el-dropdown-item @click="routerBloodSugarClick">
  120. 血糖
  121. </el-dropdown-item>
  122. </el-dropdown-menu>
  123. </template>
  124. </el-dropdown>
  125. <el-dropdown split-button
  126. v-title="'设置选中医嘱成组。'"
  127. @click="confirmAssociationClick">
  128. 关联
  129. <template #dropdown>
  130. <el-dropdown-menu>
  131. <el-dropdown-item @click="clearAssociate()">取消关联</el-dropdown-item>
  132. </el-dropdown-menu>
  133. </template>
  134. </el-dropdown>
  135. <el-dropdown
  136. v-title="'患者数据维护,包含传染病、过敏源。'"
  137. split-button>
  138. 数据维护
  139. <template #dropdown>
  140. <el-dropdown-menu>
  141. <el-dropdown-item
  142. @click="yzMitt.emit('allergen')">
  143. 过敏源维护
  144. </el-dropdown-item>
  145. <el-dropdown-item @click="crbOpen">
  146. 传染病上报
  147. </el-dropdown-item>
  148. <el-dropdown-item
  149. @click="router.push(`/outpatient/chronicDisease/chronicDiseaseRegister/${props.patientInfo.inpatientNo}`)">
  150. 慢病登记
  151. </el-dropdown-item>
  152. </el-dropdown-menu>
  153. </template>
  154. </el-dropdown>
  155. <el-dropdown v-title="'工作台操作,录入、清空、医嘱弹窗、复制粘贴'"
  156. @click="yzMitt.emit('toAddAnOrder')"
  157. split-button>
  158. 录入医嘱
  159. <template #dropdown>
  160. <el-dropdown-menu>
  161. <div v-title="'清空,正在编辑的医嘱或者选中的医嘱。'">
  162. <el-dropdown-item
  163. @click="yzMitt.emit('emptyTheWorkbench')">
  164. 清空工作台
  165. </el-dropdown-item>
  166. </div>
  167. <div v-title="'打开医嘱弹窗,目前只有转科、抗菌药物信息、处置医嘱可以打开弹窗。'">
  168. <el-dropdown-item @click="yzMitt.emit('openTheOrderPopUpWindow')">
  169. 医嘱弹窗
  170. </el-dropdown-item>
  171. </div>
  172. <div v-title="'复制并粘贴医嘱,如果想要分开,请在表格中鼠标右键一个医嘱,选择复制,然后在到表格中,选择粘贴医嘱。<br /><br />' +
  173. '<span style=\'color:#fffe00\'>注意:</span>如果你是在临时医嘱页面,那么长期医嘱会改为 ONCE 频率,如果在长期医嘱页面那么临时医嘱会改为 QD 频率,如果是成组的医嘱' +
  174. '复制父医嘱即可子医嘱会自动复制,目前不会提供批量复制医嘱的功能。'">
  175. <el-dropdown-item
  176. @click="yzMitt.emit('duplicateAndPaste')">
  177. 复制并粘贴
  178. </el-dropdown-item>
  179. </div>
  180. <div v-title="'<span style=\'color:#fffe00\'>带有实验性质的功能,如果此方法出错频率高,后期可能会删除。</span>' +
  181. '<br />复制选中的医嘱并粘贴。'">
  182. <el-dropdown-item @click="openCopyDialog">
  183. 复制选中的医嘱
  184. </el-dropdown-item>
  185. </div>
  186. </el-dropdown-menu>
  187. </template>
  188. </el-dropdown>
  189. <el-dropdown title="其他操作"
  190. split-button>
  191. 其他
  192. <template #dropdown>
  193. <el-dropdown-menu>
  194. <div v-title="'为即将出院的患者预约门诊,如果患者没有门诊号的话,需要先创建一个门诊号。'">
  195. <el-dropdown-item
  196. @click="outPatientDialogOpen()">
  197. 门诊预约
  198. </el-dropdown-item>
  199. </div>
  200. <div v-title="'一键停止正在执行的医嘱,会生成一条医嘱,此医嘱是口头医嘱,有没任何效果。'">
  201. <el-dropdown-item
  202. @click="oneClickStopOpen">
  203. 一键停止
  204. </el-dropdown-item>
  205. </div>
  206. <el-dropdown-item @click="clickTimeLimitReminder">
  207. 时限提示
  208. </el-dropdown-item>
  209. </el-dropdown-menu>
  210. </template>
  211. </el-dropdown>
  212. <el-button type="success" icon="RefreshRight" @click="rcvrcalcost"
  213. v-title="'如果患者费用存在问题或者有些费用看不到,<br />可以执行此操作。'"> 费用接收重算
  214. </el-button>
  215. </div>
  216. </div>
  217. <!-- 门诊预约 -->
  218. <outpatient-appointments v-if="outPatientDialog"
  219. @closed="outPatientDialog = false"/>
  220. <one-click-stop v-if="oneClickStopDialog"
  221. @closed="oneClickStopDialog = false"/>
  222. <CopyTableDataOrder v-model="copyTableDialog"
  223. v-if="copyTableDialog"/>
  224. </template>
  225. <script setup>
  226. import {
  227. associateOrdersApi,
  228. confirmTheDoctorSOrderWithMedicine,
  229. huoQuYiZhuShuJu, stopOrder
  230. } from "@/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru";
  231. import {
  232. associateOrders,
  233. clearAssociate,
  234. confirmLoading,
  235. errorMsg,
  236. huanZheXinXi,
  237. isCydy,
  238. queryParam,
  239. setOrderDataAndTwinkle,
  240. yiZhuData,
  241. yiZhuDataInit,
  242. youWuXuanZheHuanZhe,
  243. yzData,
  244. yzMitt,
  245. clickTimeLimitReminder
  246. } from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng";
  247. import {BizException, ExceptionEnum} from "@/utils/BizException";
  248. import router from "@/router";
  249. import {clone} from "@/utils/clone";
  250. import {listIsBlank, stringIsBlank} from "@/utils/blank-utils";
  251. import {xcMessage} from "@/utils/xiaochan-element-plus";
  252. import {getFormatDatetime} from "@/utils/date";
  253. import {ElMessageBox} from "element-plus";
  254. import ReportOfInfectiousDiseases
  255. from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/report-of-infectious-diseases/ReportOfInfectiousDiseases.vue";
  256. import OutpatientAppointments
  257. from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/OutpatientAppointments.vue";
  258. import OneClickStop from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/OneClickStop.vue";
  259. import {getPatientInfo, receiveAndRecalculateCost} from "@/api/inpatient/patient";
  260. import CopyTableDataOrder
  261. from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/table/CopyTableDataOrder.vue";
  262. import setDialogToJs from "@/components/js-dialog-comp/useDialogToJs";
  263. const props = defineProps({
  264. patientInfo: {
  265. type: Object
  266. },
  267. returnData: {
  268. type: Function
  269. },
  270. frequCodeChange: Function,
  271. confirmOrdersClick: Function,
  272. clickOnTheOrderTemplate: Function
  273. })
  274. const emits = defineEmits(['batchDeleteOrdersClick'])
  275. const copyTableDialog = ref(false)
  276. const openCopyDialog = () => {
  277. if (youWuXuanZheHuanZhe()) return
  278. copyTableDialog.value = true
  279. }
  280. const queryYz = async (tableScrollTop = true) => {
  281. if (!props.patientInfo.inpatientNo) {
  282. BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择患者')
  283. }
  284. try {
  285. yiZhuDataInit()
  286. yzMitt.emit('clearSelected')
  287. if (tableScrollTop) {
  288. yzMitt.emit('tableScroll', 0);
  289. }
  290. yzData.value = await huoQuYiZhuShuJu({
  291. patNo: props.patientInfo.inpatientNo,
  292. times: props.patientInfo.admissTimes
  293. })
  294. } catch (e) {
  295. yzData.value = []
  296. }
  297. }
  298. const addYiZhuClick = () => {
  299. yzMitt.emit('toAddAnOrder')
  300. }
  301. const currentConfirmOrdersClick = () => {
  302. if (!props.patientInfo.inpatientNo) {
  303. BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择患者')
  304. }
  305. props.confirmOrdersClick()
  306. }
  307. /**
  308. * 确认医嘱
  309. */
  310. const confirmTheDoctorSOrderWithMedicineClick = () => {
  311. if (!props.patientInfo.inpatientNo) {
  312. BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择患者')
  313. }
  314. confirmLoading.value = true
  315. confirmTheDoctorSOrderWithMedicine(props.patientInfo.inpatientNo, props.patientInfo.admissTimes).then((res) => {
  316. if (res?.error) {
  317. errorMsg.value.type = YzErrTypeEnum.确认错误
  318. errorMsg.value.dialog = true
  319. errorMsg.value.data = res.data
  320. } else {
  321. queryYz()
  322. confirmLoading.value = false
  323. }
  324. })
  325. }
  326. const deleteAnOrderByOrderNo = () => {
  327. yzMitt.emit('deleteAnOrderByOrderNo', yiZhuData.value)
  328. }
  329. /**
  330. * 点击批量删除数据
  331. */
  332. const batchDeleteOrdersClick = () => {
  333. emits('batchDeleteOrdersClick')
  334. }
  335. /**
  336. * 跳转到模板页面
  337. */
  338. const orderTemplateClick = () => {
  339. router.push({
  340. name: 'orderTemplateMaintenance',
  341. })
  342. }
  343. /**
  344. * 选中复制的医嘱
  345. */
  346. const orderTemplateClickCopy = () => {
  347. let temp = clone(yzMitt.emit('getSelectedData'))
  348. if (listIsBlank(temp)) {
  349. xcMessage.error('请先选中医嘱。')
  350. return
  351. }
  352. let dept = {
  353. code: huanZheXinXi.value.zkWard,
  354. name: huanZheXinXi.value.zkWardName
  355. }
  356. router.push({
  357. name: 'orderTemplateMaintenance',
  358. params: {
  359. data: JSON.stringify(temp),
  360. dept: JSON.stringify(dept)
  361. }
  362. })
  363. }
  364. /**
  365. * 批量停止时间
  366. */
  367. const clickToStopTheOrder = () => {
  368. let tempData = yzMitt.emit('getSelectedData')
  369. tempData.forEach(item => {
  370. // 因为前端用的是浏览器自带的 所以要删除 T
  371. item.endTime = getFormatDatetime(item.endTimeTemp)
  372. })
  373. let param = {
  374. inpatientNo: huanZheXinXi.value.inpatientNo,
  375. admissTimes: huanZheXinXi.value.admissTimes,
  376. list: tempData
  377. }
  378. stopOrder(param).then(res => {
  379. yzMitt.emit('queryYz')
  380. })
  381. }
  382. // 点击修改医嘱时间
  383. const clickToModifyTheDoctorSOrderTime = () => {
  384. router.push({
  385. name: 'yzActOrderModify',
  386. query: {
  387. patNo: huanZheXinXi.value.inpatientNo,
  388. },
  389. })
  390. }
  391. // 跳转到病案首页
  392. const jumpToMedicalRecord = () => {
  393. router.push({
  394. name: 'fillCaseFrontSheet',
  395. query: {
  396. patNo: huanZheXinXi.value.inpatientNo,
  397. deptCode: huanZheXinXi.value.smallDept,
  398. },
  399. })
  400. }
  401. // 合理用药
  402. const openRationalDrugUse = () => {
  403. window.open('http://172.16.32.121:9097/index.html')
  404. }
  405. /**
  406. * 血糖
  407. */
  408. const routerBloodSugarClick = () => {
  409. router.push({
  410. name: 'bloodSugarQuery',
  411. params: {
  412. patNo: huanZheXinXi.value.inpatientNo,
  413. times: huanZheXinXi.value.admissTimes,
  414. }
  415. })
  416. }
  417. // 点击确认关联
  418. const confirmAssociationClick = () => {
  419. if (associateOrders.value.actOrderNo === null) {
  420. BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择需要关联的父医嘱')
  421. }
  422. if (associateOrders.value.associatedGroup.length === 0) {
  423. BizException(ExceptionEnum.MESSAGE_ERROR, '至少选择一个子医嘱')
  424. }
  425. ElMessageBox.confirm('请确认是否要关联这些医嘱。', '提示', {
  426. type: 'warning'
  427. }).then(() => {
  428. associateOrdersApi(associateOrders.value).then(async (res) => {
  429. clearAssociate()
  430. await setOrderDataAndTwinkle(res[0].actOrderNo, res)
  431. })
  432. }).catch(() => {
  433. })
  434. }
  435. const crbOpen = () => {
  436. if (youWuXuanZheHuanZhe()) return
  437. setDialogToJs(ReportOfInfectiousDiseases, {
  438. patNo: huanZheXinXi.value.inpatientNo,
  439. times: huanZheXinXi.value.admissTimes,
  440. }).catch(() => {
  441. })
  442. }
  443. const outPatientDialog = ref(false)
  444. const outPatientDialogOpen = () => {
  445. if (stringIsBlank(huanZheXinXi.value.zkWard)) {
  446. BizException(ExceptionEnum.LOGICAL_ERROR, "请先选择患者。");
  447. }
  448. if (stringIsBlank(huanZheXinXi.value.mzNo)) {
  449. BizException(ExceptionEnum.LOGICAL_ERROR, "没有查询到患者门诊号,请先建档。");
  450. }
  451. outPatientDialog.value = true
  452. }
  453. const oneClickStopDialog = ref(false)
  454. const oneClickStopOpen = () => {
  455. if (youWuXuanZheHuanZhe()) return
  456. oneClickStopDialog.value = true
  457. }
  458. const rcvrcalcost = async () => {
  459. if (youWuXuanZheHuanZhe()) return
  460. let {inpatientNo, admissTimes, ledgerSn, admissDate} = huanZheXinXi.value
  461. await receiveAndRecalculateCost({inpatientNo, admissTimes, ledgerSn, admissDate})
  462. huanZheXinXi.value = await getPatientInfo(inpatientNo)
  463. }
  464. onMounted(async () => {
  465. yzMitt.on('queryYz', (val) => {
  466. return queryYz(val)
  467. })
  468. yzMitt.on('confirmMedicalAdvice', () => {
  469. if (isCydy()) {
  470. confirmTheDoctorSOrderWithMedicineClick()
  471. } else {
  472. currentConfirmOrdersClick()
  473. }
  474. })
  475. })
  476. </script>
  477. <style scoped lang="scss">
  478. .status_color {
  479. width: 10px;
  480. height: 10px;
  481. }
  482. </style>