18 changed files with 1073 additions and 58 deletions
-
BINsrc/assets/images/equip/equip1.png
-
BINsrc/assets/images/equip/equip2.png
-
BINsrc/assets/images/equip/equip3.png
-
BINsrc/assets/images/equip/equip4.png
-
BINsrc/assets/images/equip/equip5.png
-
291src/pages/DataAnalysisPrediction/EquipmentAly/EquipmentRunningStat/index.scss
-
717src/pages/DataAnalysisPrediction/EquipmentAly/EquipmentRunningStat/loadable.jsx
-
2src/pages/DataAnalysisPrediction/MemberStat/ParkingAly/loadable.jsx
-
2src/pages/DataAnalysisPrediction/MemberStat/PayAly/loadable.jsx
-
2src/pages/DataAnalysisPrediction/MemberStat/RegisterAly/loadable.jsx
-
20src/pages/FinancialMgm/FinancialReport/BookReport/loadable.jsx
-
16src/pages/FinancialMgm/FinancialReport/OperationReport/loadable.jsx
-
13src/pages/FinancialMgm/FinancialReport/ParkCardReport/loadable.jsx
-
15src/pages/FinancialMgm/FinancialReport/ParkingIncomeReport/loadable.jsx
-
12src/pages/FinancialMgm/FinancialReport/PayChannelStat/loadable.jsx
-
15src/pages/FinancialMgm/FinancialReport/PaySummaryReport/loadable.jsx
-
13src/pages/FinancialMgm/FinancialReport/PdaStat/loadable.jsx
-
13src/pages/FinancialMgm/FinancialReport/PreOrderReport/loadable.jsx
After Width: 423 | Height: 108 | Size: 5.0 KiB |
After Width: 423 | Height: 108 | Size: 5.1 KiB |
After Width: 423 | Height: 108 | Size: 5.2 KiB |
After Width: 423 | Height: 108 | Size: 4.8 KiB |
After Width: 423 | Height: 108 | Size: 5.1 KiB |
@ -1,15 +1,714 @@ |
|||
import React, { useState, useRef, useEffect } from "react"; |
|||
// import { message, Pagination, Table, Space, Modal, } from "antd"; |
|||
// import { dictionary, utils } from "@/config/common"; |
|||
// import moment from 'moment' |
|||
import { |
|||
message, |
|||
Pagination, |
|||
Table, |
|||
Select, |
|||
Input, |
|||
Popover, |
|||
Cascader, |
|||
AutoComplete, |
|||
Tooltip, |
|||
Checkbox, |
|||
Form, |
|||
DatePicker, |
|||
} from "antd"; |
|||
import { dictionary, utils } from "@/config/common"; |
|||
import moment from "moment"; |
|||
import { |
|||
FunnelPlotOutlined, |
|||
CloseOutlined, |
|||
InfoCircleOutlined, |
|||
DownOutlined, |
|||
UpOutlined, |
|||
} from "@ant-design/icons"; |
|||
import ajax from "@/services"; |
|||
// import { useSessionStorageState, useUpdateEffect, useSize, useUpdate } from 'ahooks'; |
|||
// import ajax from "@/services" |
|||
// import { FormInput, FormSelect, OptionPanel, ResultPanel, FormSliderPicker, AreaCascader, ImgResize, ImgZoom, } from "@/components" |
|||
// import "./index.scss"; |
|||
// import errorImg from "@/assets/images/layout/error.png" |
|||
import { ResultFlow } from "@/components"; |
|||
import "./index.scss"; |
|||
import Equip1 from "@/assets/images/equip/equip1.png"; |
|||
import Equip2 from "@/assets/images/equip/equip2.png"; |
|||
import Equip3 from "@/assets/images/equip/equip3.png"; |
|||
import Equip4 from "@/assets/images/equip/equip4.png"; |
|||
import Equip5 from "@/assets/images/equip/equip5.png"; |
|||
// import { useLocation } from "react-router-dom"; |
|||
const { RangePicker } = DatePicker; |
|||
const { TextArea } = Input; |
|||
function ExceptionParkReport() { |
|||
return <div>ExceptionParkReport</div> |
|||
const formdata = { |
|||
operator_id: "0", //商户 |
|||
name: "", //停车场名称 |
|||
park_type: "", //车场类型 1=路内 2=路外 |
|||
operator_status: [], //商用状态(1为待上线,2为商用,3为试运营,4为下线) |
|||
area: [], |
|||
date_type: "1", |
|||
is_excel: 0, |
|||
start_time: moment() |
|||
.startOf("day") |
|||
.subtract(1, "days") |
|||
.format("YYYY-MM-DD"), |
|||
end_time: moment().endOf("day").subtract(1, "days").format("YYYY-MM-DD"), |
|||
pn: 1, |
|||
page_size: dictionary?.pageSizeOptions1[0], |
|||
}; |
|||
//图新展示 |
|||
const tabt = [ |
|||
{ |
|||
text: "设备总数(个)", |
|||
value: 4642, |
|||
icon: Equip1, |
|||
}, |
|||
{ |
|||
text: "离线次数(次)", |
|||
value: 1, |
|||
icon: Equip2, |
|||
tip: "离线时间大于20分钟,记为1次离线,连续离线不会记多次", |
|||
}, |
|||
{ |
|||
text: "离线总时长", |
|||
value: "32天20时49分0秒", |
|||
icon: Equip3, |
|||
}, |
|||
{ |
|||
text: "离线时长占比", |
|||
value: "99.58%", |
|||
icon: Equip4, |
|||
tip: "离线设备总时长/离线设备工作时长*100%", |
|||
}, |
|||
{ |
|||
text: "离线时长占比", |
|||
subtext: "(全部设备)", |
|||
value: "0.71%", |
|||
icon: Equip5, |
|||
tip: "离线设备总时长/全区所有设备工作时长*100%", |
|||
}, |
|||
]; |
|||
|
|||
const col = [ |
|||
{ |
|||
title: "车场名称", |
|||
dataIndex: "road_name", |
|||
key: "road_name", |
|||
align: "center", |
|||
}, |
|||
{ |
|||
title: "设备总数", |
|||
dataIndex: "date", |
|||
key: "date", |
|||
align: "center", |
|||
}, |
|||
{ |
|||
title: "离线次数", |
|||
dataIndex: "date", |
|||
key: "date", |
|||
align: "center", |
|||
}, |
|||
{ |
|||
title: "离线总时长", |
|||
dataIndex: "date", |
|||
key: "date", |
|||
align: "center", |
|||
}, |
|||
{ |
|||
title: "离线设备离线时长占比", |
|||
dataIndex: "date", |
|||
key: "date", |
|||
align: "center", |
|||
}, |
|||
{ |
|||
title: "全部设备离线时长占比", |
|||
dataIndex: "date", |
|||
key: "date", |
|||
align: "center", |
|||
}, |
|||
]; |
|||
let form_data = sessionStorage.getItem("FormData_OperationReport"); |
|||
//检索 |
|||
const [FormData, setFormData] = useState( |
|||
form_data ? JSON.parse(form_data) : formdata |
|||
); |
|||
//检索2 |
|||
const [FormDatas, setFormDatas] = useState( |
|||
form_data ? JSON.parse(form_data) : formdata |
|||
); |
|||
//页码状态 |
|||
const [loading, setLoading] = useState(false); |
|||
//页面数据 |
|||
const [Data, setData] = useState({ |
|||
data: [], |
|||
total: 0, |
|||
}); |
|||
|
|||
//获取区域 |
|||
const [Area, setArea] = useState([]); |
|||
//商户 |
|||
const [Yunying, setYunying] = useState([]); |
|||
//自动填充 |
|||
const [options, setOptions] = useState([]); |
|||
|
|||
const [Open, setOpen] = useState(true); |
|||
//筛选 |
|||
const [selectArr, setSelectArr] = useState([]); |
|||
//是否展开显示 |
|||
const [Show, setShow] = useState(false); |
|||
const column = (arr) => { |
|||
let copr = []; |
|||
if (arr.length) { |
|||
col.forEach((ele, index) => { |
|||
if (ele.children) { |
|||
var lisr = []; |
|||
let bool = false; |
|||
ele.children.forEach((val) => { |
|||
if (!arr.includes(val.key)) { |
|||
lisr.push(val); |
|||
bool = true; |
|||
} |
|||
}); |
|||
if (bool) { |
|||
copr.push({ ...ele, children: [...lisr] }); |
|||
} |
|||
} else { |
|||
if (!arr.includes(ele.key)) { |
|||
copr.push(ele); |
|||
} |
|||
} |
|||
}); |
|||
} else { |
|||
copr = col; |
|||
} |
|||
return [...copr]; |
|||
}; |
|||
const onSearch = (searchText) => { |
|||
console.log(searchText); |
|||
setOptions([]); |
|||
}; |
|||
|
|||
//时间状态切换 |
|||
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().format("YYYY-MM"); |
|||
end = moment().format("YYYY-MM"); |
|||
} 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").subtract(1, "days").format("YYYY-MM-DD"); |
|||
end = moment().endOf("day").subtract(1, "days").format("YYYY-MM-DD"); |
|||
} |
|||
setFormData({ |
|||
...FormData, |
|||
date_type: e, |
|||
start_time: start, |
|||
end_time: end, |
|||
}); |
|||
}; |
|||
|
|||
//页码 |
|||
function onShowSizeChange(pn, page_size) { |
|||
let temFormData = {}; |
|||
if (FormData.page_size == page_size) { |
|||
temFormData = { |
|||
...FormData, |
|||
pn, |
|||
}; |
|||
} else { |
|||
temFormData = { |
|||
...FormData, |
|||
pn: 1, |
|||
page_size, |
|||
}; |
|||
} |
|||
setFormData(temFormData); |
|||
setFormDatas(temFormData); |
|||
} |
|||
const onChange = (eal) => { |
|||
var e = eal; |
|||
var are = JSON.parse(JSON.stringify(selectArr)); |
|||
if (are.includes(e)) { |
|||
are.forEach((ele, index) => { |
|||
if (ele == e) { |
|||
are.splice(index, 1); |
|||
} |
|||
}); |
|||
} else { |
|||
are.push(e); |
|||
} |
|||
setSelectArr([...are]); |
|||
}; |
|||
|
|||
const SelectCol = () => { |
|||
return ( |
|||
<div className="selectcolsopt"> |
|||
<p className="tirl">隐藏列</p> |
|||
{col.map((ele) => { |
|||
if (ele.children) { |
|||
return ele.children.map((val) => { |
|||
return ( |
|||
<div className="licd" key={val.key}> |
|||
<Checkbox |
|||
value={selectArr.includes(val.key)} |
|||
onChange={() => onChange(val.key)} |
|||
disabled={ |
|||
selectArr.length == 19 && !selectArr.includes(val.key) |
|||
} |
|||
> |
|||
{val.title} |
|||
</Checkbox> |
|||
</div> |
|||
); |
|||
}); |
|||
} else { |
|||
return ( |
|||
<div className="licd" key={ele.key}> |
|||
<Checkbox |
|||
value={selectArr.includes(ele.key)} |
|||
onChange={() => onChange(ele.key)} |
|||
disabled={ |
|||
selectArr.length == 19 && !selectArr.includes(ele.key) |
|||
} |
|||
> |
|||
{ele.title} |
|||
</Checkbox> |
|||
</div> |
|||
); |
|||
} |
|||
})} |
|||
</div> |
|||
); |
|||
}; |
|||
//获取页面筛选数据 |
|||
const getSelectData = () => { |
|||
ajax.getAllOperator().then( |
|||
(res) => { |
|||
if (parseInt(res?.status) === 20000) { |
|||
setYunying(res.data); |
|||
} else { |
|||
message.error(res?.message); |
|||
} |
|||
setLoading(true); |
|||
}, |
|||
(err) => { |
|||
console.log(err); |
|||
setLoading(true); |
|||
} |
|||
); |
|||
ajax.getAreaTree().then( |
|||
(res) => { |
|||
if (parseInt(res?.status) === 20000) { |
|||
setArea(res.data); |
|||
} else { |
|||
message.error(res?.message); |
|||
} |
|||
setLoading(true); |
|||
}, |
|||
(err) => { |
|||
console.log(err); |
|||
setLoading(true); |
|||
} |
|||
); |
|||
}; |
|||
//下载 |
|||
const Daownload = (url) => { |
|||
var link = document.createElement("a"); |
|||
link.setAttribute("target", "_blank"); |
|||
link.style.display = "none"; |
|||
link.href = url ? url : ""; |
|||
document.body.appendChild(link); |
|||
link.click(); |
|||
document.body.removeChild(link); |
|||
}; |
|||
//导出 |
|||
const ReportPaySummaryReport = () => { |
|||
ajax.ElectInvoice.getOperationReport({ |
|||
...FormDatas, |
|||
is_excel: 1, |
|||
}).then( |
|||
(res) => { |
|||
if (parseInt(res?.status) === 20000) { |
|||
Daownload(res?.data?.url); |
|||
} else { |
|||
message.error(res?.message); |
|||
} |
|||
}, |
|||
(err) => { |
|||
console.log(err); |
|||
} |
|||
); |
|||
}; |
|||
//获取页面显示数据 |
|||
const getData = (data) => { |
|||
setLoading(false); |
|||
ajax.ElectInvoice.getOperationReport({ |
|||
...data, |
|||
area: data?.area?.length ? data?.area[data.area.length - 1] : "", |
|||
}).then( |
|||
(res) => { |
|||
if (parseInt(res?.status) === 20000) { |
|||
setData({ |
|||
data: res?.data?.list || [], |
|||
total: res?.total || 0, |
|||
}); |
|||
setLoading(true); |
|||
} else { |
|||
message.error(res?.message); |
|||
} |
|||
setLoading(true); |
|||
}, |
|||
(err) => { |
|||
console.log(err); |
|||
setLoading(true); |
|||
} |
|||
); |
|||
}; |
|||
useEffect(() => { |
|||
sessionStorage.setItem( |
|||
"FormData_OperationReport", |
|||
JSON.stringify(FormDatas) |
|||
); |
|||
// getData(FormDatas); |
|||
//调用接口 |
|||
}, [FormDatas]); |
|||
useEffect(() => { |
|||
getSelectData(); |
|||
}, []); |
|||
return ( |
|||
<div className="ExceptionParkReport"> |
|||
<div className="body_cenf"> |
|||
<div className="left_search"> |
|||
<div className="hrestit">查询条件</div> |
|||
<div className="form_item"> |
|||
<div className="labb"> |
|||
日期 |
|||
<div className="daf"> |
|||
<Select |
|||
value={FormData.date_type} |
|||
// style={{ |
|||
// width: "100%", |
|||
// }} |
|||
placeholder="请选择" |
|||
options={[ |
|||
{ |
|||
value: "1", |
|||
label: "日", |
|||
}, |
|||
{ |
|||
value: "2", |
|||
label: "周", |
|||
}, |
|||
{ |
|||
value: "3", |
|||
label: "月", |
|||
}, |
|||
{ |
|||
value: "4", |
|||
label: "年", |
|||
}, |
|||
]} |
|||
onChange={(e) => SetTimeNow(e)} |
|||
/> |
|||
</div> |
|||
</div> |
|||
<div className="inputs"> |
|||
<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) => { |
|||
console.log(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 { |
|||
setFormData({ ...FormData, start_time: dateString }); |
|||
} |
|||
}} |
|||
disabledDate={(current) => current > moment(FormData.end_time)} |
|||
/> |
|||
</div> |
|||
</div> |
|||
<div className="form_item"> |
|||
<span className="lab">至</span> |
|||
<div className="inputs"> |
|||
<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 { |
|||
setFormData({ ...FormData, end_time: dateString }); |
|||
} |
|||
}} |
|||
disabledDate={(current) => |
|||
current < moment(FormData.start_time) |
|||
} |
|||
/> |
|||
</div> |
|||
</div> |
|||
<div className="form_item"> |
|||
<span className="lab">区域</span> |
|||
<div className="inputs"> |
|||
<Cascader |
|||
options={Area} |
|||
expandTrigger="hover" |
|||
value={FormData.area} |
|||
style={{ |
|||
width: "100%", |
|||
}} |
|||
changeOnSelect |
|||
fieldNames={{ |
|||
label: "name", |
|||
value: "id", |
|||
children: "children", |
|||
}} |
|||
onChange={(e) => |
|||
setFormData({ |
|||
...FormData, |
|||
area: e, |
|||
}) |
|||
} |
|||
/> |
|||
</div> |
|||
</div> |
|||
<div className="form_item"> |
|||
<span className="lab">运营商</span> |
|||
<div className="inputs"> |
|||
<Select |
|||
value={FormData.operator_id} |
|||
style={{ |
|||
width: "100%", |
|||
}} |
|||
placeholder="请选择" |
|||
options={Yunying} |
|||
onChange={(e) => |
|||
setFormData({ |
|||
...FormData, |
|||
operator_id: e, |
|||
}) |
|||
} |
|||
/> |
|||
</div> |
|||
</div> |
|||
<div className="form_item"> |
|||
<span className="lab">停车场</span> |
|||
<div className="inputs"> |
|||
<AutoComplete |
|||
value={FormData.name} |
|||
style={{ |
|||
width: "100%", |
|||
}} |
|||
placeholder="输入路段名称" |
|||
options={options} |
|||
onSearch={onSearch} |
|||
onChange={(e) => { |
|||
console.log(e); |
|||
setFormData({ |
|||
...FormData, |
|||
name: e, |
|||
}); |
|||
}} |
|||
/> |
|||
</div> |
|||
</div> |
|||
<div className="form_item"> |
|||
<span className="lab">车场类型</span> |
|||
<div className="inputs"> |
|||
<Select |
|||
value={FormData.park_type} |
|||
style={{ |
|||
width: "100%", |
|||
}} |
|||
placeholder="请选择" |
|||
options={[ |
|||
{ |
|||
value: "", |
|||
label: "全部", |
|||
}, |
|||
{ |
|||
value: "1", |
|||
label: "路内车场", |
|||
}, |
|||
{ |
|||
value: "2", |
|||
label: "路外车场", |
|||
}, |
|||
]} |
|||
onChange={(e) => |
|||
setFormData({ |
|||
...FormData, |
|||
park_type: e, |
|||
}) |
|||
} |
|||
/> |
|||
</div> |
|||
</div> |
|||
<div className="but_on"> |
|||
<span |
|||
className="sear_res" |
|||
onClick={() => { |
|||
var reset = formdata; |
|||
setFormData(reset); |
|||
setFormDatas(reset); |
|||
}} |
|||
> |
|||
重置 |
|||
</span> |
|||
<span |
|||
className={"sear_ser lent"} |
|||
onClick={() => { |
|||
var fortm = FormData; |
|||
setFormData({ |
|||
...fortm, |
|||
pn: 1, |
|||
}); |
|||
setFormDatas({ |
|||
...fortm, |
|||
pn: 1, |
|||
}); |
|||
}} |
|||
> |
|||
查询 |
|||
</span> |
|||
</div> |
|||
</div> |
|||
<div className="right_tab"> |
|||
<div className="sheisgirl"> |
|||
{tabt.map((ele) => { |
|||
return ( |
|||
<div |
|||
key={ele.text} |
|||
style={{ |
|||
background: `url(${ele.icon})`, |
|||
backgroundSize: "100% 100%", |
|||
}} |
|||
className="gchild" |
|||
> |
|||
<div className="gps">{ele.text}</div> |
|||
{ele?.subtext ? <div className="gnu">{ele.subtext}</div> : ""} |
|||
<div className="gnum">{ele.value}</div> |
|||
</div> |
|||
); |
|||
})} |
|||
</div> |
|||
<div className="sd"> |
|||
<p> |
|||
共查询到<span> {Data?.total || 0}</span>条数据 |
|||
</p> |
|||
<span |
|||
className={"sear_ser"} |
|||
onClick={() => { |
|||
ReportPaySummaryReport(); |
|||
// setFormDatas({ ...FormData }); |
|||
}} |
|||
> |
|||
导出 |
|||
</span> |
|||
</div> |
|||
<ResultFlow |
|||
hasLoad={true} |
|||
loading={loading} |
|||
resultData={Data.data} |
|||
message={"暂无数据"} |
|||
> |
|||
<div className="scrplltab"> |
|||
<div className="table_raps"> |
|||
<Table |
|||
className="yisa_tabled" |
|||
columns={column(selectArr)} |
|||
rowKey={(record) => record.id} |
|||
dataSource={Data.data} |
|||
pagination={false} |
|||
scroll={{ |
|||
// x: 1300, |
|||
y: "calc(100vh - 480px)", |
|||
}} |
|||
/> |
|||
</div> |
|||
</div> |
|||
|
|||
<div> |
|||
<Pagination |
|||
className="pagination-common" |
|||
showSizeChanger={true} |
|||
showQuickJumper={true} |
|||
// showTotal={() => `共 ${total_records} 条`} |
|||
total={Data.total} |
|||
current={FormData.pn} |
|||
pageSize={FormData.page_size} |
|||
pageSizeOptions={dictionary?.pageSizeOptions} |
|||
onChange={onShowSizeChange} |
|||
onShowSizeChange={onShowSizeChange} |
|||
/> |
|||
</div> |
|||
</ResultFlow> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
); |
|||
} |
|||
|
|||
export default ExceptionParkReport; |
|||
export default ExceptionParkReport; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue