You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

836 lines
27 KiB
Dart

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:hyzp_ybqx02_xingwen/components/save_data_to_file.dart';
import 'package:hyzp_ybqx02_xingwen/pages/Works/TJXX/zptj_bar_chart.dart';
import 'package:hyzp_ybqx02_xingwen/pages/Works/TJXX/zptj_bar_chart_one.dart';
import '../../../components/commonFun.dart';
import '../../../components/hyxx_data_handle.dart';
import 'tj_data.dart';
//zptj 是本项目中“抓拍统计”的统一缩写
//sh_hyc_tj 是本项目中“审核黑烟车统计”的统一缩写
//clltj 是本项目中“车流量统计”的统一缩写
class ZptjPage extends StatefulWidget {
//mapStatisType 为统计数据类型数据结构。用于在同一套代码中,处理相似类型的多种统计数据
//statisType 为统计类型。mapStatisType[statisType] 为各种相似类型的设置数据
ZptjPage({@required this.statisType, Key key}) : super(key: key);
String statisType;
_ZptjPageState createState() => _ZptjPageState();
}
class _ZptjPageState extends State<ZptjPage> {
//try_setState(); //避免异常报错
try_setState() {
try {
setState(() {});
} catch (e) {
print('setState(() {})异常:${e}');
}
}
@override
void dispose() {
super.dispose();
}
@override
void initState() {
// ///获取点位信息数据
// listZptjStatis.clear(); //最后需要显示的数据
//
// if (listDwinfoGetList2.isEmpty) {
// //若没有读取了点位数据,便需要先读取
// getThePageList(theHyshlx: 'dwxx').then((value) {
// listDwinfoGetList2 = value;
// print('listDwinfoGetList2 = \n$listDwinfoGetList2');
// getZptjStatis(widget.statisType).then((value) {
// _listSort(sortField: 'dwbh');
// });
// });
// } else {
// //若已经读取了点位数据,便直接使用
// print('listDwinfoGetList2 = \n$listDwinfoGetList2');
// getZptjStatis(widget.statisType).then((value) {
// _listSort(sortField: 'dwbh');
// });
// }
super.initState();
}
///获取点位信息数据
// List listDwinfoGetList2 = [
// {
// "id": 1,
// "dwip": "172.16.3.1",
// "dwmc": "江北振兴大道",
// "dwbh": 1,
// "dwinfo": "江北振兴大道入城方向",
// "dwzb": "104.607091|28.807061",
// "dwms": "江北振兴大道入城方向,识别孜岩、红坝路入城排放黑烟车辆"
// },
// ];
//listZptjStatis = [
// {today: 832, all: 4479, dwip: 172.16.3.1},
// {today: 0, all: 185, dwip: 172.16.3.2},
// {today: 0, all: 131, dwip: 172.16.3.3},
// {today: 0, all: 72, dwip: 172.16.3.4},
// {today: 0, all: 30, dwip: 172.16.3.5},
// {today: 0, all: 26, dwip: 172.16.3.6},
// {today: 0, all: 0, dwip: 172.16.3.7},
// {today: 0, all: 135, dwip: 172.16.3.8},
// {today: 0, all: 65, dwip: 172.16.3.9},
// {today: 0, all: 36, dwip: 172.16.3.10},
// {today: 0, all: 44, dwip: 172.16.3.11},
// {today: 0, all: 76, dwip: 172.16.3.12},
// {today: 0, all: 83, dwip: 172.16.3.13}
//]
Widget _getListTile(BuildContext context, int indexRecord, {double width = 520}) {
switch (widget.statisType) {
case 'zptj':
return _getZptjListTile(context, indexRecord, 520);
break;
case 'clltj':
return _getClltjListTile(context, indexRecord, 520);
break;
case 'sh_hyc_tj':
return _getSh_hyc_tjListTile(context, indexRecord, 510);
break;
default:
return Container();
break;
}
}
//抓拍统计数据
//{
// "today": 0,
// "all": 72
// "dwbh": 1,
// "dwmc": "江北振兴大道",
// "dwip": "172.16.3.1"
//}
Widget _getSh_hyc_tjListTile(BuildContext context, int indexRecord, double width) {
return Column(
children: <Widget>[
ListTile(
//leading: new Icon(Icons.phone),
title: getDwmcField(indexRecord, 40),
// subtitle:
// Text('今日:${listZptjStatis[indexRecord]['today']}', style: TextStyle(fontSize: 10)),
trailing: Container(
width: ScreenUtil().setWidth(width),
child: Row(
children: [
getText(
text: listAllStatisData[indexRecord]['hyc_all'].toString(),
width: 260,
fontSize: 16),
getText(
text: listAllStatisData[indexRecord]['send_all'].toString(),
width: 240,
fontSize: 16),
],
),
),
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
enabled: true,
onTap: () async {},
),
Divider(height: 1.0),
],
);
}
Widget getText({String text = '', double width = 100, double fontSize = 16}) {
return SizedBox(
width: ScreenUtil().setWidth(width),
child: Text(
text,
maxLines: 1,
overflow: TextOverflow.ellipsis,
//textAlign: TextAlign.right,
style: TextStyle(fontSize: fontSize),
),
);
}
///获取点位信息数据
// List listDwinfoGetList2 = [
// {
// "id": 1,
// "dwip": "172.16.3.1",
// "dwmc": "江北振兴大道",
// "dwbh": 1,
// "dwinfo": "江北振兴大道入城方向",
// "dwzb": "104.607091|28.807061",
// "dwms": "江北振兴大道入城方向,识别孜岩、红坝路入城排放黑烟车辆"
// },
// ];
Widget getDwmcField(int indexRecord, double width) {
return SizedBox(
width: ScreenUtil().setWidth(width),
child: Text(
'${listAllStatisData[indexRecord]["id"].toString()}. ${listAllStatisData[indexRecord]["dwmc"]}',
style: TextStyle(fontSize: 16),
),
);
}
/*
listAllStatisData =
[
{
"id": 1,
"dwip": "172.16.3.1",
"dwmc": "锦绣花园",
"zp_all": 54,
"hyc_all": 53,
"zp_today": 1,
"sends": 1,
"send_all": 34,
"csnum": 1,
"fsnum": 1,
"cll_today": 23200,
"cll_all": 3242513
},
...
]
*/
Widget _getZptjListTile(BuildContext context, int indexRecord, double width) {
return Column(
children: <Widget>[
ListTile(
//leading: new Icon(Icons.phone),
title: getDwmcField(indexRecord, 40),
// subtitle:
// Text('今日:${listAllStatisData[indexRecord]['today']}', style: TextStyle(fontSize: 10)),
trailing: Container(
width: ScreenUtil().setWidth(width),
child: Row(
children: [
getText(
text: listAllStatisData[indexRecord]['zp_today'].toString(),
width: 260,
fontSize: 16),
getText(
text: listAllStatisData[indexRecord]['zp_all'].toString(),
width: 260,
fontSize: 16),
],
),
),
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
enabled: true,
onTap: () async {},
),
Divider(height: 1.0),
],
);
}
Widget _getClltjListTile(BuildContext context, int indexRecord, double width) {
return Column(
children: <Widget>[
ListTile(
//leading: new Icon(Icons.phone),
title: getDwmcField(indexRecord, 40),
// subtitle:
// Text('今日:${listAllStatisData[indexRecord]['today']}', style: TextStyle(fontSize: 10)),
trailing: Container(
width: ScreenUtil().setWidth(width),
child: Row(
children: [
// getText(
// text: listAllStatisData[indexRecord]['today'].toString(),
// width: 260,
// fontSize: 16),
// getText(
// text: (listAllStatisData[indexRecord]['all'] / 10000).toString(),
// width: 260,
// fontSize: 16),
getText(text: '', width: 260, fontSize: 16),
getText(
text: listAllStatisData[indexRecord]['cll_today'].toString(),
width: 260,
fontSize: 16),
],
),
),
contentPadding: EdgeInsets.symmetric(horizontal: 20.0, vertical: 0),
enabled: true,
onTap: () async {},
),
Divider(height: 1.0),
],
);
}
bool isLoading = false; //正在处理下载数据、跳转到首项、跳转到尾项等操作
//Map<String, String> mapTjDataText = {
// "dwip": '点位IP',
// "today": '今日',
// "all": '总共',
// "total": '总共2',
// "sends": '推送'
// };
//抓拍统计数据
//{
// "today": 5,
// "all": 77
//},
//审核统计数据
//{
// "total": 6,
// "sends": 5
// },
//车流量统计数据
//{
// "today": 0,
// "all": 675338
//}
//得到表头行
Widget getHeadRow() {
Widget _headRow;
switch (widget.statisType) {
case 'zptj':
_headRow = Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
width: ScreenUtil().setWidth(475),
child: _getSortBtn(sortField: 'dwmc', left: 78),
),
SizedBox(
width: ScreenUtil().setWidth(285),
child: _getSortBtn(sortField: 'today', left: 10),
),
SizedBox(
width: ScreenUtil().setWidth(280),
child: _getSortBtn(sortField: 'all', left: 10),
),
],
);
break;
case 'sh_hyc_tj':
_headRow = Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
width: ScreenUtil().setWidth(495),
child: _getSortBtn(sortField: 'dwmc', left: 78),
),
SizedBox(
width: ScreenUtil().setWidth(265),
child: _getSortBtn(sortField: 'total', left: 10),
),
SizedBox(
width: ScreenUtil().setWidth(300),
child: _getSortBtn(sortField: 'sends', left: 20),
),
],
);
break;
case 'clltj':
_headRow = Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
width: ScreenUtil().setWidth(465),
child: _getSortBtn(sortField: 'dwmc', left: 78),
),
// SizedBox(
// width: ScreenUtil().setWidth(265),
// child: _getSortBtn(sortField: 'today', left: 20),
// ),
// SizedBox(
// width: ScreenUtil().setWidth(300),
// child: _getSortBtn(sortField: 'all', left: 50),
// ),
SizedBox(
width: ScreenUtil().setWidth(265),
child: Text(''),
),
SizedBox(
width: ScreenUtil().setWidth(300),
child: _getSortBtn(sortField: 'today', left: 20),
),
],
);
break;
default:
return Container();
break;
}
return _headRow;
}
/*
listAllStatisData =
[
{
"id": 1,
"dwip": "172.16.3.1",
"dwmc": "锦绣花园",
"zp_all": 54,
"hyc_all": 53,
"zp_today": 1,
"sends": 1,
"send_all": 34,
"csnum": 1,
"fsnum": 1,
"cll_today": 23200,
"cll_all": 3242513
},
...
]
*/
//得到统计行
Widget getStatisRow() {
Widget _headRow;
switch (widget.statisType) {
case 'zptj':
List _listSum = tj_getAllSum('zp_today');
List _listAll = tj_getAllSum('zp_all');
_headRow = Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
width: ScreenUtil().setWidth(455),
//xx个点位正常\n共xx个点位
child: _getStatisText(
//text: '${getOKdw().toString()}个点位正常\n共${listDwinfoGetList2.length.toString()}个点位)',
text: '${listDwinfoGetList2.length.toString()} 个点位',
left: ScreenUtil().setWidth(170)),
),
SizedBox(
width: ScreenUtil().setWidth(270),
//xx个点位今日共抓拍xx
child: _getStatisText(
//text: '${_listSum[0].toString()}个点位,今日共抓拍${_listSum[1].toString()}',
text: '今日 ${_listSum[1].toString()}',
width: ScreenUtil().setWidth(245)),
),
SizedBox(
width: ScreenUtil().setWidth(300),
//xx个点位总共抓拍xx
child: _getStatisText(
//text: '${_listAll[0].toString()}个点位,总共抓拍${_listAll[1].toString()}',
text: '总共 ${_listAll[1].toString()}',
width: ScreenUtil().setWidth(260)),
),
],
);
break;
case 'sh_hyc_tj':
List _listSum = tj_getAllSum('send_all');
//List _listAll = tj_getAllSumCll('total'); // 'total' 字段没有记录详情所以用tj_getAllSumCll()
List _listAll = tj_getAllSum('hyc_all');
_headRow = Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
width: ScreenUtil().setWidth(475),
//xx正常(共13)
child: _getStatisText(
//text: '${getOKdw().toString()}个点位正常\n共${listDwinfoGetList2.length.toString()}个点位)',
text: '${listDwinfoGetList2.length.toString()} 个点位',
left: ScreenUtil().setWidth(170)),
),
SizedBox(
width: ScreenUtil().setWidth(260),
//xx个点位总共审核xx
child: _getStatisText(
//text: '${_listAll[0].toString()}个点位,总共审核${_listAll[1].toString()}',
text: '共审核 ${_listAll[1].toString()}',
width: ScreenUtil().setWidth(225)),
),
SizedBox(
//xx个点位总共推送xx
child: _getStatisText(
//text: '${_listSum[0].toString()}个点位,总共推送${_listSum[1].toString()}',
text: '共推送 ${_listSum[1].toString()}',
width: ScreenUtil().setWidth(260)),
),
],
);
break;
case 'clltj':
List _listSum = tj_getAllSum('cll_today');
List _listAll = tj_getAllSum('cll_all');
_headRow = Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
width: ScreenUtil().setWidth(445),
//xx个点位正常\n共xx个点位
child: _getStatisText(
//text: '${getOKdw().toString()}个点位正常\n共${listDwinfoGetList2.length.toString()}个点位)',
text: '${listDwinfoGetList2.length.toString()} 个点位',
left: ScreenUtil().setWidth(150)),
),
// SizedBox(
// width: ScreenUtil().setWidth(280),
// //xx个点位今日共抓拍xx
// child: _getStatisText(
// //text: '${_listSum[0].toString()}个点位,今日车流量${_listSum[1].toString()}',
// text: '今日 ${_listSum[1].toString()}',
// width: ScreenUtil().setWidth(265)),
// ),
// SizedBox(
// width: ScreenUtil().setWidth(280),
// //xx个点位总共抓拍xx
// child: _getStatisText(
// //text: '${_listAll[0].toString()}个点位,总共车流量${_listAll[1].toString()}',
// text: '总共 ${(_listAll[1] ~/ 10000).toString()} 万',
// width: ScreenUtil().setWidth(280)),
// ),
SizedBox(
width: ScreenUtil().setWidth(280),
//xx个点位今日共抓拍xx
child: _getStatisText(
//text: '${_listSum[0].toString()}个点位,今日车流量${_listSum[1].toString()}',
text: '',
width: ScreenUtil().setWidth(265)),
),
SizedBox(
width: ScreenUtil().setWidth(280),
//xx个点位今日共抓拍xx
child: _getStatisText(
//text: '${_listSum[0].toString()}个点位,今日车流量${_listSum[1].toString()}',
text: '今日 ${_listSum[1].toString()}',
width: ScreenUtil().setWidth(205)),
),
],
);
break;
default:
return Container();
break;
}
return _headRow;
}
//获取已审核黑烟车统计数据App.Car_Statis.GetStaHyc
//{
// "ret": 200,
// "data": {
// "total": 40,
// "sends": {
// "total": 0,
// "data": []
// },
// "csnum": {
// "total": 0,
// "data": []
// },
// "fsnum": {
// "total": 0,
// "data": []
// }
// },
// "msg": ""
// }
//获取抓拍统计数据App.Car_Statis.GetStaYjxx
//{
// "ret": 200,
// "data": {
// "today": {
// "total": 0,
// "data": []
// },
// "all": 40
// },
// "msg": ""
// }
//得到 listAllStatisData[field] 的统计数据,
//适用的字段:抓拍统计的'today'、all审核统计的"total"、"sends"
List<int> tj_getAllSum(String field) {
int items = 0;
int sum = 0;
for (var item in listAllStatisData) {
if (item[field] > 0) {
items++;
sum += item[field];
}
}
return [items, sum];
}
//获取车流量统计数据App.Car_Statis.GetStaCll
//{
// "ret": 200,
// "data": {
// "today": 7010,
// "all": 1640350
// },
// "msg": ""
//}
//得到 listZptjStatis[field] 的统计数据,
//适用的字段:车流量统计的'today'、all
List<int> tj_getAllSumCll(String field) {
int items = 0;
int sum = 0;
for (var item in listZptjStatis) {
if (item[field] > 0) {
items++;
sum += item[field];
}
}
return [items, sum];
}
Widget _getStatisText({@required String text, double left = 0, double width = 100}) {
return Row(
children: [
SizedBox(width: ScreenUtil().setWidth(left)),
Container(
width: width,
child:
Text(text, style: TextStyle(fontSize: 12), maxLines: 2, textAlign: TextAlign.center),
),
//SizedBox(width: ScreenUtil().setWidth(20)),
],
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: PreferredSize(
preferredSize: Size.fromHeight(ScreenUtil().setHeight(173)), // 设置appBar高度
// 设置appBar高度
child: AppBar(
automaticallyImplyLeading: false,
centerTitle: true,
titleSpacing: 0.0,
flexibleSpace: Container(
//SizedBox(height: ScreenUtil().statusBarHeight), //显示顶部状态栏
// SizedBox(height: ScreenUtil().setHeight(10)), //显示顶部状态栏
padding: EdgeInsets.only(top: ScreenUtil().statusBarHeight), //留出顶部状态栏高度
child: Container(
//height: ScreenUtil().setHeight(173),
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.centerLeft,
end: Alignment.centerRight,
colors: [
Color.fromRGBO(12, 186, 156, 1),
Color.fromRGBO(39, 127, 235, 1),
],
),
),
// decoration: BoxDecoration(
// gradient: LinearGradient(colors: [
// Color(0xFF0018EB),
// Color(0xFF01C1D9),
// ], begin: Alignment.bottomCenter, end: Alignment.topCenter),
// ),
),
),
title: Padding(
padding: EdgeInsets.only(left: 0, right: 0),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
getIconAndTextButton(
iconColor: Colors.white,
iconData: Icons.chevron_left_outlined,
onPress: () {
Navigator.pop(context);
},
),
Expanded(
child: Text(mapStatisType[widget.statisType]['text'],
style: TextStyle(color: Colors.white, fontSize: 20),
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis),
),
SizedBox(width: 10),
],
),
),
actions: [
InkWell(
child: Image.asset(
widget.statisType == 'zptj'
? 'assets/images/statis_blue.png'
: widget.statisType == 'sh_hyc_tj'
? 'assets/images/statis_red.png'
: 'assets/images/statis_green.png',
width: 32,
height: 32,
color: Colors.white),
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(builder: (context) {
if (widget.statisType == 'clltj') {
return ZptjBarChartOne(
data_ok: true, //listAllStatisData 中的数据已经准备好
statisType: widget.statisType,
);
} else {
return ZptjBarChart(
data_ok: true, //listAllStatisData 中的数据已经准备好
statisType: widget.statisType,
);
}
}),
);
},
),
SizedBox(width: 15),
],
),
),
body: (listAllStatisData.isEmpty)
? getMoreWidget(color: Colors.black38)
: Column(
children: [
SizedBox(height: ScreenUtil().setHeight(20)),
getHeadRow(), //得到表头行
SizedBox(height: ScreenUtil().setHeight(20)),
Divider(height: 1.0, color: Colors.blue),
SizedBox(height: ScreenUtil().setHeight(10)),
getStatisRow(), //得到统计行
SizedBox(height: ScreenUtil().setHeight(10)),
Divider(height: 1.0, color: Colors.blue),
Expanded(
child: ListView.builder(
itemCount: listAllStatisData.length,
itemBuilder: (BuildContext context, index) {
return Column(
children: <Widget>[
_getListTile(context, index),
Divider(height: 1.0),
],
);
},
),
),
],
),
);
}
Widget _getImage(String sortField) {
sortField = (sortField == 'dwmc' ? 'id' : sortField);
String _image = _sortField != sortField
? 'assets/images/sort.png'
: _descending
? 'assets/images/descending.png'
: 'assets/images/ascending.png';
return Container(
margin: EdgeInsets.only(top: 4),
height: ScreenUtil().setWidth(38),
width: ScreenUtil().setWidth(38),
//child: Image.asset('assets/images/ybsthbj.png', fit: BoxFit.fitHeight),
child: Image.asset(_image,
fit: BoxFit.cover,
color: isLoading
? Theme.of(context).disabledColor
: (_sortField == sortField ? Colors.blue : null)));
}
String _sortField = 'dwmc';
bool _descending = false; //默认升序排列
Widget _getSortBtn({@required String sortField, double left = 0}) {
return InkWell(
// color: Colors.white,
// padding: EdgeInsets.all(0),
//iconSize: this.iconSize,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(width: ScreenUtil().setWidth(left)),
Text(mapTjDataText[sortField],
style: TextStyle(
fontSize: 18,
color: Colors.blue,
fontWeight: _sortField == sortField || (_sortField == 'id' && sortField == 'dwmc')
? FontWeight.bold
: null)),
SizedBox(width: ScreenUtil().setWidth(20)),
_getImage(sortField),
],
),
onTap: () {
if (isLoading) {
return;
}
print('sortField = $sortField_descending = $_descending');
//按照用户选择的 sortField、_descending对listSbbjGetList2进行排序并延时更新
_listSort(sortField: sortField == 'dwmc' ? 'id' : sortField);
},
);
}
// Map<String, String> mapTjDataText = {
// "dwip": '点位IP',
// "today": '今日',
// "all": '总共',
// "total": '总共2',
// "sends": '推送'
// };
//按照用户选择的 sortField、_descending对listZptjStatis进行排序并延时更新
Future _listSort({@required String sortField, bool bShowToast = false}) {
if (!isLoading && listAllStatisData.length > 0) {
isLoading = true;
try_setState();
if (_sortField == sortField) {
_descending = !_descending; //若是与上一次按同一个自动排序,则切换升序降序
} else {
_descending = false; //默认升序排列
}
switch (sortField) {
default:
if (_descending) {
//按 sortField 降序排序
listAllStatisData.sort((a, b) => (b[sortField]).compareTo(a[sortField]));
} else {
//按 sortField 升序排序
listAllStatisData.sort((a, b) => (a[sortField]).compareTo(b[sortField]));
}
break;
}
Future.delayed(const Duration(milliseconds: 1000), () {
if (bShowToast) {
Fluttertoast.showToast(
msg:
'按“${mapTjDataText[sortField == 'id' ? 'dwmc' : sortField]}${_descending ? '降序' : '升序'}排列完成!',
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
);
}
_sortField = sortField;
isLoading = false;
try_setState(); //避免如下异常报错
});
}
}
}