From 2a3c10b297180f7b2aff5ccee262a35fdcea234d Mon Sep 17 00:00:00 2001
From: zhugy <zhugy@yisa.com>
Date: Tue, 16 Jan 2024 16:18:46 +0800
Subject: [PATCH 1/7] =?UTF-8?q?feat():=E6=96=B0=E5=A2=9E=E5=85=85=E7=94=B5?=
 =?UTF-8?q?=E7=AB=99=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/components/form/FormTreeSelectNew/index.jsx    |   6 +
 src/pages/NewEnergy/ChargeStationMgm/index.jsx     |   6 +
 src/pages/NewEnergy/ChargeStationMgm/index.scss    |  21 ++
 src/pages/NewEnergy/ChargeStationMgm/loadable.jsx  | 355 +++++++++++++++++++++
 .../RecordsInquiry/Appointment/index.scss          | 238 --------------
 .../RecordsInquiry/Appointment/loadable.jsx        |  13 -
 .../NewEnergy/RecordsInquiry/Charge/index.scss     | 238 --------------
 .../NewEnergy/RecordsInquiry/Charge/loadable.jsx   |  90 +-----
 .../NewEnergy/RecordsInquiry/Unlocking/index.scss  | 238 --------------
 .../NewEnergy/RecordsInquiry/Violation/index.scss  | 238 --------------
 .../RecordsInquiry/Violation/loadable.jsx          |  76 +----
 src/pages/NewEnergy/index.jsx                      |   2 +
 src/router/router.config.js                        |   6 +
 src/services/NewEnergy/ChargeStationMgm.js         |  32 ++
 src/services/NewEnergy/index.js                    |   4 +-
 src/services/index.js                              |   4 +-
 16 files changed, 459 insertions(+), 1108 deletions(-)
 create mode 100644 src/pages/NewEnergy/ChargeStationMgm/index.scss
 create mode 100644 src/pages/NewEnergy/ChargeStationMgm/loadable.jsx
 create mode 100644 src/services/NewEnergy/ChargeStationMgm.js

diff --git a/src/components/form/FormTreeSelectNew/index.jsx b/src/components/form/FormTreeSelectNew/index.jsx
index 6a2510f..462d469 100644
--- a/src/components/form/FormTreeSelectNew/index.jsx
+++ b/src/components/form/FormTreeSelectNew/index.jsx
@@ -13,6 +13,11 @@ export default function FormTreeSelectNew(props) {
     placeholder = "请选择",
     value = [],
     treeData = [],
+    fieldNames={
+      label: "name",
+      value: "id",
+      children: "children",
+    },
     disabled = false,
     className = "",
     maxHeight = 400,
@@ -174,6 +179,7 @@ export default function FormTreeSelectNew(props) {
           allowClear={allowClear}
           value={value}
           disabled={disabled}
+          fieldNames={fieldNames}
           dropdownStyle={{ maxHeight: maxHeight, overflow: "auto" }}
           treeData={data}
           placeholder={placeholder}
diff --git a/src/pages/NewEnergy/ChargeStationMgm/index.jsx b/src/pages/NewEnergy/ChargeStationMgm/index.jsx
index e69de29..d1dc1c2 100644
--- a/src/pages/NewEnergy/ChargeStationMgm/index.jsx
+++ b/src/pages/NewEnergy/ChargeStationMgm/index.jsx
@@ -0,0 +1,6 @@
+import React from "react"
+import loadable from "@loadable/component"
+import { LoadingImg } from "@/components"
+
+const Appointment = loadable(() => import("./loadable"))
+export default (pros) => <Appointment {...pros} fallback={<LoadingImg />} />
\ No newline at end of file
diff --git a/src/pages/NewEnergy/ChargeStationMgm/index.scss b/src/pages/NewEnergy/ChargeStationMgm/index.scss
new file mode 100644
index 0000000..3ac3e8d
--- /dev/null
+++ b/src/pages/NewEnergy/ChargeStationMgm/index.scss
@@ -0,0 +1,21 @@
+.add-station-modal {
+  .add-station-body {
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    .row {
+      width: 100%;
+      margin: 10px 0;
+    }
+    .cc-form-tree {
+      margin-bottom: 0;
+    }
+    .cc-form-content,.form-select-single-content {
+      flex: auto;
+    }
+    .cc-form-name,.form-select-single-name {
+      width: 100px;
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/pages/NewEnergy/ChargeStationMgm/loadable.jsx b/src/pages/NewEnergy/ChargeStationMgm/loadable.jsx
new file mode 100644
index 0000000..63062b4
--- /dev/null
+++ b/src/pages/NewEnergy/ChargeStationMgm/loadable.jsx
@@ -0,0 +1,355 @@
+import React, { useState, useRef, useEffect } from "react";
+import {
+  message,
+  Modal,
+  Button,
+  Cascader
+} from "antd";
+import ajax from "@/services";
+import { useSessionStorageState, useSetState } from "ahooks"
+import { TableModule, FormInput, FormSelect, FormTreeSelectNew } from "@/components";
+import "./index.scss";
+
+
+function Appointment() {
+  // 详情弹窗
+  const [detailVisible, setDetailVisible] = useState(false);
+  // 列表数据
+  const [tableData, setTableData] = useState([]);
+  // 数据总数
+  const [total, setTotal] = useState(0);
+  // 详情数据
+  const [detailData, setDetailData] = useState({});
+  // 站点状态下拉
+  const [siteList, setSiteList] = useState([]);
+  // 区域下拉
+  const [areaList, setAreaList] = useState([]);
+  //商户名称下拉
+  const [operatorList, setOperatorList] = useState([]);
+  // 添加站点
+  const initAdd = {
+    name: "",
+    code: "",
+    address: "",
+    site_type: "",
+    area: "",
+    operator: ""
+  }
+  const [addFormData, setAddFormData] = useSetState(initAdd);
+  const [formData, setFormData] = useSetState({});
+  // 初始搜索条件
+  const initFormData = {
+    operator: "0",
+    rule_name: "",
+  };
+
+  const columns = [
+    {
+      title: "充电站名称",
+      dataIndex: "name",
+      key: "name",
+      align: "center",
+    },
+    {
+      title: "充电站编码",
+      dataIndex: "code",
+      key: "code",
+      align: "center",
+    },
+    {
+      title: "站点类型",
+      dataIndex: "site_type",
+      key: "site_type",
+      align: "center",
+    },
+    {
+      title: "所属区域",
+      dataIndex: "area",
+      key: "area",
+      align: "center",
+    },
+    {
+      title: "详细地址",
+      dataIndex: "address",
+      key: "address",
+      align: "center",
+    },
+    {
+      title: "车位总数",
+      dataIndex: "count",
+      key: "count",
+      align: "center",
+    },
+    {
+      title: "商户名称",
+      dataIndex: "operator",
+      key: "operator",
+      align: "center",
+    },
+    {
+      title: "站点状态",
+      dataIndex: "site_status",
+      key: "site_status",
+      align: "center",
+    },
+    {
+      title: "操作",
+      dataIndex: "operation",
+      key: "operation",
+      align: "center",
+      fixed: "right",
+      width: 100,
+      render: (text, record, index) => {
+        return (
+          <>
+            <Button type="primary" onClick={() => openModal(index, record)}>
+              详情
+            </Button>
+          </>
+        )
+
+      },
+    },
+  ];
+
+  const formSearch = [
+    {
+      name: "name",
+      type: "Input",
+      label: "充电站名称",
+      placeholder: "请输入充电站名称",
+    },
+    {
+      name: "area",
+      type: "TreeSelect",
+      defaultValue: "0",
+      label: "所属区域",
+      placeholder: "请选择所属区域",
+    },
+    {
+      name: "site_status",
+      type: "Select",
+      label: "站点状态",
+      options: [
+        { value: "0", label: "全部" },
+        ...siteList
+      ],
+      defaultValue: "0",
+      placeholder: "请选择站点状态",
+    },
+    {
+      name: "operator",
+      type: "Select",
+      label: "商户名称",
+      defaultValue: "0",
+      placeholder: "请选择商户名称",
+    },
+  ];
+
+  const init = () => {
+    getSiteStatus()
+    getAreaList()
+    getAllOperator()
+  }
+  // 获取站点状态下拉
+  const getSiteStatus = () => {
+    ajax.getSiteStatus().then((res) => {
+      const { status, data } = res
+      if (status === 20000) {
+        if (data && data.length) {
+          data.shift()
+          setSiteList(data);
+        }
+      } else {
+        message.error(res.message)
+      }
+    });
+  }
+  // 获取区域下拉
+  const getAreaList = () => {
+    ajax.getAreaTree().then((res) => {
+      const { status, data } = res
+      if (status === 20000) {
+        if (data && data.length) {
+          data.shift()
+          setAreaList(data);
+        }
+      }
+    }).catch((err) => {
+      console.error(err);
+    });
+  }
+  // 获取商户下拉
+  const getAllOperator = () => {
+    ajax.getAllOperator().then((res) => {
+      const { status, data } = res
+      if (status === 20000) {
+        if (data && data.length) {
+          data.shift()
+          setOperatorList(data);
+        }
+      }
+    }).catch((err) => {
+      console.error(err);
+    });;
+  }
+
+  // 打开弹窗
+  const openModal = (index, record) => {
+    setDetailData(record)
+    setDetailVisible(true);
+  }
+
+  // 检索
+  const search = (params) => {
+    ajax.getStationList(params).then((res) => {
+      if (res.status === 20000) {
+        setFormData(params)
+        setTableData(res.data);
+        setTotal(res.total);
+      } else {
+        message.error(res.message)
+      }
+    });
+  }
+  // 新增
+  const handelAdd = () => {
+    setAddFormData(initAdd)
+    setDetailVisible(true)
+  }
+
+  const handelOk = () => {
+    ajax.addStation(addFormData).then((res) => {
+      if (res.status === 20000) {
+        message.success("新增成功")
+        setDetailVisible(false);
+        setAddFormData(initAdd)
+        search(formData)
+      } else {
+        message.error(res.message)
+      }
+    });
+  }
+
+  useEffect(() => {
+    init()
+  }, [])
+
+
+  return (
+    <>
+      <TableModule
+        showSerial={true}
+        isExport={false}
+        diyButton={
+          <Button
+            type="primary"
+            onClick={handelAdd}
+          >
+            新增
+          </Button>
+        }
+        columns={columns}
+        tableData={tableData}
+        formSearch={formSearch}
+        pagename="充电站管理"
+        pageName={'chargeStationMgm'}
+        initFormData={initFormData}
+        total={total}
+        search={search}
+        exportUrl="/api/bpm/record/get_record_export"
+      />
+      <Modal
+        title="添加充电站"
+        open={detailVisible}
+        width={500}
+        className="add-station-modal"
+        onCancel={() => {
+          setDetailVisible(false);
+        }}
+        onOk={handelOk}
+        destroyOnClose
+      >
+        <div className="add-station-body">
+          <div className="row">
+            <FormInput
+              yisaLabel="充电站名称"
+              placeholder="请输入充电站名称"
+              isShowAfterIcon={false}
+              value={addFormData.name}
+              onChange={e => { setAddFormData({ name: e.target.value }) }}
+            />
+          </div>
+          <div className="row">
+            <FormInput
+              yisaLabel="充电站编码"
+              placeholder="请输入充电站编码"
+              isShowAfterIcon={false}
+              value={addFormData.code}
+              onChange={e => { setAddFormData({ code: e.target.value }) }}
+            />
+          </div>
+          <div className="row">
+            <FormInput
+              yisaLabel="详细地址"
+              placeholder="请输入详细地址"
+              isShowAfterIcon={false}
+              value={addFormData.address}
+              onChange={e => { setAddFormData({ address: e.target.value }) }}
+            />
+          </div>
+          <div className="row">
+            <FormSelect
+              yisaLabel="站点类型"
+              placeholder="请选择站点类型"
+              yisaData={siteList}
+              value={addFormData.site_type}
+              onChange={e => { setAddFormData({ site_type: e }) }}
+            />
+          </div>
+          <div className="row">
+            <FormTreeSelectNew
+              yisaLabel="所属区域"
+              labelPosition="left"
+              placeholder="请选择所属区域"
+              value={addFormData.area || null}
+              fieldNames={{
+                label: "name",
+                value: "id",
+                children: "children",
+              }}
+              treeData={areaList}
+              multiple={false}
+              isBayonet={true}
+              onChange={(e) => { setAddFormData({ area: e }) }}
+            />
+            {/* <Cascader
+              options={areaList}
+              defaultValue={addFormData.area}
+              placeholder="请选择区域"
+              expandTrigger="hover"
+              changeOnSelect
+              fieldNames={{
+                label: "name",
+                value: "id",
+                children: "children",
+              }}
+              onChange={cascaderChange}
+            /> */}
+          </div>
+          <div className="row">
+            <FormSelect
+              yisaLabel="商户名称"
+              placeholder="请选择商户名称"
+              yisaData={operatorList}
+              value={addFormData.operator}
+              onChange={e => { setAddFormData({ operator: e }) }}
+            />
+          </div>
+        </div>
+      </Modal>
+    </>
+  );
+}
+
+export default Appointment;
diff --git a/src/pages/NewEnergy/RecordsInquiry/Appointment/index.scss b/src/pages/NewEnergy/RecordsInquiry/Appointment/index.scss
index 9a8202a..e69de29 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Appointment/index.scss
+++ b/src/pages/NewEnergy/RecordsInquiry/Appointment/index.scss
@@ -1,238 +0,0 @@
-@import "@/assets/css/mixin.scss";
-$color-container-bg: var(--color-container-bg);
-$color-user-list-bg: var(--color-user-list-bg);
-$color-text: var(--color-text);
-$color-primary: var(--color-primary);
-
-.ant-tabs {
-  margin-bottom: 16px;
-
-  .ant-tabs-nav {
-    margin-bottom: 0 !important;
-
-    &::before {
-      border-bottom: 1px solid var(--color-card-line) !important;
-    }
-  }
-
-  .ant-tabs-nav-wrap {
-    width: 100%;
-    box-sizing: content-box;
-
-    .ant-tabs-nav-list {
-      width: 340px;
-
-      .ant-tabs-ink-bar {
-        height: 3px;
-        background-color: #00ccff;
-      }
-
-      .ant-tabs-tab {
-        flex: 1;
-        width: 100%;
-        display: flex;
-        justify-content: center;
-        padding-bottom: 10px;
-        text-align: center;
-        cursor: pointer;
-        font-size: 14px !important;
-        font-family: MicrosoftYaHei;
-        text-align: center;
-        letter-spacing: 0.7px;
-      }
-
-      .ant-tabs-tab-active {
-        div {
-          color: #00ccff;
-        }
-      }
-    }
-  }
-}
-
-.ant-input::-webkit-input-placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-input::-moz-placeholder {
-  color: var(--color-placeholder);
-}
-.right-list  .ant-btn-primary {
-  width: 68px;
-  height: 30px;
-  background: linear-gradient(180deg, #3aa9ff, #59b7ff);
-  border-radius: 4px;
-}
-.ant-input:-ms-input-placeholder {
-  color: var(--color-placeholder);
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-thead th {
-  background-color: #616b83 !important;
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-tbody td {
-  background-color: #3e4557 !important;
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-tbody tr:nth-child(even) td {
-  background-color: #3e4557 !important;
-}
-.ant-input::placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-select-selection-placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {
-  background: var(--color-input-disabled-bg);
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled .ant-select-arrow {
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector {
-  background-color: var(--color-input-disabled-bg);
-  color: var(--color-input-disabled-color);
-  cursor: not-allowed;
-}
-
-.ant-select-multiple {
-  .ant-select-selector {
-    .ant-select-selection-item {
-      background-color: var(--color-bg-body);
-      border-color: var(--color-border);
-
-      .ant-select-selection-item-remove {
-        color: var(--color-text);
-      }
-    }
-  }
-}
-
-.ant-select-arrow {
-  color: var(--color-text);
-}
-
-.ant-select-clear {
-  border-radius: 50%;
-}
-
-.ant-select-dropdown-menu {
-  background-color: var(--color-input-bg);
-
-  .ant-select-dropdown-menu-item {
-    color: var(--color-text);
-
-    &.ant-select-dropdown-menu-item-active {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-
-    &.ant-select-dropdown-menu-item-selected {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-
-    &:hover {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-  }
-}
-
-.ant-select-selector {
-  background-color: var(--color-search-list-item-bg) !important;
-  box-shadow: none !important;
-  border-radius: 4px;
-  color: var(--color-search-list-item-value);
-  border-color: var(--color-search-list-item-bd) !important;
-}
-
-.ant-select-selection {
-  background-color: var(--color-input-bg);
-  box-shadow: none;
-  color: var(--color-text);
-  // border-color:var(--checkable-tag-border);
-}
-
-.ant-form-horizontal .ant-form-item-label {
-  label {
-    display: inline-block;
-    word-wrap: break-word;
-    white-space: normal;
-  }
-}
-
-.ant-picker {
-  width: 100%;
-  background-color: var(--color-search-list-item-bg);
-  border-color: var(--color-border);
-}
-
-// .yisa-table {
-//   width: 100%;
-
-//   .ant-table-thead {
-//     th {
-//       background: var(--color-table-header-bg) !important;
-//     }
-//   }
-
-//   .ant-table-tbody {
-//     td {
-//       background: var(--color-table-body-bg) !important;
-//       border-bottom-color: var(--color-table-border-bottom-color);
-//     }
-
-//     tr:nth-child(even) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-
-//     tr:nth-child(odd) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-//   }
-// }
-.totalModal{
-  .ant-modal-footer{
-    display: none;
-  }
-  position: absolute;
-  top: 40px;
-  right: 174px;
-}
-.ltc-item-img {
-  width: 390px;
-  height: 300px;
-  border: 1px solid;
-  background: #6565656b;
-  margin-right: 20px !important;
-  img  {
-    height: 295px;
-    width: 387px;
-    // object-fit: contain;
-  }
-}
-.hanleHistoyModal{
-  max-height: 700px;
-  overflow: auto;
-}
-.hanleHistoyModal::-webkit-scrollbar {
-  width: 5px;
-}
-.hanleHistoyModal::-webkit-scrollbar-thumb {
-  background-color: #9da2ab;
-  border-radius: 10px;
-}
-.modal-img{
-  img{
-    width: 200px;
-    height: 200px;
-  }
-}
\ No newline at end of file
diff --git a/src/pages/NewEnergy/RecordsInquiry/Appointment/loadable.jsx b/src/pages/NewEnergy/RecordsInquiry/Appointment/loadable.jsx
index febe305..8bccff3 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Appointment/loadable.jsx
+++ b/src/pages/NewEnergy/RecordsInquiry/Appointment/loadable.jsx
@@ -1,26 +1,13 @@
 import React, { useState, useRef, useEffect } from "react";
 import {
   message,
-  Pagination,
-  Table,
-  Space,
   Modal,
   Button,
-  Tabs,
-  Descriptions,
-  Input,
-  Steps,
-  Select,
-  Image,
-  Timeline,
-  Popover
 } from "antd";
-import { dictionary } from "@/config/common";
 import ajax from "@/services";
 import { TableModule } from "@/components";
 import "./index.scss";
 
-const { TextArea } = Input;
 
 function Appointment() {
   // 详情弹窗
diff --git a/src/pages/NewEnergy/RecordsInquiry/Charge/index.scss b/src/pages/NewEnergy/RecordsInquiry/Charge/index.scss
index 9a8202a..e69de29 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Charge/index.scss
+++ b/src/pages/NewEnergy/RecordsInquiry/Charge/index.scss
@@ -1,238 +0,0 @@
-@import "@/assets/css/mixin.scss";
-$color-container-bg: var(--color-container-bg);
-$color-user-list-bg: var(--color-user-list-bg);
-$color-text: var(--color-text);
-$color-primary: var(--color-primary);
-
-.ant-tabs {
-  margin-bottom: 16px;
-
-  .ant-tabs-nav {
-    margin-bottom: 0 !important;
-
-    &::before {
-      border-bottom: 1px solid var(--color-card-line) !important;
-    }
-  }
-
-  .ant-tabs-nav-wrap {
-    width: 100%;
-    box-sizing: content-box;
-
-    .ant-tabs-nav-list {
-      width: 340px;
-
-      .ant-tabs-ink-bar {
-        height: 3px;
-        background-color: #00ccff;
-      }
-
-      .ant-tabs-tab {
-        flex: 1;
-        width: 100%;
-        display: flex;
-        justify-content: center;
-        padding-bottom: 10px;
-        text-align: center;
-        cursor: pointer;
-        font-size: 14px !important;
-        font-family: MicrosoftYaHei;
-        text-align: center;
-        letter-spacing: 0.7px;
-      }
-
-      .ant-tabs-tab-active {
-        div {
-          color: #00ccff;
-        }
-      }
-    }
-  }
-}
-
-.ant-input::-webkit-input-placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-input::-moz-placeholder {
-  color: var(--color-placeholder);
-}
-.right-list  .ant-btn-primary {
-  width: 68px;
-  height: 30px;
-  background: linear-gradient(180deg, #3aa9ff, #59b7ff);
-  border-radius: 4px;
-}
-.ant-input:-ms-input-placeholder {
-  color: var(--color-placeholder);
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-thead th {
-  background-color: #616b83 !important;
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-tbody td {
-  background-color: #3e4557 !important;
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-tbody tr:nth-child(even) td {
-  background-color: #3e4557 !important;
-}
-.ant-input::placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-select-selection-placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {
-  background: var(--color-input-disabled-bg);
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled .ant-select-arrow {
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector {
-  background-color: var(--color-input-disabled-bg);
-  color: var(--color-input-disabled-color);
-  cursor: not-allowed;
-}
-
-.ant-select-multiple {
-  .ant-select-selector {
-    .ant-select-selection-item {
-      background-color: var(--color-bg-body);
-      border-color: var(--color-border);
-
-      .ant-select-selection-item-remove {
-        color: var(--color-text);
-      }
-    }
-  }
-}
-
-.ant-select-arrow {
-  color: var(--color-text);
-}
-
-.ant-select-clear {
-  border-radius: 50%;
-}
-
-.ant-select-dropdown-menu {
-  background-color: var(--color-input-bg);
-
-  .ant-select-dropdown-menu-item {
-    color: var(--color-text);
-
-    &.ant-select-dropdown-menu-item-active {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-
-    &.ant-select-dropdown-menu-item-selected {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-
-    &:hover {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-  }
-}
-
-.ant-select-selector {
-  background-color: var(--color-search-list-item-bg) !important;
-  box-shadow: none !important;
-  border-radius: 4px;
-  color: var(--color-search-list-item-value);
-  border-color: var(--color-search-list-item-bd) !important;
-}
-
-.ant-select-selection {
-  background-color: var(--color-input-bg);
-  box-shadow: none;
-  color: var(--color-text);
-  // border-color:var(--checkable-tag-border);
-}
-
-.ant-form-horizontal .ant-form-item-label {
-  label {
-    display: inline-block;
-    word-wrap: break-word;
-    white-space: normal;
-  }
-}
-
-.ant-picker {
-  width: 100%;
-  background-color: var(--color-search-list-item-bg);
-  border-color: var(--color-border);
-}
-
-// .yisa-table {
-//   width: 100%;
-
-//   .ant-table-thead {
-//     th {
-//       background: var(--color-table-header-bg) !important;
-//     }
-//   }
-
-//   .ant-table-tbody {
-//     td {
-//       background: var(--color-table-body-bg) !important;
-//       border-bottom-color: var(--color-table-border-bottom-color);
-//     }
-
-//     tr:nth-child(even) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-
-//     tr:nth-child(odd) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-//   }
-// }
-.totalModal{
-  .ant-modal-footer{
-    display: none;
-  }
-  position: absolute;
-  top: 40px;
-  right: 174px;
-}
-.ltc-item-img {
-  width: 390px;
-  height: 300px;
-  border: 1px solid;
-  background: #6565656b;
-  margin-right: 20px !important;
-  img  {
-    height: 295px;
-    width: 387px;
-    // object-fit: contain;
-  }
-}
-.hanleHistoyModal{
-  max-height: 700px;
-  overflow: auto;
-}
-.hanleHistoyModal::-webkit-scrollbar {
-  width: 5px;
-}
-.hanleHistoyModal::-webkit-scrollbar-thumb {
-  background-color: #9da2ab;
-  border-radius: 10px;
-}
-.modal-img{
-  img{
-    width: 200px;
-    height: 200px;
-  }
-}
\ No newline at end of file
diff --git a/src/pages/NewEnergy/RecordsInquiry/Charge/loadable.jsx b/src/pages/NewEnergy/RecordsInquiry/Charge/loadable.jsx
index 50650f2..0530080 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Charge/loadable.jsx
+++ b/src/pages/NewEnergy/RecordsInquiry/Charge/loadable.jsx
@@ -1,26 +1,13 @@
 import React, { useState, useRef, useEffect } from "react";
 import {
   message,
-  Pagination,
-  Table,
-  Space,
   Modal,
   Button,
-  Tabs,
-  Descriptions,
-  Input,
-  Steps,
-  Select,
-  Image,
-  Timeline,
-  Popover
 } from "antd";
-import { dictionary } from "@/config/common";
 import ajax from "@/services";
 import { TableModule } from "@/components";
 import "./index.scss";
 
-const { TextArea } = Input;
 
 function Charge() {
   // 详情弹窗
@@ -39,73 +26,55 @@ function Charge() {
 
   const columns = [
     {
-      title: "用户手机号",
+      title: "充电订单号",
       dataIndex: "operator",
       key: "operator",
       align: "center",
     },
     {
-      title: "车牌号",
+      title: "充电站",
       dataIndex: "plate",
       key: "plate",
       align: "center",
     },
     {
-      title: "充电站",
+      title: "充电电量",
       dataIndex: "plate_color",
       key: "plate_color",
       align: "center",
     },
     {
-      title: "商户名称",
+      title: "电费",
       dataIndex: "berth_id",
       key: "berth_id",
       align: "center",
     },
     {
-      title: "降预约开始时间",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "预约截至时间",
+      title: "充电服务费",
       dataIndex: "in_time",
       key: "in_time",
       align: "center",
     },
     {
-      title: "缴纳预约费用金额",
+      title: "充电收入",
       dataIndex: "in_time",
       key: "in_time",
       align: "center",
     },
     {
-      title: "缴费时间",
+      title: "充电开始时间",
       dataIndex: "in_time",
       key: "in_time",
       align: "center",
     },
     {
-      title: "订单状态",
+      title: "充电结束时间",
       dataIndex: "in_time",
       key: "in_time",
       align: "center",
     },
     {
-      title: "订单完结时间",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "预约费用退款金额",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "顶动感实收金额",
+      title: "充电时长",
       dataIndex: "in_time",
       key: "in_time",
       align: "center",
@@ -134,37 +103,19 @@ function Charge() {
     {
       name: "phone",
       type: "Input",
-      label: "用户手机号",
-      placeholder: "请输入用户手机号",
+      label: "充电站名称",
+      placeholder: "请输入充电站名称",
     },
     {
       name: "plate",
       type: "Input",
-      label: "车牌号",
-      placeholder: "请输入车牌号",
-    },
-    {
-      name: "charging",
-      type: "Input",
-      label: "充电站",
-      placeholder: "请输入充电站",
-    },
-    {
-      name: "operator",
-      type: "Select",
-      label: "商户名称",
-      defaultValue: "0",
-      placeholder: "请选择商户名称",
+      label: "订单编号",
+      placeholder: "请输入订单编号",
     },
     {
       name: "timeStart",
       type: "DateRangePicker",
-      label: "预约开始时间",
-    },
-    {
-      name: "timeEnd",
-      type: "DateRangePicker",
-      label: "订单完结时间",
+      label: "充电开始时间",
     },
   ];
 
@@ -194,20 +145,11 @@ function Charge() {
     <>
       <TableModule
         showSerial={true}
-        isExport={false}
-        diyButton={
-          <Button
-            type="primary"
-            onClick={handelAdd}
-          >
-            新增
-          </Button>
-        }
         columns={columns}
         tableData={tableData}
         formSearch={formSearch}
-        pagename="预约订单"
-        pageName={'Appointment'}
+        pagename="充电订单"
+        pageName={'charge'}
         initFormData={initFormData}
         total={total}
         search={search}
diff --git a/src/pages/NewEnergy/RecordsInquiry/Unlocking/index.scss b/src/pages/NewEnergy/RecordsInquiry/Unlocking/index.scss
index 9a8202a..e69de29 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Unlocking/index.scss
+++ b/src/pages/NewEnergy/RecordsInquiry/Unlocking/index.scss
@@ -1,238 +0,0 @@
-@import "@/assets/css/mixin.scss";
-$color-container-bg: var(--color-container-bg);
-$color-user-list-bg: var(--color-user-list-bg);
-$color-text: var(--color-text);
-$color-primary: var(--color-primary);
-
-.ant-tabs {
-  margin-bottom: 16px;
-
-  .ant-tabs-nav {
-    margin-bottom: 0 !important;
-
-    &::before {
-      border-bottom: 1px solid var(--color-card-line) !important;
-    }
-  }
-
-  .ant-tabs-nav-wrap {
-    width: 100%;
-    box-sizing: content-box;
-
-    .ant-tabs-nav-list {
-      width: 340px;
-
-      .ant-tabs-ink-bar {
-        height: 3px;
-        background-color: #00ccff;
-      }
-
-      .ant-tabs-tab {
-        flex: 1;
-        width: 100%;
-        display: flex;
-        justify-content: center;
-        padding-bottom: 10px;
-        text-align: center;
-        cursor: pointer;
-        font-size: 14px !important;
-        font-family: MicrosoftYaHei;
-        text-align: center;
-        letter-spacing: 0.7px;
-      }
-
-      .ant-tabs-tab-active {
-        div {
-          color: #00ccff;
-        }
-      }
-    }
-  }
-}
-
-.ant-input::-webkit-input-placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-input::-moz-placeholder {
-  color: var(--color-placeholder);
-}
-.right-list  .ant-btn-primary {
-  width: 68px;
-  height: 30px;
-  background: linear-gradient(180deg, #3aa9ff, #59b7ff);
-  border-radius: 4px;
-}
-.ant-input:-ms-input-placeholder {
-  color: var(--color-placeholder);
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-thead th {
-  background-color: #616b83 !important;
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-tbody td {
-  background-color: #3e4557 !important;
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-tbody tr:nth-child(even) td {
-  background-color: #3e4557 !important;
-}
-.ant-input::placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-select-selection-placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {
-  background: var(--color-input-disabled-bg);
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled .ant-select-arrow {
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector {
-  background-color: var(--color-input-disabled-bg);
-  color: var(--color-input-disabled-color);
-  cursor: not-allowed;
-}
-
-.ant-select-multiple {
-  .ant-select-selector {
-    .ant-select-selection-item {
-      background-color: var(--color-bg-body);
-      border-color: var(--color-border);
-
-      .ant-select-selection-item-remove {
-        color: var(--color-text);
-      }
-    }
-  }
-}
-
-.ant-select-arrow {
-  color: var(--color-text);
-}
-
-.ant-select-clear {
-  border-radius: 50%;
-}
-
-.ant-select-dropdown-menu {
-  background-color: var(--color-input-bg);
-
-  .ant-select-dropdown-menu-item {
-    color: var(--color-text);
-
-    &.ant-select-dropdown-menu-item-active {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-
-    &.ant-select-dropdown-menu-item-selected {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-
-    &:hover {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-  }
-}
-
-.ant-select-selector {
-  background-color: var(--color-search-list-item-bg) !important;
-  box-shadow: none !important;
-  border-radius: 4px;
-  color: var(--color-search-list-item-value);
-  border-color: var(--color-search-list-item-bd) !important;
-}
-
-.ant-select-selection {
-  background-color: var(--color-input-bg);
-  box-shadow: none;
-  color: var(--color-text);
-  // border-color:var(--checkable-tag-border);
-}
-
-.ant-form-horizontal .ant-form-item-label {
-  label {
-    display: inline-block;
-    word-wrap: break-word;
-    white-space: normal;
-  }
-}
-
-.ant-picker {
-  width: 100%;
-  background-color: var(--color-search-list-item-bg);
-  border-color: var(--color-border);
-}
-
-// .yisa-table {
-//   width: 100%;
-
-//   .ant-table-thead {
-//     th {
-//       background: var(--color-table-header-bg) !important;
-//     }
-//   }
-
-//   .ant-table-tbody {
-//     td {
-//       background: var(--color-table-body-bg) !important;
-//       border-bottom-color: var(--color-table-border-bottom-color);
-//     }
-
-//     tr:nth-child(even) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-
-//     tr:nth-child(odd) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-//   }
-// }
-.totalModal{
-  .ant-modal-footer{
-    display: none;
-  }
-  position: absolute;
-  top: 40px;
-  right: 174px;
-}
-.ltc-item-img {
-  width: 390px;
-  height: 300px;
-  border: 1px solid;
-  background: #6565656b;
-  margin-right: 20px !important;
-  img  {
-    height: 295px;
-    width: 387px;
-    // object-fit: contain;
-  }
-}
-.hanleHistoyModal{
-  max-height: 700px;
-  overflow: auto;
-}
-.hanleHistoyModal::-webkit-scrollbar {
-  width: 5px;
-}
-.hanleHistoyModal::-webkit-scrollbar-thumb {
-  background-color: #9da2ab;
-  border-radius: 10px;
-}
-.modal-img{
-  img{
-    width: 200px;
-    height: 200px;
-  }
-}
\ No newline at end of file
diff --git a/src/pages/NewEnergy/RecordsInquiry/Violation/index.scss b/src/pages/NewEnergy/RecordsInquiry/Violation/index.scss
index 9a8202a..e69de29 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Violation/index.scss
+++ b/src/pages/NewEnergy/RecordsInquiry/Violation/index.scss
@@ -1,238 +0,0 @@
-@import "@/assets/css/mixin.scss";
-$color-container-bg: var(--color-container-bg);
-$color-user-list-bg: var(--color-user-list-bg);
-$color-text: var(--color-text);
-$color-primary: var(--color-primary);
-
-.ant-tabs {
-  margin-bottom: 16px;
-
-  .ant-tabs-nav {
-    margin-bottom: 0 !important;
-
-    &::before {
-      border-bottom: 1px solid var(--color-card-line) !important;
-    }
-  }
-
-  .ant-tabs-nav-wrap {
-    width: 100%;
-    box-sizing: content-box;
-
-    .ant-tabs-nav-list {
-      width: 340px;
-
-      .ant-tabs-ink-bar {
-        height: 3px;
-        background-color: #00ccff;
-      }
-
-      .ant-tabs-tab {
-        flex: 1;
-        width: 100%;
-        display: flex;
-        justify-content: center;
-        padding-bottom: 10px;
-        text-align: center;
-        cursor: pointer;
-        font-size: 14px !important;
-        font-family: MicrosoftYaHei;
-        text-align: center;
-        letter-spacing: 0.7px;
-      }
-
-      .ant-tabs-tab-active {
-        div {
-          color: #00ccff;
-        }
-      }
-    }
-  }
-}
-
-.ant-input::-webkit-input-placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-input::-moz-placeholder {
-  color: var(--color-placeholder);
-}
-.right-list  .ant-btn-primary {
-  width: 68px;
-  height: 30px;
-  background: linear-gradient(180deg, #3aa9ff, #59b7ff);
-  border-radius: 4px;
-}
-.ant-input:-ms-input-placeholder {
-  color: var(--color-placeholder);
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-thead th {
-  background-color: #616b83 !important;
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-tbody td {
-  background-color: #3e4557 !important;
-}
-.right-list .cc-result-flow .table-wrap .yisa-table .ant-table-tbody tr:nth-child(even) td {
-  background-color: #3e4557 !important;
-}
-.ant-input::placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-select-selection-placeholder {
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled.ant-select-single:not(.ant-select-customize-input) .ant-select-selector {
-  background: var(--color-input-disabled-bg);
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled .ant-select-arrow {
-  color: var(--color-placeholder);
-}
-
-.ant-select-disabled.ant-select:not(.ant-select-customize-input) .ant-select-selector {
-  background-color: var(--color-input-disabled-bg);
-  color: var(--color-input-disabled-color);
-  cursor: not-allowed;
-}
-
-.ant-select-multiple {
-  .ant-select-selector {
-    .ant-select-selection-item {
-      background-color: var(--color-bg-body);
-      border-color: var(--color-border);
-
-      .ant-select-selection-item-remove {
-        color: var(--color-text);
-      }
-    }
-  }
-}
-
-.ant-select-arrow {
-  color: var(--color-text);
-}
-
-.ant-select-clear {
-  border-radius: 50%;
-}
-
-.ant-select-dropdown-menu {
-  background-color: var(--color-input-bg);
-
-  .ant-select-dropdown-menu-item {
-    color: var(--color-text);
-
-    &.ant-select-dropdown-menu-item-active {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-
-    &.ant-select-dropdown-menu-item-selected {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-
-    &:hover {
-      color: #fff;
-      // background-color: var(--radio-button-bg-checked);
-    }
-  }
-}
-
-.ant-select-selector {
-  background-color: var(--color-search-list-item-bg) !important;
-  box-shadow: none !important;
-  border-radius: 4px;
-  color: var(--color-search-list-item-value);
-  border-color: var(--color-search-list-item-bd) !important;
-}
-
-.ant-select-selection {
-  background-color: var(--color-input-bg);
-  box-shadow: none;
-  color: var(--color-text);
-  // border-color:var(--checkable-tag-border);
-}
-
-.ant-form-horizontal .ant-form-item-label {
-  label {
-    display: inline-block;
-    word-wrap: break-word;
-    white-space: normal;
-  }
-}
-
-.ant-picker {
-  width: 100%;
-  background-color: var(--color-search-list-item-bg);
-  border-color: var(--color-border);
-}
-
-// .yisa-table {
-//   width: 100%;
-
-//   .ant-table-thead {
-//     th {
-//       background: var(--color-table-header-bg) !important;
-//     }
-//   }
-
-//   .ant-table-tbody {
-//     td {
-//       background: var(--color-table-body-bg) !important;
-//       border-bottom-color: var(--color-table-border-bottom-color);
-//     }
-
-//     tr:nth-child(even) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-
-//     tr:nth-child(odd) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-//   }
-// }
-.totalModal{
-  .ant-modal-footer{
-    display: none;
-  }
-  position: absolute;
-  top: 40px;
-  right: 174px;
-}
-.ltc-item-img {
-  width: 390px;
-  height: 300px;
-  border: 1px solid;
-  background: #6565656b;
-  margin-right: 20px !important;
-  img  {
-    height: 295px;
-    width: 387px;
-    // object-fit: contain;
-  }
-}
-.hanleHistoyModal{
-  max-height: 700px;
-  overflow: auto;
-}
-.hanleHistoyModal::-webkit-scrollbar {
-  width: 5px;
-}
-.hanleHistoyModal::-webkit-scrollbar-thumb {
-  background-color: #9da2ab;
-  border-radius: 10px;
-}
-.modal-img{
-  img{
-    width: 200px;
-    height: 200px;
-  }
-}
\ No newline at end of file
diff --git a/src/pages/NewEnergy/RecordsInquiry/Violation/loadable.jsx b/src/pages/NewEnergy/RecordsInquiry/Violation/loadable.jsx
index 1e7a33b..d1fa6ae 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Violation/loadable.jsx
+++ b/src/pages/NewEnergy/RecordsInquiry/Violation/loadable.jsx
@@ -1,26 +1,13 @@
 import React, { useState, useRef, useEffect } from "react";
 import {
   message,
-  Pagination,
-  Table,
-  Space,
   Modal,
   Button,
-  Tabs,
-  Descriptions,
-  Input,
-  Steps,
-  Select,
-  Image,
-  Timeline,
-  Popover
 } from "antd";
-import { dictionary } from "@/config/common";
 import ajax from "@/services";
 import { TableModule } from "@/components";
 import "./index.scss";
 
-const { TextArea } = Input;
 
 function Violation() {
   // 详情弹窗
@@ -57,55 +44,13 @@ function Violation() {
       align: "center",
     },
     {
-      title: "商户名称",
+      title: "违规类型",
       dataIndex: "berth_id",
       key: "berth_id",
       align: "center",
     },
     {
-      title: "降预约开始时间",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "预约截至时间",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "缴纳预约费用金额",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "缴费时间",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "订单状态",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "订单完结时间",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "预约费用退款金额",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "顶动感实收金额",
+      title: "记录创建时间",
       dataIndex: "in_time",
       key: "in_time",
       align: "center",
@@ -152,19 +97,14 @@ function Violation() {
     {
       name: "operator",
       type: "Select",
-      label: "商户名称",
+      label: "违规类型",
       defaultValue: "0",
-      placeholder: "请选择商户名称",
+      placeholder: "请选择违规类型",
     },
     {
       name: "timeStart",
       type: "DateRangePicker",
-      label: "预约开始时间",
-    },
-    {
-      name: "timeEnd",
-      type: "DateRangePicker",
-      label: "订单完结时间",
+      label: "记录创建时间",
     },
   ];
 
@@ -190,6 +130,8 @@ function Violation() {
     setDetailVisible(true)
   }
 
+
+
   return (
     <>
       <TableModule
@@ -206,8 +148,8 @@ function Violation() {
         columns={columns}
         tableData={tableData}
         formSearch={formSearch}
-        pagename="预约订单"
-        pageName={'Appointment'}
+        pagename="违规订单"
+        pageName={'violation'}
         initFormData={initFormData}
         total={total}
         search={search}
diff --git a/src/pages/NewEnergy/index.jsx b/src/pages/NewEnergy/index.jsx
index 7d43cfc..65094c1 100644
--- a/src/pages/NewEnergy/index.jsx
+++ b/src/pages/NewEnergy/index.jsx
@@ -1,10 +1,12 @@
 import ChargingMgm from './ChargingMgm'
 import NewEnergyOverview from './NewEnergyOverview'
+import ChargeStationMgm from './ChargeStationMgm'
 import RecordsInquiry from './RecordsInquiry'
 import RealtimeMonitor from './RealtimeMonitor'
 
 export default {
   NewEnergyOverview,
+  ChargeStationMgm,
   ...RealtimeMonitor,
   ...ChargingMgm,
   ...RecordsInquiry,
diff --git a/src/router/router.config.js b/src/router/router.config.js
index 1c5c6fe..58c238d 100644
--- a/src/router/router.config.js
+++ b/src/router/router.config.js
@@ -1337,6 +1337,12 @@ let routes = [
         component: pages.OrderRuleMgm,
       },
       {
+        path: "/newEnergy/chargeStationMgm",
+        text: "充电站管理",
+        name: "chargeStationMgm",
+        component: pages.ChargeStationMgm,
+      },
+      {
         path: "/newEnergy/charge",
         text: "充电订单",
         name: "charge",
diff --git a/src/services/NewEnergy/ChargeStationMgm.js b/src/services/NewEnergy/ChargeStationMgm.js
new file mode 100644
index 0000000..5b7dc12
--- /dev/null
+++ b/src/services/NewEnergy/ChargeStationMgm.js
@@ -0,0 +1,32 @@
+import ajax from "@/config/ajax"
+// 充电站管理
+// 获取列表数据
+const getStationList = (params) => {
+  return ajax({
+    url: "/api/fin/charge_station/get_list",
+    type: "post",
+    data: params,
+  });
+};
+// 获取站点状态
+const getSiteStatus = (params) => {
+  return ajax({
+    url: "/api/fin/charge_station/site_status",
+    type: "get",
+    data: params,
+  });
+};
+// 新增充电站
+const addStation = (params) => {
+  return ajax({
+    url: "/api/fin/charge_station/add_station",
+    type: "post",
+    data: params,
+  });
+};
+
+export default{
+  getSiteStatus,
+  getStationList,
+  addStation
+}
diff --git a/src/services/NewEnergy/index.js b/src/services/NewEnergy/index.js
index d1a45b4..18993a1 100644
--- a/src/services/NewEnergy/index.js
+++ b/src/services/NewEnergy/index.js
@@ -1,5 +1,7 @@
 import chargingMgm from './chargingMgm'
+import chargeStationMgm from './ChargeStationMgm'
 
 export default {
-  ...chargingMgm
+  ...chargingMgm,
+  ...chargeStationMgm
 }
\ No newline at end of file
diff --git a/src/services/index.js b/src/services/index.js
index 76c1d02..abcce60 100644
--- a/src/services/index.js
+++ b/src/services/index.js
@@ -23,6 +23,7 @@ import FinancialMgm from "./FinancialMgm";
 import DataAnalysisPrediction from "./DataAnalysisPrediction";
 import ParkingOverview from "./ParkingOverview";
 import OffPeak from "./OffPeak";
+import NewEnergy from "./NewEnergy";
 const api = {};
 export default {
   ...api,
@@ -50,5 +51,6 @@ export default {
   ...FinancialMgm,
   ...DataAnalysisPrediction,
   ParkingOverview,
-  ...OffPeak
+  ...OffPeak,
+  ...NewEnergy
 };

From caacd0da4aa5a2940af7b5cd486eb37aa41178d4 Mon Sep 17 00:00:00 2001
From: He Huan <hehuan@yisa.com>
Date: Tue, 16 Jan 2024 16:39:04 +0800
Subject: [PATCH 2/7] =?UTF-8?q?fix():=20=E4=BF=AE=E5=A4=8D=E6=97=B6?=
 =?UTF-8?q?=E9=97=B4=E8=A7=84=E5=88=99=E9=A1=B5=E9=9D=A2=E6=B7=BB=E5=8A=A0?=
 =?UTF-8?q?=E5=BC=82=E5=B8=B8=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/pages/OffPeak/OffPeakTimeMgm/ManagementTime/loadable.jsx | 8 +++++---
 src/pages/OffPeak/OffPeakTimeMgm/RuleDetail/loadable.jsx     | 8 +++++---
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/pages/OffPeak/OffPeakTimeMgm/ManagementTime/loadable.jsx b/src/pages/OffPeak/OffPeakTimeMgm/ManagementTime/loadable.jsx
index c0510ea..1e664b9 100644
--- a/src/pages/OffPeak/OffPeakTimeMgm/ManagementTime/loadable.jsx
+++ b/src/pages/OffPeak/OffPeakTimeMgm/ManagementTime/loadable.jsx
@@ -70,7 +70,7 @@ function ManagementTime(props) {
                 title: `提示`,
                 content: `是否确认删除选中的数据项?`,
                 onOk: () => {
-                  ajax.getDelRuleLink({ids:[record.id]}).then((res) => {
+                  ajax.getDelRuleLink({ids:[record.id],rule_id:id}).then((res) => {
                   if (res.status === 20000) {
                     message.success('删除成功')
                     tableRef.current.fetch(1,{})
@@ -167,7 +167,7 @@ function ManagementTime(props) {
             title: `提示`,
             content: `是否确认删除选中的数据项?`,
             onOk: () => {
-              ajax.getDelRuleLink({ids:tableSelectCheck}).then((res) => {
+              ajax.getDelRuleLink({ids:tableSelectCheck,rule_id:id}).then((res) => {
               if (res.status === 20000) {
                 message.success('删除成功')
                 tableRef.current.fetch(1,{})
@@ -191,7 +191,9 @@ function ManagementTime(props) {
       message.warning(`时间规则不可为空`);
       return
     }
-    ajax.getRuleLinkAdd(rowData).then((res) => {
+    let data = rowData 
+    data.rule_id=id 
+    ajax.getRuleLinkAdd(data).then((res) => {
       if (res.status === 20000) {
         setVisible(false);
         message.success("新增成功")
diff --git a/src/pages/OffPeak/OffPeakTimeMgm/RuleDetail/loadable.jsx b/src/pages/OffPeak/OffPeakTimeMgm/RuleDetail/loadable.jsx
index 860785b..6eea5e8 100644
--- a/src/pages/OffPeak/OffPeakTimeMgm/RuleDetail/loadable.jsx
+++ b/src/pages/OffPeak/OffPeakTimeMgm/RuleDetail/loadable.jsx
@@ -118,10 +118,11 @@ function RuleDetail() {
                       setActionState("edit");
                       setVisible(true);
                       setEditId(record.id)
+                      let dataType=selectData.filter(item => { return item.label==record.date_type})
                       setRowData({
                         ...rowData,    
                         name: record.name,
-                        date_type:record.date_type,
+                        date_type:dataType[0].value||"",
                         start_time: record.start_time,
                         end_time: record.end_time,
                         is_in: record.is_in,
@@ -365,7 +366,8 @@ function RuleDetail() {
           <FormSelect
             yisaLabel="是否可以进入"
             yisaData={modalSelectData}
-            defaultValue={rowData.is_in || null}
+            defaultValue={rowData.is_in===""?null:rowData.is_in}
+            // defaultValue={rowData.is_in}
             placeholder="请选择是否可以进入"
             hasUnlimited={false}
             required={true}
@@ -375,7 +377,7 @@ function RuleDetail() {
           <FormSelect
             yisaLabel="是否可以出场"
             yisaData={modalSelectData}
-            defaultValue={rowData.is_out || null}
+            defaultValue={rowData.is_out===""? null:rowData.is_out}
             placeholder="请选择是否可以出场"
             hasUnlimited={false}
             required={true}

From 5542732ad1cee4c75b5f6072bb7a70cd874d2088 Mon Sep 17 00:00:00 2001
From: chenli <chenli@yisa.com>
Date: Tue, 16 Jan 2024 16:42:25 +0800
Subject: [PATCH 3/7] =?UTF-8?q?feat():=20=E6=96=B0=E5=A2=9E=E6=9F=A5?=
 =?UTF-8?q?=E8=AF=A2=E8=AE=B0=E5=BD=95=E8=AF=B7=E6=B1=82=E9=85=8D=E7=BD=AE?=
 =?UTF-8?q?=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../RealtimeMonitor/ChargerMonitor/loadable.jsx    | 1097 ++------------------
 .../NewEnergy/RecordsInquiry/Unlocking/index.jsx   |    4 +-
 .../RecordsInquiry/Unlocking/loadable.jsx          |   97 +-
 src/services/NewEnergy/index.js                    |    4 +-
 src/services/NewEnergy/recordsInquiry.js           |   16 +
 5 files changed, 144 insertions(+), 1074 deletions(-)
 create mode 100644 src/services/NewEnergy/recordsInquiry.js

diff --git a/src/pages/NewEnergy/RealtimeMonitor/ChargerMonitor/loadable.jsx b/src/pages/NewEnergy/RealtimeMonitor/ChargerMonitor/loadable.jsx
index f960e2f..7d1888e 100644
--- a/src/pages/NewEnergy/RealtimeMonitor/ChargerMonitor/loadable.jsx
+++ b/src/pages/NewEnergy/RealtimeMonitor/ChargerMonitor/loadable.jsx
@@ -13,14 +13,14 @@ import {
   Select,
   Image,
   Timeline,
-  Popover
+  Popover,
 } from "antd";
 import { dictionary, utils } from "@/config/common";
 // import moment from 'moment'
 // import {   useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks';
 import ajax from "@/services";
-import errorImg from '@/assets/images/error-img-new.png'
-import { QuestionCircleOutlined } from '@ant-design/icons';
+import errorImg from "@/assets/images/error-img-new.png";
+import { QuestionCircleOutlined } from "@ant-design/icons";
 import { TableModule } from "@/components";
 import "./index.scss";
 import {
@@ -29,451 +29,112 @@ import {
   operatorRecordColumns,
 } from "./dataSource";
 // import errorImg from "@/assets/images/layout/error.png"
-// import {  useLocation } from "react-router-dom";
-const { TextArea } = Input;
 
-let array = [];
+const { TextArea } = Input;
 
 function ChargerMonitor() {
-  const roadContent = (
-    <div>
-      <p>出场时间-入场时间的计算金额</p>
-    </div>
-  )
-  const receivableContent = (
-    <div>
-      <p>订单金额-折扣金额</p>
-    </div>
-  )
-  const discountContent = (
-    <div>
-      <p>折扣金额=停车卡抵扣+路段折扣</p>
-    </div>
-  )
-  const preferentialContent = (
-    <div>
-      <p>优惠券支付金额</p>
-    </div>
-  )
-  const refundContent = (
-    <div>
-      <p>退款总计=退实付+退优惠</p>
-    </div>
-  )
-  const columns = [
-    {
-      title: "序号",
-      dataIndex: "index",
-      key: "index",
-      align: "center",
-      fixed: "left",
-      render: (text, record, index) => index + 1,
-      width: 100,
-    },
- 
-    {
-      title: "路段名称",
-      dataIndex: "road",
-      align: "center",
-      render: (text, record, index) => (
-        <div style={{ width: "100px", wordBreak: "break-all" }}>{record.road}</div>
-      )
-    },
-    {
-      title: "车牌号",
-      dataIndex: "plate",
-      align: "center",
-      render: (text, record, index) => (
-        <div style={{ width: "100px", wordBreak: "break-all" }}>{record.plate}</div>
-      )
-    },
-    {
-      title: "车牌颜色",
-      dataIndex: "plate_color",
-      key: "plate_color",
-      width: 100,
-      align: "center",
-    },
-    {
-      title: "泊位号",
-      dataIndex: "berth_id",
-      key: "berth_id",
-      width: 100,
-      align: "center",
-    },
-    {
-      title: "入场时间",
-      dataIndex: "in_time",
-      align: "center",
-      render: (text, record, index) => (
-        <div style={{ width: "130px", wordBreak: "break-all" }}>{record.in_time}</div>
-      )
-    },
-    {
-      title: "离场时间",
-      dataIndex: "out_time",
-      align: "center",
-      render: (text, record, index) => (
-        <div style={{ width: "130px", wordBreak: "break-all" }}>{record.out_time}</div>
-      )
-    },
-    {
-      title: "停车时长",
-      dataIndex: "admission_time",
-      key: "admission_time",
-      width: 100,
-      align: "center",
-    },
-    {
-      title: "入场收费员",
-      dataIndex: "in_person",
-      key: "in_person",
-      width: 100,
-      align: "center",
+  const [tableData, setTableData] = useState([]);
+  const [total, setTotal] = useState(0);
 
-    },
-    {
-      title: "出场收费员",
-      dataIndex: "out_person",
-      key: "out_person",
-      width: 100,
-      align: "center",
-    },
-    {
-      title: <Popover content={roadContent} >
-        订单金额
-      <QuestionCircleOutlined />
-    </Popover>,
-      dataIndex: "order_amount",
-      key: "order_amount",
-      width: 100,
-      align: "center",
-      // filterDropdown: true,
-      // filterIcon:
-      //   <Popover content={roadContent} >
-      //     <QuestionCircleOutlined />
-      //   </Popover>
-    },
-    {
-      title: <Popover content={receivableContent} >
-        应收金额
-      <QuestionCircleOutlined />
-    </Popover>,
-      dataIndex: "receivable_amount",
-      key: "receivable_amount",
-      width: 100,
-      align: "center",
-      // filterDropdown: true,
-      // filterIcon:
-      //   <Popover content={receivableContent} >
-      //     <QuestionCircleOutlined />
-      //   </Popover>
-    },
-    {
-      title:  <Popover content={discountContent} >
-        折扣金额
-      <QuestionCircleOutlined />
-    </Popover>,
-      dataIndex: "discount_amount",
-      key: "discount_amount",
-      width: 100,
-      align: "center",
-      // filterDropdown: true,
-      // filterIcon:
-      //   <Popover content={discountContent} >
-      //     <QuestionCircleOutlined />
-      //   </Popover>
-    },
-    {
-      title:    <Popover content={preferentialContent} >
-        优惠金额
-      <QuestionCircleOutlined />
-    </Popover>,
-      dataIndex: "preferential_amount",
-      key: "preferential_amount",
-      width: 100,
-      align: "center",
-      // filterDropdown: true,
-      // filterIcon:
-      //   <Popover content={preferentialContent} >
-      //     <QuestionCircleOutlined />
-      //   </Popover>
-    },
-    {
-      title: "实付金额",
-      dataIndex: "actual_amount",
-      key: "actual_amount",
-      width: 100,
-      align: "center",
-    },
-    {
-      title: <Popover content={refundContent} >
-        退款总计
-      <QuestionCircleOutlined />
-    </Popover>,
-      dataIndex: "refund_total",
-      key: "refund_total",
-      width: 100,
-      align: "center",
-      // filterDropdown: true,
-      // filterIcon:
-      //   <Popover content={refundContent} >
-      //     <QuestionCircleOutlined />
-      //   </Popover>
-    },
-    {
-      title: "停车记录ID",
-      dataIndex: "park_id",
-      align: "center",
-      render: (text, record, index) => (
-        <div style={{ width: "130px", wordBreak: "break-all" }}>
-          <a onClick={() => {
-            navigator.clipboard.writeText(`${text}`).then(() => { message.success("已复制到剪切板") });
-          }}>{record.park_id}</a>
-        </div>
-      ),
-    },
-    {
-      title: "区域",
-      dataIndex: "region",
-      align: "center",
-      render: (text, record, index) => (
-        <div style={{ width: "120px", wordBreak: "break-all" }}>{record.region}</div>
-      )
-    },
-    {
-      title: "商户名称",
-      dataIndex: "operator",
-      align: "center",
-      render: (text, record, index) => (
-        <div style={{ width: "150px", wordBreak: "break-all" }}>{record.operator}</div>
-      )
-    },
-    {
-      title: "路段类型",
-      dataIndex: "road_type",
-      key: "road_type",
-      width: 100,
-      align: "center",
-    },
-    {
-      title: "操作",
-      dataIndex: "operation",
-      key: "operation",
-      align: "center",
-      fixed: "right",
-      width: 100,
-      render: (text, record, index) => {
-        setDataDetail(record)
-        return (
-          <>
-            <Button type="primary" onClick={() => openModal(index, record)}>
-              详情
-            </Button>
-          </>
-        )
+  const initFormData = {
+    charge_station: "", // 充电站
+    tel: "", // 手机号
+    plate: "", // 车牌号
+    charge_status: "", // 充电状态
+    time:{
 
-      },
-    },
-  ];
+    }
+  }; // 初始数据
 
   const formSearch = [
     {
-      name: "region",
-      type: "TreeSelect",
-      label: "区域",
-    },
-    {
-      name: "operator",
-      type: "Select",
-      label: "商户名称",
-      defaultValue: "0",
-      placeholder: "请选择商户名称",
-    },
-    {
-      name: "road",
-      type: "SearchSelect",
-      label: "路段名称",
-      placeholder: "请输入路段名称",
-    },
-    {
-      name: "road_type",
-      type: "Select",
-      label: "路段类型",
-      defaultValue: 0,
-      options: sysConfig.roadType,
-    },
-    {
-      name: "phone",
+      label: "充电桩",
+      name: "charge_station",
       type: "Input",
-      label: "手机号",
-      placeholder: "请输入手机号",
+      placeholder: "请输入",
     },
     {
-      name: "plate",
+      label: "会员手机",
+      name: "tel",
       type: "Input",
-      label: "车牌号",
-      placeholder: "请输入车牌号",
-    },
-    {
-      name: "berth_id",
-      type: "Input",
-      label: "泊位号",
-      placeholder: "请输入泊位号",
-    },
-    {
-      name: "type",
-      type: "Select",
-      label: "出入场类型",
-      defaultValue: 1,
-      options: [
-        {
-          label: "入场",
-          value: 1,
-        },
-        {
-          label: "出场",
-          value: 2,
-        },
-      ],
+      placeholder: "请输入会员手机",
     },
     {
-      name: "park_id",
+      label: "车牌号",
+      name: "plate_num",
       type: "Input",
-      label: "停车记录ID",
-      placeholder: "请输入停车记录ID",
-    },
-    {
-      name: "plate_color",
-      type: "Select",
-      label: "车牌颜色",
-      placeholder: "请输入车牌颜色",
-      options: sysConfig.plateColor,
+      placeholder: "请输入车牌号",
     },
     {
-      name: "order_type",
+      label: "充电状态",
+      name: "charge_status",
       type: "Select",
-      label: "订单类型",
-      defaultValue: 0,
-      options: [
-        {
-          label: "全部",
-          value: 0,
-        },
-        {
-          label: "进行中",
-          value: 1,
-        },
-        {
-          label: "待支付",
-          value: 2,
-        },
-        {
-          label: "已支付",
-          value: 3,
-        }
-      ],
+      placeholder: "请输入",
+      options:[]
     },
     {
-      name: "in_person",
-      type: "Input",
-      label: "入场收费员",
-      placeholder: "请输入入场收费员",
-    },
-    {
-      name: "out_person",
-      type: "Input",
-      label: "出场收费员",
-      placeholder: "请输入出场收费员",
-    },
-    {
-      name: "timePeriod",
+      name: "time",
       type: "RangePicker",
-      label: "时间段",
+      label: "充电开始时间",
     },
-  ];
-  const initFormData = {
-    region: ["0"],
-    operator: "0",
-    road: "0",
-    road_type: 0,
-    phone: "",
-    plate: "",
-    berth_id: "",
-    type: 1,
-    park_id: "",
-    order_type: 0,
-    plate_color: -1,
-    in_person: "",
-    out_person: "",
-  };
-  //历史处理的表头
-  const historyProgressColumns = [
+  ]; // 检索栏
+
+  const columns = [
     {
       title: "序号",
-      dataIndex: "id",
-      key: "id",
+      dataIndex: "index",
+      key: "index",
       align: "center",
+      fixed: "left",
       render: (text, record, index) => index + 1,
+      width: 100,
     },
     {
-      title: "状态",
-      dataIndex: "status",
-      key: "status",
-      align: "center",
-    },
-    {
-      title: "处理记录ID",
-      dataIndex: "deal_record_id",
-      key: "deal_record_id",
+      title: "用户手机号",
+      dataIndex: "user_tel",
+      key: "user_tel",
       align: "center",
     },
     {
-      title: "处理时间",
-      dataIndex: "deal_time",
-      key: "deal_time",
+      title: "车牌号",
+      dataIndex: "plate",
+      key: "plate",
       align: "center",
     },
     {
-      title: "处理人",
-      dataIndex: "dealer",
-      key: "dealer",
+      title: "枪名称",
+      dataIndex: "plate_color",
+      key: "plate_color",
       align: "center",
     },
     {
-      title: "业务订单类型",
-      dataIndex: "business_type",
-      key: "business_type",
+      title: "充电站",
+      dataIndex: "berth_id",
+      key: "berth_id",
+      width: 100,
       align: "center",
     },
     {
-      title: "更改项",
-      dataIndex: "change_content",
-      key: "change_content",
+      title: "充电开始时间",
+      dataIndex: "in_time",
+      key: "in_time",
       align: "center",
-      render: (text) => {
-        return text == 1
-          ? "调整出场时间"
-          : text == 2
-            ? "变更车牌号"
-            : text == 3
-              ? "更改订单金额"
-              : text == 4
-                ? "免费该订单"
-                : "作废该订单"
-      }
     },
     {
-      title: "更改初始值",
-      dataIndex: "initial_value",
-      key: "initial_value",
+      title: "充电状态",
+      dataIndex: "operation",
+      key: "operation",
       align: "center",
+      fixed: "right",
+      width: 100,
     },
     {
-      title: "更改更新值",
-      dataIndex: "update_value",
-      key: "update_value",
+      title: "图像记录",
+      dataIndex: "operation",
+      key: "operation",
       align: "center",
+      fixed: "right",
+      width: 100,
     },
     {
       title: "操作",
@@ -481,644 +142,40 @@ function ChargerMonitor() {
       key: "operation",
       align: "center",
       fixed: "right",
-      render: (_, record) => {
-        return (
-          <Button
-            type="primary"
-            onClick={() => {
-              checkHistoryDetail(record);
-            }}
-          >
-            操作
-          </Button>
-        );
-      },
-    },
-  ];
-
-
-  const h_columns = [
-    {
-      title: "停车订单ID",
-      dataIndex: "park_id",
-      key: "park_id",
-      width: 200,
-      align: "center",
-      render: (text) => (
-        <>
-          <a
-            onClick={() => {
-              navigator.clipboard.writeText(`${text}`).then(() => {
-                message.success("已复制到剪切板");
-              });
-            }}
-          >
-            {text}
-          </a>
-        </>
-      ),
-    },
-    {
-      title: "车牌号",
-      dataIndex: "plate",
-      key: "plate",
-      align: "center",
-    },
-    {
-      title: "停车场名称",
-      dataIndex: "park_name",
-      key: "park_name",
-      align: "center",
-      width: 200,
-    },
-    {
-      title: "入场时间",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "计费时间",
-      dataIndex: "admission_time",
-      key: "admission_time",
-      align: "center",
+      width: 100,
     },
-  ];
-
-
-  const [detailVisible, setDetailVisible] = useState(false);
-  const [tableData, setTableData] = useState([]);
-  const [total, setTotal] = useState(0);
-  const [tabKey, setTabKey] = useState("1");
-  // 车场id
-  const [parkId, setParkId] = useState("");
-  //支付记录数据
-  const [payRecord, setPayRecord] = useState([]);
-  //退款订单数据
-  const [refundRecord, setRefundRecord] = useState([]);
-  //操作记录数据
-  const [operationRecord, setOperatorRecord] = useState([]);
-  //历史处理数据
-  const [historyProgressRecord, setHistoryProgressRecord] = useState([]);
-  //停车记录信息数据
-  const [parkingRecordDetail, setParkingRecordDetail] = useState({});
-  //当前的所选择的停车信息索引
-  const [recordIndex, setRecordIndex] = useState(-1);
-  //当前所选择的订单ID
-  const [currentRecordID, setCurrentRecordID] = useState("");
-  //历史记录详情Modal
-  const [historyVisible, setHistoryVisible] = useState(false);
-  //历史记录详情的弹窗查看全部
-  const [isShowAll, setIsShowAll] = useState(false);
-  //历史记录车辆图片弹窗
-  const [platePhototModal, setPlatePhotoModal] = useState(false);
-  //历史记录详情数据
-  const [historyDataDetail, setHistoryDataDetail] = useState({});
-  const [DataDetail, setDataDetail] = useState({});
-  function openModal(index, record) {
-    setDetailVisible(true);
-    setParkingRecordDetail(record);
-    setHistoryDataDetail(record)
-    setRecordIndex(index);
-  }
-
-  const handleImgError = (e) => {
-    let evn = e || event
-    let img = evn.srcElement ? evn.srcElement : evn.target
-    img.src = errorImg
-  }
-
-  function changeKey(key) {
-    setTabKey(key);
-    switch (key) {
-      case "2":
-        getPaymentRecord(currentRecordID);
-        break;
-      case "3":
-        getRefundRecord(currentRecordID);
-        break;
-      case "4":
-        getOperateRecord(currentRecordID);
-        break;
-      case "5":
-        getHistoryRecord(currentRecordID);
-        break;
-      default:
-        break;
-    }
-  }
-  function renderParkRecord(item) {
-    return (
-      item && (
-        <div>
-          <Descriptions title="停车场名称">
-            <Descriptions.Item label="停车场名称">{item.road}</Descriptions.Item>
-            <Descriptions.Item label="泊位号">{item.berth_id}</Descriptions.Item>
-            <Descriptions.Item label="区域">{item.region}</Descriptions.Item>
-            <Descriptions.Item label="商户">{item.operator}</Descriptions.Item>
-            <Descriptions.Item label="车场类型">{item.road_type}</Descriptions.Item>
-          </Descriptions>
-          <Descriptions title="停车信息">
-            <Descriptions.Item label="车牌号">{item.plate}</Descriptions.Item>
-            <Descriptions.Item label="会员手机号">{item.phone}</Descriptions.Item>
-            <Descriptions.Item label="入场时间"> {item.in_time} </Descriptions.Item>
-            <Descriptions.Item label="出场时间">{item.out_time}</Descriptions.Item>
-            <Descriptions.Item label="停车时长">{item.admission_time}</Descriptions.Item>
-            <Descriptions.Item label="订单金额"> {item.order_amount}</Descriptions.Item>
-            <Descriptions.Item label="停车卡折扣">{item.parking_card_discount} </Descriptions.Item>
-            <Descriptions.Item label="车场折扣">
-              {item.road_discount}
-            </Descriptions.Item>
-            <Descriptions.Item label="应收金额">
-              {item.receivable_amount}
-            </Descriptions.Item>
-            <Descriptions.Item label="优惠券">{item.coupon }</Descriptions.Item>
-            <Descriptions.Item label="优惠总额">
-              {item.preferential_amount}
-            </Descriptions.Item>
-            <Descriptions.Item label="实付金额">
-              {item.actual_amount}
-            </Descriptions.Item>
-            <Descriptions.Item label="优惠退款">
-              {item.refund_discount}
-            </Descriptions.Item>
-            <Descriptions.Item label="实付退款">
-              {item.actual_refund}
-            </Descriptions.Item>
-            <Descriptions.Item label="退款总计">
-              {item.refund_total}
-            </Descriptions.Item>
-            <Descriptions.Item label="入场收费员">
-              {item.in_person}
-            </Descriptions.Item>
-            <Descriptions.Item label="出场收费员">
-              {item.out_person}
-            </Descriptions.Item>
-          </Descriptions>
-          <Descriptions title="入场照片">
-            <Descriptions.Item label="车辆照片">
-              <div className="ltc-item ltc-item-img ">
-                <Image src={item.in_veh_pic || require("../../../../../src/assets/images/error-img-new.png")} onError={handleImgError}/>
-              </div>
-            </Descriptions.Item>
-            <Descriptions.Item label="车牌照片">
-              <div className="ltc-item ltc-item-img ">
-                <Image src={item.in_plate_pic || require("../../../../../src/assets/images/error-img-new.png")} onError={handleImgError}/>
-              </div>
-            </Descriptions.Item>
-            <Descriptions.Item label=" 残疾人证件">
-              <div className="ltc-item ltc-item-img ">
-                <Image src={item.cj_pic || require("../../../../../src/assets/images/error-img-new.png")} onError={handleImgError}/>
-              </div>
-            </Descriptions.Item>
-          </Descriptions>
-        </div>
-      )
-    );
-  }
-  //查看历史详情
-  const [getHistoryData,setGetHistoryData]=useState({})
-  function checkHistoryDetail(record) {
-    setGetHistoryData(record);
-    setHistoryVisible(true);
-  }
-  function renderModalTable(columns, dataSource) {
-    return (
-      <Table
-        columns={columns}
-        dataSource={dataSource}
-        scroll={{ x: 1000 }}
-      // className="yisa-table"
-      />
-    );
-  }
-  //获取订单的支付记录
-  function getPaymentRecord(park_id) {
-    ajax.getPaymentRecord({ park_record_id: park_id }).then((res) => {
-      if (res.status === 20000) {
-        setPayRecord(res.data.list);
-      }
-    });
-  }
-  //获取退款订单的接口
-  function getRefundRecord(park_id) {
-    ajax.getRefundRecord({ park_id }).then((res) => {
-      if (res.status === 20000) {
-        setRefundRecord(res.data.list);
-      }
-    });
-  }
-  //获取操作处理的接口
-  function getOperateRecord(park_id) {
-    ajax.getOperateRecord({ park_record_id: park_id }).then((res) => {
-      if (res.status === 20000) {
-        setOperatorRecord(res.data.list);
-      }
-    });
-  }
-  //获取历史处理记录的接口
-  function getHistoryRecord(park_id) {
-    ajax.getHistoryRecord({ park_record_id: park_id }).then((res) => {
-      if (res.status === 20000) {
-        // res.data.list.map(res=>{
-          setHistoryProgressRecord(res.data.list);
-        // })
-      }
-    });
-  }
+  ]; // 表头
 
-  //获取函数
+  // 获取函数
   function search(params) {
-    utils.tableScrollTop("parent-table-scroll")
+    // utils.tableScrollTop("parent-table-scroll")
     ajax.getParkingList(params).then((res) => {
       if (res.status === 20000) {
         setTableData(res.data.list);
         setTotal(res.data.total);
-      }else{
-        message.error(res.message)
+      } else {
+        message.error(res.message);
       }
     });
   }
-  useEffect(() => {
-    // setParkingRecordDetail(tableData[recordIndex]);
-    setCurrentRecordID(tableData[recordIndex]?.park_id || "");
-  }, [recordIndex]);
+
+  useEffect(() => {}, []);
 
   return (
     <>
       <TableModule
+        pagename="充电监控"
+        pageName={"chargerMonitor"}
+        mandatory={["plate", "berth_id"]}
+        mandatory_name={["车牌号或泊位号"]}
+        total={total}
+        search={search}
         columns={columns}
         tableData={tableData}
         formSearch={formSearch}
-        pagename="停车记录查询"
-        mandatory={['plate','berth_id']}
-        mandatory_name={['车牌号或泊位号']}
-        pageName={'parkRecordTotal'}
         initFormData={initFormData}
-        total={total}
-        search={search}
-        exportUrl="/api/bpm/record/get_record_export"
+        exportUrl="/api/new_power/records/unlocking"
       />
-      <Modal
-        open={detailVisible}
-        width={1500}
-        className="totalModal"
-        onCancel={() => {
-          setDetailVisible(false);
-          setTabKey("1");
-        }}
-        destroyOnClose
-      >
-        <Tabs activeKey={tabKey} onChange={changeKey}>
-          <Tabs.TabPane tab="停车记录信息" key="1">
-            {renderParkRecord(parkingRecordDetail)}
-          </Tabs.TabPane>
-          <Tabs.TabPane tab="支付记录" key="2">
-            {renderModalTable(payRecordColumns, payRecord)}
-          </Tabs.TabPane>
-          <Tabs.TabPane tab="退款订单" key="3">
-            {renderModalTable(refundRecordColumns, refundRecord)}
-          </Tabs.TabPane>
-          <Tabs.TabPane tab="操作记录" key="4">
-            {renderModalTable(operatorRecordColumns, operationRecord)}
-          </Tabs.TabPane>
-          <Tabs.TabPane tab="历史处理" key="5">
-            {renderModalTable(historyProgressColumns, historyProgressRecord)}
-          </Tabs.TabPane>
-        </Tabs>
-        <Modal
-          title="异常订单处理记录审核"
-          visible={historyVisible}
-          onCancel={() => {
-            setHistoryVisible(false);
-          }}
-          className="hanleHistoyModal"
-          footer={null}
-          width={1000}
-        >
-          <Table
-            columns={h_columns}
-            dataSource={[
-              {
-                park_id: historyDataDetail.park_id,
-                plate: historyDataDetail.plate,
-                park_name: historyDataDetail?.road,
-                in_time: historyDataDetail.in_time,
-                admission_time: historyDataDetail?.out_time,
-              },
-            ]}
-            pagination={false}
-          // className="yisa-table"
-          />
-          <Descriptions title="车场详情">
-            <Descriptions.Item label="停车场名称">
-              {historyDataDetail?.road}
-            </Descriptions.Item>
-            <Descriptions.Item label="区域">
-              {historyDataDetail.region}
-            </Descriptions.Item>
-            <Descriptions.Item label="商户名称">
-              {historyDataDetail.operator}
-            </Descriptions.Item>
-            <Descriptions.Item label="泊位号">
-              {historyDataDetail.berth_id}
-            </Descriptions.Item>
-            <Descriptions.Item label="车场类型">
-              {historyDataDetail.road_type}
-            </Descriptions.Item>
-          </Descriptions>
-          <Descriptions title="车辆详情">
-            <Descriptions.Item label="车牌号">
-              {historyDataDetail.plate}
-            </Descriptions.Item>
-            <Descriptions.Item label="停车时长">
-              {historyDataDetail.admission_time}
-            </Descriptions.Item>
-            <Descriptions.Item label="入场时间">
-              {historyDataDetail.in_time}
-            </Descriptions.Item>
-            <Descriptions.Item label="出场时间">
-              {historyDataDetail.out_time}
-            </Descriptions.Item>
-            <Descriptions.Item label="入场记录来源">
-              {historyDataDetail.in_source}
-            </Descriptions.Item>
-            <Descriptions.Item label="出场记录来源">
-              {historyDataDetail.out_source}
-            </Descriptions.Item>
-            <Descriptions.Item label="出入场图像">
-              <a
-                onClick={() => {
-                  setPlatePhotoModal(true);
-                }}
-              >
-                查看
-              </a>
-            </Descriptions.Item>
-          </Descriptions>
-          <Descriptions title="订单详情">
-            <Descriptions.Item label="订单金额">
-              {historyDataDetail.order_amount}
-            </Descriptions.Item>
-            <Descriptions.Item label="优惠总计">
-              {historyDataDetail.preferential_total}
-            </Descriptions.Item>
-            <Descriptions.Item label="实付总计">
-              {historyDataDetail.actual_amount}
-            </Descriptions.Item>
-            <Descriptions.Item label="欠费总计">
-              {historyDataDetail.arrears_mount}
-            </Descriptions.Item>
-          </Descriptions>
-          <Descriptions
-            title="流程查看"
-            extra={
-              isShowAll ? (
-                <a
-                  onClick={() => {
-                    setIsShowAll(false);
-                  }}
-                >
-                  返回
-                </a>
-              ) : (
-                <a
-                  onClick={() => {
-                    setIsShowAll(true);
-                  }}
-                >
-                  查看全部
-                </a>
-              )
-            }
-          >
-            <Descriptions.Item>
-              <Steps
-                size="small"
-                current={2}
-                items={[
-                  {
-                    title: "发起处理",
-                  },
-                  {
-                    title: "申诉审核",
-                  },
-                ]}
-              />
-            </Descriptions.Item>
-          </Descriptions>
-          {isShowAll ? (
-            <Descriptions title="流程记录">
-              <Descriptions.Item>
-                <div className="ltc-box-title">
-                  <div className="ltc-icon"></div>流程记录
-                </div>
-                <div style={{ width: "450px" }}>
-                  <Timeline mode={"left"}>
-                    <Timeline.Item
-                      label={getHistoryData.examine_time?.split(" ")[0]}
-                    >
-                      <div>
-                        <div>申诉处理审核: 已完成</div>
-                        <div
-                          style={{
-                            display: "flex",
-                            width: "450px",
-                            justifyContent: "space-between",
-                          }}
-                        >
-                          <div>{getHistoryData.examine_time}</div>
-                          <div>来源:平台</div>
-                          <div>操作人:{getHistoryData.dealer}</div>
-                        </div>
-                      </div>
-                    </Timeline.Item>
-                    <Timeline.Item
-                      label={getHistoryData.deal_time?.split(" ")[0]}
-                    >
-                      <div>
-                        <div>申诉处理提审</div>
-                        <div
-                          style={{
-                            display: "flex",
-                            width: "450px",
-                            justifyContent: "space-between",
-                          }}
-                        >
-                          <div>
-                            <div>操作项</div>
-                            <div>
-                              {getHistoryData?.change_content == 1
-                                ? "调整出场时间"
-                                : getHistoryData?.change_content == 2
-                                  ? "变更车牌号"
-                                  : getHistoryData?.change_content == 3
-                                    ? "更改订单金额"
-                                    : getHistoryData?.change_content == 4
-                                      ? "免费该订单"
-                                      : "作废该订单"}
-                            </div>
-                            <div>{getHistoryData.deal_time}</div>
-                          </div>
-                          <div>
-                            <div>初始值</div>
-                            <div>{getHistoryData.initial_value || "--"}</div>
-                            <div>来源:平台</div>
-                          </div>
-                          <div>
-                            <div>变更值</div>
-                            <div>{getHistoryData.update_value || "--"}</div>
-                            <div>{getHistoryData.dealer}</div>
-                          </div>
-                        </div>
-                      </div>
-                    </Timeline.Item>
-                  </Timeline>
-                </div>
-              </Descriptions.Item>
-            </Descriptions>
-          ) : (
-            <Descriptions title="异常订单处理">
-              <Descriptions.Item span={3}>
-                <Descriptions title="处理理由">
-                  <Descriptions.Item>
-                    <TextArea disabled value={getHistoryData?.deal_reason} />
-                  </Descriptions.Item>
-                </Descriptions>
-              </Descriptions.Item>
-              <Descriptions.Item>
-                <Descriptions title="处理方式">
-                  <Descriptions.Item label="更改项">
-                    <div style={{ width: "200px" }}>
-                      <Input
-                        disabled
-                        value={
-                          getHistoryData?.change_content == 1
-                            ? "调整出场时间"
-                            : getHistoryData?.change_content == 2
-                              ? "变更车牌号"
-                              : getHistoryData?.change_content == 3
-                                ? "更改订单金额"
-                                : getHistoryData?.change_content == 4
-                                  ? "免费该订单"
-                                  : "作废该订单"
-                        }
-                      ></Input>
-                    </div>
-                  </Descriptions.Item>
-                  {getHistoryData.change_content == 1 ? (
-                    <>
-                      <Descriptions.Item label="调整基于">
-                        <div style={{ width: "240px" }}>
-                          <Select
-                            disabled
-                            style={{
-                              width: 140,
-                            }}
-                            defaultValue={
-                              getHistoryData?.update_value.indexOf(" ") > -1
-                                ? "1"
-                                : "2"
-                            }
-                            options={[
-                              {
-                                value: "1",
-                                label: "具体时间日期",
-                              },
-                              {
-                                value: "2",
-                                label: "记录入场时间",
-                              },
-                            ]}
-                          />
-                        </div>
-                      </Descriptions.Item>
-                      <Descriptions.Item label="时间">
-                        <div style={{ width: "240px" }}>
-                          <Input
-                            disabled
-                            placeholder={getHistoryData.update_value}
-                          ></Input>
-                        </div>
-                      </Descriptions.Item>
-                    </>
-                  ) : getHistoryData.change_content == 2 ? (
-                    <Descriptions.Item label="车牌号">
-                      <div style={{ width: "40px", display: "inline-block" }}>
-                        <Input
-                          disabled
-                          placeholder={getHistoryData.plate_type}
-                        ></Input>
-                      </div>
-                      <div style={{ width: "150px", display: "inline-block" }}>
-                        <Input
-                          disabled
-                          placeholder={getHistoryData.update_value}
-                        ></Input>
-                      </div>
-                    </Descriptions.Item>
-                  ) : getHistoryData.change_content == 3 ? (
-                    <>
-                      <Descriptions.Item label="增/减">
-                        <div style={{ width: "200px" }}>
-                          <Select
-                            disabled
-                            defaultValue={
-                              getHistoryData.update_value > 0 ? "1" : "2"
-                            }
-                            options={[
-                              {
-                                value: "1",
-                                label: "增",
-                              },
-                              {
-                                value: "2",
-                                label: "减",
-                              },
-                            ]}
-                          />
-                        </div>
-                      </Descriptions.Item>
-                      <Descriptions.Item label="金额">
-                        <div style={{ width: "200px" }}>
-                          <Input
-                            disabled
-                            placeholder={Math.abs(
-                              getHistoryData.update_value
-                            )}
-                          ></Input>
-                        </div>
-                      </Descriptions.Item>
-                    </>
-                  ) : null}
-                </Descriptions>
-              </Descriptions.Item>
-            </Descriptions>
-          )}
-          <Modal
-            visible={platePhototModal}
-            onCancel={() => {
-              setPlatePhotoModal(false);
-            }}
-            footer={false}
-            className="modal-img"
-          >
-            <div>
-              <div className="eae-modal-title">
-                <div className="ltc-icon"></div>入场图片
-              </div>
-              <div className="eae-modal-item">
-                <div>车辆照片</div>
-                <Image src={historyDataDetail.in_veh_pic} onError={handleImgError}/>
-              </div>
-              <div className="eae-modal-item">
-                <div>车牌照片</div>
-                <Image src={historyDataDetail.in_plate_pic} onError={handleImgError}/>
-              </div>
-            </div>
-          </Modal>
-        </Modal>
-      </Modal>
     </>
   );
 }
diff --git a/src/pages/NewEnergy/RecordsInquiry/Unlocking/index.jsx b/src/pages/NewEnergy/RecordsInquiry/Unlocking/index.jsx
index 72ebfc5..53ba0dd 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Unlocking/index.jsx
+++ b/src/pages/NewEnergy/RecordsInquiry/Unlocking/index.jsx
@@ -2,5 +2,5 @@ import React from "react"
 import loadable from "@loadable/component"
 import { LoadingImg } from "@/components"
 
-const UnlockingRecord = loadable(() => import("./loadable"))
-export default (pros) => <UnlockingRecord {...pros} fallback={<LoadingImg />} />
\ No newline at end of file
+const Unlocking = loadable(() => import("./loadable"))
+export default (pros) => <Unlocking {...pros} fallback={<LoadingImg />} />
\ No newline at end of file
diff --git a/src/pages/NewEnergy/RecordsInquiry/Unlocking/loadable.jsx b/src/pages/NewEnergy/RecordsInquiry/Unlocking/loadable.jsx
index 55710d7..b1907fd 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Unlocking/loadable.jsx
+++ b/src/pages/NewEnergy/RecordsInquiry/Unlocking/loadable.jsx
@@ -21,10 +21,10 @@ import { TableModule } from "@/components";
 import "./index.scss";
 
 const { TextArea } = Input;
-
-function UnlockingRecord() {
+// 开锁记录
+function Unlocking() {
   // 详情弹窗
-  const [detailVisible, setDetailVisible] = useState(false);
+  // const [detailVisible, setDetailVisible] = useState(false);
   // 列表数据
   const [tableData, setTableData] = useState([]);
   // 数据总数
@@ -33,91 +33,86 @@ function UnlockingRecord() {
   const [detailData, setDetailData] = useState({});
   // 初始搜索条件
   const initFormData = {
-    operator: "0",
+    tel_number: "",
     rule_name: "",
   };
 
   const formSearch = [
     {
-      name: "tel_number",
+      name: "tel",
       type: "Input",
-      label: "手机号",
-      placeholder: "请输入手机号",
+      label: "用户手机号",
+      placeholder: "请输入",
     },
     {
-      name: "tel_number",
+      name: "charging_station",
       type: "Input",
       label: "充电站",
-      placeholder: "请输入充电站",
+      placeholder: "请输入",
     },
     {
-      name: "tel_number",
+      name: "ground_lock_name",
       type: "Input",
       label: "地锁名称",
-      placeholder: "请输入地锁名称",
+      placeholder: "请输入",
     },
-
     {
       name: "timePeriod",
       type: "RangePicker",
-      label: "开锁时间范围",
+      label: "降锁时间范围",
     },
-  ]; // 搜搜栏
+  ]; // 搜索栏
 
   const columns = [
     {
-      title: "运营商名称",
-      dataIndex: "operator",
-      key: "operator",
+      title: "用户手机号",
+      dataIndex: "tel",
+      key: "tel",
       align: "center",
     },
     {
-      title: "规则名称",
+      title: "车牌号",
       dataIndex: "plate",
       key: "plate",
       align: "center",
     },
     {
-      title: "规则编码",
-      dataIndex: "plate_color",
-      key: "plate_color",
+      title: "地锁名称",
+      dataIndex: "ground_lock_name",
+      key: "ground_lock_name",
       align: "center",
     },
     {
-      title: "创建人",
-      dataIndex: "berth_id",
-      key: "berth_id",
-      width: 100,
+      title: "所在充电站",
+      dataIndex: "local_charging_station",
+      key: "local_charging_station",
+      // width: 100,
       align: "center",
     },
     {
-      title: "创建时间",
-      dataIndex: "in_time",
-      key: "in_time",
+      title: "降锁时间",
+      dataIndex: "lockdown_time",
+      key: "lockdown_time",
       align: "center",
     },
     {
-      title: "操作",
-      dataIndex: "operation",
-      key: "operation",
+      title: "升锁时间",
+      dataIndex: "unlocking_time",
+      key: "unlocking_time",
       align: "center",
-      fixed: "right",
-      width: 100,
-      render: (text, record, index) => {
-        return (
-          <>
-            <Button type="primary" onClick={() => openModal(index, record)}>
-              详情
-            </Button>
-          </>
-        )
-
-      },
+      // fixed: "right",
+      // width: 100,
+    },
+    {
+      title: "开锁方式",
+      dataIndex: "unlocking_method",
+      key: "unlocking_method",
+      align: "center",
+      // fixed: "right",
+      // width: 100,
     },
   ]; // 表头
 
-
-
   // 打开弹窗
   const openModal = (index, record) => {
     setDetailData(record)
@@ -126,7 +121,7 @@ function UnlockingRecord() {
 
   // 检索
   const search = (params) => {
-    ajax.getParkingList(params).then((res) => {
+    ajax.recordsInquiry.getUnlockingList(params).then((res) => {
       if (res.status === 20000) {
         setTableData(res.data.list);
         setTotal(res.data.total);
@@ -156,14 +151,14 @@ function UnlockingRecord() {
         columns={columns}
         tableData={tableData}
         formSearch={formSearch}
-        pagename="停车记录查询"
-        pageName={'AppointmentRecord'}
+        pagename="开锁记录"
+        pageName={'unlockingRecord'}
         initFormData={initFormData}
         total={total}
         search={search}
         exportUrl="/api/bpm/record/get_record_export"
       />
-      <Modal
+      {/* <Modal
         open={detailVisible}
         width={1500}
         className="totalModal"
@@ -173,9 +168,9 @@ function UnlockingRecord() {
         destroyOnClose
       >
 
-      </Modal>
+      </Modal> */}
     </>
   );
 }
 
-export default UnlockingRecord;
+export default Unlocking;
diff --git a/src/services/NewEnergy/index.js b/src/services/NewEnergy/index.js
index 16e16cb..8614653 100644
--- a/src/services/NewEnergy/index.js
+++ b/src/services/NewEnergy/index.js
@@ -1,7 +1,9 @@
 import chargingMgm from './chargingMgm'
 import realtimeMonitor from './realtimeMonitor'
+import recordsInquiry from './recordsInquiry'
 
 export default {
   ...chargingMgm,
-  ...realtimeMonitor
+  ...realtimeMonitor,
+  recordsInquiry,
 }
\ No newline at end of file
diff --git a/src/services/NewEnergy/recordsInquiry.js b/src/services/NewEnergy/recordsInquiry.js
new file mode 100644
index 0000000..0a9e6a3
--- /dev/null
+++ b/src/services/NewEnergy/recordsInquiry.js
@@ -0,0 +1,16 @@
+import ajax from "@/config/ajax"
+
+// 开锁记录查询
+const getUnlockingList = (params) => {
+  return ajax({
+    url: "/api/new_power/records/unlocking",
+    type: "post",
+    data: params,
+  });
+};
+
+
+
+export default {
+    getUnlockingList,
+}
\ No newline at end of file

From e93900e7f97c2945d24e0394ab32c810be0982c8 Mon Sep 17 00:00:00 2001
From: xingjx <xingjx@yisa.com>
Date: Tue, 16 Jan 2024 17:17:14 +0800
Subject: [PATCH 4/7] =?UTF-8?q?fix():=E8=B7=AF=E5=A4=96=E6=A6=82=E8=A7=88?=
 =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/components/VideoPlay/index.scss                |  7 ++
 .../ParkingFalseAlarms/index.scss                  |  2 +-
 .../ParkingFalseAlarms/loadable.jsx                |  3 +-
 src/pages/OutRoadMgm/OutRoadOverview/loadable.jsx  | 82 +++++++++++++++++++---
 src/services/OutRoadMgm/OutRoadOverview.js         | 27 +++++++
 5 files changed, 109 insertions(+), 12 deletions(-)

diff --git a/src/components/VideoPlay/index.scss b/src/components/VideoPlay/index.scss
index bd8fe32..f091abf 100644
--- a/src/components/VideoPlay/index.scss
+++ b/src/components/VideoPlay/index.scss
@@ -184,3 +184,10 @@
     min-height: 400px;
   }
 }
+.video-play-wrap {
+  .rm-video {
+    width: 100%;
+    height: 100%;
+    min-height: 400px;
+  }
+}
\ No newline at end of file
diff --git a/src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/index.scss b/src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/index.scss
index c59bd61..e389afc 100644
--- a/src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/index.scss
+++ b/src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/index.scss
@@ -5,7 +5,7 @@ $color-user-list-bg : var(--color-user-list-bg);
 $color-text : var(--color-text);
 $color-primary : var(--color-primary);
 
-.parkaly-box {
+.parkfalse-box {
   display: flex;
   padding-top: 10px;
   width: 100%;
diff --git a/src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/loadable.jsx b/src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/loadable.jsx
index 965fd9c..0ffe3d3 100644
--- a/src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/loadable.jsx
+++ b/src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/loadable.jsx
@@ -379,7 +379,8 @@ function ParkingFalseAlarms() {
                                 placeholder="请选择"
                                 options={[
                                     { value: "0", label: "全部" },
-                                    { value: "1", label: "地磁设备" }
+                                    { value: "1", label: "地磁设备" },
+                                    { value: "2", label: "高位视频" },
                                 ]}
                                 value={formData.device_type}
                                 onChange={(v) =>
diff --git a/src/pages/OutRoadMgm/OutRoadOverview/loadable.jsx b/src/pages/OutRoadMgm/OutRoadOverview/loadable.jsx
index 5bb374b..f5d535b 100644
--- a/src/pages/OutRoadMgm/OutRoadOverview/loadable.jsx
+++ b/src/pages/OutRoadMgm/OutRoadOverview/loadable.jsx
@@ -4,13 +4,19 @@ import shouruzonge from "@/assets/images/shouruzonge.png";
 import ReactEcharts from "echarts-for-react";
 import { useSelector } from "react-redux";
 import "./index.scss";
+import { VideoPlay } from "@/components";
 import { Select, Tooltip } from "antd";
 const OutRoadOverview = () => {
   const skin = useSelector((state) => {
     return state.common.skin;
   });
   const textColor = skin == "dark" ? "#fff" : "#000";
-
+  const [refData, setRefData] = useState("https://sample-videos.com/video123/flv/720/big_buck_bunny_720p_1mb.flv")
+  const [videoType, setVideoType] = useState('flv')
+  const [videoRoad, setVideoRoad] = useState([])
+  const [roadId, setRoadId] = useState()
+  const [videoDevice, setVideoDevice] = useState([])
+  const [videoPlay, setVideoPlay] = useState('')
   const [headerNums, setHeaderNums] = useState({
     park_num: 0,
     bowei_num: 0,
@@ -270,7 +276,46 @@ const OutRoadOverview = () => {
         console.error(err);
       });
   }
-
+  //概览-存在监控设备的停车场下拉框
+  function getOutRoadVideoRoad() {
+    ajax
+      .getOutRoadVideoRoad()
+      .then((res) => {
+        if (res.status === 20000) {
+          setVideoRoad(res.data);
+        }
+      })
+      .catch((err) => {
+        console.error(err);
+      });
+  }
+  //概览-监控设备
+  function getOutRoadVideoDevice() {
+    ajax
+      .getOutRoadVideoDevice()
+      .then((res) => {
+        if (res.status === 20000) {
+          setVideoDevice(res.data);
+        }
+      })
+      .catch((err) => {
+        console.error(err);
+      });
+  }
+  //查看监控视频
+  function getOutRoadVideoPlay() {
+    ajax
+      .getOutRoadVideoPlay()
+      .then((res) => {
+        if (res.status === 20000) {
+          setVideoPlay(res.data.url);
+          handleFlvPlay(res.data.url)
+        }
+      })
+      .catch((err) => {
+        console.error(err);
+      });
+  }
   //  概览-停车收入top5
   function getIncomeTop5() {
     ajax
@@ -339,7 +384,14 @@ const OutRoadOverview = () => {
 
     })
   }
-
+  const videoRef = useRef()
+  const handleFlvPlay = (e) => {
+    videoRef.current.closeVideo()
+    setVideoType("mp4")
+    //if(videoPlay){
+      videoRef.current.changeUrl(e)
+    //}
+  }
   useEffect(() => {
     getBaseNumber();
     getIncomeTop5();
@@ -347,8 +399,13 @@ const OutRoadOverview = () => {
     getParkingIncome();
     getParkingRecord();
     getPageConfig();
+    getOutRoadVideoRoad();
   }, []);
-
+  useEffect(() => {
+    if(roadId){
+      getOutRoadVideoDevice(roadId)
+    }
+  }, [roadId]);
   return (
     <div className="OutRoadOverview">
       <div id="header">
@@ -473,13 +530,18 @@ const OutRoadOverview = () => {
           <div>
             <Select
               placeholder="请选择停车场"
-              options={[
-                {
-                  label: "青岛停车场",
-                  value: 0,
-                },
-              ]}
+              value={roadId}
+              options={videoRoad}
+              onChange={(e)=>setRoadId(e)}
+            />
+            <Select
+              placeholder="请选择监控设备"
+              options={videoDevice}
+              onChange={(e) => { getOutRoadVideoPlay({ id: e, type: 1 }) }}
             />
+            <div>
+              <VideoPlay ref={videoRef} videoType={videoType} />
+            </div>
           </div>
         </div>
         <div className="right">
diff --git a/src/services/OutRoadMgm/OutRoadOverview.js b/src/services/OutRoadMgm/OutRoadOverview.js
index 3c74387..f1e68c0 100644
--- a/src/services/OutRoadMgm/OutRoadOverview.js
+++ b/src/services/OutRoadMgm/OutRoadOverview.js
@@ -41,10 +41,37 @@ const getOutRoadParkingRecordsInfo = (params) => {
     data: params,
   });
 };
+///概览-存在监控设备的停车场下拉框
+const getOutRoadVideoRoad = (params) => {
+  return ajax({
+    url: "/api/orp/nvr/video_road",
+    type: "get",
+    data: params,
+  });
+};
+///概览-查指定车场存在的监控设备
+const getOutRoadVideoDevice = (params) => {
+  return ajax({
+    url: "/api/orp/nvr/road_device",
+    type: "get",
+    data: params,
+  });
+};
+///查看监控视频
+const getOutRoadVideoPlay = (params) => {
+  return ajax({
+    url: "/api/orp/nvr/get_video_play",
+    type: "post",
+    data: params,
+  });
+};
 export default {
   getOutRoadBaseInfo,
   getOutRoadParkingTopInfo,
   getOutRoadPaymentTopInfo,
   getOutRoadParkingIncomeInfo,
   getOutRoadParkingRecordsInfo,
+  getOutRoadVideoRoad,
+  getOutRoadVideoDevice,
+  getOutRoadVideoPlay,
 };

From cf436d3e3558b26802cf2145e69a74eec1f92a6e Mon Sep 17 00:00:00 2001
From: lisf <lisf@yisa.com>
Date: Tue, 16 Jan 2024 17:52:37 +0800
Subject: [PATCH 5/7] =?UTF-8?q?feat():=20=E5=85=85=E7=94=B5=E4=B8=9A?=
 =?UTF-8?q?=E5=8A=A1=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=E7=BC=96=E5=86=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../NewEnergy/ChargingMgm/BillingRule/index.scss   | 165 ++++---
 .../NewEnergy/ChargingMgm/BillingRule/loadable.jsx | 255 ++++++++--
 .../NewEnergy/ChargingMgm/OrderRuleMgm/index.scss  | 162 ++++---
 .../ChargingMgm/OrderRuleMgm/loadable.jsx          | 531 ++++++++++++++++-----
 src/services/NewEnergy/chargingMgm.js              |  41 +-
 src/services/index.js                              |   4 +
 6 files changed, 875 insertions(+), 283 deletions(-)

diff --git a/src/pages/NewEnergy/ChargingMgm/BillingRule/index.scss b/src/pages/NewEnergy/ChargingMgm/BillingRule/index.scss
index 9a8202a..23f35ce 100644
--- a/src/pages/NewEnergy/ChargingMgm/BillingRule/index.scss
+++ b/src/pages/NewEnergy/ChargingMgm/BillingRule/index.scss
@@ -171,68 +171,113 @@ $color-primary: var(--color-primary);
   border-color: var(--color-border);
 }
 
-// .yisa-table {
-//   width: 100%;
-
-//   .ant-table-thead {
-//     th {
-//       background: var(--color-table-header-bg) !important;
-//     }
-//   }
-
-//   .ant-table-tbody {
-//     td {
-//       background: var(--color-table-body-bg) !important;
-//       border-bottom-color: var(--color-table-border-bottom-color);
-//     }
-
-//     tr:nth-child(even) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-
-//     tr:nth-child(odd) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-//   }
-// }
-.totalModal{
-  .ant-modal-footer{
-    display: none;
+.totalModal {
+  .ruleTitle {
+    font-size: 16px;
+    font-weight: 700;
+    color: #ffffff;
   }
-  position: absolute;
-  top: 40px;
-  right: 174px;
-}
-.ltc-item-img {
-  width: 390px;
-  height: 300px;
-  border: 1px solid;
-  background: #6565656b;
-  margin-right: 20px !important;
-  img  {
-    height: 295px;
-    width: 387px;
-    // object-fit: contain;
+  .ant-modal-content{
+    width: 796px;
+  }
+  .modal-form{
+    margin: 20px 0 0 0;
+    .yisa-search{
+      margin-bottom: 20px;
+      label{
+        color: #eeeff1;
+      }
+      .ant-input-textarea-show-count:after{
+          position: absolute;
+          bottom: 19%;
+          right: 7%;
+      }
+      textarea{
+        position: relative;
+      }
+    }
+  }
+  
+ 
+  .ant-modal-footer{
+    display: flex;
+    justify-content: center;
+    .ant-btn{
+      width: 88px;
+      height: 35px;
+      color: #fff;
+      border: none;
+      border-radius: 4px;
+    }
+    .ant-btn:last-child{
+      background: #409eff;
+    }
   }
 }
-.hanleHistoyModal{
-  max-height: 700px;
-  overflow: auto;
-}
-.hanleHistoyModal::-webkit-scrollbar {
-  width: 5px;
-}
-.hanleHistoyModal::-webkit-scrollbar-thumb {
-  background-color: #9da2ab;
-  border-radius: 10px;
-}
-.modal-img{
-  img{
-    width: 200px;
-    height: 200px;
+.detail-Modal{
+  .ruleTitle {
+    font-size: 16px;
+    font-weight: 700;
+    color: #ffffff;
+  }
+  .ltc-content {
+    display: flex;
+    flex-wrap: wrap;
+    margin: auto;
+    padding: 20px;
+    color: #ffffff;
+    .ltc-item {
+      font-size: 14px;
+      margin: 6px 12px 6px 0;
+      display: inline-flex;
+      flex: 1;
+      //width: 470px;
+      .new-item {
+        display: inline-block;
+        width: 120px;
+        height: 32px;
+        line-height: 32px;
+        background: rgba(150, 161, 192, 0.24);
+        text-align: center;
+      }
+
+      .new-value {
+        display: inline-block;
+        width: 320px;
+        height: 32px;
+        line-height: 32px;
+        text-align: center;
+        background: #3E4557;
+        box-shadow: 0px 3px 8px 0px rgba(0, 0, 0, 0.12);
+      }
+
+      .ltc-item-input {
+        display: inline-block;
+        width: 200px;
+      }
+
+      div {
+        width: 150px;
+      }
+    }
+    .last-row{
+      width: 100%;
+      display: flex;
+      flex-direction: column;
+      .rule-description{
+        .new-item{
+          line-height: 96px;
+          height: 96px;
+        }
+        .new-value{
+          width: 780px;
+          line-height: 96px;
+          height: 96px;
+          word-wrap:break-word
+        }
+      }
+    }
+    
   }
+  
 }
\ No newline at end of file
diff --git a/src/pages/NewEnergy/ChargingMgm/BillingRule/loadable.jsx b/src/pages/NewEnergy/ChargingMgm/BillingRule/loadable.jsx
index 4ef6d7b..a9f38d7 100644
--- a/src/pages/NewEnergy/ChargingMgm/BillingRule/loadable.jsx
+++ b/src/pages/NewEnergy/ChargingMgm/BillingRule/loadable.jsx
@@ -18,55 +18,67 @@ import {
 import { dictionary } from "@/config/common";
 import ajax from "@/services";
 import { TableModule } from "@/components";
+import moment from 'moment'
 import "./index.scss";
 
 const { TextArea } = Input;
 
 function BillingRule() {
+    // 初始搜索条件
+  const initFormData = {
+      operator_id: "0",
+      rule_name: "",
+    };
+  const params ={
+    operator_id:'',
+    rule_name:'',
+    rule_code:'',
+    rule_description:'',
+    time:moment().format("YYYY-MM-DD HH:mm:ss"),
+    username:''
+  }
+  // 新增or详细弹框
+  const [modalData, setModalData] = useState(params)
   // 详情弹窗
   const [detailVisible, setDetailVisible] = useState(false);
   // 列表数据
   const [tableData, setTableData] = useState([]);
   // 数据总数
   const [total, setTotal] = useState(0);
-  // 详情数据
-  const [detailData, setDetailData] = useState({});
-  // 初始搜索条件
-  const initFormData = {
-    operator: "0",
-    rule_name: "",
-  };
-
+  const [operatorOption, setOperatorOption] = useState([])
+  const [ruleDetailVisible, setRuleDetailVisible] = useState(false)
+  const [detailsData, setDetailsData] = useState({})
+  const tableRef = useRef(null)
   const columns = [
     {
       title: "运营商名称",
-      dataIndex: "operator",
-      key: "operator",
+      dataIndex: "operator_name",
+      key: "operator_name",
       align: "center",
     },
     {
       title: "规则名称",
-      dataIndex: "plate",
-      key: "plate",
+      dataIndex: "rule_name",
+      key: "rule_name",
       align: "center",
     },
     {
       title: "规则编码",
-      dataIndex: "plate_color",
-      key: "plate_color",
+      dataIndex: "rule_code",
+      key: "rule_code",
       align: "center",
     },
     {
       title: "创建人",
-      dataIndex: "berth_id",
-      key: "berth_id",
+      dataIndex: "creator",
+      key: "creator",
       width: 100,
       align: "center",
     },
     {
       title: "创建时间",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "create_time",
+      key: "create_time",
       align: "center",
     },
     {
@@ -79,9 +91,9 @@ function BillingRule() {
       render: (text, record, index) => {
         return (
           <>
-            <Button type="primary" onClick={() => openModal(index, record)}>
+            <a type="primary" onClick={() => openModal(index, record)}>
               详情
-            </Button>
+            </a>
           </>
         )
 
@@ -91,11 +103,12 @@ function BillingRule() {
 
   const formSearch = [
     {
-      name: "operator",
+      name: "operator_id",
       type: "Select",
-      label: "商户名称",
+      label: "运营商名称",
       defaultValue: "0",
-      placeholder: "请选择商户名称",
+      placeholder: "请选择运营商名称",
+      options:operatorOption.length ? operatorOption : [{value:"0",label:'全部'}]
     },
     {
       name: "rule_name",
@@ -107,21 +120,38 @@ function BillingRule() {
       name: "timePeriod",
       type: "RangePicker",
       label: "时间段",
+      defaultValue: [moment().subtract(1,"months"), moment()]
     },
   ];
-
+    // 获取运营商名字
+    const getAllOperator =() => {
+      ajax.getOperatorList().then((res) => {
+        if (res.status === 20000) {
+          setOperatorOption(res.data);
+        }
+      });
+    }
   // 打开弹窗
   const openModal = (index, record) => {
-    setDetailData(record)
-    setDetailVisible(true);
+    setDetailsData(record)
+    setRuleDetailVisible(true);
   }
 
   // 检索
   const search = (params) => {
-    ajax.getParkingList(params).then((res) => {
+    console.log("params",params);
+    let data = {
+      ...params,
+      type:1
+    }
+    ajax.getRegularList(data).then((res) => {
       if (res.status === 20000) {
         setTableData(res.data.list);
         setTotal(res.data.total);
+        setModalData({
+          ...modalData,
+          username:res.data.username,
+        })
       } else {
         message.error(res.message)
       }
@@ -129,9 +159,43 @@ function BillingRule() {
   }
 
   const handelAdd = () => {
+    setModalData({
+      ...params,
+      username:modalData?.username
+    })
     setDetailVisible(true)
   }
 
+// 处理弹框ok按钮
+  const handleConfirm = () => {
+    if(!modalData?.operator_id){
+      message.warning("运营商名称不能为空")
+      return
+    }else if(!modalData?.rule_name){
+      message.warning("规则名称不能为空")
+      return
+    }else if(!modalData?.rule_code){
+      message.warning("规则编码不能为空")
+      return
+    }
+    // 发保存请求
+    ajax.addRule({...modalData,type:1}).then(res => {
+      if (res.status === 20000) {
+        message.success(res.message)
+        tableRef.current.fetch()
+        setModalData({
+          ...params,
+          username:modalData?.username
+        })
+        setDetailVisible(false)
+      }
+    }).catch(err => {
+      console.log(err);
+    })
+  }
+  useEffect(() => {
+    getAllOperator()
+  },[])
   return (
     <>
       <TableModule
@@ -146,10 +210,10 @@ function BillingRule() {
           </Button>
         }
         columns={columns}
+        ref={tableRef}
         tableData={tableData}
         formSearch={formSearch}
         pagename="停车记录查询"
-        pageName={'billingRule'}
         initFormData={initFormData}
         total={total}
         search={search}
@@ -157,14 +221,145 @@ function BillingRule() {
       />
       <Modal
         open={detailVisible}
-        width={1500}
+        width={650}
         className="totalModal"
         onCancel={() => {
+          setModalData({...params,username:modalData?.username})
+          setDetailVisible(false);
+        }}
+        onOk={() => {
+          handleConfirm()
           setDetailVisible(false);
         }}
+        okText="保存"
         destroyOnClose
       >
-
+        <div className="ruleTitle">
+          <span className="font">新增规则</span>
+        </div>
+        <div className="modal-form">
+          <div className="yisa-search">
+              <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+              <label>运营商名称</label>
+              <Select
+                  value={modalData.operator_id}
+                  style={{ width: 660, marginLeft: 10 }}
+                  options={operatorOption}
+                  onChange={(v) => {setModalData({...modalData,operator_id:v})}}
+              />
+          </div>
+          <div className="yisa-search" style={{marginLeft:13}}>
+              <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+              <label>规则名称</label>
+              <Input
+                  placeholder="请输入名称"
+                  value={modalData.rule_name}
+                  style={{ width: 660, marginLeft: 10 }}
+                  maxLength={30}
+                  onChange={(v) => {setModalData({...modalData,rule_name:v.target.value})}}
+              />
+          </div>
+          <div className="yisa-search" style={{marginLeft:13}}>
+              <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+              <label>规则编码</label>
+              <Input
+                  placeholder="请输入编码"
+                  value={modalData.rule_code}
+                  style={{ width: 660, marginLeft: 10 }}
+                  maxLength={30}
+                  onChange={(v) => {setModalData({...modalData,rule_code:v.target.value})}}
+              />
+          </div>
+          <div className="yisa-search" style={{marginLeft:26}}>
+              <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+              <label>创建人</label>
+              <Input
+                  placeholder="请输入创建人"
+                  value={modalData.username}
+                  style={{ width: 660, marginLeft: 10 }}
+                  maxLength={30}
+                  disabled
+                  // onChange={(v) => {setModalData({...modalData,creator:v.target.value})}}
+              />
+          </div>
+          <div className="yisa-search" style={{marginLeft:12}}>
+              <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+              <label>创建时间</label>
+              <Input
+                  placeholder="请输入创建时间"
+                  value={modalData.time}
+                  style={{ width: 660, marginLeft: 10 }}
+                  maxLength={30}
+                  disabled
+                  // onChange={(v) => {setModalData({...modalData,creat_time:v.target.value})}}
+              />
+          </div>
+          <div className="yisa-search" style={{display:"flex",marginLeft:13}}>
+              <label>规则描述</label>
+              <TextArea
+                showCount
+                placeholder="请输入规则描述"
+                value={modalData.rule_description}
+                style={{ width: 660,height:80, marginLeft: 7 }}
+                onChange={(v)=> setModalData({...modalData,rule_description:v.target.value})}
+                maxLength={200}
+                />
+          </div>
+        </div>
+      </Modal>
+      <Modal
+         open={ruleDetailVisible}
+         width={1000}
+         className="detail-Modal"
+         footer={null}
+         destroyOnClose
+         onCancel={() => {
+          setRuleDetailVisible(false);
+        }}
+      >
+         <div className="ruleTitle">
+          <span className="font">新增规则</span>
+        </div>
+        <div className="ltc-content">
+            <div className="ltc-item">
+              <div className="new-item">运营商名称</div>
+              <div className="new-value">
+                {detailsData?.operator_name || "--"}
+              </div>
+            </div>
+            <div className="ltc-item">
+              <div className="new-item">规则名称</div>
+              <div className="new-value">
+                {detailsData?.rule_name || "--"}
+              </div>
+            </div>
+            <div className="ltc-item">
+              <div className="new-item">规则编码</div>
+              <div className="new-value">
+                {detailsData?.rule_code || "--"}
+              </div>
+            </div>
+            <div className="ltc-item">
+              <div className="new-item">创建人</div>
+              <div className="new-value">
+                {detailsData?.creator || "--"}
+              </div>
+            </div>
+            <div className="last-row">
+            <div className="ltc-item">
+              <div className="new-item">创建时间</div>
+              <div className="new-value">
+                {detailsData?.create_time || "--"}
+              </div>
+            </div>
+            <div className="ltc-item rule-description" >
+              <div className="new-item">规则描述</div>
+              <div className="new-value">
+                {detailsData?.rule_description || "--"}
+              </div>
+            </div>
+            </div>
+          </div>
       </Modal>
     </>
   );
diff --git a/src/pages/NewEnergy/ChargingMgm/OrderRuleMgm/index.scss b/src/pages/NewEnergy/ChargingMgm/OrderRuleMgm/index.scss
index 9a8202a..9a67b18 100644
--- a/src/pages/NewEnergy/ChargingMgm/OrderRuleMgm/index.scss
+++ b/src/pages/NewEnergy/ChargingMgm/OrderRuleMgm/index.scss
@@ -171,68 +171,110 @@ $color-primary: var(--color-primary);
   border-color: var(--color-border);
 }
 
-// .yisa-table {
-//   width: 100%;
-
-//   .ant-table-thead {
-//     th {
-//       background: var(--color-table-header-bg) !important;
-//     }
-//   }
-
-//   .ant-table-tbody {
-//     td {
-//       background: var(--color-table-body-bg) !important;
-//       border-bottom-color: var(--color-table-border-bottom-color);
-//     }
-
-//     tr:nth-child(even) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-
-//     tr:nth-child(odd) {
-//       td {
-//         background: var(--color-table-body-bg-nth-child-even) !important;
-//       }
-//     }
-//   }
-// }
-.totalModal{
-  .ant-modal-footer{
-    display: none;
+
+.totalModal {
+  .ruleTitle {
+    font-size: 16px;
+    font-weight: 700;
+    color: #ffffff;
   }
-  position: absolute;
-  top: 40px;
-  right: 174px;
-}
-.ltc-item-img {
-  width: 390px;
-  height: 300px;
-  border: 1px solid;
-  background: #6565656b;
-  margin-right: 20px !important;
-  img  {
-    height: 295px;
-    width: 387px;
-    // object-fit: contain;
+  .ant-modal-content{
+    width: 796px;
+  }
+  .modal-form{
+    margin: 20px 0 0 0;
+    .yisa-search{
+      margin-bottom: 20px;
+      label{
+        color: #eeeff1;
+      }
+      .ant-input-textarea-show-count:after{
+          position: absolute;
+          bottom: 19%;
+          right: 7%;
+      }
+      textarea{
+        position: relative;
+      }
+    }
+  }
+  
+ 
+  .ant-modal-footer{
+    display: flex;
+    justify-content: center;
+    .ant-btn{
+      width: 88px;
+      height: 35px;
+      color: #fff;
+      border: none;
+      border-radius: 4px;
+    }
+    .ant-btn:last-child{
+      background: #409eff;
+    }
   }
 }
-.hanleHistoyModal{
-  max-height: 700px;
-  overflow: auto;
-}
-.hanleHistoyModal::-webkit-scrollbar {
-  width: 5px;
-}
-.hanleHistoyModal::-webkit-scrollbar-thumb {
-  background-color: #9da2ab;
-  border-radius: 10px;
-}
-.modal-img{
-  img{
-    width: 200px;
-    height: 200px;
+.detail-Modal{
+  .ruleTitle {
+    font-size: 16px;
+    font-weight: 700;
+    color: #ffffff;
+  }
+  .ltc-content {
+    display: flex;
+    flex-wrap: wrap;
+    margin: auto;
+    padding: 20px;
+    color: #ffffff;
+    .ltc-item {
+      font-size: 14px;
+      margin: 6px 12px 6px 0;
+      display: inline-flex;
+      flex: 1;
+      //width: 470px;
+      .new-item {
+        display: inline-block;
+        width: 120px;
+        height: 32px;
+        line-height: 32px;
+        background: rgba(150, 161, 192, 0.24);
+        text-align: center;
+      }
+
+      .new-value {
+        display: inline-block;
+        width: 320px;
+        height: 32px;
+        line-height: 32px;
+        text-align: center;
+        background: #3E4557;
+        box-shadow: 0px 3px 8px 0px rgba(0, 0, 0, 0.12);
+      }
+
+      .ltc-item-input {
+        display: inline-block;
+        width: 200px;
+      }
+
+      div {
+        width: 150px;
+      }
+    }
+      .rule-description{
+        .new-item{
+          line-height: 96px;
+          height: 96px;
+        }
+        .new-value{
+          width: 780px;
+          line-height: 96px;
+          height: 96px;
+          word-wrap:break-word
+        }
+      }
+    
+    
   }
+  
 }
\ No newline at end of file
diff --git a/src/pages/NewEnergy/ChargingMgm/OrderRuleMgm/loadable.jsx b/src/pages/NewEnergy/ChargingMgm/OrderRuleMgm/loadable.jsx
index cf801d2..bb53a4a 100644
--- a/src/pages/NewEnergy/ChargingMgm/OrderRuleMgm/loadable.jsx
+++ b/src/pages/NewEnergy/ChargingMgm/OrderRuleMgm/loadable.jsx
@@ -13,161 +13,428 @@ import {
   Select,
   Image,
   Timeline,
-  Popover
+  Popover,
+  Popconfirm
 } from "antd";
 import { dictionary } from "@/config/common";
 import ajax from "@/services";
 import { TableModule } from "@/components";
+import moment from 'moment'
 import "./index.scss";
 
 const { TextArea } = Input;
-
 function OrderRuleMgm() {
-  // 详情弹窗
-  const [detailVisible, setDetailVisible] = useState(false);
-  // 列表数据
-  const [tableData, setTableData] = useState([]);
-  // 数据总数
-  const [total, setTotal] = useState(0);
-  // 详情数据
-  const [detailData, setDetailData] = useState({});
   // 初始搜索条件
-  const initFormData = {
-    operator: "0",
+const initFormData = {
+    operator_id: "0",
     rule_name: "",
   };
+const params ={
+  operator_id:'',
+  rule_name:'',
+  rule_code:'',
+  rule_description:'',
+  time:moment().format("YYYY-MM-DD HH:mm:ss"),
+  username:'',
+  status:1,
+}
+// 新增or详细弹框
+const [modalData, setModalData] = useState(params)
+// 详情弹窗
+const [detailVisible, setDetailVisible] = useState(false);
+// 列表数据
+const [tableData, setTableData] = useState([]);
+// 数据总数
+const [total, setTotal] = useState(0);
+const [operatorOption, setOperatorOption] = useState([])
+const [ruleDetailVisible, setRuleDetailVisible] = useState(false)
+const [detailsData, setDetailsData] = useState({})
+const tableRef = useRef(null)
+const columns = [
+  {
+    title: "运营商名称",
+    dataIndex: "operator_name",
+    key: "operator_name",
+    align: "center",
+  },
+  {
+    title: "规则名称",
+    dataIndex: "rule_name",
+    key: "rule_name",
+    align: "center",
+  },
+  {
+    title: "规则编码",
+    dataIndex: "rule_code",
+    key: "rule_code",
+    align: "center",
+  },
+  {
+    title: "创建人",
+    dataIndex: "creator",
+    key: "creator",
+    width: 100,
+    align: "center",
+  },
+  {
+    title: "规则状态",
+    dataIndex: "status",
+    key: "status",
+    width: 100,
+    align: "center",
+    render:(_,record) => {
+      return(
+        <span style={
+          {
+            color:record ?.status ? "#2ADC41" : "#EC5761"}
+          }
+            >
+          {record?.status ? "正常" : "停用"}</span>
+      )
+    }
+  },
+  {
+    title: "创建时间",
+    dataIndex: "create_time",
+    key: "create_time",
+    align: "center",
+  },
+  {
+    title: "操作",
+    dataIndex: "operation",
+    key: "operation",
+    align: "center",
+    fixed: "right",
+    width: 100,
+    render: (text, record, index) => {
+      return (
+        <div style={{display:"flex",cursor:"pointer"}}>
+          <div style={{color:"#3AA9FF"}} onClick={() => openModal(index, record)}>
+            详情
+          </div>
+          <div 
+            style={{marginLeft:10,color:record ?.status ? "#EC5761" : "#2ADC41"}} 
+          >
+             <Popconfirm 
+                placement="left" 
+                title={record?.status ? "是否停用该规则" : "是否启动该规则"} 
+                onConfirm={() => { handleRuleStatus(record?.id,record?.status ? 0 : 1) }}
+                okText="是" 
+                cancelText="否">
+                  {record?.status ? "停用" : "启动"}
+              </Popconfirm>
+            
+          </div>
+        </div>
+      )
 
-  const columns = [
-    {
-      title: "运营商名称",
-      dataIndex: "operator",
-      key: "operator",
-      align: "center",
-    },
-    {
-      title: "规则名称",
-      dataIndex: "plate",
-      key: "plate",
-      align: "center",
-    },
-    {
-      title: "规则编码",
-      dataIndex: "plate_color",
-      key: "plate_color",
-      align: "center",
-    },
-    {
-      title: "创建人",
-      dataIndex: "berth_id",
-      key: "berth_id",
-      width: 100,
-      align: "center",
-    },
-    {
-      title: "创建时间",
-      dataIndex: "in_time",
-      key: "in_time",
-      align: "center",
-    },
-    {
-      title: "操作",
-      dataIndex: "operation",
-      key: "operation",
-      align: "center",
-      fixed: "right",
-      width: 100,
-      render: (text, record, index) => {
-        return (
-          <>
-            <Button type="primary" onClick={() => openModal(index, record)}>
-              详情
-            </Button>
-          </>
-        )
-
-      },
     },
-  ];
+  },
+];
 
-  const formSearch = [
-    {
-      name: "operator",
-      type: "Select",
-      label: "商户名称",
-      defaultValue: "0",
-      placeholder: "请选择商户名称",
-    },
-    {
-      name: "rule_name",
-      type: "Input",
-      label: "规则名称",
-      placeholder: "请输入出场收费员",
-    },
-    {
-      name: "timePeriod",
-      type: "RangePicker",
-      label: "时间段",
-    },
-  ];
-
-  // 打开弹窗
-  const openModal = (index, record) => {
-    setDetailData(record)
-    setDetailVisible(true);
-  }
+const formSearch = [
+  {
+    name: "operator_id",
+    type: "Select",
+    label: "运营商名称",
+    defaultValue: "0",
+    placeholder: "请选择运营商名称",
+    options:operatorOption.length ? operatorOption : [{value:"0",label:'全部'}]
+  },
+  {
+    name: "rule_name",
+    type: "Input",
+    label: "规则名称",
+    placeholder: "请输入出场收费员",
+  },
+  {
+    name: "timePeriod",
+    type: "RangePicker",
+    label: "时间段",
+    defaultValue: [moment().subtract(1,"months"), moment()]
+  },
+];
+  // 更新规则状态
+  const handleRuleStatus = (id,status) => {
+    ajax.updataRule({id,status}).then((res) => {
+      if (res.status == 20000) {
+        message.success(res.message)
+        tableRef.current.fetch()
+      }else{
+        message.success(res.message)
+      }
+    }).catch(e => {
+      console.log(e);
+    });
+  } 
 
-  // 检索
-  const search = (params) => {
-    ajax.getParkingList(params).then((res) => {
+  // 获取运营商名字
+  const getAllOperator =() => {
+    ajax.getOperatorList().then((res) => {
       if (res.status === 20000) {
-        setTableData(res.data.list);
-        setTotal(res.data.total);
-      } else {
-        message.error(res.message)
+        setOperatorOption(res.data);
+      }else{
+        setOperatorOption([])
       }
+    }).catch(e => {
+      console.log(e);
     });
   }
+// 打开弹窗
+const openModal = (index, record) => {
+  setDetailsData(record)
+  setRuleDetailVisible(true);
+}
 
-  const handelAdd = () => {
-    setDetailVisible(true)
+// 检索
+const search = (params) => {
+  let data = {
+    ...params,
+    type:2
   }
+  ajax.getRegularList(data).then((res) => {
+    if (res.status === 20000) {
+      setTableData(res.data.list);
+      setTotal(res.data.total);
+      setModalData({
+        ...modalData,
+        username:res.data.username,
+      })
+    } else {
+      message.error(res.message)
+    }
+  });
+}
 
-  return (
-    <>
-      <TableModule
-        showSerial={true}
-        isExport={false}
-        diyButton={
-          <Button
-            type="primary"
-            onClick={handelAdd}
-          >
-            新增
-          </Button>
-        }
-        columns={columns}
-        tableData={tableData}
-        formSearch={formSearch}
-        pagename="停车记录查询"
-        pageName={'orderRuleMgm'}
-        initFormData={initFormData}
-        total={total}
-        search={search}
-        exportUrl="/api/bpm/record/get_record_export"
-      />
-      <Modal
-        open={detailVisible}
-        width={1500}
-        className="totalModal"
-        onCancel={() => {
-          setDetailVisible(false);
-        }}
-        destroyOnClose
-      >
+const handelAdd = () => {
+  setModalData({
+    ...params,
+    username:modalData?.username
+  })
+  setDetailVisible(true)
+}
 
-      </Modal>
-    </>
-  );
+// 处理弹框ok按钮
+const handleConfirm = () => {
+  if(!modalData?.operator_id){
+    message.warning("运营商名称不能为空")
+    return
+  }else if(!modalData?.rule_name){
+    message.warning("规则名称不能为空")
+    return
+  }else if(!modalData?.rule_code){
+    message.warning("规则编码不能为空")
+    return
+  }
+  // 发保存请求
+  ajax.addRule({...modalData,type:2}).then(res => {
+    if (res.status === 20000) {
+      message.success(res.message)
+      tableRef.current.fetch()
+      setModalData({
+        ...params,
+        username:modalData?.username
+      })
+      setDetailVisible(false)
+    }
+  }).catch(err => {
+    console.log(err);
+  })
+}
+useEffect(() => {
+  getAllOperator()
+},[])
+return (
+  <>
+    <TableModule
+      showSerial={true}
+      isExport={false}
+      diyButton={
+        <Button
+          type="primary"
+          onClick={handelAdd}
+        >
+          新增
+        </Button>
+      }
+      columns={columns}
+      ref={tableRef}
+      tableData={tableData}
+      formSearch={formSearch}
+      pagename="停车记录查询"
+      initFormData={initFormData}
+      total={total}
+      search={search}
+      exportUrl="/api/bpm/record/get_record_export"
+    />
+    <Modal
+      open={detailVisible}
+      width={650}
+      className="totalModal"
+      onCancel={() => {
+        setModalData({...params,username:modalData?.username})
+        setDetailVisible(false);
+      }}
+      onOk={() => {
+        handleConfirm()
+        setDetailVisible(false);
+      }}
+      okText="保存"
+      destroyOnClose
+    >
+      <div className="ruleTitle">
+        <span className="font">新增规则</span>
+      </div>
+      <div className="modal-form">
+        <div className="yisa-search">
+            <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+            <label>运营商名称</label>
+            <Select
+                value={modalData.operator_id}
+                style={{ width: 660, marginLeft: 10 }}
+                options={operatorOption}
+                onChange={(v) => {setModalData({...modalData,operator_id:v})}}
+            />
+        </div>
+        <div className="yisa-search" style={{marginLeft:13}}>
+            <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+            <label>规则名称</label>
+            <Input
+                placeholder="请输入名称"
+                value={modalData.rule_name}
+                style={{ width: 660, marginLeft: 10 }}
+                maxLength={30}
+                onChange={(v) => {setModalData({...modalData,rule_name:v.target.value})}}
+            />
+        </div>
+        <div className="yisa-search" style={{marginLeft:13}}>
+            <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+            <label>规则编码</label>
+            <Input
+                placeholder="请输入编码"
+                value={modalData.rule_code}
+                style={{ width: 660, marginLeft: 10 }}
+                maxLength={30}
+                onChange={(v) => {setModalData({...modalData,rule_code:v.target.value})}}
+            />
+        </div>
+        <div className="yisa-search" style={{marginLeft:26}}>
+            <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+            <label>创建人</label>
+            <Input
+                placeholder="请输入创建人"
+                value={modalData.username}
+                style={{ width: 660, marginLeft: 10 }}
+                maxLength={30}
+                disabled
+                // onChange={(v) => {setModalData({...modalData,creator:v.target.value})}}
+            />
+        </div>
+        <div className="yisa-search" style={{marginLeft:12}}>
+            <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+            <label>创建时间</label>
+            <Input
+                placeholder="请输入创建时间"
+                value={modalData.time}
+                style={{ width: 660, marginLeft: 10 }}
+                maxLength={30}
+                disabled
+                // onChange={(v) => {setModalData({...modalData,creat_time:v.target.value})}}
+            />
+        </div>
+        <div className="yisa-search" style={{marginLeft:12}}>
+            <em style={{marginRight:'5px',marginLeft:'-13px',color:'red'}}>*</em>
+            <label>规则状态</label>
+            <Select
+                value={modalData.status}
+                style={{ width: 660, marginLeft: 10 }}
+                options={[
+                  {
+                    value:1,
+                    label:'正常'
+                  },
+                  {
+                    value:0,
+                    label:'停用'
+                  }
+              ]}
+                // onChange={(v) => {setModalData({...modalData,creat_time:v.target.value})}}
+            />
+        </div>
+        <div className="yisa-search" style={{display:"flex",marginLeft:13}}>
+            <label>规则描述</label>
+            <TextArea
+              showCount
+              placeholder="请输入规则描述"
+              value={modalData.rule_description}
+              style={{ width: 660,height:80, marginLeft: 7 }}
+              onChange={(v)=> setModalData({...modalData,rule_description:v.target.value})}
+              maxLength={200}
+              />
+        </div>
+      </div>
+    </Modal>
+    <Modal
+       open={ruleDetailVisible}
+       width={1000}
+       className="detail-Modal"
+       footer={null}
+       destroyOnClose
+       onCancel={() => {
+        setRuleDetailVisible(false);
+      }}
+    >
+       <div className="ruleTitle">
+        <span className="font">新增规则</span>
+      </div>
+      <div className="ltc-content">
+          <div className="ltc-item">
+            <div className="new-item">运营商名称</div>
+            <div className="new-value">
+              {detailsData?.operator_name || "--"}
+            </div>
+          </div>
+          <div className="ltc-item">
+            <div className="new-item">规则名称</div>
+            <div className="new-value">
+              {detailsData?.rule_name || "--"}
+            </div>
+          </div>
+          <div className="ltc-item">
+            <div className="new-item">规则编码</div>
+            <div className="new-value">
+              {detailsData?.rule_code || "--"}
+            </div>
+          </div>
+          <div className="ltc-item">
+            <div className="new-item">创建人</div>
+            <div className="new-value">
+              {detailsData?.creator || "--"}
+            </div>
+          </div>
+          <div className="ltc-item">
+            <div className="new-item">创建时间</div>
+            <div className="new-value">
+              {detailsData?.create_time || "--"}
+            </div>
+          </div>
+          <div className="ltc-item">
+            <div className="new-item">规则状态</div>
+            <div className="new-value">
+              {detailsData?.status || "--"}
+            </div>
+          </div>
+          <div className="ltc-item rule-description" >
+            <div className="new-item">规则描述</div>
+            <div className="new-value">
+              {detailsData?.rule_description || "--"}
+            </div>
+          </div>
+  
+        </div>
+    </Modal>
+  </>
+);
 }
 
 export default OrderRuleMgm;
diff --git a/src/services/NewEnergy/chargingMgm.js b/src/services/NewEnergy/chargingMgm.js
index 3f5f566..545330d 100644
--- a/src/services/NewEnergy/chargingMgm.js
+++ b/src/services/NewEnergy/chargingMgm.js
@@ -9,6 +9,45 @@ const getWechatMenuList = (params) => {
   });
 };
 
+// 获取运营商下拉
+const getOperatorList = (params) => {
+  return ajax({
+    url: "/api/nes/rule/operator",
+    type: "get",
+    data: params,
+  });
+};
+
+// 获取规则列表
+const getRegularList = (params) => {
+  return ajax({
+    url: "/api/nes/rule/list",
+    type: "post",
+    data: params,
+  });
+};
+
+// 新增规则
+const addRule = (params) => {
+  return ajax({
+    url: "/api/nes/rule/add",
+    type: "post",
+    data: params,
+  });
+};
+
+// 更新规则状态
+const updataRule = (params) => {
+  return ajax({
+    url: "/api/nes/rule/update",
+    type: "post",
+    data: params,
+  });
+};
 export default{
-  getWechatMenuList
+  getWechatMenuList,
+  getOperatorList,
+  getRegularList,
+  addRule,
+  updataRule
 }
\ No newline at end of file
diff --git a/src/services/index.js b/src/services/index.js
index abcce60..aeceee3 100644
--- a/src/services/index.js
+++ b/src/services/index.js
@@ -23,7 +23,11 @@ import FinancialMgm from "./FinancialMgm";
 import DataAnalysisPrediction from "./DataAnalysisPrediction";
 import ParkingOverview from "./ParkingOverview";
 import OffPeak from "./OffPeak";
+<<<<<<< Updated upstream
 import NewEnergy from "./NewEnergy";
+=======
+import NewEnergy from "./NewEnergy"
+>>>>>>> Stashed changes
 const api = {};
 export default {
   ...api,

From 70fa33d41f5447fe9f39c7581dae5971aea96929 Mon Sep 17 00:00:00 2001
From: lisf <lisf@yisa.com>
Date: Tue, 16 Jan 2024 17:58:10 +0800
Subject: [PATCH 6/7] =?UTF-8?q?fix():=20=E8=A7=A3=E5=86=B3=E5=86=B2?=
 =?UTF-8?q?=E7=AA=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/services/index.js | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/src/services/index.js b/src/services/index.js
index aeceee3..abcce60 100644
--- a/src/services/index.js
+++ b/src/services/index.js
@@ -23,11 +23,7 @@ import FinancialMgm from "./FinancialMgm";
 import DataAnalysisPrediction from "./DataAnalysisPrediction";
 import ParkingOverview from "./ParkingOverview";
 import OffPeak from "./OffPeak";
-<<<<<<< Updated upstream
 import NewEnergy from "./NewEnergy";
-=======
-import NewEnergy from "./NewEnergy"
->>>>>>> Stashed changes
 const api = {};
 export default {
   ...api,

From ba6ffa6b5b17d7192687e418ba842cd1c45976a9 Mon Sep 17 00:00:00 2001
From: zhugy <zhugy@yisa.com>
Date: Tue, 16 Jan 2024 17:59:28 +0800
Subject: [PATCH 7/7] =?UTF-8?q?fix():=E4=BF=AE=E6=94=B9=E8=AE=B0=E5=BD=95?=
 =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../RecordsInquiry/Appointment/loadable.jsx        | 76 ++++++++++----------
 .../NewEnergy/RecordsInquiry/Charge/loadable.jsx   | 66 ++++++++---------
 .../RecordsInquiry/Violation/loadable.jsx          | 83 ++++++++++++++--------
 src/services/NewEnergy/recordsInquiry.js           | 39 ++++++++++
 src/services/index.js                              |  4 --
 5 files changed, 162 insertions(+), 106 deletions(-)

diff --git a/src/pages/NewEnergy/RecordsInquiry/Appointment/loadable.jsx b/src/pages/NewEnergy/RecordsInquiry/Appointment/loadable.jsx
index 8bccff3..e097605 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Appointment/loadable.jsx
+++ b/src/pages/NewEnergy/RecordsInquiry/Appointment/loadable.jsx
@@ -27,8 +27,8 @@ function Appointment() {
   const columns = [
     {
       title: "用户手机号",
-      dataIndex: "operator",
-      key: "operator",
+      dataIndex: "phone",
+      key: "phone",
       align: "center",
     },
     {
@@ -39,62 +39,62 @@ function Appointment() {
     },
     {
       title: "充电站",
-      dataIndex: "plate_color",
-      key: "plate_color",
+      dataIndex: "station",
+      key: "station",
       align: "center",
     },
     {
       title: "商户名称",
-      dataIndex: "berth_id",
-      key: "berth_id",
+      dataIndex: "operator",
+      key: "operator",
       align: "center",
     },
     {
-      title: "降预约开始时间",
-      dataIndex: "in_time",
-      key: "in_time",
+      title: "预约开始时间",
+      dataIndex: "pre_start_time",
+      key: "start_time",
       align: "center",
     },
     {
       title: "预约截至时间",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "pre_end_time",
+      key: "end_time",
       align: "center",
     },
     {
       title: "缴纳预约费用金额",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "pre_money",
+      key: "pre_money",
       align: "center",
     },
     {
       title: "缴费时间",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "pay_time",
+      key: "pay_time",
       align: "center",
     },
     {
       title: "订单状态",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "order_status",
+      key: "order_status",
       align: "center",
     },
     {
       title: "订单完结时间",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "finish_time",
+      key: "finish_time",
       align: "center",
     },
     {
       title: "预约费用退款金额",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "refund_money",
+      key: "refund_money",
       align: "center",
     },
     {
       title: "顶动感实收金额",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "pay_money",
+      key: "pay_money",
       align: "center",
     },
     {
@@ -131,7 +131,7 @@ function Appointment() {
       placeholder: "请输入车牌号",
     },
     {
-      name: "charging",
+      name: "station",
       type: "Input",
       label: "充电站",
       placeholder: "请输入充电站",
@@ -144,12 +144,12 @@ function Appointment() {
       placeholder: "请选择商户名称",
     },
     {
-      name: "timeStart",
+      name: "pre_time",
       type: "DateRangePicker",
       label: "预约开始时间",
     },
     {
-      name: "timeEnd",
+      name: "end_time",
       type: "DateRangePicker",
       label: "订单完结时间",
     },
@@ -163,10 +163,10 @@ function Appointment() {
 
   // 检索
   const search = (params) => {
-    ajax.getParkingList(params).then((res) => {
+    ajax.recordsInquiry.getAppointmentList(params).then((res) => {
       if (res.status === 20000) {
-        setTableData(res.data.list);
-        setTotal(res.data.total);
+        setTableData(res.data);
+        setTotal(res.total);
       } else {
         message.error(res.message)
       }
@@ -182,19 +182,19 @@ function Appointment() {
       <TableModule
         showSerial={true}
         isExport={false}
-        diyButton={
-          <Button
-            type="primary"
-            onClick={handelAdd}
-          >
-            新增
-          </Button>
-        }
+        // diyButton={
+        //   <Button
+        //     type="primary"
+        //     onClick={handelAdd}
+        //   >
+        //     新增
+        //   </Button>
+        // }
         columns={columns}
         tableData={tableData}
         formSearch={formSearch}
         pagename="预约订单"
-        pageName={'Appointment'}
+        pageName={'appointment'}
         initFormData={initFormData}
         total={total}
         search={search}
diff --git a/src/pages/NewEnergy/RecordsInquiry/Charge/loadable.jsx b/src/pages/NewEnergy/RecordsInquiry/Charge/loadable.jsx
index 0530080..299e0e4 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Charge/loadable.jsx
+++ b/src/pages/NewEnergy/RecordsInquiry/Charge/loadable.jsx
@@ -27,56 +27,56 @@ function Charge() {
   const columns = [
     {
       title: "充电订单号",
-      dataIndex: "operator",
-      key: "operator",
+      dataIndex: "order_id",
+      key: "order_id",
       align: "center",
     },
     {
       title: "充电站",
-      dataIndex: "plate",
-      key: "plate",
+      dataIndex: "name",
+      key: "name",
       align: "center",
     },
     {
       title: "充电电量",
-      dataIndex: "plate_color",
-      key: "plate_color",
+      dataIndex: "capacity",
+      key: "capacity",
       align: "center",
     },
     {
       title: "电费",
-      dataIndex: "berth_id",
-      key: "berth_id",
+      dataIndex: "electric",
+      key: "electric",
       align: "center",
     },
     {
       title: "充电服务费",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "service_fee",
+      key: "service_fee",
       align: "center",
     },
     {
       title: "充电收入",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "income",
+      key: "income",
       align: "center",
     },
     {
       title: "充电开始时间",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "start_time",
+      key: "start_time",
       align: "center",
     },
     {
       title: "充电结束时间",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "end_time",
+      key: "end_time",
       align: "center",
     },
     {
       title: "充电时长",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "duration",
+      key: "duration",
       align: "center",
     },
     {
@@ -86,34 +86,34 @@ function Charge() {
       align: "center",
       fixed: "right",
       width: 100,
-      render: (text, record, index) => {
-        return (
-          <>
-            <Button type="primary" onClick={() => openModal(index, record)}>
-              详情
-            </Button>
-          </>
-        )
+      // render: (text, record, index) => {
+      //   return (
+      //     <>
+      //       <Button type="primary" onClick={() => openModal(index, record)}>
+      //         详情
+      //       </Button>
+      //     </>
+      //   )
 
-      },
+      // },
     },
   ];
 
   const formSearch = [
     {
-      name: "phone",
+      name: "name",
       type: "Input",
       label: "充电站名称",
       placeholder: "请输入充电站名称",
     },
     {
-      name: "plate",
+      name: "order_id",
       type: "Input",
       label: "订单编号",
       placeholder: "请输入订单编号",
     },
     {
-      name: "timeStart",
+      name: "start_time",
       type: "DateRangePicker",
       label: "充电开始时间",
     },
@@ -127,10 +127,10 @@ function Charge() {
 
   // 检索
   const search = (params) => {
-    ajax.getParkingList(params).then((res) => {
+    ajax.recordsInquiry.getChargeList(params).then((res) => {
       if (res.status === 20000) {
-        setTableData(res.data.list);
-        setTotal(res.data.total);
+        setTableData(res.data);
+        setTotal(res.total);
       } else {
         message.error(res.message)
       }
diff --git a/src/pages/NewEnergy/RecordsInquiry/Violation/loadable.jsx b/src/pages/NewEnergy/RecordsInquiry/Violation/loadable.jsx
index d1fa6ae..206eb04 100644
--- a/src/pages/NewEnergy/RecordsInquiry/Violation/loadable.jsx
+++ b/src/pages/NewEnergy/RecordsInquiry/Violation/loadable.jsx
@@ -14,6 +14,8 @@ function Violation() {
   const [detailVisible, setDetailVisible] = useState(false);
   // 列表数据
   const [tableData, setTableData] = useState([]);
+  // 违规类型下拉
+  const [typeList, setTypeList] = useState([]);
   // 数据总数
   const [total, setTotal] = useState(0);
   // 详情数据
@@ -27,8 +29,8 @@ function Violation() {
   const columns = [
     {
       title: "用户手机号",
-      dataIndex: "operator",
-      key: "operator",
+      dataIndex: "phone",
+      key: "phone",
       align: "center",
     },
     {
@@ -39,20 +41,20 @@ function Violation() {
     },
     {
       title: "充电站",
-      dataIndex: "plate_color",
-      key: "plate_color",
+      dataIndex: "name",
+      key: "name",
       align: "center",
     },
     {
       title: "违规类型",
-      dataIndex: "berth_id",
-      key: "berth_id",
+      dataIndex: "type",
+      key: "type",
       align: "center",
     },
     {
       title: "记录创建时间",
-      dataIndex: "in_time",
-      key: "in_time",
+      dataIndex: "create_time",
+      key: "create_time",
       align: "center",
     },
     {
@@ -62,16 +64,16 @@ function Violation() {
       align: "center",
       fixed: "right",
       width: 100,
-      render: (text, record, index) => {
-        return (
-          <>
-            <Button type="primary" onClick={() => openModal(index, record)}>
-              详情
-            </Button>
-          </>
-        )
+      // render: (text, record, index) => {
+      //   return (
+      //     <>
+      //       <Button type="primary" onClick={() => openModal(index, record)}>
+      //         详情
+      //       </Button>
+      //     </>
+      //   )
 
-      },
+      // },
     },
   ];
 
@@ -89,25 +91,40 @@ function Violation() {
       placeholder: "请输入车牌号",
     },
     {
-      name: "charging",
+      name: "name",
       type: "Input",
       label: "充电站",
       placeholder: "请输入充电站",
     },
     {
-      name: "operator",
+      name: "type",
       type: "Select",
       label: "违规类型",
+      options: typeList,
       defaultValue: "0",
       placeholder: "请选择违规类型",
     },
     {
-      name: "timeStart",
+      name: "create_time",
       type: "DateRangePicker",
       label: "记录创建时间",
     },
   ];
 
+  // 获取站点状态下拉
+  const getSelect = () => {
+    ajax.recordsInquiry.getViolationSelect().then((res) => {
+      const { status, data } = res
+      if (status === 20000) {
+        if (data && data.length) {
+          setTypeList(data);
+        }
+      } else {
+        message.error(res.message)
+      }
+    });
+  }
+
   // 打开弹窗
   const openModal = (index, record) => {
     setDetailData(record)
@@ -116,10 +133,10 @@ function Violation() {
 
   // 检索
   const search = (params) => {
-    ajax.getParkingList(params).then((res) => {
+    ajax.recordsInquiry.getViolationList(params).then((res) => {
       if (res.status === 20000) {
-        setTableData(res.data.list);
-        setTotal(res.data.total);
+        setTableData(res.data);
+        setTotal(res.total);
       } else {
         message.error(res.message)
       }
@@ -130,6 +147,10 @@ function Violation() {
     setDetailVisible(true)
   }
 
+  useEffect(() => {
+    getSelect()
+  }, [])
+
 
 
   return (
@@ -137,14 +158,14 @@ function Violation() {
       <TableModule
         showSerial={true}
         isExport={false}
-        diyButton={
-          <Button
-            type="primary"
-            onClick={handelAdd}
-          >
-            新增
-          </Button>
-        }
+        // diyButton={
+        //   <Button
+        //     type="primary"
+        //     onClick={handelAdd}
+        //   >
+        //     新增
+        //   </Button>
+        // }
         columns={columns}
         tableData={tableData}
         formSearch={formSearch}
diff --git a/src/services/NewEnergy/recordsInquiry.js b/src/services/NewEnergy/recordsInquiry.js
index 0a9e6a3..ad7d276 100644
--- a/src/services/NewEnergy/recordsInquiry.js
+++ b/src/services/NewEnergy/recordsInquiry.js
@@ -9,8 +9,47 @@ const getUnlockingList = (params) => {
   });
 };
 
+// 预约记录查询
+const getAppointmentList = (params) => {
+  return ajax({
+    url: "/api/new_power/records/appointment_list",
+    type: "post",
+    data: params,
+  });
+};
+
+// 充电记录查询
+const getChargeList = (params) => {
+  return ajax({
+    url: "/api/new_power/records/charge_list",
+    type: "post",
+    data: params,
+  });
+};
+
+// 违规记录查询
+const getViolationList = (params) => {
+  return ajax({
+    url: "/api/new_power/records/violation_list",
+    type: "post",
+    data: params,
+  });
+};
+
+// 违规类型下拉
+const getViolationSelect = (params) => {
+  return ajax({
+    url: "/api/new_power/records/violation_select",
+    type: "get",
+    data: params,
+  });
+};
 
 
 export default {
     getUnlockingList,
+    getAppointmentList,
+    getChargeList,
+    getViolationList,
+    getViolationSelect
 }
\ No newline at end of file
diff --git a/src/services/index.js b/src/services/index.js
index aeceee3..abcce60 100644
--- a/src/services/index.js
+++ b/src/services/index.js
@@ -23,11 +23,7 @@ import FinancialMgm from "./FinancialMgm";
 import DataAnalysisPrediction from "./DataAnalysisPrediction";
 import ParkingOverview from "./ParkingOverview";
 import OffPeak from "./OffPeak";
-<<<<<<< Updated upstream
 import NewEnergy from "./NewEnergy";
-=======
-import NewEnergy from "./NewEnergy"
->>>>>>> Stashed changes
 const api = {};
 export default {
   ...api,