Browse Source

Merge branch 'develop' of http://120.27.195.166:3000/chenglb/PMS_Frontend_v1.0.0.git into develop

# Conflicts:
#	src/pages/DataAnalysisPrediction/ParkingOverview/loadable.jsx
tags/PMS_Frontend_v1.0.6-develop
chenglb 1 year ago
parent
commit
9388dc23a6
  1. 2
      src/components/DataSelect/index.jsx
  2. 113
      src/components/MapComponets/ParkingViewMarkers/index.jsx
  3. 39
      src/components/MapComponets/ParkingViewMarkers/index.scss
  4. 10
      src/components/TableModule/index.jsx
  5. 1
      src/pages/DataAnalysisPrediction/MemberStat/ParkingAly/loadable.jsx
  6. 2
      src/pages/DataAnalysisPrediction/MemberStat/PayAly/loadable.jsx
  7. 1
      src/pages/DataAnalysisPrediction/MemberStat/RegisterAly/loadable.jsx
  8. 8
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/CarTypeAly/loadable.jsx
  9. 2
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/NightParkStat/loadable.jsx
  10. 3
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkBerthAly/index.scss
  11. 9
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkBerthAly/loadable.jsx
  12. 2
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkTurnoverAly/loadable.jsx
  13. 2
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkUsageAly/loadable.jsx
  14. 2
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyDuration/loadable.jsx
  15. 3
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyOverview/loadable.jsx
  16. 236
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyPeriod/loadable.jsx
  17. 381
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyReport/index.scss
  18. 172
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyReport/loadable copy.jsx
  19. 506
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyReport/loadable.jsx
  20. 4
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingLiveData/loadable.jsx
  21. 2
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/TemporaryParkStat/loadable.jsx
  22. 4
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/echarts.config.js
  23. 2
      src/pages/DataAnalysisPrediction/ParkingIncomeAly/ArrearageRecoverAly/loadable.jsx
  24. 2
      src/pages/DataAnalysisPrediction/ParkingIncomeAly/CityArrearageAly/loadable.jsx
  25. 2
      src/pages/DataAnalysisPrediction/ParkingIncomeAly/CityIncomeAly/loadable.jsx
  26. 2
      src/pages/DataAnalysisPrediction/ParkingIncomeAly/CityIncomeStat/loadable.jsx
  27. 2
      src/pages/DataAnalysisPrediction/ParkingIncomeAly/OrderArrearageAly/loadable.jsx
  28. 2
      src/pages/DataAnalysisPrediction/ParkingIncomeAly/PriceAly/loadable.jsx
  29. 20
      src/pages/DataAnalysisPrediction/ParkingOverview/Map.jsx
  30. 17
      src/pages/DataAnalysisPrediction/ParkingOverview/loadable.jsx
  31. 14
      src/pages/OperationCenter/CarMgm/CarInfo/loadable.jsx
  32. 26
      src/pages/OperationCenter/CustomerServieMgm/CallbackSuggestion/index.scss
  33. 58
      src/pages/OperationCenter/CustomerServieMgm/CallbackSuggestion/loadable.jsx
  34. 5
      src/pages/OperationCenter/UserMgm/UserInfo/index.scss
  35. 13
      src/pages/OperationCenter/UserMgm/UserInfo/loadable.jsx
  36. 10
      src/services/DataAnalysisPrediction/ParkingBusinessAly/index.js
  37. 9
      src/services/OperationCenter/CustomerManage/index.js
  38. 2
      src/services/ParkingOverview/index.js

2
src/components/DataSelect/index.jsx

@ -17,7 +17,7 @@ function DataSelect(props) {
//
const TimeChange = () => {
let e = formData?.date_type||'';
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == 4) {
str = "year";

113
src/components/MapComponets/ParkingViewMarkers/index.jsx

@ -3,6 +3,7 @@ import "./index.scss";
import mgreen from "@/assets/images/equip/home/mark_green.png";
import mgred from "@/assets/images/equip/home/mark_red.png";
import mgyellow from "@/assets/images/equip/home/mark_yellow.png";
//
function Markers(props) {
const map = props.__map__;
@ -12,9 +13,9 @@ function Markers(props) {
iconAnchor = [15, 20], //
tooltipKey = "name", // key
// contentCb, //
mover = false,
clickCb, //
} = props;
//
var Mapmove = new AMap.Marker({ content: " ", map: map });
const [massLayer, setMassLayer] = useState(null); //
const massLayerRef = useRef(massLayer);
@ -75,7 +76,7 @@ function Markers(props) {
if (map && !massLayer) {
let _massLayer = new AMap.MassMarks([], {
zIndex: 5, //
cursor: "pointer",
// cursor: "pointer",
style: style, //
// allowCollision: true,
}); //
@ -126,99 +127,33 @@ function Markers(props) {
const addMarker = (markerArr, _massLayer) => {
_massLayer.setData(markerArr);
_massLayer.on("click", function (e) {
console.log(e.data.option);
clickCb(e.data.option);
// Mapmove.setPosition(e.data.lnglat);
});
setMassLayer(_massLayer);
_massLayer.setMap(map);
// for (let [key, value] of Object.entries(markerArr)) {
// if (!value.hasOwnProperty("massMarkers")) {
// value.massMarkers = [];
// value.nodes.forEach((elem) => {
// console.log(elem);
// // let marker = new AMap.LabelMarker({
// // position: [elem.lnglat[1], elem.lnglat[0]],
// // // zIndex: 1006,
// // icon: icon(elem.type),
// // // text: text(elem[tooltipKey]),
// // // content: markerContent(elem.type),
// // // offset: new AMap.Pixel(-13, -30),
// // });
// // marker.data = elem;
// // value.massMarkers.push(marker);
// // // marker.bindTooltip(`<span>${elem[tooltipKey]}</span>`, {
// // // offset: [20, -5],
// // // direction: "right",
// // // });
// // marker.on("mouseover", function (e) {
// // console.log(e.data);
// // var position = e.data.data && e.data.data.position;
// // if (position) {
// // Mapmove.setLabel(
// // '<div class="amap-info-window">' +
// // position +
// // '<div class="amap-info-sharp"></div>' +
// // "</div>"
// // );
// // Mapmove.setPosition(position);
if (mover) {
_massLayer.on("mouseover", function (e) {
Mapmove.setPosition(e.data.lnglat);
Mapmove.setLabel({
content: `${e.data.name} (${e.data?.option?.userTotal}/${e.data?.option?.berthTotal})`,
});
// if (position) {
// Mapmove.setContent(
// '<div class="amap-info-window">' +
// position +
// '<div class="amap-info-sharp"></div>' +
// "</div>"
// );
// Mapmove.setPosition(position);
// // map.add(Mapmove);
// // }
// // });
// // marker.on("mouseout", function () {
// // map.remove(Mapmove);
// // });
// });
// _massLayer.add(value.massMarkers);
// } else {
// _massLayer.add(value.massMarkers);
// }
// }
// _massLayer.setData(markerArr);
// massMarks.setMap(map);
// if (clickCb) {
// _massLayer.on("click", (e) => {
// console.log(e);
// // if (data.length == "1") {
// // let elem = data[0].data.data.data;
// // clickCb(elem);
// // } else {
// // map.openPopup(renderMarkerList(data), e.latlng, {
// // className: "markers-list-box",
// // });
// // let dom = document.querySelectorAll(".marker-list-item");
// // dom.forEach((elem) => {
// // elem.addEventListener("click", function (e) {
// // map.closePopup();
// // let type = e.target.dataset.type,
// // id = e.target.dataset.id;
// // let marker = massObjRef.current["type_" + type].nodes.filter(
// // (i) => i.locationId == id
// // )[0];
// // let elem = marker.data;
// // clickCb(elem);
// // });
// // });
// // }
// });
// }
};
});
const renderMarkerList = (data) => {
let template = `<div class="marker-list-content">
<div class="marker-list-header">请选择点位</div>
<div class="marker-list">
`;
data.forEach((elem) => {
let _data = elem.data.data;
if (_data.name && _data.locationId) {
template += `<div class="marker-list-item" data-type="${_data.type}" data-id="${_data.locationId}" title="${_data.name}">${_data.name}</div>`;
// _massLayer.on("mouseout", function () {
// map.remove(Mapmove);
// });
}
});
template += `</div></div>`;
return template;
// setMassLayer(_massLayer);
_massLayer.setMap(map);
};
return null;

39
src/components/MapComponets/ParkingViewMarkers/index.scss

@ -82,22 +82,27 @@
font-size: 14px;
}
.amap-info-window {
width: 150px;
background: #fff;
border-radius: 3px;
padding: 3px 7px;
box-shadow: 0 2px 6px 0 rgba(114, 124, 245, .5);
position: relative;
}
// .amap-info-window {
// width: 150px;
// background: #fff;
// border-radius: 3px;
// padding: 3px 7px;
// box-shadow: 0 2px 6px 0 rgba(114, 124, 245, .5);
// position: relative;
// }
.amap-info-sharp {
position: absolute;
top: 21px;
bottom: 0;
left: 50%;
margin-left: -8px;
border-left: 8px solid transparent;
border-right: 8px solid transparent;
border-top: 8px solid #fff;
// .amap-info-sharp {
// position: absolute;
// top: 21px;
// bottom: 0;
// left: 50%;
// margin-left: -8px;
// border-left: 8px solid transparent;
// border-right: 8px solid transparent;
// border-top: 8px solid #fff;
// }
.amap-marker {
.amap-marker-label {
color: #172c4d;
}
}

10
src/components/TableModule/index.jsx

@ -53,8 +53,9 @@ const TableModule = forwardRef((props, ref) => {
userInfo = {},//
valueChange,
mandatory,
locale={},
locale = {},
limitCon,//
isQuickMenu = [],
mandatory_name,
pageName = '',//
} = props;
@ -197,6 +198,7 @@ const TableModule = forwardRef((props, ref) => {
//
function reset() {
searchForm.resetFields();
setFormData({})
fetch()
}
function cascaderChange(value, options) {
@ -489,7 +491,7 @@ const TableModule = forwardRef((props, ref) => {
</Form.Item>
<div style={{ margin: "-20px 0 10px 0" }}>
<QuickMenu
dropdownData={[
dropdownData={isQuickMenu.length > 0 ? isQuickMenu : [
{ text: '昨日', value: 1 },
{ text: '今日', value: 0 },
{ text: '近三日', value: 2 },
@ -581,6 +583,10 @@ const TableModule = forwardRef((props, ref) => {
if (form.start_time !== void 0 && form.end_time !== void 0) {
form.start_time = moment(form.start_time).format("YYYY-MM-DD HH:mm:ss");
form.end_time = moment(form.end_time).format("YYYY-MM-DD HH:mm:ss");
if (exportUrl == "/api/ope/record/recharge_export") { //
form.startTime = moment(form.start_time).format("YYYY-MM-DD HH:mm:ss");
form.endTime = moment(form.end_time).format("YYYY-MM-DD HH:mm:ss");
}
}
exportAjax({
url: exportUrl,

1
src/pages/DataAnalysisPrediction/MemberStat/ParkingAly/loadable.jsx

@ -229,6 +229,7 @@ function ParkingAly() {
const ReportPaySummaryReport = () => {
ajax.ElectInvoice.exportParking({
...FormDatas,
...DateFormt(FormDatas.date_type),
}).then(
(res) => {
if (parseInt(res?.status) === 20000) {

2
src/pages/DataAnalysisPrediction/MemberStat/PayAly/loadable.jsx

@ -242,7 +242,7 @@ function PayAly() {
const ReportPaySummaryReport = () => {
ajax.ElectInvoice.exportPayFx({
...FormDatas,
is_excel: 1,
...DateFormt(FormDatas.date_type),
}).then(
(res) => {
if (parseInt(res?.status) === 20000) {

1
src/pages/DataAnalysisPrediction/MemberStat/RegisterAly/loadable.jsx

@ -232,6 +232,7 @@ function RegisterAly() {
const ReportPaySummaryReport = () => {
ajax.ElectInvoice.exportRegister({
...FormDatas,
...DateFormt(FormDatas.date_type),
}).then(
(res) => {
if (parseInt(res?.status) === 20000) {

8
src/pages/DataAnalysisPrediction/ParkingBusinessAly/CarTypeAly/loadable.jsx

@ -26,8 +26,8 @@ function CarTypeAly() {
start_time: moment().subtract('days').startOf('day').format("YYYY-MM-DD"),
end_time: moment().endOf("day").format("YYYY-MM-DD"),
date_type: '1',
type:'region',
car_parking_type:"3",
type: 'region',
car_parking_type: "3",
};
//
const [pageInfo, setPageInfo] = useState({
@ -135,7 +135,7 @@ function CarTypeAly() {
//
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == 4) {
str = "year";
@ -325,7 +325,7 @@ function CarTypeAly() {
const handleExport = () => {
if (resultData.list.length > 0) {
let { pn, page_size, ...params } = defaultParams;
ajax.getCarTypeAlyListExp(defaultParams).then(
ajax.getCarTypeAlyListExp({ ...defaultParams, export: 1 }).then(
(res) => {
if (res) {
window.open(res.data.export_url)

2
src/pages/DataAnalysisPrediction/ParkingBusinessAly/NightParkStat/loadable.jsx

@ -184,7 +184,7 @@ function NightParkStat() {
//
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == 4) {
str = "year";

3
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkBerthAly/index.scss

@ -301,6 +301,9 @@ $color-primary : var(--color-primary);
background: #3e4557;
width: 50%;
margin-right: 20px;
.title-text {
margin-left: 20px;
}
}
.parkBerth-right {

9
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkBerthAly/loadable.jsx

@ -181,8 +181,8 @@ function ParkBerthAly() {
let acc = []
data.map((item) => {
let acr = []
acr.push(item.average_duration)
acr.push(item.turnover)
acr.push(item.average_duration)
acc.push(acr)
})
// X
@ -238,7 +238,7 @@ function ParkBerthAly() {
},
yAxis: {
//type: "value",
// name: yAxisName ? yAxisName : '',
name: '小时',
axisLine: {
show: false,
},
@ -255,6 +255,7 @@ function ParkBerthAly() {
//color: ["#3AA9FF", "#F997DF"],
series: [
{
name:'平均停车时长',
symbolSize: 20,
data: acc,
type: 'scatter'
@ -304,7 +305,7 @@ function ParkBerthAly() {
if (parseInt(res?.status) === 20000) {
setResultData(res?.data || {});
if (res.data?.list?.length > 0) {
setBaseData(res?.data?.list[0])
setBaseData({ ...res?.data?.list[0], all_utilization_rate: res?.data?.all_utilization_rate })
getParkingIncome({ ...postData, ...v, ...pageInfo, road_id: res?.data?.list[0].road_id })
}
let maker = []
@ -381,7 +382,7 @@ function ParkBerthAly() {
>
<i>?</i>
</Tooltip>
<div className="title-text">全部车场日均泊位时长利用率:{ }</div>
<div className="title-text">全部车场日均泊位时长利用率:{baseData.all_utilization_rate || "--"}%</div>
<div className="form-search">
<div className="form-item">
<Input

2
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkTurnoverAly/loadable.jsx

@ -115,7 +115,7 @@ function ParkTurnoverAly() {
//
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == 4) {
str = "year";

2
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkUsageAly/loadable.jsx

@ -112,7 +112,7 @@ function ParkUsageAly() {
//
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == 4) {
str = "year";

2
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyDuration/loadable.jsx

@ -237,7 +237,7 @@ function ParkingAlyDuration() {
//
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == 4) {
str = "year";

3
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyOverview/loadable.jsx

@ -186,7 +186,7 @@ function ParkingAlyOverview() {
//
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == 4) {
str = "year";
@ -533,6 +533,7 @@ function ParkingAlyOverview() {
allowClear={false}
value={formData.start_time ? moment(formData.start_time) : null}
onChange={(date, dateString) => {
console.log(536,date,dateString)
if (TimeChange().str == "week") {
setFormData({
...formData,

236
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyPeriod/loadable.jsx

@ -22,6 +22,7 @@ function ParkingAlyPeriod() {
start_time: moment().subtract('days').startOf('day').format("YYYY-MM-DD"),
end_time: moment().endOf("day").format("YYYY-MM-DD"),
date_type: '1',
paytype: '0'
};
//
const [pageInfo, setPageInfo] = useState({
@ -50,6 +51,7 @@ function ParkingAlyPeriod() {
const [revenueData, setRevenueData] = useState({});
//
const [parkData, setParkData] = useState({});
const [hourData, setHourData] = useState({});
const [searchSelectList, setSearchSelectList] = useState([]); //
const [sessionTabList, setSessionTabList] = useSessionStorageState('parkingAlyPeriod', {
value: {
@ -83,7 +85,7 @@ function ParkingAlyPeriod() {
//
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == 4) {
str = "year";
@ -168,161 +170,15 @@ function ParkingAlyPeriod() {
};
// 线
const getParkOption = (data) => {
// data = [
// {
// "hour": 0,
// "occupancy_rate": "0.01%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 1,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 2,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 3,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 4,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 5,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 6,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 7,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 8,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 9,
// "occupancy_rate": "0.1%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 10,
// "occupancy_rate": "0.01%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 11,
// "occupancy_rate": "0.04%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 12,
// "occupancy_rate": "0.06%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 13,
// "occupancy_rate": "0.04%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 14,
// "occupancy_rate": "0.06%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 15,
// "occupancy_rate": "0.01%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 16,
// "occupancy_rate": "0.04%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 17,
// "occupancy_rate": "0.04%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 18,
// "occupancy_rate": "0.07%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 19,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 20,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 21,
// "occupancy_rate": "0.01%",
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 22,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// },
// {
// "hour": 23,
// "occupancy_rate": 0,
// "charge_type": "2",
// "charge_type_name": ""
// }
// ]
const areaNames = data[0].charge_type_name ? [...new Set(data.map((item) => item.charge_type_name))] : [''];
let areaNames = data[0].charge_type_name ? [...new Set(data.map((item) => item.charge_type_name))] : [''];
//
const dates = [...new Set(data.map((item) => item.hour))].sort(
let dates = [...new Set(data.map((item) => item.hour))].sort(
(a, b) => a.hour - b.hour
);
//
const seriesData = areaNames.map((areaName, index) => {
let seriesData = areaNames.map((areaName, index) => {
//
const areaData = data[0].charge_type_name ? data.filter((item) => item.charge_type_name === areaName) : data
let areaData = data[0].charge_type_name ? data.filter((item) => item.charge_type_name === areaName) : data
//
return {
name: areaName,
@ -336,7 +192,7 @@ function ParkingAlyPeriod() {
},
},
data: dates.map((item) => {
for (const { hour, occupancy_rate } of areaData) {
for (var { hour, occupancy_rate } of areaData) {
if (hour === item) return parseFloat(occupancy_rate);
}
return 0;
@ -344,7 +200,7 @@ function ParkingAlyPeriod() {
};
});
// X
const xAxisData = dates.map((date) => {
let xAxisData = dates.map((date) => {
return {
value: date,
align: "center",
@ -356,9 +212,54 @@ function ParkingAlyPeriod() {
};
});
setParkData(lineChartOption(areaNames, xAxisData, "饱和度", seriesData));
setParkData(lineChartOption(areaNames, xAxisData, "饱和度", seriesData,areaNames));
};
// 线 hour
const getParkOptionHour = (data) => {
let areaNames = data[0].date ? [...new Set(data.map((item) => item.date))] : [''];
//
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].date ? data.filter((item) => item.date === 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,
},
};
});
setHourData(lineChartOption(areaNames, xAxisData, "饱和度", seriesData));
};
function getParkingIncome(data) {
ajax
.getParkingAlyPeriodLine(data)
@ -375,7 +276,9 @@ function ParkingAlyPeriod() {
.getParkingAlyPeriodParkLine(data)
.then((res) => {
if (res.status === 20000) {
getParkOption(res.data.list);
getParkOption(res.data.list?.area_list);
getParkOptionHour(res.data.list?.hour_list);
}
})
.catch((err) => console.error(err));
@ -688,6 +591,7 @@ function ParkingAlyPeriod() {
<i>?</i>
</Tooltip>
<ReactEcharts
key="99"
option={revenueData}
style={{ height: "300px", width: "100%", overflow: "hidden" }}
/>
@ -704,7 +608,7 @@ function ParkingAlyPeriod() {
<Select
className="form-con"
placeholder="请选择"
defaultValue={'0'}
//defaultValue={'0'}
options={[
{
label: '按时间对比',
@ -715,18 +619,32 @@ function ParkingAlyPeriod() {
value: '1',
},
]}
value={formData.pay_me}
value={formData.paytype}
onChange={(v) =>
setFormData({ ...formData, pay_me: v })
setFormData({ ...formData, paytype: v })
}
/>
</div>
{
formData.paytype == 0 ? <>
<ReactEcharts
key="1"
option={hourData}
style={{ height: "300px", width: "100%", overflow: "hidden" }}
/>
</>
:
<>
<ReactEcharts
key="2"
option={parkData}
style={{ height: "300px", width: "100%", overflow: "hidden" }}
/>
</div>
</>
}
</div>
</div>
</div>
</div>

381
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyReport/index.scss

@ -1,5 +1,386 @@
@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;
}
.soll-result {
overflow: auto;
.result {
display: block !important;
}
}
.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-hd-overview {
color: #ffffff;
//background: #3e4557;
border-radius: 4px;
margin-bottom: 20px;
display: flex;
.result-header {
height: 108px;
width: 33%;
margin: 0 10px;
display: flex;
align-items: center;
.result-content {
margin: auto;
.title {
height: 19px;
font-size: 14px;
font-family: Microsoft YaHei, Microsoft YaHei-Regular;
font-weight: 400;
text-align: center;
color: #DBE5FF;
display: inline-block;
}
i {
border: 1px solid;
border-radius: 22px;
display: inline-block;
text-align: center;
font-size: 10px;
width: 15px;
cursor: pointer;
}
.num {
height: 27px;
font-size: 20px;
font-family: Alibaba PuHuiTi, Alibaba PuHuiTi-Bold;
font-weight: 700;
text-align: left;
color: #ffffff;
text-align: center;
}
}
}
.rea {
background: url("../../../../assets/images/red.png");
background-size: 100% 100%;
}
.reb {
background: url("../../../../assets/images/blue.png");
background-size: 100% 100%;
}
.rec {
background: url("../../../../assets/images/green.png");
background-size: 100% 100%;
}
.red {
background: url("../../../../assets/images/yellow.png");
background-size: 100% 100%;
}
}
.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;
}
.ant-table .ant-table-thead tr th {
background: #3e4557;
}
}
.result-title {
display: inline-block;
p {
display: inline;
margin: 0 5px;
color: #3aa9ff;
font-size: 18px;
}
}
.export-btn {
display: inline-block;
text-align: center;
float: right;
width: 68px;
height: 34px;
line-height: 34px;
background: linear-gradient(180deg, #3aa9ff, #59b7ff);
border-radius: 4px;
margin-right: 15px;
margin-bottom: 10px;
cursor: pointer;
}
.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;
}
}
}
.tab-title {
display: flex;
.title {
height: 30px;
line-height: 30px;
margin-right: 10px;
}
.btn {
font-size: 10px;
}
}
.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;
}
}

172
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyReport/loadable copy.jsx

@ -0,0 +1,172 @@
import React, { useState, useRef, useEffect } from "react";
import {
message,
Pagination,
Table,
Input,
Space,
Modal,
Button,
Select,
Tabs,
Descriptions,
Timeline
} from "antd";
import moment from "moment";
import ajax from '@/services'
import { TableModule } from "@/components";
import { dictionary } from "@/config/common.js";
import "./index.scss";
function ParkingAlyReport() {
const [resultData, setResultData] = useState([])
const [total, setTotal] = useState(0);
const [searchSelectList, setSearchSelectList] = useState([]); //
const columns = [
{
title: "停车场名称",
dataIndex: "road_name",
key: "road_name",
align: "center",
fixed: "right",
},
{
title: "泊位总数",
dataIndex: "total_berths",
key: "total_berths",
align: "center",
fixed: "right",
},
{
title: "停车记录数(次)",
dataIndex: "record_count",
key: "record_count",
align: "center",
fixed: "right",
},
{
title: "订单应收金额(元)",
dataIndex: "receivable_amount",
key: "receivable_amount",
align: "center",
fixed: "right",
},
{
title: "日均泊位周转次数(次)",
dataIndex: "average_turn_times",
key: "average_turn_times",
align: "center",
fixed: "right",
},
{
title: "平均泊位利用率",
dataIndex: "average_use_rate",
key: "average_use_rate",
align: "center",
fixed: "right",
},
{
title: "平均停车时长",
dataIndex: "average_park_time",
key: "average_park_time",
align: "center",
fixed: "right",
},
];
//
const formSearch = [
{
name: "area_id",
type: "TreeSelect",
label: "区域",
},
{
name: "operator_id",
type: "Select",
label: "运营商",
options: searchSelectList || [],
},
{
name: "car_parking_type",
type: "Select",
label: "车场类型",
options: [
{
label: '全部',
value: '3',
},
{
label: '路内车场',
value: '1',
},
{
label: '路外车场',
value: '2',
},
],
},
{
name: "road_name",
type: "Input",
label: "停车场",
placeholder: "请输入停车场名称",
},
{
name: "timePeriod",
type: "RangePicker",
label: "时间段",
defaultValue: [moment().startOf("day"), moment()],
},
];
//
function search(e) {
ajax.getParkingAlyReportList(e).then((res) => {
let { status, data, total } = res
if (status == 20000) {
if (data.list) {
setResultData(data.list)
setTotal(data.total_records)
} else {
setResultData(data)
setTotal(total)
}
} else {
setResultData([])
message.error(res.message)
}
})
}
//
const getSelectList = () => {
ajax.getOperator().then((e) => {
setSearchSelectList([
...searchSelectList,
...e.data
])
})
};
useEffect(() => {
getSelectList();
}, []);
return (
<>
<TableModule
columns={columns}
tableData={resultData}
formSearch={formSearch}
search={search}
total={total}
rowKey={"road_name"}
exportUrl={'/api/ana/dataanalysis/parking_total_analysis_export'}
initFormData={{}}
pageName={'parkingAlyReport'}
/>
</>
);
}
export default ParkingAlyReport;

506
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyReport/loadable.jsx

@ -1,26 +1,88 @@
import React, { useState, useRef, useEffect } from "react";
import {
message,
Pagination,
Table,
Input,
Space,
Modal,
Button,
Select,
Tabs,
Descriptions,
Timeline
} from "antd";
import React, { useState, useEffect } from "react";
import { ResultFlowResult, DataSelect } from "@/components";
import { Select, Input, Button, Table, message, Pagination, Tabs, DatePicker, Modal, Cascader, Tooltip } from "antd";
import { useSessionStorageState } from "ahooks";
import { lineChartOption, ringChartOption } from "../echarts.config";
import { dictionary } from "@/config/common"
import { useNavigate } from "react-router-dom";
import { setTabList } from "@/store/common.js";
import { useSelector, useDispatch } from "react-redux";
import { QuestionCircleFilled } from "@ant-design/icons"
import { Icon } from "@/components"
import moment from "moment";
import ajax from '@/services'
import { TableModule } from "@/components";
import { dictionary } from "@/config/common.js";
import ReactEcharts from "echarts-for-react";
import "./index.scss";
import ajax from "@/services";
function ParkingAlyReport() {
const [resultData, setResultData] = useState([])
const [total, setTotal] = useState(0);
// session
const [defaultParams, setDefaultParams] = useSessionStorageState(
"formData_parkingAlyReport",
{ 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"),
date_type: '1',
//car_parking_type: '3',
};
//
const [pageInfo, setPageInfo] = useState({
pn: 1,
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_records: 0,
list: [],
});
//
const [tableData, setTableData] = useState({
list: {
area_list: [],
road_list: [],
},
area_total_records: "",
road_total_records: ""
});
const [searchSelectList, setSearchSelectList] = useState([]); //
const [sessionTabList, setSessionTabList] = useSessionStorageState('parkingAlyReport', {
value: {
}
})
useEffect(() => {
if (sessionTabList && Object.values(sessionTabList).length > 0) {
setFormData({
...formData, ...sessionTabList
})
getListData({
...sessionTabList
})
} else {
getListData()
}
}, [isAjax])
useEffect(() => {
setSessionTabList({
...formData
})
}, [formData])
const columns = [
{
title: "停车场名称",
@ -72,25 +134,202 @@ function ParkingAlyReport() {
fixed: "right",
},
];
const paginationProps = {
className: "pagination-common",
showQuickJumper: true,
showSizeChanger: true,
current: pageInfo.pn,
//total: resultData?.totalRecords,
pageSize: pageInfo.page_size,
pageSizeOptions: Array.from(
new Set([...[15], ...(dictionary?.pageSizeOptions || [])])
),
onChange: (current, size) => {
setPageInfo({
...pageInfo,
...{ pn: current, length: size }
});
//setIsAjax(!isAjax)
getListData({}, { pn: current })
},
}
//
const formSearch = [
{
name: "area_id",
type: "TreeSelect",
label: "区域",
// 访
// 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 getListData = (v, pn = {}) => {
let postData = { ...formData };
if (!loading) {
postData = { ...holdData };
}
setDefaultParams({ ...postData, ...pageInfo, ...pn });
if (moment(formData.end_time) - moment(formData.start_time) > 1000 * 31 * 24 * 3600) {
message.error("时间范围限制为31天!")
setLoading(false);
setTabLoading(false);
return
}
setTabLoading(true);
ajax.getParkingAlyReportList({ ...postData, ...v, ...pageInfo, ...pn }).then(
(res) => {
if (parseInt(res?.status) === 20000) {
setResultData(res?.data || {});
} else {
message.error(res?.message);
}
setLoading(false);
setTabLoading(false);
},
{
name: "operator_id",
type: "Select",
label: "运营商",
options: searchSelectList || [],
(err) => {
console.log(err);
setLoading(false);
setTabLoading(false);
}
);
};
//
const handleSearch = () => {
setLoading(true);
setPageInfo({ ...pageInfo, ...{ pn: 1 } });
setHoldData(formData);
setIsAjax(!isAjax);
};
//
const handleExport = () => {
if (resultData?.list?.length > 0) {
let { pn, page_size, ...params } = defaultParams;
ajax.getParkingAlyReportExp(defaultParams).then(
(res) => {
if (res) {
window.open(res.data.export_url)
} else {
message.error(res?.message);
}
},
{
name: "car_parking_type",
type: "Select",
label: "车场类型",
options: [
(err) => {
console.log(err);
}
);
} else {
message.error("暂无数据");
}
};
//
const getSelectList = () => {
ajax.getOperator().then((e) => {
setSearchSelectList([
...searchSelectList,
...e.data
])
})
};
useEffect(() => {
getSelectList();
}, []);
//
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>
<Cascader
className="form-con"
popupClassName="start-exception-deal-cascader"
options={areaList}
placeholder="请选择区域"
expandTrigger="hover"
fieldNames={{
label: "name",
value: "id",
children: "children",
}}
value={formData.area_id}
onChange={(v, option) => {
setFormData({ ...formData, area_id: v ? v : null });
}}
/>
</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>车场类型</label>
<Select
className="form-con"
placeholder="请选择车场类型"
options={[
{
label: '全部',
value: '3',
@ -103,68 +342,169 @@ function ParkingAlyReport() {
label: '路外车场',
value: '2',
},
],
]}
value={formData.car_parking_type}
onChange={(v) =>
setFormData({ ...formData, car_parking_type: v })
}
/>
</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>日期
<div className="daf">
<Select
value={formData.date_type}
// style={{
// width: "100%",
// }}
placeholder="请选择"
options={[
{
value: "1",
label: "日",
},
{
name: "road_name",
type: "Input",
label: "停车场",
placeholder: "请输入停车场名称",
value: "2",
label: "周",
},
{
name: "timePeriod",
type: "RangePicker",
label: "时间段",
defaultValue: [moment().startOf("day"), moment()],
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)}
/>
//
function search(e) {
ajax.getParkingAlyReportList(e).then((res) => {
let { status, data, total } = res
if (status == 20000) {
if (data.list) {
setResultData(data.list)
setTotal(data.total_records)
</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 {
setResultData(data)
setTotal(total)
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 {
setResultData([])
message.error(res.message)
setFormData({ ...formData, end_time: dateString });
}
})
}}
disabledDate={(current) =>
current < moment(formData.start_time)
}
/>
</div>
//
const getSelectList = () => {
ajax.getOperator().then((e) => {
setSearchSelectList([
...searchSelectList,
...e.data
])
})
};
useEffect(() => {
getSelectList();
}, []);
return (
<>
<TableModule
<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 soll-result">
<div className="result">
<div className="result-title">共查询到<p>{resultData?.total_records || 0}</p>条结果</div>
<div className="export-btn" onClick={handleExport}>导出</div>
<Table
columns={columns}
tableData={resultData}
formSearch={formSearch}
search={search}
total={total}
rowKey={"road_name"}
exportUrl={'/api/ana/dataanalysis/parking_total_analysis_export'}
initFormData={{}}
pageName={'parkingAlyReport'}
dataSource={resultData.list || []}
bordered
size="middle"
pagination={false}
// scroll={{
// x: 'calc(700px + 50%)',
// y: 240,
// }}
/>
<Pagination {...paginationProps} className="pagination-common" total={resultData?.total_records} />
</div>
</div>
</div>
</>
);
}

4
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingLiveData/loadable.jsx

@ -157,7 +157,7 @@ function ParkingLiveData() {
const areaData = data[0].name ? data.filter((item) => item.name === areaName) : data
//
return {
name: areaNames.length > 1 ? areaName : '',
name: areaNames.length > 1 ? areaName : '占用率',
type: "line",
itemStyle: {
label: {
@ -188,7 +188,7 @@ function ParkingLiveData() {
};
});
setParkingData(lineChartOption(areaNames, xAxisData, "数量(次)", seriesData));
setParkingData(lineChartOption(areaNames, xAxisData, "泊位占用率", seriesData));
};
//
const getParkingOption = (data) => {

2
src/pages/DataAnalysisPrediction/ParkingBusinessAly/TemporaryParkStat/loadable.jsx

@ -88,7 +88,7 @@ function TemporaryParkStat() {
//
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == 4) {
str = "year";

4
src/pages/DataAnalysisPrediction/ParkingBusinessAly/echarts.config.js

@ -1,5 +1,5 @@
const lineChartOption = (areaNames, xAxisData, yAxisName, seriesData) => {
const lineChartOption = (areaNames, xAxisData, yAxisName, seriesData, reName) => {
return {
title: {
text: "",
@ -12,7 +12,7 @@ const lineChartOption = (areaNames, xAxisData, yAxisName, seriesData) => {
type: "scroll",
top: 0,
left: 'center',
data: areaNames.length > 1 ? areaNames : [],
data: areaNames.length > 1 ? areaNames : reName || [],
itemWidth: 18,
itemHeight: 12,
width: '40%',

2
src/pages/DataAnalysisPrediction/ParkingIncomeAly/ArrearageRecoverAly/loadable.jsx

@ -171,7 +171,7 @@ function ArrearageRecoverAly(props) {
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == "year") {
str = "year";

2
src/pages/DataAnalysisPrediction/ParkingIncomeAly/CityArrearageAly/loadable.jsx

@ -149,7 +149,7 @@ function CityArrearageAly(props) {
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == "year") {
str = "year";

2
src/pages/DataAnalysisPrediction/ParkingIncomeAly/CityIncomeAly/loadable.jsx

@ -191,7 +191,7 @@ function CityIncomeAly(props) {
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == "year") {
str = "year";

2
src/pages/DataAnalysisPrediction/ParkingIncomeAly/CityIncomeStat/loadable.jsx

@ -143,7 +143,7 @@ function CityIncomeStat(props) {
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == "year") {
str = "year";

2
src/pages/DataAnalysisPrediction/ParkingIncomeAly/OrderArrearageAly/loadable.jsx

@ -164,7 +164,7 @@ function OrderArrearageAly(props) {
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == "year") {
str = "year";

2
src/pages/DataAnalysisPrediction/ParkingIncomeAly/PriceAly/loadable.jsx

@ -140,7 +140,7 @@ function PriceAly(props) {
const TimeChange = () => {
let e = formData.date_type;
let str = "day";
let str = "date";
let mat = "YYYY-MM-DD";
if (e == "year") {
str = "year";

20
src/pages/DataAnalysisPrediction/ParkingOverview/Map.jsx

@ -79,22 +79,22 @@ function BaseMap(props) {
};
}, []);
useEffect(() => {
if (map) {
if (scrollZoom) {
map.scrollWheelZoom.enable();
} else {
map.scrollWheelZoom.disable();
}
}
}, [scrollZoom]);
// useEffect(() => {
// if (map) {
// if (scrollZoom) {
// map.scrollWheelZoom.enable();
// } else {
// map.scrollWheelZoom.disable();
// }
// }
// }, [scrollZoom]);
useEffect(() => {
if (map && Option) {
AMap.plugin(["AMap.PlaceSearch"], function () {
const placeSearch = new AMap.PlaceSearch({
pageSize: 5, //
pageIndex: 1, //
city: "010", //
city: "0532", //
citylimit: true, //
// map: map, //
// panel: "panel", //

17
src/pages/DataAnalysisPrediction/ParkingOverview/loadable.jsx

@ -42,9 +42,9 @@ import Poto from "@/assets/images/equip/home/poto.png";
import BaseMap from "./Map";
// import errorImg from "@/assets/images/layout/error.png"
// import { useLocation } from "react-router-dom";
let timer = null;
function ParkingOverview() {
const navigate = useNavigate();
let timer = null;
//is
const MapS = [
{
@ -362,7 +362,7 @@ function ParkingOverview() {
}
} else {
let dasd = Option.filter((ele) => ele.name == data)[0] || {};
console.log(data, dasd, Option);
// console.log(data, dasd, Option);
setCenter({
lng: dasd?.longitude || "",
lat: dasd?.latitude || "",
@ -379,6 +379,8 @@ function ParkingOverview() {
const AutoChangesize = (data) => {
if (data) {
if (Selectq == "1") {
clearTimeout(timer);
timer = setTimeout(() => {
ajax.ParkingOverview.searchPark({
type: RoadSelect,
keywords: data,
@ -409,8 +411,13 @@ function ParkingOverview() {
setLoading(true);
}
);
}, 1000);
} else {
clearTimeout(timer);
timer = setTimeout(() => {
setWei(data);
}, 1000);
// ajax.ParkingOverview.searchGeocode({
// key: "a54fb01ed4e07686adc0eddf4e18afd7",
// address: data,
@ -744,7 +751,7 @@ function ParkingOverview() {
name: "停车收入(元)",
min: 0,
// /max: 50,
interval: 10,
// interval: 10,
// splitNumber: 6, //
axisLabel: {
//formatter: "{value}",
@ -1066,6 +1073,7 @@ function ParkingOverview() {
);
};
useEffect(() => {
setLeftCar(false);
setDaySel("1");
setDaySet("1");
setDaySes("1");
@ -1267,7 +1275,7 @@ function ParkingOverview() {
<div className="right_home">
<div>
<div className="pkh_title">
客诉类受理分析
客诉类分析
<Tooltip
placement="bottom"
title={
@ -1366,6 +1374,7 @@ function ParkingOverview() {
iconAnchor={[15, 20]} //
tooltipKey={"name"} // key
// contentCb, //
mover={true}
clickCb={(ele) => {
ClickMap(ele);
}} //

14
src/pages/OperationCenter/CarMgm/CarInfo/loadable.jsx

@ -211,7 +211,7 @@ function CarInfo() {
options: [
{
label: "已认证",
value: 0,
value: 2 ,
},
{
label: "未认证",
@ -240,7 +240,7 @@ function CarInfo() {
name: "timePeriod",
type: "RangePicker",
label: "时间段",
defaultValue: [moment().subtract(1, "month"), moment()],
defaultValue: [moment().subtract(90, "day"), moment()],
},
];
//退
@ -1107,6 +1107,14 @@ function CarInfo() {
// searchOther()
// }, [tabKey])
//
const limitCon = (e) => {
if (e && moment(e.end_time) - moment(e.start_time) > 90 * 24 * 1000 * 3600) {
console.log(typeof e.order_mount_down, e.order_mount_up, e.order_mount_down > e.order_mount_up)
message.error('查询范围为90天!')
return 1
}
}
return (
<>
{tag == 1 ?
@ -1116,6 +1124,8 @@ function CarInfo() {
formSearch={formSearch}
total={total}
search={search}
limitCon={limitCon}
isQuickMenu={[{}]}
rowKey={(record) => record.carId}
pageName={'carInfo'}
/> :

26
src/pages/OperationCenter/CustomerServieMgm/CallbackSuggestion/index.scss

@ -229,7 +229,7 @@ $color-primary: var(--color-primary);
.content {
.feedbackMsg {
background: #f3e6ca;
width: 65%;
width:1000px;
height: 101px;
margin-top: 10px;
.margin-msg {
@ -245,9 +245,12 @@ $color-primary: var(--color-primary);
}
}
.reject{
.content{
display: flex;
.reply {
background: #dbf2cb;
width: 65%;
width:1000px;
height: 101px;
margin-top: 10px;
.margin-msg {
@ -262,6 +265,25 @@ $color-primary: var(--color-primary);
}
}
}
.rejectContent{
line-height: 102px;
margin-left: 20px;
font-size: 18px;
cursor: pointer;
color: #409eff;
}
}
.reapir{
margin: 20px 500px;
color: gray;
.again{
margin-left: 10px;
cursor: pointer;
color: #409eff;
}
}
}
}
.text {
margin-top: 20px;

58
src/pages/OperationCenter/CustomerServieMgm/CallbackSuggestion/loadable.jsx

@ -196,15 +196,15 @@ function CallbackSuggestion(props) {
const imgModal = () => {
setImgVisible(false)
setRepairData({
content:'',
image:[]
content: '',
image: []
})
}
const cancelImg = () => {
setImgVisible(false)
setRepairData({
content:'',
image:[]
content: '',
image: []
})
}
const getParkId = (record) => {
@ -251,8 +251,8 @@ function CallbackSuggestion(props) {
if (lastFormData.page_size === length) {
setFormData(Object.assign({}, formData, { pn: pn, page_size: length }))
setLastFormData(Object.assign({}, lastFormData, { pn: pn, page_size: length }))
lastFormDataRef.current = Object.assign({}, lastFormData, { pn: pn , page_size: length})
getData(Object.assign({}, formData, { pn: pn , page_size: length}))
lastFormDataRef.current = Object.assign({}, lastFormData, { pn: pn, page_size: length })
getData(Object.assign({}, formData, { pn: pn, page_size: length }))
}
}
//
@ -301,6 +301,24 @@ function CallbackSuggestion(props) {
Object.assign({}, repairData, { image: imgUrl })
);
}
//
const handleReject = (res) => {
let data = {
dialogueId: res.dialogueId,
id: getId
}
ajax.getRejectData(data).then(res => {
if (res.status === 20000) {
console.log(res.data);
setGetImgList(res.data.dialogueDetail)
}
})
}
const [getAgain, setGetAgain] = useState(true)
const handleAgain = (res) => {
setGetAgain(false)
setRepairData({ content: res.replyContent })
}
const handleRepair = () => {
let data = {
...repairData,
@ -316,8 +334,8 @@ function CallbackSuggestion(props) {
setGetImg(res.data)
setGetImgList(res.data.dialogueDetail)
setRepairData({
content:'',
image:[]
content: '',
image: []
})
}
})
@ -655,17 +673,21 @@ function CallbackSuggestion(props) {
<Image src={res} />
)
}):''
}) : ''
}
</div>
</div>
</div>
</div>
:
<div className="reject">
{
res.status == 0 ? <div className="content">
<div className="reply">
<div className="margin-msg">
<div className="time">{res.replyTime}</div>
<div className="concent">{res.sysUserName}回复<span>{res.replyContent}</span></div>
<div className="concent">{res.sysUserName}回复<span>{res.replyContent}</span>
</div>
<div className="picFlex">
{res.answerImgMap.length ?
res.answerImgMap.map(res => {
@ -678,6 +700,22 @@ function CallbackSuggestion(props) {
</div>
</div>
</div>
<div className="rejectContent" onClick={() => { handleReject(res) }}>撤回</div>
</div>
:
<>
{
getAgain == true ?
<div className="reapir">你撤回了一条消息
<span className="again" onClick={() => { handleAgain(res) }}>重新编辑</span>
</div> : ''
}
</>
}
</div>
}
</div>

5
src/pages/OperationCenter/UserMgm/UserInfo/index.scss

@ -254,13 +254,16 @@ $color-primary: var(--color-primary);
}
}
.ltc-item-bind {
font-size: 18px;
font-size: 16px;
margin: 10px 0;
display: block;
width: 900px;
.new-item-bind {
display: inline-block;
width: 400px;
a {
margin-left: 10px;
}
}
.ltc-item-input {
display: inline-block;

13
src/pages/OperationCenter/UserMgm/UserInfo/loadable.jsx

@ -590,6 +590,7 @@ function UserInfo() {
})
const [bindData, setBindData] = useState([])//
const [detailData, setDetailData] = useState([])//
const [baseDetailData, setBaseDetailData] = useState()//
const [ycddData, setYcddData] = useState([])//
const [detailVisible, setDetailVisible] = useState(false);
const [ltcVisible, setLtcVisible] = useState(false);
@ -655,6 +656,7 @@ function UserInfo() {
}
//
function searchDetail(e) {
setBaseDetailData({...e})
ajax({
url: "/api/ope/user/get_base_info",
type: "get",
@ -691,7 +693,8 @@ function UserInfo() {
}).then((res) => {
let { status, data, total } = res
if (status == 20000) {
message.success(res.message)
searchDetail(baseDetailData)
} else {
message.error(res.message)
}
@ -972,6 +975,8 @@ function UserInfo() {
formSearch={arr}
total={total}
search={searchOther}
initFormData={exportUrl == "/api/bpm/record/get_record_export" ? { start_time: moment().subtract(1, "month") } : {}} //
isExport={exportUrl ? true : false}
exportUrl={exportUrl}
rowKey={'id'}
/>
@ -1146,7 +1151,8 @@ function UserInfo() {
createCol(['序号', '区域', '商户名称', '停车场名称', '车场类型', '车牌号', '泊位号', '入场时间', '离场时间', '停车时长', '应收金额', '优惠金额', '实收金额'],
['index', 'region', 'operator', 'road', 'road_type', 'plate', 'berth_id', 'in_time', 'out_time', 'admission_time', 'receivable_amount', 'preferential_amount', 'actual_amount'], 2),
[ash[18], ash[0], ash[3], ash[4], ash[2], ash[5], ash[12]],
resultData
resultData,
"/api/bpm/record/get_record_export"
) : null}
</Tabs.TabPane>
<Tabs.TabPane tab="支付记录" key="3">
@ -1155,7 +1161,8 @@ function UserInfo() {
createCol(['订单ID', '停车场名称', '车牌号', '泊位号', '入场时间', '计费时间', '停车时长', '应收金额', '优惠金额', '实收金额', '支付渠道', '支付设备', '操作人', '付款车场', '支付时间', '第三方流水ID'],
['order_id', 'road', 'plate', 'berth_id', 'admission_time', 'charging_time', 'parking_duration', 'receivable_amount', 'discount_amount', 'paid_in_money', 'payment_channels', 'payment_equipment', 'dealer', 'pay_road', 'pay_time', 'third_party_flow_id'], 3),
[ash[18], ash[2], ash[10], ash[15]],
resultData
resultData,
'/api/bpm/record/get_payment_export'
) : null}
</Tabs.TabPane>
<Tabs.TabPane tab="充值记录" key="4">

10
src/services/DataAnalysisPrediction/ParkingBusinessAly/index.js

@ -40,7 +40,14 @@ const getParkingAlyReportList = (params) => {
data: params,
});
};
//停车业务分析-停车场分析报表-导出
const getParkingAlyReportExp = (params) => {
return ajax({
url: "/api/ana/dataanalysis/parking_total_analysis_export",
type: "post",
data: params,
});
};
//停车业务分析-停车时长分析-停车时长分析 柱状图
const getParkingAlyDurationBar = (params) => {
return ajax({
@ -233,6 +240,7 @@ export default {
getParkingAlyOverviewList,
getParkingAlyReportList,
getParkingAlyReportExp,
getParkingAlyDurationBar,
getParkingAlyDurationBerthList,

9
src/services/OperationCenter/CustomerManage/index.js

@ -81,10 +81,19 @@ const getComplainList = (params) => {
data: params,
});
};
//客服管理-反馈建议-撤回
const getRejectData = (params) => {
return ajax({
url: "/api/ope/service/withDraw",
type: "get",
data: params,
});
};
export default{
getCarErrorList,
getAppealList,
getFeedbackList,
getRejectData,
checkFeedData,
replyData,
dealData,

2
src/services/ParkingOverview/index.js

@ -44,7 +44,7 @@ export default {
//获取位置模糊检索
searchGeocode: (params) => {
return ajax({
url: "https://restapi.amap.com/v3/geocode/geo",
url: "/api/ana/overview/geocode",
type: "get",
data: params,
});

Loading…
Cancel
Save