SurgeryArrangement.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <template>
  2. <page-layer>
  3. <template #header>
  4. <el-date-picker
  5. v-model="dateRange"
  6. :shortcuts="shortcuts"
  7. end-placeholder="结束日期"
  8. range-separator="至"
  9. start-placeholder="开始日期"
  10. style="width: 220px"
  11. type="daterange"
  12. />
  13. &nbsp;&nbsp;病房:
  14. <el-select v-model="queryParam.ward" clearable filterable style="width: 120px">
  15. <el-option v-for="item in wardList" :key="item.code" :label="item.name" :value="item.code"></el-option>
  16. </el-select>
  17. &nbsp;&nbsp;住院号:
  18. <el-input v-model="queryParam.patNo" clearable style="width: 100px"></el-input>
  19. &nbsp;&nbsp;状态:
  20. <el-select v-model="queryParam.status" style="width: 80px">
  21. <el-option v-for="item in statusList" :key="item.code" :label="item.name" :value="item.code"></el-option>
  22. </el-select>
  23. <el-divider direction="vertical" />
  24. <el-checkbox v-model="queryParam.jzFlag">急诊</el-checkbox>
  25. <el-divider direction="vertical" />
  26. <el-button icon="Search" type="primary" @click="clickQuery">查询</el-button>
  27. </template>
  28. <template #main>
  29. <el-tag effect="dark" size="small" type="danger">急诊:{{ emergencyCount }}条</el-tag>
  30. <el-tag effect="dark" size="small">普通:{{ surgeryList.length - emergencyCount }}条</el-tag>
  31. <el-table :data="surgeryList.slice((currentPage - 1) * pageSize, currentPage * pageSize)"
  32. :height="window.h - 60" border :row-class-name="differChargedRows"
  33. header-cell-class-name="cell-border" cell-class-name="cell-border">
  34. <el-table-column label="手术编号" prop="recordId" width="60">
  35. <template #default="scope">
  36. <el-tag :type="scope.row.urgentClinicFlag === '1' ? 'danger' : ''" effect="dark" @click="clickToModifyTime(scope.row)">
  37. {{ scope.row.recordId }}
  38. </el-tag>
  39. </template>
  40. </el-table-column>
  41. <el-table-column label="日期" prop="opDatetime"></el-table-column>
  42. <el-table-column label="送出时间" prop="applyDate"></el-table-column>
  43. <el-table-column label="手术间" prop="roomName" width="80">
  44. <template #default="scope">
  45. <el-select v-model="scope.row.roomCode" @focus="handleSelectionFocus(scope.row, 'roomCode')"
  46. @change="(roomCode) => handleSelectionChange(scope.row.recordId, 'room_code', roomCode)">
  47. <el-option v-for="item in allRooms" :value="item.code" :label="item.name" :disabled="item.statusFlag === 2"></el-option>
  48. </el-select>
  49. </template>
  50. </el-table-column>
  51. <el-table-column label="病房" prop="wardName"></el-table-column>
  52. <el-table-column label="床号" prop="bedNo" width="45"></el-table-column>
  53. <el-table-column label="住院号" prop="inpatientNo" width="60"></el-table-column>
  54. <el-table-column label="姓名" prop="patientName" width="60"></el-table-column>
  55. <el-table-column label="年龄" prop="age" width="45"></el-table-column>
  56. <el-table-column label="性别" prop="sex" width="45"></el-table-column>
  57. <el-table-column label="手术名称" prop="opName"></el-table-column>
  58. <el-table-column label="麻醉方式" prop="hocusName" width="60"></el-table-column>
  59. <el-table-column label="麻醉医生" prop="doctorMzYsName" width="60"></el-table-column>
  60. <el-table-column label="手术医生" width="60">
  61. <template #default="scope">
  62. <div style="width: 100%; min-height: 30px;" @click="beforeSearch(scope.row)">{{ scope.row.doctorZdName }}</div>
  63. </template>
  64. </el-table-column>
  65. <el-table-column label="器械护士" width="60">
  66. <template #default="scope">
  67. <el-select v-model="scope.row.nurseQx" filterable @focus="handleSelectionFocus(scope.row, 'nurseQx')"
  68. @change="(nurseQx) => handleSelectionChange(scope.row.recordId, 'nurse_qx', nurseQx)">
  69. <el-option v-for="item in allStaffs" :value="item.code" :label="item.name"></el-option>
  70. </el-select>
  71. </template>
  72. </el-table-column>
  73. <el-table-column label="巡回护士" width="60">
  74. <template #default="scope">
  75. <el-select v-model="scope.row.nurseXh" filterable @focus="handleSelectionFocus(scope.row, 'nurseXh')"
  76. @change="(nurseXh) => handleSelectionChange(scope.row.recordId, 'nurse_xh', nurseXh)">
  77. <el-option v-for="item in allStaffs" :value="item.code" :label="item.name"></el-option>
  78. </el-select>
  79. </template>
  80. </el-table-column>
  81. <el-table-column label="申请医生" prop="applyDocName" width="60"></el-table-column>
  82. <el-table-column label="诊断" prop="diagBeforeOp"></el-table-column>
  83. <el-table-column label="分类" width="70">
  84. <template #default="scope">
  85. <el-select v-model="scope.row.urgentClinicFlag">
  86. <el-option label="普通" value="0"></el-option>
  87. <el-option label="急诊" value="1"></el-option>
  88. <el-option label="择期" value="2"></el-option>
  89. <el-option label="限期" value="3"></el-option>
  90. </el-select>
  91. </template>
  92. </el-table-column>
  93. <el-table-column label="手术班次" width="70">
  94. <template #default="scope">
  95. <el-select v-model="scope.row.ssbc">
  96. <el-option label="正常" value="1"></el-option>
  97. <el-option label="加班" value="2"></el-option>
  98. </el-select>
  99. </template>
  100. </el-table-column>
  101. <el-table-column label="级别" width="95">
  102. <template #default="scope">
  103. <el-select v-model="scope.row.opScale">
  104. <el-option label="一级手术" value="4"></el-option>
  105. <el-option label="二级手术" value="3"></el-option>
  106. <el-option label="三级手术" value="2"></el-option>
  107. <el-option label="四级手术" value="1"></el-option>
  108. </el-select>
  109. </template>
  110. </el-table-column>
  111. <el-table-column label="体外标志">
  112. <template #default="scope">
  113. <el-select v-model="scope.row.twFlag" @focus="handleSelectionFocus(scope.row, 'twFlag')"
  114. @change="(twFlag) => handleSelectionChange(scope.row.recordId, 'tw_flag', twFlag)">
  115. <el-option label="否" value="0"></el-option>
  116. <el-option label="是" value="1"></el-option>
  117. </el-select>
  118. </template>
  119. </el-table-column>
  120. <el-table-column label="手术台次" prop="sstc"></el-table-column>
  121. <el-table-column label="备注" prop="remark"></el-table-column>
  122. <el-table-column label="手术开始时间" prop="opStartDate"></el-table-column>
  123. <el-table-column label="手术结束时间" prop="opEndDate"></el-table-column>
  124. <el-table-column label="麻醉开始时间" prop="anstStartDate"></el-table-column>
  125. <el-table-column label="麻醉结束时间" prop="anstEndDate"></el-table-column>
  126. <el-table-column fixed="right" label="操作" width="110">
  127. <template #default="scope">
  128. <el-button link type="danger" icon="Delete" @click.prevent="beforeCancelSurgery(scope.row)">取消</el-button>
  129. <el-button link type="primary" icon="Document" @click.prevent="doctorAdvise(scope.row)" style="margin-left: 0">医嘱</el-button>
  130. </template>
  131. </el-table-column>
  132. </el-table>
  133. <el-pagination
  134. :current-page="currentPage"
  135. :page-size="pageSize"
  136. :total="surgeryList.length"
  137. layout="total,prev, pager, next"
  138. @current-change="handleCurrentChange"
  139. ></el-pagination>
  140. </template>
  141. </page-layer>
  142. <search v-if="showSearch" :title="titleOfSearch" target="physician" show-emp-dept @close="showSearch = false" @click-item="handleClickSearchResult"></search>
  143. </template>
  144. <script name="SurgeryArrangement" setup>
  145. import {
  146. getDicList,
  147. huoQuShouShuAnPaiXinXi,
  148. cancelSurgery,
  149. updateArrangement
  150. } from '@/api/surgical-management/surgery-arrangement'
  151. import { shortcuts } from '@/data/shortcuts.js'
  152. import { getDateRangeFormatDate, getDateRangeFormatDateTime } from '@/utils/date'
  153. import { listIsBlank, stringIsBlank, stringNotBlank } from '@/utils/blank-utils'
  154. import store from '@/store'
  155. import {ElMessage, ElMessageBox} from 'element-plus'
  156. import PageLayer from '@/layout/PageLayer.vue'
  157. import Search from '@/components/search/Index.vue'
  158. import router from '@/router'
  159. const window = computed(() => {
  160. return store.state.app.windowSize
  161. })
  162. let currentPage = $ref(1)
  163. let pageSize = $ref(30)
  164. let emergencyCount = $ref(0)
  165. let wardList = $ref([])
  166. let allRooms = $ref([])
  167. let allStaffs = $ref([])
  168. let statusList = $ref([
  169. { code: '0', name: '全部'},
  170. { code: '1', name: '申请' },
  171. { code: '2', name: '安排' },
  172. { code: '3', name: '确认' },
  173. { code: 'd', name: '取消' },
  174. ])
  175. let dateRange = $ref([shortcuts[0].value[0], shortcuts[0].value[1]])
  176. let queryParam = $ref({
  177. ward: '',
  178. patNo: '',
  179. status: '0',
  180. startTime: '',
  181. endTime: '',
  182. jzFlag: false,
  183. })
  184. let surgeryList = $ref([])
  185. const clickQuery = () => {
  186. if (listIsBlank(dateRange)) {
  187. ElMessage.error('请先输入日期')
  188. return
  189. }
  190. let dateS = getDateRangeFormatDate(dateRange)
  191. queryParam.startTime = dateS.startTime
  192. queryParam.endTime = dateS.endTime
  193. huoQuShouShuAnPaiXinXi(queryParam).then((res) => {
  194. surgeryList = res
  195. emergencyCount = 0
  196. surgeryList.forEach((item) => {
  197. if (stringNotBlank(item.urgentClinicFlag)) {
  198. if (item.urgentClinicFlag === '1') {
  199. emergencyCount++
  200. }
  201. }
  202. })
  203. })
  204. }
  205. const handleCurrentChange = (val) => {
  206. currentPage = val
  207. }
  208. const differChargedRows = ({ row }) => {
  209. if (row.chargeSum && row.chargeSum > 0) {
  210. return 'charged-row'
  211. }
  212. }
  213. const beforeCancelSurgery = (row) => {
  214. if (row.status === '3') {
  215. ElMessage({
  216. message: '已完成的手术不可取消。',
  217. type: 'error',
  218. duration: 2500,
  219. showClose: true
  220. })
  221. return
  222. }
  223. ElMessageBox.confirm("是否确认取消该手术?", "提示", {
  224. type: 'warning'
  225. }).then(() => {
  226. cancelSurgery(row.recordId).then(res => {
  227. ElMessage({
  228. message: res,
  229. type: 'success',
  230. duration: 2500,
  231. showClose: true
  232. })
  233. })
  234. })
  235. }
  236. let showSearch = $ref(false)
  237. let titleOfSearch = $ref('')
  238. let currentRow = $ref({})
  239. let currentKey = $ref('')
  240. const beforeSearch = (row) => {
  241. currentRow = row
  242. currentKey = 'doctor_zd'
  243. titleOfSearch = '手术医生';
  244. showSearch = true
  245. }
  246. const handleClickSearchResult = (item) => {
  247. showSearch = false
  248. handleArrangementChange(currentRow.recordId, currentKey, item.code).then(() => {
  249. currentRow.doctorZd = item.code
  250. currentRow.doctorZdName = item.name
  251. })
  252. }
  253. const oldSelection = reactive({
  254. key: '',
  255. val: ''
  256. })
  257. const handleSelectionFocus = (row, key) => {
  258. currentRow = row
  259. oldSelection.key = key
  260. oldSelection.val = row[key]
  261. }
  262. const handleSelectionChange = (orderId, key, value) => {
  263. handleArrangementChange(orderId, key, value).then(() => {
  264. }).catch(() => {
  265. currentRow[oldSelection.key] = oldSelection.val
  266. })
  267. }
  268. const handleArrangementChange = (orderId, key, value) => {
  269. return new Promise((resolve, reject) => {
  270. updateArrangement(orderId, key, value).then(() => {
  271. resolve()
  272. }).catch(() => {
  273. reject()
  274. })
  275. })
  276. }
  277. const doctorAdvise = (row) => {
  278. router.push({
  279. name: 'yiZhuLuRu',
  280. params: {
  281. inpatientNo: row.inpatientNo,
  282. admissTimes: row.admissTimes
  283. }
  284. })
  285. }
  286. onMounted(() => {
  287. getDicList().then((res) => {
  288. wardList = res.allWards
  289. allRooms = res.allRooms
  290. allStaffs = res.allStaffs
  291. })
  292. clickQuery()
  293. })
  294. </script>
  295. <style scoped>
  296. :deep(.el-table tbody tr:hover>td) {
  297. background-color: unset !important;
  298. }
  299. :deep(.el-table .el-table-fixed-column--right .cell) {
  300. width: 100%;
  301. background: white;
  302. position: absolute;
  303. top: 0;
  304. bottom: 0;
  305. display: flex;
  306. align-items: center;
  307. }
  308. :deep(.el-table .charged-row) {
  309. background: rgba(142, 252, 142, 0.8);
  310. }
  311. :deep(.el-table .cell-border) {
  312. border: 1px solid #555;
  313. color: black;
  314. padding: 0;
  315. }
  316. :deep(.el-input__inner) {
  317. color: black !important;
  318. }
  319. :deep(.el-input--small .el-input__wrapper) {
  320. padding: 1px 4px;
  321. }
  322. :deep(.el-table .el-input__suffix) {
  323. display: none;
  324. }
  325. </style>