Browse Source

修改新页面

fengxiang 2 years ago
parent
commit
714c0c2255
73 changed files with 5004 additions and 210 deletions
  1. 1 1
      .env.production
  2. 16 0
      src/components/delete.jsx
  3. 40 4
      src/index.jsx
  4. 122 0
      src/pages/MaintenanceStatisticsChild/maintenanceStatistics/components/modal.jsx
  5. 9 0
      src/pages/MaintenanceStatisticsChild/maintenanceStatistics/components/modal.scss
  6. 118 0
      src/pages/MaintenanceStatisticsChild/maintenanceStatistics/maintenanceStatistics.jsx
  7. 26 0
      src/pages/MaintenanceStatisticsChild/maintenanceStatistics/maintenanceStatistics.scss
  8. 118 0
      src/pages/MaintenanceStatisticsChild/vehiclesTotalNumber/components/modal.jsx
  9. 9 0
      src/pages/MaintenanceStatisticsChild/vehiclesTotalNumber/components/modal.scss
  10. 118 0
      src/pages/MaintenanceStatisticsChild/vehiclesTotalNumber/vehiclesTotalNumber.jsx
  11. 26 0
      src/pages/MaintenanceStatisticsChild/vehiclesTotalNumber/vehiclesTotalNumber.scss
  12. 136 40
      src/pages/home/home.jsx
  13. 15 14
      src/pages/linePageChild/basicInfomationOfTheLine/basicInfomationOfTheLine.jsx
  14. 42 121
      src/pages/linePageChild/lineDispatch/components/modal.jsx
  15. 61 26
      src/pages/linePageChild/lineDispatch/lineDispatch.jsx
  16. 128 0
      src/pages/linePageChild/numberOfDrivers/components/modal.jsx
  17. 9 0
      src/pages/linePageChild/numberOfDrivers/components/modal.scss
  18. 160 0
      src/pages/linePageChild/numberOfDrivers/numberOfDrivers.jsx
  19. 31 0
      src/pages/linePageChild/numberOfDrivers/numberOfDrivers.scss
  20. 128 0
      src/pages/linePageChild/numberOfTransit/components/modal.jsx
  21. 9 0
      src/pages/linePageChild/numberOfTransit/components/modal.scss
  22. 158 0
      src/pages/linePageChild/numberOfTransit/numberOfTransit.jsx
  23. 31 0
      src/pages/linePageChild/numberOfTransit/numberOfTransit.scss
  24. 113 0
      src/pages/linePageChild/passengerType/components/modal.jsx
  25. 9 0
      src/pages/linePageChild/passengerType/components/modal.scss
  26. 114 0
      src/pages/linePageChild/passengerType/passengerType.jsx
  27. 26 0
      src/pages/linePageChild/passengerType/passengerType.scss
  28. 171 0
      src/pages/linePageChild/summaryData/components/modal.jsx
  29. 9 0
      src/pages/linePageChild/summaryData/components/modal.scss
  30. 117 0
      src/pages/linePageChild/summaryData/summaryData.jsx
  31. 26 0
      src/pages/linePageChild/summaryData/summaryData.scss
  32. 154 0
      src/pages/linePageChild/vehicleMonitoring/components/modal.jsx
  33. 9 0
      src/pages/linePageChild/vehicleMonitoring/components/modal.scss
  34. 121 0
      src/pages/linePageChild/vehicleMonitoring/vehicleMonitoring.jsx
  35. 26 0
      src/pages/linePageChild/vehicleMonitoring/vehicleMonitoring.scss
  36. 212 0
      src/pages/linePageChild/vehicleStatus/components/modal.jsx
  37. 9 0
      src/pages/linePageChild/vehicleStatus/components/modal.scss
  38. 120 0
      src/pages/linePageChild/vehicleStatus/vehicleStatus.jsx
  39. 26 0
      src/pages/linePageChild/vehicleStatus/vehicleStatus.scss
  40. 118 0
      src/pages/passengerFlowAnalysis/commutingTime/commutingTime.jsx
  41. 26 0
      src/pages/passengerFlowAnalysis/commutingTime/commutingTime.scss
  42. 118 0
      src/pages/passengerFlowAnalysis/commutingTime/components/modal.jsx
  43. 9 0
      src/pages/passengerFlowAnalysis/commutingTime/components/modal.scss
  44. 118 0
      src/pages/passengerFlowAnalysis/consumptionType/components/modal.jsx
  45. 9 0
      src/pages/passengerFlowAnalysis/consumptionType/components/modal.scss
  46. 118 0
      src/pages/passengerFlowAnalysis/consumptionType/consumptionType.jsx
  47. 26 0
      src/pages/passengerFlowAnalysis/consumptionType/consumptionType.scss
  48. 118 0
      src/pages/passengerFlowAnalysis/distribution/components/modal.jsx
  49. 9 0
      src/pages/passengerFlowAnalysis/distribution/components/modal.scss
  50. 118 0
      src/pages/passengerFlowAnalysis/distribution/distribution.jsx
  51. 26 0
      src/pages/passengerFlowAnalysis/distribution/distribution.scss
  52. 117 0
      src/pages/passengerFlowAnalysis/passengerFlowRoutes/components/modal.jsx
  53. 9 0
      src/pages/passengerFlowAnalysis/passengerFlowRoutes/components/modal.scss
  54. 116 0
      src/pages/passengerFlowAnalysis/passengerFlowRoutes/passengerFlowRoutes.jsx
  55. 26 0
      src/pages/passengerFlowAnalysis/passengerFlowRoutes/passengerFlowRoutes.scss
  56. 154 0
      src/pages/passengerFlowAnalysis/passengerInfomation/components/modal.jsx
  57. 9 0
      src/pages/passengerFlowAnalysis/passengerInfomation/components/modal.scss
  58. 119 0
      src/pages/passengerFlowAnalysis/passengerInfomation/passengerInfomation.jsx
  59. 26 0
      src/pages/passengerFlowAnalysis/passengerInfomation/passengerInfomation.scss
  60. 123 0
      src/pages/passengerFlowAnalysis/rankingOfPassengerVolume/components/modal.jsx
  61. 9 0
      src/pages/passengerFlowAnalysis/rankingOfPassengerVolume/components/modal.scss
  62. 139 0
      src/pages/passengerFlowAnalysis/rankingOfPassengerVolume/rankingOfPassengerVolume.jsx
  63. 26 0
      src/pages/passengerFlowAnalysis/rankingOfPassengerVolume/rankingOfPassengerVolume.scss
  64. 118 0
      src/pages/passengerFlowAnalysis/regionalPassengerFlow/components/modal.jsx
  65. 9 0
      src/pages/passengerFlowAnalysis/regionalPassengerFlow/components/modal.scss
  66. 118 0
      src/pages/passengerFlowAnalysis/regionalPassengerFlow/regionalPassengerFlow.jsx
  67. 26 0
      src/pages/passengerFlowAnalysis/regionalPassengerFlow/regionalPassengerFlow.scss
  68. 117 0
      src/pages/passengerFlowAnalysis/replacementFrequency/components/modal.jsx
  69. 9 0
      src/pages/passengerFlowAnalysis/replacementFrequency/components/modal.scss
  70. 118 0
      src/pages/passengerFlowAnalysis/replacementFrequency/replacementFrequency.jsx
  71. 26 0
      src/pages/passengerFlowAnalysis/replacementFrequency/replacementFrequency.scss
  72. 2 2
      src/pages/settingPageChild/user/user.jsx
  73. 2 2
      src/utils/axios.js

+ 1 - 1
.env.production

@@ -1 +1 @@
-VITE_SERVER_URL=https://192.168.204.65:9001/api/v1/
+VITE_SERVER_URL=http://47.122.23.74:9091/api/

+ 16 - 0
src/components/delete.jsx

@@ -0,0 +1,16 @@
+import {Button} from "antd";
+import axios from "@/utils/axios.js";
+
+export default function DeleteButton({url, id, getData}) {
+    async function removeItem() {
+        console.log(url)
+        let {code} = await axios.get(url, {params: {id}})
+        if (code === 200) {
+            getData()
+        }
+    }
+
+    return (
+        <Button type='primary' danger onClick={removeItem}>删除</Button>
+    )
+}

+ 40 - 4
src/index.jsx

@@ -2,7 +2,7 @@ import React from "react";
 import ReactDOM from "react-dom/client";
 import ReactDOM from "react-dom/client";
 import Login from "./pages/login/login.jsx";
 import Login from "./pages/login/login.jsx";
 import Home from "./pages/home/home.jsx";
 import Home from "./pages/home/home.jsx";
-import {BrowserRouter, Routes, Route, Navigate} from "react-router-dom";
+import {HashRouter, Navigate, Route, Routes} from "react-router-dom";
 import {Provider} from 'react-redux'
 import {Provider} from 'react-redux'
 import '../src/assets/css/clear.css'
 import '../src/assets/css/clear.css'
 import store from './store/index.js'
 import store from './store/index.js'
@@ -23,6 +23,23 @@ import ClassPunctualitRate from "@/pages/homePageChild/classPunctualitRate/class
 import CarCompletionRate from "@/pages/homePageChild/carCompletionRate/carCompletionRate.jsx";
 import CarCompletionRate from "@/pages/homePageChild/carCompletionRate/carCompletionRate.jsx";
 import BasicInfomationOfTheLine from "@/pages/linePageChild/basicInfomationOfTheLine/basicInfomationOfTheLine.jsx";
 import BasicInfomationOfTheLine from "@/pages/linePageChild/basicInfomationOfTheLine/basicInfomationOfTheLine.jsx";
 import LineDispatch from "@/pages/linePageChild/lineDispatch/lineDispatch.jsx";
 import LineDispatch from "@/pages/linePageChild/lineDispatch/lineDispatch.jsx";
+import PassengerType from "@/pages/linePageChild/passengerType/passengerType.jsx";
+import SummaryData from "@/pages/linePageChild/summaryData/summaryData.jsx";
+import NumberOfDrivers from "@/pages/linePageChild/numberOfDrivers/numberOfDrivers.jsx";
+import NumberOfTransit from "@/pages/linePageChild/numberOfTransit/numberOfTransit.jsx";
+import VehicleMonitoring from "@/pages/linePageChild/vehicleMonitoring/vehicleMonitoring.jsx";
+import VehicleStatus from "@/pages/linePageChild/vehicleStatus/vehicleStatus.jsx";
+import PassengerInfomation from "@/pages/passengerFlowAnalysis/passengerInfomation/passengerInfomation.jsx";
+import RegionalPassengerFlow from "@/pages/passengerFlowAnalysis/regionalPassengerFlow/regionalPassengerFlow.jsx";
+import CommutingTime from "@/pages/passengerFlowAnalysis/commutingTime/commutingTime.jsx";
+import ConsumptionType from "@/pages/passengerFlowAnalysis/consumptionType/consumptionType.jsx";
+import Distribution from "@/pages/passengerFlowAnalysis/distribution/distribution.jsx";
+import ReplacementFrequency from "@/pages/passengerFlowAnalysis/replacementFrequency/replacementFrequency.jsx";
+import PassengerFlowRoutes from "@/pages/passengerFlowAnalysis/passengerFlowRoutes/passengerFlowRoutes.jsx";
+import RankingOfPassengerVolume
+    from "@/pages/passengerFlowAnalysis/rankingOfPassengerVolume/rankingOfPassengerVolume.jsx";
+import VehiclesTotalNumber from "@/pages/MaintenanceStatisticsChild/vehiclesTotalNumber/vehiclesTotalNumber.jsx";
+import MaintenanceStatistics from "@/pages/MaintenanceStatisticsChild/maintenanceStatistics/maintenanceStatistics.jsx";
 
 
 
 
 ReactDOM.createRoot(document.getElementById("root")).render(
 ReactDOM.createRoot(document.getElementById("root")).render(
@@ -30,7 +47,7 @@ ReactDOM.createRoot(document.getElementById("root")).render(
 
 
         <React.StrictMode>
         <React.StrictMode>
             <ConfigProvider locale={zhCN}>
             <ConfigProvider locale={zhCN}>
-                <BrowserRouter>
+                <HashRouter>
                     <Routes>
                     <Routes>
                         <Route path="/login" element={<Login></Login>}></Route>
                         <Route path="/login" element={<Login></Login>}></Route>
                         <Route path="/" element={<Home></Home>}>
                         <Route path="/" element={<Home></Home>}>
@@ -52,13 +69,32 @@ ReactDOM.createRoot(document.getElementById("root")).render(
                                    element={<ClassPunctualitRate></ClassPunctualitRate>}></Route>
                                    element={<ClassPunctualitRate></ClassPunctualitRate>}></Route>
                             <Route path="carCompletionRate" element={<CarCompletionRate></CarCompletionRate>}></Route>
                             <Route path="carCompletionRate" element={<CarCompletionRate></CarCompletionRate>}></Route>
                             {/*    线路运营路由*/}
                             {/*    线路运营路由*/}
-                            <Route path="basicInfomationOfTheLine" element={<BasicInfomationOfTheLine></BasicInfomationOfTheLine>}></Route>
+                            <Route path="basicInfomationOfTheLine"
+                                   element={<BasicInfomationOfTheLine></BasicInfomationOfTheLine>}></Route>
                             <Route path="lineDispatch" element={<LineDispatch></LineDispatch>}></Route>
                             <Route path="lineDispatch" element={<LineDispatch></LineDispatch>}></Route>
+                            <Route path="passengerType" element={<PassengerType></PassengerType>}></Route>
+                            <Route path="summaryData" element={<SummaryData></SummaryData>}></Route>
+                            <Route path="numberOfDrivers" element={<NumberOfDrivers></NumberOfDrivers>}></Route>
+                            <Route path="numberOfTransit" element={<NumberOfTransit></NumberOfTransit>}></Route>
+                            <Route path="vehicleMonitoring" element={<VehicleMonitoring></VehicleMonitoring>}></Route>
+                            <Route path="vehicleStatus" element={<VehicleStatus></VehicleStatus>}></Route>
+                            {/*    客流分析*/}
+                            <Route path='passengerInfomation' element={<PassengerInfomation/>}></Route>
+                            <Route path='regionalPassengerFlow' element={<RegionalPassengerFlow/>}></Route>
+                            <Route path='commutingTime' element={<CommutingTime/>}></Route>
+                            <Route path='consumptionType' element={<ConsumptionType/>}></Route>
+                            <Route path='distribution' element={<Distribution/>}></Route>
+                            <Route path='replacementFrequency' element={<ReplacementFrequency/>}></Route>
+                            <Route path='passengerFlowRoutes' element={<PassengerFlowRoutes/>}></Route>
+                            <Route path='rankingOfPassengerVolume' element={<RankingOfPassengerVolume/>}></Route>
+                            {/*    维保动态*/}
+                            <Route path='vehiclesTotalNumber' element={<VehiclesTotalNumber/>}></Route>
+                            <Route path='maintenanceStatistics' element={<MaintenanceStatistics/>}></Route>
                         </Route>
                         </Route>
                         {/**这里重定向到home页面 */}
                         {/**这里重定向到home页面 */}
                         <Route path="*" element={<Navigate to="/statisticsData" replace/>}></Route>
                         <Route path="*" element={<Navigate to="/statisticsData" replace/>}></Route>
                     </Routes>
                     </Routes>
-                </BrowserRouter>
+                </HashRouter>
             </ConfigProvider>
             </ConfigProvider>
         </React.StrictMode>
         </React.StrictMode>
     </Provider>
     </Provider>

+ 122 - 0
src/pages/MaintenanceStatisticsChild/maintenanceStatistics/components/modal.jsx

@@ -0,0 +1,122 @@
+import {DatePicker, Form, InputNumber, message, Modal,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+import dayjs from "dayjs";
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            formData.time = dayjs(formData.time).format('YYYY-MM')
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/maintenanceEdit/editMaintenanceStatistics', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            formData.time = dayjs(formData.time, 'YYYY-MM')
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="维修时间"
+                        name="time"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                                type: "object"
+                            },
+                        ]}
+
+                    >
+                        <DatePicker picker="month" format="YYYY-MM"/>
+                    </Form.Item>
+                    <Form.Item
+                        label="维修车次"
+                        name="carNumber"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/MaintenanceStatisticsChild/maintenanceStatistics/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 118 - 0
src/pages/MaintenanceStatisticsChild/maintenanceStatistics/maintenanceStatistics.jsx

@@ -0,0 +1,118 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./maintenanceStatistics.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function MaintenanceStatistics() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/maintenance/getMaintenanceStatistics");
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增维修保养
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="时间" dataIndex="time" key="id"></Column>
+                <Column title="维修车次" dataIndex="carNumber" key="id"></Column>
+
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/maintenanceEdit/delMaintenanceStatistics' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/MaintenanceStatisticsChild/maintenanceStatistics/maintenanceStatistics.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 118 - 0
src/pages/MaintenanceStatisticsChild/vehiclesTotalNumber/components/modal.jsx

@@ -0,0 +1,118 @@
+import {Form, Input, InputNumber, message, Modal,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/trafficAnalysisEdit/editTrafficCommutingTime', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="通勤时间类型"
+                        name="commutingType"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Input style={{width: '100%'}}></Input>
+                    </Form.Item>
+                    <Form.Item
+                        label="人次(万人)"
+                        name="number"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/MaintenanceStatisticsChild/vehiclesTotalNumber/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 118 - 0
src/pages/MaintenanceStatisticsChild/vehiclesTotalNumber/vehiclesTotalNumber.jsx

@@ -0,0 +1,118 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./vehiclesTotalNumber.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function VehiclesTotalNumber() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/trafficAnalysis/getTrafficCommutingTime");
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增通勤时间
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="区域" dataIndex="commutingType" key="id"></Column>
+                <Column title="人次(万人)" dataIndex="number" key="id"></Column>
+
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/trafficAnalysisEdit/delTrafficCommutingTime' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/MaintenanceStatisticsChild/vehiclesTotalNumber/vehiclesTotalNumber.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 136 - 40
src/pages/home/home.jsx

@@ -1,73 +1,73 @@
 import "./home.scss";
 import "./home.scss";
-import {Menu, Avatar, Popconfirm} from 'antd';
-import {useState,useEffect} from "react";
-import {DesktopOutlined, SettingOutlined, UserOutlined,FileDoneOutlined,AreaChartOutlined} from '@ant-design/icons';
-import {Outlet, useNavigate,useLocation} from 'react-router-dom';
+import {Avatar, Menu, Popconfirm} from 'antd';
+import {useEffect, useState} from "react";
+import {AreaChartOutlined, DesktopOutlined, FileDoneOutlined, SettingOutlined, UserOutlined} from '@ant-design/icons';
+import {Outlet, useLocation, useNavigate} from 'react-router-dom';
 import axios from "@/utils/axios.js";
 import axios from "@/utils/axios.js";
-import {  useDispatch } from 'react-redux';
-import {  setDictData } from '@/store/reducer.js';
+import {useDispatch} from 'react-redux';
+import {setDictData} from '@/store/reducer.js';
+
 export default function Home() {
 export default function Home() {
     const navagate = useNavigate()
     const navagate = useNavigate()
     const [current, setCurrent] = useState('mail')
     const [current, setCurrent] = useState('mail')
 
 
 
 
-
     // 菜单数据
     // 菜单数据
     const items = [
     const items = [
         {
         {
             label: '首页配置',
             label: '首页配置',
             key: 'basicInfomation',
             key: 'basicInfomation',
-            icon: <DesktopOutlined />,
-            children:[
+            icon: <DesktopOutlined/>,
+            children: [
                 {
                 {
                     label: '汇总统计数据',
                     label: '汇总统计数据',
                     key: 'statisticsData',
                     key: 'statisticsData',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 },
                 },
                 {
                 {
                     label: '消费占比',
                     label: '消费占比',
                     key: 'consumptionProportion',
                     key: 'consumptionProportion',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 },
                 },
                 {
                 {
                     label: '客流排名',
                     label: '客流排名',
                     key: 'flowRanking',
                     key: 'flowRanking',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 },
                 },
                 {
                 {
                     label: '线路客流排名',
                     label: '线路客流排名',
                     key: 'lineFlowRanking',
                     key: 'lineFlowRanking',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 },
                 },
                 {
                 {
                     label: '舆情统计数据',
                     label: '舆情统计数据',
                     key: 'publicOpinion',
                     key: 'publicOpinion',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 },
                 },
                 {
                 {
                     label: '站场设备统计',
                     label: '站场设备统计',
                     key: 'stationEquipment',
                     key: 'stationEquipment',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 },
                 },
                 {
                 {
                     label: '客运量数据',
                     label: '客运量数据',
                     key: 'passengerVolumeData',
                     key: 'passengerVolumeData',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 },
                 },
                 {
                 {
                     label: '班次完成率',
                     label: '班次完成率',
                     key: 'classCompletionRate',
                     key: 'classCompletionRate',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 },
                 },
                 {
                 {
                     label: '班次准点率',
                     label: '班次准点率',
                     key: 'classPunctualitRate',
                     key: 'classPunctualitRate',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 },
                 },
                 {
                 {
                     label: '发车准点率',
                     label: '发车准点率',
                     key: 'carCompletionRate',
                     key: 'carCompletionRate',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 }
                 }
             ]
             ]
         },
         },
@@ -79,15 +79,106 @@ export default function Home() {
                 {
                 {
                     label: '线路基本情况',
                     label: '线路基本情况',
                     key: 'basicInfomationOfTheLine',
                     key: 'basicInfomationOfTheLine',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
                 },
                 },
                 {
                 {
                     label: '线路发班情况',
                     label: '线路发班情况',
                     key: 'lineDispatch',
                     key: 'lineDispatch',
-                    icon: <AreaChartOutlined />,
+                    icon: <AreaChartOutlined/>,
+                },
+                {
+                    label: '乘客类型',
+                    key: 'passengerType',
+                    icon: <AreaChartOutlined/>,
+                },
+                {
+                    label: '汇总数据',
+                    key: 'summaryData',
+                    icon: <AreaChartOutlined/>,
+                },
+                {
+                    label: '驾驶员数量',
+                    key: 'numberOfDrivers',
+                    icon: <AreaChartOutlined/>,
+                },
+                {
+                    label: '车辆数量占比',
+                    key: 'numberOfTransit',
+                    icon: <AreaChartOutlined/>,
+                },
+                {
+                    label: '车辆监控',
+                    key: 'vehicleMonitoring',
+                    icon: <AreaChartOutlined/>,
+                },
+                {
+                    label: '车辆状态',
+                    key: 'vehicleStatus',
+                    icon: <AreaChartOutlined/>,
                 }
                 }
             ]
             ]
         },
         },
+        {
+            label: '客流分析',
+            key: 'passengerFlowAnalysis',
+            icon: <SettingOutlined/>,
+            children: [
+                {
+                    label: '底部信息',
+                    key: 'passengerInfomation',
+                    icon: <FileDoneOutlined/>,
+                },
+                {
+                    label: '区域客流',
+                    key: 'regionalPassengerFlow',
+                    icon: <FileDoneOutlined/>,
+                },
+                {
+                    label: '通勤时间',
+                    key: 'commutingTime',
+                    icon: <FileDoneOutlined/>,
+                },
+                {
+                    label: '消费类型',
+                    key: 'consumptionType',
+                    icon: <FileDoneOutlined/>,
+                },
+                {
+                    label: '乘距分布',
+                    key: 'distribution',
+                    icon: <FileDoneOutlined/>,
+                },
+                {
+                    label: '换乘次数',
+                    key: 'replacementFrequency',
+                    icon: <FileDoneOutlined/>,
+                },
+                {
+                    label: '客流线路分布',
+                    key: 'passengerFlowRoutes',
+                    icon: <FileDoneOutlined/>,
+                },
+                {
+                    label: '客运量排名',
+                    key: 'rankingOfPassengerVolume',
+                    icon: <FileDoneOutlined/>,
+                }
+            ]
+        },
+        {
+            label: '维保动态',
+            key: 'maintenanceDynamics',
+            icon: <SettingOutlined/>,
+            children: [{
+                label: '车辆数量',
+                key: 'vehiclesTotalNumber',
+                icon: <FileDoneOutlined/>,
+            }, {
+                label: '维修保养统计',
+                key: 'maintenanceStatistics',
+                icon: <FileDoneOutlined/>,
+            },]
+        },
         {
         {
             label: '基础信息配置',
             label: '基础信息配置',
             key: 'setting',
             key: 'setting',
@@ -96,10 +187,10 @@ export default function Home() {
                 label: '用户管理',
                 label: '用户管理',
                 key: 'user',
                 key: 'user',
                 icon: <UserOutlined/>,
                 icon: <UserOutlined/>,
-            },{
+            }, {
                 label: '字典管理',
                 label: '字典管理',
                 key: 'dict',
                 key: 'dict',
-                icon: <FileDoneOutlined />,
+                icon: <FileDoneOutlined/>,
             }]
             }]
         }
         }
     ]
     ]
@@ -112,40 +203,45 @@ export default function Home() {
         navagate("/" + e.key)
         navagate("/" + e.key)
     };
     };
 
 
-  /**
-   * 退出登录
-   * @returns {Promise<void>}
-   */
-   async function logOut(){
-     let {code}= await  axios.post('/sys/logout')
-     if(code===200){
-       localStorage.removeItem('user')
-       navagate('/login')
-     }
+    /**
+     * 退出登录
+     * @returns {Promise<void>}
+     */
+    async function logOut() {
+        let {code} = await axios.post('/sys/logout')
+        if (code === 200) {
+            localStorage.removeItem('user')
+            navagate('/login')
+        }
     }
     }
+
     // reduce状态
     // reduce状态
     const dispatch = useDispatch();
     const dispatch = useDispatch();
+
     /**
     /**
      * 全局存储字典
      * 全局存储字典
      * @returns {Promise<void>}
      * @returns {Promise<void>}
      */
      */
-   async function getDict(){
-         let {data} = await axios.get("/dict/selectKey");
-         dispatch(setDictData(data))
+    async function getDict() {
+        let {data} = await axios.get("/dict/selectKey");
+        dispatch(setDictData(data))
 
 
 
 
     }
     }
+
     const location = useLocation();
     const location = useLocation();
+
     // 让页面无法跳转
     // 让页面无法跳转
-    function jumpToPage(){
-        if(location.pathname==='/'){
+    function jumpToPage() {
+        if (location.pathname === '/') {
             navagate('/statisticsData')
             navagate('/statisticsData')
         }
         }
     }
     }
-    useEffect(()=>{
+
+    useEffect(() => {
         jumpToPage()
         jumpToPage()
         getDict()
         getDict()
-    },[])
+    }, [])
     return (
     return (
         <div className="home">
         <div className="home">
             <div className="head">
             <div className="head">

+ 15 - 14
src/pages/linePageChild/basicInfomationOfTheLine/basicInfomationOfTheLine.jsx

@@ -1,9 +1,9 @@
-import {Table, Button, Select} from "antd";
-import {useState, useEffect} from "react";
+import {Button, Select, Table} from "antd";
+import {useEffect, useState} from "react";
 import ModalHooks from "./components/modal.jsx";
 import ModalHooks from "./components/modal.jsx";
 import "./basicInfomationOfTheLine.scss";
 import "./basicInfomationOfTheLine.scss";
 import axios from "@/utils/axios.js";
 import axios from "@/utils/axios.js";
-import dayjs from "dayjs";
+import DeleteButton from "@/components/delete.jsx";
 
 
 const {Column} = Table;
 const {Column} = Table;
 
 
@@ -68,9 +68,9 @@ export default function BasicInfomationOfTheLine() {
 
 
     // 获取数据
     // 获取数据
     async function getData() {
     async function getData() {
-        if(!val)return
+        if (!val) return
         let {data} = await axios.get("/lineOperate/getBusLineDetail", {params: {lineId: val}});
         let {data} = await axios.get("/lineOperate/getBusLineDetail", {params: {lineId: val}});
-        if(!data){
+        if (!data) {
             setData([]);
             setData([]);
             return
             return
         }
         }
@@ -93,15 +93,15 @@ export default function BasicInfomationOfTheLine() {
 
 
     }
     }
 
 
-    useEffect(() => {
-        //   这里有点坑,useEffect必须是普通函数,不可以是闭包函数
-             getLineData()
 
 
+    useEffect(() => {
+        async function request() {
+            await getLineData()
+            await getData()
+        }
 
 
-    }, []);
-    useEffect(()=>{
-        getData()
-    },[val])
+        request()
+    }, [val])
     return (
     return (
         <div className="basicin">
         <div className="basicin">
             <div className="top">
             <div className="top">
@@ -109,7 +109,7 @@ export default function BasicInfomationOfTheLine() {
                     <Select options={option} style={{width: '100px'}} value={val} onChange={changeSelect}></Select>
                     <Select options={option} style={{width: '100px'}} value={val} onChange={changeSelect}></Select>
                 </div>
                 </div>
                 <div className="button">
                 <div className="button">
-                    <Button type="primary" onClick={addUser}>
+                    <Button type="primary" onClick={addUser} disabled={data.length}>
                         新增线路基本情况
                         新增线路基本情况
                     </Button>
                     </Button>
                 </div>
                 </div>
@@ -145,7 +145,8 @@ export default function BasicInfomationOfTheLine() {
                             <Button type="primary" onClick={() => modify(record)}>
                             <Button type="primary" onClick={() => modify(record)}>
                                 修改
                                 修改
                             </Button>
                             </Button>
-
+                            <DeleteButton url='/lineOperateEdit/delBusLineDetail' id={text}
+                                          getData={getData}></DeleteButton>
                         </div>
                         </div>
                     )}
                     )}
                 />
                 />

+ 42 - 121
src/pages/linePageChild/lineDispatch/components/modal.jsx

@@ -9,11 +9,19 @@ export default function ModalHooks({isModalOpen, closeModal, row, lineList, opti
     const [messageApi, contextHolder] = message.useMessage();
     const [messageApi, contextHolder] = message.useMessage();
     // 表单
     // 表单
     const [form] = Form.useForm();
     const [form] = Form.useForm();
-    const typeOption = [
-        {value: 0, label: '干线公交'},
-        {value: 1, label: '主线公交'}
+    const directionOption = [
+        {value: 2, label: '下行'},
+        {value: 1, label: '上行'}
+    ]
+    let typeOptions=[
+        {value: 1, label: '已完成'},
+        {value: 2 ,label: '执行中'},
+        {value: 3, label: '已处理'},
+        {value: 4, label: '已下发'},
+        {value: 5, label: '待发'},
+        {value: 6, label: '调停'},
+        {value: 7, label: '非运营'},
     ]
     ]
-
     /**
     /**
      *确定时候的回调
      *确定时候的回调
      */
      */
@@ -21,16 +29,15 @@ export default function ModalHooks({isModalOpen, closeModal, row, lineList, opti
         // 验证表单
         // 验证表单
         form.validateFields().then(async () => {
         form.validateFields().then(async () => {
             let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
             let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
-            formData.upStartTime = dayjs(formData.upStartTime).format('HH:mm')
-            formData.upEndTime = dayjs(formData.upEndTime).format('HH:mm')
-            formData.downStartTime = dayjs(formData.downStartTime).format('HH:mm')
-            formData.downEndTime = dayjs(formData.downEndTime).format('HH:mm')
+            formData.dispatchTime = dayjs(formData.dispatchTime).format('HH:mm')
+            formData.realityTime = dayjs(formData.realityTime).format('HH:mm')
+
 
 
             if (row?.id) {
             if (row?.id) {
                 // 修改数据
                 // 修改数据
                 formData.id = row.id
                 formData.id = row.id
             }
             }
-            let {code, message} = await axios.post('/lineOperateEdit/editBusLineDetail', formData)
+            let {code, message} = await axios.post('/lineOperateEdit/editBusLineOperate', [formData])
             if (code === 200) {
             if (code === 200) {
                 messageApi.success(message)
                 messageApi.success(message)
                 handleCancel()
                 handleCancel()
@@ -51,15 +58,14 @@ export default function ModalHooks({isModalOpen, closeModal, row, lineList, opti
         if (row.id) {
         if (row.id) {
             dayjs.extend(customParseFormat)
             dayjs.extend(customParseFormat)
             let formData = JSON.parse(JSON.stringify(row))
             let formData = JSON.parse(JSON.stringify(row))
-            formData.upStartTime = dayjs(formData.upStartTime, 'HH:mm')
-            formData.upEndTime = dayjs(formData.upEndTime, 'HH:mm')
-            formData.downStartTime = dayjs(formData.downStartTime, 'HH:mm')
-            formData.downEndTime = dayjs(formData.downEndTime, 'HH:mm')
+            formData.dispatchTime = dayjs(formData.dispatchTime, 'HH:mm')
+            formData.realityTime = dayjs(formData.realityTime, 'HH:mm')
             form.setFieldsValue(formData)
             form.setFieldsValue(formData)
 
 
         }
         }
     }, [row])
     }, [row])
 
 
+
     return (
     return (
         <div className="form">
         <div className="form">
 
 
@@ -96,8 +102,8 @@ export default function ModalHooks({isModalOpen, closeModal, row, lineList, opti
                     </Form.Item>
                     </Form.Item>
 
 
                     <Form.Item
                     <Form.Item
-                        label="票价"
-                        name="fare"
+                        label="电量"
+                        name="electricity"
                         rules={[
                         rules={[
                             {
                             {
                                 required: true,
                                 required: true,
@@ -111,8 +117,8 @@ export default function ModalHooks({isModalOpen, closeModal, row, lineList, opti
                     </Form.Item>
                     </Form.Item>
 
 
                     <Form.Item
                     <Form.Item
-                        label="线路类型"
-                        name="type"
+                        label="车牌号"
+                        name="licensePlate"
                         rules={[
                         rules={[
                             {
                             {
                                 required: true,
                                 required: true,
@@ -120,25 +126,12 @@ export default function ModalHooks({isModalOpen, closeModal, row, lineList, opti
                             },
                             },
                         ]}
                         ]}
                     >
                     >
-                        <Select options={typeOption}></Select>
-                    </Form.Item>
-
-                    <Form.Item
-                        label="车辆总数"
-                        name="totalCar"
-                        rules={[
-                            {
-                                required: true,
-                                message: '请输入计划班次',
-                            },
-                        ]}
-                    >
-                        <InputNumber style={{width: '100%'}}/>
+                        <Input></Input>
                     </Form.Item>
                     </Form.Item>
 
 
                     <Form.Item
                     <Form.Item
-                        label="运营车辆数量"
-                        name="operateNum"
+                        label="司机名称"
+                        name="driver"
                         rules={[
                         rules={[
                             {
                             {
                                 required: true,
                                 required: true,
@@ -146,38 +139,13 @@ export default function ModalHooks({isModalOpen, closeModal, row, lineList, opti
                             },
                             },
                         ]}
                         ]}
                     >
                     >
-                        <InputNumber style={{width: '100%'}}/>
+                        <Input style={{width: '100%'}}/>
                     </Form.Item>
                     </Form.Item>
 
 
 
 
                     <Form.Item
                     <Form.Item
-                        label="非运营车辆数量"
-                        name="nonOperateNum"
-                        rules={[
-                            {
-                                required: true,
-                                message: '请输入',
-
-                            },
-                        ]}
-                    >
-                        <InputNumber style={{width: '100%'}}/>
-                    </Form.Item>
-                    <Form.Item
-                        label="上行里程"
-                        name="upMileage"
-                        rules={[
-                            {
-                                required: true,
-                                message: '请输入',
-                            },
-                        ]}
-                    >
-                        <InputNumber style={{width: '100%'}}></InputNumber>
-                    </Form.Item>
-                    <Form.Item
-                        label="上行起点时间"
-                        name="upStartTime"
+                        label="调度时间"
+                        name="dispatchTime"
                         rules={[
                         rules={[
                             {
                             {
                                 required: true,
                                 required: true,
@@ -189,8 +157,8 @@ export default function ModalHooks({isModalOpen, closeModal, row, lineList, opti
                         <TimePicker format={'HH:mm'} style={{width: '100%'}}></TimePicker>
                         <TimePicker format={'HH:mm'} style={{width: '100%'}}></TimePicker>
                     </Form.Item>
                     </Form.Item>
                     <Form.Item
                     <Form.Item
-                        label="上行结束时间"
-                        name="upEndTime"
+                        label="实际发车时间"
+                        name="realityTime"
                         rules={[
                         rules={[
                             {
                             {
                                 required: true,
                                 required: true,
@@ -201,33 +169,10 @@ export default function ModalHooks({isModalOpen, closeModal, row, lineList, opti
                     >
                     >
                         <TimePicker format={'HH:mm'} style={{width: '100%'}}></TimePicker>
                         <TimePicker format={'HH:mm'} style={{width: '100%'}}></TimePicker>
                     </Form.Item>
                     </Form.Item>
+
                     <Form.Item
                     <Form.Item
-                        label="上行起点站"
-                        name="upStartStation"
-                        rules={[
-                            {
-                                required: true,
-                                message: '请输入',
-                            },
-                        ]}
-                    >
-                        <Input style={{width: '100%'}}></Input>
-                    </Form.Item>
-                    <Form.Item
-                        label="上行终点站"
-                        name="upEndStation"
-                        rules={[
-                            {
-                                required: true,
-                                message: '请输入',
-                            },
-                        ]}
-                    >
-                        <Input style={{width: '100%'}}></Input>
-                    </Form.Item>
-                    <Form.Item
-                        label="下行里程"
-                        name="downMileage"
+                        label="发车间隔-分钟"
+                        name="intervalTime"
                         rules={[
                         rules={[
                             {
                             {
                                 required: true,
                                 required: true,
@@ -238,55 +183,31 @@ export default function ModalHooks({isModalOpen, closeModal, row, lineList, opti
                         <InputNumber style={{width: '100%'}}></InputNumber>
                         <InputNumber style={{width: '100%'}}></InputNumber>
                     </Form.Item>
                     </Form.Item>
                     <Form.Item
                     <Form.Item
-                        label="下行起点时间"
-                        name="downStartTime"
+                        label="上/下行"
+                        name="direction"
                         rules={[
                         rules={[
                             {
                             {
                                 required: true,
                                 required: true,
                                 message: '请输入',
                                 message: '请输入',
-                                type: "object"
                             },
                             },
                         ]}
                         ]}
                     >
                     >
-                        <TimePicker format={'HH:mm'} style={{width: '100%'}}></TimePicker>
+                        <Select options={directionOption}></Select>
                     </Form.Item>
                     </Form.Item>
                     <Form.Item
                     <Form.Item
-                        label="下行结束时间"
-                        name="downEndTime"
-                        rules={[
-                            {
-                                required: true,
-                                message: '请输入',
-                                type: "object"
-                            },
-                        ]}
-                    >
-                        <TimePicker format={'HH:mm'} style={{width: '100%'}}></TimePicker>
-                    </Form.Item>
-                    <Form.Item
-                        label="下行起点站"
-                        name="downStartStation"
-                        rules={[
-                            {
-                                required: true,
-                                message: '请输入',
-                            },
-                        ]}
-                    >
-                        <Input style={{width: '100%'}}></Input>
-                    </Form.Item>
-                    <Form.Item
-                        label="下行终点站"
-                        name="downEndStation"
+                        label="类型"
+                        name="type"
                         rules={[
                         rules={[
                             {
                             {
                                 required: true,
                                 required: true,
                                 message: '请输入',
                                 message: '请输入',
+
                             },
                             },
                         ]}
                         ]}
                     >
                     >
-                        <Input style={{width: '100%'}}></Input>
+                        <Select options={typeOptions}></Select>
                     </Form.Item>
                     </Form.Item>
+
                 </Form>
                 </Form>
 
 
             </Modal>
             </Modal>

+ 61 - 26
src/pages/linePageChild/lineDispatch/lineDispatch.jsx

@@ -1,9 +1,9 @@
-import {Table, Button, Select} from "antd";
-import {useState, useEffect} from "react";
+import {Button, Select, Table} from "antd";
+import {useEffect, useState} from "react";
 import ModalHooks from "./components/modal.jsx";
 import ModalHooks from "./components/modal.jsx";
 import "./lineDispatch.scss";
 import "./lineDispatch.scss";
 import axios from "@/utils/axios.js";
 import axios from "@/utils/axios.js";
-import dayjs from "dayjs";
+import DeleteButton from "@/components/delete.jsx";
 
 
 const {Column} = Table;
 const {Column} = Table;
 
 
@@ -17,6 +17,20 @@ export default function LineDispatch() {
     // 设置下拉框绑定的值
     // 设置下拉框绑定的值
     const [val, setVal] = useState('')
     const [val, setVal] = useState('')
 
 
+    // 切换页数
+    function changeSize(e) {
+
+        setCurrent(e)
+
+    }
+
+    // 当前页数
+    const [current, setCurrent] = useState(1)
+    // 每页条数
+    const pageSize = 10
+    // 总条数
+    let [total, setTotal] = useState(0)
+
     // 新增用户页面
     // 新增用户页面
     function addUser() {
     function addUser() {
         setRow([]);
         setRow([]);
@@ -32,7 +46,6 @@ export default function LineDispatch() {
     // 点击修改的回调
     // 点击修改的回调
     function modify(data) {
     function modify(data) {
         setRow(data);
         setRow(data);
-
         setIsModalOpen(true);
         setIsModalOpen(true);
 
 
     }
     }
@@ -68,13 +81,14 @@ export default function LineDispatch() {
 
 
     // 获取数据
     // 获取数据
     async function getData() {
     async function getData() {
-        if(!val)return
-        let {data} = await axios.get("/lineOperate/getBusLineDetail", {params: {lineId: val}});
-        if(!data){
+        if (!val) return
+        let {data} = await axios.get("/lineOperate/getBusLineOperate", {params: {lineId: val}});
+        if (!data) {
             setData([]);
             setData([]);
             return
             return
         }
         }
-        setData([data]);
+        setData(data.list);
+        setTotal(data.total)
     }
     }
 
 
     // 设置线路名称
     // 设置线路名称
@@ -88,20 +102,39 @@ export default function LineDispatch() {
      * @param value 数据值
      * @param value 数据值
      */
      */
     function changeSelect(value) {
     function changeSelect(value) {
-
+        setCurrent(1)
         setVal(value)
         setVal(value)
+    }
 
 
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "已完成";
+            case 2:
+                return "执行中";
+            case 3:
+                return "已处理";
+            case 4:
+                return "已下发";
+            case 5:
+                return "待发";
+            case 6:
+                return "调停";
+            case 7:
+                return "非运营";
+        }
     }
     }
 
 
-    useEffect(() => {
-        //   这里有点坑,useEffect必须是普通函数,不可以是闭包函数
-             getLineData()
 
 
+    useEffect(() => {
+        async function request() {
+            await getLineData()
+            await getData()
+        }
 
 
-    }, []);
-    useEffect(()=>{
-        getData()
-    },[val])
+        request()
+    }, [val, current])
     return (
     return (
         <div className="basicin">
         <div className="basicin">
             <div className="top">
             <div className="top">
@@ -110,7 +143,7 @@ export default function LineDispatch() {
                 </div>
                 </div>
                 <div className="button">
                 <div className="button">
                     <Button type="primary" onClick={addUser}>
                     <Button type="primary" onClick={addUser}>
-                        新增线路基本情况
+                        新增线路发班情况
                     </Button>
                     </Button>
                 </div>
                 </div>
             </div>
             </div>
@@ -119,21 +152,21 @@ export default function LineDispatch() {
                 bordered={true}
                 bordered={true}
                 rowKey="id"
                 rowKey="id"
                 pagination={{
                 pagination={{
-                    current: 1, // 当前页数
-                    pageSize: 12, // 每页显示的数量
+                    total: total, // 数据的总数
+                    current: current, // 当前页数
+                    pageSize: pageSize, // 每页显示的数量
+                    onChange: changeSize
                 }}
                 }}
             >
             >
                 <Column title="线路名称" dataIndex="lineId" key="id" render={(text) => (
                 <Column title="线路名称" dataIndex="lineId" key="id" render={(text) => (
                     setText(text)
                     setText(text)
                 )
                 )
                 }></Column>
                 }></Column>
-                <Column title="线路类型" dataIndex="type" key="id" render={(text) =>
-                    text === 1 ? '主线公交' : '干线公交'
-                }/>
-                <Column title="上行起点站" dataIndex="upStartStation" key="id"/>
-                <Column title="上行终点站" dataIndex="upEndStation" key="id"/>
-                <Column title="下行起点站" dataIndex="downStartStation" key="id"/>
-                <Column title="下行终点站" dataIndex="downEndStation" key="id"/>
+                <Column title="车牌号" dataIndex="licensePlate" key="id"/>
+                <Column title="调度时间" dataIndex="dispatchTime" key="id"/>
+                <Column title="实际发车时间" dataIndex="realityTime" key="id"/>
+                <Column title="上/下行" dataIndex="direction" key="id" render={(text) => text === 1 ? '上行' : '下行'}/>
+                <Column title="类型" dataIndex="type" key="id" render={(text) => setType(text)}/>
 
 
                 <Column
                 <Column
                     title="操作"
                     title="操作"
@@ -145,6 +178,8 @@ export default function LineDispatch() {
                             <Button type="primary" onClick={() => modify(record)}>
                             <Button type="primary" onClick={() => modify(record)}>
                                 修改
                                 修改
                             </Button>
                             </Button>
+                            <DeleteButton url='/lineOperateEdit/delBusLineOperate' id={text}
+                                          getData={getData}></DeleteButton>
 
 
                         </div>
                         </div>
                     )}
                     )}

+ 128 - 0
src/pages/linePageChild/numberOfDrivers/components/modal.jsx

@@ -0,0 +1,128 @@
+import {Form, InputNumber, message, Modal, Select,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row, option, val}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+
+    let passengerOption = [
+        {value: 1, label: '一星级'},
+        {value: 2, label: '二星级'},
+        {value: 3, label: '三星级'},
+        {value: 4, label: '四星级'},
+        {value: 5, label: '五星级'},
+
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/lineOperateEdit/editBusLineDriver', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        form.setFieldValue('lineId', val)
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="线路"
+                        name="lineId"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+
+                            },
+                        ]}
+
+                    >
+                        <Select options={option} style={{width: '100%'}} disabled></Select>
+                    </Form.Item>
+                    <Form.Item
+                        label="星级"
+                        name="starType"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Select options={passengerOption} style={{width: '100%'}}></Select>
+                    </Form.Item>
+
+
+                    <Form.Item
+                        label="数量"
+                        name="total"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/linePageChild/numberOfDrivers/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 160 - 0
src/pages/linePageChild/numberOfDrivers/numberOfDrivers.jsx

@@ -0,0 +1,160 @@
+import {Button, Select, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./numberOfDrivers.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function NumberOfDrivers() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+        if (!val) return
+        let {data} = await axios.get("/lineOperate/getBusLineDriver", {params: {lineId: val}});
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "一星级";
+            case 2:
+                return "二星级";
+            case 3:
+                return "三星级";
+            case 4:
+                return "四星级";
+            case 5:
+                return "五星级";
+
+        }
+    }
+
+    // 线路下拉框
+    const [option, setOption] = useState([])
+    // 线路数据
+    const [lineList, setLineList] = useState([])
+
+    /**
+     * 线路数据请求
+     * @returns {Promise<void>}
+     */
+    async function getLineData() {
+
+        let {data} = await axios.get('/busLine/getList')
+        setLineList(data)
+        let option = data.map(item => {
+            return {
+                label: item.lineName,
+                value: item.lineId,
+            }
+
+        })
+        // 默认查询第一个
+        if (!val) {
+            setVal(option[0].value)
+            // console.log(option[0])
+        }
+        setOption(option)
+
+    }
+
+    /**
+     * 设置下拉框值并重新搜索
+     * @param value 数据值
+     */
+    function changeSelect(value) {
+
+        setVal(value)
+    }
+
+
+    useEffect(() => {
+        async function request() {
+            await getLineData()
+            await getData()
+        }
+
+        request()
+    }, [val])
+    return (
+        <div className="driviers">
+            <div className="top">
+                <div className="slect">
+                    <Select options={option} style={{width: '100px'}} value={val} onChange={changeSelect}></Select>
+                </div>
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增驾驶员数量类型
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="星级" dataIndex="starType" key="id" render={(text) => setType(text)}></Column>
+                <Column title="数量" dataIndex="total" key="id"/>
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/lineOperateEdit/delBusLineDriver' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+                option={option}
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 31 - 0
src/pages/linePageChild/numberOfDrivers/numberOfDrivers.scss

@@ -0,0 +1,31 @@
+.driviers {
+  width: 100%;
+  height: 100%;
+
+  .top {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 5px;
+
+    .input {
+      display: flex;
+
+      button {
+        margin-left: 10px;
+      }
+    }
+  }
+
+  .btn {
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+
+#basic {
+
+  .ant-form-item {
+    margin-bottom: 20px;
+  }
+}

+ 128 - 0
src/pages/linePageChild/numberOfTransit/components/modal.jsx

@@ -0,0 +1,128 @@
+import {Form, InputNumber, message, Modal, Select,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row, option, val}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+
+    let passengerOption = [
+        {value: 1, label: '一星级'},
+        {value: 2, label: '二星级'},
+        {value: 3, label: '三星级'},
+        {value: 4, label: '四星级'},
+        {value: 5, label: '五星级'},
+
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/lineOperateEdit/editBusLineCar', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        form.setFieldValue('lineId', val)
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="线路"
+                        name="lineId"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+
+                            },
+                        ]}
+
+                    >
+                        <Select options={option} style={{width: '100%'}} disabled></Select>
+                    </Form.Item>
+                    <Form.Item
+                        label="年份"
+                        name="year"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                    <Form.Item
+                        label="数量"
+                        name="total"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/linePageChild/numberOfTransit/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 158 - 0
src/pages/linePageChild/numberOfTransit/numberOfTransit.jsx

@@ -0,0 +1,158 @@
+import {Button, Select, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./numberOfTransit.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function NumberOfTransit() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+        if (!val) return
+        let {data} = await axios.get("/lineOperate/getBusLineCar", {params: {lineId: val}});
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "一星级";
+            case 2:
+                return "二星级";
+            case 3:
+                return "三星级";
+            case 4:
+                return "四星级";
+            case 5:
+                return "五星级";
+
+        }
+    }
+
+    // 线路下拉框
+    const [option, setOption] = useState([])
+    // 线路数据
+    const [lineList, setLineList] = useState([])
+
+    /**
+     * 线路数据请求
+     * @returns {Promise<void>}
+     */
+    async function getLineData() {
+
+        let {data} = await axios.get('/busLine/getList')
+        setLineList(data)
+        let option = data.map(item => {
+            return {
+                label: item.lineName,
+                value: item.lineId,
+            }
+
+        })
+        // 默认查询第一个
+        if (!val) {
+            setVal(option[0].value)
+            // console.log(option[0])
+        }
+        setOption(option)
+
+    }
+
+    /**
+     * 设置下拉框值并重新搜索
+     * @param value 数据值
+     */
+    function changeSelect(value) {
+
+        setVal(value)
+    }
+
+    useEffect(() => {
+        async function request() {
+            await getLineData()
+            await getData()
+        }
+
+        request()
+    }, [val])
+    return (
+        <div className="driviers">
+            <div className="top">
+                <div className="slect">
+                    <Select options={option} style={{width: '100px'}} value={val} onChange={changeSelect}></Select>
+                </div>
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增车辆占比
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="星级" dataIndex="year" key="id"></Column>
+                <Column title="数量" dataIndex="total" key="id"/>
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/lineOperateEdit/delBusLineCar' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+                option={option}
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 31 - 0
src/pages/linePageChild/numberOfTransit/numberOfTransit.scss

@@ -0,0 +1,31 @@
+.driviers {
+  width: 100%;
+  height: 100%;
+
+  .top {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 5px;
+
+    .input {
+      display: flex;
+
+      button {
+        margin-left: 10px;
+      }
+    }
+  }
+
+  .btn {
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+
+#basic {
+
+  .ant-form-item {
+    margin-bottom: 20px;
+  }
+}

+ 113 - 0
src/pages/linePageChild/passengerType/components/modal.jsx

@@ -0,0 +1,113 @@
+import {Modal, Form, Select, message, InputNumber,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect, useState} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+
+    let passengerOption = [
+        {value: 1, label: '老年卡'},
+        {value: 2, label: '学生卡'},
+        {value: 3, label: '电子钱包'},
+        {value: 4, label: '现金'},
+        {value: 5, label: '其他'},
+
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/lineOperateEdit/editPassengerPercent', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="乘客类型"
+                        name="passengerType"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Select options={passengerOption} style={{width: '100%'}}></Select>
+                    </Form.Item>
+
+
+                    <Form.Item
+                        label="数值"
+                        name="percent"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/linePageChild/passengerType/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 114 - 0
src/pages/linePageChild/passengerType/passengerType.jsx

@@ -0,0 +1,114 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./passengerType.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function PassengerType() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/lineOperate/getPassengerPercent");
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "老年卡";
+            case 2:
+                return "学生卡";
+            case 3:
+                return "电子钱包";
+            case 4:
+                return "现金";
+            case 5:
+                return "其他";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增乘客类型
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="乘客类型" dataIndex="passengerType" key="id" render={(text) => setType(text)}></Column>
+                <Column title="数值" dataIndex="percent" key="id"/>
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/lineOperateEdit/delPassengerPercent' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/linePageChild/passengerType/passengerType.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 171 - 0
src/pages/linePageChild/summaryData/components/modal.jsx

@@ -0,0 +1,171 @@
+import {Form, InputNumber, message, Modal,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+
+    let passengerOption = [
+        {value: 1, label: '老年卡'},
+        {value: 2, label: '学生卡'},
+        {value: 3, label: '电子钱包'},
+        {value: 4, label: '现金'},
+        {value: 5, label: '其他'},
+
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/lineOperateEdit/editBusLineStatistics', formData)
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="当前里程"
+                        name="currentMileage"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="空驶率"
+                        name="unloadedRatio"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="今日客流"
+                        name="passengerFlow"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="计划里程"
+                        name="planMileage"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="塌班"
+                        name="collapseClasses"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="计划班次"
+                        name="planClasses"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="已发班次"
+                        name="setOutClasses"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/linePageChild/summaryData/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 117 - 0
src/pages/linePageChild/summaryData/summaryData.jsx

@@ -0,0 +1,117 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./summaryData.scss";
+import axios from "@/utils/axios.js";
+
+const {Column} = Table;
+
+export default function SummaryData() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/lineOperate/getBusLineStatistics");
+
+        setData([data]);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "老年卡";
+            case 2:
+                return "学生卡";
+            case 3:
+                return "电子钱包";
+            case 4:
+                return "现金";
+            case 5:
+                return "其他";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                {/*<div className="button">*/}
+                {/*    <Button type="primary" onClick={addUser}>*/}
+                {/*        新增乘客类型*/}
+                {/*    </Button>*/}
+                {/*</div>*/}
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="当前里程" dataIndex="currentMileage"></Column>
+                <Column title="空驶率" dataIndex="unloadedRatio" key="id"/>
+                <Column title="今日客流" dataIndex="passengerFlow" key="id"/>
+                <Column title="计划里程" dataIndex="planMileage" key="id"/>
+                <Column title="塌班" dataIndex="collapseClasses" key="id"/>
+                <Column title="计划班次" dataIndex="planClasses" key="id"/>
+                <Column title="已发班次" dataIndex="setOutClasses" key="id"/>
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/linePageChild/summaryData/summaryData.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 154 - 0
src/pages/linePageChild/vehicleMonitoring/components/modal.jsx

@@ -0,0 +1,154 @@
+import {Form, Input, message, Modal, Select,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/lineOperateEdit/editVehicleMonitor', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="情景"
+                        name="carScene"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Select options={passengerOption} style={{width: '100%'}}></Select>
+                    </Form.Item>
+                    <Form.Item
+                        label="状态"
+                        name="carStatus"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Select options={status} style={{width: '100%'}}></Select>
+                    </Form.Item>
+                    <Form.Item
+                        label="车牌"
+                        name="licensePlate"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <Input style={{width: '100%'}}></Input>
+                    </Form.Item>
+                    <Form.Item
+                        label="驾驶员"
+                        name="driver"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <Input style={{width: '100%'}}></Input>
+                    </Form.Item>
+                    <Form.Item
+                        label="拥挤度"
+                        name="congestion"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <Input style={{width: '100%'}}></Input>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/linePageChild/vehicleMonitoring/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 121 - 0
src/pages/linePageChild/vehicleMonitoring/vehicleMonitoring.jsx

@@ -0,0 +1,121 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./vehicleMonitoring.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function VehicleMonitoring() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/lineOperate/getVehicleMonitorService");
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增车辆监控
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="情景" dataIndex="carScene" key="id" render={(text) => setType(text)}></Column>
+                <Column title="状态" dataIndex="carStatus" key="id"
+                        render={(text) => text === 1 ? '运营' : '非运营'}></Column>
+                <Column title="车牌" dataIndex="licensePlate" key="id"></Column>
+                <Column title="驾驶员" dataIndex="driver" key="id"></Column>
+                <Column title="拥挤度" dataIndex="congestion" key="id"></Column>
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/lineOperateEdit/delVehicleMonitor' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/linePageChild/vehicleMonitoring/vehicleMonitoring.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 212 - 0
src/pages/linePageChild/vehicleStatus/components/modal.jsx

@@ -0,0 +1,212 @@
+import {Form, InputNumber, message, Modal, Select,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '上行'},
+        {value: 2, label: '下行'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/lineOperateEdit/editVehicleStatus', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+
+                    <Form.Item
+                        label="方向"
+                        name="direction"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Select options={status} style={{width: '100%'}}></Select>
+                    </Form.Item>
+                    <Form.Item
+                        label="平均间距"
+                        name="avgSpacing"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="最小间距"
+                        name="minSpacing"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="最大间距"
+                        name="maxSpacing"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="平峰平均时间"
+                        name="averageTime"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="单程平均时间"
+                        name="singleAvgTime"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="高峰平均时间"
+                        name="peakAvgTime"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="最大车速"
+                        name="maxSpeed"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="最小车速"
+                        name="minSpeed"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="平均车速"
+                        name="avgSpeed"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/linePageChild/vehicleStatus/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 120 - 0
src/pages/linePageChild/vehicleStatus/vehicleStatus.jsx

@@ -0,0 +1,120 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./vehicleStatus.scss";
+import axios from "@/utils/axios.js";
+
+const {Column} = Table;
+
+export default function VehicleStatus() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/lineOperate/getVehicleStatusService");
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                {/*<div className="button">*/}
+                {/*    <Button type="primary" onClick={addUser}>*/}
+                {/*        新增乘客类型*/}
+                {/*    </Button>*/}
+                {/*</div>*/}
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="方向" dataIndex="direction" key="id"
+                        render={(text) => text === 1 ? '上行' : '下行'}></Column>
+                <Column title="平均间距" dataIndex="avgSpacing" key="id"></Column>
+
+                <Column title="平峰平均时间" dataIndex="averageTime" key="id"></Column>
+                <Column title="高峰平均时间" dataIndex="peakAvgTime" key="id"></Column>
+                <Column title="平均车速" dataIndex="avgSpeed" key="id"></Column>
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/linePageChild/vehicleStatus/vehicleStatus.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 118 - 0
src/pages/passengerFlowAnalysis/commutingTime/commutingTime.jsx

@@ -0,0 +1,118 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./commutingTime.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function CommutingTime() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/trafficAnalysis/getTrafficCommutingTime");
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增通勤时间
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="区域" dataIndex="commutingType" key="id"></Column>
+                <Column title="人次(万人)" dataIndex="number" key="id"></Column>
+
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/trafficAnalysisEdit/delTrafficCommutingTime' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/passengerFlowAnalysis/commutingTime/commutingTime.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 118 - 0
src/pages/passengerFlowAnalysis/commutingTime/components/modal.jsx

@@ -0,0 +1,118 @@
+import {Form, Input, InputNumber, message, Modal,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/trafficAnalysisEdit/editTrafficCommutingTime', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="通勤时间类型"
+                        name="commutingType"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Input style={{width: '100%'}}></Input>
+                    </Form.Item>
+                    <Form.Item
+                        label="人次(万人)"
+                        name="number"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/passengerFlowAnalysis/commutingTime/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 118 - 0
src/pages/passengerFlowAnalysis/consumptionType/components/modal.jsx

@@ -0,0 +1,118 @@
+import {Form, Input, InputNumber, message, Modal,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/trafficAnalysisEdit/editTrafficConsumeType', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="消费类型"
+                        name="consumeType"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Input style={{width: '100%'}}></Input>
+                    </Form.Item>
+                    <Form.Item
+                        label="消费人次(万人)"
+                        name="number"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/passengerFlowAnalysis/consumptionType/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 118 - 0
src/pages/passengerFlowAnalysis/consumptionType/consumptionType.jsx

@@ -0,0 +1,118 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./consumptionType.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function ConsumptionType() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/trafficAnalysis/getTrafficConsumeType")
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增消费类型
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="消费类型" dataIndex="consumeType" key="id"></Column>
+                <Column title="消费人次(万人)" dataIndex="number" key="id"></Column>
+
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/trafficAnalysisEdit/delTrafficConsumeType' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/passengerFlowAnalysis/consumptionType/consumptionType.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 118 - 0
src/pages/passengerFlowAnalysis/distribution/components/modal.jsx

@@ -0,0 +1,118 @@
+import {Form, Input, InputNumber, message, Modal,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/trafficAnalysisEdit/editTrafficRidingDistance', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="乘距类型"
+                        name="ridingDistance"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Input style={{width: '100%'}}></Input>
+                    </Form.Item>
+                    <Form.Item
+                        label="人次(万人)"
+                        name="number"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/passengerFlowAnalysis/distribution/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 118 - 0
src/pages/passengerFlowAnalysis/distribution/distribution.jsx

@@ -0,0 +1,118 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./distribution.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function Distribution() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/trafficAnalysis/getTrafficRidingDistance")
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增乘距类型
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="乘距类型" dataIndex="ridingDistance" key="id"></Column>
+                <Column title="人次(万人)" dataIndex="number" key="id"></Column>
+
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/trafficAnalysisEdit/delTrafficRidingDistance' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/passengerFlowAnalysis/distribution/distribution.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 117 - 0
src/pages/passengerFlowAnalysis/passengerFlowRoutes/components/modal.jsx

@@ -0,0 +1,117 @@
+import {Form, Input, InputNumber, message, Modal,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/trafficAnalysisEdit/editTrafficTypeNumber', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="线路类型"
+                        name="lineType"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Input style={{width: '100%'}}></Input>
+                    </Form.Item>
+                    <Form.Item
+                        label="线路条数"
+                        name="number"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/passengerFlowAnalysis/passengerFlowRoutes/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 116 - 0
src/pages/passengerFlowAnalysis/passengerFlowRoutes/passengerFlowRoutes.jsx

@@ -0,0 +1,116 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./passengerFlowRoutes.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function PassengerFlowRoutes() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/trafficAnalysis/getTrafficTypeNumber")
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增客流线路分布
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="线路类型" dataIndex="lineType" key="id"></Column>
+                <Column title="线路条数" dataIndex="number" key="id"></Column>
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/trafficAnalysisEdit/delTrafficTypeNumber' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/passengerFlowAnalysis/passengerFlowRoutes/passengerFlowRoutes.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 154 - 0
src/pages/passengerFlowAnalysis/passengerInfomation/components/modal.jsx

@@ -0,0 +1,154 @@
+import {Form, InputNumber, message, Modal,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/trafficAnalysisEdit/editTrafficAnalysis', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="平均乘距"
+                        name="avgRidingDistance"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="满载率"
+                        name="fullLoad"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="客运量"
+                        name="trafficVolume"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="免费换乘"
+                        name="freeTransfer"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+                    <Form.Item
+                        label="分担率"
+                        name="shareRate"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/passengerFlowAnalysis/passengerInfomation/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 119 - 0
src/pages/passengerFlowAnalysis/passengerInfomation/passengerInfomation.jsx

@@ -0,0 +1,119 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./passengerInfomation.scss";
+import axios from "@/utils/axios.js";
+
+const {Column} = Table;
+
+export default function PassengerInfomation() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/trafficAnalysis/getTrafficAnalysis");
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            {/*<div className="top">*/}
+
+            {/*    <div className="button">*/}
+            {/*        <Button type="primary" onClick={addUser}>*/}
+            {/*            新增车辆监控*/}
+            {/*        </Button>*/}
+            {/*    </div>*/}
+            {/*</div>*/}
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="平均乘距" dataIndex="avgRidingDistance" key="id"></Column>
+                <Column title="满载率" dataIndex="fullLoad" key="id"
+                ></Column>
+                <Column title="客运量" dataIndex="trafficVolume" key="id"></Column>
+                <Column title="免费换乘" dataIndex="freeTransfer" key="id"></Column>
+                <Column title="分担率" dataIndex="shareRate" key="id"></Column>
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/passengerFlowAnalysis/passengerInfomation/passengerInfomation.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 123 - 0
src/pages/passengerFlowAnalysis/rankingOfPassengerVolume/components/modal.jsx

@@ -0,0 +1,123 @@
+import {Form, InputNumber, message, Modal, Select,} from 'antd';
+import {useEffect} from 'react'
+import './modal.scss'
+import axios from "@/utils/axios.js";
+
+
+export default function ModalHooks({isModalOpen, closeModal, row, option}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            formData.LineName = option.find(item => {
+                return item.value === formData.lineId
+            }).label
+            // console.log(d)
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/trafficAnalysisEdit/editTrafficFlowRank', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="线路"
+                        name="lineId"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+
+                            },
+                        ]}
+
+                    >
+                        <Select options={option} style={{width: '100%'}}></Select>
+                    </Form.Item>
+
+                    <Form.Item
+                        label="客运量(万人)"
+                        name="trafficVolume"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/passengerFlowAnalysis/rankingOfPassengerVolume/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 139 - 0
src/pages/passengerFlowAnalysis/rankingOfPassengerVolume/rankingOfPassengerVolume.jsx

@@ -0,0 +1,139 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./rankingOfPassengerVolume.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function RankingOfPassengerVolume() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+// 线路下拉框
+    const [option, setOption] = useState([])
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/trafficAnalysis/getTrafficFlowRank")
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    /**
+     * 线路数据请求
+     * @returns {Promise<void>}
+     */
+    async function getLineData() {
+
+        let {data} = await axios.get('/busLine/getList')
+        let option = data.map(item => {
+            return {
+                label: item.lineName,
+                value: item.lineId,
+            }
+
+        })
+
+        setOption(option)
+
+    }
+
+    useEffect(() => {
+        getData()
+        getLineData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增客运量排名
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="线路" dataIndex="lineName" key="id"></Column>
+                <Column title="客运量(万人)" dataIndex="trafficVolume" key="id"></Column>
+
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/trafficAnalysisEdit/delTrafficFlowRank' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+                option={option}
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/passengerFlowAnalysis/rankingOfPassengerVolume/rankingOfPassengerVolume.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 118 - 0
src/pages/passengerFlowAnalysis/regionalPassengerFlow/components/modal.jsx

@@ -0,0 +1,118 @@
+import {Form, Input, InputNumber, message, Modal,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/trafficAnalysisEdit/editTrafficAreaFlow', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="区域"
+                        name="area"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Input style={{width: '100%'}}></Input>
+                    </Form.Item>
+                    <Form.Item
+                        label="总数(万人)"
+                        name="total"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/passengerFlowAnalysis/regionalPassengerFlow/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 118 - 0
src/pages/passengerFlowAnalysis/regionalPassengerFlow/regionalPassengerFlow.jsx

@@ -0,0 +1,118 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./regionalPassengerFlow.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function RegionalPassengerFlow() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/trafficAnalysis/getTrafficAreaFlow");
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增区域客流
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="区域" dataIndex="area" key="id"></Column>
+                <Column title="总数(万人)" dataIndex="total" key="id"></Column>
+
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/trafficAnalysisEdit/delTrafficAreaFlow' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/passengerFlowAnalysis/regionalPassengerFlow/regionalPassengerFlow.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 117 - 0
src/pages/passengerFlowAnalysis/replacementFrequency/components/modal.jsx

@@ -0,0 +1,117 @@
+import {Form, Input, InputNumber, message, Modal,} from 'antd';
+import axios from '@/utils/axios.js'
+import {useEffect} from 'react'
+import './modal.scss'
+
+
+export default function ModalHooks({isModalOpen, closeModal, row}) {
+    const [messageApi, contextHolder] = message.useMessage();
+    // 表单
+    const [form] = Form.useForm();
+    // 下拉框数值
+    let passengerOption = [
+        {value: 1, label: '行驶中'},
+        {value: 2, label: '维保'},
+        {value: 3, label: '固定包车'},
+        {value: 4, label: '临时包车'},
+        {value: 5, label: '充电'},
+        {value: 6, label: '公务'},
+
+    ]
+    //状态下拉框
+    const status = [
+        {value: 1, label: '运营'},
+        {value: 2, label: '非运营'},
+    ]
+
+    /**
+     *确定时候的回调
+     */
+    function handleOk() {
+        // 验证表单
+        form.validateFields().then(async () => {
+            let formData = JSON.parse(JSON.stringify(form.getFieldsValue()))
+            if (row?.id) {
+                // 修改数据
+                formData.id = row.id
+            }
+            let {code, message} = await axios.post('/trafficAnalysisEdit/editTrafficTransferProportion', [formData])
+            if (code === 200) {
+                messageApi.success(message)
+                handleCancel()
+            } else {
+                messageApi.error(message)
+            }
+        })
+    }
+
+    // 关闭页面
+    const handleCancel = () => {
+        closeModal(false);
+        form.resetFields()
+    };
+    // 表单
+    useEffect(() => {
+        if (row.id) {
+            let formData = JSON.parse(JSON.stringify(row))
+            form.setFieldsValue(formData)
+
+        }
+    }, [row])
+
+
+    return (
+        <div className="form">
+
+            {contextHolder}
+            <Modal title={row?.id ? '修改数据' : '新增数据'} open={isModalOpen} onOk={handleOk} onCancel={handleCancel}
+                   width={900}
+                   cancelText="取消" okText="确定">
+                <Form
+                    name="statics"
+                    form={form}
+                    wrapperCol={
+                        {span: 30, offset: 0}
+                    }
+                    layout='inline'
+                    initialValues={{
+                        remember: true,
+                    }}
+
+                    autoComplete="off"
+                >
+                    <Form.Item
+                        label="换乘次数类型"
+                        name="transferType"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+
+                    >
+                        <Input style={{width: '100%'}}></Input>
+                    </Form.Item>
+                    <Form.Item
+                        label="人次(万人)"
+                        name="number"
+                        rules={[
+                            {
+                                required: true,
+                                message: '请输入',
+                            },
+                        ]}
+                    >
+                        <InputNumber style={{width: '100%'}}></InputNumber>
+                    </Form.Item>
+
+
+                </Form>
+
+            </Modal>
+        </div>
+    )
+
+
+}

+ 9 - 0
src/pages/passengerFlowAnalysis/replacementFrequency/components/modal.scss

@@ -0,0 +1,9 @@
+#statics {
+  .ant-form-item{
+    width: 45%;
+    margin-bottom: 10px;
+    .ant-form-item-label{
+      width: 120px;
+    }
+  }
+}

+ 118 - 0
src/pages/passengerFlowAnalysis/replacementFrequency/replacementFrequency.jsx

@@ -0,0 +1,118 @@
+import {Button, Table} from "antd";
+import {useEffect, useState} from "react";
+import ModalHooks from "./components/modal.jsx";
+import "./replacementFrequency.scss";
+import axios from "@/utils/axios.js";
+import DeleteButton from "@/components/delete.jsx";
+
+const {Column} = Table;
+
+export default function ReplacementFrequency() {
+    // 页面数据
+    const [data, setData] = useState([]);
+    // 是否展示弹框
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    // 一行的数据
+
+    const [row, setRow] = useState({});
+    // 设置下拉框绑定的值
+    const [val, setVal] = useState('')
+
+
+    // 新增用户页面
+    function addUser() {
+        setRow([]);
+        setIsModalOpen(true);
+    }
+
+    // 关闭页面
+    function closeModal() {
+        setIsModalOpen(false);
+        getData()
+    }
+
+    // 点击修改的回调
+    function modify(data) {
+        setRow(data);
+        setIsModalOpen(true);
+
+    }
+
+
+    // 获取数据
+    async function getData() {
+
+        let {data} = await axios.get("/trafficAnalysis/getTrafficTransferProportion")
+
+        setData(data);
+
+    }
+
+    // 设置类型文字
+    function setType(text) {
+        switch (text) {
+            case 1:
+                return "行驶中";
+            case 2:
+                return "维保";
+            case 3:
+                return "固定包车";
+            case 4:
+                return "临时包车";
+            case 5:
+                return "充电";
+            case 6:
+                return "公务";
+
+        }
+    }
+
+    useEffect(() => {
+        getData()
+    }, [])
+    return (
+        <div className="passenger">
+            <div className="top">
+
+                <div className="button">
+                    <Button type="primary" onClick={addUser}>
+                        新增换乘次数
+                    </Button>
+                </div>
+            </div>
+            <Table
+                dataSource={data}
+                bordered={true}
+                rowKey="id"
+                pagination={false}
+            >
+                <Column title="换乘次数类型" dataIndex="transferType" key="id"></Column>
+                <Column title="人次(万人)" dataIndex="number" key="id"></Column>
+
+
+                <Column
+                    title="操作"
+                    width="170px"
+                    dataIndex="id"
+                    key="id"
+                    render={(text, record) => (
+                        <div className="btn">
+                            <Button type="primary" onClick={() => modify(record)}>
+                                修改
+                            </Button>
+                            <DeleteButton url='/trafficAnalysisEdit/delTrafficTransferProportion' id={text}
+                                          getData={getData}></DeleteButton>
+                        </div>
+                    )}
+                />
+            </Table>
+            <ModalHooks
+                isModalOpen={isModalOpen}
+                closeModal={closeModal}
+                row={row}
+
+                val={val}
+            ></ModalHooks>
+        </div>
+    );
+}

+ 26 - 0
src/pages/passengerFlowAnalysis/replacementFrequency/replacementFrequency.scss

@@ -0,0 +1,26 @@
+.passenger{
+  width: 100%;
+  height: 100%;
+  .top{
+    display: flex;
+    justify-content: flex-end;
+    margin-bottom: 5px;
+    .input{
+      display: flex;
+      button{
+        margin-left: 10px;
+      }
+    }
+  }
+  .btn{
+    display: flex;
+    justify-content: space-between;
+  }
+
+}
+#basic{
+
+.ant-form-item{
+  margin-bottom: 20px;
+}
+}

+ 2 - 2
src/pages/settingPageChild/user/user.jsx

@@ -16,7 +16,7 @@ export default function User() {
     // 当前页数
     // 当前页数
     const [current,setCurrent] =useState(1)
     const [current,setCurrent] =useState(1)
     // 每页条数
     // 每页条数
-    const pageSize=15
+    const pageSize=10
     // 总条数
     // 总条数
     let [total,setTotal] = useState(0)
     let [total,setTotal] = useState(0)
     // 新增用户页面
     // 新增用户页面
@@ -55,7 +55,7 @@ export default function User() {
             await getData()
             await getData()
         }
         }
     }
     }
-
+    // 修改页面
     function changeSize(e){
     function changeSize(e){
 
 
         setCurrent(e)
         setCurrent(e)

+ 2 - 2
src/utils/axios.js

@@ -10,7 +10,7 @@ axios.interceptors.request.use(
             let satoken = JSON.parse(user)?.satoken || ''
             let satoken = JSON.parse(user)?.satoken || ''
             // console.log(satoken)
             // console.log(satoken)
             if (!satoken) {
             if (!satoken) {
-                window.location.href = '/login'
+                window.location.href = '/#/login'
             }
             }
             headers.satoken = satoken
             headers.satoken = satoken
         }
         }
@@ -30,7 +30,7 @@ axios.interceptors.response.use(
             message.error(data.message)
             message.error(data.message)
             if (data.code === 100) {
             if (data.code === 100) {
                 localStorage.removeItem('user')
                 localStorage.removeItem('user')
-                window.location.href = '/login'
+                window.location.href = '/#/login'
             }
             }
         } else {
         } else {