YzQueryCondition.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  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-item @click="openNewNutrientPlus">
  123. 营养评估
  124. </el-dropdown-item>
  125. </el-dropdown-menu>
  126. </template>
  127. </el-dropdown>
  128. <el-dropdown split-button
  129. v-title="'设置选中医嘱成组。'"
  130. @click="confirmAssociationClick">
  131. 关联
  132. <template #dropdown>
  133. <el-dropdown-menu>
  134. <el-dropdown-item @click="clearAssociate()">取消关联</el-dropdown-item>
  135. </el-dropdown-menu>
  136. </template>
  137. </el-dropdown>
  138. <el-dropdown
  139. v-title="'患者数据维护,包含传染病、过敏源。'"
  140. split-button>
  141. 数据维护
  142. <template #dropdown>
  143. <el-dropdown-menu>
  144. <el-dropdown-item
  145. @click="yzMitt.emit('allergen')">
  146. 过敏源维护
  147. </el-dropdown-item>
  148. <el-dropdown-item @click="crbOpen">
  149. 传染病上报
  150. </el-dropdown-item>
  151. <el-dropdown-item
  152. @click="router.push(`/outpatient/chronicDisease/chronicDiseaseRegister/${props.patientInfo.inpatientNo}`)">
  153. 慢病登记
  154. </el-dropdown-item>
  155. </el-dropdown-menu>
  156. </template>
  157. </el-dropdown>
  158. <el-dropdown v-title="'工作台操作,录入、清空、医嘱弹窗、复制粘贴'"
  159. @click="yzMitt.emit('toAddAnOrder')"
  160. split-button>
  161. 录入医嘱
  162. <template #dropdown>
  163. <el-dropdown-menu>
  164. <div v-title="'清空,正在编辑的医嘱或者选中的医嘱。'">
  165. <el-dropdown-item
  166. @click="yzMitt.emit('emptyTheWorkbench')">
  167. 清空工作台
  168. </el-dropdown-item>
  169. </div>
  170. <div v-title="'打开医嘱弹窗,目前只有转科、抗菌药物信息、处置医嘱可以打开弹窗。'">
  171. <el-dropdown-item @click="yzMitt.emit('openTheOrderPopUpWindow')">
  172. 医嘱弹窗
  173. </el-dropdown-item>
  174. </div>
  175. <div v-title="'复制并粘贴医嘱,如果想要分开,请在表格中鼠标右键一个医嘱,选择复制,然后在到表格中,选择粘贴医嘱。<br /><br />' +
  176. '<span style=\'color:#fffe00\'>注意:</span>如果你是在临时医嘱页面,那么长期医嘱会改为 ONCE 频率,如果在长期医嘱页面那么临时医嘱会改为 QD 频率,如果是成组的医嘱' +
  177. '复制父医嘱即可子医嘱会自动复制,目前不会提供批量复制医嘱的功能。'">
  178. <el-dropdown-item
  179. @click="yzMitt.emit('duplicateAndPaste')">
  180. 复制并粘贴
  181. </el-dropdown-item>
  182. </div>
  183. <div v-title="'<span style=\'color:#fffe00\'>带有实验性质的功能,如果此方法出错频率高,后期可能会删除。</span>' +
  184. '<br />复制选中的医嘱并粘贴。'">
  185. <el-dropdown-item @click="openCopyDialog">
  186. 复制选中的医嘱
  187. </el-dropdown-item>
  188. </div>
  189. </el-dropdown-menu>
  190. </template>
  191. </el-dropdown>
  192. <el-dropdown title="其他操作"
  193. split-button>
  194. 其他
  195. <template #dropdown>
  196. <el-dropdown-menu>
  197. <div v-title="'为即将出院的患者预约门诊,如果患者没有门诊号的话,需要先创建一个门诊号。'">
  198. <el-dropdown-item
  199. @click="outPatientDialogOpen()">
  200. 门诊预约
  201. </el-dropdown-item>
  202. </div>
  203. <div v-title="'一键停止正在执行的医嘱,会生成一条医嘱,此医嘱是口头医嘱,有没任何效果。'">
  204. <el-dropdown-item
  205. @click="oneClickStopOpen">
  206. 一键停止
  207. </el-dropdown-item>
  208. </div>
  209. <el-dropdown-item @click="clickTimeLimitReminder">
  210. 时限提示
  211. </el-dropdown-item>
  212. </el-dropdown-menu>
  213. </template>
  214. </el-dropdown>
  215. <el-button type="success" icon="RefreshRight" @click="rcvrcalcost"
  216. v-title="'如果患者费用存在问题或者有些费用看不到,<br />可以执行此操作。'"> 费用接收重算
  217. </el-button>
  218. </div>
  219. </div>
  220. <!-- 门诊预约 -->
  221. <outpatient-appointments v-if="outPatientDialog"
  222. @closed="outPatientDialog = false"/>
  223. <one-click-stop v-if="oneClickStopDialog"
  224. @closed="oneClickStopDialog = false"/>
  225. <CopyTableDataOrder v-model="copyTableDialog"
  226. v-if="copyTableDialog"/>
  227. </template>
  228. <script setup>
  229. import {
  230. associateOrdersApi,
  231. confirmTheDoctorSOrderWithMedicine,
  232. huoQuYiZhuShuJu,
  233. stopOrder
  234. } from "@/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru";
  235. import {
  236. associateOrders,
  237. clearAssociate,
  238. confirmLoading,
  239. huanZheXinXi,
  240. isCydy,
  241. queryParam,
  242. setOrderDataAndTwinkle,
  243. yiZhuData,
  244. yiZhuDataInit,
  245. youWuXuanZheHuanZhe,
  246. yzData,
  247. yzMitt,
  248. clickTimeLimitReminder,
  249. errorMsgFunc
  250. } from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng";
  251. import {BizException, ExceptionEnum} from "@/utils/BizException";
  252. import router from "@/router";
  253. import {clone} from "@/utils/clone";
  254. import {listIsBlank, stringIsBlank} from "@/utils/blank-utils";
  255. import {xcMessage} from "@/utils/xiaochan-element-plus";
  256. import {getFormatDatetime} from "@/utils/date";
  257. import {ElMessageBox} from "element-plus";
  258. import ReportOfInfectiousDiseases
  259. from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/report-of-infectious-diseases/ReportOfInfectiousDiseases.vue";
  260. import OutpatientAppointments
  261. from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/OutpatientAppointments.vue";
  262. import OneClickStop from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/OneClickStop.vue";
  263. import {getPatientInfo, receiveAndRecalculateCost} from "@/api/inpatient/patient";
  264. import CopyTableDataOrder
  265. from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/table/CopyTableDataOrder.vue";
  266. import setDialogToJs from "@/components/js-dialog-comp/useDialogToJs";
  267. import {CyMessageBox} from "@/components/cy/message-box";
  268. import {useUserStore} from "@/pinia/user-store";
  269. import XEUtils from "xe-utils";
  270. const props = defineProps({
  271. patientInfo: {
  272. type: Object
  273. },
  274. returnData: {
  275. type: Function
  276. },
  277. frequCodeChange: Function,
  278. confirmOrdersClick: Function,
  279. clickOnTheOrderTemplate: Function
  280. })
  281. const userStore = useUserStore().userInfo
  282. const emits = defineEmits(['batchDeleteOrdersClick'])
  283. const copyTableDialog = ref(false)
  284. const openCopyDialog = () => {
  285. if (youWuXuanZheHuanZhe()) return
  286. copyTableDialog.value = true
  287. }
  288. const queryYz = async (tableScrollTop = true) => {
  289. if (!props.patientInfo.inpatientNo) {
  290. BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择患者')
  291. }
  292. try {
  293. yiZhuDataInit()
  294. yzMitt.emit('clearSelected')
  295. if (tableScrollTop) {
  296. yzMitt.emit('tableScroll', 0);
  297. }
  298. yzData.value = await huoQuYiZhuShuJu({
  299. patNo: props.patientInfo.inpatientNo,
  300. times: props.patientInfo.admissTimes
  301. })
  302. } catch (e) {
  303. yzData.value = []
  304. }
  305. }
  306. const addYiZhuClick = () => {
  307. yzMitt.emit('toAddAnOrder')
  308. }
  309. const currentConfirmOrdersClick = () => {
  310. if (!props.patientInfo.inpatientNo) {
  311. BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择患者')
  312. }
  313. props.confirmOrdersClick()
  314. }
  315. /**
  316. * 确认医嘱
  317. */
  318. const confirmTheDoctorSOrderWithMedicineClick = () => {
  319. if (!props.patientInfo.inpatientNo) {
  320. BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择患者')
  321. }
  322. confirmLoading.value = true
  323. confirmTheDoctorSOrderWithMedicine(props.patientInfo.inpatientNo, props.patientInfo.admissTimes).then((res) => {
  324. if (res && res?.error) {
  325. errorMsgFunc.add(res.data)
  326. } else {
  327. queryYz()
  328. confirmLoading.value = false
  329. }
  330. })
  331. }
  332. const deleteAnOrderByOrderNo = () => {
  333. yzMitt.emit('deleteAnOrderByOrderNo', yiZhuData.value)
  334. }
  335. /**
  336. * 点击批量删除数据
  337. */
  338. const batchDeleteOrdersClick = () => {
  339. emits('batchDeleteOrdersClick')
  340. }
  341. /**
  342. * 跳转到模板页面
  343. */
  344. const orderTemplateClick = () => {
  345. router.push({
  346. name: 'orderTemplateMaintenance',
  347. })
  348. }
  349. /**
  350. * 选中复制的医嘱
  351. */
  352. const orderTemplateClickCopy = () => {
  353. let temp = clone(yzMitt.emit('getSelectedData'))
  354. if (listIsBlank(temp)) {
  355. xcMessage.error('请先选中医嘱。')
  356. return
  357. }
  358. let dept = {
  359. code: huanZheXinXi.value.zkWard,
  360. name: huanZheXinXi.value.zkWardName
  361. }
  362. router.push({
  363. name: 'orderTemplateMaintenance',
  364. params: {
  365. data: JSON.stringify(temp),
  366. dept: JSON.stringify(dept)
  367. }
  368. })
  369. }
  370. /**
  371. * 批量停止时间
  372. */
  373. const clickToStopTheOrder = async () => {
  374. const tempData = yzMitt.emit('getSelectedData')
  375. tempData.forEach(item => {
  376. // 因为前端用的是浏览器自带的 所以要删除 T
  377. item.endTime = getFormatDatetime(item.endTimeTemp)
  378. })
  379. await CyMessageBox.confirm({
  380. message: `是否批量停止时间,${tempData.length}条`,
  381. })
  382. let param = {
  383. inpatientNo: huanZheXinXi.value.inpatientNo,
  384. admissTimes: huanZheXinXi.value.admissTimes,
  385. list: tempData
  386. }
  387. stopOrder(param).then(res => {
  388. yzMitt.emit('queryYz')
  389. })
  390. }
  391. // 点击修改医嘱时间
  392. const clickToModifyTheDoctorSOrderTime = () => {
  393. router.push({
  394. name: 'yzActOrderModify',
  395. query: {
  396. patNo: huanZheXinXi.value.inpatientNo,
  397. },
  398. })
  399. }
  400. // 跳转到病案首页
  401. const jumpToMedicalRecord = () => {
  402. router.push({
  403. name: 'fillCaseFrontSheet',
  404. query: {
  405. patNo: huanZheXinXi.value.inpatientNo,
  406. deptCode: huanZheXinXi.value.smallDept,
  407. },
  408. })
  409. }
  410. // 合理用药
  411. const openRationalDrugUse = () => {
  412. window.open('http://172.16.32.121:9097/index.html')
  413. }
  414. function openNewNutrientPlus() {
  415. if (youWuXuanZheHuanZhe()) return
  416. window.open(`http://172.16.32.159/sysmgrApi/sysmgr/staff/hisToLogin?account=${userStore.codeRs}&patientHospitalNumber=${huanZheXinXi.value.inpatientNo}`)
  417. }
  418. /**
  419. * 血糖
  420. */
  421. const routerBloodSugarClick = () => {
  422. router.push({
  423. name: 'bloodSugarQuery',
  424. params: {
  425. patNo: huanZheXinXi.value.inpatientNo,
  426. times: huanZheXinXi.value.admissTimes,
  427. }
  428. })
  429. }
  430. // 点击确认关联
  431. const confirmAssociationClick = () => {
  432. if (associateOrders.value.actOrderNo === null) {
  433. BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择需要关联的父医嘱')
  434. }
  435. if (associateOrders.value.associatedGroup.length === 0) {
  436. BizException(ExceptionEnum.MESSAGE_ERROR, '至少选择一个子医嘱')
  437. }
  438. ElMessageBox.confirm('请确认是否要关联这些医嘱。', '提示', {
  439. type: 'warning'
  440. }).then(() => {
  441. associateOrdersApi(associateOrders.value).then(async (res) => {
  442. clearAssociate()
  443. await setOrderDataAndTwinkle(res[0].actOrderNo, res)
  444. })
  445. }).catch(() => {
  446. })
  447. }
  448. const crbOpen = () => {
  449. if (youWuXuanZheHuanZhe()) return
  450. setDialogToJs(ReportOfInfectiousDiseases, {
  451. patNo: huanZheXinXi.value.inpatientNo,
  452. times: huanZheXinXi.value.admissTimes,
  453. }).catch(() => {
  454. })
  455. }
  456. const outPatientDialog = ref(false)
  457. const outPatientDialogOpen = () => {
  458. if (stringIsBlank(huanZheXinXi.value.zkWard)) {
  459. BizException(ExceptionEnum.LOGICAL_ERROR, "请先选择患者。");
  460. }
  461. if (stringIsBlank(huanZheXinXi.value.mzNo)) {
  462. BizException(ExceptionEnum.LOGICAL_ERROR, "没有查询到患者门诊号,请先建档。");
  463. }
  464. outPatientDialog.value = true
  465. }
  466. const oneClickStopDialog = ref(false)
  467. const oneClickStopOpen = () => {
  468. if (youWuXuanZheHuanZhe()) return
  469. oneClickStopDialog.value = true
  470. }
  471. const rcvrcalcost = async () => {
  472. if (youWuXuanZheHuanZhe()) return
  473. let {inpatientNo, admissTimes, ledgerSn, admissDate} = huanZheXinXi.value
  474. await receiveAndRecalculateCost({inpatientNo, admissTimes, ledgerSn, admissDate})
  475. huanZheXinXi.value = await getPatientInfo(inpatientNo)
  476. }
  477. onMounted(async () => {
  478. yzMitt.on('queryYz', (val) => {
  479. return queryYz(val)
  480. })
  481. yzMitt.on('confirmMedicalAdvice', () => {
  482. if (isCydy()) {
  483. confirmTheDoctorSOrderWithMedicineClick()
  484. } else {
  485. currentConfirmOrdersClick()
  486. }
  487. })
  488. })
  489. </script>
  490. <style scoped lang="scss">
  491. .status_color {
  492. width: 10px;
  493. height: 10px;
  494. }
  495. </style>