index.tsx 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. import React, {
  2. useCallback,
  3. useEffect,
  4. useMemo,
  5. useRef,
  6. useState,
  7. } from "react";
  8. import styles from "./index.module.scss";
  9. import { Button, Input, Popconfirm, Select, Table, Tooltip, Popover, Radio, Checkbox } from "antd";
  10. import { DownOutlined } from '@ant-design/icons';
  11. import { useDispatch, useSelector } from "react-redux";
  12. import { RootState } from "@/store";
  13. import { A1TableType } from "@/types";
  14. import A1Add from "./A1Add";
  15. import A1Down from "./A1Down";
  16. import A1Look from "./A1Look";
  17. import { A1_APIgetList, A1_APIdelProject } from "@/store/action/A1Project";
  18. import { A2_APIgetList1 } from "@/store/action/A2Dict";
  19. import { hasAuditStatusArr } from "./data";
  20. import { MessageFu } from "@/utils/message";
  21. import AuthCom from "@/components/AuthCom";
  22. import type { CheckboxProps, GetProp } from 'antd';
  23. type CheckboxValueType = GetProp<typeof Checkbox.Group, 'value'>[number];
  24. function A1Project() {
  25. const dispatch = useDispatch();
  26. useEffect(() => {
  27. // 获取 字典 的 职能(项目详情的项目成员用) 和 状态(这个页面用)
  28. dispatch(A2_APIgetList1());
  29. }, [dispatch]);
  30. // 从仓库 获取 项目状态的下拉框 数据
  31. const statusArr = useSelector(
  32. (state: RootState) => state.A2Dict.A2Tab1_1Obj.status
  33. );
  34. // 顶部的试图切换
  35. const [topType, setTopType] = useState<"outer" | "inner">("outer");
  36. // 表单数据
  37. const [fromData, setFromData] = useState({
  38. searchKey: "",
  39. pmName: "",
  40. bmName: "",
  41. statusId: "",
  42. hasAuditStatus: "",
  43. projectRole: "",
  44. pageNum: 1,
  45. pageSize: 10,
  46. type: "inside",
  47. dictProjectBusinessIds: '', // 业务类型id
  48. dictProjectScopeIds: '', // 项目范围id
  49. dictProjectAppIds: '', // 客户端id
  50. });
  51. // 封装发送请求的函数
  52. const A1getListFu = useCallback(() => {
  53. dispatch(A1_APIgetList(fromData));
  54. }, [dispatch, fromData]);
  55. useEffect(() => {
  56. A1getListFu();
  57. }, [A1getListFu]);
  58. // 项目编号/项目名称/建设单位 的 输入
  59. const searchKeyTime = useRef(-1);
  60. const searchKeyChange = useCallback(
  61. (
  62. e: React.ChangeEvent<HTMLInputElement>,
  63. key: "searchKey" | "pmName" | "bmName"
  64. ) => {
  65. clearTimeout(searchKeyTime.current);
  66. searchKeyTime.current = window.setTimeout(() => {
  67. setFromData({
  68. ...fromData,
  69. [key]: e.target.value,
  70. pageNum: 1,
  71. });
  72. }, 500);
  73. },
  74. [fromData]
  75. );
  76. // 点击重置
  77. const [inputKey, setInputKey] = useState(1);
  78. const resetSelectFu = useCallback(() => {
  79. // 把2个输入框和时间选择器清空
  80. setInputKey(Date.now());
  81. setFromData({
  82. searchKey: "",
  83. pmName: "",
  84. bmName: "",
  85. statusId: "",
  86. hasAuditStatus: "",
  87. projectRole: "",
  88. pageNum: 1,
  89. pageSize: 10,
  90. type: "inside",
  91. dictProjectBusinessIds: '', // 业务类型id
  92. dictProjectScopeIds: '', // 项目范围id
  93. dictProjectAppIds: '', // 客户端id
  94. });
  95. }, []);
  96. // 点击顶部的切换视图 按钮
  97. const topTypeFu = useCallback(
  98. (val: "outer" | "inner") => {
  99. if (topType === val) return;
  100. setTopType(val);
  101. resetSelectFu();
  102. },
  103. [resetSelectFu, topType]
  104. );
  105. // 权限-------项目视图 和 内控文件视图
  106. const authArr = useSelector((state: RootState) => state.A4Role.A4RoleAll);
  107. useEffect(() => {
  108. // 没有项目文件视图权限,一定有内控文件视图权限
  109. if (!authArr.includes("1010")) setTopType("inner");
  110. }, [authArr]);
  111. // 从仓库获取表格数据
  112. const tableInfo = useSelector(
  113. (state: RootState) => state.A1Project.tableInfo
  114. );
  115. /**
  116. * 业务类型 相关逻辑
  117. */
  118. // 从仓库 获取 业务类型 数据
  119. const projectBusinessArr = useSelector(
  120. (state: RootState) => state.A2Dict.A2Tab1_1Obj.projectBusiness
  121. );
  122. const projectBusinessArrForCheckbox = projectBusinessArr.map((v) => {
  123. return {
  124. label: v.name,
  125. value: v.id,
  126. }
  127. });
  128. // 选中的选项
  129. const [checkedProjectBusinessArr, setCheckedProjectBusinessArr] = useState<CheckboxValueType[]>([]);
  130. // 是否已全选
  131. const isProjectBusinessAllChecked = projectBusinessArr.length === checkedProjectBusinessArr.length;
  132. // 是否选了一部分
  133. const isProjectBusinessPartiallyChecked = checkedProjectBusinessArr.length > 0 && checkedProjectBusinessArr.length < projectBusinessArr.length;
  134. // 全选项 选中状态变化
  135. const onProjectBusinessCheckAllChange: CheckboxProps['onChange'] = (e) => {
  136. setCheckedProjectBusinessArr(e.target.checked ? projectBusinessArr.map((i) => {return i.id}) : []);
  137. };
  138. // 普通选项 选中状态变化
  139. const onProjectBusinessNormalCheckboxChange = (list: CheckboxValueType[]) => {
  140. setCheckedProjectBusinessArr(list);
  141. };
  142. useEffect(() => {
  143. setFromData(currentFromData => ({
  144. ...currentFromData,
  145. dictProjectBusinessIds: checkedProjectBusinessArr.join(','),
  146. pageNum: 1
  147. }));
  148. }, [checkedProjectBusinessArr]);
  149. /**
  150. * end of 业务类型 相关逻辑
  151. */
  152. /**
  153. * 项目范围 相关逻辑
  154. */
  155. // 从仓库 获取 项目范围 数据
  156. const projectScopeArr = useSelector(
  157. (state: RootState) => state.A2Dict.A2Tab1_1Obj.projectScope
  158. );
  159. const projectScopeArrForCheckbox = projectScopeArr.map((v) => {
  160. return {
  161. label: v.name,
  162. value: v.id,
  163. }
  164. });
  165. // 选中的选项
  166. const [checkedProjectScopeArr, setCheckedProjectScopeArr] = useState<CheckboxValueType[]>([]);
  167. // 是否已全选
  168. const isProjectScopeAllChecked = projectScopeArrForCheckbox.length === checkedProjectScopeArr.length;
  169. // 是否选了一部分
  170. const isProjectScopePartiallyChecked = checkedProjectScopeArr.length > 0 && checkedProjectScopeArr.length < projectScopeArr.length;
  171. // 全选项 选中状态变化
  172. const onProjectScopeCheckAllChange: CheckboxProps['onChange'] = (e) => {
  173. setCheckedProjectScopeArr(e.target.checked ? projectScopeArrForCheckbox.map((i) => {return i.value}) : []);
  174. };
  175. // 普通选项 选中状态变化
  176. const onProjectScopeNormalCheckboxChange = (list: CheckboxValueType[]) => {
  177. setCheckedProjectScopeArr(list);
  178. };
  179. useEffect(() => {
  180. setFromData(currentFromData => ({
  181. ...currentFromData,
  182. dictProjectScopeIds: checkedProjectScopeArr.join(','),
  183. pageNum: 1
  184. }));
  185. }, [checkedProjectScopeArr]);
  186. /**
  187. * end of 项目范围 相关逻辑
  188. */
  189. /**
  190. * 客户端 相关逻辑
  191. */
  192. // 从仓库 获取 客户端 数据
  193. const projectAppArr = useSelector(
  194. (state: RootState) => state.A2Dict.A2Tab1_1Obj.projectApp
  195. );
  196. const projectAppArrForCheckbox = projectAppArr.map((v) => {
  197. return {
  198. label: v.name,
  199. value: v.id,
  200. }
  201. });
  202. // 选中的选项
  203. const [checkedProjectAppArr, setCheckedProjectAppArr] = useState<CheckboxValueType[]>([]);
  204. // 是否已全选
  205. const isProjectAppAllChecked = projectAppArrForCheckbox.length === checkedProjectAppArr.length;
  206. // 是否选了一部分
  207. const isProjectAppPartiallyChecked = checkedProjectAppArr.length > 0 && checkedProjectAppArr.length < projectAppArr.length;
  208. // 全选项 选中状态变化
  209. const onProjectAppCheckAllChange: CheckboxProps['onChange'] = (e) => {
  210. setCheckedProjectAppArr(e.target.checked ? projectAppArrForCheckbox.map((i) => {return i.value}) : []);
  211. };
  212. // 普通选项 选中状态变化
  213. const onProjectAppNormalCheckboxChange = (list: CheckboxValueType[]) => {
  214. setCheckedProjectAppArr(list);
  215. };
  216. useEffect(() => {
  217. setFromData(currentFromData => ({
  218. ...currentFromData,
  219. dictProjectAppIds: checkedProjectAppArr.join(','),
  220. pageNum: 1
  221. }));
  222. }, [checkedProjectAppArr]);
  223. /**
  224. * end of 客户端 相关逻辑
  225. */
  226. /**
  227. * 项目类型筛选按钮显示的文字
  228. */
  229. const [projectTypeCurrentText, setProjectTypeCurrentText] = useState('全部类型')
  230. useEffect(() => {
  231. setProjectTypeCurrentText(v => {
  232. if (
  233. (checkedProjectBusinessArr.length === 0 && checkedProjectScopeArr.length === 0 && checkedProjectAppArr.length === 0) ||
  234. (checkedProjectBusinessArr.length === projectBusinessArr.length && checkedProjectScopeArr.length === projectScopeArr.length && checkedProjectAppArr.length === projectAppArr.length)
  235. ) {
  236. return '全部类型'
  237. } else {
  238. // 把checkedProjectBusinessArr各元素对应的name存入一个数组
  239. const checkedProjectBusinessArrName = checkedProjectBusinessArr.map(v => {
  240. const item = projectBusinessArr.find(i => i.id === v)
  241. return item ? item.name : ''
  242. })
  243. // 把checkedProjectScopeArr各元素对应的name存入一个数组
  244. const checkedProjectScopeArrName = checkedProjectScopeArr.map(v => {
  245. const item = projectScopeArr.find(i => i.id === v)
  246. return item ? item.name : ''
  247. })
  248. // 把checkedProjectAppArr各元素对应的name存入一个数组
  249. const checkedProjectAppArrName = checkedProjectAppArr.map(v => {
  250. const item = projectAppArr.find(i => i.id === v)
  251. return item ? item.name : ''
  252. })
  253. // 把3个数组合并成一个数组,再转成字符串
  254. return checkedProjectBusinessArrName.concat(checkedProjectScopeArrName, checkedProjectAppArrName).join(',')
  255. }
  256. })
  257. }, [
  258. checkedProjectBusinessArr,
  259. checkedProjectScopeArr,
  260. checkedProjectAppArr,
  261. projectBusinessArr,
  262. projectScopeArr,
  263. projectAppArr
  264. ])
  265. // 页码变化
  266. const paginationChange = useCallback(
  267. () => (pageNum: number, pageSize: number) => {
  268. setFromData({ ...fromData, pageNum, pageSize });
  269. },
  270. [fromData]
  271. );
  272. // 点击删除
  273. const delById = useCallback(
  274. async (id: number) => {
  275. const res = await A1_APIdelProject(id);
  276. if (res.code === 0) {
  277. MessageFu.success("删除成功!");
  278. A1getListFu();
  279. }
  280. },
  281. [A1getListFu]
  282. );
  283. // 点击下载
  284. const [downId, setDownId] = useState({ id: 0, txt: "" });
  285. // 点击审批
  286. const lookTabType = useRef(false);
  287. // 待审批,通过,驳回 的 格式处理
  288. const pcsTxt = useCallback((s1: string, s2: string, s3: string) => {
  289. const ss1 = s1 ? s1 : "0";
  290. const ss2 = s2 ? `/${s2}` : "/0";
  291. const ss3 = s3 ? `/${s3}` : "/0";
  292. return ss1 + ss2 + ss3;
  293. }, []);
  294. // 如果 项目详情 -5个tab都没有设置权限
  295. const tabFlag = useMemo(() => {
  296. let flag = false;
  297. if (
  298. !authArr.includes("1080") &&
  299. !authArr.includes("1115") &&
  300. !authArr.includes("1090") &&
  301. !authArr.includes("1100") &&
  302. !authArr.includes("1110")
  303. ) {
  304. flag = true;
  305. }
  306. return flag;
  307. }, [authArr]);
  308. const columns = useMemo(() => {
  309. const arr: any = [
  310. {
  311. title: "项目编号",
  312. dataIndex: "num",
  313. },
  314. {
  315. title: "项目名称",
  316. dataIndex: "name",
  317. },
  318. {
  319. title: "建设单位",
  320. render: (item: A1TableType) => (item.unit ? item.unit : "(空)"),
  321. },
  322. {
  323. title: "项目地点",
  324. render: (item: A1TableType) =>
  325. item.province ? item.province : "(空)",
  326. },
  327. {
  328. title: "项目周期",
  329. render: (item: A1TableType) =>
  330. item.dateScope ? item.dateScope : "(空)",
  331. },
  332. {
  333. title: "项目经理",
  334. render: (item: A1TableType) =>
  335. item.snapPmUser ? item.snapPmUser : "(空)",
  336. },
  337. {
  338. title: "商务经理",
  339. render: (item: A1TableType) =>
  340. item.snapBmUser ? item.snapBmUser : "(空)",
  341. },
  342. {
  343. title: "项目状态",
  344. render: (item: A1TableType) =>
  345. item.statusName ? item.statusName : "(空)",
  346. },
  347. ];
  348. if (topType === "inner") {
  349. arr.push(
  350. {
  351. title: "收集文件类型",
  352. render: (item: A1TableType) =>
  353. item.pcsCollect ? item.pcsCollect : "(空)",
  354. },
  355. {
  356. width: 164,
  357. title: (
  358. <Tooltip title="该项目内控文件的审批状态和数量">
  359. <div className="iconHoverTit">
  360. 待审批/通过/驳回&nbsp;
  361. <div className="iconHoverTitTxt">?</div>
  362. </div>
  363. </Tooltip>
  364. ),
  365. render: (item: A1TableType) =>
  366. pcsTxt(item.pcs0, item.pcs1, item.pcs2),
  367. }
  368. );
  369. }
  370. arr.push({
  371. width: 130,
  372. title: "存在待审批文件",
  373. render: (item: A1TableType) => (item.hasAuditStatus ? "是" : "否"),
  374. });
  375. arr.push({
  376. title: "最近编辑时间",
  377. dataIndex: "updateTime",
  378. });
  379. arr.push({
  380. title: "操作",
  381. render: (item: A1TableType) => (
  382. <>
  383. <Button
  384. hidden={tabFlag}
  385. size="small"
  386. type="text"
  387. onClick={() => {
  388. lookTabType.current = false;
  389. setPageType({
  390. txt: "look",
  391. id: item.id,
  392. tit: item.num + " - " + item.name,
  393. });
  394. }}
  395. >
  396. 查看
  397. </Button>
  398. {topType === "inner" ? (
  399. <>
  400. <AuthCom aId="1104">
  401. <Button
  402. hidden={tabFlag}
  403. size="small"
  404. type="text"
  405. onClick={() => {
  406. lookTabType.current = true;
  407. setPageType({
  408. txt: "look",
  409. id: item.id,
  410. tit: item.num + " - " + item.name,
  411. });
  412. }}
  413. >
  414. 审批
  415. </Button>
  416. </AuthCom>
  417. <AuthCom aId="1050">
  418. <Button
  419. size="small"
  420. type="text"
  421. onClick={() =>
  422. setDownId({
  423. id: item.id,
  424. txt: item.num + " - " + item.name,
  425. })
  426. }
  427. >
  428. 下载内控文件
  429. </Button>
  430. </AuthCom>
  431. </>
  432. ) : null}
  433. <AuthCom aId="1060">
  434. <Popconfirm
  435. title="删除后无法恢复,是否删除?"
  436. okText="删除"
  437. cancelText="取消"
  438. onConfirm={() => delById(item.id)}
  439. okButtonProps={{ loading: false }}
  440. >
  441. <Button size="small" type="text" danger>
  442. 删除
  443. </Button>
  444. </Popconfirm>
  445. </AuthCom>
  446. </>
  447. ),
  448. });
  449. return arr;
  450. }, [delById, pcsTxt, tabFlag, topType]);
  451. // 新增和查看
  452. const [pageType, setPageType] = useState<{
  453. txt: string;
  454. id: number;
  455. tit?: string;
  456. }>({ txt: "", id: 0 });
  457. // 是否只有 项目文件视图 / 内控文件视图的 其中一个
  458. const isOneTopType = useMemo(() => {
  459. if (authArr.includes("1010") && authArr.includes("1020")) return false;
  460. else return true;
  461. }, [authArr]);
  462. return (
  463. <div className={styles.A1Project}>
  464. <div className="pageTitle">
  465. 项目管理
  466. {pageType.txt === "add"
  467. ? " > 新增项目"
  468. : pageType.txt === "look"
  469. ? " > 查看项目"
  470. : null}
  471. </div>
  472. {/* 顶部筛选 */}
  473. <div className="A1top">
  474. <div className="A1Search">
  475. {/* 顶部试图切换 */}
  476. <div className="A1SearchRow" hidden={isOneTopType}>
  477. <AuthCom aId="1010">
  478. <Button
  479. onClick={() => topTypeFu("outer")}
  480. type={topType === "outer" ? "primary" : "default"}
  481. >
  482. 项目文件视图
  483. </Button>
  484. </AuthCom>
  485. <AuthCom aId="1020">
  486. <Button
  487. onClick={() => topTypeFu("inner")}
  488. type={topType === "inner" ? "primary" : "default"}
  489. >
  490. 内控文件视图
  491. </Button>
  492. </AuthCom>
  493. </div>
  494. <div className="A1SearchRow">
  495. <span>项目编号/项目名称/建设单位:</span>
  496. <Input
  497. key={inputKey}
  498. maxLength={20}
  499. style={{ width: 200 }}
  500. placeholder="请输入内容,最多20字"
  501. allowClear
  502. onChange={(e) => searchKeyChange(e, "searchKey")}
  503. />
  504. </div>
  505. <div className="A1SearchRow">
  506. <span>项目经理:</span>
  507. <Input
  508. key={inputKey}
  509. maxLength={10}
  510. style={{ width: 200 }}
  511. placeholder="请输入内容,最多10字"
  512. allowClear
  513. onChange={(e) => searchKeyChange(e, "pmName")}
  514. />
  515. </div>
  516. <div className="A1SearchRow">
  517. <span>商务经理:</span>
  518. <Input
  519. key={inputKey}
  520. maxLength={10}
  521. style={{ width: 200 }}
  522. placeholder="请输入内容,最多10字"
  523. allowClear
  524. onChange={(e) => searchKeyChange(e, "bmName")}
  525. />
  526. </div>
  527. </div>
  528. <div className="A1Search A1Search2">
  529. <div className="A1SearchRow">
  530. <span>项目状态:</span>
  531. <Select
  532. style={{ width: 164 }}
  533. value={fromData.statusId}
  534. onChange={(e) =>
  535. setFromData({ ...fromData, statusId: e, pageNum: 1 })
  536. }
  537. options={[
  538. { value: "", label: "全部" },
  539. ...statusArr.map((v) => ({ value: v.id, label: v.name })),
  540. ]}
  541. />
  542. </div>
  543. <div className="A1SearchRow">
  544. <span>项目类型:</span>
  545. <Popover
  546. trigger="click"
  547. placement="bottomLeft"
  548. content={
  549. <div className={styles.projectTypePopOver}>
  550. <div className={styles.row}>
  551. <span className={styles.title} title="甲方的业务类型">业务类型:</span>
  552. <Checkbox
  553. indeterminate={isProjectBusinessPartiallyChecked}
  554. onChange={onProjectBusinessCheckAllChange}
  555. checked={isProjectBusinessAllChecked}
  556. className={styles.selectAll}
  557. >
  558. 全选
  559. </Checkbox>
  560. <Checkbox.Group
  561. options={projectBusinessArrForCheckbox}
  562. value={checkedProjectBusinessArr}
  563. onChange={onProjectBusinessNormalCheckboxChange}
  564. />
  565. </div>
  566. <div className={styles.row}>
  567. <span className={styles.title} title="项目的建设范围">项目范围:</span>
  568. <Checkbox
  569. indeterminate={isProjectScopePartiallyChecked}
  570. onChange={onProjectScopeCheckAllChange}
  571. checked={isProjectScopeAllChecked}
  572. className={styles.selectAll}
  573. >
  574. 全选
  575. </Checkbox>
  576. <Checkbox.Group
  577. options={projectScopeArrForCheckbox}
  578. value={checkedProjectScopeArr}
  579. onChange={onProjectScopeNormalCheckboxChange}
  580. />
  581. </div>
  582. <div className={styles.row}>
  583. <span className={styles.title} title="项目成果的呈现载体">客户端:</span>
  584. <Checkbox
  585. indeterminate={isProjectAppPartiallyChecked}
  586. onChange={onProjectAppCheckAllChange}
  587. checked={isProjectAppAllChecked}
  588. className={styles.selectAll}
  589. >
  590. 全选
  591. </Checkbox>
  592. <Checkbox.Group
  593. options={projectAppArrForCheckbox}
  594. value={checkedProjectAppArr}
  595. onChange={onProjectAppNormalCheckboxChange}
  596. />
  597. </div>
  598. </div>
  599. }
  600. >
  601. <Button className="projectTypeFilterButton">
  602. {projectTypeCurrentText}
  603. <DownOutlined />
  604. </Button>
  605. </Popover>
  606. </div>
  607. {/* 通过顶部状态 动态渲染 这3个下拉框 */}
  608. {topType === "outer" ? null : (
  609. <>
  610. <div className="A1SearchRow">
  611. <span>是否存在待审批文件:</span>
  612. <Select
  613. style={{ width: 164 }}
  614. value={fromData.hasAuditStatus}
  615. onChange={(e) =>
  616. setFromData({ ...fromData, hasAuditStatus: e, pageNum: 1 })
  617. }
  618. options={hasAuditStatusArr}
  619. />
  620. </div>
  621. </>
  622. )}
  623. <div className="A1SearchRow A1SearchBtn">
  624. <AuthCom aId="1030">
  625. <Button
  626. type="primary"
  627. onClick={() => setPageType({ txt: "add", id: 0 })}
  628. >
  629. 新增项目
  630. </Button>
  631. </AuthCom>
  632. &emsp;&emsp;
  633. <Button onClick={resetSelectFu}>重置</Button>
  634. </div>
  635. </div>
  636. </div>
  637. {/* 表格主体 */}
  638. <div className="A1tableBox">
  639. <Table
  640. scroll={{ y: 575 }}
  641. dataSource={tableInfo.list}
  642. columns={columns}
  643. rowKey="id"
  644. pagination={{
  645. showQuickJumper: true,
  646. position: ["bottomCenter"],
  647. showSizeChanger: true,
  648. current: fromData.pageNum,
  649. pageSize: fromData.pageSize,
  650. total: tableInfo.total,
  651. onChange: paginationChange(),
  652. }}
  653. />
  654. </div>
  655. {/* 新增、查看 */}
  656. {pageType.txt === "add" ? (
  657. <A1Add
  658. pageType={pageType}
  659. closeFu={() => setPageType({ txt: "", id: 0 })}
  660. addFu={() => resetSelectFu()}
  661. editFu={() => A1getListFu()}
  662. />
  663. ) : pageType.txt === "look" ? (
  664. <A1Look
  665. pageType={pageType}
  666. closeFu={() => {
  667. setPageType({ txt: "", id: 0 });
  668. // 从查看页面返回的时候更新列表数据
  669. A1getListFu();
  670. }}
  671. tabType={lookTabType.current}
  672. lookTit={pageType.tit!}
  673. />
  674. ) : null}
  675. {/* 下载 */}
  676. {downId.id ? (
  677. <A1Down downId={downId} closeFu={() => setDownId({ id: 0, txt: "" })} />
  678. ) : null}
  679. </div>
  680. );
  681. }
  682. const MemoA1Project = React.memo(A1Project);
  683. export default MemoA1Project;