YiZhuLuRu.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451
  1. <template>
  2. <div style="margin: 0;height: 100%">
  3. <div ref="editSizeRef">
  4. <yz-query-condition :patient-info="huanZheXinXi"
  5. @batchDeleteOrdersClick="batchDeleteOrdersClick"
  6. :click-on-the-order-template="clickOnTheOrderTemplate"
  7. :confirm-orders-click="confirmOrdersClick"/>
  8. <yz-editor :patient-info="huanZheXinXi"
  9. ref="yzEditorRef"
  10. :open-group-order-template="openGroupOrderTemplate"
  11. @successfullyEntered="successfullyEntered"/>
  12. </div>
  13. <yz-table-v2 ref="tableRef"
  14. :height="editSizeRef?.clientHeight"
  15. @void-orders="voidOrdersClick"
  16. @clickAssociate="clickAssociate"
  17. @rowClick="rowClick"/>
  18. <doctor-s-order-fee :data="chargeDetails.data"
  19. v-if="chargeDetails.dialog"
  20. :sum="chargeDetails.sum"
  21. @close="chargeDetails.dialog = false"/>
  22. <!-- 获取模板的数据 -->
  23. <huo-qu-mu-ban
  24. ref="mubanRef"
  25. :editor="false"
  26. @muBanShuJu="muBanShuJu"/>
  27. <yao-ping-xiang-qing v-if="drugManual.dialog"
  28. :code="drugManual.code"
  29. @close="drugManual.dialog = false"/>
  30. <!-- 这个是过敏源的 -->
  31. <AllergenEntry v-if="allergen.dialog"
  32. :pat-no="huanZheXinXi.inpatientNo"
  33. @close="allergen.dialog = false"/>
  34. <order-progress ref="orderProgressRef"/>
  35. <!-- 合理用药窗口 -->
  36. <rational-drug-use-window ref="reasonableRef" @submit="confirmOrder"/>
  37. <fee-table/>
  38. </div>
  39. </template>
  40. <script name="YiZhuLuRuZhuJian" setup>
  41. import {
  42. associateOrdersApi, deleteMultipleOrders, getFrequency, getSupplyType, huoQuYiZhuShuJu,
  43. insertTemplateOrder,
  44. stopOrder, voidOrders,
  45. } from '@/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru'
  46. import {
  47. huanZheXinXi,
  48. getYzIndex,
  49. zkList,
  50. queryParam,
  51. clickOnThePatient,
  52. drugManual,
  53. associateOrders,
  54. clearAssociate, youWuXuanZheHuanZhe, yzData, errorMsg, yzMitt, jsQueryYzData, geiYaoFangShiData, yaoPinPingLvData
  55. } from '../public-js/zhu-yuan-yi-sheng'
  56. import store from '@/store'
  57. import {listIsBlank, stringIsBlank, stringNotBlank} from '@/utils/blank-utils'
  58. import {getTheTransferList} from '@/api/public-api'
  59. import router from '@/router'
  60. import sleep from "@/utils/sleep";
  61. import {BizException, ExceptionEnum} from "@/utils/BizException";
  62. import {ElMessageBox} from "element-plus";
  63. import YzQueryCondition from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/yz-header/YzQueryCondition";
  64. import YzEditor from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/yz-edit/YzEditor.vue";
  65. import HuoQuMuBan from '@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/HuoQuMuBan.vue'
  66. import {getFormatDatetime} from "@/utils/date";
  67. import XcDialog from "@/components/xiao-chan/dialog/XcDialog";
  68. import {xcMessage} from "@/utils/xiaochan-element-plus";
  69. import YaoPingXiangQing from "@/components/zhu-yuan-yi-sheng/he-li-yong-yao/YaoPingXiangQing.vue";
  70. import AllergenEntry from "@/components/zhu-yuan-yi-sheng/AllergenEntry.vue";
  71. import OrderProgress from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/OrderProgress.vue";
  72. import RationalDrugUseWindow from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/RationalDrugUseWindow.vue";
  73. import ReportOfInfectiousDiseases
  74. from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/report-of-infectious-diseases/ReportOfInfectiousDiseases.vue";
  75. import YzTableV2 from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/table/YzTableV2.vue";
  76. import {clone} from "@/utils/clone";
  77. import BloodSugar from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/BloodSugar.vue";
  78. import FeeTable from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/FeeTable.vue";
  79. import {isDev} from "@/utils/public";
  80. import {applicationForRevocation} from "@/api/zhu-yuan-yi-sheng/qrder-quash";
  81. import YzTableV3 from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/table/YzTableV3.vue";
  82. import Test from "@/views/settings/Test.vue";
  83. import OrderTool from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/order/OrderTool.vue";
  84. const windowSize = computed(() => {
  85. return store.state.app.windowSize
  86. })
  87. const user = computed(() => {
  88. return store.state.user.info
  89. })
  90. let allergen = $ref({
  91. dialog: false,
  92. open: () => {
  93. if (youWuXuanZheHuanZhe()) return
  94. allergen.dialog = true
  95. }
  96. })
  97. // 医嘱进度
  98. const orderProgressRef = ref(null)
  99. // 医嘱编辑
  100. const yzEditorRef = ref(null)
  101. const successfullyEntered = async (data) => {
  102. queryParam.value.displayRange = 0
  103. queryParam.value.zhuangTai = 0
  104. yzData.value = await huoQuYiZhuShuJu({
  105. patNo: huanZheXinXi.value.inpatientNo,
  106. times: huanZheXinXi.value.admissTimes
  107. })
  108. yzMitt.emit('clearSelected')
  109. if (data != null) {
  110. tableRef.value.scrollTo(data.actOrderNo.toString())
  111. }
  112. addYiZhuClick()
  113. }
  114. /**
  115. * 下面这里是添加医嘱了
  116. */
  117. const addYiZhuClick = () => {
  118. yzEditorRef.value.addOrderNo()
  119. }
  120. const reasonableRef = ref(null)
  121. /**
  122. * 确认医嘱 , 已经做过无患者的判断了
  123. */
  124. const confirmOrdersClick = async () => {
  125. // 如果没有问题就可以直接确认医嘱了。
  126. let temp = await reasonableRef.value.check(huanZheXinXi.value.inpatientNo, huanZheXinXi.value.admissTimes)
  127. if (temp) {
  128. await confirmOrder()
  129. }
  130. }
  131. // 真正的向后台确认医嘱
  132. const confirmOrder = async () => {
  133. // 确认医嘱
  134. await yzEditorRef.value.confirmOrdersClick()
  135. // 查询医嘱
  136. await yzMitt.emit('queryYz');
  137. }
  138. // 表格
  139. const tableRef = ref(null)
  140. const rowClick = (val) => {
  141. orderProgressRef.value.fillOrder(val)
  142. if (associateOrders.value.actOrderNo) {
  143. let index = associateOrders.value.associatedGroup.indexOf(val.actOrderNo)
  144. if (associateOrders.value.actOrderNo === val.actOrderNo) {
  145. BizException(ExceptionEnum.MESSAGE_ERROR, '无法关联自己');
  146. }
  147. if (val.orderCode !== '06054' && val.serial === '00') {
  148. BizException(ExceptionEnum.MESSAGE_ERROR, '无法关联项目');
  149. }
  150. if (val.statusFlag !== '1') {
  151. BizException(ExceptionEnum.MESSAGE_ERROR, '无法关联不是录入状态的医嘱。');
  152. }
  153. if (index > -1) {
  154. val.associationFlag = false;
  155. associateOrders.value.associatedGroup.splice(index, 1);
  156. } else {
  157. val.associationFlag = true;
  158. associateOrders.value.associatedGroup.push(val.actOrderNo);
  159. }
  160. } else {
  161. yzEditorRef.value.fillData(val)
  162. }
  163. }
  164. const orderQuash = (val) => {
  165. if (val.statusFlag == '2') {
  166. BizException(ExceptionEnum.LOGICAL_ERROR, "确认医嘱无需撤销删除即可。");
  167. }
  168. if (val.statusFlag == '1') {
  169. BizException(ExceptionEnum.LOGICAL_ERROR, "录入医嘱无需撤销删除即可。");
  170. }
  171. ElMessageBox.prompt(`申请撤销<span style="color: red">【${val.orderName}】</span>医嘱,医务部通过审核后医嘱自动撤销。`, '提示', {
  172. type: 'warning',
  173. confirmButtonText: '确定',
  174. cancelButtonText: '取消',
  175. inputValidator: (val) => {
  176. val = val.trim()
  177. if (val === null || val.length < 1 || val.length > 50) {
  178. return false;
  179. }
  180. },
  181. dangerouslyUseHTMLString: true,
  182. inputErrorMessage: '作废原因,不能为空,最多可输入20个字。',
  183. closeOnPressEscape: false,
  184. closeOnClickModal: false
  185. }).then(({value}) => {
  186. applicationForRevocation({
  187. actOrderNo: val.actOrderNo,
  188. reqRemark: value,
  189. patNo: val.inpatientNo,
  190. times: val.admissTimes
  191. }).then(res => {
  192. if (res === 1) {
  193. yzMitt.emit('queryYz')
  194. }
  195. })
  196. })
  197. }
  198. /**
  199. * 作废医嘱
  200. */
  201. const voidOrdersClick = (val) => {
  202. orderQuash(val)
  203. return
  204. ElMessageBox.prompt(`请问是否要撤销<br><span style="color: red">【${val.orderName}】</span>医嘱<br>
  205. 撤销父医嘱会自动撤销子医嘱。`, '提示', {
  206. type: 'warning',
  207. confirmButtonText: '确定',
  208. cancelButtonText: '取消',
  209. inputValidator: (val) => {
  210. val = val.trim()
  211. if (val === null || val.length < 1 || val.length > 50) {
  212. return false;
  213. }
  214. },
  215. dangerouslyUseHTMLString: true,
  216. inputErrorMessage: '作废原因,不能为空,最多可输入50个字符。',
  217. closeOnPressEscape: false,
  218. closeOnClickModal: false
  219. }).then(({value}) => {
  220. voidOrders(val.id, value).then(res => {
  221. yzMitt.emit('queryYz')
  222. })
  223. }).catch(() => {
  224. });
  225. }
  226. /**
  227. * 右键点击查看医嘱产生的费用
  228. * @param val
  229. */
  230. let doctorSOrderFee = $ref({
  231. data: {},
  232. problem: {},
  233. totalCost: {}
  234. })
  235. let chargeDetails = $ref({
  236. dialog: false,
  237. data: [],
  238. sum: {}
  239. })
  240. const clickToViewTheDoctorSOrderFee = (val) => {
  241. chargeDetails.data = doctorSOrderFee.data[val.actOrderNoStr]
  242. if (chargeDetails.data) {
  243. chargeDetails.sum = doctorSOrderFee.totalCost[val.actOrderNoStr]
  244. chargeDetails.dialog = true
  245. } else {
  246. BizException(ExceptionEnum.MESSAGE_ERROR, '该医嘱还没有产生费用')
  247. }
  248. }
  249. // 获取模板
  250. const mubanRef = ref(null)
  251. const clickOnTheOrderTemplate = () => {
  252. if (stringIsBlank(huanZheXinXi.value.inpatientNo)) {
  253. BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择患者')
  254. }
  255. mubanRef.value.openOrCloseDialog(true)
  256. }
  257. /**
  258. * 把模板的数据插入到患者的医嘱表
  259. * @param val
  260. */
  261. const muBanShuJu = (val) => {
  262. let tempGroupNo = ['71', '73']
  263. if (queryParam.value.frequCode === 'takeMedicine') {
  264. val = val.filter((item) => {
  265. item.selfBuy = '4'
  266. if (stringIsBlank(item.instruction)) {
  267. item.instruction = item.frequCodeName;
  268. }
  269. item.supplyCode = '007'
  270. item.frequCode = 'ONCE'
  271. return item.serial !== '00'
  272. })
  273. if (val.length === 0) {
  274. BizException(ExceptionEnum.LOGICAL_ERROR, '项目无法出院带药。')
  275. }
  276. }
  277. val.forEach(item => {
  278. if (item.serial === '00') {
  279. item.groupNo = '00'
  280. } else {
  281. if (!tempGroupNo.includes(item.groupNo)) {
  282. item.groupNo = queryParam.value.groupNo;
  283. }
  284. }
  285. })
  286. let param = {
  287. inpatientNo: huanZheXinXi.value.inpatientNo,
  288. admissTimes: huanZheXinXi.value.admissTimes,
  289. groupNo: queryParam.value.groupNo,
  290. list: val
  291. }
  292. insertTemplateOrder(param).then(async (list) => {
  293. mubanRef.value.openOrCloseDialog(false)
  294. await successfullyEntered()
  295. let data = {}
  296. list.forEach(item => {
  297. data[item] = true
  298. })
  299. tableRef.value.callTemplate(data)
  300. })
  301. }
  302. /**
  303. * 打开模板的对话框
  304. * @param code
  305. * @returns {Promise<void>}
  306. */
  307. const openGroupOrderTemplate = async (code) => {
  308. mubanRef.value.openOrCloseDialog(true)
  309. await nextTick()
  310. mubanRef.value.openTemplateByCode(code)
  311. }
  312. // 点击关联
  313. const clickAssociate = async (data) => {
  314. if (stringNotBlank(data.parentNo)) {
  315. xcMessage.error('该医嘱已经有父医嘱了。');
  316. } else if (data.statusFlag !== '1') {
  317. xcMessage.error('不是录入状态的医嘱无法关联。');
  318. } else if (data.serial === '00') {
  319. xcMessage.error('项目无法关联。');
  320. } else {
  321. if (associateOrders.value.actOrderNo === null) {
  322. await yzMitt.emit('queryYz')
  323. associateOrders.value.actOrderNo = data.actOrderNo
  324. } else {
  325. xcMessage.error('请先确认当前关联医嘱。')
  326. }
  327. }
  328. }
  329. /**
  330. * 点击批量删除数据
  331. */
  332. const batchDeleteOrdersClick = () => {
  333. let tempData = yzMitt.emit('getSelectedData')
  334. if (tempData.length === 0) {
  335. BizException(ExceptionEnum.LOGICAL_ERROR, "请先选择要删除的数据");
  336. }
  337. ElMessageBox.confirm('是否要批量删除这些医嘱?', '提示', {
  338. type: 'warning'
  339. }).then(() => {
  340. let param = {
  341. inpatientNo: huanZheXinXi.value.inpatientNo,
  342. admissTimes: huanZheXinXi.value.admissTimes,
  343. list: tempData
  344. }
  345. deleteMultipleOrders(param).then((res) => {
  346. if (res !== null && res.error) {
  347. let errData = []
  348. for (const key in res.data) {
  349. let index = getYzIndex(key)
  350. let tempYzData = yzData.value[index]
  351. yzData.value[index].error = true
  352. errData.push({
  353. actOrderNo: key,
  354. orderName: tempYzData.orderName,
  355. errorMessage: res.data[key]
  356. })
  357. }
  358. errorMsg.value.dialog = true
  359. errorMsg.value.type = 2
  360. errorMsg.value.data = errData
  361. } else {
  362. yzMitt.emit('queryYz', false)
  363. }
  364. })
  365. }).catch(() => {
  366. })
  367. }
  368. const editSizeRef = ref(null)
  369. onMounted(async () => {
  370. yzMitt.on("allergen", allergen.open)
  371. yzMitt.on('clickOnTheOrderTemplate', clickOnTheOrderTemplate)
  372. getSupplyType().then(res => {
  373. geiYaoFangShiData.value = res
  374. })
  375. getFrequency().then(res => {
  376. yaoPinPingLvData.value = res
  377. })
  378. await sleep(200)
  379. zkList.value = await getTheTransferList()
  380. })
  381. onActivated(async () => {
  382. if (router.currentRoute.value.params.inpatientNo) {
  383. await nextTick()
  384. await clickOnThePatient(router.currentRoute.value.params.inpatientNo);
  385. await yzMitt.emit('queryYz')
  386. }
  387. jsQueryYzData()
  388. })
  389. </script>
  390. <style scoped lang="scss">
  391. :deep(.el-table .children-row) {
  392. background: rgba(145, 247, 145, 0.93);
  393. }
  394. :deep(.el-table) {
  395. --el-table-row-hover-background-color: #85dbfd7a;
  396. }
  397. :deep(.el-dropdown-menu__item) {
  398. font-size: 14px !important;
  399. height: 26px;
  400. line-height: 26px;
  401. font-weight: bold;
  402. }
  403. </style>