Browse Source

fix():bug修改

tags/PMS_Frontend_v1.0.5-develop
xingjx 1 year ago
parent
commit
0c3c914876
  1. BIN
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/blue.png
  2. BIN
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/green.png
  3. 6
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/index.jsx
  4. 278
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/index.scss
  5. 760
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/loadable.jsx
  6. BIN
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/red.png
  7. 5
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/index.jsx
  8. 304
      src/pages/OperationCenter/UserMgm/UserTag/index.scss
  9. 231
      src/pages/OperationCenter/UserMgm/UserTag/loadable.jsx
  10. 8
      src/pages/OutRoadMgm/OutSegmentMgm/OutSegment/AddParking.jsx
  11. 6
      src/pages/OutRoadMgm/OutSegmentMgm/OutSegment/ConfigParking/BusinessParameterConfig.jsx
  12. 1
      src/pages/OutRoadMgm/OutSegmentMgm/OutSegment/loadable.jsx
  13. 6
      src/router/router.config.js
  14. 10
      src/services/OperationCenter/UserMgm/index.js

BIN
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/blue.png

After

Width: 423  |  Height: 108  |  Size: 5.0 KiB

BIN
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/green.png

After

Width: 423  |  Height: 108  |  Size: 5.2 KiB

6
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/index.jsx

@ -0,0 +1,6 @@
import React from "react"
import loadable from "@loadable/component"
import { LoadingImg } from "@/components"
const ExceptionParkReportLoadable = loadable(() => import("./loadable"))
export default (pros) => <ExceptionParkReportLoadable {...pros} fallback={<LoadingImg />} />

278
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/index.scss

@ -0,0 +1,278 @@
@import "@/assets/css/mixin.scss";
$color-container-bg : var(--color-container-bg);
$color-user-list-bg : var(--color-user-list-bg);
$color-text : var(--color-text);
$color-primary : var(--color-primary);
.edit-order-inquiry {
display: flex;
padding-top: 10px;
width: 100%;
height: 100%;
overflow-y: auto;
@include scrollBar(var(--color-user-list-bg), #3B97FF);
.paid-search {
display: block;
width: 375px;
padding: 10px 10px 20px 20px;
.title {
width: 100%;
font-size: 16px;
font-family: Microsoft YaHei, Microsoft YaHei-Bold;
font-weight: 700;
text-align: left;
color: var(--color-text);
margin-bottom: 20px;
}
.form-Wrap {
height: calc(100% - 45px);
overflow-y: auto;
scrollbar-width: none;
-ms-overflow-style: none;
&::-webkit-scrollbar {
display: none;
}
}
.ant-select-selector,
.ant-picker,
.ant-input {
background-color: var(--color-search-list-item-bg) !important;
box-shadow: none !important;
color: var(--color-search-list-item-value);
border-color: var(--color-search-list-item-bd) !important;
}
.yisa-search {
width: 100%;
display: flex;
align-items: center;
margin-bottom: 24px;
label {
color: var(--color-search-list-item-text);
flex: 0 0 27%;
max-width: 27%;
text-align: right;
padding-right: 8px;
.daf {
display: inline-block;
}
}
.form-con {
flex: 1;
width: 220px;
}
}
.form-btn {
display: flex;
flex-flow: row nowrap;
justify-content: space-between;
margin: 40px 0px 0px;
padding: 0 3px;
.ant-btn+.ant-btn {
margin-left: 10px;
}
.ant-btn span {
font-size: 16px;
font-family: Microsoft YaHei, Microsoft YaHei-Regular;
font-weight: 400;
text-align: center;
color: #ffffff;
}
.reset {
width: 90px;
height: 36px;
background: var(--button-default-bg);
}
.submit {
width: calc(100% - 100px);
height: 36px;
}
}
}
.ant-btn+.ant-btn {
margin-left: 10px;
}
.green {
background-color: #67c23a;
border-color: #67c23a;
}
.period-result {
overflow: auto;
}
.paid-result {
width: calc(100% - 375px);
padding-bottom: 15px;
padding: 20px;
background: var(--color-user-list-bg);
border-top-left-radius: 20px;
box-shadow: 0px 3px 8px 0px rgba(0, 0, 0, 0.08);
.result {
@include flex-columns;
.result-box {
color: #ffffff;
background: #3e4557;
border-radius: 4px;
margin-bottom: 20px;
.result-box-title {
height: 21px;
font-size: 16px;
font-family: Microsoft YaHei, Microsoft YaHei-Bold;
font-weight: 700;
text-align: left;
margin: 18px 0 18px 18px;
display: inline-block;
}
i {
border: 1px solid;
border-radius: 22px;
display: inline-block;
text-align: center;
font-size: 12px;
width: 22px;
cursor: pointer;
}
.bhd-select {
float: right;
margin: 12px 28px;
}
.ant-table .ant-table-thead tr th {
background: #3e4557;
}
}
.row-head {
height: 32px;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 13px;
.number-wrapper {
display: inline-flex;
align-items: center;
font-size: 14px;
.letter {
color: var(--color-text);
font-size: 14px;
}
.total-number {
color: var(--color-primary);
font-weight: bold;
margin: 0 4px;
font-size: 14px;
}
}
}
.cc-result-flow {
width: 100%;
height: calc(100% - 34px - 13px);
.yisa-table {
width: 100%;
height: calc(100% - 32px - 15px);
overflow-y: auto !important;
@include scrollBar(var(--color-user-list-bg), #3B97FF);
.ant-table-thead {
th {
background: #616b83 !important;
}
}
.ant-table-tbody {
td {
background: #3E4557 !important;
border-bottom-color: var(--color-table-border-bottom-color);
}
tr:nth-child(even) {
td {
background: #3E4557 !important;
}
}
}
}
}
}
}
}
.modal-pay-configuration {
.submitBtn {
text-align: center;
margin: 20px 0 0;
.ant-btn {
width: 80px;
height: 35px;
border: none;
border-radius: 4px;
span {
color: #ffffff;
}
}
.submit {
background: #409eff;
}
.cancel {
background: var(--button-default-bg);
margin-left: 20px;
}
}
}
.edit-order-inquiry {
/*定义滚动条高宽及背景
高宽分别对应横竖滚动条的尺寸*/
::-webkit-scrollbar {
width: 6px;
height: 16px;
background-color: #5c5c5c;
}
/*定义滚动条轨道
内阴影+圆角*/
::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
border-radius: 10px;
background-color: #9da2ab;
}
/*定义滑块
内阴影+圆角*/
::-webkit-scrollbar-thumb {
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, .3);
background-color: #3b97ff;
}
}
.no-data-box {
text-align: center;
height: 100px;
line-height: 100px;
}

760
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/loadable.jsx

@ -0,0 +1,760 @@
import React, { useState, useEffect } from "react";
import { ResultFlowResult } from "@/components";
import { Select, Input, Button, Table, message, Pagination, DatePicker, Modal, Cascader, Tooltip } from "antd";
import { Icon, ResultFlow } from "@/components"
import { useSessionStorageState } from "ahooks";
import { lineChartOption, ringChartOption } from "../echarts.config";
import moment from "moment";
import ReactEcharts from "echarts-for-react";
import "./index.scss";
import ajax from "@/services";
//
function ParkingFalseAlarms() {
// session
const [defaultParams, setDefaultParams] = useSessionStorageState(
"formData_parkingAlyPeriod",
{ defaultValue: null }
);
//
const [areaList, setAreaList] = useState([]);
//
const defaultData = {
start_time: moment().subtract('days').startOf('day').format("YYYY-MM-DD"),
end_time: moment().endOf("day").format("YYYY-MM-DD"),
operator_id: '0',
area_id: '0',
car_parking_type: '3',
date_type: '1',
paytype: '0'
};
//
const [pageInfo, setPageInfo] = useState({
pn: defaultParams ? defaultParams?.pn : 1,
page_size: defaultParams ? defaultParams?.page_size : 15,
});
//
const [formData, setFormData] = useState({
...defaultData,
...defaultParams,
});
// -
const [holdData, setHoldData] = useState(formData);
// 访isAjax
const [isAjax, setIsAjax] = useState(false);
//
const [loading, setLoading] = useState(false);
//
const [tabLoading, setTabLoading] = useState(false);
//
const [resultData, setResultData] = useState({
total: 0,
list: [],
});
const [keyVal, setKeyVal] = useState()
//
const [revenueData, setRevenueData] = useState({});
//
const [parkData, setParkData] = useState({});
const [hourData, setHourData] = useState({});
const [searchSelectList, setSearchSelectList] = useState([]); //
const [sessionTabList, setSessionTabList] = useSessionStorageState('parkingAlyPeriod', {
value: {
}
})
useEffect(() => {
if (sessionTabList && Object.values(sessionTabList).length > 0) {
setFormData({
...formData, ...sessionTabList
})
getCheck({
...sessionTabList
})
} else {
getCheck()
}
}, [isAjax])
useEffect(() => {
setSessionTabList({
...formData
})
}, [formData])
useEffect(() => {
getSelectList();
}, []);
// 访
// useEffect(() => {
// getData();
// }, [isAjax]);
//
const TimeChange = () => {
let e = formData.date_type;
let str = "date";
let mat = "YYYY-MM-DD";
if (e == 4) {
str = "year";
mat = "YYYY";
} else if (e == 3) {
str = "month";
mat = "YYYY-MM";
} else if (e == 2) {
str = "week";
mat = "YYYY-MM-DD";
}
return { str, mat };
};
//
const SetTimeNow = (e) => {
let start = "";
let end = "";
if (e == 4) {
start = moment().format("YYYY");
end = moment().format("YYYY");
} else if (e == 3) {
start = moment().startOf('month').format("YYYY-MM-DD");
end = moment().endOf("month").format("YYYY-MM-DD");
} else if (e == 2) {
start = moment().day(1).format("YYYY-MM-DD");
end = moment().day(7).format("YYYY-MM-DD");
} else {
start = moment().startOf("day").format("YYYY-MM-DD");
end = moment().endOf("day").format("YYYY-MM-DD");
}
setFormData({
...formData,
date_type: e,
start_time: start,
end_time: end,
});
};
const columns = [
{
title: "序号",
dataIndex: "index",
key: "iindex",
align: "center",
fixed: "right",
render: (text, record, index) => index + 1,
},
{
title: "标签名称",
dataIndex: "name",
key: "name",
align: "center",
fixed: "right",
},
{
title: "人数(人)",
dataIndex: "nums",
key: "nums",
align: "center",
fixed: "right",
},
{
title: "标签描述",
dataIndex: "describe",
key: "describe",
align: "center",
fixed: "right",
},
{
title: "创建人",
dataIndex: "edit_name",
key: "edit_name",
align: "center",
fixed: "right",
},
{
title: "操作日期",
dataIndex: "time",
key: "time",
align: "center",
fixed: "right",
},
{
title: "操作",
dataIndex: "operation",
key: "operation",
align: "center",
fixed: "right",
render: (_, record, index) => {
return (
<div className="popover-content">
<div>
<a
onClick={() => {
searchDetail({ id: record.id });
setMyId(record.id)
setIndexBy(index);
setTag('2')
}}
>
查看
</a>
</div>
</div>
);
},
},
];
// 线
const getRevenueOption = (data) => {
if (!data || data.length <= 0) {
setRevenueData({})
return
}
const areaNames = data[0].name ? [...new Set(data.map((item) => item.name))] : ['出场车次', '入场车次'];
//
const dates = [...new Set(data.map((item) => item.hour))].sort(
(a, b) => a.hour - b.hour
);
//
const seriesData = areaNames.map((areaName, index) => {
//
const areaData = data[0].name ? data.filter((item) => item.name === areaName) : data
//
return {
name: areaNames.length > 1 ? areaName : '',
type: "line",
itemStyle: {
label: {
show: true, //
position: 'top', //
color: 'white',//
fontSize: 10//
},
},
data: dates.map((item) => {
for (const { hour, total_in_records, total_out_records } of areaData) {
if (hour === item) return index == 1 ? total_in_records : total_out_records;
}
return 0;
}),
};
});
// X
const xAxisData = dates.map((date) => {
return {
value: date,
align: "center",
lineStyle: {
color: "skyblue", // 线
shadowBlur: 6,
},
};
});
let tooltip = {
formatter: (params) => {
var str = "";
str = params[0].axisValue.match(/(\S*):/) ? params[0].axisValue.match(/(\S*):/) : params[0].axisValue
str = str[1] ? str[1] + ':59时' : str
return `<div class="tooltip-box">
${params[0].axisValue}-${str}<br/>
出场次数${params[0].data}()<br/>
入场次数${params[1].data}()
</div>`
}
}
setRevenueData({ ...lineChartOption(areaNames, xAxisData, "车次数(个)", seriesData), ...tooltip });
};
// 线
const getParkOption = (data) => {
if (!data || data.length <= 0) {
setParkData({})
return
}
let areaNames = data[0].charge_type_name ? [...new Set(data.map((item) => item.charge_type_name))] : [''];
// areaNames = [...new Set(areaNames.map((item) => item.hour))].sort(
// (a, b) => a.date - b.hour
// );
//
let dates = [...new Set(data.map((item) => item.hour))].sort(
(a, b) => a.hour - b.hour
);
//
let seriesData = areaNames.map((areaName, index) => {
//
let areaData = data[0].charge_type_name ? data.filter((item) => item.charge_type_name === areaName) : data
//
return {
name: areaName,
type: "line",
itemStyle: {
label: {
show: true, //
position: 'top', //
color: 'white',//
fontSize: 10//
},
},
data: dates.map((item) => {
for (var { hour, occupancy_rate } of areaData) {
if (hour === item) return parseFloat(occupancy_rate);
}
return 0;
}),
};
});
// X
let xAxisData = dates.map((date) => {
return {
value: date,
align: "center",
lineStyle: {
color: "skyblue", // 线
shadowBlur: 6,
},
};
});
setParkData(lineChartOption(areaNames, xAxisData, "饱和度", seriesData, areaNames));
};
const randerColor = () => {
let arr = [];
this.alarmTypeLine.forEach(item => {
random(arr)
})
return arr;
}
const random = (arr) => {
let color = 'rgb(' + [
Math.round(Math.random() * 255),
Math.round(Math.random() * 255),
Math.round(Math.random() * 255)
].join(',') + ')';
if (!arr.some(i => i == color)) {
arr.push(color)
} else {
this.random(arr)
}
}
const color = ['#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de', '#fc8452', '#3ba272', '#9a60b4', '#ee7ccc']
// 线 hour
const getParkOptionHour = (data) => {
console.log(data)
if (!data || data.length <= 0) {
setHourData({})
return
}
let areaNames = data[0].date ? [...new Set(data.map((item) => item.date))].sort() : [''];
//
let dates = [...new Set(data.map((item) => item.hour))].sort(
(a, b) => a.hour - b.hour
);
//
let seriesData = areaNames.map((areaName, index) => {
let color2 = color[Math.round(Math.random() * 10)]
//
let areaData = data[0].date ? data.filter((item) => item.date === areaName) : data
//
return {
name: areaName,
type: "line",
itemStyle: {
label: {
show: true, //
position: 'top', //
color: 'white',//
fontSize: 10//
},
normal: {
color: color2, //线
lineStyle: {
color: color2,
}
//线
}
},
data: dates.map((item) => {
for (var { hour, occupancy_rate } of areaData) {
if (hour === item) return parseFloat(occupancy_rate);
}
return 0;
}),
};
});
// X
let xAxisData = dates.map((date) => {
return {
value: date,
align: "center",
lineStyle: {
color: "skyblue", // 线
shadowBlur: 6,
},
};
});
setHourData({ ...lineChartOption(areaNames, xAxisData, "饱和度", seriesData) });
};
function getParkingIncome(data) {
ajax
.getParkingAlyPeriodLine(data)
.then((res) => {
if (res.status === 20000) {
getRevenueOption(res.data.list);
setResultData(res.data)
}
})
.catch((err) => console.error(err));
}
function getParkingData(data) {
setLoading(true)
setHourData({})
ajax
.getParkingAlyPeriodParkLine(data)
.then((res) => {
if (res.status === 20000) {
getParkOption(res.data.list?.area_list);
setKeyVal(res.data.list?.hour_list.length)
//setHourData({})
getParkOptionHour(res.data.list?.hour_list);
setLoading(false)
}
})
.catch((err) => console.error(err));
}
//
const getSelectList = () => {
ajax.getOperator().then((e) => {
setSearchSelectList([
...searchSelectList,
...e.data
])
})
};
//
const getCheck = (v) => {
let postData = { ...formData };
if (!loading) {
postData = { ...holdData };
}
setDefaultParams({ ...postData, ...pageInfo });
if (moment(formData.end_time) - moment(formData.start_time) > 1000 * 31 * 24 * 3600) {
message.error("时间范围限制为31天!")
setLoading(false);
setTabLoading(false);
return
}
setLoading(false);
setTabLoading(false);
let params = { ...postData, ...v, ...pageInfo }
//
getParkingIncome(params)
getParkingData(params)
};
//
const handleSearch = () => {
setLoading(true);
setPageInfo({ ...pageInfo, ...{ pn: 1 } });
setHoldData(formData);
setIsAjax(!isAjax);
};
//
const handleExport = () => {
if (tableData.list.area_list?.length > 0) {
let { pn, page_size, ...params } = defaultParams;
ajax.getParkingAlyDurationParkingExp(defaultParams).then(
(res) => {
if (res) {
window.open(res.data.export_url)
} else {
message.error(res?.message);
}
},
(err) => {
console.log(err);
}
);
} else {
message.error("暂无数据");
}
};
// useEffect(() => {
// getParkingIncome();
// }, []);
//
useEffect(() => {
ajax
.getAreaTree()
.then((res) => {
if (res.status === 20000) {
setAreaList(res.data);
}
})
.catch((err) => {
console.error(err);
});
}, []);
return (
<>
<div className="edit-order-inquiry">
<div className="paid-search">
<div className="title">查询条件</div>
<div className="form-Wrap">
<div className="yisa-search">
<label>设备类型</label>
<Select
className="form-con"
placeholder="请选择"
//options={searchSelectList || []}
value={formData.device_code}
onChange={(v) =>
setFormData({ ...formData, device_code: v })
}
/>
</div>
<div className="yisa-search">
<label>设备名称</label>
<Input
className="form-con"
placeholder="请输入"
value={formData?.device_name}
onChange={(e) =>
setFormData({ ...formData, device_name: e.target.value })
}
/>
</div>
<div className="yisa-search">
<label>设备编号</label>
<Input
className="form-con"
placeholder="请输入"
value={formData?.device_code}
onChange={(e) =>
setFormData({ ...formData, device_code: e.target.value })
}
/>
</div>
<div className="yisa-search">
<label>所属路段</label>
<Input
className="form-con"
placeholder="请输入"
value={formData?.road_name}
onChange={(e) =>
setFormData({ ...formData, road_name: e.target.value })
}
/>
</div>
<div className="yisa-search">
<label>商户名称</label>
<Select
className="form-con"
placeholder="请选择"
//options={searchSelectList || []}
value={formData.operator_id}
onChange={(v) =>
setFormData({ ...formData, operator_id: v })
}
/>
</div>
<div className="yisa-search">
<label>日期
{/* <div className="daf">
<Select
value={formData.date_type}
// style={{
// width: "100%",
// }}
placeholder="请选择"
options={[
{
value: "1",
label: "日",
},
{
value: "2",
label: "周",
},
{
value: "3",
label: "月",
},
]}
onChange={(e) => SetTimeNow(e)}
/>
</div> */}
</label>
<DatePicker
style={{ width: "100%" }}
// showTime
format={TimeChange().mat}
picker={TimeChange().str}
allowClear={false}
value={formData.start_time ? moment(formData.start_time) : null}
onChange={(date, dateString) => {
if (TimeChange().str == "week") {
setFormData({
...formData,
start_time: date
? moment(date).day(1).format("YYYY-MM-DD")
: null,
});
} else if (TimeChange().str == "day") {
if (date > moment(formData.end_time)) {
setFormData({
...formData,
end_time: dateString,
start_time: formData.end_time,
});
} else {
setFormData({
...formData,
start_time: dateString,
});
}
} else if (TimeChange().str == "month") {
setFormData({ ...formData, start_time: moment(date).format("YYYY-MM-DD"), end_time: moment(date).endOf("month").format("YYYY-MM-DD") });
} else {
setFormData({ ...formData, start_time: dateString });
}
}}
disabledDate={(current) => current > moment(formData.end_time)}
/>
</div>
<div className="yisa-search">
<label></label>
<DatePicker
style={{ width: "100%" }}
// showTime
format={TimeChange().mat}
picker={TimeChange().str}
allowClear={false}
value={formData.end_time ? moment(formData.end_time) : null}
onChange={(date, dateString) => {
if (TimeChange().str == "week") {
setFormData({
...formData,
end_time: date
? moment(date).day(7).format("YYYY-MM-DD")
: null,
});
} else if (TimeChange().str == "day") {
if (date < moment(formData.start_time)) {
setFormData({
...formData,
start_time: dateString,
end_time: formData.start_time,
});
} else {
setFormData({
...formData,
end_time: dateString,
});
}
} else if (TimeChange().str == "month") {
setFormData({ ...formData, start_time: moment(date).startOf('month').format("YYYY-MM-DD"), end_time: moment(date).format("YYYY-MM-DD") });
} else {
setFormData({ ...formData, end_time: dateString });
}
}}
disabledDate={(current) =>
current < moment(formData.start_time)
}
/>
</div>
<div className="form-btn">
<Button
className="reset"
onClick={() => setFormData(defaultData)}
>
重置
</Button>
<Button
className="submit"
type="primary"
onClick={handleSearch}
loading={loading}
>
查询
</Button>
</div>
</div>
</div>
<div className="paid-result period-result">
<div className="result">
<div className="result-box">
<div className="result-box-title">误报情况结果详情</div>
<ResultFlow
hasLoad={true}
loading={loading}
resultData={resultData}
message={"暂无数据"}
>
<div className="table-wrap">
<Table
columns={columns}
dataSource={resultData.list}
pagination={false}
scroll={{ y: 400 }}
/>
</div>
{/* <div>
<Pagination
className="pagination-common"
showSizeChanger={true}
showQuickJumper={true}
//showTotal={() => ` ${total} `}
total={detailTotal}
current={pageData.pn}
pageSize={pageData.length}
pageSizeOptions={dictionary?.pageSizeOptions}
onChange={onShowSizeChange}
onShowSizeChange={onShowSizeChange}
/>
</div> */}
</ResultFlow>
</div>
<div className="result-box">
<div className="result-box-title">误报情况分析</div>
<div className="result-hd">
<div className="result-header rea">
<div className="result-icon"><Icon type="shijian" /></div>
<div className="result-content">
<div className="title">停车高峰时段</div>
<div className="time">{resultData.peak_hours || "--"}</div>
</div>
</div>
<div className="result-header reb">
<div className="result-icon"><Icon type="shijian" /></div>
<div className="result-content">
<div className="title">入场压力时段</div>
<div className="time">{resultData.entry_pressure_hours || "--"}</div>
</div>
</div>
<div className="result-header rec">
<div className="result-icon"><Icon type="shijian" /></div>
<div className="result-content">
<div className="title">出场压力时段</div>
<div className="time">{resultData.exit_pressure_hours || "--"}</div>
</div>
</div>
</div>
{hourData.series ?
<ReactEcharts
key={keyVal}
option={hourData}
style={{ height: "300px", width: "72%", overflow: "hidden", background: '#545d74' ,marginLeft:'350px'}}
/> :
<div className="no-data-box">{loading ? "加载中" : "暂无数据"}</div>
}
</div>
</div>
</div>
</div>
</>
);
}
export default ParkingFalseAlarms;

BIN
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingFalseAlarms/red.png

After

Width: 423  |  Height: 108  |  Size: 5.1 KiB

5
src/pages/DataAnalysisPrediction/ParkingBusinessAly/index.jsx

@ -9,7 +9,7 @@ import ParkingLiveData from "./ParkingLiveData"
import ParkTurnoverAly from "./ParkTurnoverAly"
import ParkUsageAly from "./ParkUsageAly"
import TemporaryParkStat from "./TemporaryParkStat"
import ParkingFalseAlarms from "./ParkingFalseAlarms"
export default {
CarTypeAly,
NightParkStat,
@ -21,5 +21,6 @@ export default {
ParkingLiveData,
ParkTurnoverAly,
ParkUsageAly,
TemporaryParkStat
TemporaryParkStat,
ParkingFalseAlarms
}

304
src/pages/OperationCenter/UserMgm/UserTag/index.scss

@ -2,104 +2,234 @@
.user-tag-box {
.push-back {
position: relative;
border: 1px solid;
border-radius: 5px;
margin: 0 10px;
margin-left: 95%;
height: 35px;
line-height: 35px;
text-align: center;
background: #ffffff;
color: #000000;
font-weight: 100;
cursor: pointer;
}
.search-box {
width: 100%;
padding: 20px;
height: calc(100% - 10px);
background: var(--color-user-list-bg);
border-top-left-radius: 20px;
box-shadow: 0px 3px 8px 0px rgb(0 0 0 / 8%);
margin-top: 10px;
.title {
position: relative;
border: 1px solid;
border-radius: 5px;
margin: 0 10px;
margin-left: 95%;
height: 35px;
line-height: 35px;
text-align: center;
background: #ffffff;
color: #000000;
font-weight: 100;
cursor: pointer;
}
.search-box {
width: 100%;
padding: 20px;
height: calc(100% - 10px);
background: var(--color-user-list-bg);
border-top-left-radius: 20px;
box-shadow: 0px 3px 8px 0px rgb(0 0 0 / 8%);
margin-top: 10px;
.title {
display: inline-block;
margin-right: 80px;
.value {
display: inline-block;
margin-right:80px;
.value {
display: inline-block;
font-weight: 800;
font-weight: 800;
}
}
.btn-box {
display: inline-block;
.search-btn {
margin: 0 10px;
}
}
}
.result-box {
width: 100%;
height: 600px;
.table-wrap {
height: calc(100% - 32px - 65px);
}
.ant-tabs {
margin-bottom: 16px;
.ant-tabs-nav {
margin-bottom: 0 !important;
&::before {
border-bottom: 1px solid var(--color-card-line) !important;
}
}
.btn-box {
display: inline-block;
.search-btn {
margin: 0 10px;
.ant-tabs-nav-wrap {
width: 100%;
box-sizing: content-box;
.ant-tabs-nav-list {
width: 340px;
.ant-tabs-ink-bar {
height: 3px;
background-color: #00ccff;
}
.ant-tabs-tab {
flex: 1;
width: 100%;
display: flex;
justify-content: center;
padding-bottom: 10px;
text-align: center;
cursor: pointer;
font-size: 14px !important;
font-family: MicrosoftYaHei;
text-align: center;
letter-spacing: 0.7px;
}
.ant-tabs-tab-active {
div {
color: #00ccff;
}
}
}
}
}
.result-box {
.pop-card {
display: flex;
flex-direction: row;
}
}
}
.user-tag-modal {
.ltc-box {
width: 100%;
.ltc-box-title {
font-size: 18px;
font-weight: bolder;
width: 100%;
height: 600px;
.table-wrap {
height: calc(100% - 32px - 65px);
white-space: nowrap;
overflow: hidden;
.text {
display: inline-block;
}
.ant-tabs {
margin-bottom: 16px;
.ant-tabs-nav {
margin-bottom: 0 !important;
&::before {
border-bottom: 1px solid var(--color-card-line) !important;
}
.line {
display: inline-block;
border: 1px dotted #607092;
width: inherit;
margin-bottom: 6px;
}
.ltc-icon {
width: 5px;
background: #0080db;
height: 19px;
display: inline-block;
margin-right: 10px;
}
.ltc-btn {
display: inline-block;
border: 1px solid;
border-radius: 5px;
margin: 0 10px;
width: 60px;
height: 35px;
line-height: 35px;
text-align: center;
background: #409eff;
color: #fff;
font-weight: 100;
cursor: pointer;
}
.ltc-cancel {
background: #fff;
color: #000;
}
}
.ltc-box-line {
border: 1px solid #e7e7e7;
margin: 8px 0;
}
.ltc-box-in {
margin-left: 20px;
.ant-descriptions {
margin-left: 20px;
}
}
.ltc-title {
margin: auto;
width: 50%;
text-align: center;
font-size: 18px;
font-weight: 600;
}
.ltc-content {
margin: auto;
padding: 20px;
.ltc-item {
font-size: 14px;
margin: 6px 12px 6px 0;
display: inline-flex;
//width: 470px;
.new-item {
display: inline-block;
width: 120px;
height: 32px;
line-height: 32px;
background: rgba(150, 161, 192, 0.24);
text-align: center;
}
.ant-tabs-nav-wrap {
width: 100%;
box-sizing: content-box;
.ant-tabs-nav-list {
width: 340px;
.ant-tabs-ink-bar {
height: 3px;
background-color: #00ccff;
}
.ant-tabs-tab {
flex: 1;
width: 100%;
display: flex;
justify-content: center;
padding-bottom: 10px;
text-align: center;
cursor: pointer;
font-size: 14px !important;
font-family: MicrosoftYaHei;
text-align: center;
letter-spacing: 0.7px;
}
.ant-tabs-tab-active {
div {
color: #00ccff;
}
}
}
.new-value {
display: inline-block;
width: 320px;
height: 32px;
line-height: 32px;
text-align: center;
background: #3E4557;
box-shadow: 0px 3px 8px 0px rgba(0, 0, 0, 0.12);
}
.ltc-item-input {
display: inline-block;
width: 200px;
}
div {
width: 150px;
}
}
.ltc-item-img {
width: 540px;
height: 300px;
border: 1px solid;
background: rgb(69 77 97);
margin-right: 20px !important;
.pop-card {
display: flex;
flex-direction: row;
img {
width: 100%;
height: 100%;
object-fit: contain;
}
}
}
}
}
}

231
src/pages/OperationCenter/UserMgm/UserTag/loadable.jsx

@ -20,8 +20,11 @@ import "./index.scss";
function UserTag() {
const [resultData, setResultData] = useState([])
const [detailData, setDetailData] = useState([])
const [myId, setMyId] = useState([])
const [indexBy, setIndexBy] = useState()
const [indexTo, setIndexTo] = useState()
const [total, setTotal] = useState(0);
const [detailTotal, setDetailTotal] = useState(0);
const [tag, setTag] = useState('1');
const [loading, setLoading] = useState(false);
const [visible, setVisible] = useState(false);
@ -29,12 +32,12 @@ function UserTag() {
const [pageData, setPageData] = useState({
//
pn: 1,
page_size: 15,
length: 15,
});
function onShowSizeChange(pn, page_size) {
function onShowSizeChange(pn, length) {
setPageData({
pn,
page_size,
length,
});
}
const columns = [
@ -87,13 +90,15 @@ function UserTag() {
key: "operation",
align: "center",
fixed: "right",
render: (_, record,index) => {
render: (_, record, index) => {
return (
<div className="popover-content">
<div>
<a
onClick={() => {
setIndexBy(index)
searchDetail({ id: record.id });
setMyId(record.id)
setIndexBy(index);
setTag('2')
}}
>
@ -117,59 +122,75 @@ function UserTag() {
},
{
title: "用户ID",
dataIndex: "name",
key: "name",
dataIndex: "id",
key: "id",
align: "center",
fixed: "right",
render: (text) => (
<>
<a onClick={() => {
navigator.clipboard.writeText(`${text}`).then(() => { message.success("已复制到剪切板") });
}}>{text}</a>
</>
),
},
{
title: "手机号",
dataIndex: "nums",
key: "nums",
dataIndex: "mobile",
key: "mobile",
align: "center",
fixed: "right",
},
{
title: "昵称",
dataIndex: "describe",
key: "describe",
dataIndex: "name",
key: "name",
align: "center",
fixed: "right",
},
{
title: "性别",
dataIndex: "edit_name",
key: "edit_name",
dataIndex: "sex",
key: "sex",
align: "center",
fixed: "right",
},
{
title: "余额(元)",
dataIndex: "time",
key: "time",
dataIndex: "balance",
key: "balance",
align: "center",
fixed: "right",
},
{
title: "注册日期",
dataIndex: "time",
key: "time",
dataIndex: "create_time",
key: "create_time",
align: "center",
fixed: "right",
},
{
title: "绑定车牌",
dataIndex: "time",
key: "time",
dataIndex: "plate",
key: "plate",
align: "center",
fixed: "right",
},
{
title: "身份认证",
dataIndex: "time",
key: "time",
dataIndex: "authState",
key: "authState",
align: "center",
fixed: "right",
render: (text, record, index) => {
return (
<div>
{
text == 0 ? <span style={{ color: "red" }}>未认证</span> : <span style={{ color: "green" }}>已认证</span>
}
</div>
);
},
},
{
title: "操作",
@ -177,15 +198,11 @@ function UserTag() {
key: "operation",
align: "center",
fixed: "right",
render: (_, record) => {
render: (_, record, index) => {
return (
<div className="popover-content">
<div>
<a
onClick={() => {
}}
>
<a onClick={() => { setIndexTo(index); setVisible(true) }}>
详情
</a>
</div>
@ -194,30 +211,6 @@ function UserTag() {
},
},
];
const detailColumns = [
{
title: "使用时间",
dataIndex: "ave",
key: "avera",
align: "center",
fixed: "right",
},
{
title: "内容",
dataIndex: "re",
key: "rec",
align: "center",
fixed: "right",
},
{
title: "消耗",
dataIndex: "av",
key: "ave",
align: "center",
fixed: "right",
},
];
//
const formSearch = [
{
@ -252,20 +245,65 @@ function UserTag() {
}
})
}
//
const getSelectList = () => {
ajax.getOperator().then((e) => {
setSearchSelectList([
...searchSelectList,
...e.data
])
//
function searchDetail(e) {
ajax.getUserLabelList({ ...pageData, ...e }).then((res) => {
let { status, data, total } = res
if (status == 20000) {
if (data.list) {
setDetailData(data.list)
setDetailTotal(data.total_records)
} else {
setDetailData(data)
setDetailTotal(total)
}
} else {
setDetailData([])
message.error(res.message)
}
})
};
}
//
const tkddModal = <div className="ltc-box">
<div className="ltc-content">
<div className="ltc-item">
<div className="new-item">用户ID</div><div className="new-value">{detailData[indexTo]?.id || "--"}</div>
</div>
<div className="ltc-item">
<div className="new-item">手机号</div><div className="new-value">{detailData[indexTo]?.mobile || "--"}</div>
</div>
<div className="ltc-item">
<div className="new-item">昵称</div><div className="new-value">{detailData[indexTo]?.name || "--"}</div>
</div>
<div className="ltc-item">
<div className="new-item">性别</div><div className="new-value">{detailData[indexTo]?.sex || "--"}</div>
</div>
<div className="ltc-item">
<div className="new-item">余额</div><div className="new-value">{detailData[indexTo]?.balance || "--"}</div>
</div>
<div className="ltc-item">
<div className="new-item">注册日期</div><div className="new-value">{detailData[indexTo]?.create_time || "--"}</div>
</div>
<div className="ltc-item">
<div className="new-item">绑定车牌</div><div className="new-value">{detailData[indexTo]?.plate || "--"}</div>
</div>
<div className="ltc-item">
<div className="new-item">身份认证</div><div className="new-value">{detailData[indexTo]?.authState || "--"}</div>
</div>
</div>
<div className="ltc-content">
<div className="ltc-item ltc-item-img">
<img src={detailData[indexTo]?.authImg1 || require("../../../../../src/assets/images/error-img.png")} onClick={() => { setBigPic(resultData[indexby].vehicle_travel_license_img1); setBigpicVisible(true) }} />
</div>
<div className="ltc-item ltc-item-img">
<img src={detailData[indexTo]?.authImg2 || require("../../../../../src/assets/images/error-img.png")} onClick={() => { setBigPic(resultData[indexby].vehicle_travel_license_img2); setBigpicVisible(true) }} />
</div>
</div>
</div>
useEffect(() => {
getSelectList();
}, []);
searchDetail({id:myId})
}, [pageData]);
return (
<>
@ -280,27 +318,6 @@ function UserTag() {
isExport={false}
rowKey={"id"}
initFormData={{}}
diyButton={
<>
<Button
type="primary"
style={{ width: '116px' }}
onClick={() => {
}}
>
积分规则配置
</Button>
<Button
type="primary"
style={{ width: '116px' }}
onClick={() => {
}}
>
积分兑换配置
</Button>
</>
}
pageName={'"userTag"'}
/>
:
@ -308,35 +325,29 @@ function UserTag() {
<div className="push-back" onClick={() => { setTag('1') }}>返回</div>
<div className="search-box">
<div className="title">标签名称:
<div className="value">{resultData[indexBy]?.name||"--"}</div>
<div className="value">{resultData[indexBy]?.name || "--"}</div>
</div>
<div className="title">人数:
<div className="value">
111
</div>
<div className="value">{resultData[indexBy]?.nums || "--"}</div>
</div>
<div className="title">创建人:
<div className="value">
111
</div>
<div className="value">{resultData[indexBy]?.edit_name || "--"}</div>
</div>
<div className="title">操作日期:
<div className="value">
111
</div>
<div className="value">{resultData[indexBy]?.time || "--"}</div>
</div>
</div>
<div className="result-box right-list">
<ResultFlow
hasLoad={true}
loading={loading}
resultData={resultData}
resultData={detailData}
message={"暂无数据"}
>
<div className="table-wrap">
<Table
columns={ckcolumns}
dataSource={resultData}
dataSource={detailData}
pagination={false}
// scroll={{ x: 1500 }}
/>
@ -347,9 +358,9 @@ function UserTag() {
showSizeChanger={true}
showQuickJumper={true}
//showTotal={() => ` ${total} `}
total={total}
total={detailTotal}
current={pageData.pn}
pageSize={pageData.page_size}
pageSize={pageData.length}
pageSizeOptions={dictionary?.pageSizeOptions}
onChange={onShowSizeChange}
onShowSizeChange={onShowSizeChange}
@ -361,26 +372,20 @@ function UserTag() {
}
<Modal
open={visible}
width={800}
title={'使用记录'}
className="eae-modal"
width={1500}
title={'详情'}
className="user-tag-modal"
onCancel={() => {
setVisible(false);
}}
onOk={() => { }}
footer={[
<Button key="back" onClick={() => {
setVisible(false);
}}>
关闭窗口
</Button>]}
>
<div>
<div className="eae-modal-item">
<Table
rowKey={(row) => row?.order_id || row?.id || row?.deal_record_id || Math.random() * 10000}
columns={detailColumns}
dataSource={detailData}
scroll={{ y: 670 }}
//loading={loading}
pagination={false}
/>
</div>
</div>
{tkddModal}
</Modal>
</>
)

8
src/pages/OutRoadMgm/OutSegmentMgm/OutSegment/AddParking.jsx

@ -242,10 +242,10 @@ function AddParking(props) {
message.error('车场泊位数必须为数字!')
return
}
if (topBerthNum && parseFloat(total_berth_number) < topBerthNum) {
message.error('下级车场泊位数与一级车场泊位数之和不超过泊位总数!此处总车场泊位数不超过' + topBerthNum)
//return
}
// if (topBerthNum && parseFloat(values.total_berth_number) < topBerthNum) {
// message.error('' + topBerthNum)
// //return
// }
const params = {
...values,
img: processImgData(fileList),

6
src/pages/OutRoadMgm/OutSegmentMgm/OutSegment/ConfigParking/BusinessParameterConfig.jsx

@ -1,5 +1,5 @@
import React, { useEffect, useState } from "react";
import { Button, Form, Radio, Input, Select, Row, Col, message } from "antd";
import { Button, Form, Radio, InputNumber, Select, Row, Col, message } from "antd";
import ajax from "@/services";
import "./BusinessParameterConfig.scss";
function BusinessParameterConfig(props) {
@ -16,7 +16,7 @@ function BusinessParameterConfig(props) {
ajax.getRoadServiceEdit(params).then((res) => {
if (res.status === 20000) {
message.success(res.message);
}else{
} else {
message.error("请填写完整!")
}
});
@ -125,7 +125,7 @@ function BusinessParameterConfig(props) {
</Col>
<Col span={12}>
<Form.Item label="场内缴费后免费离场时间" name="free_time">
<Input></Input>
<InputNumber min={0} max={60} addonAfter="分钟"/>
</Form.Item>
</Col>
<Col span={12}>

1
src/pages/OutRoadMgm/OutSegmentMgm/OutSegment/loadable.jsx

@ -488,6 +488,7 @@ function OutSegment() {
<Form.Item label="区域" name="area">
<Cascader
onChange={cascaderChange}
allowClear={false}
options={areaList}
placeholder="请选择区域"
expandTrigger="hover"

6
src/router/router.config.js

@ -569,6 +569,12 @@ let routes = [
component: pages.ParkBerthAly,
},
{
path: "/dataAlyPrediction/parkingFalseAlarms",
text: "误报情况分析",
name: "parkingFalseAlarms",
component: pages.ParkingFalseAlarms,
},
{
// -------------------------------数据分析与预测 - 停车营收分析
path: "/dataAlyPrediction/arrearageAly",
text: "欠费总分析",

10
src/services/OperationCenter/UserMgm/index.js

@ -10,7 +10,15 @@ const getUserLabel = (params) => {
data: params,
});
};
//用户管理-获取用户标签
const getUserLabelList = (params) => {
return ajax({
url: "/api/ope/user_manage/get_label_user_list",
type: "get",
data: params,
});
};
export default {
getUserLabel,
getUserLabelList,
}
Loading…
Cancel
Save