index.tsx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. import React, { useEffect, useState } from 'react'
  2. import Helmet from 'react-helmet'
  3. import Container, { ContainerBody } from 'components/Container'
  4. import Box from 'components/Box'
  5. import { Button, Divider, Icon, message, Popconfirm, Spin, Table } from 'antd'
  6. import { ColumnProps } from 'antd/lib/table'
  7. import { compose } from 'redux'
  8. import request from 'utils/request'
  9. import api from 'utils/api'
  10. import { IDataSubject } from 'containers/DataGovernanceMarkRule/types'
  11. import DataSubjectFormModal from 'containers/DataGovernanceMarkRule/components/DataSubjectFormModal'
  12. import { AuditClassificationFormModal } from 'containers/DataGovernanceMarkRule/components/AuditClassificationFormModal'
  13. import styles from 'containers/DataManagerView/index.less'
  14. import classnames from 'classnames'
  15. import { IDictData } from 'containers/DataManagerDictionary/types'
  16. import { isNumber } from 'lodash'
  17. function DataDictionary() {
  18. const [tableLoading, setTableLoading] = useState(false)
  19. const [dataSubject, setDataSubject] = useState<IDataSubject[]>([])
  20. const [dataSubjectFormVisible, setDataSubjectFormVisible] = useState(false)
  21. const [dataSubjectFormLoading, setDataSubjectFormLoading] = useState(false)
  22. const [dataSubjectForm, setDataSubjectForm] = useState<IDataSubject>(null)
  23. const [auditLoading, setAuditLoadingLoading] = useState(false)
  24. const [selectedSubjectsKey, setSelectedSubjectsKey] = useState<number>()
  25. const [treeLoading, setTreeLoading] = useState(false)
  26. const [subjects, setSubject] = useState<IDictData[]>([
  27. { dictLabel: '全部主题', dictCode: -1 }
  28. ])
  29. const tableColumns: Array<ColumnProps<IDataSubject>> = [
  30. {
  31. title: '标准主题',
  32. dataIndex: 'standardTheme'
  33. },
  34. {
  35. title: '标准编码',
  36. dataIndex: 'standardCode'
  37. },
  38. {
  39. title: '标准名称',
  40. dataIndex: 'standardName'
  41. },
  42. {
  43. title: '别名',
  44. dataIndex: 'standardAlias'
  45. },
  46. {
  47. title: '英文名称',
  48. dataIndex: 'englishName'
  49. },
  50. {
  51. title: '管理部门',
  52. dataIndex: 'deptName'
  53. },
  54. {
  55. title: '管理人员',
  56. dataIndex: 'management'
  57. },
  58. {
  59. title: '操作',
  60. render: (_, data) => (
  61. <>
  62. <a
  63. onClick={() => {
  64. setAuditLoadingLoading(true)
  65. setDataSubjectForm(data)
  66. }}
  67. >
  68. 列表
  69. </a>
  70. <Divider type="vertical" />
  71. <a
  72. onClick={() => {
  73. setDataSubjectFormVisible(true)
  74. setDataSubjectForm(data)
  75. }}
  76. >
  77. 修改
  78. </a>
  79. <Divider type="vertical" />
  80. <Popconfirm
  81. title="确定删除?"
  82. placement="bottom"
  83. onConfirm={() => handleDeleteDataSubject(data.id)}
  84. >
  85. <a>删除</a>
  86. </Popconfirm>
  87. </>
  88. )
  89. }
  90. ]
  91. const querySubjects = async () => {
  92. try {
  93. setTreeLoading(true)
  94. const data = await request(`${api.getSubjects}data_standard`, {
  95. method: 'GET'
  96. })
  97. const defaultSubject = [{ dictLabel: '全部主题', dictCode: -1 }]
  98. setSubject(
  99. // @ts-ignore
  100. data?.payload ? [...defaultSubject, ...data?.payload] : defaultSubject
  101. )
  102. setSelectedSubjectsKey(-1)
  103. } finally {
  104. setTreeLoading(false)
  105. }
  106. }
  107. const queryDataBySelectedSubject = async () => {
  108. try {
  109. setTableLoading(true)
  110. const data = await request(
  111. `${api.getDataSubject}?pId=${
  112. selectedSubjectsKey === -1 ? '' : selectedSubjectsKey
  113. }`,
  114. { method: 'GET' }
  115. )
  116. // @ts-ignore
  117. setDataSubject(data?.payload ?? [])
  118. } finally {
  119. setTableLoading(false)
  120. }
  121. }
  122. const handleDeleteDataSubject = async (id) => {
  123. try {
  124. setTableLoading(true)
  125. await request(`${api.deleteDataSubject}/${id}`, { method: 'delete' })
  126. await queryDataBySelectedSubject()
  127. } finally {
  128. setTableLoading(false)
  129. }
  130. }
  131. const handleSaveDataSubject = async (dt: IDataSubject) => {
  132. // // 0=正常,1=停用
  133. try {
  134. setDataSubjectFormLoading(true)
  135. const url = dataSubjectForm?.id
  136. ? `${api.updateDataSubject}/${dataSubjectForm.id}`
  137. : api.createDataSubject
  138. await request(url, {
  139. method: dataSubjectForm?.id ? 'PUT' : 'POST',
  140. data: { ...(dataSubjectForm ?? {}), ...dt }
  141. })
  142. message.success({ content: '成功' })
  143. setDataSubjectFormVisible(false)
  144. await queryDataBySelectedSubject()
  145. } finally {
  146. setDataSubjectFormLoading(false)
  147. }
  148. }
  149. const renderTree = (catalogues: IDictData[]) => (
  150. <>
  151. {catalogues.map((c, idx) => (
  152. <div
  153. key={c.dictCode ?? idx}
  154. className={classnames(styles.treeNode, {
  155. [styles.treeNodeSelected]: selectedSubjectsKey === c.dictCode
  156. })}
  157. >
  158. <span
  159. className={styles.treeNodeLeft}
  160. onClick={() => {
  161. setSelectedSubjectsKey(c.dictCode)
  162. }}
  163. >
  164. <Icon type="folder-open" />
  165. {c.dictLabel}
  166. </span>
  167. </div>
  168. ))}
  169. </>
  170. )
  171. useEffect(() => {
  172. async function query() {
  173. await querySubjects()
  174. // await queryDataBySelectedSubject()
  175. }
  176. query()
  177. }, [])
  178. useEffect(() => {
  179. if (isNumber(selectedSubjectsKey)) {
  180. queryDataBySelectedSubject()
  181. }
  182. }, [selectedSubjectsKey])
  183. return (
  184. <Container>
  185. <Helmet title="规则制定" />
  186. <ContainerBody>
  187. <Box>
  188. <Box.Header>
  189. <Box.Title>规则制定</Box.Title>
  190. </Box.Header>
  191. <Box.Body>
  192. <div className={styles.treeTableContainer}>
  193. <div className={styles.treeContainer}>
  194. <div className={styles.treeTitle}>
  195. <h6>主题</h6>
  196. </div>
  197. <div className={styles.treeContent}>
  198. <Spin spinning={treeLoading}>{renderTree(subjects)}</Spin>
  199. </div>
  200. </div>
  201. <div style={{ flex: 1 }}>
  202. <div style={{ padding: '0 0 20px' }}>
  203. <Button
  204. type="primary"
  205. icon="plus"
  206. onClick={() => {
  207. setDataSubjectFormVisible(true)
  208. setDataSubjectForm(null)
  209. }}
  210. >
  211. 新增
  212. </Button>
  213. </div>
  214. <Table
  215. style={{ flex: 1 }}
  216. bordered
  217. rowKey="id"
  218. loading={tableLoading}
  219. dataSource={dataSubject}
  220. columns={tableColumns}
  221. pagination={false}
  222. // onChange={this.tableChange}
  223. />
  224. </div>
  225. </div>
  226. <br />
  227. </Box.Body>
  228. </Box>
  229. </ContainerBody>
  230. <AuditClassificationFormModal
  231. visible={auditLoading}
  232. fromView={dataSubjectForm}
  233. onCancel={() => setAuditLoadingLoading(false)}
  234. />
  235. <DataSubjectFormModal
  236. visible={dataSubjectFormVisible}
  237. loading={dataSubjectFormLoading}
  238. fromView={dataSubjectForm}
  239. subject={selectedSubjectsKey}
  240. subjects={subjects}
  241. onSave={handleSaveDataSubject}
  242. onCancel={() => setDataSubjectFormVisible(false)}
  243. />
  244. </Container>
  245. )
  246. }
  247. export default compose()(DataDictionary)