YiZhuLuRu.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  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/xc/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: 'xinZengShuJu',
  294. params: {
  295. passRule: true,
  296. name: '电子病历',
  297. },
  298. query: {
  299. path: '/inpatient/zhuYuanYiSheng/yiZhuLuRu',
  300. },
  301. })
  302. }
  303. const dianJiYiZhuChaoZuo = ({actOrderNo, orderName}, flag, name) => {
  304. chaoZuoBiaoZhi = flag
  305. yiZhuHao.value = actOrderNo
  306. if (flag === 1) {
  307. zhiXingChaoZuo()
  308. } else {
  309. yiZhuChaoZuoDialog = true
  310. if (flag === 2) {
  311. yiZhuChaoZuoBiaoTi = '撤销医嘱'
  312. } else if (flag === 3) {
  313. yiZhuChaoZuoBiaoTi = '停止医嘱'
  314. }
  315. }
  316. }
  317. const zhiXingChaoZuo = () => {
  318. if (chaoZuoBiaoZhi === 90) {
  319. let data = {
  320. actOrderNoList: [],
  321. endTime: tingZhiRiQi.value,
  322. }
  323. xuanZhongDeShuJu.value.forEach(item => {
  324. data.actOrderNoList.push(item.actOrderNo)
  325. })
  326. piLiangXiuGaiTingZhiShiJian(data).then((res) => {
  327. handleCurrentChange(yiZhuPage.value.currentPage)
  328. yiZhuChaoZuoDialog = false
  329. })
  330. } else {
  331. // 这里 是因为停止医嘱和撤销医嘱中 时间和撤销原因用的是同一个
  332. // 方法 所以需要使用到不同的提交内容
  333. let data = ''
  334. if (chaoZuoBiaoZhi === 2) {
  335. data = content
  336. } else if (chaoZuoBiaoZhi === 3) {
  337. data = tingZhiRiQi.value
  338. }
  339. yiZhuChaoZuo(yiZhuHao.value, chaoZuoBiaoZhi, data).then((res) => {
  340. handleCurrentChange(yiZhuPage.value.currentPage)
  341. yiZhuChaoZuoDialog = false
  342. content = ''
  343. })
  344. }
  345. }
  346. let yiZhuChaoZuoDialog = $ref(false)
  347. let content = $ref('')
  348. const tingZhiRiQi = ref('')
  349. /**
  350. * 医嘱操作状态 1-设为紧急 2-撤销 3-停止 90-批量停止
  351. */
  352. let chaoZuoBiaoZhi = $ref(0)
  353. const yiZhuHao = ref(0)
  354. let yiZhuChaoZuoBiaoTi = $ref('')
  355. const xuanZhongDeShuJu = ref([])
  356. const huoQuXuanZhongDeShuJu = (val) => {
  357. xuanZhongDeShuJu.value = val
  358. }
  359. // 用户切换全选和全不选 时 el-table中的全选不会选中子节点
  360. const toggleSelection = (row, selected) => {
  361. if (row) {
  362. row.forEach((item) => {
  363. tableRef.value.toggleRowSelection(item, selected)
  364. })
  365. }
  366. }
  367. /**
  368. * 点击复制医嘱
  369. */
  370. const dianJiFuZhuXuanZhongYiZhu = () => {
  371. fuZhiYiZhu.value = xuanZhongDeShuJu.value
  372. }
  373. /**
  374. * 右键点击查看医嘱产生的费用
  375. * @param val
  376. */
  377. let doctorSOrderFee = $ref({
  378. data: {},
  379. problem: {},
  380. totalCost: {}
  381. })
  382. let chargeDetails = $ref({
  383. dialog: false,
  384. data: [],
  385. sum: {}
  386. })
  387. const clickToViewTheDoctorSOrderFee = (val) => {
  388. chargeDetails.data = doctorSOrderFee.data[val.actOrderNoStr]
  389. chargeDetails.sum = doctorSOrderFee.totalCost[val.actOrderNoStr]
  390. chargeDetails.dialog = true
  391. }
  392. const getFeeInfor = (actOrderNo) => {
  393. try {
  394. let problem = doctorSOrderFee.problem[actOrderNo]
  395. if (typeof problem === 'undefined') {
  396. problem = ''
  397. } else {
  398. problem = '有' + problem
  399. }
  400. return `<br>金额:${doctorSOrderFee.totalCost[actOrderNo].sum} 元,
  401. ${doctorSOrderFee.totalCost[actOrderNo].amount}条,
  402. <br/>${problem}`
  403. } catch (e) {
  404. return ""
  405. }
  406. }
  407. onMounted(async () => {
  408. await sleep(200)
  409. // addYiZhuClick()
  410. zkList.value = await getTheTransferList()
  411. })
  412. watch(
  413. () => huanZheXinXi.value,
  414. () => {
  415. expensesForGettingADoctorSOrder(huanZheXinXi.value.inpatientNo, huanZheXinXi.value.admissTimes).then((res) => {
  416. doctorSOrderFee = res
  417. })
  418. getServerDateApi().then((res) => {
  419. chaXunYiZhuClick(0)
  420. })
  421. }
  422. )
  423. function getYiZhuFlag(val) {
  424. if (stringIsBlank(val)) {
  425. return 'warning'
  426. }
  427. switch (val) {
  428. case '1':
  429. return 'info'
  430. case '2':
  431. return 'success'
  432. case '3':
  433. return ''
  434. case '4':
  435. return ''
  436. case '5':
  437. return 'danger'
  438. default:
  439. return 'warning'
  440. }
  441. }
  442. /**
  443. * 点击批量停止
  444. */
  445. const clickBatchStop = () => {
  446. yiZhuChaoZuoDialog = true
  447. chaoZuoBiaoZhi = 90
  448. yiZhuChaoZuoBiaoTi = '批量停止'
  449. }
  450. const dianJiDuiHuaKuangZhongDeGuanBi = () => {
  451. yiZhuChaoZuoDialog = false
  452. content = ''
  453. }
  454. // 点击修改医嘱时间
  455. const clickToModifyTheDoctorSOrderTime = () => {
  456. router.push({
  457. name: 'yzActOrderModify',
  458. query: {
  459. patNo: huanZheXinXi.value.inpatientNo,
  460. },
  461. })
  462. }
  463. const jumpToMedicalRecord = () => {
  464. router.push({
  465. name: 'fillCaseFrontSheet',
  466. query: {
  467. patNo: huanZheXinXi.value.inpatientNo,
  468. deptCode: huanZheXinXi.value.smallDept,
  469. },
  470. })
  471. }
  472. </script>
  473. <style scoped lang="scss">
  474. :deep(.el-table .children-row) {
  475. background: rgba(145, 247, 145, 0.93);
  476. }
  477. :deep(.el-table) {
  478. --el-table-row-hover-background-color: #85dbfd7a;
  479. }
  480. :deep(.el-dropdown-menu__item) {
  481. font-size: 14px !important;
  482. height: 26px;
  483. line-height: 26px;
  484. font-weight: bold;
  485. }
  486. </style>