Browse Source

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

tags/PMS_Frontend_v1.0.6-develop
chenglb 1 year ago
parent
commit
1f6bc9ef24
  1. BIN
      src/assets/images/blue.png
  2. BIN
      src/assets/images/green.png
  3. BIN
      src/assets/images/purple.png
  4. BIN
      src/assets/images/red.png
  5. BIN
      src/assets/images/yellow.png
  6. 1
      src/components/TableModule/index.jsx
  7. 73
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyOverview/index.scss
  8. 279
      src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyOverview/loadable.jsx
  9. 26
      src/pages/FinancialMgm/OrderInquiry/ParkingOrderInquiry/index.jsx
  10. 14
      src/pages/FinancialMgm/OrderInquiry/ProductOrderInquiry/index.jsx
  11. 19
      src/services/DataAnalysisPrediction/ParkingBusinessAly/index.js

BIN
src/assets/images/blue.png

After

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

BIN
src/assets/images/green.png

After

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

BIN
src/assets/images/purple.png

After

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

BIN
src/assets/images/red.png

After

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

BIN
src/assets/images/yellow.png

After

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

1
src/components/TableModule/index.jsx

@ -367,6 +367,7 @@ const TableModule = forwardRef((props, ref) => {
label={item.label} label={item.label}
name={item.name} name={item.name}
key={item.name} key={item.name}
defaultValue={item.defaultValue}
> >
<Select <Select
options={ options={

73
src/pages/DataAnalysisPrediction/ParkingBusinessAly/ParkingAlyOverview/index.scss

@ -124,7 +124,66 @@ $color-primary : var(--color-primary);
background: var(--color-user-list-bg); background: var(--color-user-list-bg);
border-top-left-radius: 20px; border-top-left-radius: 20px;
box-shadow: 0px 3px 8px 0px rgba(0, 0, 0, 0.08); 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 { .result {
@include flex-columns; @include flex-columns;
.result-box { .result-box {
@ -171,6 +230,18 @@ $color-primary : var(--color-primary);
margin: 18px 0 18px 18px; margin: 18px 0 18px 18px;
display: inline-block; display: inline-block;
} }
.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-top: 10px;
}
i { i {
border: 1px solid; border: 1px solid;
border-radius: 22px; border-radius: 22px;

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

@ -1,12 +1,13 @@
import React, { useState, useEffect } from "react"; import React, { useState, useEffect } from "react";
import { ResultFlowResult, DataSelect } from "@/components"; import { ResultFlowResult, DataSelect } from "@/components";
import { Select, Input, Button, Table, message, Pagination, DatePicker, Modal, Cascader, Tooltip } from "antd";
import { Select, Input, Button, Table, message, Pagination, Tabs, DatePicker, Modal, Cascader, Tooltip } from "antd";
import { useSessionStorageState } from "ahooks"; import { useSessionStorageState } from "ahooks";
import { lineChartOption, stackBarChartOption } from "@/config/character.config.js"; import { lineChartOption, stackBarChartOption } from "@/config/character.config.js";
import { useNavigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
import { setTabList } from "@/store/common.js"; import { setTabList } from "@/store/common.js";
import { useSelector, useDispatch } from "react-redux"; import { useSelector, useDispatch } from "react-redux";
import { QuestionCircleFilled } from "@ant-design/icons" import { QuestionCircleFilled } from "@ant-design/icons"
import { Icon } from "@/components"
import moment from "moment"; import moment from "moment";
import ReactEcharts from "echarts-for-react"; import ReactEcharts from "echarts-for-react";
import "./index.scss"; import "./index.scss";
@ -22,8 +23,8 @@ function ParkingAlyOverview() {
const [areaList, setAreaList] = useState([]); const [areaList, setAreaList] = useState([]);
// //
const defaultData = { const defaultData = {
// confirm_start_time: moment().subtract('days').startOf('day').format("YYYY-MM-DD HH:mm:ss"),
// confirm_end_time: moment().endOf("day").format("YYYY-MM-DD HH:mm:ss"),
start_time: moment().subtract('days').startOf('day').format("YYYY-MM-DD HH:mm:ss"),
end_time: moment().endOf("day").format("YYYY-MM-DD HH:mm:ss"),
// create_start_time: moment().subtract('days').startOf('day').format("YYYY-MM-DD HH:mm:ss"), // create_start_time: moment().subtract('days').startOf('day').format("YYYY-MM-DD HH:mm:ss"),
// create_end_time: moment().endOf("day").format("YYYY-MM-DD HH:mm:ss"), // create_end_time: moment().endOf("day").format("YYYY-MM-DD HH:mm:ss"),
date_type: 1, date_type: 1,
@ -52,6 +53,18 @@ function ParkingAlyOverview() {
total: 0, total: 0,
list: [], list: [],
}); });
//
const [baseData, setBaseData] = useState({
park_record_total: "",
turn_times: '',
use_parking_persent: "",
average_park_time: "",
});
//
const [tableData, setTableData] = useState({
area_list: [],
road_list: [],
});
// //
const [revenueData, setRevenueData] = useState({}); const [revenueData, setRevenueData] = useState({});
const [searchSelectList, setSearchSelectList] = useState([]); // const [searchSelectList, setSearchSelectList] = useState([]); //
@ -59,29 +72,63 @@ function ParkingAlyOverview() {
value: { value: {
} }
}) })
const [tabKey, setTabKey] = useState("1");
function changeKey(key) {
setTabKey(key);
}
const columns = [ const columns = [
{ {
title: '时间',
title: '序号',
dataIndex: 'index', dataIndex: 'index',
key: 'index', key: 'index',
// width: 100,
// fixed: 'left',
width: 100,
render: (text, record, index) => index + 1
},
{
title: '区域',
dataIndex: 'area_name',
key: 'area_name',
width: 280,
},
{
title: '泊位数(个)',
dataIndex: 'used_berths',
key: 'used_berths',
//width: 200,
},
{
title: '利用率',
dataIndex: 'area_rate',
key: 'area_rate',
width: 120,
}, },
]
const parkColumns = [
{ {
title: '停车总时长',
dataIndex: 'age',
key: 'age',
title: '序号',
dataIndex: 'index',
key: 'index',
width: 100,
render: (text, record, index) => index + 1
}, },
{ {
title: '日均泊位停车时长',
dataIndex: 'age',
key: 'age',
title: '停车场',
dataIndex: 'road_name',
key: 'road_name',
width: 280,
}, },
{ {
title: '日均泊位利用率',
dataIndex: 'age',
key: 'age',
title: '泊位数(个)',
dataIndex: 'used_berths',
key: 'used_berths',
//width: 200,
},
{
title: '利用率',
dataIndex: 'road_rate',
key: 'road_rate',
width: 120,
}, },
] ]
@ -93,8 +140,12 @@ function ParkingAlyOverview() {
getData({ getData({
...sessionTabList ...sessionTabList
}) })
getBaseData({
...sessionTabList
})
} else { } else {
getData() getData()
getBaseData()
} }
}, [isAjax]) }, [isAjax])
useEffect(() => { useEffect(() => {
@ -207,9 +258,9 @@ function ParkingAlyOverview() {
}, },
}; };
}); });
//setRevenueData(lineChartOption)
//setRevenueData(lineChartOption)
console.log(212, lineChartOption)
console.log(212, lineChartOption)
setRevenueData({ setRevenueData({
title: { title: {
text: "", text: "",
@ -335,10 +386,10 @@ function ParkingAlyOverview() {
postData = { ...holdData }; postData = { ...holdData };
} }
setDefaultParams({ ...postData, ...pageInfo }); setDefaultParams({ ...postData, ...pageInfo });
if(moment(formData.end_time)-moment(formData.start_time)>7*1000*3*24*3600){
message.error("超过三周")
if (moment(formData.end_time) - moment(formData.start_time) > 1000 * 31 * 24 * 3600) {
message.error("超过31天")
setLoading(false); setLoading(false);
setTabLoading(false);
setTabLoading(false);
return return
} }
setTabLoading(true); setTabLoading(true);
@ -359,7 +410,53 @@ function ParkingAlyOverview() {
} }
); );
}; };
//
const getBaseData = (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
}
setTabLoading(true);
ajax.getParkingAlyOverviewBase({ ...postData, ...v, ...pageInfo }).then(
(res) => {
if (parseInt(res?.status) === 20000) {
setBaseData(res?.data.list || {});
} else {
message.error(res?.message);
}
setLoading(false);
setTabLoading(false);
},
(err) => {
console.log(err);
setLoading(false);
setTabLoading(false);
}
);
ajax.getParkingAlyOverviewList({ ...postData, ...v, ...pageInfo }).then(
(res) => {
if (parseInt(res?.status) === 20000) {
setTableData(res?.data.list || {});
} else {
message.error(res?.message);
}
setLoading(false);
setTabLoading(false);
},
(err) => {
console.log(err);
setLoading(false);
setTabLoading(false);
}
);
};
// //
const handleSearch = () => { const handleSearch = () => {
setLoading(true); setLoading(true);
@ -479,7 +576,7 @@ function ParkingAlyOverview() {
</div> </div>
<div className="yisa-search"> <div className="yisa-search">
<label>日期 <label>日期
<div className="daf">
{/* <div className="daf">
<Select <Select
value={formData.date_type} value={formData.date_type}
// style={{ // style={{
@ -502,7 +599,7 @@ function ParkingAlyOverview() {
]} ]}
onChange={(e) => SetTimeNow(e)} onChange={(e) => SetTimeNow(e)}
/> />
</div>
</div> */}
</label> </label>
<DatePicker <DatePicker
style={{ width: "100%" }} style={{ width: "100%" }}
@ -598,10 +695,57 @@ function ParkingAlyOverview() {
</div> </div>
</div> </div>
<div className="paid-result soll-result"> <div className="paid-result soll-result">
<div className="result">
<div className="result-box">
<div className="result-box-title">停车指标总览</div>
<div className="result-hd-overview">
<div className="result-header rea">
<div className="result-content">
<div className="title">停车记录次数</div>
<Tooltip
placement="topLeft"
title={<span>统计期间内的总停车记录数 以入场为准</span>}
>
<i>?</i>
</Tooltip>
<div className="num">{baseData.park_record_total}</div>
</div>
</div>
<div className="result-header reb">
<div className="result-content">
<div className="title">日均泊位周转次数</div>
<Tooltip
placement="topLeft"
title={<span>统计期间内平均每日每泊位的停车记是数</span>}
>
<i>?</i>
</Tooltip>
<div className="num">{baseData.turn_times}</div>
</div>
</div>
<div className="result-header rec">
<div className="result-content">
<div className="title">停车资源利用率</div>
<Tooltip
placement="topLeft"
title={<span>统计期间内停车资源使用比例</span>}
>
<i>?</i>
</Tooltip>
<div className="num">{baseData.use_parking_persent}</div>
</div>
</div> </div>
<div className="result-header red">
<div className="result-content">
<div className="title">平均停车时长</div>
<Tooltip
placement="topLeft"
title={<span>统计期间内入场的停车记录的平均停车时长</span>}
>
<i>?</i>
</Tooltip>
<div className="num">{baseData.average_park_time}</div>
</div>
</div>
</div>
<div className="result">
<div className="result-box"> <div className="result-box">
<div className="result-box-title">停车趋势分析</div> <div className="result-box-title">停车趋势分析</div>
<ReactEcharts <ReactEcharts
@ -616,38 +760,71 @@ function ParkingAlyOverview() {
</div> </div>
<div className="result-box overview-right"> <div className="result-box overview-right">
<div className="result-box-title">停车资源利用率排行榜</div> <div className="result-box-title">停车资源利用率排行榜</div>
<Table
columns={columns}
dataSource={[
{
index: 1,
},
{
index: 1,
},
{
index: 1,
},
{
index: 1,
},
<div className="export-btn">导出</div>
<div>
<div onClick={()=>{message.success('up')}}></div>
<div onClick={()=>{message.success('down')}}></div>
</div>
<Tabs
defaultActiveKey="2"
items={[
{ {
index: 1,
label: <div>
<div onClick={()=>{message.success('up')}}></div>
<div onClick={()=>{message.success('down')}}></div>
</div>,
key: '1',
children: `Content of Tab Pane 1`,
}, },
{ {
index: 1,
label: `Tab 2`,
key: '2',
children: `Content of Tab Pane 2`,
}, },
{ {
index: 1,
label: `Tab 3`,
key: '3',
children: `Content of Tab Pane 3`,
}, },
]}
bordered
size="middle"
// scroll={{
// x: 'calc(700px + 50%)',
// y: 240,
// }}
]}
/> />
<Tabs activeKey={tabKey} onChange={changeKey} tabBarExtraContent={{ left: "123" }}>
<Tabs.TabPane tab="序号" key="0" disabled="true">
</Tabs.TabPane>
<Tabs.TabPane tab="区域" key="1" children={{ left: "123" }}>
<Table
showHeader={false}
columns={columns}
dataSource={tableData.area_list}
bordered
size="middle"
// scroll={{
// x: 'calc(700px + 50%)',
// y: 240,
// }}
/>
</Tabs.TabPane>
<Tabs.TabPane tab="停车场" key="2" tabBarExtraContent={() => <div>
<div></div>
<div></div>
</div>}>
<Table
showHeader={false}
columns={parkColumns}
dataSource={tableData.road_list}
bordered
size="middle"
// scroll={{
// x: 'calc(700px + 50%)',
// y: 240,
// }}
/>
</Tabs.TabPane>
<Tabs.TabPane tab="泊位数(个)" key="3" disabled="true">
</Tabs.TabPane>
<Tabs.TabPane tab="利用率" key="4" disabled="true">
</Tabs.TabPane>
</Tabs>
</div> </div>
</div> </div>
</div> </div>

26
src/pages/FinancialMgm/OrderInquiry/ParkingOrderInquiry/index.jsx

@ -423,12 +423,20 @@ function ParkingOrderInquiry() {
value: 0, value: 0,
}, },
{ {
label: "订单自动找平",
value: 1,
label: "重复支付退款",
value: 2,
},
{
label: "异常支付退款",
value: 7,
}, },
{ {
label: "异常订单处理", label: "异常订单处理",
value: 2,
value: 11,
},
{
label: "自动平单退款",
value: 12,
}, },
], ],
}, },
@ -496,9 +504,9 @@ function ParkingOrderInquiry() {
break break
default: break default: break
} }
if ((tabKey == '2') && e && !e?.type) {
e.type = 1
}
// if ((tabKey == '2') && e && !e?.type) {
// e.type = 1
// }
ajax({ ajax({
url: url, url: url,
type: "post", type: "post",
@ -608,13 +616,14 @@ function ParkingOrderInquiry() {
); );
} }
// //
function renderTable(columns, arr, dataSource, exportUrl, limit) {
function renderTable(columns, arr, dataSource, exportUrl, initFormData = {}, limit) {
return ( return (
<TableModule <TableModule
columns={columns} columns={columns}
tableData={dataSource} tableData={dataSource}
formSearch={arr} formSearch={arr}
total={total} total={total}
initFormData={initFormData}
exportUrl={exportUrl} exportUrl={exportUrl}
limitCon={limit ? limitCon : null} limitCon={limit ? limitCon : null}
search={searchOther} search={searchOther}
@ -759,6 +768,7 @@ function ParkingOrderInquiry() {
tableData={resultData} tableData={resultData}
formSearch={[ash[25], ash[0], ash[1], ash[2], ash[3], ash[18], ash[5], ash[12], ash[26], ash[29]]} formSearch={[ash[25], ash[0], ash[1], ash[2], ash[3], ash[18], ash[5], ash[12], ash[26], ash[29]]}
total={total} total={total}
initFormData={{ type: 1 }}
exportUrl={'/api/fin/order_search/arrears_order_export'} exportUrl={'/api/fin/order_search/arrears_order_export'}
limitCon={limitCon} limitCon={limitCon}
search={searchOther} search={searchOther}
@ -770,7 +780,7 @@ function ParkingOrderInquiry() {
createCol(['停车订单ID', '欠费金额(元)', '订单修改时间', '修改原因', '处理记录ID', '区域', '商户名称', '停车场名称', '车场类型', '车牌号', '入场时间', '出场时间', '停车时长'], createCol(['停车订单ID', '欠费金额(元)', '订单修改时间', '修改原因', '处理记录ID', '区域', '商户名称', '停车场名称', '车场类型', '车牌号', '入场时间', '出场时间', '停车时长'],
['park_record_id', 'arrearsAmount', 'examine_time', 'update_reason', 'deal_record_id', 'area', 'merchantName', 'sectionName', 'parking_model_type', 'licensePlateNumber', 'entryTime', 'exitTime', 'parkingDuration'], 0), ['park_record_id', 'arrearsAmount', 'examine_time', 'update_reason', 'deal_record_id', 'area', 'merchantName', 'sectionName', 'parking_model_type', 'licensePlateNumber', 'entryTime', 'exitTime', 'parkingDuration'], 0),
[ash[25], ash[1], ash[2], ash[18], ash[26], ash[29], ash[5], ash[12], ash[27], ash[28]], [ash[25], ash[1], ash[2], ash[18], ash[26], ash[29], ash[5], ash[12], ash[27], ash[28]],
resultData, '/api/fin/order_search/arrears_order_update_list_export', 1
resultData, '/api/fin/order_search/arrears_order_update_list_export', { type: 1 }, 1
) : null} ) : null}
</Tabs.TabPane> </Tabs.TabPane>
{/* <Tabs.TabPane tab="" key="3"> {/* <Tabs.TabPane tab="" key="3">

14
src/pages/FinancialMgm/OrderInquiry/ProductOrderInquiry/index.jsx

@ -381,12 +381,20 @@ function ProductOrderInquiry() {
value: 0, value: 0,
}, },
{ {
label: "订单自动找平",
value: 1,
label: "重复支付退款",
value: 2,
},
{
label: "异常支付退款",
value: 7,
}, },
{ {
label: "异常订单处理", label: "异常订单处理",
value: 2,
value: 11,
},
{
label: "自动平单退款",
value: 12,
}, },
], ],
}, },

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

@ -1,21 +1,22 @@
import ajax from "@/config/ajax" import ajax from "@/config/ajax"
//停车业务分析-停车分析报表-列表
const getParkingAlyReportLis = (params) => {
//停车业务分析-停车总分析-停车指标概览
const getParkingAlyOverviewBase = (params) => {
return ajax({ return ajax({
url: "",
type: "get",
url: "/api/bpm/dataanalysis/get_base_info",
type: "post",
data: params, data: params,
}); });
}; };
//停车业务分析-停车分析报表-列表
const getParkingAlyReportList = (params) => {
//停车业务分析-停车总分析-停车资源利用率排行榜
const getParkingAlyOverviewList = (params) => {
return ajax({ return ajax({
url: "",
type: "get",
url: "/api/bpm/dataanalysis/show_payment_rate",
type: "post",
data: params, data: params,
}); });
}; };
export default{ export default{
getParkingAlyReportList,
getParkingAlyOverviewBase,
getParkingAlyOverviewList,
} }
Loading…
Cancel
Save