|
|
import 'dart:convert';
|
|
|
|
|
|
import 'package:dio/dio.dart';
|
|
|
import 'package:flutter/cupertino.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
|
import 'package:flutter_screenutil/screen_util.dart';
|
|
|
import 'package:fluttertoast/fluttertoast.dart';
|
|
|
import 'package:http/http.dart' as my_http;
|
|
|
import 'package:hyzp_ybqx03_junlian/components/doJSON.dart';
|
|
|
import 'package:hyzp_ybqx03_junlian/services/EventBus.dart';
|
|
|
import 'package:hyzp_ybqx03_junlian/widget/my_superplayer.dart';
|
|
|
import 'package:sprintf/sprintf.dart';
|
|
|
|
|
|
import '../components/hyxx_data_handle.dart';
|
|
|
import '../config/service_url.dart';
|
|
|
import '../res/listContacts.dart';
|
|
|
import '../widget/my_delay_toast.dart';
|
|
|
// import 'package:hyzp_ybqx03_junlian/widget/player_pro.dart';
|
|
|
// import 'package:hyzp_ybqx03_junlian/widget/player_pro_new.dart';
|
|
|
import 'UserAuthority.dart';
|
|
|
import 'commonFun.dart';
|
|
|
|
|
|
///球机方向控制
|
|
|
// 接口地址:http://125.64.218.67:9906/api/ptz/{通道ID}/{球机ID}
|
|
|
// static const String setSphericalCameraUrl = 'http://125.64.218.67:9906/api/ptz'; //球机方向控制接口
|
|
|
// 接口提交方式:post
|
|
|
// 接口文本:JSON
|
|
|
// 接口提交参数4个:
|
|
|
// cmdCode 说明:位移方向
|
|
|
// horizonSpeed 说明:横向位移速度
|
|
|
// verticalSpeed说明:垂直位移速度
|
|
|
// zoomSpeed说明:变焦速度
|
|
|
Future setSphericalCameraDio(
|
|
|
{@required int id,
|
|
|
@required int cmdCode,
|
|
|
int horizonSpeed = 120,
|
|
|
int verticalSpeed = 120,
|
|
|
int zoomSpeed = 120}) async {
|
|
|
Map map = {
|
|
|
"cmdCode": cmdCode.toString(),
|
|
|
"horizonSpeed": horizonSpeed.toString(),
|
|
|
"verticalSpeed": verticalSpeed.toString(),
|
|
|
"zoomSpeed": zoomSpeed.toString(),
|
|
|
};
|
|
|
var api = getSphericalCameraApi(id, map);
|
|
|
print('api = ${api}');
|
|
|
//I/flutter (28351): api = http://125.64.218.67:9906/api/ptz/34020000001320001016/34020000001320001016?cmdCode=8&horizonSpeed=60&verticalSpeed=60&zoomSpeed=60
|
|
|
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
|
|
|
Dio dio = Dio();
|
|
|
print('map = ${map}');
|
|
|
Response response = await dio.post(api);
|
|
|
print('response = ${response.toString()}');
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
// Map _mapDataRet = await getMapFromJson(response.data);
|
|
|
// _mapData = _mapDataRet['data'];
|
|
|
print('${api} 球机移动网络请求过程正常完成');
|
|
|
|
|
|
///处理球机停止移动
|
|
|
map["cmdCode"] = '0';
|
|
|
api = getSphericalCameraApi(id, map);
|
|
|
print('api = ${api}');
|
|
|
//I/flutter (28351): api = http://125.64.218.67:9906/api/ptz/34020000001320001016/34020000001320001016?cmdCode=0&horizonSpeed=60&verticalSpeed=60&zoomSpeed=60
|
|
|
|
|
|
response = await dio.post(api);
|
|
|
print('response = ${response.toString()}');
|
|
|
if (response.statusCode == 200) {
|
|
|
print('${api} 球机停止移动网络请求过程正常完成');
|
|
|
}
|
|
|
} else {
|
|
|
throw Exception('${api} 后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('${api} 网络请求过程异常 e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// cmdCode:8
|
|
|
// horizonSpeed:60
|
|
|
// verticalSpeed:60
|
|
|
// zoomSpeed:60
|
|
|
// 上述调用可以一次性书写为:
|
|
|
// http://125.64.218.67:9906/api/ptz/34020000001320002016/34020000001320002016?cmdCode=8&horizonSpeed=60&verticalSpeed=60&zoomSpeed=60
|
|
|
String getSphericalCameraApi(int id, Map map) {
|
|
|
var api = ServicePath.setSphericalCameraUrl +
|
|
|
getSphericalCameraID(id) +
|
|
|
'/' +
|
|
|
getSphericalCameraID(id) +
|
|
|
'?';
|
|
|
|
|
|
map.forEach((key, value) {
|
|
|
//print("$key : $value");
|
|
|
api += (key + '=' + value + '&');
|
|
|
});
|
|
|
api = api.substring(0, api.length - 1); // 删除末尾字符
|
|
|
|
|
|
return api;
|
|
|
}
|
|
|
|
|
|
///四:球机ID说明:
|
|
|
// 1号:34020000001320001016
|
|
|
//sId = 34020000001320001016
|
|
|
// 2号:34020000001320002016
|
|
|
// 3号:34020000001320003016
|
|
|
// 4号:34020000001320004016
|
|
|
// 5号:34020000001320005016
|
|
|
// 6号:34020000001320006016
|
|
|
// 7号:34020000001320007016
|
|
|
// 8号:34020000001320008016
|
|
|
// 9号:34020000001320009016
|
|
|
// 10号:34020000001320010016
|
|
|
// 11号:34020000001320011016
|
|
|
// 12号:34020000001320012016
|
|
|
// 13号:34020000001320013016
|
|
|
String getSphericalCameraID(int id) {
|
|
|
String sId = sprintf("%02i", [id]);
|
|
|
//print('sId =${sId}');
|
|
|
sId = '340200000013200' + sId + '016';
|
|
|
//print('sId =${sId}');
|
|
|
return sId;
|
|
|
}
|
|
|
|
|
|
///从指定 api 接口 获取数据
|
|
|
Future getSomeDioData({@required String api}) async {
|
|
|
Map _mapGetData = {};
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
Map map = {
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
};
|
|
|
|
|
|
Dio dio = Dio();
|
|
|
//static const String getNtimeUrl = ServiceUrl + '?s=App.Car_Hyc.GetNtime'; //获取违章间隔时间数据
|
|
|
var api = ServicePath.getNtimeUrl;
|
|
|
print('api = ${api}');
|
|
|
print('map = ${map}');
|
|
|
//Response response = await dio.post(api, data: map);
|
|
|
Response response = await dio.post(api, data: map);
|
|
|
|
|
|
print('response = ${response.toString()}');
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
Map _mapDataRet = await getMapFromJson(response.data);
|
|
|
_mapGetData = _mapDataRet['data'];
|
|
|
print('${api} 网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('${api} 后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('${api} 网络请求过程异常 e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return _mapGetData;
|
|
|
}
|
|
|
|
|
|
//设置 sfyc (是否延迟)和 tsjj (推送交警)
|
|
|
Future set_sfyc_tsjj(int _zpsj) async {
|
|
|
String str = mapHyshlx[hyshlx]['apiNtiem'];
|
|
|
print('str = ${str}');
|
|
|
//sfyc(是否延迟)
|
|
|
getSomeDioData(api: mapHyshlx[hyshlx]['apiNtiem']).then((value) async {
|
|
|
int nowStamp = DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
|
|
int _Ntime = getSecondsOfNtime(value['value']);
|
|
|
//int _zpsj = int.parse(listGetZpjl[index]['zpsj']);
|
|
|
// B、若超出规定时间,即当前时间 > 抓拍时间 + 间隔时间,则sfyc=1,不推送交警。
|
|
|
print('nowStamp = ${nowStamp}, (_zpsj + _Ntime) = ${(_zpsj + _Ntime)}');
|
|
|
print('nowStamp > (_zpsj + _Ntime) = ${nowStamp > (_zpsj + _Ntime)}');
|
|
|
|
|
|
sfyc = 0;
|
|
|
//tsjj = true; //注释该行,避免 567-未选择推送交警也推送了
|
|
|
if (nowStamp > (_zpsj + _Ntime)) {
|
|
|
sfyc = 1;
|
|
|
tsjj = false;
|
|
|
}
|
|
|
print('sfyc = ${sfyc}, tsjj = ${tsjj}');
|
|
|
//黑烟审核 sfyc 改变广播
|
|
|
eventBus.fire(HycsDataAuditSfyc('黑烟审核 sfyc 已改变'));
|
|
|
});
|
|
|
}
|
|
|
|
|
|
//App.Car_Led.Get接口获取的记录数据结构(比App.Car_Led.GetList接口获取的丰富)
|
|
|
// Map _mapGetLedXsxxGetData = {
|
|
|
// "id": 2,
|
|
|
// "dwip": "172.16.3.2",
|
|
|
// "xsnr": "绿水青山就是金山银山 宜宾市翠屏生态环境局宣。",
|
|
|
// "xsts": 0, //显示抓拍到的多少条违章记录
|
|
|
// "stime": "07:00",
|
|
|
// "etime": "23:00",
|
|
|
// "addtime": "2021-01-20 10:16:07",
|
|
|
// "updatetime": "2021-02-13 11:48:51"
|
|
|
// };
|
|
|
|
|
|
///从接口 mapHyshlx[theSbgllx]['apiItem'] 获取指定id的单条记录返回 Map
|
|
|
Future getLedXsxxGetData({@required int id, @required String theSbgllx}) async {
|
|
|
Map _mapGetSbglGetData = {};
|
|
|
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
Map map = {
|
|
|
"id": id.toString(),
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
};
|
|
|
|
|
|
Dio dio = Dio();
|
|
|
print('mapHyshlx[theSbgllx][apiItem] = ${mapHyshlx[theSbgllx]['apiItem']}');
|
|
|
print('map = ${map}');
|
|
|
Response response = await dio.post(mapHyshlx[theSbgllx]['apiItem'], data: map);
|
|
|
printWrapped('response = ${response.toString()}');
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
Map _mapGetSbglGetDataRet = await getMapFromJson(response.data);
|
|
|
_mapGetSbglGetData = _mapGetSbglGetDataRet['data'];
|
|
|
|
|
|
printWrapped('_mapGetSbglGetData[\'xsts\'] = ${_mapGetSbglGetData['xsts']}');
|
|
|
print('theSbgllx网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('theSbgllx后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('theSbgllx网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return _mapGetSbglGetData;
|
|
|
}
|
|
|
|
|
|
// App.Car_Led.Update
|
|
|
// 更新数据
|
|
|
// 接口地址:http://125.64.218.67:9904/?s=App.Car_Led.Update
|
|
|
// 接口文档
|
|
|
// 根据ID更新数据库中的一条纪录数据
|
|
|
//
|
|
|
// 接口参数
|
|
|
// 参数名字 类型 是否必须 默认值 其他 说明
|
|
|
// sign 字符串 必须
|
|
|
// random 字符串 必须
|
|
|
// id 字符串 必须 最小:1 ID
|
|
|
// xsnr 字符串 必须 字幕内容
|
|
|
// xsts 整型 必须 0 最小:0 同步显示违章记录条数
|
|
|
// stime 字符串 必须 08:00 启用时间段-开始时间
|
|
|
// etime 字符串 必须 21:00 启用时间段-结束时间
|
|
|
// 返回结果
|
|
|
// 返回字段 类型 说明
|
|
|
// code 整型 更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
// 异常情况
|
|
|
// 错误码 错误描述信息
|
|
|
// 400 表示客户端参数错误
|
|
|
// 404 表示接口服务不存在
|
|
|
// 500 表示服务端内部错误
|
|
|
|
|
|
///从接口 mapHyshlx[theSbgllx]['apiItem'] 更新指定id的LED数据
|
|
|
Future updateLedData({@required int id, @required String theSbgllx, @required Map map}) async {
|
|
|
Map _mapGetSbglGetData = {};
|
|
|
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
map.addAll({
|
|
|
"id": id.toString(),
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
});
|
|
|
|
|
|
if (!map.containsKey('xsnr')) {
|
|
|
map['xsnr'] = '';
|
|
|
}
|
|
|
|
|
|
if (!map.containsKey('xsts')) {
|
|
|
map['xsts'] = 0;
|
|
|
}
|
|
|
|
|
|
if (!map.containsKey('stime')) {
|
|
|
map['stime'] = '08:00';
|
|
|
}
|
|
|
|
|
|
if (!map.containsKey('xsnr')) {
|
|
|
map['etime'] = '21:00';
|
|
|
}
|
|
|
|
|
|
Dio dio = Dio();
|
|
|
print('mapHyshlx[theSbgllx][apiItem] = ${mapHyshlx[theSbgllx]['apiItem']}');
|
|
|
printWrapped('map = ${map}');
|
|
|
Response response = await dio.post(mapHyshlx[theSbgllx]['apiItem'], data: map);
|
|
|
print('response = ${response.toString()}');
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
Map _mapGetSbglGetDataRet = await getMapFromJson(response.data);
|
|
|
_mapGetSbglGetData = _mapGetSbglGetDataRet['data'];
|
|
|
//code 整型 更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
print('_mapGetSbglGetData = ${_mapGetSbglGetData.toString()}');
|
|
|
//_mapGetSbglGetData = {code: 1}
|
|
|
Map codeMap = {
|
|
|
0: '没有更新。',
|
|
|
1: '更新成功。',
|
|
|
false: '更新失败!',
|
|
|
'批量更新完成': '批量更新完成',
|
|
|
};
|
|
|
|
|
|
Fluttertoast.showToast(
|
|
|
msg: codeMap[_mapGetSbglGetData['code']],
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
|
|
|
print('theSbgllx网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('theSbgllx后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('theSbgllx网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return _mapGetSbglGetData;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
App.Car_Statis.GetStaAll
|
|
|
获取抓拍集成统计数据
|
|
|
接口地址:http://125.64.218.67:9904/?s=App.Car_Statis.GetStaAll
|
|
|
接口文档
|
|
|
根据dwip获取抓拍记录统计数据
|
|
|
|
|
|
接口参数
|
|
|
参数名字 类型 是否必须 默认值 其他 说明
|
|
|
sign 字符串 必须
|
|
|
random 字符串 必须
|
|
|
dwip 字符串 可选 点位IP
|
|
|
time 字符串 可选 统计日期,格式如:2021-03-10
|
|
|
返回结果
|
|
|
返回字段 类型 说明
|
|
|
dwip 字符串 点位IP
|
|
|
dwmc 字符串 点位名称
|
|
|
zp_all 整型 累计抓拍数
|
|
|
hyc_all 整型 累计已审核数
|
|
|
cll_today 整型 今日车流量
|
|
|
cll_all 整型 累计车流量
|
|
|
zp_today 整型 今日抓拍数
|
|
|
sends 整型 已推送交警数
|
|
|
send_all 整型 累计推送交警数
|
|
|
csnum 整型 已初审数
|
|
|
fsnum 整型 已复核数
|
|
|
异常情况
|
|
|
错误码 错误描述信息
|
|
|
400 表示客户端参数错误
|
|
|
404 表示接口服务不存在
|
|
|
500 表示服务端内部错误
|
|
|
*/
|
|
|
|
|
|
///从接口 App.Car_Statis.GetStaAll 获取今日集成统计数据,返回 Map
|
|
|
///子非鱼: 可指定统计日期和点位参数。若指定,则依次显示当日所有点位。统计日期格式如:2021-03-10
|
|
|
Future getAllStatisData({String ip = '', String date = ''}) async {
|
|
|
//Map _mapAllStatisData = {};
|
|
|
List _listAllStatisData = [];
|
|
|
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
Map map = {
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
};
|
|
|
|
|
|
if (ip.isNotEmpty) {
|
|
|
map['dwip'] = ip;
|
|
|
}
|
|
|
|
|
|
if (date.isNotEmpty) {
|
|
|
map['time'] = date;
|
|
|
}
|
|
|
|
|
|
Dio dio = Dio();
|
|
|
String api = ServicePath.getStaAllUrl;
|
|
|
print('api = ${api}');
|
|
|
print('map = ${map}');
|
|
|
Response response = await dio.post(api, data: map);
|
|
|
print('response = ${response.toString()}');
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
Map _mapStatisDataRet = await getMapFromJson(response.data);
|
|
|
_listAllStatisData = _mapStatisDataRet['data'];
|
|
|
print('getAllStatisData 网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('getAllStatisData 后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('getAllStatisData 网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return _listAllStatisData;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
_mapAllStatisData
|
|
|
|
|
|
200 OK
|
|
|
cache-control: no-store, no-cache, must-revalidate
|
|
|
connection: keep-alive
|
|
|
content-type: application/json;charset=utf-8
|
|
|
date: Tue, 25 May 2021 01:27:11 GMT
|
|
|
expires: Thu, 19 Nov 1981 08:52:00 GMT
|
|
|
pragma: no-cache
|
|
|
server: openresty/1.15.8.3
|
|
|
transfer-encoding: chunked
|
|
|
x-powered-by: PHP/7.3.4
|
|
|
|
|
|
{
|
|
|
"ret": 200,
|
|
|
"data": [
|
|
|
{
|
|
|
"id": 1,
|
|
|
"dwip": "172.16.3.1",
|
|
|
"dwmc": "锦绣花园",
|
|
|
"zp_all": 54,
|
|
|
"hyc_all": 52,
|
|
|
"zp_today": 1,
|
|
|
"sends": 0,
|
|
|
"send_all": 33,
|
|
|
"csnum": 1,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 6420,
|
|
|
"cll_all": 3225733
|
|
|
},
|
|
|
{
|
|
|
"id": 2,
|
|
|
"dwip": "172.16.3.2",
|
|
|
"dwmc": "石马溪桥",
|
|
|
"zp_all": 377,
|
|
|
"hyc_all": 370,
|
|
|
"zp_today": 1,
|
|
|
"sends": 0,
|
|
|
"send_all": 204,
|
|
|
"csnum": 1,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 3430,
|
|
|
"cll_all": 2127839
|
|
|
},
|
|
|
{
|
|
|
"id": 3,
|
|
|
"dwip": "172.16.3.3",
|
|
|
"dwmc": "森林小区",
|
|
|
"zp_all": 380,
|
|
|
"hyc_all": 375,
|
|
|
"zp_today": 0,
|
|
|
"sends": 0,
|
|
|
"send_all": 253,
|
|
|
"csnum": 0,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 6230,
|
|
|
"cll_all": 3051847
|
|
|
},
|
|
|
{
|
|
|
"id": 4,
|
|
|
"dwip": "172.16.3.4",
|
|
|
"dwmc": "南山星城",
|
|
|
"zp_all": 232,
|
|
|
"hyc_all": 229,
|
|
|
"zp_today": 1,
|
|
|
"sends": 0,
|
|
|
"send_all": 164,
|
|
|
"csnum": 1,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 7900,
|
|
|
"cll_all": 2989374
|
|
|
},
|
|
|
{
|
|
|
"id": 5,
|
|
|
"dwip": "172.16.3.5",
|
|
|
"dwmc": "育才学校",
|
|
|
"zp_all": 91,
|
|
|
"hyc_all": 91,
|
|
|
"zp_today": 0,
|
|
|
"sends": 0,
|
|
|
"send_all": 68,
|
|
|
"csnum": 0,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 0,
|
|
|
"cll_all": 1664910
|
|
|
},
|
|
|
{
|
|
|
"id": 6,
|
|
|
"dwip": "172.16.3.6",
|
|
|
"dwmc": "七星花园",
|
|
|
"zp_all": 57,
|
|
|
"hyc_all": 56,
|
|
|
"zp_today": 0,
|
|
|
"sends": 0,
|
|
|
"send_all": 22,
|
|
|
"csnum": 0,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 4110,
|
|
|
"cll_all": 2559674
|
|
|
},
|
|
|
{
|
|
|
"id": 7,
|
|
|
"dwip": "172.16.3.7",
|
|
|
"dwmc": "市财政局",
|
|
|
"zp_all": 0,
|
|
|
"hyc_all": 0,
|
|
|
"zp_today": 0,
|
|
|
"sends": 0,
|
|
|
"send_all": 0,
|
|
|
"csnum": 0,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 0,
|
|
|
"cll_all": 0
|
|
|
},
|
|
|
{
|
|
|
"id": 8,
|
|
|
"dwip": "172.16.3.8",
|
|
|
"dwmc": "宜威路",
|
|
|
"zp_all": 100,
|
|
|
"hyc_all": 97,
|
|
|
"zp_today": 0,
|
|
|
"sends": 0,
|
|
|
"send_all": 66,
|
|
|
"csnum": 0,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 2835,
|
|
|
"cll_all": 1891302
|
|
|
},
|
|
|
{
|
|
|
"id": 9,
|
|
|
"dwip": "172.16.3.9",
|
|
|
"dwmc": "宜长路",
|
|
|
"zp_all": 83,
|
|
|
"hyc_all": 82,
|
|
|
"zp_today": 0,
|
|
|
"sends": 0,
|
|
|
"send_all": 73,
|
|
|
"csnum": 1,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 4010,
|
|
|
"cll_all": 2211060
|
|
|
},
|
|
|
{
|
|
|
"id": 10,
|
|
|
"dwip": "172.16.3.10",
|
|
|
"dwmc": "临港马家湾",
|
|
|
"zp_all": 57,
|
|
|
"hyc_all": 57,
|
|
|
"zp_today": 0,
|
|
|
"sends": 0,
|
|
|
"send_all": 32,
|
|
|
"csnum": 0,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 0,
|
|
|
"cll_all": 2235153
|
|
|
},
|
|
|
{
|
|
|
"id": 11,
|
|
|
"dwip": "172.16.3.11",
|
|
|
"dwmc": "环城路",
|
|
|
"zp_all": 111,
|
|
|
"hyc_all": 110,
|
|
|
"zp_today": 0,
|
|
|
"sends": 0,
|
|
|
"send_all": 75,
|
|
|
"csnum": 0,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 0,
|
|
|
"cll_all": 1136968
|
|
|
},
|
|
|
{
|
|
|
"id": 12,
|
|
|
"dwip": "172.16.3.12",
|
|
|
"dwmc": "陶瓷厂",
|
|
|
"zp_all": 47,
|
|
|
"hyc_all": 46,
|
|
|
"zp_today": 0,
|
|
|
"sends": 0,
|
|
|
"send_all": 12,
|
|
|
"csnum": 0,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 3315,
|
|
|
"cll_all": 1574973
|
|
|
},
|
|
|
{
|
|
|
"id": 13,
|
|
|
"dwip": "172.16.3.13",
|
|
|
"dwmc": "鑫菁英",
|
|
|
"zp_all": 170,
|
|
|
"hyc_all": 170,
|
|
|
"zp_today": 0,
|
|
|
"sends": 0,
|
|
|
"send_all": 87,
|
|
|
"csnum": 0,
|
|
|
"fsnum": 0,
|
|
|
"cll_today": 4090,
|
|
|
"cll_all": 2613670
|
|
|
}
|
|
|
],
|
|
|
"msg": ""
|
|
|
}
|
|
|
*/
|
|
|
|
|
|
///从接口 mapStatisType[statisType]['api'] 获取指定 ip 的 statisType 类型的统计数据,返回 Map
|
|
|
Future getStatisData({@required String statisType, String ip = '', String date = ''}) async {
|
|
|
Map _mapStatisData = {};
|
|
|
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
Map map = {
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
};
|
|
|
|
|
|
if (ip.isNotEmpty) {
|
|
|
map['dwip'] = ip;
|
|
|
}
|
|
|
|
|
|
if ('sh_hyc_tj' == statisType && date.isNotEmpty) {
|
|
|
map['time'] = date;
|
|
|
}
|
|
|
|
|
|
if ('cllrtj' == statisType) {
|
|
|
map['stime'] = mapStatisType[statisType]['startDate'];
|
|
|
map['etime'] = mapStatisType[statisType]['endDate'];
|
|
|
// print('map[\'stime\'] = ${map['stime']}');
|
|
|
// print('map[\'etime\'] = ${map['etime']}');
|
|
|
}
|
|
|
|
|
|
Dio dio = Dio();
|
|
|
String api = mapStatisType[statisType]['api'];
|
|
|
print('api = ${api}');
|
|
|
print('map = ${map}');
|
|
|
Response response = await dio.post(api, data: map);
|
|
|
print('response = ${response.toString()}');
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
Map _mapStatisDataRet = await getMapFromJson(response.data);
|
|
|
_mapStatisData = _mapStatisDataRet['data'];
|
|
|
print('$statisType 网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('$statisType 后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('$statisType 网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return _mapStatisData;
|
|
|
}
|
|
|
|
|
|
//添加LED字幕
|
|
|
Future<bool> insertLedXsxx(String api, Map map, String text) async {
|
|
|
//var api = ServicePath.insertLedXsxxUrl;
|
|
|
print(api);
|
|
|
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
map['random'] = RandomBit(6);
|
|
|
map['sign'] = GenerateMd5(APPkey + map['random']);
|
|
|
print('map = ${map}');
|
|
|
|
|
|
response = await dio.post(api, data: map);
|
|
|
print('response = ${response.toString()}');
|
|
|
if (response.statusCode == 200) {
|
|
|
print('$text网络请求过程正常完成');
|
|
|
return true;
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
//违章信息审核
|
|
|
Future<bool> auditWzxxData(String api) async {
|
|
|
//var api = ServicePath.auditWzxxUrl;
|
|
|
print(api);
|
|
|
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
mapAuditWzxxData['random'] = RandomBit(6);
|
|
|
mapAuditWzxxData['sign'] = GenerateMd5(APPkey + mapAuditWzxxData['random']);
|
|
|
response = await dio.post(api, data: mapAuditWzxxData);
|
|
|
print('response = ${response.toString()}');
|
|
|
//I/flutter ( 1563): {"ret":200,"data":{"code":1},"msg":""}
|
|
|
//I/flutter ( 5157): {"ret":200,"data":{"code":1},"msg":""}
|
|
|
if (response.statusCode == 200) {
|
|
|
print('违章信息${mapHyshlx[hyshlx]['text']}网络请求过程正常完成');
|
|
|
return true;
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
//1、获取指定id的推送交警记录列表存入listGetTsjj
|
|
|
Future getTsjjData(int id) async {
|
|
|
Map _mapGetTsjjGetData = await getWzxxItemData(id); //获取指定id的违章信息返回_mapGetHycsGetData
|
|
|
|
|
|
print('_mapGetTsjjGetData = ${_mapGetTsjjGetData}');
|
|
|
print('_mapGetTsjjGetData["yjxx_id"] = ${_mapGetTsjjGetData["yjxx_id"]}');
|
|
|
|
|
|
return listGetTsjj;
|
|
|
}
|
|
|
|
|
|
//1、获取指定id的抓拍记录列表存入listGetZpjl
|
|
|
//2、如果是黑烟复审,还需获取指定id的违章记录审核信息存入mapGetShenheData
|
|
|
Future getItemData(int id) async {
|
|
|
Map _mapGetHycsGetData = await getWzxxItemData(id); //获取指定id的违章信息返回_mapGetHycsGetData
|
|
|
//Unhandled Exception: NoSuchMethodError: The method 'split' was called on null.
|
|
|
print('_mapGetHycsGetData = ${_mapGetHycsGetData}');
|
|
|
print('_mapGetHycsGetData["yjxx_id"] = ${_mapGetHycsGetData["yjxx_id"]}');
|
|
|
|
|
|
//1、获取指定id的抓拍记录列表存入listGetZpjl
|
|
|
List listID = _mapGetHycsGetData["yjxx_id"].split(",");
|
|
|
listGetZpjl.clear();
|
|
|
print('listID = ${listID}');
|
|
|
print('listGetZpjl = ${listGetZpjl}');
|
|
|
|
|
|
// listID.forEach((element) async {
|
|
|
// await getZpjlData(int.parse(element)); //Unhandled Exception: type 'String' is not a subtype of type 'int'
|
|
|
// });
|
|
|
|
|
|
for (var _id in listID) {
|
|
|
//Unhandled Exception: type 'String' is not a subtype of type 'int'
|
|
|
await getZpjlData(int.parse(_id)); //获取指定id的抓拍记录数据存入listGetZpjl
|
|
|
}
|
|
|
print('listGetZpjl = ${listGetZpjl}');
|
|
|
|
|
|
//2、如果是黑烟复审、非黑烟查询,还需获取指定id的违章记录审核信息存入 listGetShenheData
|
|
|
listGetShenheData.clear();
|
|
|
print('listGetShenheData = ${listGetShenheData}');
|
|
|
if (hyshlx == 'hyfh' || hyshlx == 'fhycx') {
|
|
|
await getShenheData(id); //获取指定id的审核信息存入 listGetShenheData
|
|
|
await getMapGetShenheData(); //从listGetShenheData中取出数据分别存入mapGetHycsShenheData、mapGetHyfhShenheData
|
|
|
}
|
|
|
print('listGetShenheData = ${listGetShenheData}');
|
|
|
print('mapGetHycsShenheData = ${mapGetHycsShenheData}');
|
|
|
print('mapGetHyfhShenheData = ${mapGetHyfhShenheData}');
|
|
|
|
|
|
return listGetZpjl;
|
|
|
}
|
|
|
|
|
|
//从listGetShenheData中取出数据分别存入mapGetHycsShenheData、mapGetHyfhShenheData
|
|
|
getMapGetShenheData() async {
|
|
|
mapGetHycsShenheData.clear(); //黑烟初审信息mapGetHycsShenheData
|
|
|
mapGetHyfhShenheData.clear(); //黑烟复审信息mapGetHyfhShenheData
|
|
|
for (var _mapShenheItem in listGetShenheData) {
|
|
|
//注意:只取符合条件的第一条记录的数据
|
|
|
//workflow 整型 审核记录所属流程:1-初审,2-复审
|
|
|
if (_mapShenheItem['workflow'] == 1 && mapGetHycsShenheData.isEmpty) {
|
|
|
mapGetHycsShenheData = _mapShenheItem;
|
|
|
} else if (_mapShenheItem['workflow'] == 2 && mapGetHyfhShenheData.isEmpty) {
|
|
|
mapGetHyfhShenheData = _mapShenheItem;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//获取指定id的抓拍记录数据存入listGetZpjl
|
|
|
Future getZpjlData(int id) async {
|
|
|
var api = ServicePath.getZpjlGetUrl;
|
|
|
print(api);
|
|
|
//http://125.64.218.67:9904/docs.php?service=App.Car_Yjxx.Get&detail=1&type=fold
|
|
|
|
|
|
//listGetZpjl.clear();
|
|
|
Map _mapZpjlGetData = {};
|
|
|
|
|
|
print('id = ${id}');
|
|
|
if (id < 1) {
|
|
|
print('获取${mapHyshlx[hyshlx]['text']}数据的 id 号不正确!');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '获取${mapHyshlx[hyshlx]['text']}数据的 id 号不正确!', gravity: ToastGravity.CENTER);
|
|
|
} else {
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
response = await dio.post(api, data: {
|
|
|
"id": id,
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
});
|
|
|
print('response = ${response.toString()}');
|
|
|
//I/flutter ( 5232): {"ret":200,"data":{"items":[],"total":0,"page":1,"perpage":10},"msg":""}
|
|
|
if (response.statusCode == 200) {
|
|
|
Map mapZpjlGetDataRet = await getMapFromJson(response.data);
|
|
|
_mapZpjlGetData = mapZpjlGetDataRet['data'];
|
|
|
listGetZpjl.add(_mapZpjlGetData);
|
|
|
print('获取${mapHyshlx[hyshlx]['text']}数据的网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return _mapZpjlGetData;
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
//处理审核信息数据
|
|
|
|
|
|
//App.Car_Hyc.GetShenhe
|
|
|
// 获取审核信息
|
|
|
// 接口地址:http://125.64.218.67:9904/?s=App.Car_Hyc.GetShenhe
|
|
|
// 接口文档
|
|
|
// 根据ID获取违章记录的审核记录数据
|
|
|
//
|
|
|
// 接口参数
|
|
|
// 参数名字 类型 是否必须 默认值 其他 说明
|
|
|
// sign 字符串 必须
|
|
|
// random 字符串 必须
|
|
|
// id 字符串 必须 最小:1 违章记录ID
|
|
|
// 返回结果
|
|
|
// 返回字段 类型 说明
|
|
|
// id 整型 审核记录ID
|
|
|
// xid 整型 违章记录ID
|
|
|
// title 字符串 审核结果
|
|
|
// shuoming 字符串 审核意见
|
|
|
// uname 字符串 审核人
|
|
|
// addtime 字符串 审核日期
|
|
|
// workflow 整型 审核记录所属流程:1-初审,2-复审
|
|
|
// 异常情况
|
|
|
// 错误码 错误描述信息
|
|
|
// 400 表示客户端参数错误
|
|
|
// 404 表示接口服务不存在
|
|
|
// 500 表示服务端内部错误
|
|
|
|
|
|
//{
|
|
|
// "ret": 200,
|
|
|
// "data": [
|
|
|
// {
|
|
|
// "id": 362,
|
|
|
// "xid": 980,
|
|
|
// "title": "黑烟车",
|
|
|
// "shuoming": "黑烟超标,交由交警处罚",
|
|
|
// "uname": "admin",
|
|
|
// "addtime": "2021-01-31 16:23:26",
|
|
|
// "workflow": 2
|
|
|
// },
|
|
|
// {
|
|
|
// "id": 354,
|
|
|
// "xid": 980,
|
|
|
// "title": "非黑烟车",
|
|
|
// "shuoming": "误报,或肉眼无法识别",
|
|
|
// "uname": "admin",
|
|
|
// "addtime": "2021-01-31 14:07:42",
|
|
|
// "workflow": 1
|
|
|
// }
|
|
|
// ],
|
|
|
// "msg": ""
|
|
|
//}
|
|
|
|
|
|
// 同时推送交警
|
|
|
bool fh_hyc = true; //复审为黑烟车
|
|
|
int sfyc = 0; //复审接口增加是否延迟字段 sfyc 整型 必须 是否延误,0-正常 1-延误。延误状态的不推送
|
|
|
bool tsjj = true; //同时推送交警
|
|
|
|
|
|
//hyc为黑烟车拼音首字母缩写,fhyc为非黑烟车拼音首字母缩写
|
|
|
String hyc_shyj = '黑烟超标,交由交警处罚。';
|
|
|
String hyc_text = '黑烟车';
|
|
|
String fhyc_shyj = '误报,或肉眼无法识别。';
|
|
|
String fhyc_text = '非黑烟车';
|
|
|
|
|
|
Map mapGetShenheDataret = {
|
|
|
"ret": 200,
|
|
|
"data": [
|
|
|
{
|
|
|
"id": 420,
|
|
|
"xid": 1151,
|
|
|
"title": "黑烟车",
|
|
|
"shuoming": "黑烟超标,交由交警处罚",
|
|
|
"uname": "admin",
|
|
|
"addtime": "2021-02-05 15:45:32",
|
|
|
"workflow": 2
|
|
|
},
|
|
|
{
|
|
|
"id": 419,
|
|
|
"xid": 1151,
|
|
|
"title": "黑烟车",
|
|
|
"shuoming": "黑烟超标,交由交警处罚",
|
|
|
"uname": "admin",
|
|
|
"addtime": "2021-02-05 15:44:09",
|
|
|
"workflow": 1
|
|
|
}
|
|
|
],
|
|
|
"msg": ""
|
|
|
};
|
|
|
|
|
|
//返回字段 类型 说明
|
|
|
// id 整型 审核记录ID
|
|
|
// xid 整型 违章记录ID
|
|
|
// title 字符串 审核结果
|
|
|
// shuoming 字符串 审核意见
|
|
|
// uname 字符串 审核人
|
|
|
// addtime 字符串 审核日期
|
|
|
// workflow 整型 审核记录所属流程:1-初审,2-复审
|
|
|
|
|
|
//黑烟审核信息:
|
|
|
List listGetShenheData = [
|
|
|
{
|
|
|
"id": 420,
|
|
|
"xid": 1151,
|
|
|
"title": "黑烟车",
|
|
|
"shuoming": "黑烟超标,交由交警处罚",
|
|
|
"uname": "admin",
|
|
|
"addtime": "2021-02-05 15:45:32",
|
|
|
"workflow": 2
|
|
|
},
|
|
|
{
|
|
|
"id": 419,
|
|
|
"xid": 1151,
|
|
|
"title": "黑烟车",
|
|
|
"shuoming": "黑烟超标,交由交警处罚",
|
|
|
"uname": "admin",
|
|
|
"addtime": "2021-02-05 15:44:09",
|
|
|
"workflow": 1
|
|
|
}
|
|
|
];
|
|
|
|
|
|
//黑烟初审信息
|
|
|
//workflow 整型 审核记录所属流程:1-初审,2-复审
|
|
|
Map mapGetHycsShenheData = {
|
|
|
"id": 419,
|
|
|
"xid": 1151,
|
|
|
"title": "黑烟车",
|
|
|
"shuoming": "黑烟超标,交由交警处罚",
|
|
|
"uname": "admin",
|
|
|
"addtime": "2021-02-05 15:44:09",
|
|
|
"workflow": 1
|
|
|
};
|
|
|
|
|
|
//黑烟复审信息
|
|
|
//workflow 整型 审核记录所属流程:1-初审,2-复审
|
|
|
Map mapGetHyfhShenheData = {
|
|
|
"id": 420,
|
|
|
"xid": 1151,
|
|
|
"title": "黑烟车",
|
|
|
"shuoming": "黑烟超标,交由交警处罚",
|
|
|
"uname": "admin",
|
|
|
"addtime": "2021-02-05 15:45:32",
|
|
|
"workflow": 2
|
|
|
};
|
|
|
|
|
|
//获取指定id的违章记录审核信息存入listGetShenheData
|
|
|
Future getShenheData(int id) async {
|
|
|
var api = ServicePath.getShenheUrl;
|
|
|
print(api);
|
|
|
//http://125.64.218.67:9904/?s=App.Car_Hyc.GetShenhe
|
|
|
|
|
|
listGetShenheData.clear();
|
|
|
if (id < 1) {
|
|
|
print('获取${mapHyshlx[hyshlx]['text']}数据的 id 号不正确!');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '获取${mapHyshlx[hyshlx]['text']}数据的 id 号不正确!', gravity: ToastGravity.CENTER);
|
|
|
} else {
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
print('id = ${id}');
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
response = await dio.post(api, data: {
|
|
|
"id": id,
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
});
|
|
|
print('response = ${response.toString()}');
|
|
|
//response = {"ret":200,"data":[{"id":427,"xid":1171,"title":"非黑烟车","shuoming":"误报,或肉眼无法识别",
|
|
|
// "uname":"admin","addtime":"2021-02-07 12:43:47","workflow":1}],"msg":""}
|
|
|
if (response.statusCode == 200) {
|
|
|
//网络请求过程异常e:type 'List<dynamic>' is not a subtype of type 'Map<dynamic, dynamic>'
|
|
|
//报错原因:_mapGetShenheDataRet['data']是List类型,而非Map类型
|
|
|
Map _mapGetShenheDataRet = await getMapFromJson(response.data);
|
|
|
listGetShenheData = _mapGetShenheDataRet['data'];
|
|
|
print('获取${mapHyshlx[hyshlx]['text']}数据的网络请求过程正常完成');
|
|
|
// print('listGetZpjl = ${listGetZpjl}');
|
|
|
// print('listGetZpjl = ${listGetZpjl[0]}');
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return listGetShenheData;
|
|
|
}
|
|
|
|
|
|
//违章信息审核
|
|
|
//App.Car_Hyc.Workflow
|
|
|
// 审核数据
|
|
|
// 接口地址:http://125.64.218.67:9904/?s=App.Car_Hyc.Workflow
|
|
|
// 接口文档
|
|
|
// 根据ID审核数据库中的一条纪录数据
|
|
|
//
|
|
|
// 接口参数
|
|
|
// 参数名字 类型 是否必须 默认值 其他 说明
|
|
|
// sign 字符串 必须
|
|
|
// random 字符串 必须
|
|
|
// id 整型 必须 最小:1 ID
|
|
|
// workflow 整型 必须 2 最小:1 审核标记: 2=>初审通过 | 999=>复审通过
|
|
|
// shuoming 字符串 必须 审核意见:如 黑烟超标,交由交警处罚
|
|
|
// title 字符串 必须 审核结果:黑烟车 | 非黑烟车
|
|
|
// uid 整型 必须 最小:1 审核用户ID
|
|
|
// uname 字符串 必须 审核用户账号
|
|
|
// checkid 整型 必须 最小:1 用户选中的作为执法依据的抓拍记录ID
|
|
|
// plate_id 字符串 必须 车牌号
|
|
|
// plate_color 字符串 必须 车牌颜色
|
|
|
// 返回结果
|
|
|
// 返回字段 类型 说明
|
|
|
// code 整型 更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
|
|
|
Map mapAuditWzxxData = {
|
|
|
'sign': '',
|
|
|
'random': '',
|
|
|
'id': '',
|
|
|
'workflow': 2,
|
|
|
'shuoming': '',
|
|
|
'title': '',
|
|
|
'uid': -1,
|
|
|
'uname': '',
|
|
|
'checkid': -1,
|
|
|
'plate_id': '',
|
|
|
'plate_color': '',
|
|
|
'sfyc': -1,
|
|
|
};
|
|
|
|
|
|
Map getMapAuditWzxxData(
|
|
|
int _id, int _indexZpjl, int _workflow, String _shuoming, String _title, int sfyc) {
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
|
|
|
mapAuditWzxxData['sign'] = GenerateMd5(APPkey + random);
|
|
|
mapAuditWzxxData['random'] = random;
|
|
|
mapAuditWzxxData['id'] = _id.toString();
|
|
|
mapAuditWzxxData['workflow'] = _workflow;
|
|
|
mapAuditWzxxData['shuoming'] = _shuoming;
|
|
|
mapAuditWzxxData['title'] = _title;
|
|
|
mapAuditWzxxData['uid'] = g_userInfo.mapUserInfoRet['data']['user_id'];
|
|
|
mapAuditWzxxData['uname'] = g_userInfo.username;
|
|
|
mapAuditWzxxData['checkid'] = listGetZpjl[_indexZpjl]['id'];
|
|
|
mapAuditWzxxData['plate_id'] = listGetZpjl[_indexZpjl]['car_number'];
|
|
|
mapAuditWzxxData['plate_color'] = listGetZpjl[_indexZpjl]['cpys'];
|
|
|
mapAuditWzxxData['sfyc'] = sfyc;
|
|
|
|
|
|
return mapAuditWzxxData;
|
|
|
}
|
|
|
|
|
|
//App.Car_Bjxx.Workflow
|
|
|
// 核查处理报警数据
|
|
|
// 接口地址:http://125.64.218.67:9904/?s=App.Car_Bjxx.Workflow
|
|
|
// 接口文档
|
|
|
// 根据ID处理报警数据库中的一条纪录数据
|
|
|
//
|
|
|
// 接口参数
|
|
|
// 参数名字 类型 是否必须 默认值 其他 说明
|
|
|
// sign 字符串 必须
|
|
|
// random 字符串 必须
|
|
|
// id 整型 必须 最小:1 ID
|
|
|
// workflow 整型 必须 2 最小:1 处理标记: 999=>已处理
|
|
|
// shuoming 字符串 必须 处理意见:如 已处理,设备恢复正常
|
|
|
// title 字符串 必须 处理结果:已处理 | 误报
|
|
|
// uid 整型 必须 最小:1 审核用户ID
|
|
|
// uname 字符串 必须 审核用户账号
|
|
|
// 返回结果
|
|
|
// 返回字段 类型 说明
|
|
|
// code 整型 更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
|
|
|
// 核查处理报警数据函数
|
|
|
// int _sbglID, //设备管理信息ID
|
|
|
// int _workflow //workflow 整型 必须 2 最小:1 处理标记: 999=>已处理
|
|
|
// String _shuoming, //处理意见:如 已处理,设备恢复正常
|
|
|
// String _title //处理结果:已处理 | 误报
|
|
|
// int _uid //审核用户ID
|
|
|
// String _uname //审核用户账号
|
|
|
// sbglContentFirstAudit 整型返回值:更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
Future sbglContentAudit(
|
|
|
{@required String sbgllx,
|
|
|
@required int sbglID,
|
|
|
@required String shuoming,
|
|
|
@required String title}) async {
|
|
|
var ret = -1;
|
|
|
//var api = ServicePath.auditSbbjUrl;
|
|
|
var api = mapHyshlx[sbgllx]['apiAudit'];
|
|
|
print('api = $api');
|
|
|
// api = http://125.64.218.67:9904/?s=App.Car_Bjxx.Workflow
|
|
|
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
//准备dio数据结构
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
Map map = {}; //必须初始化,否则报错:Tried calling: []=("sign", "a50d481afb6480e2872529cf8092963d")
|
|
|
map['sign'] = GenerateMd5(APPkey + random);
|
|
|
map['random'] = random;
|
|
|
map['id'] = sbglID;
|
|
|
map['workflow'] = mapHyshlx[sbgllx]['audit_workflow'];
|
|
|
map['shuoming'] = shuoming;
|
|
|
map['title'] = title;
|
|
|
map['uid'] = g_userInfo.mapUserInfoRet['data']['user_id'];
|
|
|
map['uname'] = g_userInfo.username;
|
|
|
print('map =\n${map}');
|
|
|
//map = {sign: 1eec43fe66b350cb599d915d50806b5d, random: 110567, workflow: 999,
|
|
|
// shuoming: 已做简单处理。低级故障,不影响系统运行, title: 已处理, uid: 135, uname: admin}
|
|
|
|
|
|
response = await dio.post(api, data: map);
|
|
|
//return;
|
|
|
print('response = ${response.toString()}');
|
|
|
//response = {"ret":200,"data":{"code":1},"msg":""}
|
|
|
//response = {"ret":400,"data":{},"msg":"非法请求:缺少必要参数id"}
|
|
|
//网络请求过程异常e:
|
|
|
// DioError [DioErrorType.DEFAULT]: NoSuchMethodError: The method 'startsWith' was called on null. Receiver: null
|
|
|
|
|
|
//code 整型返回值:更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
//I/flutter ( 5152): {"ret":200,"data":{"code":1},"msg":""}
|
|
|
if (response.statusCode == 200) {
|
|
|
print('${mapHyshlx[hyshlx]['text']}核查处理网络请求过程正常完成');
|
|
|
Map _mapSbglContentFirstAudit = await getMapFromJson(response.data);
|
|
|
ret = _mapSbglContentFirstAudit["data"]["code"];
|
|
|
print('_mapSbglContentFirstAudit["data"]["code"] = ${ret}');
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
//Web 处理提交成功:
|
|
|
//service 必须 App.Car_Bjxx.Workflow
|
|
|
// sign 必须 3967eaebec0eed0642a1d395ac9293dd
|
|
|
// random 必须 1003
|
|
|
// id 必须 1209
|
|
|
// workflow 必须 2
|
|
|
// shuoming 必须 黑烟超标,交由交警处罚
|
|
|
// title 必须 黑烟车
|
|
|
// uid 必须 135
|
|
|
// uname 必须 admin
|
|
|
// http://125.64.218.67:9904/
|
|
|
// 200 OK
|
|
|
// cache-control: no-store, no-cache, must-revalidate
|
|
|
// connection: keep-alive
|
|
|
// content-type: application/json;charset=utf-8
|
|
|
// date: Thu, 18 Feb 2021 14:11:37 GMT
|
|
|
// expires: Thu, 19 Nov 1981 08:52:00 GMT
|
|
|
// pragma: no-cache
|
|
|
// server: openresty/1.15.8.3
|
|
|
// transfer-encoding: chunked
|
|
|
// x-powered-by: PHP/7.3.4
|
|
|
//
|
|
|
// {
|
|
|
// "ret": 200,
|
|
|
// "data": {
|
|
|
// "code": 1
|
|
|
// },
|
|
|
// "msg": ""
|
|
|
// }
|
|
|
|
|
|
// 黑烟审核提交函数
|
|
|
// int _wzxxID, //违章信息ID
|
|
|
// int _indexZpjl, //Zpjl 0基索引
|
|
|
// int _workflow //workflow 整型 必须 2 最小:1 审核标记: 2=>初审通过 | 999=>复审通过
|
|
|
// String _shuoming, //审核意见
|
|
|
// String _title //审核结果:黑烟车 | 非黑烟车
|
|
|
// {bool tsjj = true} //是否推送交警:可选参数,默认为true
|
|
|
// {int sfyc} //复审接口增加是否延迟字段
|
|
|
// hyshContentFirstAudit整型返回值:-1 表示出现异常,其余为更新结果,1表示成功,0表示无更新,false表示失败;
|
|
|
Future hyshContentFirstAudit(
|
|
|
int _wzxxID, int _indexZpjl, int _workflow, String _shuoming, String _title,
|
|
|
{@required int sfyc, bool tsjj = true}) async {
|
|
|
var ret = -1;
|
|
|
var api = ServicePath.auditWzxxUrl;
|
|
|
print(api);
|
|
|
//I/flutter (19102): http://125.64.218.67:9904/?s=App.Car_Hyc.Workflow
|
|
|
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
getMapAuditWzxxData(_wzxxID, _indexZpjl, _workflow, _shuoming, _title, sfyc); //准备dio数据结构
|
|
|
|
|
|
print('mapAuditWzxxData =\n${mapAuditWzxxData}');
|
|
|
//mapAuditWzxxData = {sign: 29bc5d7562022c53b7be5771e271a53d, random: 295149, id: 1171,
|
|
|
// workflow: 999, shuoming: 初审为非黑烟车。复审黑烟超标,交由交警处罚。, title: 黑烟车, ui
|
|
|
// d: 135, uname: admin, checkid: 1347, plate_id: 川QDS607, plate_color: 蓝色}
|
|
|
|
|
|
//黑烟初审
|
|
|
//mapAuditWzxxData = {
|
|
|
// sign: 1c3c8842e987dff27f7d856d6d47ba18, random: 256171,
|
|
|
// id: 1189, workflow: 2, shuoming: 黑烟超标,交由交警处罚。, title: 黑烟车,
|
|
|
// uid: 135, uname: admin, checkid: 1365, plate_id: 云CX2728, plate_color: 蓝色}
|
|
|
|
|
|
//黑烟复审
|
|
|
//mapAuditWzxxData = {
|
|
|
// sign: 5659087c5871e8221b1591eca1f7abd1, random: 795268,
|
|
|
// id: 1170, workflow: 999, shuoming: 初审为黑烟车。复审黑烟超标,交由交警处罚。, title: 黑烟车,
|
|
|
// uid: 135, uname: admin, checkid: 1345, plate_id: 川15C0895, plate_color: 蓝色}
|
|
|
|
|
|
//return false;
|
|
|
|
|
|
response = await dio.post(api, data: mapAuditWzxxData);
|
|
|
print('response = ${response.toString()}');
|
|
|
//response = {"ret":200,"data":{"code":1},"msg":""}
|
|
|
//response = {"ret":200,"data":{"code":1},"msg":""}
|
|
|
|
|
|
//code 整型 更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
//I/flutter ( 5152): {"ret":200,"data":{"code":1},"msg":""}
|
|
|
if (response.statusCode == 200) {
|
|
|
print('违章信息${mapHyshlx[hyshlx]['text']}网络请求过程正常完成');
|
|
|
Map _maphyshContentFirstAuditRet = await getMapFromJson(response.data);
|
|
|
ret = _maphyshContentFirstAuditRet["data"]["code"];
|
|
|
print('App.Car_Hyc.Workflow返回值中的code 整型 更新的结果,1表示成功,0表示无更新,false表示失败');
|
|
|
print('_maphyshContentFirstAuditRet["data"]["code"] = ${ret}');
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
//处理审核信息数据
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
//向交警服务器推送数据-模块数据
|
|
|
|
|
|
//推送交警操作函数
|
|
|
Future tsjjFun(int _wzxxID, String _plateAndID) async {
|
|
|
String ret = '';
|
|
|
//var ret = -1;//这样会报错:type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'int'
|
|
|
//推送交警操作函数步骤,注意:
|
|
|
// 推送交警1、等待5秒,重新读取指定ID的违章信息记录返回_mapGetHycsGetData。因为在复审提交后,可能用户修改了审核结果,所以必须重新延时读取
|
|
|
// 在 tsjjFun(int _wzxxID) 函数中,调用 _mapGetHycsGetData = getWzxxItemData(_wzxxID); 函数实现
|
|
|
print('before getWzxxItemData(_wzxxID)');
|
|
|
getWzxxItemData(_wzxxID).then((_mapGetHycsGetData) async {
|
|
|
//OK
|
|
|
//return -1;
|
|
|
|
|
|
// 推送交警2、第一方面的条件:需要审核状态workflow=999、sfhy(是否黑烟)=黑烟车、且tsjj为真时才允许推送
|
|
|
// 在 tsjjFun(int _wzxxID) 函数中,用 if (_mapGetHycsGetData['workflow'] == 999 && _mapGetHycsGetData['sfhy'] == hyc_text) 实现
|
|
|
print('_mapGetHycsGetData = ${_mapGetHycsGetData}');
|
|
|
print('_mapGetHycsGetData[\'workflow\'] == 999 : ${_mapGetHycsGetData['workflow'] == 999}');
|
|
|
print('_mapGetHycsGetData[\'sfhy\'] == hyc_text : ${_mapGetHycsGetData['sfhy'] == hyc_text}');
|
|
|
//I/flutter (16661): _mapGetHycsGetData = {id: 1220, plate_id: 川Q565H4, plate_color: 蓝色, zpsj: 1612852562, yjxx_id: 1396, workflow: 999, video_url: video/5_6063_20210209_143
|
|
|
// 602_川Q565H4.mp4, pic_url: /wwwroot/admin/Api/wwwroot/public/uploads/110012f894b695f4586e23497ff4dc69.jpg, clfl: 集装箱卡车, dwip: 172.16.3.5, dwms: 叙州区柏溪收费站出城方向,
|
|
|
// lgmzs: 3, jczxd: 854, sfhy: 黑烟车}
|
|
|
// I/flutter (16661): _mapGetHycsGetData['workflow'] == 999 : true
|
|
|
// I/flutter (16661): _mapGetHycsGetData['sfhy'] == hyc_text : true
|
|
|
|
|
|
if (_mapGetHycsGetData['workflow'] == 999 && _mapGetHycsGetData['sfhy'] == hyc_text) {
|
|
|
print('开始执行:tsjjGetTsStatus(_wzxxID)');
|
|
|
//I/flutter (16661): 开始执行:tsjjGetTsStatus(_wzxxID)
|
|
|
|
|
|
// 获取推送交警状态信息
|
|
|
// tsjjGetTsStatus返回字段 类型 说明
|
|
|
// id 整型 违章记录ID
|
|
|
// checkid 整型 推送的抓拍记录ID
|
|
|
// tszt 整型 推送状态:0-未推送 | 1-推送失败 | 3-推送成功
|
|
|
// ts_time 字符串 推送时间
|
|
|
//Future tsjjGetTsStatus(int _wzxxID)
|
|
|
Map mapTsjjGetTsStatus = await tsjjGetTsStatus(_wzxxID);
|
|
|
|
|
|
// 推送交警3、第二方面的条件:推送前还需查询违章记录推送状态,未推送、或推送失败的才进行推送
|
|
|
// 在 tsjjFun(int _wzxxID) 函数中,调用 mapTsjjGetTsStatus = await tsjjGetTsStatus(_wzxxID); 函数实现
|
|
|
//_mapTsjjUpftpRet["data"] = {id: 1220, checkid: 1396, tszt: 0, ts_time: null}
|
|
|
if (0 == mapTsjjGetTsStatus['tszt'] || 1 == mapTsjjGetTsStatus['tszt']) {
|
|
|
// 推送交警4、符合上面两个方面的条件后,再开始向交警服务器推送数据操作
|
|
|
// 在 tsjjFun(int _wzxxID) 函数中,调用 _mapTsjjUpftp = await tsjjUpftp(_wzxxID, mapTsjjGetTsStatus['checkid']); 函数实现
|
|
|
//向交警服务器推送数据
|
|
|
//返回值为Map,mapRet['msg']为字符串:推送成功 | 推送失败 | 服务器连接失败,mapRet['ts_time']为推送完成时间戳秒数字符串
|
|
|
String _ftpdir = getFtpdir_YYYYMMDD(_mapGetHycsGetData['zpsj']);
|
|
|
print('_ftpdir = $_ftpdir');
|
|
|
|
|
|
//tsjjUpftp执行很慢,需要几十秒钟,需要显示等待中的圈圈
|
|
|
Map _mapTsjjUpftp = await tsjjUpftp(_wzxxID, _ftpdir);
|
|
|
print('_mapTsjjUpftp = $_mapTsjjUpftp');
|
|
|
//I/flutter (24008): _mapTsjjUpftp = {msg: 推送成功, ts_time: 1614600887}
|
|
|
//I/flutter (30430): _mapTsjjUpftp = {msg: 服务器连接失败, ts_time: 1613049849}
|
|
|
//return -1;
|
|
|
|
|
|
//_mapTsjjUpftp = {msg: 推送成功, ts_time: 1612858030}
|
|
|
|
|
|
// 推送交警5、推送完成后,不论成功失败,都需要调用回写接口,把推送状态回写入数据库。
|
|
|
// 推送本身的上传图片和文件FTP是由接口完成,完成后会返回一个msg,说明是成功还是失败。
|
|
|
// 调用 var ret = await tsjjFtpUptszt(_wzxxID, _mapTsjjUpftp['msg'], _mapTsjjUpftp['ts_time']); 函数实现
|
|
|
//回写推送交警状态。整型返回值表示更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
//_mapTsjjUpftp = {msg: 推送成功, ts_time: 1612858030}
|
|
|
|
|
|
ret = _mapTsjjUpftp['msg'];
|
|
|
var ret2 = await tsjjFtpUptszt(_wzxxID, _mapTsjjUpftp['msg'], _mapTsjjUpftp['ts_time']);
|
|
|
print('tsjjFtpUptszt_ret2 = $ret2');
|
|
|
//I/flutter (30430): tsjjFtpUptszt_ret = 1
|
|
|
//return -1;
|
|
|
|
|
|
//返回字符串msg:推送成功 | 推送失败 | 服务器连接失败
|
|
|
String retTsjjFun = '';
|
|
|
if (null != ret && ret.indexOf('成功') > -1) {
|
|
|
retTsjjFun = _plateAndID + ' 推送交警成功!';
|
|
|
} else {
|
|
|
retTsjjFun = _plateAndID + ' 推送交警失败。';
|
|
|
}
|
|
|
|
|
|
eventBus.fire(HycsDataUpdateEvent('${mapHyshlx[hyshlx]['text']}数据已更新'));
|
|
|
|
|
|
print('after tsjjFun(widget.id),retTsjjFun = $retTsjjFun');
|
|
|
Fluttertoast.showToast(msg: retTsjjFun, gravity: ToastGravity.CENTER);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
print('after getWzxxItemData(_wzxxID)');
|
|
|
|
|
|
//推送交警操作函数 tsjjFun 整型返回值。-1 表示推送失败;其余表示 tsjjFtpUptszt 函数的更新结果,1表示成功,0表示无更新,false表示失败
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
//App.Car_Hyc.GetTs
|
|
|
// 获取推送状态信息
|
|
|
// 接口地址:http://125.64.218.67:9904/?s=App.Car_Hyc.GetTs
|
|
|
// 接口文档
|
|
|
// 根据ID获取违章记录的推送交警服务器状态
|
|
|
//
|
|
|
// 接口参数
|
|
|
// 参数名字 类型 是否必须 默认值 其他 说明
|
|
|
// sign 字符串 必须
|
|
|
// random 字符串 必须
|
|
|
// id 字符串 必须 最小:1 违章记录ID
|
|
|
// 返回结果
|
|
|
// 返回字段 类型 说明
|
|
|
// id 整型 违章记录ID
|
|
|
// checkid 整型 推送的抓拍记录ID
|
|
|
// tszt 整型 推送状态:0-未推送 | 1-推送失败 | 3-推送成功
|
|
|
// ts_time 字符串 推送时间
|
|
|
// 异常情况
|
|
|
// 错误码 错误描述信息
|
|
|
// 400 表示客户端参数错误
|
|
|
// 404 表示接口服务不存在
|
|
|
// 500 表示服务端内部错误
|
|
|
|
|
|
// 推送交警2、第二方面的条件:推送前还需查询违章记录推送状态,未推送、或推送失败的才进行推送
|
|
|
// 在 hyshContentFirstAudit() 函数中调用 tsjjGetTsStatus(_wzxxID) 函数实现
|
|
|
// 获取推送交警状态信息
|
|
|
// tsjjGetTsStatus返回字段 类型 说明
|
|
|
// id 整型 违章记录ID
|
|
|
// checkid 整型 推送的抓拍记录ID
|
|
|
// tszt 整型 推送状态:0-未推送 | 1-推送失败 | 3-推送成功
|
|
|
// ts_time 字符串 推送时间
|
|
|
Future tsjjGetTsStatus(int _wzxxID) async {
|
|
|
var ret;
|
|
|
Map _mapTsjjGetTsStatusRet = {'msg': ''};
|
|
|
var api = ServicePath.tsjjGetTsStatus; //获取推送交警状态信息;
|
|
|
print(api);
|
|
|
|
|
|
print('id = ${_wzxxID}');
|
|
|
if (_wzxxID < 1) {
|
|
|
ret = '获取${mapHyshlx[hyshlx]['text']}数据的 id 号不正确!';
|
|
|
print(ret);
|
|
|
Fluttertoast.showToast(msg: ret, gravity: ToastGravity.CENTER);
|
|
|
return;
|
|
|
} else {
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
print('random = ${random}');
|
|
|
print('response = ${response}'); //I/flutter (16661): response = null
|
|
|
|
|
|
response = await dio.post(api, data: {
|
|
|
"id": _wzxxID,
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
});
|
|
|
print('_wzxxID = ${_wzxxID}');
|
|
|
print('response = ${response.toString()}');
|
|
|
//response = {"ret":200,"data":{"id":1220,"checkid":1396,"tszt":0,"ts_time":null},"msg":""}
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
_mapTsjjGetTsStatusRet = await getMapFromJson(response.data);
|
|
|
|
|
|
//msg 字符串 msg的值为:推送成功 | 推送失败 | 服务器连接失败
|
|
|
print('App.Car_Hyc.GetTs返回值中的tszt字段 整型 推送状态:0-未推送 | 1-推送失败 | 3-推送成功');
|
|
|
ret = _mapTsjjGetTsStatusRet["data"];
|
|
|
print('_mapTsjjUpftpRet["data"] = ${ret}');
|
|
|
//_mapTsjjUpftpRet["data"] = {id: 1220, checkid: 1396, tszt: 0, ts_time: null}
|
|
|
|
|
|
print('获取${mapHyshlx[hyshlx]['text']}数据的网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
print('tsjjGetTsStatus($_wzxxID).ret = ${ret}');
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
//App.Car_Ftp.Upftp
|
|
|
// 上传FTP
|
|
|
// 接口地址:http://125.64.218.67:9904/?s=App.Car_Ftp.Upftp
|
|
|
// 接口文档
|
|
|
// 向交警服务器推送数据
|
|
|
//
|
|
|
// 接口参数
|
|
|
// 参数名字 类型 是否必须 默认值 其他 说明
|
|
|
// sign 字符串 必须
|
|
|
// random 字符串 必须
|
|
|
// id 字符串 必须 最小:1 抓拍记录ID,注意这里是提交违章记录中checkid字段
|
|
|
// ftpdir 字符串 必须 上传目录,为checkid记录的抓拍时间,格式为4位年+2位月+2位日,如:20210208
|
|
|
// 返回结果
|
|
|
// 返回字段 类型 说明
|
|
|
// msg 字符串 msg的值为:推送成功 | 推送失败 | 服务器连接失败
|
|
|
// 异常情况
|
|
|
// 错误码 错误描述信息
|
|
|
// 400 表示客户端参数错误
|
|
|
// 404 表示接口服务不存在
|
|
|
// 500 表示服务端内部错误
|
|
|
//
|
|
|
|
|
|
// 推送交警3、符合上面两个方面的条件后,再进行向交警服务器推送数据操作
|
|
|
// 调用 tsjjUpftp(_wzxxID, _indexZpjl) 函数实现
|
|
|
// 向交警服务器推送数据
|
|
|
//返回值为Map,mapRet['msg']为字符串:推送成功 | 推送失败 | 服务器连接失败,mapRet['ts_time']为推送完成时间戳秒数字符串
|
|
|
Future<Map> tsjjUpftp(int _wzxxID, String _ftpdir) async {
|
|
|
Map mapRet = {'msg': 'test'};
|
|
|
var api = ServicePath.tsjjFtpUpftpUrl;
|
|
|
print(api); // http://125.64.218.67:9904/?s=App.Car_Ftp.Upftp
|
|
|
|
|
|
print('_wzxxID = ${_wzxxID}'); //_wzxxID = 1220
|
|
|
if (_wzxxID < 1) {
|
|
|
mapRet['msg'] = '获取${mapHyshlx[hyshlx]['text']}数据的 id 号不正确!';
|
|
|
print(mapRet['msg']);
|
|
|
Fluttertoast.showToast(msg: mapRet['msg'], gravity: ToastGravity.CENTER);
|
|
|
} else {
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
print('random = ${random}');
|
|
|
print('response = ${response}'); //I/flutter (16661): response = null
|
|
|
print('ftpdir = $_ftpdir'); //I/flutter (22207): ftpdir = 20210209
|
|
|
|
|
|
// ftpdir 字符串 必须 上传目录,为checkid记录的抓拍时间,格式为4位年+2位月+2位日,如:20210208
|
|
|
response = await dio.post(api, data: {
|
|
|
"id": _wzxxID,
|
|
|
'ftpdir': _ftpdir,
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
});
|
|
|
print('_wzxxID = ${_wzxxID}');
|
|
|
print(
|
|
|
'response = ${response.toString()}'); //response = {"ret":200,"data":{"msg":"推送成功"},"msg":""}
|
|
|
//{
|
|
|
// "ret": 200,
|
|
|
// "data": {
|
|
|
// "msg": "推送成功"
|
|
|
// },
|
|
|
// "msg": ""
|
|
|
// }
|
|
|
if (response.statusCode == 200) {
|
|
|
Map _mapTsjjUpftpRet = await getMapFromJson(response.data);
|
|
|
|
|
|
//msg 字符串 msg的值为:推送成功 | 推送失败 | 服务器连接失败
|
|
|
print('App.Car_Ftp.Upftp返回值中的msg 字符串 msg的值为:推送成功 | 推送失败 | 服务器连接失败');
|
|
|
print('_mapTsjjUpftpRet = ${_mapTsjjUpftpRet}');
|
|
|
mapRet['msg'] = _mapTsjjUpftpRet["data"]["msg"];
|
|
|
|
|
|
print('获取${mapHyshlx[hyshlx]['text']}数据的网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
//I/flutter (16661): 网络请求过程异常e:RangeError (index): Invalid value: Only valid value is 0: 1396
|
|
|
mapRet['msg'] = e.toString();
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
//print('DateTimeNowSecnods = ${_dateTime_now.millisecondsSinceEpoch}');
|
|
|
//print('DateTimeNowSecnods = ${_dateTime_now.millisecondsSinceEpoch / 1000}');
|
|
|
////I/flutter ( 4010): DateTimeNowSecnods = 1612857524906
|
|
|
////I/flutter ( 4010): DateTimeNowSecnods = 1612857524.906
|
|
|
//~ 取整操作符
|
|
|
mapRet['ts_time'] =
|
|
|
(DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(); //获取App.Car_Ftp.Upftp推送完成时间
|
|
|
print('mapRet = ${mapRet}');
|
|
|
//mapRet = {msg: 推送成功, ts_time: 1612858030}
|
|
|
//mapRet = {msg: 推送成功, ts_time: 1612857648.202}
|
|
|
//mapRet = {msg: 推送成功, ts_time: 7}
|
|
|
//I/flutter (16661): mapRet = {msg: RangeError (index): Invalid value: Only valid value is 0: 1396, ts_time: 38}
|
|
|
|
|
|
//I/flutter (30430): mapRet = {msg: 服务器连接失败, ts_time: 1613049849}
|
|
|
|
|
|
return mapRet;
|
|
|
}
|
|
|
|
|
|
//App.Car_Ftp.Uptszt
|
|
|
// 更新推送状态
|
|
|
// 接口地址:http://125.64.218.67:9904/?s=App.Car_Ftp.Uptszt
|
|
|
// 接口文档
|
|
|
// 根据ID更新违章记录数据库中的推送状态
|
|
|
//
|
|
|
// 接口参数
|
|
|
// 参数名字 类型 是否必须 默认值 其他 说明
|
|
|
// sign 字符串 必须
|
|
|
// random 字符串 必须
|
|
|
// id 整型 必须 最小:1 违章记录ID
|
|
|
// tszt 整型 必须 2 最小:0 推送状态: 0=>未推送 | 1=>推送失败 | 2=>推送成功
|
|
|
// ts_time 字符串 必须 推送时间,时间戳格式
|
|
|
// 返回结果
|
|
|
// 返回字段 类型 说明
|
|
|
// code 整型 更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
// 异常情况
|
|
|
// 错误码 错误描述信息
|
|
|
// 400 表示客户端参数错误
|
|
|
// 404 表示接口服务不存在
|
|
|
// 500 表示服务端内部错误
|
|
|
|
|
|
//必须是tsjjGetTsStatus(1221).ret = {id: 1221, checkid: 1398, tszt: 0, ts_time: null}中,
|
|
|
// ts_time: null才能使用tsjjFtpUptszt成功回写,否则回写无更新
|
|
|
Map mapTsjjFtpUptsztRet = {
|
|
|
"ret": 200,
|
|
|
"data": {"code": 1},
|
|
|
"msg": ""
|
|
|
};
|
|
|
|
|
|
//{
|
|
|
// "ret": 200,
|
|
|
// "data": {
|
|
|
// "code": 0
|
|
|
// },
|
|
|
// "msg": ""
|
|
|
// }
|
|
|
|
|
|
// 推送交警4、推送完成后,不论成功失败,都需要调用回写接口,把推送状态回写入数据库。
|
|
|
// 推送本身的上传图片和文件FTP是由接口完成,完成后会返回一个msg,说明是成功还是失败。
|
|
|
// 调用 函数实现
|
|
|
//回写推送交警状态。整型返回值表示更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
//mapTsjjUpftp = {msg: 推送成功, ts_time: 1612858030}
|
|
|
Future tsjjFtpUptszt(int _wzxxID, String _tszt, String _ts_time) async {
|
|
|
var ret;
|
|
|
Map _mapTsjjUptsztRet = {'msg': ''};
|
|
|
var api = ServicePath.tsjjFtpUptsztUrl; //回写推送交警状态
|
|
|
print(api); //I/flutter (22207): http://125.64.218.67:9904/?s=App.Car_Ftp.Uptszt
|
|
|
|
|
|
//tszt 整型 必须 2 最小:0 推送状态: 0=>未推送 | 1=>推送失败、或服务器连接失败 | 2=>推送成功
|
|
|
Map mapTszt = {
|
|
|
'未推送': 0,
|
|
|
'服务器连接失败': 1,
|
|
|
'推送失败': 1,
|
|
|
'推送成功': 2,
|
|
|
};
|
|
|
|
|
|
int _intTszt = 1;
|
|
|
if (mapTszt.containsKey(_tszt)) {
|
|
|
_intTszt = mapTszt[_tszt];
|
|
|
}
|
|
|
|
|
|
print('id = ${_wzxxID}'); //_wzxxID = 1210
|
|
|
if (_wzxxID < 1) {
|
|
|
ret = '获取${mapHyshlx[hyshlx]['text']}数据的 id 号不正确!';
|
|
|
print(ret);
|
|
|
Fluttertoast.showToast(msg: ret, gravity: ToastGravity.CENTER);
|
|
|
} else {
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
print('random = ${random}');
|
|
|
print('response = ${response}');
|
|
|
|
|
|
Map _mapDio = {
|
|
|
"id": _wzxxID,
|
|
|
'tszt': _intTszt,
|
|
|
'ts_time': _ts_time,
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
};
|
|
|
print('_mapDio = ${_mapDio}');
|
|
|
//_mapDio = {id: 1210, tszt: 2, ts_time: 1612858409, sign: 2212446404dcb8cb07f2476dcd8f9480, random: 455071}
|
|
|
//_mapDio = {id: 1222, tszt: 0, ts_time: 1613052700, sign: eaeec0973a86d6522fcecd175e07f106, random: 228812}
|
|
|
|
|
|
response = await dio.post(api, data: _mapDio);
|
|
|
print('_wzxxID = ${_wzxxID}');
|
|
|
print('response = ${response.toString()}');
|
|
|
//I/flutter (25617): response = {"ret":200,"data":{"code":1},"msg":""}
|
|
|
// response = {"ret":500,"data":{},"msg":"服务器运行错误: Api::$shuoming undefined"}
|
|
|
|
|
|
//I/flutter ( 5232): {"ret":200,"data":{"items":[],"total":0,"page":1,"perpage":10},"msg":""}
|
|
|
if (response.statusCode == 200) {
|
|
|
_mapTsjjUptsztRet = await getMapFromJson(response.data);
|
|
|
|
|
|
//code 整型 更新的结果,1表示成功,0表示无更新,false表示失败
|
|
|
print('App.Car_Ftp.Uptszt返回值中的code 整型 更新的结果,1表示成功,0表示无更新,false表示失败');
|
|
|
print('_mapTsjjUptsztRet = ${_mapTsjjUptsztRet}');
|
|
|
ret = _mapTsjjUptsztRet["data"]["code"];
|
|
|
|
|
|
print('获取${mapHyshlx[hyshlx]['text']}数据的网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
// 向交警服务器推送数据-模块数据
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// Map _mapGetHycsGetData = {};
|
|
|
// Map _mapGetHycsGetDataRet = {
|
|
|
// "ret": 200,
|
|
|
// "data": {
|
|
|
// "id": 1221,
|
|
|
// "plate_id": "云CY4502",
|
|
|
// "plate_color": "蓝色",
|
|
|
// "zpsj": 1612856589,
|
|
|
// "yjxx_id": "1398",
|
|
|
// "workflow": 999,
|
|
|
// "video_url": "video/4_6063_20210209_154309_云CY4502.mp4",
|
|
|
// "pic_url": "/wwwroot/admin/Api/wwwroot/public/uploads/2ec53c6879c3143bbd8471451be734f6.jpg",
|
|
|
// "clfl": "渣土车",
|
|
|
// "dwip": "172.16.3.4",
|
|
|
// "dwms": "叙州区一曼路出城方向",
|
|
|
// "lgmzs": 3,
|
|
|
// "jczxd": "983",
|
|
|
// "sfhy": "黑烟车"
|
|
|
// },
|
|
|
// "msg": ""
|
|
|
// };
|
|
|
|
|
|
//获取指定id的违章信息返回_mapGetHycsGetData
|
|
|
Future getWzxxItemData(int id) async {
|
|
|
var api = ServicePath.getWzxxGetDataUrl;
|
|
|
print(api);
|
|
|
//I/flutter (16661): http://125.64.218.67:9904/?s=App.Car_Hyc.Get
|
|
|
|
|
|
Map _mapGetHycsGetData = {};
|
|
|
print('id = ${id}');
|
|
|
if (id < 1) {
|
|
|
print('获取${mapHyshlx[hyshlx]['text']}数据的 id 号不正确!');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '获取${mapHyshlx[hyshlx]['text']}数据的 id 号不正确!', gravity: ToastGravity.CENTER);
|
|
|
} else {
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
print('random = ${random}');
|
|
|
print('response = ${response}');
|
|
|
print('sign = ${GenerateMd5(APPkey + random)}');
|
|
|
//I/flutter (16661): response = null
|
|
|
|
|
|
response = await dio.post(api, data: {
|
|
|
"id": id,
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
});
|
|
|
print('id = ${id}');
|
|
|
print('response = ${response.toString()}');
|
|
|
//I/flutter (16661): response = {"ret":200,"data":{
|
|
|
// "id":1211,"plate_id":"川Q023Y2","plate_color":"蓝色","zpsj":1612840361,"yjxx_id":"1387","workflow":999,
|
|
|
// "video_url":"video/3_6063_20210209_111241_川Q023Y2.mp4",
|
|
|
// "pic_url":"/wwwroot/admin/Api/wwwroot/public/uploads/c43286bf381af0a393b44272829d1f07.jpg","clfl":"集装箱卡车",
|
|
|
// "dwip":"172.16.3.3","dwms":"宜宾市翠屏南收费站出城方向","lgmzs":3,"jczxd":"876","sfhy":"黑烟车"
|
|
|
//},"msg":""}
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
Map _mapGetHycsGetDataRet = await getMapFromJson(response.data);
|
|
|
_mapGetHycsGetData = _mapGetHycsGetDataRet['data'];
|
|
|
print('获取${mapHyshlx[hyshlx]['text']}数据的网络请求过程正常完成');
|
|
|
print('_mapGetHycsGetData = ${_mapGetHycsGetData}');
|
|
|
//I/flutter (16661): _mapGetHycsGetData = {
|
|
|
// id: 1217, plate_id: 川QFX088, plate_color: 蓝色, zpsj: 1612847361, yjxx_id: 1393, workflow: 999,
|
|
|
// video_url: video/3_6063_20210209_130921_川QFX088.mp4,
|
|
|
// pic_url: /wwwroot/admin/Api/wwwroot/public/uploads/c227c65bcaadcdf53094c5448c2460ce.jpg,
|
|
|
// clfl: 面包车, dwip: 172.16.3.3, dwms: 宜宾市翠屏南收费站出城方向, lgmzs: 3, jczxd: 992, sfhy: 黑烟车
|
|
|
//}
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return _mapGetHycsGetData;
|
|
|
}
|
|
|
|
|
|
// App.Car_Hyc.GetList
|
|
|
// 根据审核状态获取分页列表数据
|
|
|
// 接口地址:http://125.64.218.67:9904/?s=App.Car_Hyc.GetList
|
|
|
// 接口文档
|
|
|
// 根据审核状态筛选列表数据,支持分页
|
|
|
//
|
|
|
// 接口参数
|
|
|
// 参数名字 类型 是否必须 默认值 其他 说明
|
|
|
// sign 字符串 必须
|
|
|
// random 字符串 必须
|
|
|
// workflow 整型 可选 1 最小:1 审核状态:1=>待审 | 2=>已初审 | 999=>已复审
|
|
|
// sfhy 字符串 可选 黑烟车 是否黑烟车:黑烟车|非黑烟车
|
|
|
// page 整型 可选 1 最小:1 第几页
|
|
|
// perpage 整型 可选 10 最小:1;最大:20 分页数量
|
|
|
// 返回结果
|
|
|
// 返回字段 类型 说明
|
|
|
// items 字符串 列表数据,列表字段请参考get接口
|
|
|
// total 整型 总数量
|
|
|
// page 整型 当前第几页
|
|
|
// perpage 整型 每页数量
|
|
|
|
|
|
//dart是值传递
|
|
|
int iPage = 0;
|
|
|
//perpage应该小于等于100
|
|
|
///从接口 mapHyshlx[hyshlx]['api'] 获取第 iPage 页的列表数据,返回 list
|
|
|
Future getPageList({int perpage = 20, String theHyshlx = '', bool bShowToast = true}) async {
|
|
|
//从网络获取所有违章数据
|
|
|
iPage++;
|
|
|
|
|
|
List list = await getThePageList(
|
|
|
theHyshlx: theHyshlx, page: iPage, perpage: perpage, bShowToast: bShowToast);
|
|
|
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
///从接口 mapHyshlx[theHyshlx]['api'] 获取指定类型第 page 页的列表数据,返回 list
|
|
|
Future getThePageList(
|
|
|
{String theHyshlx = '', int page = 1, int perpage = 20, bool bShowToast = true}) async {
|
|
|
List list = [];
|
|
|
if (theHyshlx.isEmpty) {
|
|
|
theHyshlx = hyshlx;
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
print('开始处理网络请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
Map map = {
|
|
|
"page": page,
|
|
|
"perpage": perpage,
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
};
|
|
|
|
|
|
int i = 1;
|
|
|
print('theHyshlx${i++} = $theHyshlx');
|
|
|
//增加了一个查询字段 是否黑烟:sfhy 字符串 可选 黑烟车 是否黑烟车:黑烟车|非黑烟车,为空则全部
|
|
|
if (mapHyshlx[theHyshlx].containsKey('sfhy')) {
|
|
|
map['sfhy'] = mapHyshlx[theHyshlx]['sfhy'];
|
|
|
}
|
|
|
|
|
|
print('theHyshlx${i++} = $theHyshlx');
|
|
|
if (mapHyshlx[theHyshlx]['get_workflow'] > 0) {
|
|
|
map['workflow'] = mapHyshlx[theHyshlx]['get_workflow'];
|
|
|
}
|
|
|
|
|
|
print('theHyshlx${i++} = $theHyshlx');
|
|
|
//设备类型
|
|
|
if (mapHyshlx[theHyshlx].containsKey('sblx')) {
|
|
|
map['sblx'] = mapHyshlx[theHyshlx]['sblx'];
|
|
|
}
|
|
|
|
|
|
print('mapHyshlx[theHyshlx][api] = ${mapHyshlx[theHyshlx]['api']}');
|
|
|
// mapHyshlx[theHyshlx][api] = http://125.64.218.67:9904/?s=App.Car_Hyc.GetList
|
|
|
print('map = ${map}');
|
|
|
response = await dio.post(mapHyshlx[theHyshlx]['api'], data: map);
|
|
|
print('response = ${response.toString()}');
|
|
|
//I/flutter ( 5232): {"ret":200,"data":{"items":[],"total":0,"page":1,"perpage":10},"msg":""}
|
|
|
if (response.statusCode == 200) {
|
|
|
//mapGetWzxxGetListRet = await getMapFromJson(response.data);
|
|
|
Map mapGetData = await getMapFromJson(response.data);
|
|
|
print(mapGetData.toString());
|
|
|
//第一次必须先进行listWzxxGetList2.clear(),否则addAll报错终止
|
|
|
print('mapGetData[' 'data' '][' 'items' '].length = ${mapGetData['data']['items'].length}');
|
|
|
if (bShowToast && 0 == mapGetData['data']['items'].length) {
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '没有更多了!',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
} else {
|
|
|
//listWzxxGetList2.addAll(mapGetData['data']['items']);
|
|
|
list = mapGetData['data']['items'];
|
|
|
//eventBus.fire(new WzxxDataUpdateEvent('违章信息数据已更新'));
|
|
|
//eventBus.fire(dataUpdateEvent);
|
|
|
}
|
|
|
//网络请求过程异常e:${e}type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Iterable<dynamic>'
|
|
|
print('网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
///点位视频播放相关函数
|
|
|
Future playUrl({@required int index, String url, BuildContext context}) {
|
|
|
urlnew = url;
|
|
|
// var ret = Navigator.of(context).push(MaterialPageRoute(
|
|
|
// builder: (context) => PlayerProNew(
|
|
|
// id: index + 1,
|
|
|
// url: urlnew,
|
|
|
// title: '点位视频\n${(index + 1)}、${listDwinfoGetList2[index]['dwmc']}',
|
|
|
// )));
|
|
|
var ret = Navigator.of(context).push(MaterialPageRoute(
|
|
|
builder: (context) => SuperPlayerPage(
|
|
|
id: index + 1,
|
|
|
url: urlnew,
|
|
|
title: '点位视频\n${(index + 1)}、${listDwinfoGetList2[index]['dwmc']}',
|
|
|
)));
|
|
|
|
|
|
print('ret = $ret');
|
|
|
//正在获取点位视频标志,禁止重入
|
|
|
getingDwVideo = false;
|
|
|
|
|
|
//标注正在获取点位视频的记录
|
|
|
getingIndex = -1;
|
|
|
print('_getingIndex = $getingIndex');
|
|
|
eventBus.fire(DwspUpdateEvent('点位视频信息数据更新广播'));
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
int getCurrentTiem() {
|
|
|
return DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
|
|
}
|
|
|
|
|
|
///直接获取点位视频(Dwsp)播放地址,并开始播放
|
|
|
Future getDwspUrlNew(
|
|
|
{@required int indexRecord, String theSbgllx = 'dwsp', BuildContext context}) async {
|
|
|
print('\n --- getingDwVideo = $getingDwVideo --- \n');
|
|
|
//正在获取点位视频标志,禁止重入
|
|
|
if (getingDwVideo) {
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '正在后台获取 $getingDwmc 点位视频地址,请稍后重试',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
//标注正在获取点位视频的记录
|
|
|
eventBus.fire(DwspUpdateEvent('点位视频信息数据更新广播'));
|
|
|
|
|
|
getingDwVideo = true;
|
|
|
getingDwmc = '${(indexRecord + 1)}、${listDwinfoGetList2[indexRecord]['dwmc']}'; //正在获取视频的点位名称
|
|
|
print('\n --- 正在后台获取 $getingDwmc 点位视频地址 --- \n');
|
|
|
print('\n --- getingDwVideo = $getingDwVideo --- \n');
|
|
|
|
|
|
//MediaQueryData.fromWindow(window).padding.top //这个就是状态栏的高度
|
|
|
//ScreenUtil().statusBarHeight //状态栏高度 刘海屏会更高 单位dp
|
|
|
// print('ScreenUtil().statusBarHeight = ${ScreenUtil().statusBarHeight}');
|
|
|
// getSumTime = getCurrentTiem();
|
|
|
// MyDelayToast(
|
|
|
// context: context,
|
|
|
// showTime: 30,
|
|
|
// top: ScreenUtil().statusBarHeight + 2.5,
|
|
|
// left: ScreenUtil().screenWidth - 80 - 2.5);
|
|
|
|
|
|
print('listDwspGetList2 = ${listDwspGetList2}');
|
|
|
print('indexRecord = ${indexRecord}');
|
|
|
String _dwspUrl =
|
|
|
listDwspGetList2[indexRecord]['play_urlhead'] + listDwspGetList2[indexRecord]['video16'];
|
|
|
print('开始播放:第$getCount次成功获取的视频地址');
|
|
|
|
|
|
if (!isVideoUrl(_dwspUrl)) {
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '获取 $getingDwmc 点位视频地址失败,请稍后重试。',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
} else {
|
|
|
print('开始播放视频地址');
|
|
|
playUrl(index: indexRecord, url: _dwspUrl, context: context);
|
|
|
}
|
|
|
|
|
|
//不能放到此处,此处不会等待,将导致禁止重入失败
|
|
|
//正在获取点位视频标志,禁止重入
|
|
|
//getingDwVideo = false;
|
|
|
|
|
|
//print('失败:$getCount次获取的视频地址都失败!');
|
|
|
return _dwspUrl;
|
|
|
}
|
|
|
|
|
|
///得到点位视频(Dwsp)播放地址,用插件 http: ^0.12.2
|
|
|
Future getDwspUrl({@required int index, String theSbgllx = 'dwsp', BuildContext context}) async {
|
|
|
print('\n --- getingDwVideo = $getingDwVideo --- \n');
|
|
|
//正在获取点位视频标志,禁止重入
|
|
|
if (getingDwVideo) {
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '正在后台获取 $getingDwmc 点位视频地址,请稍后重试',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
//标注正在获取点位视频的记录
|
|
|
getingIndex = index;
|
|
|
print('_getingIndex = $getingIndex');
|
|
|
eventBus.fire(DwspUpdateEvent('点位视频信息数据更新广播'));
|
|
|
|
|
|
getingDwVideo = true;
|
|
|
getingDwmc = '${(index + 1)}、${listDwinfoGetList2[index]['dwmc']}'; //正在获取视频的点位名称
|
|
|
print('\n --- 正在后台获取 $getingDwmc 点位视频地址 --- \n');
|
|
|
print('\n --- getingDwVideo = $getingDwVideo --- \n');
|
|
|
|
|
|
String _dwspUrl;
|
|
|
getCount = 1;
|
|
|
|
|
|
//MediaQueryData.fromWindow(window).padding.top //这个就是状态栏的高度
|
|
|
//ScreenUtil().statusBarHeight //状态栏高度 刘海屏会更高 单位dp
|
|
|
print('ScreenUtil().statusBarHeight = ${ScreenUtil().statusBarHeight}');
|
|
|
getSumTime = getCurrentTiem();
|
|
|
MyDelayToast(
|
|
|
context: context,
|
|
|
showTime: 30,
|
|
|
top: ScreenUtil().statusBarHeight + 2.5,
|
|
|
left: ScreenUtil().screenWidth - 80 - 2.5);
|
|
|
|
|
|
print('开始第$getCount次获取视频地址');
|
|
|
getDwspUrl2(index: index, theSbgllx: theSbgllx).then((url) {
|
|
|
_dwspUrl = url;
|
|
|
if (!isVideoUrl(_dwspUrl)) {
|
|
|
print('第$getCount次获取视频地址失败,等待1秒后重试');
|
|
|
getCount++;
|
|
|
Future.delayed(Duration(seconds: 1), () async {
|
|
|
print('开始第$getCount次获取视频地址');
|
|
|
getDwspUrl2(index: index, theSbgllx: theSbgllx).then((url) {
|
|
|
_dwspUrl = url;
|
|
|
if (!isVideoUrl(_dwspUrl)) {
|
|
|
print('第$getCount次获取视频地址失败,等待1秒后重试');
|
|
|
getCount++;
|
|
|
Future.delayed(Duration(seconds: 1), () async {
|
|
|
print('开始第$getCount次获取视频地址');
|
|
|
getDwspUrl2(index: index, theSbgllx: theSbgllx).then((url) {
|
|
|
_dwspUrl = url;
|
|
|
if (!isVideoUrl(_dwspUrl)) {
|
|
|
print('第$getCount次获取视频地址失败,等待1秒后重试');
|
|
|
getCount++;
|
|
|
Future.delayed(Duration(seconds: 1), () async {
|
|
|
print('开始第$getCount次获取视频地址');
|
|
|
getDwspUrl2(index: index, theSbgllx: theSbgllx).then((url) {
|
|
|
_dwspUrl = url;
|
|
|
if (!isVideoUrl(_dwspUrl)) {
|
|
|
print('第$getCount次获取视频地址失败,等待1秒后重试');
|
|
|
getCount++;
|
|
|
Future.delayed(Duration(seconds: 1), () async {
|
|
|
print('开始第$getCount次获取视频地址');
|
|
|
getDwspUrl2(index: index, theSbgllx: theSbgllx).then((url) {
|
|
|
_dwspUrl = url;
|
|
|
if (!isVideoUrl(_dwspUrl)) {
|
|
|
getSumTime = getCurrentTiem() - getSumTime;
|
|
|
print('第$getCount次获取 $getingDwmc 点位视频地址失败,直接返回。共用时 $getSumTime 秒');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '第$getCount次获取 $getingDwmc 点位视频地址失败,请稍后重试。共用时 $getSumTime 秒',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
//正在获取点位视频标志,禁止重入
|
|
|
getingDwVideo = false;
|
|
|
|
|
|
//标注正在获取点位视频的记录
|
|
|
getingIndex = -1;
|
|
|
print('_getingIndex = $getingIndex');
|
|
|
eventBus.fire(DwspUpdateEvent('点位视频信息数据更新广播'));
|
|
|
} else {
|
|
|
print('开始播放:第$getCount次成功获取的视频地址');
|
|
|
playUrl(index: index, url: _dwspUrl, context: context);
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
} else {
|
|
|
print('开始播放:第$getCount次成功获取的视频地址');
|
|
|
playUrl(index: index, url: _dwspUrl, context: context);
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
} else {
|
|
|
print('开始播放:第$getCount次成功获取的视频地址');
|
|
|
playUrl(index: index, url: _dwspUrl, context: context);
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
} else {
|
|
|
print('开始播放:第$getCount次成功获取的视频地址');
|
|
|
playUrl(index: index, url: _dwspUrl, context: context);
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
} else {
|
|
|
print('开始播放:第$getCount次成功获取的视频地址');
|
|
|
playUrl(index: index, url: _dwspUrl, context: context);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
//不能放到此处,此处不会等待,将导致禁止重入失败
|
|
|
//正在获取点位视频标志,禁止重入
|
|
|
//getingDwVideo = false;
|
|
|
|
|
|
//print('失败:$getCount次获取的视频地址都失败!');
|
|
|
return _dwspUrl;
|
|
|
}
|
|
|
|
|
|
///得到点位视频(Dwsp)播放地址,用插件 http: ^0.12.2
|
|
|
Future getDwspUrl2({@required int index, String theSbgllx = 'dwsp'}) async {
|
|
|
String _dwspUrl = '';
|
|
|
|
|
|
print('开始处理 ${mapHyshlx[theSbgllx]['text']} 网络请求...');
|
|
|
String api = ServicePath.getDwspUrl + '${index.toString()}.php';
|
|
|
print('api = ${api}');
|
|
|
//api = http://125.64.218.67:9908/rtmp/1.php
|
|
|
|
|
|
try {
|
|
|
my_http.Response response = await my_http.get(api);
|
|
|
print('response.statusCode = ${response.statusCode}');
|
|
|
//I/flutter (18114): Response status: 200
|
|
|
|
|
|
//var ret = json.decode(response.body); //报错
|
|
|
//print('Utf8Codec().decode(response.bodyBytes) = ${Utf8Codec().decode(response.bodyBytes)}');
|
|
|
// I/flutter (18114): rtmp://125.64.218.67:9903/rtp/26CCDAA7
|
|
|
|
|
|
print('response = ${response.toString()}');
|
|
|
//response = Instance of 'Response'
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
//final Map<String, dynamic> responseData = json.decode(response.body);
|
|
|
//报错:e:Error on line 1, column 18: Invalid media type: expected application/json;
|
|
|
_dwspUrl = Utf8Codec().decode(response.bodyBytes).replaceAll('\n', ''); //删除所有换行符
|
|
|
print('_dwspUrl = $_dwspUrl');
|
|
|
//_dwspUrl = rtmp://125.64.218.67:9903/rtp/30C91573
|
|
|
} else {
|
|
|
throw Exception('${mapHyshlx[theSbgllx]['text']} 后端接口出现异常,请检测代码和服务器情况...');
|
|
|
getingDwVideo = false; //出现异常必须提前释放禁止重入标志
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('${mapHyshlx[theSbgllx]['text']} 网络请求过程异常 e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
getingDwVideo = false; //出现异常必须提前释放禁止重入标志
|
|
|
}
|
|
|
|
|
|
return _dwspUrl;
|
|
|
}
|
|
|
|
|
|
/// 获取最新版本号
|
|
|
Future getNewverUrl() async {
|
|
|
String _text = '获取最新版本号';
|
|
|
Map _mapGetData = {};
|
|
|
|
|
|
String api = ServicePath.getVerUrl;
|
|
|
print('api = ${api}');
|
|
|
//I/flutter (12498): api = http://125.64.218.67:9904/?s=App.Car_Ver.Getver
|
|
|
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
Map map = {
|
|
|
"sign": GenerateMd5(APPkey + random),
|
|
|
"random": random,
|
|
|
};
|
|
|
|
|
|
try {
|
|
|
print('开始处理 $_text 网络请求...');
|
|
|
|
|
|
Dio dio = Dio();
|
|
|
print('map = ${map}');
|
|
|
Response response = await dio.post(api, data: map);
|
|
|
print('response = ${response.toString()}');
|
|
|
//I/flutter (12498): response = {"ret":200,"data":{"id":1,"ver":"1.0.0","miaos":"版本说明",
|
|
|
// "downurl":"http://www.sctastech.com/download/hyzp_20210425.apk","updatetime":1620632231},"msg":""}
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
print('${api} 网络请求过程正常完成');
|
|
|
Map _mapDataRet = await getMapFromJson(response.data);
|
|
|
_mapGetData = _mapDataRet['data'];
|
|
|
} else {
|
|
|
throw Exception('${api} 后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('${api} 网络请求过程异常 e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return _mapGetData;
|
|
|
}
|
|
|
|
|
|
///人脸注册上传图片
|
|
|
//App.User_User.Facereg 人脸注册接口
|
|
|
//返回结果
|
|
|
// 返回字段 类型 说明
|
|
|
// user_id 整型 用户ID
|
|
|
// is_reg 布尔型 是否注册成功
|
|
|
//人脸注册,filePath 人脸图片路径,username 用户名,user_id 用户ID,上级 context
|
|
|
Future faceReg_uploadImage(
|
|
|
{@required String filePath,
|
|
|
@required String username,
|
|
|
@required int user_id,
|
|
|
@required BuildContext context}) async {
|
|
|
print('开始处理网络请求...');
|
|
|
|
|
|
//1、将图片转换为 Base64 格式的字符串
|
|
|
image2Base64(filePath).then((imageBase64) async {
|
|
|
//2、准备 dio 的 api
|
|
|
//static const String uploadFaceregUrl = ServiceUrl + '?s=App.User_User.Facereg'; //人脸注册接口
|
|
|
var api = ServicePath.uploadFaceregUrl;
|
|
|
print(api);
|
|
|
|
|
|
//3、准备 dio 参数 map
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
Map map = {
|
|
|
'sign': GenerateMd5(APPkey + random),
|
|
|
'random': random,
|
|
|
'user_id': user_id,
|
|
|
'face': imageBase64,
|
|
|
};
|
|
|
print('map = ${map}');
|
|
|
|
|
|
//4、准备 dio 相关变量
|
|
|
faceReg = -1; //复位人脸注册成功标志。1 成功,0 失败,-1 处理中
|
|
|
Map _mapGetData = {};
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
//5、开始调用 dio
|
|
|
try {
|
|
|
print('response = ${response}');
|
|
|
//I/flutter (16661): response = null
|
|
|
response = await dio.post(api, data: map);
|
|
|
print('response = ${response}');
|
|
|
//I/flutter (11748): response = {"ret":200,"data":{"user_id":135,"is_reg":"true","pic_url":"/wwwroot/admin/Api/wwwroot/public/uploads/b5fb2a19db9cabd4d0b1c3fe496981ec.jpg"},"ms
|
|
|
// g":""}
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
Map _mapDataRet = await getMapFromJson(response.data);
|
|
|
_mapGetData = _mapDataRet['data'];
|
|
|
print('上传图片 网络请求过程正常完成');
|
|
|
print('_mapGetData = ${_mapGetData}');
|
|
|
//I/flutter (11748): _mapGetData = {user_id: 135, is_reg: true, pic_url: /wwwroot/admin/Api/wwwroot/public/uploads/b5fb2a19db9cabd4d0b1c3fe496981ec.jpg}
|
|
|
//I/flutter (28045): _mapGetData = {code: 1, msg: 未检测到人脸信息, count: 0, data: []}
|
|
|
|
|
|
//设置人脸注册结果标志
|
|
|
if ('true' == _mapGetData['is_reg']) {
|
|
|
//I/flutter (11748): 网络请求过程异常e:type 'String' is not a subtype of type 'bool'
|
|
|
faceReg = 1; //设置人脸注册成功标志。1 成功,0 失败,-1 处理中
|
|
|
print('faceReg = $faceReg,人脸注册成功,返回 tabs 页面');
|
|
|
//Navigator.pushNamed(null, '/tabs'); //返回 tabs 页面
|
|
|
//I/flutter (11748): 网络请求过程异常e:NoSuchMethodError: The method 'findAncestorStateOfType' was called on null.
|
|
|
//Navigator.pushNamed(context, '/tabs'); //返回 tabs 页面,红屏报错
|
|
|
getMyUserinfo().then((value) {
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '$username 用户(ID: $user_id)人脸注册成功!',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
});
|
|
|
Navigator.pop(context); //返回 tabs 页面,成功返回
|
|
|
} else {
|
|
|
faceReg = 0; //设置人脸注册成功标志。1 成功,0 失败,-1 处理中
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '$username 用户(ID: $user_id)人脸注册失败。可能原因:${_mapGetData['msg']}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
//人脸注册,username 用户名,filePath 人脸图片路径,上级 context
|
|
|
Future faceRegFun(
|
|
|
{@required String username, @required String filePath, @required BuildContext context}) async {
|
|
|
//必须先以用户名查找到 user_id,再进行人脸注册
|
|
|
username = username.trim();
|
|
|
faceRegUserID = -1; //人脸注册时所需用户ID,-1 非法
|
|
|
//获取用户分页列表数据
|
|
|
var api = ServicePath.getUserListUrl;
|
|
|
print(api);
|
|
|
int _totalUser = 0; //第一页时保存数据库中用户总数
|
|
|
int _counter = 0; //已读取的用户数计数器
|
|
|
|
|
|
int _page = 0;
|
|
|
String random = RandomBit(6);
|
|
|
Map map = {
|
|
|
'random': random,
|
|
|
'sign': GenerateMd5(APPkey + random),
|
|
|
'page': _page,
|
|
|
'perpage': 20,
|
|
|
};
|
|
|
|
|
|
print('开始处理登录请求...');
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
try {
|
|
|
while (true) {
|
|
|
map['page']++;
|
|
|
|
|
|
response = await dio.post(api, data: map);
|
|
|
print('response = ${response.toString()}');
|
|
|
if (response.statusCode == 200) {
|
|
|
Map _mapUserListInfoRet = await getMapFromJson(response.data);
|
|
|
//print('_mapUserListInfoRet = $_mapUserListInfoRet');
|
|
|
if (1 == map['page']) {
|
|
|
//第一页时保存数据库中用户总数
|
|
|
_totalUser = _mapUserListInfoRet['data']['total'];
|
|
|
}
|
|
|
|
|
|
List _listUserInfo = _mapUserListInfoRet['data']['items'];
|
|
|
print('_listUserInfo = $_listUserInfo');
|
|
|
//I/flutter (11748): _listUserInfo = null
|
|
|
faceRegUserID = findUserID(_listUserInfo, username);
|
|
|
//查找 faceRegUserID 成功,开始进行人脸注册
|
|
|
if (faceRegUserID > 0) {
|
|
|
print('查找 faceRegUserID = $faceRegUserID 成功,开始进行人脸注册');
|
|
|
faceReg_uploadImage(
|
|
|
filePath: filePath, username: username, user_id: faceRegUserID, context: context);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
_counter += _listUserInfo.length; //已读取的用户数计数器
|
|
|
//已读取的用户数计数器,超过或等于数据库中用户总数时,则终止循环
|
|
|
if (_counter >= _totalUser) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
print('第 ${map['page']} 次网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e = ${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// List _listUserInfo = [
|
|
|
// {
|
|
|
// "id": 144,
|
|
|
// "username": "dudakui",
|
|
|
// "truename": "杜大奎",
|
|
|
// "depname": "监控室",
|
|
|
// "posname": "管理员",
|
|
|
// "sex": "男",
|
|
|
// "face": null
|
|
|
// },
|
|
|
// {
|
|
|
// "id": 143,
|
|
|
// "username": "pengguoping",
|
|
|
// "truename": "彭国平",
|
|
|
// "depname": "局领导",
|
|
|
// "posname": "领导",
|
|
|
// "sex": "女",
|
|
|
// "face": null
|
|
|
// },
|
|
|
// ];
|
|
|
|
|
|
findUserID(List _listUserInfo, String username) {
|
|
|
for (var user in _listUserInfo) {
|
|
|
if (username == user["username"].trim()) {
|
|
|
return user["id"];
|
|
|
}
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
Future getMyUserinfo() async {
|
|
|
print('开始处理网络请求...');
|
|
|
var api = ServicePath.getUserInfoUrl;
|
|
|
print(api);
|
|
|
//I/flutter (30518): http://125.64.218.67:9904/?s=App.User_User.Profile
|
|
|
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
String random = RandomBit(6);
|
|
|
try {
|
|
|
response = await dio.post(api, data: {
|
|
|
"user_id": g_userInfo.mapUserInfo['user_id'],
|
|
|
"token": g_userInfo.mapUserInfo['token'],
|
|
|
'random': random,
|
|
|
'sign': GenerateMd5(APPkey + random),
|
|
|
});
|
|
|
print('response = ${response.toString()}');
|
|
|
//I/flutter ( 5242): {"ret":200,"data":{"is_login":true,"user_id":3,"token":"32EE57A0109A3D1D6590CFD3DEBA71820F77AB654093C1DE750347C88D1A41CF"},"msg":""}
|
|
|
if (response.statusCode == 200) {
|
|
|
mapUserInfoRet = await getMapFromJson(response.data);
|
|
|
mapUserInfo = mapUserInfoRet['data']['profile'];
|
|
|
g_userInfo.username = mapUserInfo['username']; //用于刷脸登录获取用户名
|
|
|
print('mapUserInfo = $mapUserInfo');
|
|
|
print('g_userInfo.username = ${g_userInfo.username}');
|
|
|
|
|
|
print('网络请求过程正常完成');
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('登录过程异常...');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//App.User_User.Facelogin 人脸识别登录接口
|
|
|
//返回结果
|
|
|
// 返回字段 类型 说明
|
|
|
// is_login 布尔型 是否登录成功
|
|
|
// user_id 整型 用户ID
|
|
|
// token 字符串 登录成功后的token,会话token
|
|
|
//人脸登录,filePath 人脸图片路径,上级 context
|
|
|
Future faceLoginFun({@required String filePath, @required BuildContext context}) async {
|
|
|
print('开始处理网络请求...');
|
|
|
|
|
|
//1、将图片转换为 Base64 格式的字符串
|
|
|
image2Base64(filePath).then((imageBase64) async {
|
|
|
//2、准备 dio 的 api
|
|
|
//static const String uploadFaceloginUrl = ServiceUrl + '?s=App.User_User.Facelogin'; //人脸识别登录接口
|
|
|
var api = ServicePath.uploadFaceloginUrl;
|
|
|
print(api);
|
|
|
//I/flutter (30518): http://125.64.218.67:9904/?s=App.User_User.Facelogin
|
|
|
|
|
|
//3、准备 dio 参数 map
|
|
|
String random = RandomBit(6); //flutter (dart)生成N位随机数
|
|
|
Map map = {
|
|
|
'sign': GenerateMd5(APPkey + random),
|
|
|
'random': random,
|
|
|
'face': imageBase64,
|
|
|
};
|
|
|
print('map = ${map}');
|
|
|
|
|
|
//4、准备 dio 相关变量
|
|
|
faceLogin = -1; //复位人脸识别登录成功标志。1 成功,0 失败,-1 处理中
|
|
|
Map _mapGetData = {};
|
|
|
Response response;
|
|
|
Dio dio = Dio();
|
|
|
|
|
|
//5、开始调用 dio
|
|
|
try {
|
|
|
print('response = ${response}');
|
|
|
//I/flutter (16661): response = null
|
|
|
response = await dio.post(api, data: map);
|
|
|
print('response = ${response}');
|
|
|
//I/flutter (14273): response = {"ret":200,"data":{"is_login":true,"user_id":135,"token":"4C5B3F93FEACAEF4B6CAA7296F22CC67825D7E48B867614383D19E3F23DFE510"},"msg":""}
|
|
|
//I/flutter ( 9884): response = {"ret":200,"data":{"code":1,"msg":"未检测到人脸信息","count":0,"data":[]},"msg":""}
|
|
|
|
|
|
if (response.statusCode == 200) {
|
|
|
Map _mapDataRet = await getMapFromJson(response.data);
|
|
|
_mapGetData = _mapDataRet['data'];
|
|
|
print('上传图片 网络请求过程正常完成');
|
|
|
print('_mapGetData = ${_mapGetData}');
|
|
|
|
|
|
//设置人脸验证结果标志
|
|
|
// I/flutter (14273): _mapGetData = {is_login: true, user_id: 135, token: 4C5B3F93FEACAEF4B6CAA7296F22CC67825D7E48B867614383D19E3F23DFE510}
|
|
|
// I/flutter ( 9884): _mapGetData = {code: 1, msg: 未检测到人脸信息, count: 0, data: []}
|
|
|
if (_mapGetData.containsKey('is_login') && _mapGetData['is_login']) {
|
|
|
print('人脸认证成功!');
|
|
|
faceLogin = 1; //设置人脸验证成功标志。1 成功,0 失败,-1 处理中
|
|
|
//保存人脸认证成功的用户信息
|
|
|
g_userInfo.setUserInfoFaceLogin(_mapGetData);
|
|
|
//获取其他用户信息
|
|
|
getMyUserinfo().then((value) {
|
|
|
//获取用户所属分组和相应权限
|
|
|
getUserGroupAll().then((value) {
|
|
|
Navigator.pushNamed(context, '/tabs', arguments: g_iIndex);
|
|
|
print('欢迎 ${g_userInfo.username} 用户,人脸验证成功!');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '欢迎 ${g_userInfo.username} 用户,人脸验证成功!',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.TOP,
|
|
|
);
|
|
|
});
|
|
|
});
|
|
|
} else {
|
|
|
faceLogin = 0; //设置人脸验证成功标志。1 成功,0 失败,-1 处理中
|
|
|
print('人脸验证失败。');
|
|
|
Navigator.pushNamed(context, '/');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: '人脸验证失败。',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.BOTTOM,
|
|
|
);
|
|
|
}
|
|
|
} else {
|
|
|
throw Exception('后端接口出现异常,请检测代码和服务器情况.........');
|
|
|
}
|
|
|
} catch (e) {
|
|
|
print('网络请求过程异常e:${e}');
|
|
|
Fluttertoast.showToast(
|
|
|
msg: 'ERROR:======>${e}',
|
|
|
toastLength: Toast.LENGTH_SHORT,
|
|
|
gravity: ToastGravity.CENTER,
|
|
|
);
|
|
|
}
|
|
|
});
|
|
|
}
|