DatasourceLog.jsx 5.2 KB

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