DatasourceSyncView.jsx 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import { Table, Space, Switch, message, Popconfirm } from 'antd'
  2. import React, { useEffect, useState } from 'react'
  3. import { useNavigate } from 'react-router-dom'
  4. import { getJobList, updateJobStatus, delJob, executeOnce } from '../services'
  5. export default function DatasourceSyncView({ selectLog }) {
  6. const navigate = useNavigate()
  7. // 初始化同步配置任务列表
  8. const [jobList, setJobList] = useState([])
  9. // 任务列表完整数据
  10. const [jobData, setJobData] = useState([])
  11. // 开关加载状态
  12. const [switchLoading, setSwitchLoading] = useState(false)
  13. // 表格Loading状态
  14. const [dataLoading, setDataLoading] = useState(false)
  15. const [currentPage, setCurrentPage] = useState(1)
  16. const [currentPageSize, setCurrentPageSize] = useState(10)
  17. const [dataTotal, setDataTotal] = useState(0)
  18. // 请求任务列表数据
  19. const fetchJobList = async (page = 1, pageSize = 10) => {
  20. setDataLoading(true)
  21. const { data } = await getJobList({
  22. page: page,
  23. size: pageSize,
  24. })
  25. if (data.code === 200) {
  26. setDataTotal(data.data.extra_data.total)
  27. setCurrentPage(data.data.extra_data.page)
  28. setCurrentPageSize(data.data.extra_data.size)
  29. const list = data.data.item.map(item => {
  30. return {
  31. key: item.id,
  32. id: item.id,
  33. job_cron: item.job_cron,
  34. jsb_desc: item.job_desc,
  35. trigger_status: item.trigger_status,
  36. }
  37. })
  38. setJobList(list)
  39. setJobData(data.data.item)
  40. }
  41. setDataLoading(false)
  42. }
  43. const pageChange = (page, pageSize) => {
  44. fetchJobList(page, pageSize)
  45. }
  46. const handleDelete = async id => {
  47. const { data } = await delJob(id)
  48. if (data.code === 200) {
  49. message.success('删除成功')
  50. fetchJobList()
  51. } else {
  52. message.error('删除失败')
  53. }
  54. }
  55. const editSyncItem = id => {
  56. navigate('/datasource/sync-edit', { state: { id } })
  57. }
  58. const runTimeOnce = async id => {
  59. const { data } = await executeOnce(id)
  60. if (data.code === 200) {
  61. message.success('开始执行')
  62. } else {
  63. message.error(data.msg)
  64. }
  65. }
  66. useEffect(() => {
  67. fetchJobList()
  68. }, [])
  69. const columns = [
  70. {
  71. title: '任务ID',
  72. dataIndex: 'id',
  73. key: 'id',
  74. },
  75. {
  76. title: '任务描述',
  77. dataIndex: 'jsb_desc',
  78. key: 'jsb_desc',
  79. },
  80. {
  81. title: '频次',
  82. dataIndex: 'job_cron',
  83. key: 'job_cron',
  84. },
  85. {
  86. title: '状态',
  87. key: 'trigger_status',
  88. render: (_, record) => (
  89. <Space>
  90. <Switch
  91. checkedChildren="开"
  92. unCheckedChildren="关"
  93. checked={record.trigger_status === 1}
  94. loading={switchLoading}
  95. onClick={async () => {
  96. setSwitchLoading(true)
  97. console.log(jobData, record.key)
  98. const switch_data = jobData.find(item => item.id === record.key)
  99. const trigger_status = switch_data.trigger_status === 1 ? 0 : 1
  100. const { data } = await updateJobStatus({
  101. id: record.key,
  102. trigger_status,
  103. })
  104. if (data.code === 200) {
  105. message.success(
  106. record.trigger_status === 1 ? '关闭成功' : '开启成功'
  107. )
  108. fetchJobList()
  109. } else {
  110. message.error(
  111. record.trigger_status === 1 ? '关闭失败' : '开启失败'
  112. )
  113. }
  114. setSwitchLoading(false)
  115. }}
  116. />
  117. </Space>
  118. ),
  119. },
  120. {
  121. title: '操作',
  122. key: 'operation',
  123. render: (_, record) => (
  124. <Space size="middle">
  125. <span
  126. onClick={() => {
  127. runTimeOnce(record.id)
  128. }}
  129. style={{ color: '#1881DA', cursor: 'pointer' }}>
  130. 执行一次
  131. </span>
  132. <span
  133. onClick={() => {
  134. selectLog(record.id)
  135. }}
  136. style={{ color: '#1881DA', cursor: 'pointer' }}>
  137. 查看日志
  138. </span>
  139. <span
  140. onClick={() => {
  141. editSyncItem(record.id)
  142. }}
  143. style={{ color: '#1881DA', cursor: 'pointer' }}>
  144. 编辑
  145. </span>
  146. <Popconfirm
  147. title="确认删除?"
  148. okText="确认"
  149. cancelText="取消"
  150. onConfirm={() => handleDelete(record.id)}>
  151. <span style={{ color: '#1881DA', cursor: 'pointer' }}>删除</span>
  152. </Popconfirm>
  153. </Space>
  154. ),
  155. },
  156. ]
  157. return (
  158. <Table
  159. columns={columns}
  160. dataSource={jobList}
  161. bordered
  162. loading={dataLoading}
  163. pagination={{
  164. current: currentPage,
  165. total: dataTotal,
  166. pageSize: currentPageSize,
  167. onChange: pageChange,
  168. }}
  169. />
  170. )
  171. }