DatasourceLog.jsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import React, { useState, useEffect, useImperativeHandle } from 'react'
  2. import { Table, Space, message } from 'antd'
  3. import { getJoblog, refreshLogsStatus } from '../services'
  4. import moment from 'moment'
  5. import { useNavigate } from 'react-router-dom'
  6. let timeout = null
  7. const DatasourceLog = ({ onRef, logId }) => {
  8. // 初始化日志列表
  9. const [logList, setLogList] = useState([])
  10. // 表格Loading状态
  11. const [dataLoading, setDataLoading] = useState(false)
  12. const [currentPage, setCurrentPage] = useState(1)
  13. const [currentPageSize, setCurrentPageSize] = useState(10)
  14. const [dataTotal, setDataTotal] = useState(0)
  15. const navigate = useNavigate()
  16. const changeTask = () => {}
  17. // 暴露更新列表方法
  18. useImperativeHandle(onRef, () => {
  19. return {
  20. updateLogList: fetchJoblog,
  21. }
  22. })
  23. const checkLog = id => {
  24. navigate('/datasource/log-watcher', {
  25. state: { id },
  26. })
  27. }
  28. const columns = [
  29. {
  30. title: '同步ID',
  31. dataIndex: 'jobId',
  32. key: 'jobId',
  33. },
  34. {
  35. title: '任务描述',
  36. dataIndex: 'jobDesc',
  37. key: 'jobDesc',
  38. },
  39. {
  40. title: '开始时间',
  41. dataIndex: 'startTime',
  42. key: 'startTime',
  43. },
  44. {
  45. title: '同步状态',
  46. dataIndex: 'handleResult',
  47. key: 'handleResult',
  48. render: code => (
  49. <span
  50. style={{
  51. color: code === 3 ? '#FF4D4F' : code === 2 ? '#52C41A' : '#4A4A4A',
  52. }}>
  53. {code === 3
  54. ? '失败'
  55. : code === 2
  56. ? '成功'
  57. : code === 1
  58. ? '运行中'
  59. : code === 0
  60. ? '队列中'
  61. : '暂无'}
  62. </span>
  63. ),
  64. },
  65. {
  66. title: '操作',
  67. key: 'operation',
  68. render: (_, record) => (
  69. <Space size="middle">
  70. <span
  71. onClick={() => {
  72. checkLog(record.key)
  73. }}
  74. style={{ color: '#1881DA', cursor: 'pointer' }}>
  75. 查看
  76. </span>
  77. {/* <a href="/#" onClick={editData} style={{ color: '#1881DA' }}>
  78. 编辑
  79. </a> */}
  80. {/* <span
  81. onClick={() => {
  82. changeTask(record.key)
  83. }}
  84. style={{ color: '#1881DA', cursor: 'pointer' }}>
  85. 终止任务
  86. </span> */}
  87. </Space>
  88. ),
  89. },
  90. ]
  91. const fetchJoblog = async (page = 1, pageSize = 10) => {
  92. setDataLoading(true)
  93. const { data } = await getJoblog({
  94. page: page,
  95. size: pageSize,
  96. id: logId,
  97. })
  98. if (data.code === 200) {
  99. setDataTotal(data.data.extra_data.total)
  100. setCurrentPage(data.data.extra_data.page)
  101. setCurrentPageSize(data.data.extra_data.size)
  102. const refreshLogs = []
  103. const list = data.data.item.map(item => {
  104. if ([0, 1].includes(item.execute_result)) {
  105. refreshLogs.push(item.id)
  106. }
  107. return {
  108. key: item.id,
  109. jobId: item.job_id,
  110. jobDesc: item.job_desc,
  111. afJobId: item.af_job_id,
  112. runId: item.run_id,
  113. startTime: item.start_time
  114. ? moment(Math.round(item.execute_time) * 1000).format(
  115. 'YYYY.MM.DD HH:mm:ss'
  116. )
  117. : '无',
  118. handleResult: item.result,
  119. }
  120. })
  121. setLogList(list)
  122. refreshStatus(refreshLogs)
  123. }
  124. setDataLoading(false)
  125. }
  126. const refreshStatus = async refreshLogs => {
  127. if (refreshLogs.length !== 0) {
  128. const { data } = await refreshLogsStatus(refreshLogs.toString())
  129. if (data.code === 200) {
  130. const list = []
  131. let logs = []
  132. const keys = Object.keys(data.data)
  133. keys.forEach(item => {
  134. if ([2, 3].includes(data.data[item])) {
  135. logs = logList.map(logData => {
  136. if (logData.id === item) {
  137. logData.execute_result = data.data[item]
  138. }
  139. return logData
  140. })
  141. } else {
  142. list.push(item)
  143. }
  144. })
  145. if (logs.length !== 0) {
  146. setLogList(logs)
  147. }
  148. timeout = setTimeout(() => {
  149. refreshStatus(list)
  150. }, 10000)
  151. } else {
  152. message.error(data.msg)
  153. }
  154. }
  155. }
  156. const pageChange = (page, pageSize) => {
  157. fetchJoblog(page, pageSize)
  158. }
  159. useEffect(() => {
  160. fetchJoblog()
  161. }, [logId])
  162. useEffect(() => {
  163. return () => {
  164. clearTimeout(timeout)
  165. }
  166. }, [])
  167. return (
  168. <Table
  169. columns={columns}
  170. dataSource={logList}
  171. bordered
  172. loading={dataLoading}
  173. pagination={{
  174. current: currentPage,
  175. total: dataTotal,
  176. pageSize: currentPageSize,
  177. onChange: pageChange,
  178. }}
  179. />
  180. )
  181. }
  182. export default DatasourceLog