index.tsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. import { PageContainer } from '@ant-design/pro-layout'
  2. import { useState, useEffect, useRef } from 'react'
  3. import ProTable from '@ant-design/pro-table'
  4. import type { ActionType } from '@ant-design/pro-table'
  5. import { ModalForm } from '@ant-design/pro-form'
  6. import type { ProFormInstance } from '@ant-design/pro-form'
  7. import type { ProFormColumnsType } from '@ant-design/pro-form'
  8. import { DeleteOutlined } from '@ant-design/icons'
  9. import { queryAcountList } from '@/services/api/institution'
  10. import consts from '@/utils/consts'
  11. import { Button, Form, message, Table } from 'antd'
  12. import { saveCreator } from '@/services/api/user'
  13. import { useRequest } from 'umi'
  14. import { getProjectList } from '@/services/api/project'
  15. import TreeNodeSelect from '../Management/List/components/TreeNodeSelect'
  16. enum CreatedModalType {
  17. ADD = '1',
  18. DEL = '2'
  19. }
  20. const Created = () => {
  21. const tRef = useRef<ActionType>(null)
  22. const mRef = useRef<ProFormInstance>(null)
  23. const [state, setState] = useState({
  24. dataID: null,
  25. modalType: CreatedModalType.ADD,
  26. options: [],
  27. projectList: [],
  28. modalVisible: false
  29. })
  30. const { run: tryQueryProjectList } = useRequest(
  31. createdID => getProjectList({ current: 1, pageSize: 21300, createdID }),
  32. {
  33. manual: true,
  34. onSuccess: ({ items }) => {
  35. setState({ ...state, projectList: items })
  36. }
  37. }
  38. )
  39. useEffect(() => {
  40. if (state.dataID && state.modalType === CreatedModalType.DEL) {
  41. tryQueryProjectList(state.dataID)
  42. }
  43. }, [state.dataID, state.modalType])
  44. const columns: ProFormColumnsType<AccountListItem>[] = [
  45. {
  46. dataIndex: 'account',
  47. title: '账号',
  48. width: 116,
  49. align: 'center',
  50. onHeaderCell: () => ({ style: { textAlign: 'center' } })
  51. },
  52. {
  53. dataIndex: 'name',
  54. title: '名称',
  55. width: 86,
  56. align: 'center',
  57. onHeaderCell: () => ({ style: { textAlign: 'center' } })
  58. },
  59. {
  60. dataIndex: 'institutionID',
  61. title: '企事业单位',
  62. width: 286,
  63. onHeaderCell: () => ({ style: { textAlign: 'center' } }),
  64. renderText: (_, record) => record?.institution?.name
  65. },
  66. {
  67. dataIndex: 'organizationalStructureID',
  68. title: '组织架构',
  69. width: 146,
  70. align: 'center',
  71. onHeaderCell: () => ({ style: { textAlign: 'center' } }),
  72. renderText: (_, record) => record?.organizationalStructure?.name
  73. },
  74. {
  75. dataIndex: 'opreate',
  76. title: '操作',
  77. width: 61,
  78. align: 'center',
  79. onHeaderCell: () => ({ style: { textAlign: 'center' } }),
  80. render: (_, record) => (
  81. <div
  82. className="text-hex-fd3995 cursor-pointer hover:text-hex-e7026e"
  83. onClick={() =>
  84. setState({
  85. ...state,
  86. dataID: record.ID,
  87. modalType: CreatedModalType.DEL,
  88. modalVisible: true
  89. })
  90. }>
  91. <DeleteOutlined />
  92. </div>
  93. )
  94. }
  95. ]
  96. const { run: trySaveCreator } = useRequest(saveCreator, {
  97. manual: true,
  98. onSuccess: () => {
  99. tRef?.current?.reload()
  100. return message.success('操作成功')
  101. }
  102. })
  103. const onFinish = async formData => {
  104. try {
  105. if (state.modalType === CreatedModalType.ADD) {
  106. await trySaveCreator({ ...formData, isCreated: 1 })
  107. } else {
  108. await trySaveCreator({ ID: state.dataID, isCreated: 0 })
  109. }
  110. tRef?.current?.reload()
  111. mRef?.current?.resetFields()
  112. setState({ ...state, modalVisible: false })
  113. return true
  114. } catch (error) {
  115. return false
  116. }
  117. }
  118. return (
  119. <PageContainer title={false}>
  120. <ProTable
  121. rowKey="ID"
  122. actionRef={tRef}
  123. columns={columns}
  124. search={false}
  125. toolbar={{
  126. actions: [
  127. <Button
  128. type="primary"
  129. onClick={() =>
  130. setState({ ...state, modalVisible: true, modalType: CreatedModalType.ADD })
  131. }>
  132. 添加创建人
  133. </Button>
  134. ]
  135. }}
  136. scroll={{ y: document.body.clientHeight - 313 }}
  137. request={async (params, filter, sort) => {
  138. const {
  139. code = -1,
  140. data: { items, total }
  141. } = await queryAcountList({ ...params, ...filter, ...sort, isCreated: 1 })
  142. return {
  143. success: code === consts.RET_CODE.SUCCESS,
  144. data: items,
  145. total
  146. }
  147. }}
  148. />
  149. <ModalForm
  150. title={state.modalType === CreatedModalType.ADD ? '添加创建人' : '移除创建人'}
  151. onFinish={onFinish}
  152. formRef={mRef}
  153. submitter={{
  154. submitButtonProps: {
  155. danger: state.modalType === CreatedModalType.ADD ? false : true
  156. }
  157. }}
  158. isKeyPressSubmit
  159. visible={state.modalVisible}
  160. onVisibleChange={visible => setState({ ...state, modalVisible: visible })}>
  161. {state.modalType === CreatedModalType.ADD ? (
  162. <>
  163. {/* <p className="mb-4">创建人可在前台创建项目、上传项目数据、编制项目等</p> */}
  164. <Form.Item
  165. name="ID"
  166. label="创建人可在前台创建项目、上传项目数据、编制项目等"
  167. rules={[{ required: true, message: '请选择创建人' }]}>
  168. <TreeNodeSelect params={{ isCreated: 0 }} />
  169. </Form.Item>
  170. {/* <ProFormSelect
  171. name="ID"
  172. request={async () => {
  173. const {
  174. code = -1,
  175. data: { items }
  176. } = await queryAcountInstitutionList({
  177. current: 1,
  178. pageSize: 21400,
  179. isCreated: '0'
  180. })
  181. return code === consts.RET_CODE.SUCCESS
  182. ? items.map(item => ({
  183. label: `${item.name} - ${item?.institution?.name}`,
  184. value: item.ID
  185. }))
  186. : []
  187. }}
  188. /> */}
  189. </>
  190. ) : (
  191. <>
  192. <p className="text-red-500">
  193. 当前创建人已经管理以下项目,移除后,这些项目对应创建人也将被移除。
  194. </p>
  195. <div className="mt-7">
  196. <Table
  197. rowKey="ID"
  198. columns={[
  199. // {
  200. // dataIndex: 'sort',
  201. // title: '序号',
  202. // render: (_, __, idx) => idx + 1,
  203. // width: '10%'
  204. // },
  205. { dataIndex: 'name', title: '项目名称' }
  206. ]}
  207. size="small"
  208. scroll={{ y: 250 }}
  209. dataSource={state.projectList}
  210. pagination={false}
  211. />
  212. </div>
  213. </>
  214. )}
  215. </ModalForm>
  216. </PageContainer>
  217. )
  218. }
  219. export default Created