index.tsx 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. import BreadTit from "@/components/BreadTit";
  2. import classNames from "classnames";
  3. import { useEffect, useMemo, useRef, useState } from "react";
  4. import styles from "./index.module.scss";
  5. import {
  6. Select,
  7. Input,
  8. DatePicker,
  9. Table,
  10. Button,
  11. Popconfirm,
  12. message,
  13. } from "antd";
  14. import AuthButton from "@/components/AuthButton";
  15. import history from "@/utils/history";
  16. import { useLocation } from "react-router-dom";
  17. import { useDispatch, useSelector } from "react-redux";
  18. import { RootState } from "@/store";
  19. import {
  20. getObject1List,
  21. getObject1ListNum,
  22. object1DelAPI,
  23. } from "@/store/action/object1";
  24. const { RangePicker } = DatePicker;
  25. export default function Object1() {
  26. const dispatch = useDispatch();
  27. // 获取顶部数量
  28. useEffect(() => {
  29. dispatch(getObject1ListNum());
  30. }, [dispatch]);
  31. // 顶部的状态改变了,统一管理,传到二级页码
  32. const statusRef = useRef<null | number>(null);
  33. const dataTit = useSelector((state: RootState) => state.object1Store.infoNum1);
  34. // 封装发送请求的函数
  35. const getList = () => {
  36. const data = { ...tableSelect, pageNum: pageNumRef.current };
  37. dispatch(getObject1List(data));
  38. };
  39. // 获取地址栏参数
  40. const location = useLocation();
  41. const pageNumRef = useRef(1);
  42. // 如果有参数 根据参数页码在次发送请求
  43. useEffect(() => {
  44. const urlParam = location.state || {};
  45. setTableSelect({
  46. ...tableSelect,
  47. pageNum: Number(urlParam.k) ? Number(urlParam.k) : 1,
  48. // eslint-disable-next-line eqeqeq
  49. status: urlParam.d&&urlParam.d!='null'? Number(urlParam.d) : null,
  50. });
  51. // eslint-disable-next-line react-hooks/exhaustive-deps
  52. }, [location]);
  53. // 顶部筛选
  54. const [tableSelect, setTableSelect] = useState({
  55. status: null as null | number,
  56. sourceName: null,
  57. searchKey: "",
  58. startTime: "",
  59. endTime: "",
  60. pageSize: 10,
  61. pageNum: 1,
  62. });
  63. // 当前页码统一
  64. useEffect(() => {
  65. pageNumRef.current = tableSelect.pageNum;
  66. }, [tableSelect.pageNum]);
  67. // 顶部状态统一
  68. useEffect(() => {
  69. statusRef.current = tableSelect.status;
  70. }, [tableSelect.status]);
  71. // 防止返回的时候发送了2次请求来对应页码
  72. const getListRef = useRef(-1);
  73. useEffect(() => {
  74. clearTimeout(getListRef.current);
  75. getListRef.current = window.setTimeout(() => {
  76. getList();
  77. }, 100);
  78. // eslint-disable-next-line react-hooks/exhaustive-deps
  79. }, [tableSelect]);
  80. // 藏品来源下拉框筛选
  81. const handleChange = (value: any) => {
  82. setTableSelect({ ...tableSelect, sourceName: value, pageNum: 1 });
  83. };
  84. // 登记人员输入
  85. const nameTime = useRef(-1);
  86. const nameChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  87. clearTimeout(nameTime.current);
  88. nameTime.current = window.setTimeout(() => {
  89. setTableSelect({ ...tableSelect, searchKey: e.target.value, pageNum: 1 });
  90. }, 500);
  91. };
  92. // 时间选择器改变
  93. const timeChange = (date: any, dateString: any) => {
  94. let startTime = "";
  95. let endTime = "";
  96. if (dateString[0] && dateString[1]) {
  97. startTime = dateString[0] + " 00:00:00";
  98. endTime = dateString[1] + " 23:59:59";
  99. }
  100. setTableSelect({ ...tableSelect, startTime, endTime, pageNum: 1 });
  101. };
  102. // 点击新增或者编辑按钮
  103. const addObject = (id?: any) => {
  104. // 清空详情页面里面的附件表格信息
  105. dispatch({ type: "login/setGoodsSonList", payload: [] });
  106. if (id)
  107. history.push(
  108. `/object/1/add?k=${pageNumRef.current}&d=${statusRef.current}&id=${id}`
  109. );
  110. else
  111. history.push(
  112. `/object/1/add?k=${pageNumRef.current}&d=${statusRef.current}`
  113. );
  114. };
  115. // 点击删除按钮
  116. const delOne = async (id: number) => {
  117. const res: any = await object1DelAPI(id);
  118. if (res.code === 0) {
  119. message.success("删除成功!");
  120. getList();
  121. dispatch(getObject1ListNum());
  122. }
  123. };
  124. // ---------关于表格
  125. // 页码变化
  126. const paginationChange = (pageNum: number, pageSize: number) => {
  127. setTableSelect({ ...tableSelect, pageNum, pageSize });
  128. };
  129. const results = useSelector((state: RootState) => state.object1Store.info1);
  130. const columns = useMemo(() => {
  131. return [
  132. {
  133. title: "登记编号",
  134. dataIndex: "num",
  135. },
  136. {
  137. title: "藏品来源",
  138. dataIndex: "sourceName",
  139. },
  140. {
  141. title: "登记人员",
  142. dataIndex: "creatorName",
  143. },
  144. {
  145. title: "创建日期",
  146. dataIndex: "createTime",
  147. },
  148. {
  149. title: "完成日期",
  150. render: (item: any) => (item.day ? item.day : "-"),
  151. },
  152. {
  153. title: "状态",
  154. dataIndex: "statusTxt",
  155. },
  156. {
  157. title: "操作",
  158. render: (item: any) => (
  159. <>
  160. <Button
  161. type="text"
  162. danger
  163. onClick={() =>
  164. history.push(
  165. `/object/1/look?k=${pageNumRef.current}&d=${statusRef.current}&id=${item.id}`
  166. )
  167. }
  168. >
  169. 查看
  170. </Button>
  171. {item.status === 0 || item.status === 2 ? (
  172. <AuthButton type="text" danger onClick={() => addObject(item.id)}>
  173. 编辑
  174. </AuthButton>
  175. ) : null}
  176. {item.status === 1 ? (
  177. <AuthButton
  178. onClick={() =>
  179. history.push(
  180. `/object/1/audit?k=${pageNumRef.current}&d=${statusRef.current}&id=${item.id}`
  181. )
  182. }
  183. type="text"
  184. danger
  185. >
  186. 审核
  187. </AuthButton>
  188. ) : null}
  189. {item.status === 0 || item.status === 2 ? (
  190. <Popconfirm
  191. title="确定删除吗?"
  192. okText="确定"
  193. cancelText="取消"
  194. onConfirm={() => delOne(item.id)}
  195. >
  196. <AuthButton type="text" danger>
  197. 删除
  198. </AuthButton>
  199. </Popconfirm>
  200. ) : null}
  201. </>
  202. ),
  203. },
  204. ];
  205. // eslint-disable-next-line react-hooks/exhaustive-deps
  206. }, []);
  207. // 从仓库中获取藏品来源下拉数据
  208. const options = useSelector(
  209. (state: RootState) => state.loginStore.selectAll["文物来源"]
  210. );
  211. return (
  212. <div className={styles.Object1}>
  213. <div className="breadTit">
  214. <BreadTit>
  215. <div className="breadTitRow active">藏品登记</div>
  216. </BreadTit>
  217. </div>
  218. <div className="objectSonMain">
  219. {/* 顶部筛选 */}
  220. <div className="objectSonMainTit">
  221. {dataTit.map((v: any) => (
  222. <div
  223. key={v.id}
  224. onClick={() =>
  225. setTableSelect({ ...tableSelect, status: v.id, pageNum: 1 })
  226. }
  227. className={classNames(
  228. v.id === tableSelect.status ? "active" : ""
  229. )}
  230. >
  231. {v.name}({v.num})
  232. </div>
  233. ))}
  234. </div>
  235. <div className="objectSonMainTable">
  236. {/* 表格数据筛选 */}
  237. <div className="tableSelectBox">
  238. <div className="row">
  239. <span>藏品来源:</span>
  240. <Select
  241. placeholder="请选择"
  242. allowClear
  243. style={{ width: 150 }}
  244. value={tableSelect.sourceName}
  245. onChange={handleChange}
  246. options={options.map((v: any) => ({
  247. label: v.name,
  248. value: v.name,
  249. }))}
  250. />
  251. </div>
  252. <div className="row">
  253. <span>登记人员:</span>
  254. <Input
  255. maxLength={10}
  256. style={{ width: 150 }}
  257. placeholder="请输入"
  258. allowClear
  259. onChange={(e) => nameChange(e)}
  260. />
  261. </div>
  262. <div className="row">
  263. <span>创建日期:</span>
  264. <RangePicker onChange={timeChange} />
  265. </div>
  266. <div className="row">
  267. <AuthButton type="primary" onClick={() => addObject()}>
  268. 新增
  269. </AuthButton>
  270. </div>
  271. </div>
  272. {/* 表格主体 */}
  273. <div className="tableMain">
  274. <Table
  275. scroll={{ y: 428 }}
  276. dataSource={results.list}
  277. columns={columns}
  278. rowKey="id"
  279. pagination={{
  280. showQuickJumper: true,
  281. position: ["bottomCenter"],
  282. showSizeChanger: true,
  283. current: tableSelect.pageNum,
  284. pageSize: tableSelect.pageSize,
  285. total: results.total,
  286. onChange: paginationChange,
  287. }}
  288. />
  289. </div>
  290. </div>
  291. </div>
  292. </div>
  293. );
  294. }