From 6c363abce1ab6d05b90e16100bb07c9c6639c77c Mon Sep 17 00:00:00 2001
From: zhugy <zhugy@yisa.com>
Date: Mon, 15 Jan 2024 15:14:22 +0800
Subject: [PATCH] =?UTF-8?q?feat():=E6=9F=A5=E8=AF=A2=E8=AE=B0=E5=BD=95?=
 =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=96=B0=E5=A2=9E=E9=A1=B5=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../NewEnergy/RecordsInquiry/Appointment/index.jsx |   6 +
 .../RecordsInquiry/Appointment/index.scss          | 238 +++++++++++++++++++++
 .../RecordsInquiry/Appointment/loadable.jsx        | 231 ++++++++++++++++++++
 .../RecordsInquiry/AppointmentRecord/index.jsx     |   6 -
 .../RecordsInquiry/AppointmentRecord/index.scss    | 238 ---------------------
 .../RecordsInquiry/AppointmentRecord/loadable.jsx  | 173 ---------------
 .../NewEnergy/RecordsInquiry/Charge/index.jsx      |   6 +
 .../NewEnergy/RecordsInquiry/Charge/index.scss     | 238 +++++++++++++++++++++
 .../NewEnergy/RecordsInquiry/Charge/loadable.jsx   | 231 ++++++++++++++++++++
 .../NewEnergy/RecordsInquiry/Violation/index.jsx   |   6 +
 .../NewEnergy/RecordsInquiry/Violation/index.scss  | 238 +++++++++++++++++++++
 .../RecordsInquiry/Violation/loadable.jsx          | 231 ++++++++++++++++++++
 src/pages/NewEnergy/RecordsInquiry/index.jsx       |   8 +-
 src/router/router.config.js                        |  18 +-
 14 files changed, 1446 insertions(+), 422 deletions(-)
 create mode 100644 src/pages/NewEnergy/RecordsInquiry/Appointment/index.jsx
 create mode 100644 src/pages/NewEnergy/RecordsInquiry/Appointment/index.scss
 create mode 100644 src/pages/NewEnergy/RecordsInquiry/Appointment/loadable.jsx
 delete mode 100644 src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/index.jsx
 delete mode 100644 src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/index.scss
 delete mode 100644 src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/loadable.jsx
 create mode 100644 src/pages/NewEnergy/RecordsInquiry/Charge/index.jsx
 create mode 100644 src/pages/NewEnergy/RecordsInquiry/Charge/index.scss
 create mode 100644 src/pages/NewEnergy/RecordsInquiry/Charge/loadable.jsx
 create mode 100644 src/pages/NewEnergy/RecordsInquiry/Violation/index.jsx
 create mode 100644 src/pages/NewEnergy/RecordsInquiry/Violation/index.scss
 create mode 100644 src/pages/NewEnergy/RecordsInquiry/Violation/loadable.jsx

diff --git a/src/pages/NewEnergy/RecordsInquiry/Appointment/index.jsx b/src/pages/NewEnergy/RecordsInquiry/Appointment/index.jsx
new file mode 100644
index 0000000..d1dc1c2
--- /dev/null
+++ b/src/pages/NewEnergy/RecordsInquiry/Appointment/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/RecordsInquiry/Appointment/index.scss b/src/pages/NewEnergy/RecordsInquiry/Appointment/index.scss
new file mode 100644
index 0000000..9a8202a
--- /dev/null
+++ b/src/pages/NewEnergy/RecordsInquiry/Appointment/index.scss
@@ -0,0 +1,238 @@
+@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
new file mode 100644
index 0000000..febe305
--- /dev/null
+++ b/src/pages/NewEnergy/RecordsInquiry/Appointment/loadable.jsx
@@ -0,0 +1,231 @@
+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() {
+  // 详情弹窗
+  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 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",
+      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: "顶动感实收金额",
+      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: "phone",
+      type: "Input",
+      label: "用户手机号",
+      placeholder: "请输入用户手机号",
+    },
+    {
+      name: "plate",
+      type: "Input",
+      label: "车牌号",
+      placeholder: "请输入车牌号",
+    },
+    {
+      name: "charging",
+      type: "Input",
+      label: "充电站",
+      placeholder: "请输入充电站",
+    },
+    {
+      name: "operator",
+      type: "Select",
+      label: "商户名称",
+      defaultValue: "0",
+      placeholder: "请选择商户名称",
+    },
+    {
+      name: "timeStart",
+      type: "DateRangePicker",
+      label: "预约开始时间",
+    },
+    {
+      name: "timeEnd",
+      type: "DateRangePicker",
+      label: "订单完结时间",
+    },
+  ];
+
+  // 打开弹窗
+  const openModal = (index, record) => {
+    setDetailData(record)
+    setDetailVisible(true);
+  }
+
+  // 检索
+  const search = (params) => {
+    ajax.getParkingList(params).then((res) => {
+      if (res.status === 20000) {
+        setTableData(res.data.list);
+        setTotal(res.data.total);
+      } else {
+        message.error(res.message)
+      }
+    });
+  }
+
+  const handelAdd = () => {
+    setDetailVisible(true)
+  }
+
+  return (
+    <>
+      <TableModule
+        showSerial={true}
+        isExport={false}
+        diyButton={
+          <Button
+            type="primary"
+            onClick={handelAdd}
+          >
+            新增
+          </Button>
+        }
+        columns={columns}
+        tableData={tableData}
+        formSearch={formSearch}
+        pagename="预约订单"
+        pageName={'Appointment'}
+        initFormData={initFormData}
+        total={total}
+        search={search}
+        exportUrl="/api/bpm/record/get_record_export"
+      />
+      <Modal
+        open={detailVisible}
+        width={800}
+        className="totalModal"
+        onCancel={() => {
+          setDetailVisible(false);
+        }}
+        destroyOnClose
+      >
+
+      </Modal>
+    </>
+  );
+}
+
+export default Appointment;
diff --git a/src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/index.jsx b/src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/index.jsx
deleted file mode 100644
index d0d293b..0000000
--- a/src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/index.jsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import React from "react"
-import loadable from "@loadable/component"
-import { LoadingImg } from "@/components"
-
-const AppointmentRecord = loadable(() => import("./loadable"))
-export default (pros) => <AppointmentRecord {...pros} fallback={<LoadingImg />} />
\ No newline at end of file
diff --git a/src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/index.scss b/src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/index.scss
deleted file mode 100644
index 9a8202a..0000000
--- a/src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/index.scss
+++ /dev/null
@@ -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/AppointmentRecord/loadable.jsx b/src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/loadable.jsx
deleted file mode 100644
index f26357d..0000000
--- a/src/pages/NewEnergy/RecordsInquiry/AppointmentRecord/loadable.jsx
+++ /dev/null
@@ -1,173 +0,0 @@
-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 AppointmentRecord() {
-  // 详情弹窗
-  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 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 search = (params) => {
-    ajax.getParkingList(params).then((res) => {
-      if (res.status === 20000) {
-        setTableData(res.data.list);
-        setTotal(res.data.total);
-      } else {
-        message.error(res.message)
-      }
-    });
-  }
-
-  const handelAdd = () => {
-    setDetailVisible(true)
-  }
-
-  return (
-    <>
-      <TableModule
-        showSerial={true}
-        isExport={false}
-        diyButton={
-          <Button
-            type="primary"
-            onClick={handelAdd}
-          >
-            新增
-          </Button>
-        }
-        columns={columns}
-        tableData={tableData}
-        formSearch={formSearch}
-        pagename="停车记录查询"
-        pageName={'AppointmentRecord'}
-        initFormData={initFormData}
-        total={total}
-        search={search}
-        exportUrl="/api/bpm/record/get_record_export"
-      />
-      <Modal
-        open={detailVisible}
-        width={1500}
-        className="totalModal"
-        onCancel={() => {
-          setDetailVisible(false);
-        }}
-        destroyOnClose
-      >
-
-      </Modal>
-    </>
-  );
-}
-
-export default AppointmentRecord;
diff --git a/src/pages/NewEnergy/RecordsInquiry/Charge/index.jsx b/src/pages/NewEnergy/RecordsInquiry/Charge/index.jsx
new file mode 100644
index 0000000..fe31772
--- /dev/null
+++ b/src/pages/NewEnergy/RecordsInquiry/Charge/index.jsx
@@ -0,0 +1,6 @@
+import React from "react"
+import loadable from "@loadable/component"
+import { LoadingImg } from "@/components"
+
+const Charge = loadable(() => import("./loadable"))
+export default (pros) => <Charge {...pros} fallback={<LoadingImg />} />
\ No newline at end of file
diff --git a/src/pages/NewEnergy/RecordsInquiry/Charge/index.scss b/src/pages/NewEnergy/RecordsInquiry/Charge/index.scss
new file mode 100644
index 0000000..9a8202a
--- /dev/null
+++ b/src/pages/NewEnergy/RecordsInquiry/Charge/index.scss
@@ -0,0 +1,238 @@
+@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
new file mode 100644
index 0000000..50650f2
--- /dev/null
+++ b/src/pages/NewEnergy/RecordsInquiry/Charge/loadable.jsx
@@ -0,0 +1,231 @@
+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() {
+  // 详情弹窗
+  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 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",
+      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: "顶动感实收金额",
+      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: "phone",
+      type: "Input",
+      label: "用户手机号",
+      placeholder: "请输入用户手机号",
+    },
+    {
+      name: "plate",
+      type: "Input",
+      label: "车牌号",
+      placeholder: "请输入车牌号",
+    },
+    {
+      name: "charging",
+      type: "Input",
+      label: "充电站",
+      placeholder: "请输入充电站",
+    },
+    {
+      name: "operator",
+      type: "Select",
+      label: "商户名称",
+      defaultValue: "0",
+      placeholder: "请选择商户名称",
+    },
+    {
+      name: "timeStart",
+      type: "DateRangePicker",
+      label: "预约开始时间",
+    },
+    {
+      name: "timeEnd",
+      type: "DateRangePicker",
+      label: "订单完结时间",
+    },
+  ];
+
+  // 打开弹窗
+  const openModal = (index, record) => {
+    setDetailData(record)
+    setDetailVisible(true);
+  }
+
+  // 检索
+  const search = (params) => {
+    ajax.getParkingList(params).then((res) => {
+      if (res.status === 20000) {
+        setTableData(res.data.list);
+        setTotal(res.data.total);
+      } else {
+        message.error(res.message)
+      }
+    });
+  }
+
+  const handelAdd = () => {
+    setDetailVisible(true)
+  }
+
+  return (
+    <>
+      <TableModule
+        showSerial={true}
+        isExport={false}
+        diyButton={
+          <Button
+            type="primary"
+            onClick={handelAdd}
+          >
+            新增
+          </Button>
+        }
+        columns={columns}
+        tableData={tableData}
+        formSearch={formSearch}
+        pagename="预约订单"
+        pageName={'Appointment'}
+        initFormData={initFormData}
+        total={total}
+        search={search}
+        exportUrl="/api/bpm/record/get_record_export"
+      />
+      <Modal
+        open={detailVisible}
+        width={800}
+        className="totalModal"
+        onCancel={() => {
+          setDetailVisible(false);
+        }}
+        destroyOnClose
+      >
+
+      </Modal>
+    </>
+  );
+}
+
+export default Charge;
diff --git a/src/pages/NewEnergy/RecordsInquiry/Violation/index.jsx b/src/pages/NewEnergy/RecordsInquiry/Violation/index.jsx
new file mode 100644
index 0000000..729bec2
--- /dev/null
+++ b/src/pages/NewEnergy/RecordsInquiry/Violation/index.jsx
@@ -0,0 +1,6 @@
+import React from "react"
+import loadable from "@loadable/component"
+import { LoadingImg } from "@/components"
+
+const Violation = loadable(() => import("./loadable"))
+export default (pros) => <Violation {...pros} fallback={<LoadingImg />} />
\ No newline at end of file
diff --git a/src/pages/NewEnergy/RecordsInquiry/Violation/index.scss b/src/pages/NewEnergy/RecordsInquiry/Violation/index.scss
new file mode 100644
index 0000000..9a8202a
--- /dev/null
+++ b/src/pages/NewEnergy/RecordsInquiry/Violation/index.scss
@@ -0,0 +1,238 @@
+@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
new file mode 100644
index 0000000..1e7a33b
--- /dev/null
+++ b/src/pages/NewEnergy/RecordsInquiry/Violation/loadable.jsx
@@ -0,0 +1,231 @@
+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() {
+  // 详情弹窗
+  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 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",
+      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: "顶动感实收金额",
+      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: "phone",
+      type: "Input",
+      label: "用户手机号",
+      placeholder: "请输入用户手机号",
+    },
+    {
+      name: "plate",
+      type: "Input",
+      label: "车牌号",
+      placeholder: "请输入车牌号",
+    },
+    {
+      name: "charging",
+      type: "Input",
+      label: "充电站",
+      placeholder: "请输入充电站",
+    },
+    {
+      name: "operator",
+      type: "Select",
+      label: "商户名称",
+      defaultValue: "0",
+      placeholder: "请选择商户名称",
+    },
+    {
+      name: "timeStart",
+      type: "DateRangePicker",
+      label: "预约开始时间",
+    },
+    {
+      name: "timeEnd",
+      type: "DateRangePicker",
+      label: "订单完结时间",
+    },
+  ];
+
+  // 打开弹窗
+  const openModal = (index, record) => {
+    setDetailData(record)
+    setDetailVisible(true);
+  }
+
+  // 检索
+  const search = (params) => {
+    ajax.getParkingList(params).then((res) => {
+      if (res.status === 20000) {
+        setTableData(res.data.list);
+        setTotal(res.data.total);
+      } else {
+        message.error(res.message)
+      }
+    });
+  }
+
+  const handelAdd = () => {
+    setDetailVisible(true)
+  }
+
+  return (
+    <>
+      <TableModule
+        showSerial={true}
+        isExport={false}
+        diyButton={
+          <Button
+            type="primary"
+            onClick={handelAdd}
+          >
+            新增
+          </Button>
+        }
+        columns={columns}
+        tableData={tableData}
+        formSearch={formSearch}
+        pagename="预约订单"
+        pageName={'Appointment'}
+        initFormData={initFormData}
+        total={total}
+        search={search}
+        exportUrl="/api/bpm/record/get_record_export"
+      />
+      <Modal
+        open={detailVisible}
+        width={800}
+        className="totalModal"
+        onCancel={() => {
+          setDetailVisible(false);
+        }}
+        destroyOnClose
+      >
+
+      </Modal>
+    </>
+  );
+}
+
+export default Violation;
diff --git a/src/pages/NewEnergy/RecordsInquiry/index.jsx b/src/pages/NewEnergy/RecordsInquiry/index.jsx
index 0f30296..ddd88f3 100644
--- a/src/pages/NewEnergy/RecordsInquiry/index.jsx
+++ b/src/pages/NewEnergy/RecordsInquiry/index.jsx
@@ -1,5 +1,9 @@
-import AppointmentRecord from './AppointmentRecord'
+import Appointment from './Appointment'
+import Charge from './Charge'
+import Violation from './Violation'
 
 export default {
-  AppointmentRecord
+  Appointment,
+  Charge,
+  Violation
 }
\ No newline at end of file
diff --git a/src/router/router.config.js b/src/router/router.config.js
index cccf040..a25520a 100644
--- a/src/router/router.config.js
+++ b/src/router/router.config.js
@@ -1337,10 +1337,22 @@ let routes = [
         component: pages.OrderRuleMgm,
       },
       {
-        path: "/newEnergy/appointmentRecord",
+        path: "/newEnergy/charge",
+        text: "充电订单",
+        name: "charge",
+        component: pages.Charge,
+      },
+      {
+        path: "/newEnergy/appointment",
         text: "预约记录",
-        name: "appointmentRecord",
-        component: pages.AppointmentRecord,
+        name: "appointment",
+        component: pages.Appointment,
+      },
+      {
+        path: "/newEnergy/violation",
+        text: "违规记录",
+        name: "violation",
+        component: pages.Violation,
       },
       {
         path: "/newEnergy/chargerMonitor",