index.js 23 KB

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