shaogen1995 пре 1 година
родитељ
комит
5a25e0f350

+ 2 - 2
src/pages/A1Camera/AddCamera/index.tsx

@@ -8,7 +8,7 @@ import TextArea from "antd/es/input/TextArea";
 import { MessageFu } from "@/utils/message";
 import { useDispatch, useSelector } from "react-redux";
 import { RootState } from "@/store";
-import { C1_APIGgetlist } from "@/store/action/C1User";
+import { C1_APIgetlist } from "@/store/action/C1User";
 
 type Props = {
   openInfo: A1addType;
@@ -23,7 +23,7 @@ function AddCamera({ openInfo, closeFu, upTableFu, addTableFu }: Props) {
   useEffect(() => {
     // 获取用户列表所有用户信息
     dispatch(
-      C1_APIGgetlist(
+      C1_APIgetlist(
         {
           pageSize: 99999,
           pageNum: 1,

+ 1 - 1
src/pages/A1Camera/index.tsx

@@ -106,7 +106,7 @@ function A1Camera() {
             sheetData: res.data.records.map((v: A1ListType) => ({
               ...v,
               typeIn: v.typeIn === "pc" ? "系统" : "移动端",
-              remark: v.remark ? v.remark : "(空)",
+              remark: v.remark || "(空)",
               pmName: v.id === 1 ? "管理员" : v.pmName || "匿名",
             })),
             sheetName: name,

+ 20 - 13
src/pages/A2Psychz/AddPsychz/index.module.scss

@@ -31,7 +31,6 @@
         display: flex;
         font-size: 14px;
         margin-bottom: 24px;
-        position: relative;
 
 
         .e_rowL {
@@ -49,6 +48,18 @@
 
         .e_rowR {
           width: calc(100% - 100px);
+          position: relative;
+
+          // 校验不通过的提示语
+          .e_rowRightTit {
+            position: absolute;
+            top: 0px;
+            font-size: 14px;
+            color: #ff4d4f;
+            opacity: 0;
+            transition: all .3s;
+            width: 300px;
+          }
 
           .e_rowRrow {
             display: flex;
@@ -103,20 +114,16 @@
 
         }
 
-        .e_rowRightTit {
-          position: absolute;
-          right: -110px;
-          top: 0px;
-          font-size: 14px;
-          color: #ff4d4f;
-          opacity: 0;
-          transition: all .3s;
+        .e_rowRErr{
+          padding-top: 35px;
+          .e_rowRightTit {
+            top: 4px;
+            opacity: 1;
+          }
         }
 
-        .e_rowRightTitShow {
-          top: 4px;
-          opacity: 1;
-        }
+
+
       }
     }
   }

+ 39 - 25
src/pages/A2Psychz/AddPsychz/index.tsx

@@ -1,4 +1,10 @@
-import React, { useCallback, useEffect, useRef, useState } from "react";
+import React, {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from "react";
 import styles from "./index.module.scss";
 import {
   Button,
@@ -14,7 +20,7 @@ import mapDataAll from "@/pages/C1User/AddUser/city";
 import { MinusCircleOutlined, PlusCircleOutlined } from "@ant-design/icons";
 import classNames from "classnames";
 import { useDispatch, useSelector } from "react-redux";
-import { C1_APIGgetlist } from "@/store/action/C1User";
+import { C1_APIgetlist } from "@/store/action/C1User";
 import { RootState } from "@/store";
 import { A2_APIadd, A2_APIgetInfo } from "@/store/action/A2Psychz";
 import { MessageFu } from "@/utils/message";
@@ -63,6 +69,12 @@ function AddPsychz({ openInfo, closeFu, upTableFu, addTableFu }: Props) {
 
   const [isOk, setIsOk] = useState(false);
 
+  // 判断机房编码是否重复
+  const numIsAgain = useMemo(() => {
+    const tempArr = roomList.filter((v) => v);
+    return new Set(tempArr).size !== tempArr.length;
+  }, [roomList]);
+
   // 通过校验点击确定
   const onFinish = useCallback(
     async (value: any) => {
@@ -70,6 +82,9 @@ function AddPsychz({ openInfo, closeFu, upTableFu, addTableFu }: Props) {
 
       if (roomList.filter((v) => v).length <= 0) return;
 
+      // 校验新增的时候的机房编码
+      if (numIsAgain) return;
+
       const obj = {
         ...value,
         id: openInfo.txt === "新增" ? null : openInfo.id,
@@ -86,7 +101,15 @@ function AddPsychz({ openInfo, closeFu, upTableFu, addTableFu }: Props) {
         closeFu();
       }
     },
-    [addTableFu, closeFu, openInfo.id, openInfo.txt, roomList, upTableFu]
+    [
+      addTableFu,
+      closeFu,
+      numIsAgain,
+      openInfo.id,
+      openInfo.txt,
+      roomList,
+      upTableFu,
+    ]
   );
 
   // 获取用户列表的所有用户,用于表单的  项目经理 的下拉
@@ -95,7 +118,7 @@ function AddPsychz({ openInfo, closeFu, upTableFu, addTableFu }: Props) {
   useEffect(() => {
     // 获取用户列表所有用户信息
     dispatch(
-      C1_APIGgetlist(
+      C1_APIgetlist(
         {
           pageSize: 99999,
           pageNum: 1,
@@ -169,14 +192,24 @@ function AddPsychz({ openInfo, closeFu, upTableFu, addTableFu }: Props) {
             <div className="e_rowL">
               <span> * </span>机房编码:
             </div>
-            <div className="e_rowR">
+            <div
+              className={classNames(
+                "e_rowR",
+                roomList.length >= 10 || numIsAgain ? "e_rowRErr" : ""
+              )}
+            >
+              <div className="e_rowRightTit">
+                {roomList.length >= 10 ? <> 最多可添加10个!&emsp;&emsp;</> : ""}
+                {numIsAgain ? "机房编码重复!" : ""}
+              </div>
+
               {roomList.map((v, i) => (
                 <div
                   className={classNames(
                     "e_rowRrow",
                     roomList.length >= 10 ? "e_rowRrowIconHide" : "",
                     isOk && !v ? "e_rowRrowErr" : "",
-                    openInfo.txt==='编辑'?'e_rowRrowEdit':''
+                    openInfo.txt === "编辑" ? "e_rowRrowEdit" : ""
                   )}
                   key={i}
                 >
@@ -217,26 +250,7 @@ function AddPsychz({ openInfo, closeFu, upTableFu, addTableFu }: Props) {
                 </div>
               ))}
             </div>
-            <div
-              className={classNames(
-                "e_rowRightTit",
-                roomList.length >= 10 ? "e_rowRightTitShow" : ""
-              )}
-            >
-              最多可添加10个
-            </div>
           </div>
-          {/* ) : (
-            <Form.Item
-              label="机房编码"
-              name="roomNum"
-              rules={[{ required: true, message: "请输入机房编码!" }]}
-              getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
-            >
-              <Input maxLength={20} showCount placeholder="请输入内容" />
-            </Form.Item>
-          )}
- */}
           {/* 确定和取消按钮 */}
           <br />
           <Form.Item className="A2addBtn">

+ 5 - 3
src/pages/A2Psychz/index.tsx

@@ -128,11 +128,11 @@ function A2Psychz() {
       },
       {
         title: "站址名称",
-        dataIndex: "name",
+        render: (item: A2tableType) => item.name || "(空)",
       },
       {
         title: "站址编号",
-        dataIndex: "siteNum",
+        render: (item: A2tableType) => item.siteNum || "(空)",
       },
       {
         title: "机房编码",
@@ -213,7 +213,9 @@ function A2Psychz() {
               ...v,
               myCity:
                 !v.province && !v.city ? "(空)" : `${v.province} - ${v.city}`,
-              address: v.address ? v.address : "(空)",
+              address: v.address || "(空)",
+              name: v.name || "(空)",
+              siteNum: v.siteNum || "(空)",
               pmName: v.pmUserId === 1 ? "管理员" : v.pmName || "匿名",
               typeIn:
                 v.typeIn === "pc"

+ 90 - 0
src/pages/B1Plan/data.ts

@@ -0,0 +1,90 @@
+export type B2FromDataType = {
+  searchKey: string;
+  siteLevel: 2;
+  site: undefined | string[];
+  pmUser: string;
+  auditStatus: "" | 0 | 1 | 2 | 3;
+  pushStatus: "" | 0 | 2 | 3;
+  jsonStatus: "" | 0 | 2 | 3;
+  pageSize: number;
+  pageNum: number;
+};
+
+// 场景审核
+export const B1options1 = [
+  {
+    value: "",
+    label: "全部",
+  },
+  {
+    value: 0,
+    label: "待审核",
+  },
+  {
+    value: 1,
+    label: "初审通过",
+  },
+  {
+    value: 2,
+    label: "审核通过",
+  },
+  {
+    value: 3,
+    label: "审核驳回",
+  },
+];
+
+// 审核状态数据转换
+export const B1options1Obj = {
+  0: "待审核",
+  1: "初审通过",
+  2: "审核通过",
+  3: "审核驳回",
+};
+
+// 推送状态状态数据转换
+export const B1options2Obj = {
+  0: "待推送",
+  2: "推送成功",
+  3: "推送失败",
+};
+
+// 场景推送:
+export const B1options2 = [
+  {
+    value: "",
+    label: "全部",
+  },
+  {
+    value: 0,
+    label: "待推送",
+  },
+  {
+    value: 2,
+    label: "推送成功",
+  },
+  {
+    value: 3,
+    label: "推送失败",
+  },
+];
+
+// Json推送:
+export const B1options3 = [
+  {
+    value: "",
+    label: "全部",
+  },
+  {
+    value: 0,
+    label: "待推送",
+  },
+  {
+    value: 2,
+    label: "推送成功",
+  },
+  {
+    value: 3,
+    label: "推送失败",
+  },
+];

+ 55 - 3
src/pages/B1Plan/index.module.scss

@@ -1,5 +1,57 @@
-.B1Plan{
-  :global{
-    
+.B1Plan {
+  :global {
+    .pageTitle {
+      display: flex;
+      align-items: center;
+
+      &>div {
+        margin-left: 4px;
+        font-size: 14px;
+        color: #999;
+      }
+    }
+
+    .B1top {
+      background-color: #fff;
+      border-radius: 10px;
+      padding: 15px 24px;
+
+      .B1topSon {
+        display: flex;
+
+        .B1topRow {
+          margin-right: 20px;
+
+          // 级联选择器的 placeholder
+          .ant-select-selection-placeholder {
+            color: black;
+          }
+        }
+      }
+
+      .B1topSon2 {
+        display: flex;
+        justify-content: space-between;
+        margin-top: 15px;
+
+        &>div {
+          display: flex;
+        }
+      }
+    }
+
+    .tableMain {
+      border-radius: 10px;
+      margin-top: 15px;
+      height: calc(100% - 127px);
+      background-color: #fff;
+
+      .ant-table-body {
+        height: 578px;
+        overflow-y: auto !important;
+        overflow-y: overlay !important;
+
+      }
+    }
   }
 }

+ 334 - 5
src/pages/B1Plan/index.tsx

@@ -1,12 +1,341 @@
-import React from "react";
+import React, {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from "react";
 import styles from "./index.module.scss";
- function B1Plan() {
-  
+import { Button, Cascader, Input, Select, Table, Tooltip } from "antd";
+import mapDataAll from "../C1User/AddUser/city";
+import {
+  B1options1,
+  B1options1Obj,
+  B1options2,
+  B1options2Obj,
+  B1options3,
+  B2FromDataType,
+} from "./data";
+import {
+  ExclamationCircleOutlined,
+  QuestionCircleOutlined,
+} from "@ant-design/icons";
+import { useDispatch, useSelector } from "react-redux";
+import { B1_APIgetlist, B1_APIgetlistAll } from "@/store/action/B1Plan";
+import { RootState } from "@/store";
+import { B1tableType } from "@/types";
+import ExportJsonExcel from "js-export-excel";
+import { MessageFu } from "@/utils/message";
+import dayjs from "dayjs";
+
+function B1Plan() {
+  const dispatch = useDispatch();
+
+  // 筛选和分页
+  const [tableSelect, setTableSelect] = useState<B2FromDataType>({
+    searchKey: "",
+    siteLevel: 2,
+    site: undefined,
+    pmUser: "",
+    auditStatus: "",
+    pushStatus: "",
+    jsonStatus: "",
+    pageSize: 10,
+    pageNum: 1,
+  });
+
+  // 发送接口的函数
+  const getListFu = useCallback(() => {
+    const obj = {
+      ...tableSelect,
+      site: tableSelect.site ? tableSelect.site[1] : null,
+    };
+    dispatch(B1_APIgetlist(obj));
+  }, [dispatch, tableSelect]);
+
+  useEffect(() => {
+    getListFu();
+  }, [getListFu]);
+
+  // 输入框的改变
+  const txtTimeRef = useRef(-1);
+  const txtChangeFu = useCallback(
+    (txt: string, key: "pmUser" | "searchKey") => {
+      clearTimeout(txtTimeRef.current);
+      txtTimeRef.current = window.setTimeout(() => {
+        setTableSelect({ ...tableSelect, [key]: txt, pageNum: 1 });
+      }, 500);
+    },
+    [tableSelect]
+  );
+
+  // 点击重置
+  const [inputKey, setInputKey] = useState(1);
+  const resetSelectFu = useCallback(() => {
+    // 把2个输入框和时间选择器清空
+    setInputKey(Date.now());
+    setTableSelect({
+      searchKey: "",
+      siteLevel: 2,
+      site: undefined,
+      pmUser: "",
+      auditStatus: "",
+      pushStatus: "",
+      jsonStatus: "",
+      pageSize: 10,
+      pageNum: 1,
+    });
+  }, []);
+
+  // 从仓库获取列表
+  const B1TableList = useSelector(
+    (state: RootState) => state.B1Plan.B1TableList
+  );
+
+  // 页码变化
+  const paginationChange = useCallback(
+    () => (pageNum: number, pageSize: number) => {
+      setTableSelect({ ...tableSelect, pageNum, pageSize });
+    },
+    [tableSelect]
+  );
+
+  const columns = useMemo(() => {
+    return [
+      {
+        title: "站址名称",
+        render: (item: B1tableType) => item.name || "(空)",
+      },
+      {
+        title: "站址编号",
+        render: (item: B1tableType) => item.siteNum || "(空)",
+      },
+      {
+        title: "站址地区",
+        render: (item: B1tableType) =>
+          !item.province && !item.city
+            ? "(空)"
+            : `${item.province} - ${item.city}`,
+      },
+      {
+        title: "机房编码",
+        dataIndex: "roomNum",
+      },
+      {
+        title: "项目经理",
+        render: (item: B1tableType) => {
+          if (item.creatorId === 1) return "管理员";
+          else {
+            return item.pmName || "匿名";
+          }
+        },
+      },
+      {
+        title: "场景码",
+        render: (item: B1tableType) => item.sceneCode || "(空)",
+      },
+      {
+        title: "场景审核状态",
+        render: (item: B1tableType) =>
+          Reflect.get(B1options1Obj, item.auditStatus) || "(空)",
+      },
+      {
+        title: "场景推送状态",
+        render: (item: B1tableType) => (
+          <>
+            {Reflect.get(B1options2Obj, item.pushStatus) || "(空)"}
+            <span style={{ cursor: "pointer" }} hidden={!item.pushDesc}>
+              <Tooltip title={item.pushDesc}>
+                &nbsp;
+                <QuestionCircleOutlined rev={undefined} />
+              </Tooltip>
+            </span>
+          </>
+        ),
+      },
+      {
+        title: "Json推送状态",
+        render: (item: B1tableType) =>
+          Reflect.get(B1options2Obj, item.jsonStatus) || "(空)",
+      },
+    ];
+  }, []);
+  // 点击导出
+  const deriveFu = useCallback(async () => {
+    if (B1TableList.list.length === 0)
+      return MessageFu.warning("当前搜索条件没有数据!");
+    const name = "进度统计" + dayjs(new Date()).format("YYYY-MM-DD HH:mm");
+
+    const res = await B1_APIgetlistAll({
+      ...tableSelect,
+      site: tableSelect.site ? tableSelect.site[1] : null,
+      pageNum: 1,
+      pageSize: 99999,
+    });
+
+    if (res.code === 0) {
+      const option = {
+        fileName: name,
+        datas: [
+          {
+            sheetData: res.data.records.map((v: B1tableType) => ({
+              name: v.name || "(空)",
+              siteNum: v.siteNum || "(空)",
+              myCity:
+                !v.province && !v.city ? "(空)" : `${v.province} - ${v.city}`,
+              roomNum: v.roomNum,
+              pmName: v.creatorId === 1 ? "管理员" : v.pmName || "匿名",
+              sceneCode: v.sceneCode || "(空)",
+              auditStatus:
+                Reflect.get(B1options1Obj, v.auditStatus) || "(空)",
+              pushStatus: Reflect.get(B1options2Obj, v.pushStatus) || "(空)",
+              jsonStatus: Reflect.get(B1options2Obj, v.jsonStatus) || "(空)",
+            })),
+            sheetName: name,
+            sheetFilter: [
+              "name",
+              "siteNum",
+              "myCity",
+              "roomNum",
+              "pmName",
+              "sceneCode",
+              "auditStatus",
+              "pushStatus",
+              "jsonStatus",
+            ],
+            sheetHeader: [
+              "站址名称",
+              "站址编号",
+              "站址地区",
+              "机房编码",
+              "项目经理",
+              "场景码",
+              "场景审核状态",
+              "场景推送状态",
+              "Json推送状态",
+            ],
+            columnWidths: [10, 10, 10, 10, 10, 10, 10, 10, 10],
+          },
+        ],
+      };
+
+      const toExcel = new ExportJsonExcel(option); //new
+      toExcel.saveExcel(); //保存
+    }
+  }, [B1TableList.list.length, tableSelect]);
+
   return (
     <div className={styles.B1Plan}>
-      <h1>B1Plan</h1>
+      <div className="pageTitle">
+        进度统计&emsp;
+        <ExclamationCircleOutlined rev={undefined} />
+        <div>
+          当存在重复的机房编码时,请在[场景审核]中删除多余场景码后,重新统计
+        </div>
+      </div>
+      {/* 顶部筛选 */}
+      <div className="B1top">
+        <div className="B1topSon">
+          <div className="B1topRow">
+            <span>搜索项:</span>
+            <Input
+              key={inputKey}
+              maxLength={10}
+              style={{ width: 323 }}
+              placeholder="请输入站址名称/站置编号/机房编码,最多10字"
+              allowClear
+              onChange={(e) => txtChangeFu(e.target.value, "searchKey")}
+            />
+          </div>
+          <div className="B1topRow">
+            <span>站址地区:</span>
+            <Cascader
+              value={tableSelect.site}
+              style={{ width: 160 }}
+              options={mapDataAll}
+              placeholder="全部"
+              onChange={(e) =>
+                setTableSelect({ ...tableSelect, site: e as string[] })
+              }
+            />
+          </div>
+          <div className="B1topRow">
+            <span>项目经理:</span>
+            <Input
+              key={inputKey}
+              maxLength={10}
+              style={{ width: 200 }}
+              placeholder="请输入姓名,最多10字"
+              allowClear
+              onChange={(e) => txtChangeFu(e.target.value, "pmUser")}
+            />
+          </div>
+        </div>
+        <div className="B1topSon B1topSon2">
+          <div>
+            <div className="B1topRow">
+              <span>场景审核:</span>
+              <Select
+                style={{ width: 223 }}
+                value={tableSelect.auditStatus}
+                onChange={(e) =>
+                  setTableSelect({ ...tableSelect, auditStatus: e, pageNum: 1 })
+                }
+                options={B1options1}
+              />
+            </div>
+            <div className="B1topRow">
+              <span>场景推送:</span>
+              <Select
+                style={{ width: 223 }}
+                value={tableSelect.pushStatus}
+                onChange={(e) =>
+                  setTableSelect({ ...tableSelect, pushStatus: e, pageNum: 1 })
+                }
+                options={B1options2}
+              />
+            </div>
+            <div className="B1topRow">
+              <span>Json推送:</span>
+              <Select
+                style={{ width: 223 }}
+                value={tableSelect.jsonStatus}
+                onChange={(e) =>
+                  setTableSelect({ ...tableSelect, jsonStatus: e, pageNum: 1 })
+                }
+                options={B1options3}
+              />
+            </div>
+          </div>
+          <div>
+            <Button onClick={resetSelectFu}>重置</Button>&emsp;
+            <Button type="primary" onClick={deriveFu}>
+              导出表格
+            </Button>
+          </div>
+        </div>
+      </div>
+
+      {/* 表格主体 */}
+      <div className="tableMain">
+        <Table
+          scroll={{ y: 578 }}
+          dataSource={B1TableList.list}
+          columns={columns}
+          rowKey="id"
+          pagination={{
+            showQuickJumper: true,
+            position: ["bottomCenter"],
+            showSizeChanger: true,
+            current: tableSelect.pageNum,
+            pageSize: tableSelect.pageSize,
+            total: B1TableList.total,
+            onChange: paginationChange(),
+          }}
+        />
+      </div>
     </div>
-  )
+  );
 }
 
 const MemoB1Plan = React.memo(B1Plan);

+ 2 - 2
src/pages/C1User/index.tsx

@@ -10,7 +10,7 @@ import { Button, Input, Popconfirm, Select, Table } from "antd";
 import { C1TopType, C1openInfoType, C1options } from "./data";
 import { useDispatch, useSelector } from "react-redux";
 import {
-  C1_APIGgetlist,
+  C1_APIgetlist,
   C1_APIpassReset,
   C1_APIremoves,
 } from "@/store/action/C1User";
@@ -34,7 +34,7 @@ function C1User() {
       ...tableSelect,
       roleId: tableSelect.roleId === "全部" ? "" : tableSelect.roleId,
     };
-    dispatch(C1_APIGgetlist(obj));
+    dispatch(C1_APIgetlist(obj));
   }, [dispatch, tableSelect]);
 
   useEffect(() => {

+ 24 - 0
src/store/action/B1Plan.ts

@@ -0,0 +1,24 @@
+import http from "@/utils/http";
+import { AppDispatch } from "..";
+/**
+ * 获取 进度统计 表格列表(存到仓库)
+ */
+export const B1_APIgetlist = (data: any) => {
+  return async (dispatch: AppDispatch) => {
+    const res = await http.post("cms/schedule/pageList", data);
+    if (res.code === 0) {
+      const obj = {
+        list: res.data.records,
+        total: res.data.total,
+      };
+      dispatch({ type: "B1/getList", payload: obj });
+    }
+  };
+};
+
+/**
+ * 获取 机房管理 表格列表(导出表格)
+ */
+export const B1_APIgetlistAll = (data: any) => {
+  return http.post("cms/schedule/pageList", data);
+};

+ 1 - 1
src/store/action/C1User.ts

@@ -3,7 +3,7 @@ import { AppDispatch } from "..";
 /**
  * 获取 用户管理 表格列表(存到仓库)
  */
-export const C1_APIGgetlist = (data: any, falg?: boolean) => {
+export const C1_APIgetlist = (data: any, falg?: boolean) => {
   return async (dispatch: AppDispatch) => {
     const res = await http.post("sys/user/pageList", data);
     if (res.code === 0) {

+ 27 - 0
src/store/reducer/B1Plan.ts

@@ -0,0 +1,27 @@
+import { B1tableType } from "@/types";
+
+// 初始化状态
+const initState = {
+  // 列表数据
+  B1TableList: {
+    list: [] as B1tableType[],
+    total: 0,
+  },
+};
+
+// 定义 action 类型
+type Props = {
+  type: "B1/getList";
+  payload: { list: B1tableType[]; total: number };
+};
+
+// reducer
+export default function Reducer(state = initState, action: Props) {
+  switch (action.type) {
+    // 获取列表数据
+    case "B1/getList":
+      return { ...state, B1TableList: action.payload };
+    default:
+      return state;
+  }
+}

+ 2 - 0
src/store/reducer/index.ts

@@ -5,6 +5,7 @@ import { combineReducers } from "redux";
 import A0Layout from "./layout";
 import A1Camera from "./A1Camera";
 import A2Psychz from "./A2Psychz";
+import B1Plan from "./B1Plan";
 import C1User from "./C1User";
 import C2Log from "./C2Log";
 
@@ -13,6 +14,7 @@ const rootReducer = combineReducers({
   A0Layout,
   A1Camera,
   A2Psychz,
+  B1Plan,
   C1User,
   C2Log,
 });

+ 20 - 0
src/types/api/B1Plan.d.ts

@@ -0,0 +1,20 @@
+export type B1tableType = {
+  auditDesc: string;
+  auditStatus: number;
+  city: string;
+  creatorId:nulll|number
+  createTime: string;
+  creatorName: string;
+  id: number;
+  jsonDesc: string;
+  jsonStatus: number;
+  name: string;
+  pmName: string;
+  province: string;
+  pushDesc: string;
+  pushStatus: number;
+  roomNum: string;
+  sceneCode: string;
+  siteNum: string;
+  updateTime: string;
+};

+ 1 - 0
src/types/index.d.ts

@@ -1,5 +1,6 @@
 export * from './api/layot'
 export * from './api/A1Camera'
 export * from './api/A2Psychz'
+export * from './api/B1Plan'
 export * from './api/C1User'
 export * from './api/C2Log'