index.js 23 KB

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