TaskLogWatcher.jsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import { Card, message, Table, Tree } from 'antd'
  2. import React, { useEffect, useState } from 'react'
  3. import { useLocation } from 'react-router-dom'
  4. import styled from 'styled-components'
  5. import { getLogInfo } from '../services/index'
  6. import moment from 'moment'
  7. const LogWrapper = styled.div`
  8. padding: 20px;
  9. display: flex;
  10. height: 100vh;
  11. column-gap: 20px;
  12. .job-list {
  13. flex: 1;
  14. }
  15. .log-info {
  16. width: 920px;
  17. }
  18. .log {
  19. background-color: #012b36;
  20. height: 100%;
  21. width: 100%;
  22. overflow-y: scroll;
  23. color: #638691;
  24. padding: 8px 10px;
  25. ::-webkit-scrollbar {
  26. display: none;
  27. }
  28. }
  29. .node_list {
  30. width: 100%;
  31. height: 100%;
  32. }
  33. .node_table {
  34. overflow: auto;
  35. height: 650px
  36. ::-webkit-scrollbar {
  37. display: none;
  38. }
  39. }
  40. .ant-table-selection-column {
  41. display: none !important;
  42. }
  43. `
  44. const { DirectoryTree } = Tree
  45. const TaskLogWatcher = () => {
  46. const { state } = useLocation()
  47. const [logData, setLogData] = useState('暂无日志')
  48. // 初始化节点列表
  49. const [jobList, setJobList] = useState([])
  50. // 选中的作业
  51. const [selectJob, setSelectJob] = useState(null)
  52. // 单/多作业类型
  53. // const [taskType, setTaskType] = useState(null)
  54. const [treeData, setTreeData] = useState([])
  55. const columns = [
  56. {
  57. title: '序号',
  58. dataIndex: 'index',
  59. key: 'index',
  60. },
  61. {
  62. title: '执行时间',
  63. dataIndex: 'executeTime',
  64. key: 'executeTime',
  65. },
  66. {
  67. title: '执行结果',
  68. dataIndex: 'handleResult',
  69. key: 'handleResult',
  70. render: code => (
  71. <span
  72. style={{
  73. color: code === 0 ? '#FF4D4F' : code === 1 ? '#52C41A' : '#4A4A4A',
  74. }}>
  75. {code === 0 ? '失败' : code === 1 ? '成功' : '无'}
  76. </span>
  77. ),
  78. },
  79. ]
  80. const fetchOnceJoblog = async () => {
  81. const { data } = await getLogInfo(state.id)
  82. if (data.code === 200) {
  83. // setTaskType(data.data.job_type)
  84. // if (data.data.job_type === '单作业离线任务')
  85. // formatSingleTask(data.data.logs)
  86. // if (data.data.job_type === '多作业离线任务')
  87. // formatMultiTask(data.data.logs)
  88. formatSingleTask(data.data)
  89. } else {
  90. message.error(data.msg)
  91. }
  92. }
  93. const formatSingleTask = data => {
  94. console.log(data)
  95. const list = data.map((item, index) => ({
  96. key: index,
  97. id: item.id,
  98. index: index + 1,
  99. executeTime: moment(Number(item.execute_time) * 1000).format(
  100. 'YYYY.MM.DD HH:MM'
  101. ),
  102. log: item.log,
  103. handleResult: item.execute_result,
  104. }))
  105. setJobList(list)
  106. onClickTableNode(list[0])
  107. }
  108. const formatMultiTask = data => {
  109. const list = data.map((item, index) => {
  110. const children = item.nodes.map((node, i) => {
  111. return {
  112. title: node.node_name,
  113. key: `${index}-${i}`,
  114. uri: node.job_log_uri,
  115. isLeaf: true,
  116. }
  117. })
  118. return {
  119. title: item.homework_name,
  120. key: String(index),
  121. children,
  122. }
  123. })
  124. setTreeData(list)
  125. setLogData('请选择节点查看任务')
  126. }
  127. const onClickTableNode = record => {
  128. setSelectJob(record.key)
  129. setLogData(record.log)
  130. }
  131. const onClickTreeNode = (_, info) => {}
  132. useEffect(() => {
  133. fetchOnceJoblog()
  134. }, [state])
  135. const singleTable = (
  136. <Table
  137. columns={columns}
  138. dataSource={jobList}
  139. showHeader={false}
  140. className="node_table"
  141. pagination={{ position: ['none', 'none'] }}
  142. onRow={record => {
  143. return {
  144. onClick: () => onClickTableNode(record),
  145. }
  146. }}
  147. rowSelection={{
  148. type: 'radio',
  149. columnWidth: '0',
  150. selectedRowKeys: [selectJob],
  151. }}
  152. />
  153. )
  154. const multiTree = (
  155. <DirectoryTree onSelect={onClickTreeNode} treeData={treeData} />
  156. )
  157. return (
  158. <LogWrapper>
  159. {/* <pre className="log">{logData}</pre> */}
  160. <div className="job-list">
  161. <Card
  162. size="small"
  163. title="节点列表"
  164. bordered={false}
  165. className="node_list"
  166. headStyle={{
  167. padding: '10px 15px',
  168. fontSize: '14px',
  169. fontWeight: '700',
  170. }}>
  171. {/* {taskType === '单作业离线任务' ? singleTable : multiTree} */}
  172. {singleTable}
  173. </Card>
  174. </div>
  175. <div className="log-info">
  176. <Card
  177. bordered={false}
  178. style={{ height: '100%', width: '100%' }}
  179. bodyStyle={{ height: '100%', width: '100%' }}>
  180. <pre className="log">{logData}</pre>
  181. </Card>
  182. </div>
  183. </LogWrapper>
  184. )
  185. }
  186. export default TaskLogWatcher