index.js 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809
  1. import React, { useState, useEffect } from 'react';
  2. import {
  3. Input,
  4. Tree,
  5. Table,
  6. Button,
  7. Form,
  8. DatePicker,
  9. Divider,
  10. Modal,
  11. Checkbox,
  12. TreeSelect,
  13. Upload,
  14. Space,
  15. message,
  16. Spin,
  17. } from 'antd';
  18. import dayjs from 'dayjs';
  19. import { useRequest, useModel } from '@umijs/max';
  20. import {
  21. queryDirCreate,
  22. queryDirList,
  23. queryFileDelete,
  24. queryFileList,
  25. queryFileUpload,
  26. queryOAFile,
  27. queryPermitList,
  28. querySetPermit,
  29. } from '../../services/file';
  30. import { queryGetContractList } from '../../services/contract';
  31. import { downloadFile, getToken } from '@/utils/utils';
  32. import {
  33. ExclamationCircleOutlined,
  34. PlusCircleOutlined,
  35. PlusOutlined,
  36. } from '@ant-design/icons';
  37. import AddFileModal from './components/model';
  38. import PerModal from './components/PreModal';
  39. import { queryAuditList, createAduit } from '@/services/boom';
  40. import { stringify } from 'qs';
  41. import FileViewerModal from '@/components/FileViewerNew';
  42. import AddModal from './components/AddModal';
  43. import { useMemo } from 'react';
  44. import PageContent from '@/components/PageContent';
  45. const tempData = [
  46. { name: '文件1', upload_user: '管理员', upload_time: '2023-04-08 11:00:00' },
  47. { name: '文件2', upload_user: '管理员', upload_time: '2023-04-10 11:00:00' },
  48. ];
  49. const tempPer = [
  50. { name: '管理员', list: 1, read: 1, download: 1, delete: 1, permission: 1 },
  51. { name: '徐俊杰', list: 1, read: 1, download: 0, delete: 0, permission: 0 },
  52. ];
  53. const { DirectoryTree } = Tree;
  54. const { Search } = Input;
  55. const { RangePicker } = DatePicker;
  56. function FileManagement(props) {
  57. const [form] = Form.useForm();
  58. const [modal, contextHolder] = Modal.useModal();
  59. const { initialState } = useModel('@@initialState');
  60. const user = initialState?.user || {};
  61. const { userList, run: userListRun } = useModel('userList');
  62. const [tableData, setTableData] = useState([]);
  63. const [visible, setVisible] = useState(false);
  64. const [node, setNode] = useState();
  65. const [selectedRowKeys, setSelectedRowKeys] = useState([]);
  66. const [fileViewerVisible, setFileViewerVisible] = useState(false);
  67. const [fileViewerData, setFileViewerData] = useState();
  68. const [editPer, setEditPer] = useState(false);
  69. const [preUserListData, setPreUserListData] = useState([]);
  70. const isSuper = useMemo(() => {
  71. if (user?.Permission['menu-001-audit']) return true;
  72. return false;
  73. }, [user]);
  74. const {
  75. data: treeData,
  76. loading: treeLoading,
  77. run: runFileDir,
  78. } = useRequest((data) => queryDirList(data), {
  79. formatResult: (res) => {
  80. const result = [];
  81. result[0] = res?.data.limit_list[0];
  82. result[1] = res?.data.list[0];
  83. return result;
  84. },
  85. });
  86. const { loading, run } = useRequest((data) => queryFileList(data), {
  87. manual: true,
  88. onSuccess: (data) => {
  89. let result =
  90. data?.list?.map((item, idx) => {
  91. return {
  92. ...item,
  93. dir_name: item.file_name,
  94. create_time: item.create_time,
  95. key: item.id,
  96. };
  97. }) || [];
  98. setTableData(result);
  99. setSelectedRowKeys([]);
  100. },
  101. });
  102. const { loading: OAloading, run: runOA } = useRequest(
  103. (data) => queryOAFile(data),
  104. {
  105. manual: true,
  106. onSuccess: (data) => {
  107. let result =
  108. data?.list.map((item, idx) => {
  109. let name;
  110. if (item?.name) {
  111. name = item.name;
  112. } else if (item?.path) {
  113. const list = item.path.split('/');
  114. name = list?.length > 0 ? list[list.length - 1] : '-';
  115. } else if (item?.url) {
  116. const list = item?.url?.split('/');
  117. name = list?.length > 0 ? list[list.length - 1] : '-';
  118. }
  119. return {
  120. ...item,
  121. dir_name: name,
  122. user_name: item.CreatorUser.CName,
  123. create_time: dayjs(item.c_time).format('YYYY-MM-DD'),
  124. key: item.id,
  125. };
  126. }) || [];
  127. setTableData(result);
  128. setSelectedRowKeys([]);
  129. },
  130. },
  131. );
  132. const { loading: contractLoading, run: runContract } = useRequest(
  133. (data) =>
  134. queryGetContractList({
  135. status: 3,
  136. name: data.file_name,
  137. check_start: data.start_time,
  138. check_end: data.end_time,
  139. }),
  140. {
  141. manual: true,
  142. onSuccess: (data) => {
  143. let result =
  144. data?.list.map((item, idx) => {
  145. return {
  146. ...item,
  147. dir_name: item.name,
  148. user_name: item.created_name,
  149. create_time: item.check_on,
  150. key: item.id,
  151. };
  152. }) || [];
  153. setTableData(result);
  154. setSelectedRowKeys([]);
  155. },
  156. },
  157. );
  158. const { loading: createLoading, run: RunCreate } = useRequest(
  159. (data) => queryDirCreate(data),
  160. {
  161. manual: true,
  162. onSuccess: () => {
  163. setVisible(false);
  164. runFileDir();
  165. message.success('创建成功');
  166. },
  167. onError: () => {
  168. message.success('创建失败');
  169. },
  170. },
  171. );
  172. //文件授权
  173. const { loading: perLoading, run: runPer } = useRequest(
  174. (data) => querySetPermit(data),
  175. {
  176. manual: true,
  177. onSuccess: (data) => {
  178. setAddOpen(false);
  179. const params = {
  180. file_type: node.dir_type,
  181. file_ids: selectedRowKeys[0].toString(),
  182. permit_type: 1,
  183. };
  184. runPreUserList(params);
  185. message.success('授权成功');
  186. },
  187. onError: () => {
  188. message.error('授权失败');
  189. },
  190. },
  191. );
  192. //上传文件
  193. const { run: runUploadFiles } = useRequest((data) => queryFileUpload(data), {
  194. manual: true,
  195. onSuccess: (data) => {
  196. updateTableFile(node);
  197. message.success('文件上传成功');
  198. },
  199. onError: () => {
  200. message.error('文件上传失败');
  201. },
  202. });
  203. //文件审批列表
  204. const { data: auditList } = useRequest(() =>
  205. queryAuditList({ flow_type: 1 }),
  206. );
  207. //发起申请权限的文件审批
  208. const { loading: createLoadin, run: runAuditCreate } = useRequest(
  209. createAduit,
  210. {
  211. manual: true,
  212. onSuccess() {
  213. message.success('申请审批成功');
  214. setPerOpen(false);
  215. },
  216. },
  217. );
  218. //当前用户文档权限列表
  219. const {
  220. data: preListData,
  221. loading: preListLoading,
  222. run: runPreList,
  223. } = useRequest((data) => queryPermitList(data), {
  224. manual: true,
  225. });
  226. //当前文件的所有用户的权限列表
  227. const {
  228. // data: preUserListData,
  229. loading: preUserListLoading,
  230. run: runPreUserList,
  231. } = useRequest((data) => queryPermitList(data), {
  232. manual: true,
  233. onSuccess: (data) => {
  234. if (!data.list) return [];
  235. const Ids = data.list?.map((item) => item.user_id);
  236. const result = [...new Set(Ids)].map((id) => {
  237. const userPres = data.list
  238. .filter((item) => item.user_id == id)
  239. .map((item) => item.permit);
  240. const user_name = userList?.find((item) => item.ID == id)?.CName;
  241. const downPermit =
  242. userPres.findIndex((pre) => pre == 1) > -1 ? true : false;
  243. const delPermit =
  244. userPres.findIndex((pre) => pre == 2) > -1 ? true : false;
  245. return {
  246. user_id: id,
  247. user_name,
  248. delPermit,
  249. downPermit,
  250. disabled: id == 7 ? true : false,
  251. };
  252. });
  253. setPreUserListData(result?.sort((a, b) => a.user_id - b.user_id));
  254. },
  255. });
  256. //删除文件
  257. const { loading: delFileLoading, run: runDelFile } = useRequest(
  258. (data) => queryFileDelete(data),
  259. {
  260. manual: true,
  261. onSuccess: () => {
  262. updateTableFile(node);
  263. message.success('删除成功');
  264. },
  265. onError: () => {
  266. message.success('删除失败');
  267. },
  268. },
  269. );
  270. const [expandedKeys, setExpandedKeys] = useState([]);
  271. const [searchValue, setSearchValue] = useState('');
  272. const [permissionOpen, setPerOpen] = useState(false);
  273. const [addOpen, setAddOpen] = useState(false);
  274. const delConfirm = (record) => {
  275. modal.confirm({
  276. title: '删除',
  277. icon: <ExclamationCircleOutlined />,
  278. content: `确定删除文件${record.dir_name}, 删除后不能恢复`,
  279. okText: '确认',
  280. cancelText: '取消',
  281. onOk: () => runDelFile({ file_id: record.id }),
  282. });
  283. };
  284. const delPreConfirm = (record) => {
  285. const data = {
  286. user_id: record.user_id,
  287. file_type: node?.dir_type,
  288. permit: '1,2',
  289. file_id: selectedRowKeys[0],
  290. action_type: 1, // 1 删除权限
  291. };
  292. // runPer(data);
  293. modal.confirm({
  294. title: '删除',
  295. icon: <ExclamationCircleOutlined />,
  296. content: `是否取消对${record.user_name}的授权?`,
  297. okText: '确认',
  298. cancelText: '取消',
  299. onOk: () => runPer(data),
  300. });
  301. };
  302. const isShow = (id, num) => {
  303. //num 下载 1 删除 2
  304. let bool = false;
  305. const idx = preListData?.list?.findIndex(
  306. (item) => item.file_id == id && item.permit == num,
  307. );
  308. if (idx > -1) bool = true;
  309. return bool;
  310. };
  311. const columns = [
  312. { title: '文档名称', dataIndex: 'dir_name' },
  313. { title: '上传人员', align: 'center', dataIndex: 'user_name' },
  314. {
  315. title: '上传时间',
  316. align: 'center',
  317. dataIndex: 'created_on',
  318. render: (text) => dayjs(text).format('YYYY-MM-DD'),
  319. },
  320. {
  321. title: '操作',
  322. render: (record) => (
  323. <Space>
  324. {!(!record.classify_id && record.file_type == 1) && (
  325. <a onClick={() => handleSeeClick(record)}>查看</a> //部门文件中的文件夹不展示查看
  326. )}
  327. {isShow(record.id, 1) && (
  328. <a onClick={() => onDownload(record)}>下载</a>
  329. )}
  330. {isShow(record.id, 2) && node?.dir_type == 0 && (
  331. <a onClick={() => delConfirm(record)}>删除</a>
  332. )}
  333. </Space>
  334. ),
  335. },
  336. ];
  337. const columnsPer = [
  338. { title: '用户', dataIndex: 'user_name' },
  339. {
  340. title: '查看列表',
  341. render: () => <Checkbox checked={true} disabled />,
  342. },
  343. {
  344. title: '只读',
  345. render: () => <Checkbox checked={true} disabled />,
  346. },
  347. {
  348. title: '下载',
  349. // dataIndex: 'downPermit',
  350. render: (record) => (
  351. <Checkbox
  352. checked={record.downPermit}
  353. onChange={(e) => handlePreChange(record, e.target.checked, '1')}
  354. disabled={record.disabled}
  355. />
  356. ),
  357. },
  358. {
  359. title: '删除',
  360. // dataIndex: 'delPermit',
  361. render: (record) => (
  362. <Checkbox
  363. checked={record.delPermit}
  364. onChange={(e) => handlePreChange(record, e.target.checked, '2')}
  365. disabled={record.disabled}
  366. />
  367. ),
  368. },
  369. {
  370. title: '授权',
  371. dataIndex: 'permission',
  372. render: (value, _) => <Checkbox checked={value} disabled={!editPer} />,
  373. },
  374. {
  375. title: '操作',
  376. render: (record) => <a onClick={() => delPreConfirm(record)}>删除</a>,
  377. },
  378. ];
  379. const handlePreChange = (record, checked, permit) => {
  380. //checked 为true false->true 设置权限 反之删除权限
  381. const data = {
  382. user_id: record.user_id,
  383. file_type: node?.dir_type,
  384. permit,
  385. file_id: selectedRowKeys[0],
  386. action_type: checked ? 0 : 1, // 0 设置权限 1 删除权限
  387. };
  388. runPer(data);
  389. };
  390. const handlerEditClick = (record) => {
  391. const newData = [...preUserListData];
  392. const curIdx = preUserListData.findIndex(
  393. (item) => item.user_id == record.user_id,
  394. );
  395. newData[curIdx] = { ...newData[curIdx], disabled: false };
  396. setPreUserListData(newData);
  397. };
  398. useEffect(() => {
  399. userListRun();
  400. }, []);
  401. useEffect(() => {
  402. //获取列表的权限
  403. if (!tableData || tableData.length <= 0) return;
  404. const ids = tableData.map((item) => item.id);
  405. const data = {
  406. file_type: node.dir_type,
  407. file_ids: ids?.join(','),
  408. permit_type: 0,
  409. };
  410. runPreList(data);
  411. }, [tableData]);
  412. useEffect(() => {
  413. if (selectedRowKeys.length > 0) {
  414. const data = {
  415. file_type: node.dir_type,
  416. file_ids: selectedRowKeys[0].toString(),
  417. permit_type: 1,
  418. };
  419. runPreUserList(data);
  420. }
  421. }, [selectedRowKeys]);
  422. const showPerBtn = useMemo(() => {
  423. //申请权限按钮默认不可点击
  424. let bool = true;
  425. if (selectedRowKeys.length > 0) {
  426. const selectfile = tableData?.find(
  427. (item) => item.key == selectedRowKeys[0],
  428. );
  429. //不是文件夹并且 有还没有的权限时可店家申请权限按钮
  430. if (
  431. !(!selectfile.classify_id && selectfile.file_type == 1) &&
  432. !(isShow(selectedRowKeys[0], 1) && isShow(selectedRowKeys[0], 2))
  433. ) {
  434. bool = false;
  435. }
  436. }
  437. return bool;
  438. }, [selectedRowKeys]);
  439. // 搜索文件夹树
  440. const onSearchDirectory = (value, nodes = treeData) => {
  441. const expandedKeys = getExpandedKeys(nodes, value);
  442. setExpandedKeys(expandedKeys);
  443. setSearchValue(value);
  444. };
  445. // 根据搜索值(value)获取key列表
  446. const getExpandedKeys = (nodes, value) => {
  447. if (!value) return [];
  448. let result = [];
  449. nodes.forEach((node) => {
  450. // 若该节点名称包含搜索值,将key加入result
  451. if (node.dir_name.includes(value)) {
  452. result.push(node.id);
  453. }
  454. // 若该节点的子节点包含搜索值,将子节点key和该节点key加入result
  455. if (node.children) {
  456. let getChildren = getExpandedKeys(node.children, value);
  457. if (getChildren.length != 0)
  458. result = [...result, node.id, ...getChildren];
  459. }
  460. });
  461. return result;
  462. };
  463. const onExpand = (expandedKeys) => {
  464. setExpandedKeys(expandedKeys);
  465. };
  466. const filterTreeNode = (node) =>
  467. searchValue.length > 0 ? node.dir_name.includes(searchValue) : false;
  468. // 搜索文件
  469. const onSearch = () => {
  470. form
  471. .validateFields()
  472. .then((values) => {
  473. const start_time = values?.date
  474. ? dayjs(values?.date[0]).format('YYYY-MM-DD 00:00:00')
  475. : null;
  476. const end_time = values?.date
  477. ? dayjs(values?.date[1]).format('YYYY-MM-DD 23:59:59')
  478. : null;
  479. const req = { start_time, end_time, file_name: values.file_name };
  480. updateTableFile(node, req);
  481. })
  482. .catch((err) => {
  483. console.log(err);
  484. return;
  485. });
  486. };
  487. const findListById = (id) => {
  488. if (!id) return;
  489. const fun = (data) => {
  490. for (let i = 0; i < data.length; i++) {
  491. let item = data[i];
  492. if (item.id == id) {
  493. return item.children;
  494. } else if (item.children) {
  495. let res = fun(item.children);
  496. if (res) return res;
  497. }
  498. }
  499. };
  500. const list = fun(treeData);
  501. return list?.map((item, idx) => {
  502. return { ...item, key: idx };
  503. });
  504. };
  505. const updateTableFile = (node, req = {}) => {
  506. if (node.id == 1) {
  507. //点击受控文件直接把文件夹下的文件夹列表显示出来 或者直接展示空表格因为一些选中授权操作不能做
  508. // setTableData(findListById(1));
  509. setTableData([]);
  510. setSelectedRowKeys([]);
  511. } else if (node.id == 3) {
  512. //点击合同文件直接把文件夹下的文件夹列表显示出来 或者直接展示空表格因为一些选中授权操作不能做
  513. // setTableData(findListById(3));
  514. setTableData([]);
  515. setSelectedRowKeys([]);
  516. } else if (node.id == 7) {
  517. //合同归档走合同接口
  518. runContract(req);
  519. } else if (node.is_limit) {
  520. //其他受控文件走classify_id
  521. runOA({ ...req, classify_id: node.classify_id });
  522. } else {
  523. //部门文件
  524. run({ ...req, dir_id: node.id });
  525. }
  526. };
  527. const handleSelect = (SelectKeys, e) => {
  528. // console.log(e, SelectKeys);
  529. const node = e.node;
  530. setNode(node);
  531. updateTableFile(e.node);
  532. };
  533. const onDownload = (record) => {
  534. const data = {
  535. file_id: record.id,
  536. path: record.path,
  537. file_type: node.dir_type,
  538. };
  539. window.downloadFile(
  540. `/api/archive/v1/file/download?${stringify(data)}`,
  541. record.dir_name,
  542. false,
  543. );
  544. };
  545. const handleSeeClick = (record) => {
  546. if (node?.dir_type == 2) {
  547. // 合同归档
  548. if (!record.attach) return;
  549. const attach = JSON.parse(record.attach);
  550. setFileViewerData(attach);
  551. setFileViewerVisible(true);
  552. } else {
  553. const token = getToken();
  554. const params = {
  555. file_id: record.id,
  556. path: record.path,
  557. file_type: node.dir_type,
  558. 'JWT-TOKEN': token,
  559. };
  560. const url = `${location.origin}/api/archive/v1/file/download?${stringify(
  561. params,
  562. )}`;
  563. const arr = record.dir_name.split('.');
  564. const type = arr[arr.length - 1];
  565. const data = { url, name: record.dir_name, type };
  566. setFileViewerData(data);
  567. setFileViewerVisible(true);
  568. }
  569. };
  570. const handleFilesChange = () => {
  571. const inputDom = document.getElementById('files');
  572. let formData = new FormData();
  573. formData.append('dir_id', node.id);
  574. formData.append('user_name', user.CName);
  575. if (inputDom.files?.length > 0) {
  576. for (let i = 0; i < inputDom.files.length; i++) {
  577. formData.append('files', inputDom.files[i]);
  578. }
  579. runUploadFiles(formData);
  580. }
  581. };
  582. return (
  583. <PageContent>
  584. <div style={{ display: 'flex', justifyContent: 'space-between' }}>
  585. <div style={{ height: '100%', width: '30%' }}>
  586. <Search
  587. style={{ marginBottom: 20 }}
  588. onChange={(e) => onSearchDirectory(e.target.value)}
  589. />
  590. <Spin spinning={treeLoading}>
  591. <DirectoryTree
  592. expandedKeys={expandedKeys}
  593. onExpand={onExpand}
  594. treeData={treeData}
  595. onSelect={handleSelect}
  596. fieldNames={{
  597. key: 'id',
  598. title: 'dir_name',
  599. children: 'children',
  600. }}
  601. filterTreeNode={filterTreeNode}
  602. titleRender={(item) => {
  603. return item.dir_name == '部门文件' ? (
  604. <Space>
  605. <span>{item.dir_name}</span>
  606. <PlusCircleOutlined
  607. style={{ fontSize: '16px' }}
  608. onClick={() => {
  609. setNode(item);
  610. setVisible(true);
  611. }}
  612. />
  613. </Space>
  614. ) : (
  615. <span>{item.dir_name}</span>
  616. );
  617. }}
  618. style={{ maxHeight: '78vh', overflowY: 'auto' }}
  619. />
  620. </Spin>
  621. </div>
  622. <div style={{ height: '100%', width: 'calc(70% - 20px)' }}>
  623. <Form layout="inline" form={form}>
  624. <Form.Item name="date">
  625. <RangePicker />
  626. </Form.Item>
  627. <Form.Item name="file_name">
  628. <Input />
  629. </Form.Item>
  630. <Form.Item>
  631. <Button type="primary" onClick={onSearch}>
  632. 查询
  633. </Button>
  634. </Form.Item>
  635. {node?.dir_type == 0 && (
  636. <Form.Item>
  637. <Button
  638. type="primary"
  639. onClick={() => document.getElementById('files')?.click()}
  640. disabled={node ? false : true}
  641. >
  642. 上传
  643. </Button>
  644. </Form.Item>
  645. )}
  646. {/* <Form.Item>
  647. <Button
  648. type="primary"
  649. onClick={() => setPerOpen(true)}
  650. disabled={
  651. showPerBtn
  652. // selectedRowKeys?.length > 0 &&
  653. // // !(!record.classify_id && record.file_type == 1) &&
  654. // !(
  655. // isShow(selectedRowKeys[0], 1) &&
  656. // isShow(selectedRowKeys[0], 2)
  657. // )
  658. // ? false
  659. // : true
  660. }
  661. >
  662. 申请权限
  663. </Button>
  664. </Form.Item> */}
  665. {isSuper && (
  666. <Form.Item>
  667. <Button
  668. type="primary"
  669. onClick={() => setAddOpen(true)}
  670. disabled={selectedRowKeys?.length > 0 ? false : true}
  671. >
  672. <PlusOutlined />
  673. 新增权限
  674. </Button>
  675. </Form.Item>
  676. )}
  677. </Form>
  678. <div style={{ marginTop: 20 }}>
  679. <Table
  680. columns={columns}
  681. dataSource={tableData}
  682. rowSelection={{
  683. selectedRowKeys,
  684. type: 'radio',
  685. onChange: (e, fileNode) => {
  686. console.log(e);
  687. setSelectedRowKeys(e);
  688. // (fileNode[0])
  689. },
  690. }}
  691. loading={OAloading || contractLoading || loading}
  692. style={{ overflowY: 'auto' }}
  693. childrenColumnName="none"
  694. pagination={false}
  695. />
  696. {isSuper && selectedRowKeys?.length > 0 && (
  697. <>
  698. <div
  699. style={{
  700. marginTop: '30px',
  701. fontWeight: 'bold',
  702. fontSize: '20px',
  703. }}
  704. >
  705. {
  706. tableData?.find((item) => item.key == selectedRowKeys[0])
  707. ?.dir_name
  708. }
  709. 》权限列表
  710. </div>
  711. <Table
  712. loading={preUserListLoading}
  713. columns={columnsPer}
  714. dataSource={preUserListData}
  715. style={{ overflowY: 'auto' }}
  716. />
  717. </>
  718. )}
  719. </div>
  720. </div>
  721. <Input
  722. id="files"
  723. type="file"
  724. style={{ display: 'none' }}
  725. onChange={handleFilesChange}
  726. multiple
  727. />
  728. {contextHolder}
  729. </div>
  730. <AddModal
  731. node={node}
  732. userList={userList}
  733. havePreList={[]}
  734. fileNode={tableData?.find((item) => item.key == selectedRowKeys[0])}
  735. addOpen={addOpen}
  736. onCancel={() => setAddOpen(false)}
  737. onOk={(data) => runPer(data)}
  738. />
  739. <AddFileModal
  740. id={node?.id}
  741. visible={visible}
  742. handleOk={(value) => {
  743. RunCreate({ ...value, user_name: user?.CName });
  744. }}
  745. handleCancel={() => setVisible(false)}
  746. />
  747. <PerModal
  748. node={node}
  749. fileNode={tableData?.find((item) => item.key == selectedRowKeys[0])}
  750. auditList={auditList}
  751. visible={permissionOpen}
  752. handleCancel={() => setPerOpen(false)}
  753. handleOk={(data) => {
  754. runAuditCreate(data);
  755. }}
  756. />
  757. <FileViewerModal
  758. data={fileViewerData}
  759. visible={fileViewerVisible}
  760. downloadFile={() => {}}
  761. onCancel={() => {
  762. setFileViewerVisible(false);
  763. }}
  764. />
  765. </PageContent>
  766. );
  767. }
  768. export default FileManagement;