YiZhuLuRu.vue 16 KB

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