AllAdverseEvent.vue 9.0 KB

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