YiZhuLuRu.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. <template>
  2. <div class="layout_container">
  3. <header>
  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. </header>
  12. <div class="layout_main">
  13. <div style="height: 100%;width: calc(100% - 10px)">
  14. <YzTableV3
  15. @void-orders="voidOrdersClick"
  16. @rowClick="rowClick"/>
  17. </div>
  18. </div>
  19. </div>
  20. <!-- 获取模板的数据 -->
  21. <huo-qu-mu-ban
  22. ref="mubanRef"
  23. :editor="false"
  24. @muBanShuJu="muBanShuJu"/>
  25. <!-- 这个是过敏源的 -->
  26. <AllergenEntry v-if="allergen.dialog"
  27. :pat-no="huanZheXinXi.inpatientNo"
  28. @close="allergen.dialog = false"/>
  29. <!-- 合理用药窗口 -->
  30. <rational-drug-use-window ref="reasonableRef" @submit="confirmOrder"/>
  31. <fee-table/>
  32. </template>
  33. <script setup lang="ts">
  34. import {deleteMultipleOrders, insertTemplateOrder,} from '@/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru'
  35. import {
  36. associateOrders,
  37. clickOnThePatient,
  38. confirmLoading,
  39. errorMsgFunc,
  40. huanZheXinXi,
  41. queryParam,
  42. setYzOrderGroup,
  43. youWuXuanZheHuanZhe,
  44. yzData,
  45. yzMitt,
  46. YzType,
  47. zkList
  48. } from '../public-js/zhu-yuan-yi-sheng'
  49. import {stringIsBlank} from '@/utils/blank-utils'
  50. import {getTheTransferList} from '@/api/public-api'
  51. import router from '@/router'
  52. import sleep from "@/utils/sleep";
  53. import {BizException, ExceptionEnum} from "@/utils/BizException";
  54. import {ElMessageBox} from "element-plus";
  55. import YzQueryCondition from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/yz-header/YzQueryCondition";
  56. import YzEditor from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/yz-edit/YzEditor.vue";
  57. import HuoQuMuBan from '@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/HuoQuMuBan.vue'
  58. import AllergenEntry from "@/components/zhu-yuan-yi-sheng/AllergenEntry.vue";
  59. import RationalDrugUseWindow from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/RationalDrugUseWindow.vue";
  60. import FeeTable from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/FeeTable.vue";
  61. import {applicationForRevocation} from "@/api/zhu-yuan-yi-sheng/qrder-quash";
  62. import XEUtils from 'xe-utils'
  63. import {nextTick, onActivated, onMounted, ref} from 'vue'
  64. import {CyMessageBox} from "@/components/cy/message-box";
  65. import YzTableV3 from "@/views/hospitalization/zhu-yuan-yi-sheng/yi-zhu-lu-ru/components/table/YzTableV3.vue";
  66. import doctorStore, {YzSidebarEnum} from "@/views/hospitalization/zhu-yuan-yi-sheng/public-js/useDoctorStore";
  67. import {isDev} from "@/utils/public";
  68. const allergen = ref({
  69. dialog: false,
  70. open: () => {
  71. if (youWuXuanZheHuanZhe()) return
  72. allergen.value.dialog = true
  73. }
  74. })
  75. // 医嘱编辑
  76. const yzEditorRef = ref(null)
  77. const reasonableRef = ref(null)
  78. /**
  79. * 确认医嘱 , 已经做过无患者的判断了
  80. */
  81. const confirmOrdersClick = async () => {
  82. if (isDev) {
  83. await confirmOrder()
  84. return
  85. }
  86. // 如果没有问题就可以直接确认医嘱了。
  87. let temp = await reasonableRef.value.check(huanZheXinXi.value.inpatientNo, huanZheXinXi.value.admissTimes);
  88. if (temp) {
  89. await confirmOrder()
  90. }
  91. }
  92. // 真正的向后台确认医嘱
  93. const confirmOrder = async () => {
  94. confirmLoading.value = true
  95. // 确认医嘱
  96. await yzEditorRef.value.confirmOrdersClick()
  97. // 查询医嘱
  98. await yzMitt.emit('queryYz');
  99. confirmLoading.value = false
  100. }
  101. const rowClick = (val: YzType) => {
  102. if (associateOrders.value.actOrderNo) {
  103. let index = associateOrders.value.associatedGroup.indexOf(val.actOrderNo)
  104. if (associateOrders.value.actOrderNo === val.actOrderNo) {
  105. BizException(ExceptionEnum.MESSAGE_ERROR, '无法关联自己');
  106. }
  107. if (val.orderCode !== '06054' && val.serial === '00') {
  108. BizException(ExceptionEnum.MESSAGE_ERROR, '无法关联项目');
  109. }
  110. if (val.statusFlag !== '1') {
  111. BizException(ExceptionEnum.MESSAGE_ERROR, '无法关联不是录入状态的医嘱。');
  112. }
  113. if (index > -1) {
  114. val.associationFlag = false;
  115. associateOrders.value.associatedGroup.splice(index, 1);
  116. } else {
  117. val.associationFlag = true;
  118. associateOrders.value.associatedGroup.push(val.actOrderNo);
  119. }
  120. } else {
  121. yzEditorRef.value.fillData(val)
  122. }
  123. }
  124. const orderQuash = async (val) => {
  125. if (val.statusFlag === '2') {
  126. BizException(ExceptionEnum.LOGICAL_ERROR, "确认医嘱无需撤销删除即可。");
  127. }
  128. if (val.statusFlag === '1') {
  129. BizException(ExceptionEnum.LOGICAL_ERROR, "录入医嘱无需撤销删除即可。");
  130. }
  131. CyMessageBox.prompt({
  132. message: `申请撤销<span style="color: red">【${val.orderName}】</span>医嘱<br />
  133. 可在数据修改 》 医嘱撤销审核页面中查看到自己的申请信息。<br />
  134. <span style="color:red">作废医嘱不会退费,需要在项目录入中退费,如果是药品先撤销后退费的话,会导致项目录入中无法退费,作废前可以先进行停止操作看费用会不会退掉,如果停止医嘱没有产生退费可以让护士在项目录入中退费,退费前请记得做费用接收重算,避免重复退费。</span><br />
  135. <span style="color: #0900ff">医嘱未超过24小时,未产生任何费用,会直接撤销无需审核,其他需要医务部审核通过后才能撤销。</span>
  136. `,
  137. type: 'warning',
  138. dangerouslyUseHTMLString: true,
  139. inputDefaultValue: '医嘱开错',
  140. selectOption: [
  141. {code: '医嘱开错', name: '医嘱开错'},
  142. {code: '未充分告知患者', name: '未充分告知患者'},
  143. {code: '临时出院', name: '临时出院'},
  144. {code: '患者拒绝用药', name: '患者拒绝用药'},
  145. {code: '药房缺药', name: '药房缺药'},
  146. {code: '药物不耐受或过敏', name: '药物不耐受或过敏'},
  147. {code: '药品更换厂家或规格', name: '药品更换厂家或规格'},
  148. {code: '转科或者转院', name: '转科或者转院'},
  149. {code: '病情变化', name: '病情变化'},
  150. {code: '患者欠费未生成药单', name: '患者欠费未生成药单'},
  151. ],
  152. inputMaxLength: 50,
  153. }).then(async ({value}) => {
  154. let res = await applicationForRevocation({
  155. actOrderNo: val.actOrderNo,
  156. reqRemark: value,
  157. patNo: val.inpatientNo,
  158. times: val.admissTimes
  159. });
  160. // res === 1的意思是这个医嘱被删除了
  161. if (res === 1) {
  162. XEUtils.remove(yzData.value, (item) => {
  163. return item.actOrderNo === val.actOrderNo;
  164. })
  165. setYzOrderGroup();
  166. }
  167. }).catch(() => {
  168. })
  169. }
  170. /**
  171. * 作废医嘱
  172. */
  173. const voidOrdersClick = (val) => {
  174. orderQuash(val)
  175. }
  176. // 获取模板
  177. const mubanRef = ref(null)
  178. const clickOnTheOrderTemplate = () => {
  179. if (stringIsBlank(huanZheXinXi.value.inpatientNo)) {
  180. BizException(ExceptionEnum.MESSAGE_ERROR, '请先选择患者')
  181. }
  182. mubanRef.value.openOrCloseDialog(true)
  183. }
  184. /**
  185. * 把模板的数据插入到患者的医嘱表
  186. * @param val
  187. */
  188. const muBanShuJu = (val) => {
  189. let tempGroupNo = ['71', '73']
  190. if (queryParam.value.frequCode === 'takeMedicine') {
  191. val = val.filter((item) => {
  192. item.selfBuy = '4'
  193. if (stringIsBlank(item.instruction)) {
  194. item.instruction = item.frequCodeName;
  195. }
  196. item.supplyCode = '007'
  197. item.frequCode = 'ONCE'
  198. return item.serial !== '00'
  199. })
  200. if (val.length === 0) {
  201. BizException(ExceptionEnum.LOGICAL_ERROR, '项目无法出院带药。')
  202. }
  203. }
  204. val.forEach(item => {
  205. if (item.serial === '00') {
  206. item.groupNo = '00'
  207. } else {
  208. if (!tempGroupNo.includes(item.groupNo)) {
  209. item.groupNo = queryParam.value.groupNo;
  210. }
  211. }
  212. })
  213. let param = {
  214. inpatientNo: huanZheXinXi.value.inpatientNo,
  215. admissTimes: huanZheXinXi.value.admissTimes,
  216. groupNo: queryParam.value.groupNo,
  217. list: val
  218. }
  219. insertTemplateOrder(param).then(async (list) => {
  220. mubanRef.value.openOrCloseDialog(false)
  221. yzData.value.push(...list.data)
  222. let temp = {}
  223. XEUtils.arrayEach(list.list, (item) => {
  224. temp[item] = true
  225. })
  226. yzMitt.emit('scrollEndAndTwinkle', temp)
  227. })
  228. }
  229. /**
  230. * 打开模板的对话框
  231. * @param code
  232. * @returns {Promise<void>}
  233. */
  234. const openGroupOrderTemplate = async (code) => {
  235. mubanRef.value.openOrCloseDialog(true)
  236. await nextTick()
  237. mubanRef.value.openTemplateByCode(code)
  238. }
  239. /**
  240. * 点击批量删除数据
  241. */
  242. const batchDeleteOrdersClick = () => {
  243. let tempData = yzMitt.emit('getSelectedData')
  244. if (tempData!.length === 0) {
  245. BizException(ExceptionEnum.LOGICAL_ERROR, "请先选择要删除的数据");
  246. }
  247. ElMessageBox.confirm('是否要批量删除这些医嘱?', '提示', {
  248. type: 'warning'
  249. }).then(() => {
  250. let param = {
  251. inpatientNo: huanZheXinXi.value.inpatientNo,
  252. admissTimes: huanZheXinXi.value.admissTimes,
  253. list: tempData
  254. }
  255. deleteMultipleOrders(param).then((res) => {
  256. if (res !== null && res.error) {
  257. let errData = {}
  258. for (const key in res.data) {
  259. errData[key] = {
  260. warning: [res.data[key]],
  261. isDel: true
  262. }
  263. }
  264. errorMsgFunc.add(errData)
  265. } else {
  266. yzMitt.emit('queryYz', false)
  267. }
  268. })
  269. }).catch(() => {
  270. })
  271. }
  272. onMounted(async () => {
  273. yzMitt.on("allergen", allergen.value.open)
  274. yzMitt.on('clickOnTheOrderTemplate', clickOnTheOrderTemplate)
  275. yzMitt.on('rowClick', rowClick)
  276. await sleep(200)
  277. zkList.value = await getTheTransferList()
  278. })
  279. onActivated(async () => {
  280. if (router.currentRoute.value.params.inpatientNo) {
  281. await nextTick()
  282. await clickOnThePatient(<string>router.currentRoute.value.params.inpatientNo);
  283. await yzMitt.emit('queryYz')
  284. }
  285. doctorStore.setYzSidebar(YzSidebarEnum.PATIENT_LIST);
  286. })
  287. </script>
  288. <style scoped lang="scss">
  289. :deep(.el-table .children-row) {
  290. background: rgba(145, 247, 145, 0.93);
  291. }
  292. :deep(.el-table) {
  293. --el-table-row-hover-background-color: #85dbfd7a;
  294. }
  295. :deep(.el-dropdown-menu__item) {
  296. font-size: 14px !important;
  297. height: 26px;
  298. line-height: 26px;
  299. font-weight: bold;
  300. }
  301. </style>