AllAdverseEvent.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. <template>
  2. <div class="layout_container">
  3. <header class="round-header">
  4. <el-date-picker
  5. v-model="dateRange"
  6. type="daterange"
  7. range-separator="至"
  8. start-placeholder="开始日期"
  9. end-placeholder="结束日期"
  10. :shortcuts="shortcuts"
  11. style="width: 260px"
  12. ></el-date-picker>
  13. <el-select v-model="queryParam.wardCode" placeholder="请选择科室" clearable style="width: 160px">
  14. <el-option v-for="item in allWards" :key="item.code" :label="item.name" :value="item.code"></el-option>
  15. </el-select>
  16. <el-divider direction="vertical"></el-divider>
  17. <el-button type="primary" icon="Refresh" @click="fetchReports">检索数据</el-button>
  18. <el-button type="primary" icon="Upload" @click="exportExcel">导出Excel</el-button>
  19. </header>
  20. <div class="layout_main layout_el-table">
  21. <el-table :data="reports" stripe highlight-current-row>
  22. <el-table-column prop="occurDatetime" label="发生时间" sortable></el-table-column>
  23. <el-table-column prop="category" label="事件类型"></el-table-column>
  24. <el-table-column prop="submitDatetime" label="提交时间"></el-table-column>
  25. <el-table-column prop="userName" label="提交人" width="80"></el-table-column>
  26. <el-table-column prop="department" label="科室" width="120"></el-table-column>
  27. <el-table-column label="处理" width="60">
  28. <template v-slot="scope">
  29. <span v-html="filterHandled(scope.row.handled)"></span>
  30. </template>
  31. </el-table-column>
  32. <el-table-column prop="deptDealerName" label="处理人" width="80"></el-table-column>
  33. <el-table-column label="打印" width="60">
  34. <template v-slot="scope">
  35. <span v-html="filterPrinted(scope.row.printed)"></span>
  36. </template>
  37. </el-table-column>
  38. <el-table-column label="操作">
  39. <template v-slot="scope">
  40. <el-button type="primary" icon="View" @click="viewReport(scope.row.pid)">查看</el-button>
  41. <el-button type="danger" icon="Close" @click="deleteReport(scope.row.pid)" :disabled="isNotHlb">删除
  42. </el-button>
  43. </template>
  44. </el-table-column>
  45. </el-table>
  46. <el-pagination
  47. @size-change="handleSizeChange"
  48. @current-change="handleCurrentChange"
  49. :current-page="queryParam.currentPage"
  50. :page-sizes="[15, 30, 45, 70, 100]"
  51. :page-size="queryParam.pageSize"
  52. layout="total, sizes, prev, pager, next, jumper"
  53. :total="totalSize"
  54. ></el-pagination>
  55. </div>
  56. </div>
  57. <el-dialog v-model="showViewReport" title="报告详情" fullscreen>
  58. <EventViewer :report="report" :disableHlbDealing="disableHlbDealing"/>
  59. <div style="width: 100%; text-align: right; margin: 50px 0 0 0">
  60. <el-button type="primary" icon="Edit" @click="showModifyReport = true" :disabled="disableHlbDealing">
  61. 修改此报告
  62. </el-button>
  63. <el-button type="primary" icon="Upload" @click="submitHlbDealing" :disabled="disableHlbDealingBtn">提交处理
  64. </el-button>
  65. <el-button type="primary" icon="Printer" @click="toPrintPage">打印</el-button>
  66. <el-button type="danger" icon="Close" @click="showViewReport = false">关闭</el-button>
  67. </div>
  68. </el-dialog>
  69. <el-dialog
  70. v-model="showModifyReport"
  71. title="修改报告"
  72. width="70%"
  73. >
  74. <EventEditor :report="report"/>
  75. <div style="width: 100%; text-align: right; margin: 20px 0 10px 0">
  76. <el-button type="info" icon="Close" @click="cancelModify">取消</el-button>
  77. <el-button type="primary" icon="Check" @click="confirmModify">提交</el-button>
  78. </div>
  79. </el-dialog>
  80. <div id="printArea" style="opacity: 0; position: fixed">
  81. <EventPrinter :report="report"/>
  82. </div>
  83. </template>
  84. <script setup>
  85. import {shortcuts} from '@/data/shortcuts'
  86. import {computed, onMounted, reactive, ref} from 'vue'
  87. import {
  88. getAllDepts,
  89. getAllReports,
  90. getReportDetail,
  91. submitNewReport,
  92. updateDeleted,
  93. updateFinalHandled, updatePrinted
  94. } from '@/api/adverse-event'
  95. import EventViewer from "@/views/hospitalization/adverse-event/component/EventViewer.vue";
  96. import {ElMessage, ElMessageBox} from 'element-plus'
  97. import {formatDatetime} from '@/utils/date'
  98. import {downloadExcel} from '@/utils/excel'
  99. import {getLodop, initLodop} from '@/utils/c-lodop'
  100. import {useUserStore} from "@/pinia/user-store";
  101. import {startLoading} from "@/utils/loading";
  102. import EventEditor from "@/views/hospitalization/adverse-event/component/EventEditor.vue";
  103. import EventPrinter from "@/views/hospitalization/adverse-event/component/EventPrinter.vue";
  104. const dateRange = ref(null)
  105. const allWards = ref([])
  106. const queryParam = reactive({
  107. start: null,
  108. end: null,
  109. wardCode: '',
  110. currentPage: 1,
  111. pageSize: 30,
  112. })
  113. const reports = ref([])
  114. const totalSize = ref(0)
  115. const handleSizeChange = (val) => {
  116. queryParam.pageSize = val
  117. fetchReports()
  118. }
  119. const handleCurrentChange = (val) => {
  120. queryParam.currentPage = val
  121. fetchReports()
  122. }
  123. const report = ref({})
  124. const showViewReport = ref(false)
  125. const showModifyReport = ref(false)
  126. const fetchReports = () => {
  127. if (dateRange.value) {
  128. queryParam.start = formatDatetime(dateRange.value[0])
  129. queryParam.end = formatDatetime(dateRange.value[1])
  130. } else {
  131. queryParam.start = null
  132. queryParam.end = null
  133. }
  134. getAllReports(queryParam).then((res) => {
  135. reports.value = res.list
  136. totalSize.value = res.totalSize
  137. })
  138. }
  139. const roles = useUserStore().userInfo.roles
  140. const isNotHlb = computed(() => {
  141. return roles.indexOf(24) === -1 && roles.indexOf(1) === -1 && roles.indexOf(2) === -1
  142. })
  143. const disableHlbDealing = computed(() => {
  144. if (roles.indexOf(24) === -1 && roles.indexOf(1) === -1 && roles.indexOf(2) === -1) {
  145. return true
  146. }
  147. return report.value.finalDealTime !== null
  148. })
  149. const disableHlbDealingBtn = computed(() => {
  150. if (roles.indexOf(24) === -1 && roles.indexOf(1) === -1 && roles.indexOf(2) === -1) {
  151. return true
  152. }
  153. if (report.value.deptDealTime === null) {
  154. return true
  155. }
  156. return report.value.finalDealTime !== null
  157. })
  158. const viewReport = (pid) => {
  159. getReportDetail(pid, 'final').then((res) => {
  160. report.value = res
  161. showViewReport.value = true
  162. })
  163. }
  164. const deleteReport = (pid) => {
  165. ElMessageBox.confirm('是否删除此报告?删除后不可恢复,请谨慎选择。', '提示', {
  166. confirmButtonText: '确定删除',
  167. cancelButtonText: '再考虑考虑',
  168. type: 'warning',
  169. }).then(() => {
  170. updateDeleted(pid).then(() => {
  171. ElMessage({
  172. message: '删除成功',
  173. type: 'success',
  174. duration: 2500,
  175. showClose: true,
  176. })
  177. fetchReports()
  178. })
  179. }).catch(() => {
  180. })
  181. }
  182. const cancelModify = () => {
  183. showModifyReport.value = false
  184. }
  185. const confirmModify = () => {
  186. report.value.isModify = true
  187. submitNewReport(report.value).then(() => {
  188. ElMessage({
  189. message: '修改成功',
  190. type: 'success',
  191. duration: 2500,
  192. showClose: true,
  193. })
  194. })
  195. showModifyReport.value = false
  196. }
  197. const submitHlbDealing = () => {
  198. if (report.value.finalDealing === '未处理') {
  199. ElMessage({
  200. message: '请填写处理内容!',
  201. type: 'warning',
  202. duration: 2500,
  203. showClose: true,
  204. })
  205. return
  206. }
  207. const param = {
  208. pid: report.value.pid,
  209. dealing: report.value.finalDealing,
  210. }
  211. updateFinalHandled(param).then((res) => {
  212. report.value = res
  213. ElMessage({
  214. message: '处理成功',
  215. type: 'success',
  216. duration: 2500,
  217. showClose: true,
  218. })
  219. })
  220. }
  221. const toPrintPage = () => {
  222. let LODOP = getLodop()
  223. const prntStyle = `<style>table, tr, th, td {border: 1px solid #c1dbfa;border-collapse: collapse;text-align: left;padding: 0 10px;vertical-align: center;word-break: break-all;font-size: 13px;}</style>`
  224. const prntContent = document.getElementById('printArea').innerHTML
  225. let pagePrint = prntStyle + '<body>' + prntContent + '</body>'
  226. LODOP.PRINT_INIT('normaladverseevent')
  227. LODOP.SET_PRINT_PAGESIZE(1, '210mm', '297mm', '')
  228. LODOP.SET_PRINT_MODE('FULL_HEIGHT_FOR_OVERFLOW', true) // 整宽不变形
  229. LODOP.SET_PRINT_MODE('FULL_WIDTH_FOR_OVERFLOW', true) // 整宽不变形
  230. LODOP.ADD_PRINT_HTM('1mm', '1mm', '100%', '100%', pagePrint)
  231. LODOP.SET_PRINT_STYLE('ItemType', 3)
  232. LODOP.PREVIEW()
  233. updatePrinted(report.value.pid)
  234. }
  235. const exportExcel = () => {
  236. startLoading()
  237. const data = {
  238. param: {
  239. start: null,
  240. end: null,
  241. wardCode: queryParam.wardCode,
  242. },
  243. url: '/adverseEvent/exportExcel',
  244. fileName: '不良事件统计.xlsx',
  245. }
  246. if (dateRange.value) {
  247. data.param.start = formatDatetime(dateRange.value[0])
  248. data.param.end = formatDatetime(dateRange.value[1])
  249. }
  250. setTimeout(() => {
  251. downloadExcel(data)
  252. }, 100)
  253. }
  254. onMounted(() => {
  255. initLodop()
  256. getAllDepts().then((res) => {
  257. allWards.value = res
  258. fetchReports()
  259. })
  260. })
  261. function filterHandled(val) {
  262. return val === 1 ? '<span style="color:green">已处理</span>' : '<span style="color:red">未处理</span>'
  263. }
  264. function filterPrinted(val) {
  265. return val === 1 ? '<span style="color:green">已打印</span>' : '<span style="color:red">未打印</span>'
  266. }
  267. </script>