|
|
@@ -1,12 +1,432 @@
|
|
|
-import React from "react";
|
|
|
+import React, {
|
|
|
+ useCallback,
|
|
|
+ useEffect,
|
|
|
+ useMemo,
|
|
|
+ useRef,
|
|
|
+ useState,
|
|
|
+} from "react";
|
|
|
import styles from "./index.module.scss";
|
|
|
- function A8Manual() {
|
|
|
-
|
|
|
+import { Button, Empty, Popconfirm, Table } from "antd";
|
|
|
+import {
|
|
|
+ PlusCircleOutlined,
|
|
|
+ EditOutlined,
|
|
|
+ DeleteOutlined,
|
|
|
+ CaretDownOutlined,
|
|
|
+ CaretUpOutlined,
|
|
|
+} from "@ant-design/icons";
|
|
|
+
|
|
|
+import classNames from "classnames";
|
|
|
+import A8Add from "./A8Add";
|
|
|
+import {
|
|
|
+ A8API_getList,
|
|
|
+ A8API_getTree,
|
|
|
+ A8API_remove,
|
|
|
+ A8API_tableDel,
|
|
|
+} from "@/store/action/A8Manual";
|
|
|
+import { A8RowType, A8TableType } from "@/types";
|
|
|
+import { MessageFu } from "@/utils/message";
|
|
|
+import store, { RootState } from "@/store";
|
|
|
+import { useDispatch, useSelector } from "react-redux";
|
|
|
+
|
|
|
+function A8Manual() {
|
|
|
+ const dispatch = useDispatch();
|
|
|
+
|
|
|
+ const [leftList, setLeftList] = useState<A8RowType[]>([]);
|
|
|
+
|
|
|
+ const pageSizeRef = useRef(10);
|
|
|
+ const pageNumRef = useRef(1);
|
|
|
+
|
|
|
+ // 表格的数据
|
|
|
+ const [formData, setFormData] = useState({
|
|
|
+ storageId: 0,
|
|
|
+ pageSize: 10,
|
|
|
+ pageNum: 1,
|
|
|
+ });
|
|
|
+
|
|
|
+ // 分页页面统一
|
|
|
+ useEffect(() => {
|
|
|
+ pageSizeRef.current = formData.pageSize;
|
|
|
+ pageNumRef.current = formData.pageNum;
|
|
|
+ }, [formData.pageNum, formData.pageSize]);
|
|
|
+
|
|
|
+ const getTableFu = useCallback(() => {
|
|
|
+ const data = {
|
|
|
+ storageId: formData.storageId,
|
|
|
+ pageSize: pageSizeRef.current,
|
|
|
+ pageNum: pageNumRef.current,
|
|
|
+ };
|
|
|
+ if (formData.storageId) dispatch(A8API_getList(data));
|
|
|
+ }, [dispatch, formData.storageId]);
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ getTableFu();
|
|
|
+ }, [getTableFu]);
|
|
|
+
|
|
|
+ const getTreeFu = useCallback(async (val?: 1 | 2 | 3, fid?: number) => {
|
|
|
+ const res = await A8API_getTree();
|
|
|
+ setLeftList(res.data);
|
|
|
+
|
|
|
+ // 选中第一个
|
|
|
+ if (res.data.length) {
|
|
|
+ if (val === 1 || val === undefined) setOneId(res.data[0].id);
|
|
|
+
|
|
|
+ const obj = fid
|
|
|
+ ? res.data.find((v: any) => v.id === fid).children || []
|
|
|
+ : res.data[0].children;
|
|
|
+ if (obj && obj.length) {
|
|
|
+ // 发送请求拿表格数据
|
|
|
+ if (val === 2 || val === undefined) setTowId(obj[0].id);
|
|
|
+ } else
|
|
|
+ store.dispatch({
|
|
|
+ type: "manual/getList",
|
|
|
+ payload: { list: [], total: 0 } as any,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }, []);
|
|
|
+ useEffect(() => {
|
|
|
+ getTreeFu();
|
|
|
+ }, [getTreeFu]);
|
|
|
+
|
|
|
+ // 表格的数据
|
|
|
+ const tableInfo = useSelector((state: RootState) => state.A8Manual.tableInfo);
|
|
|
+
|
|
|
+ // 一级Id
|
|
|
+ const [oneId, setOneId] = useState(0);
|
|
|
+
|
|
|
+ // 选中的一级id下面的二级id的数组
|
|
|
+ const checkTowArr = useMemo(() => {
|
|
|
+ let arr: A8RowType[] = [];
|
|
|
+ const obj = leftList.find((v) => v.id === oneId);
|
|
|
+ if (obj && obj.children && obj.children.length) arr = obj.children;
|
|
|
+ // console.log("-----------", arr);
|
|
|
+ return arr;
|
|
|
+ }, [leftList, oneId]);
|
|
|
+
|
|
|
+ // 二级Id
|
|
|
+ const [towId, setTowId] = useState(0);
|
|
|
+ // 点击第一级的选中
|
|
|
+ const clickOneFu = useCallback(
|
|
|
+ (id: number) => {
|
|
|
+ setOneId(id);
|
|
|
+ const son = leftList.find((v) => v.id === id)?.children;
|
|
|
+ if (son && son.length) setTowId(son[0].id);
|
|
|
+ else
|
|
|
+ store.dispatch({
|
|
|
+ type: "manual/getList",
|
|
|
+ payload: { list: [], total: 0 } as any,
|
|
|
+ });
|
|
|
+ },
|
|
|
+ [leftList]
|
|
|
+ );
|
|
|
+ // 点击第二级的选中
|
|
|
+ const clickTowFu = useCallback((id: number) => {
|
|
|
+ setTowId(id);
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ // 第二级id改变的时候
|
|
|
+ useEffect(() => {
|
|
|
+ setFormData({
|
|
|
+ pageNum: 1,
|
|
|
+ pageSize: pageSizeRef.current,
|
|
|
+ storageId: towId,
|
|
|
+ });
|
|
|
+ }, [towId]);
|
|
|
+
|
|
|
+ // 新增的弹窗
|
|
|
+ const [openAdd, setOpenAdd] = useState(false);
|
|
|
+ const openId = useRef(0);
|
|
|
+ const upId = useRef(0);
|
|
|
+ const sonTitleTxt = useRef("");
|
|
|
+ const openLevel = useRef<1 | 2 | 3>(1);
|
|
|
+
|
|
|
+ // 点击新增/编辑类别
|
|
|
+ const addFu = useCallback(
|
|
|
+ (id: number, level: 1 | 2 | 3, fId: number) => {
|
|
|
+ // 一级的判断
|
|
|
+ if (level === 1) {
|
|
|
+ sonTitleTxt.current = "";
|
|
|
+ if (leftList.length >= 50)
|
|
|
+ return MessageFu.warning("最多仅支持50个一级类别!");
|
|
|
+ } else if (level === 2) {
|
|
|
+ // 二级的判断
|
|
|
+ const oneArr = leftList.find((v) => v.id === fId);
|
|
|
+ sonTitleTxt.current = oneArr?.name || "";
|
|
|
+ if (oneArr && oneArr.children && oneArr.children.length >= 50)
|
|
|
+ return MessageFu.warning("最多仅支持50个二级类别!");
|
|
|
+ } else {
|
|
|
+ if (checkTowArr.length) {
|
|
|
+ const oneArr = leftList.find((v) => v.id === oneId);
|
|
|
+ // 一级类别的标题
|
|
|
+ const tit1 = oneArr?.name || "";
|
|
|
+ // 二级类别的标题
|
|
|
+ const tit2 = checkTowArr.find((v) => v.id === fId)?.name || "";
|
|
|
+ sonTitleTxt.current = `${tit1} - ${tit2}`;
|
|
|
+ if (tableInfo.total >= 200)
|
|
|
+ return MessageFu.warning("设备支持最多200条!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ upId.current = fId;
|
|
|
+ openId.current = id;
|
|
|
+ openLevel.current = level;
|
|
|
+ setOpenAdd(true);
|
|
|
+ },
|
|
|
+ [checkTowArr, leftList, oneId, tableInfo.total]
|
|
|
+ );
|
|
|
+
|
|
|
+ // 点击删除
|
|
|
+ const [confirmLoading, setConfirmLoading] = useState(false);
|
|
|
+ const clickDelFu = useCallback(
|
|
|
+ async (v: A8RowType, level: 1 | 2 | 3) => {
|
|
|
+ setConfirmLoading(true);
|
|
|
+ if (level === 1) {
|
|
|
+ if (v.children?.length) {
|
|
|
+ MessageFu.warning("需删除此类别下所有设备后,才能删除!");
|
|
|
+ setConfirmLoading(false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } else if (level === 2) {
|
|
|
+ if (tableInfo.list.length) {
|
|
|
+ MessageFu.warning("需删除此类别下所有设备后,才能删除!");
|
|
|
+ setConfirmLoading(false);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const res = await A8API_remove(v.id);
|
|
|
+ if (res.code === 0) {
|
|
|
+ MessageFu.success("删除成功!");
|
|
|
+ setConfirmLoading(false);
|
|
|
+ getTreeFu(level === 1 ? undefined : level);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ [getTreeFu, tableInfo.list.length]
|
|
|
+ );
|
|
|
+
|
|
|
+ // ------------------------关于表格的操作---------------------------
|
|
|
+ // 页码变化
|
|
|
+ const paginationChange = useCallback(
|
|
|
+ () => (pageNum: number, pageSize: number) => {
|
|
|
+ pageSizeRef.current = pageSize;
|
|
|
+ pageNumRef.current = pageNum;
|
|
|
+ setFormData({ ...formData, pageNum, pageSize });
|
|
|
+ dispatch(
|
|
|
+ A8API_getList({ storageId: formData.storageId, pageNum, pageSize })
|
|
|
+ );
|
|
|
+ },
|
|
|
+ [dispatch, formData]
|
|
|
+ );
|
|
|
+
|
|
|
+ // 表格点击删除
|
|
|
+ const delTableFu = useCallback(
|
|
|
+ async (id: number) => {
|
|
|
+ const res = await A8API_tableDel(id);
|
|
|
+ if (res.code === 0) {
|
|
|
+ MessageFu.success("删除成功!");
|
|
|
+ getTableFu();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ [getTableFu]
|
|
|
+ );
|
|
|
+
|
|
|
+ const columns = useMemo(() => {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ title: "类别",
|
|
|
+ render: () => {
|
|
|
+ const oneArr = leftList.find((v) => v.id === oneId);
|
|
|
+ // 一级类别的标题
|
|
|
+ const tit1 = oneArr?.name || "";
|
|
|
+ // 二级类别的标题
|
|
|
+ const tit2 = checkTowArr.find((v) => v.id === towId)?.name || "";
|
|
|
+ return `${tit1} - ${tit2}`;
|
|
|
+ },
|
|
|
+ },
|
|
|
+
|
|
|
+ {
|
|
|
+ title: "设备名称",
|
|
|
+ dataIndex: "name",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "产品手册",
|
|
|
+ render: (item: A8TableType) =>
|
|
|
+ item.fileName ? item.fileName : "(空)",
|
|
|
+ },
|
|
|
+
|
|
|
+ {
|
|
|
+ title: "操作",
|
|
|
+ render: (item: A8TableType) => (
|
|
|
+ <>
|
|
|
+ <Button
|
|
|
+ size="small"
|
|
|
+ type="text"
|
|
|
+ onClick={() => addFu(item.id, 3, towId)}
|
|
|
+ >
|
|
|
+ 编辑
|
|
|
+ </Button>
|
|
|
+ <Popconfirm
|
|
|
+ title="删除后无法恢复,是否删除?"
|
|
|
+ okText="删除"
|
|
|
+ cancelText="取消"
|
|
|
+ onConfirm={() => delTableFu(item.id)}
|
|
|
+ >
|
|
|
+ <Button size="small" type="text" danger>
|
|
|
+ 删除
|
|
|
+ </Button>
|
|
|
+ </Popconfirm>
|
|
|
+ </>
|
|
|
+ ),
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ }, [addFu, checkTowArr, delTableFu, leftList, oneId, towId]);
|
|
|
+
|
|
|
return (
|
|
|
<div className={styles.A8Manual}>
|
|
|
- <h1>A8Manual</h1>
|
|
|
+ <div className="pageTitle">产品手册管理</div>
|
|
|
+ {/* 左边 */}
|
|
|
+ <div className="mainLeft">
|
|
|
+ <div className="mainLeftTop">
|
|
|
+ <div>类别管理</div>
|
|
|
+ <Button type="primary" size="small" onClick={() => addFu(0, 1, 0)}>
|
|
|
+ 新增类别
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ {leftList.length ? (
|
|
|
+ <div className="mainLeftSroolBox mySorrl">
|
|
|
+ {leftList.map((v) => (
|
|
|
+ <div
|
|
|
+ className={classNames(
|
|
|
+ "listBox",
|
|
|
+ oneId === v.id ? "activeBox" : ""
|
|
|
+ )}
|
|
|
+ key={v.id}
|
|
|
+ >
|
|
|
+ <div className="oneName">
|
|
|
+ <div className="oneNameLeft" onClick={() => clickOneFu(v.id)}>
|
|
|
+ <div className="oneNameLeft1" hidden={oneId === v.id}>
|
|
|
+ <CaretDownOutlined />
|
|
|
+ </div>
|
|
|
+ <div className="oneNameLeft1" hidden={oneId !== v.id}>
|
|
|
+ <CaretUpOutlined />
|
|
|
+ </div>
|
|
|
+ <div className="oneNameLeft2">{v.name}</div>
|
|
|
+ </div>
|
|
|
+ <div className="oneNameRight">
|
|
|
+ <PlusCircleOutlined
|
|
|
+ title="新增子类别"
|
|
|
+ onClick={() => addFu(0, 2, oneId)}
|
|
|
+ />
|
|
|
+ <EditOutlined
|
|
|
+ title="编辑类别"
|
|
|
+ onClick={() => addFu(v.id, 1, 0)}
|
|
|
+ />
|
|
|
+ <Popconfirm
|
|
|
+ title="删除后无法恢复,是否删除?"
|
|
|
+ okText="删除"
|
|
|
+ cancelText="取消"
|
|
|
+ onConfirm={() => clickDelFu(v, 1)}
|
|
|
+ okButtonProps={{ loading: confirmLoading }}
|
|
|
+ >
|
|
|
+ <DeleteOutlined title="删除类别" />
|
|
|
+ </Popconfirm>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div className="listSonBox">
|
|
|
+ {v.children?.length ? (
|
|
|
+ v.children.map((item) => (
|
|
|
+ <div
|
|
|
+ onClick={() => clickTowFu(item.id)}
|
|
|
+ className={classNames(
|
|
|
+ "listSonBoxRow",
|
|
|
+ towId === item.id ? "listSonBoxRowAc" : ""
|
|
|
+ )}
|
|
|
+ key={item.id}
|
|
|
+ >
|
|
|
+ <div className="listSonBoxRow1"> {item.name}</div>
|
|
|
+ <div className="listSonBoxRow2">
|
|
|
+ <EditOutlined
|
|
|
+ title="编辑子类别"
|
|
|
+ onClick={() => addFu(towId, 2, oneId)}
|
|
|
+ />
|
|
|
+ <Popconfirm
|
|
|
+ title="删除后无法恢复,是否删除?"
|
|
|
+ okText="删除"
|
|
|
+ cancelText="取消"
|
|
|
+ onConfirm={() => clickDelFu(item, 2)}
|
|
|
+ okButtonProps={{ loading: confirmLoading }}
|
|
|
+ >
|
|
|
+ <DeleteOutlined title="删除子类别" />
|
|
|
+ </Popconfirm>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ ))
|
|
|
+ ) : (
|
|
|
+ <div className="noneDataBox">暂无数据</div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
+ ) : (
|
|
|
+ <div className="rightKongBox">
|
|
|
+ <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ {/* 右边 */}
|
|
|
+ <div className="mainRight">
|
|
|
+ {checkTowArr.length ? (
|
|
|
+ <>
|
|
|
+ <div className="mainRightTop">
|
|
|
+ <div>设备管理</div>
|
|
|
+ <Button type="primary" onClick={() => addFu(0, 3, towId)}>
|
|
|
+ 新增设备
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ {/* 表格主体 */}
|
|
|
+ <div className="tableBox">
|
|
|
+ <Table
|
|
|
+ scroll={{ y: 625 }}
|
|
|
+ dataSource={tableInfo.list}
|
|
|
+ columns={columns}
|
|
|
+ rowKey="id"
|
|
|
+ pagination={{
|
|
|
+ showQuickJumper: true,
|
|
|
+ position: ["bottomCenter"],
|
|
|
+ showSizeChanger: true,
|
|
|
+ current: formData.pageNum,
|
|
|
+ pageSize: formData.pageSize,
|
|
|
+ total: tableInfo.total,
|
|
|
+ onChange: paginationChange(),
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </>
|
|
|
+ ) : (
|
|
|
+ <div className="rightKongBox">
|
|
|
+ <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* 新增/编辑弹窗 */}
|
|
|
+ {openAdd ? (
|
|
|
+ <A8Add
|
|
|
+ upTxt={sonTitleTxt.current}
|
|
|
+ upId={upId.current}
|
|
|
+ id={openId.current}
|
|
|
+ type={openLevel.current}
|
|
|
+ closePageFu={() => setOpenAdd(false)}
|
|
|
+ addTableFu={(val, fid) => getTreeFu(val, fid)}
|
|
|
+ editTableFu={() => getTreeFu(3)}
|
|
|
+ tableAddFu={() =>
|
|
|
+ dispatch(A8API_getList({ ...formData, pageNum: 1 }))
|
|
|
+ }
|
|
|
+ tableEditFu={getTableFu}
|
|
|
+ />
|
|
|
+ ) : null}
|
|
|
</div>
|
|
|
- )
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
const MemoA8Manual = React.memo(A8Manual);
|