YiZhuLuRu.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. <template>
  2. <div style="width: 100%;">
  3. <el-date-picker
  4. v-model="dateRange"
  5. :shortcuts="shortcuts"
  6. end-placeholder="结束日期"
  7. placeholder="选择日期"
  8. range-separator="至"
  9. size="small"
  10. start-placeholder="开始日期"
  11. style="width: 220px"
  12. type="daterange"/>
  13. 医嘱名称:
  14. <el-select v-model="orderName" :remote-method="remoteMethodChargeCode" clearable filterable remote
  15. style="width: 120px">
  16. <el-option v-for="item in yiZhuMingZiData" :key="item.code" :label="item.name" :value="item.code">
  17. <span>{{ item.name }}</span>
  18. </el-option>
  19. </el-select>
  20. 医嘱号:
  21. <el-input v-model="actOrderNo"
  22. style="width: 120px"
  23. onkeyup="this.value=this.value.replace(/[^\d]/g,'') "/>
  24. 频率:
  25. <el-select v-model="pinLv" :disabled="zhuangTai === 8 || zhuangTai === 9" clearable filterable size="small"
  26. style="width: 120px">
  27. <el-option v-for="item in huanZhePinLvData" :key="item.code" :label="item.name" :value="item.code">
  28. <span>{{ item.name }}</span>
  29. </el-option>
  30. </el-select>
  31. 状态:
  32. <el-select v-model="zhuangTai" filterable size="small" style="width: 120px" @change="zhuangTaiXuanZhe">
  33. <el-option v-for="item in zhuangTaiList" :key="item.code" :label="item.name" :value="item.code">
  34. <span>{{ item.code }}</span>
  35. <el-divider direction="vertical"/>
  36. <span>{{ item.name }}</span>
  37. </el-option>
  38. </el-select>
  39. <el-divider direction="vertical"/>
  40. <el-button icon="Search" type="primary" @click="chaXunYiZhuClick(0)">查询</el-button>
  41. <el-divider style="margin: 2px 0"></el-divider>
  42. <el-tag effect="dark" type="info">录入</el-tag>
  43. <el-tag effect="dark" type="success">确认</el-tag>
  44. <el-tag effect="dark">执行</el-tag>
  45. <el-tag effect="dark" type="danger">停止</el-tag>
  46. <el-divider direction="vertical"></el-divider>
  47. <el-button icon="Plus" type="primary" @click="addYiZhuClick"> 添加</el-button>
  48. <el-button type="warning" :disabled="xuanZhongDeShuJu.length === 0" @click="clickBatchStop">批量停止</el-button>
  49. <el-divider direction="vertical"></el-divider>
  50. <el-button :disabled="xuanZhongDeShuJu.length === 0" type="success" @click="dianJiFuZhuXuanZhongYiZhu">复制选中医嘱
  51. </el-button>
  52. <el-button type="warning" :disabled="stringIsBlank(huanZheXinXi.inpatientNo)"
  53. @click="clickToModifyTheDoctorSOrderTime"> 修改医嘱时间
  54. </el-button>
  55. <el-button type="warning" :disabled="stringIsBlank(huanZheXinXi.inpatientNo)" @click="jumpToMedicalRecord"> 病案首页
  56. </el-button>
  57. <el-button type="primary" @click="openElectronicMedicalRecord"> 电子病历</el-button>
  58. <xc-table :data="yiZhuPage"
  59. row-key="id"
  60. @currentChange="handleCurrentChange"
  61. @sizeChange="handleSizeChange"
  62. :height="230"
  63. @rowContextmenu="clickToViewTheDoctorSOrderFee"
  64. @selectionChange="huoQuXuanZhongDeShuJu"
  65. ref="tableRef">
  66. <el-table-column fixed="left" type="selection"></el-table-column>
  67. <el-table-column fixed="left" label="医嘱号" prop="actOrderNo"
  68. width="120" show-overflow-tooltip>
  69. <template #default="scope">
  70. <el-tag :type="getYiZhuFlag(scope.row.statusFlag)" effect="dark">
  71. {{ scope.row.actOrderNo }}
  72. </el-tag>
  73. <span v-html="getFeeInfor(scope.row.actOrderNo)">
  74. </span>
  75. </template>
  76. </el-table-column>
  77. <el-table-column fixed="left" width="20">
  78. <template #default="scope">
  79. {{ scope.row.orderGroup }}
  80. </template>
  81. </el-table-column>
  82. <el-table-column fixed="left" label="医嘱名称" show-overflow-tooltip width="135">
  83. <template #default="scope">
  84. {{ scope.row.orderName }}
  85. </template>
  86. </el-table-column>
  87. <el-table-column label="剂量" prop="doseUnitName">
  88. <template #default="scope">
  89. <span>{{ scope.row.dose }} {{ scope.row.doseUnitName }}</span>
  90. </template>
  91. </el-table-column>
  92. <el-table-column label="频率" prop="frequCodeName"></el-table-column>
  93. <el-table-column label="给药方式" prop="supplyCodeName" show-overflow-tooltip></el-table-column>
  94. <el-table-column label="医嘱时间" prop="orderTime" show-overflow-tooltip></el-table-column>
  95. <el-table-column label="开始时间" prop="startTime" show-overflow-tooltip></el-table-column>
  96. <el-table-column label="录入人" prop="physicianName"></el-table-column>
  97. <el-table-column label="确认时间" prop="confirmTime" show-overflow-tooltip></el-table-column>
  98. <el-table-column label="确认人" prop="signerName"></el-table-column>
  99. <el-table-column label="结束时间" prop="endTime" show-overflow-tooltip></el-table-column>
  100. <el-table-column label="停止人" prop="modifierName" show-overflow-tooltip></el-table-column>
  101. <el-table-column label="紧急" prop="emergencyFlag">
  102. <template #default="scope">
  103. <span v-if="scope.row.emergencyFlag === '1'">是</span>
  104. </template>
  105. </el-table-column>
  106. <el-table-column label="医保自费" prop="ybSelfFlag">
  107. <template #default="scope">
  108. <span v-if="scope.row.ybSelfFlag === '1'">是</span>
  109. </template>
  110. </el-table-column>
  111. <el-table-column label="医生" prop="physicianName"></el-table-column>
  112. <el-table-column label="费用标志" prop="selfBuyName"></el-table-column>
  113. <el-table-column label="执行科室" prop="execUnitName"></el-table-column>
  114. <el-table-column label="领量" prop="drugQuanName">
  115. <template #default="scope">
  116. <span>{{ scope.row.drugQuan }} {{ scope.row.drugQuanName }}</span>
  117. </template>
  118. </el-table-column>
  119. <el-table-column label="类别" prop="drugFlagName">
  120. <template #default="scope">
  121. <span>{{ scope.row.drugFlag }} {{ scope.row.drugFlagName }}</span>
  122. </template>
  123. </el-table-column>
  124. <el-table-column label="药房" prop="groupNoName"></el-table-column>
  125. <el-table-column label="序号" prop="serialName"></el-table-column>
  126. <el-table-column fixed="right" width="220">
  127. <template #header>
  128. <el-button size="small" @click="clearSelection" type="warning">清空选择</el-button>
  129. </template>
  130. <template #default="scope">
  131. <el-button text :disabled="scope.row.statusFlag === '5'"
  132. @click.stop="dianJiYiZhuChaoZuo(scope.row, 1,'无')">
  133. <span v-if="scope.row.emergencyFlag === '1'">取消</span>
  134. <span v-else>紧急</span>
  135. </el-button>
  136. <el-button text @click.stop="dianJiYiZhuChaoZuo(scope.row, 2, '撤销医嘱')" type="warning"> 撤销</el-button>
  137. <el-button text @click.stop="dianJiYiZhuChaoZuo(scope.row, 3, '停止医嘱')" type="danger"> 停止</el-button>
  138. </template>
  139. </el-table-column>
  140. </xc-table>
  141. <el-dialog v-model="yiZhuChaoZuoDialog" :close-on-click-modal="false" :close-on-press-escape="false"
  142. :show-close="false" :title="yiZhuChaoZuoBiaoTi" top="25%" width="30%">
  143. <div v-if="chaoZuoBiaoZhi === 2">
  144. 撤销原因:
  145. <el-input v-model="content" maxlength="100" rows="2" show-word-limit type="textarea"></el-input>
  146. </div>
  147. <div v-else-if="chaoZuoBiaoZhi === 3 || chaoZuoBiaoZhi === 90">
  148. 停止时间点:
  149. <el-date-picker v-model="tingZhiRiQi" format="YYYY-MM-DD HH:mm:ss" type="datetime"
  150. value-format="YYYY-MM-DD HH:mm:ss"></el-date-picker>
  151. </div>
  152. <template #footer>
  153. <span class="dialog-footer">
  154. <el-button @click="dianJiDuiHuaKuangZhongDeGuanBi">关闭</el-button>
  155. <el-button type="primary" @click="zhiXingChaoZuo">确认</el-button>
  156. </span>
  157. </template>
  158. </el-dialog>
  159. <doctor-s-order-fee :data="chargeDetails.data"
  160. v-if="chargeDetails.dialog"
  161. :sum="chargeDetails.sum"
  162. @close="chargeDetails.dialog = false"/>
  163. </div>
  164. </template>
  165. <script name="YiZhuLuRuZhuJian" setup>
  166. import {shortcuts} from '@/data/shortcuts'
  167. import {
  168. expensesForGettingADoctorSOrder,
  169. huoQuYiZhuMingCheng,
  170. huoQuYiZhuShuJu,
  171. piLiangXiuGaiTingZhiShiJian,
  172. yiZhuChaoZuo
  173. } from '@/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru'
  174. import {fuZhiYiZhu, huanZhePinLvData, huanZheXinXi, youWuXuanZheHuanZhe, zkList} from '../public-js/zhu-yuan-yi-sheng'
  175. import {getDateRangeFormatDate} from '@/utils/date'
  176. import store from '@/store'
  177. import {stringIsBlank} from '@/utils/blank-utils'
  178. import {getServerDateApi, getTheTransferList} from '@/api/public-api'
  179. import router from '@/router'
  180. import XcTable from "@/components/xiao-chan/xc-table/XcTable.vue";
  181. import sleep from "@/utils/sleep";
  182. import DoctorSOrderFee from "@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/DoctorSOrderFee.vue";
  183. import {BizException, ExceptionEnum} from "@/utils/BizException";
  184. const windowSize = computed(() => {
  185. return store.state.app.windowSize
  186. })
  187. const user = computed(() => {
  188. return store.state.user.info
  189. })
  190. const dateRange = ref([])
  191. // 根据医嘱的名字来进行搜索
  192. let orderName = $ref('')
  193. const yiZhuMingZiData = ref([])
  194. // 获取频率
  195. const pinLv = ref('')
  196. // 表格
  197. let tableRef = $ref(null)
  198. // 状态
  199. const zhuangTai = ref(0)
  200. // 医嘱号
  201. let actOrderNo = $ref('')
  202. // 分页
  203. const yiZhuPage = ref({
  204. currentPage: 1,
  205. pageSize: 30,
  206. total: 0,
  207. data: [],
  208. })
  209. const remoteMethodChargeCode = (val) => {
  210. if (youWuXuanZheHuanZhe()) return
  211. if (val.length > 1) {
  212. huoQuYiZhuMingCheng(huanZheXinXi.value.inpatientNo, huanZheXinXi.value.admissTimes, val).then((res) => {
  213. yiZhuMingZiData.value = res
  214. })
  215. }
  216. }
  217. // 根据医嘱的名字来进行搜索 结束
  218. const zhuangTaiList = ref([
  219. {code: 0, name: '全部'},
  220. {code: 1, name: '录入'},
  221. {code: 2, name: '确认'},
  222. {code: 3, name: '执行'},
  223. {code: 5, name: '停止'},
  224. {code: 6, name: '可停止'},
  225. {code: 7, name: '可撤销'},
  226. {code: 8, name: '临时医嘱'},
  227. {code: 9, name: '长期医嘱'},
  228. ])
  229. const zhuangTaiXuanZhe = (val) => {
  230. if (val >= 6) {
  231. orderName = ''
  232. pinLv.value = ''
  233. }
  234. }
  235. const chaXunYiZhuClick = (total) => {
  236. if (youWuXuanZheHuanZhe()) return
  237. const dateS = getDateRangeFormatDate(dateRange.value)
  238. let data = {
  239. currentPage: yiZhuPage.value.currentPage,
  240. pageSize: yiZhuPage.value.pageSize,
  241. total: total,
  242. patNo: huanZheXinXi.value.inpatientNo,
  243. times: huanZheXinXi.value.admissTimes,
  244. startTime: dateS.startTime,
  245. endTime: dateS.endTime,
  246. frequCode: pinLv.value,
  247. orderName: orderName,
  248. zhuangTai: zhuangTai.value,
  249. actOrderNo: actOrderNo
  250. }
  251. huoQuYiZhuShuJu(data)
  252. .then((res) => {
  253. yiZhuPage.value.total = res.total
  254. yiZhuPage.value.data = res.records
  255. })
  256. .catch((e) => {
  257. yiZhuPage.value.total = 0
  258. yiZhuPage.value.data = []
  259. })
  260. }
  261. const handleSizeChange = (val) => {
  262. yiZhuPage.value.pageSize = val
  263. chaXunYiZhuClick(yiZhuPage.value.total)
  264. }
  265. const handleCurrentChange = (val) => {
  266. yiZhuPage.value.currentPage = val
  267. chaXunYiZhuClick(yiZhuPage.value.total)
  268. }
  269. const clearSelection = () => {
  270. tableRef.clearSelection()
  271. }
  272. /**
  273. * 下面这里是添加医嘱了
  274. */
  275. const addYiZhuClick = () => {
  276. router.push({
  277. name: 'xinZengShuJu',
  278. params: {
  279. passRule: true,
  280. name: '添加医嘱',
  281. },
  282. query: {
  283. path: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
  284. },
  285. })
  286. }
  287. /**
  288. * 打开电子病历
  289. */
  290. const openElectronicMedicalRecord = () => {
  291. if (youWuXuanZheHuanZhe()) return
  292. router.push({
  293. name: 'dianZiBingLi',
  294. query: {
  295. // path: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
  296. patNo: huanZheXinXi.value.inpatientNo,
  297. times: huanZheXinXi.value.admissTimes
  298. },
  299. })
  300. }
  301. const dianJiYiZhuChaoZuo = ({actOrderNo, orderName}, flag, name) => {
  302. chaoZuoBiaoZhi = flag
  303. yiZhuHao.value = actOrderNo
  304. if (flag === 1) {
  305. zhiXingChaoZuo()
  306. } else {
  307. yiZhuChaoZuoDialog = true
  308. if (flag === 2) {
  309. yiZhuChaoZuoBiaoTi = '撤销医嘱'
  310. } else if (flag === 3) {
  311. yiZhuChaoZuoBiaoTi = '停止医嘱'
  312. }
  313. }
  314. }
  315. const zhiXingChaoZuo = () => {
  316. if (chaoZuoBiaoZhi === 90) {
  317. let data = {
  318. actOrderNoList: [],
  319. endTime: tingZhiRiQi.value,
  320. }
  321. xuanZhongDeShuJu.value.forEach(item => {
  322. data.actOrderNoList.push(item.actOrderNo)
  323. })
  324. piLiangXiuGaiTingZhiShiJian(data).then((res) => {
  325. handleCurrentChange(yiZhuPage.value.currentPage)
  326. yiZhuChaoZuoDialog = false
  327. })
  328. } else {
  329. // 这里 是因为停止医嘱和撤销医嘱中 时间和撤销原因用的是同一个
  330. // 方法 所以需要使用到不同的提交内容
  331. let data = ''
  332. if (chaoZuoBiaoZhi === 2) {
  333. data = content
  334. } else if (chaoZuoBiaoZhi === 3) {
  335. data = tingZhiRiQi.value
  336. }
  337. yiZhuChaoZuo(yiZhuHao.value, chaoZuoBiaoZhi, data).then((res) => {
  338. handleCurrentChange(yiZhuPage.value.currentPage)
  339. yiZhuChaoZuoDialog = false
  340. content = ''
  341. })
  342. }
  343. }
  344. let yiZhuChaoZuoDialog = $ref(false)
  345. let content = $ref('')
  346. const tingZhiRiQi = ref('')
  347. /**
  348. * 医嘱操作状态 1-设为紧急 2-撤销 3-停止 90-批量停止
  349. */
  350. let chaoZuoBiaoZhi = $ref(0)
  351. const yiZhuHao = ref(0)
  352. let yiZhuChaoZuoBiaoTi = $ref('')
  353. const xuanZhongDeShuJu = ref([])
  354. const huoQuXuanZhongDeShuJu = (val) => {
  355. xuanZhongDeShuJu.value = val
  356. }
  357. // 用户切换全选和全不选 时 el-table中的全选不会选中子节点
  358. const toggleSelection = (row, selected) => {
  359. if (row) {
  360. row.forEach((item) => {
  361. tableRef.value.toggleRowSelection(item, selected)
  362. })
  363. }
  364. }
  365. /**
  366. * 点击复制医嘱
  367. */
  368. const dianJiFuZhuXuanZhongYiZhu = () => {
  369. fuZhiYiZhu.value = xuanZhongDeShuJu.value
  370. }
  371. /**
  372. * 右键点击查看医嘱产生的费用
  373. * @param val
  374. */
  375. let doctorSOrderFee = $ref({
  376. data: {},
  377. problem: {},
  378. totalCost: {}
  379. })
  380. let chargeDetails = $ref({
  381. dialog: false,
  382. data: [],
  383. sum: {}
  384. })
  385. const clickToViewTheDoctorSOrderFee = (val) => {
  386. chargeDetails.data = doctorSOrderFee.data[val.actOrderNoStr]
  387. if (chargeDetails.data) {
  388. chargeDetails.sum = doctorSOrderFee.totalCost[val.actOrderNoStr]
  389. chargeDetails.dialog = true
  390. } else {
  391. BizException(ExceptionEnum.MESSAGE_ERROR, '该医嘱还没有产生费用')
  392. }
  393. }
  394. const getFeeInfor = (actOrderNo) => {
  395. try {
  396. let problem = doctorSOrderFee.problem[actOrderNo]
  397. if (typeof problem === 'undefined') {
  398. problem = ''
  399. } else {
  400. problem = '有' + problem
  401. }
  402. return `<br>金额:${doctorSOrderFee.totalCost[actOrderNo].sum} 元,
  403. ${doctorSOrderFee.totalCost[actOrderNo].amount}条,
  404. <br/>${problem}`
  405. } catch (e) {
  406. return ""
  407. }
  408. }
  409. onMounted(async () => {
  410. await sleep(200)
  411. // addYiZhuClick()
  412. zkList.value = await getTheTransferList()
  413. })
  414. watch(
  415. () => huanZheXinXi.value,
  416. () => {
  417. expensesForGettingADoctorSOrder(huanZheXinXi.value.inpatientNo, huanZheXinXi.value.admissTimes).then((res) => {
  418. doctorSOrderFee = res
  419. })
  420. getServerDateApi().then((res) => {
  421. chaXunYiZhuClick(0)
  422. })
  423. }
  424. )
  425. function getYiZhuFlag(val) {
  426. if (stringIsBlank(val)) {
  427. return 'warning'
  428. }
  429. switch (val) {
  430. case '1':
  431. return 'info'
  432. case '2':
  433. return 'success'
  434. case '3':
  435. return ''
  436. case '4':
  437. return ''
  438. case '5':
  439. return 'danger'
  440. default:
  441. return 'warning'
  442. }
  443. }
  444. /**
  445. * 点击批量停止
  446. */
  447. const clickBatchStop = () => {
  448. yiZhuChaoZuoDialog = true
  449. chaoZuoBiaoZhi = 90
  450. yiZhuChaoZuoBiaoTi = '批量停止'
  451. }
  452. const dianJiDuiHuaKuangZhongDeGuanBi = () => {
  453. yiZhuChaoZuoDialog = false
  454. content = ''
  455. }
  456. // 点击修改医嘱时间
  457. const clickToModifyTheDoctorSOrderTime = () => {
  458. router.push({
  459. name: 'yzActOrderModify',
  460. query: {
  461. patNo: huanZheXinXi.value.inpatientNo,
  462. },
  463. })
  464. }
  465. const jumpToMedicalRecord = () => {
  466. router.push({
  467. name: 'fillCaseFrontSheet',
  468. query: {
  469. patNo: huanZheXinXi.value.inpatientNo,
  470. deptCode: huanZheXinXi.value.smallDept,
  471. },
  472. })
  473. }
  474. </script>
  475. <style scoped lang="scss">
  476. :deep(.el-table .children-row) {
  477. background: rgba(145, 247, 145, 0.93);
  478. }
  479. :deep(.el-table) {
  480. --el-table-row-hover-background-color: #85dbfd7a;
  481. }
  482. :deep(.el-dropdown-menu__item) {
  483. font-size: 14px !important;
  484. height: 26px;
  485. line-height: 26px;
  486. font-weight: bold;
  487. }
  488. </style>