Commit 12ab131c3a08fe717737e4b9eee1b5b5decbfd44

Authored by wdn127929
1 parent 8d1542c5

列表接口

import 'package:json_annotation/json_annotation.dart';
part 'statics_model.g.dart';
@JsonSerializable()
class StaticsModel extends Object {
bool select;
String numstr;
String name;
@JsonKey(name: 'ret')
int ret;
@JsonKey(name: 'data')
List<StaticsSunModel> data;
@JsonKey(name: 'msg')
String msg;
StaticsModel(
this.ret,
this.data,
this.msg,
);
factory StaticsModel.fromJson(Map<String, dynamic> srcJson) =>
_$StaticsModelFromJson(srcJson);
Map<String, dynamic> toJson() => _$StaticsModelToJson(this);
}
@JsonSerializable()
class StaticsSunModel extends Object {
@JsonKey(name: 'rname')
String rname;
@JsonKey(name: 'phone')
String phone;
String count;
@JsonKey(name: 'xiaofei')
String xiaofei;
@JsonKey(name: 'renjun')
String renjun;
@JsonKey(name: 'cu')
String cu;
bool select; //是否选中
String numstr; //序号
String sortstr; //排序
StaticsSunModel(
this.rname,
this.phone,
this.xiaofei,
this.renjun,
this.cu,
);
factory StaticsSunModel.fromJson(Map<String, dynamic> srcJson) =>
_$StaticsSunModelFromJson(srcJson);
Map<String, dynamic> toJson() => _$StaticsSunModelToJson(this);
}
... ...
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'statics_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
StaticsModel _$StaticsModelFromJson(Map<String, dynamic> json) {
return StaticsModel(
json['ret'] as int,
(json['data'] as List)
?.map((e) => e == null
? null
: StaticsSunModel.fromJson(e as Map<String, dynamic>))
?.toList(),
json['msg'] as String,
);
}
Map<String, dynamic> _$StaticsModelToJson(StaticsModel instance) =>
<String, dynamic>{
'ret': instance.ret,
'data': instance.data,
'msg': instance.msg,
};
StaticsSunModel _$StaticsSunModelFromJson(Map<String, dynamic> json) {
return StaticsSunModel(
json['rname'] as String,
json['phone'] as String,
json['xiaofei'] as String,
json['renjun'] as String,
json['cu'] as String,
);
}
Map<String, dynamic> _$StaticsSunModelToJson(StaticsSunModel instance) =>
<String, dynamic>{
'rname': instance.rname,
'phone': instance.phone,
'xiaofei': instance.xiaofei,
'renjun': instance.renjun,
'cu': instance.cu,
};
... ...
... ... @@ -120,4 +120,7 @@ class HttpUrl {
static const String del_table_photo =
"?service=App.Tables.DelTablePhoto"; // Apps删除桌位关联图片
static const String get_statistics_list =
"?service=App.Reserve.ReserveStatistics"; //App订单统计
}
... ...
... ... @@ -3,7 +3,6 @@ import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/app.dart';
import 'package:one_key/models/get_seller_info_model.dart';
import 'package:one_key/models/user.dart';
import 'package:one_key/provider/book_set_time_model.dart';
import 'package:one_key/provider/create_store_model.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/res/colors.dart';
... ...
... ... @@ -25,6 +25,7 @@ import 'package:one_key/widgets/app_bar.dart';
import 'package:one_key/widgets/common_button.dart';
import 'package:one_key/widgets/dialog.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/input_done_view.dart';
import 'package:one_key/widgets/loading.dart';
import 'package:one_key/widgets/need_item.dart';
import 'package:one_key/widgets/page_exception.dart';
... ... @@ -1592,33 +1593,3 @@ class _TitleAndTextfieldState extends State<TitleAndTextfield> {
]));
}
}
class InputDoneView extends StatelessWidget {
final VoidCallback callback;
const InputDoneView({Key key, this.callback}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
color: Colors.white,
child: Align(
alignment: Alignment.topRight,
child: Padding(
padding: const EdgeInsets.only(top: 4.0, bottom: 4.0),
child: CupertinoButton(
padding: EdgeInsets.only(right: 24.0, top: 8.0, bottom: 8.0),
onPressed: () {
FocusScope.of(context).requestFocus(new FocusNode());
callback();
},
child: Text("完成",
style: TextStyle(
color: MyColours.color_199095,
fontWeight: FontWeight.bold)),
),
),
),
);
}
}
... ...
import 'package:common_utils/common_utils.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/statics_model.dart';
import 'package:one_key/provider/statistics_provider.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/route/navigator_util.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/input_done_view.dart';
import 'package:one_key/widgets/page_exception.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
... ... @@ -29,24 +32,127 @@ class StatisticsPage extends StatefulWidget {
class _StatisticsPageState extends State<StatisticsPage> {
StatisticsProvider _provider;
List<String> selectList;
FocusNode numberFocusNode = new FocusNode();
OverlayEntry overlayEntry;
@override
void initState() {
super.initState();
selectList = ['预订次数多到少', '消费总金额高到低', '人均高到低'];
numberFocusNode.addListener(() {
if (numberFocusNode.hasFocus) {
showOverlay(context);
} else {
// _updateMoney();
removeOverlay();
}
});
WidgetsBinding.instance.addPostFrameCallback((_) {
for (int i = 0; i < 50; i++) {
StaticsModel tableHeaderModel1 = StaticsModel();
tableHeaderModel1.select = false;
tableHeaderModel1.numstr = '$i';
tableHeaderModel1.name = '某某';
tableHeaderModel1.phone = '1879097890';
tableHeaderModel1.count = '${i}次';
_provider.dataStatics.add(tableHeaderModel1);
// for (int i = 0; i < 50; i++) {
// StaticsModel tableHeaderModel1 = StaticsModel();
// tableHeaderModel1.select = false;
// tableHeaderModel1.numstr = '$i';
// tableHeaderModel1.name = '某某';
// tableHeaderModel1.phone = '1879097890';
// tableHeaderModel1.count = '${i}次';
// _provider.dataStatics.add(tableHeaderModel1);
// }
// _provider.notifyListeners();
});
}
showOverlay(BuildContext context) {
if (overlayEntry != null) return;
OverlayState overlayState = Overlay.of(context);
overlayEntry = OverlayEntry(builder: (context) {
return Positioned(
bottom: MediaQuery.of(context).viewInsets.bottom,
right: 0.0,
left: 0.0,
child: InputDoneView(
callback: () {
// _updateMoney();
_getStatisticsList();
},
));
});
overlayState.insert(overlayEntry);
}
removeOverlay() {
if (overlayEntry != null) {
overlayEntry.remove();
overlayEntry = null;
}
}
///获取统计列表
_getStatisticsList() async {
if (_provider.datetimeS == null ||
_provider.datetimeE == null ||
_provider.sortstr == '排序') {
return;
}
if (_provider.datetimeE.compareTo(_provider.datetimeS) < 0) {
Utils.showToast('结束日期不能早于开始日期');
return;
}
if (_provider.controller.text.trim().length == 0) {
Utils.showToast('请输入数字');
return;
}
UserModel userModel = Provider.of<UserModel>(context, listen: false);
Map<String, String> params = {
"sid": userModel.user.sellerid,
"uid": userModel.user.openid,
"stime":
'${_provider.datetimeS.millisecondsSinceEpoch.toString().substring(0, 10)}',
"etime":
'${_provider.datetimeE.millisecondsSinceEpoch.toString().substring(0, 10)}',
"size": _provider.controller.text,
"od": '${_provider.currentIndex + 1}',
};
await _provider.getStatisticsList(context, params);
if (_provider.dataStatics.length > 0) {
switch (_provider.currentIndex) {
case 0: //显示预订次数
_provider.tableHeaderModel.sortstr = '预订次数';
for (int i = 0; i < _provider.dataStatics.length; i++) {
_provider.dataStatics[i].select = false;
_provider.dataStatics[i].sortstr =
_provider.dataStatics[i].cu == null
? ""
: '${_provider.dataStatics[i].cu}次';
_provider.dataStatics[i].numstr = '${i + 1}';
}
break;
case 1: //显示消费总金额
_provider.tableHeaderModel.sortstr = '消费总金额';
for (int i = 0; i < _provider.dataStatics.length; i++) {
_provider.dataStatics[i].select = false;
_provider.dataStatics[i].sortstr =
_provider.dataStatics[i].xiaofei == null
? ""
: '${_provider.dataStatics[i].xiaofei}元';
_provider.dataStatics[i].numstr = '${i + 1}';
}
break;
case 2: //显示人均
_provider.tableHeaderModel.sortstr = '人均';
for (int i = 0; i < _provider.dataStatics.length; i++) {
_provider.dataStatics[i].select = false;
_provider.dataStatics[i].sortstr =
_provider.dataStatics[i].renjun == null
? ''
: '${_provider.dataStatics[i].renjun}元';
_provider.dataStatics[i].numstr = '${i + 1}';
}
break;
}
_provider.notifyListeners();
});
}
}
_buttonChoose(String title, ClickCallback callback,
... ... @@ -134,11 +240,86 @@ class _StatisticsPageState extends State<StatisticsPage> {
}));
}
///显示50 size
Widget _sizeWidget() {
return Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.symmetric(horizontal: ScreenUtil().setWidth(40)),
color: MyColours.color_f5f5f5,
// width: double.infinity,
height: ScreenUtil().setWidth(80),
child: Row(
children: [
Text(
'显示前 ',
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
),
Container(
alignment: Alignment.center,
margin:
EdgeInsets.symmetric(vertical: ScreenUtil().setWidth(20)),
// alignment: Alignment.centerLeft,
// height: ScreenUtil().setWidth(80),
constraints:
BoxConstraints(maxWidth: ScreenUtil().setWidth(50 * 2)),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
width: ScreenUtil().setWidth(2),
color: MyColours.color_199095))),
child: IntrinsicWidth(
child: TextField(
controller: _provider.controller,
maxLines: 1,
// inputFormatters: [
// LengthLimitingTextInputFormatter(9),
// WhitelistingTextInputFormatter.digitsOnly
// ],
// inputFormatters: [
// NumLengthInputFormatter(
// decimalLength: 2, integerLength: 6),
// ],
focusNode: numberFocusNode,
//光标颜色
cursorColor: MyColours.color_199095,
//输入文本的样式
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_199095),
textAlign: TextAlign.center,
textInputAction: TextInputAction.done,
decoration: InputDecoration(
isDense: true,
hintText: "输入",
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(26),
),
contentPadding: EdgeInsets.zero, //ios 17
border: InputBorder.none,
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context).requestFocus(FocusNode()); //隐藏键盘
_getStatisticsList();
},
keyboardType: TextInputType.numberWithOptions(decimal: true),
)))
],
));
}
@override
Widget build(BuildContext context) {
_provider = Provider.of<StatisticsProvider>(context, listen: true);
return Scaffold(
backgroundColor: MyColours.color_ffffff,
resizeToAvoidBottomInset: false,
appBar: SystemAppBar(
'统计列表',
rightImgName: '清空',
... ... @@ -157,12 +338,16 @@ class _StatisticsPageState extends State<StatisticsPage> {
return Column(
children: [
VEmptyView(100),
model.pageState == PageState.Statics
? SizedBox()
: _sizeWidget(),
Expanded(
child: ExceptionPage(
pageState: model.pageState,
callback: () {
// offset = 0;
// getMessage(showLoading: true);
_getStatisticsList();
},
emptyMsg: model.pageState == PageState.Statics
? "请选择日期和排序条件"
... ... @@ -177,79 +362,7 @@ class _StatisticsPageState extends State<StatisticsPage> {
crossAxisAlignment: CrossAxisAlignment.end,
children: [
VEmptyView(100),
Container(
alignment: Alignment.centerLeft,
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40)),
color: MyColours.color_f5f5f5,
// width: double.infinity,
height: ScreenUtil().setWidth(80),
child: Row(
children: [
Text(
'显示前 ',
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
),
Container(
alignment: Alignment.center,
margin: EdgeInsets.symmetric(
vertical: ScreenUtil().setWidth(20)),
// alignment: Alignment.centerLeft,
// height: ScreenUtil().setWidth(80),
constraints: BoxConstraints(
maxWidth: ScreenUtil().setWidth(50 * 2)),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
width: ScreenUtil().setWidth(2),
color: MyColours.color_199095))),
child: IntrinsicWidth(
child: TextField(
controller: _provider.controller,
maxLines: 1,
// inputFormatters: [
// LengthLimitingTextInputFormatter(9),
// WhitelistingTextInputFormatter.digitsOnly
// ],
// inputFormatters: [
// NumLengthInputFormatter(
// decimalLength: 2, integerLength: 6),
// ],
// focusNode: numberFocusNode,
//光标颜色
cursorColor: MyColours.color_199095,
//输入文本的样式
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_199095),
textAlign: TextAlign.center,
textInputAction: TextInputAction.done,
decoration: InputDecoration(
isDense: true,
hintText: "输入",
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(26),
),
contentPadding: EdgeInsets.zero, //ios 17
border: InputBorder.none,
),
onChanged: (value) {},
onEditingComplete: () {
FocusScope.of(context)
.requestFocus(FocusNode()); //隐藏键盘
// _updateMoney();
},
keyboardType: TextInputType.numberWithOptions(
decimal: true),
)))
],
)),
_sizeWidget(),
//表头
_tableItem(model.tableHeaderModel, 3,
TableItemType.TableItemTypeHeader, (index) {
... ... @@ -369,6 +482,7 @@ class _StatisticsPageState extends State<StatisticsPage> {
_provider.datetimeS,
format: DateFormats.y_mo_d);
});
_getStatisticsList();
}
});
}, timeType: TimeType.TimeTypeStart),
... ... @@ -395,6 +509,7 @@ class _StatisticsPageState extends State<StatisticsPage> {
_provider.datetimeE,
format: DateFormats.y_mo_d);
});
_getStatisticsList();
}
});
}, timeType: TimeType.TimeTypeEnd),
... ... @@ -405,7 +520,6 @@ class _StatisticsPageState extends State<StatisticsPage> {
_buttonChoose(_provider.sortstr, (value) {
setState(() {
_provider.showWidget = !_provider.showWidget;
print('1');
});
}),
VEmptyView(10),
... ... @@ -424,6 +538,7 @@ class _StatisticsPageState extends State<StatisticsPage> {
_provider.currentIndex = index;
_provider.sortstr = selectList[index];
});
_getStatisticsList();
}),
))),
])
... ... @@ -436,8 +551,8 @@ class _StatisticsPageState extends State<StatisticsPage> {
}
///表头
Widget _tableItem(
StaticsModel model, int index, TableItemType type, IntCallback callback) {
Widget _tableItem(StaticsSunModel model, int index, TableItemType type,
IntCallback callback) {
return InkWell(
onTap: () {
callback(index);
... ... @@ -487,7 +602,7 @@ class _StatisticsPageState extends State<StatisticsPage> {
width: ScreenUtil().setWidth(2),
color: MyColours.color_f5f5f5))),
child: Text(
model.name,
model.rname,
style: TextStyle(
fontSize: ScreenUtil().setSp(28),
color: MyColours.color_333333),
... ... @@ -510,7 +625,7 @@ class _StatisticsPageState extends State<StatisticsPage> {
Expanded(
child: Center(
child: Text(
model.count,
model.sortstr,
style: TextStyle(
fontSize: ScreenUtil().setSp(28),
color: MyColours.color_333333),
... ...
import 'package:flutter/material.dart';
import 'package:one_key/constant/constant.dart';
import 'package:one_key/constant/error.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/statics_model.dart';
import 'package:one_key/net/base_resp.dart';
import 'package:one_key/net/dio_util.dart';
import 'package:one_key/net/http_url.dart';
import 'package:one_key/utils/utils.dart';
class StatisticsProvider with ChangeNotifier {
PageState pageState = PageState.Success;
List<StaticsModel> dataStatics = [];
StaticsModel tableHeaderModel;
PageState pageState = PageState.Statics;
List<StaticsSunModel> dataStatics = [];
StaticsSunModel tableHeaderModel;
String dateS = "开始日期"; //开始时间
String dateE = "结束日期"; //结束时间
DateTime datetimeS; //开始时间
... ... @@ -18,12 +24,16 @@ class StatisticsProvider with ChangeNotifier {
String sortstr = '排序';
StatisticsProvider() {
tableHeaderModel = StaticsModel();
tableHeaderModel = StaticsSunModel(
'顾客姓名',
'电话',
'',
'',
'',
);
tableHeaderModel.select = false;
tableHeaderModel.numstr = '序号';
tableHeaderModel.name = '顾客姓名';
tableHeaderModel.phone = '电话';
tableHeaderModel.count = '预订次数';
tableHeaderModel.sortstr = '预订次数';
datetimeS = DateTime.now();
datetimeE = datetimeS.add(Duration(days: 1));
dateNow = datetimeS;
... ... @@ -33,11 +43,11 @@ class StatisticsProvider with ChangeNotifier {
///全选按钮方法
allSel() {
if (tableHeaderModel.select) {
for (StaticsModel item in dataStatics) {
for (StaticsSunModel item in dataStatics) {
item.select = false;
}
} else {
for (StaticsModel item in dataStatics) {
for (StaticsSunModel item in dataStatics) {
item.select = true;
}
}
... ... @@ -77,4 +87,52 @@ class StatisticsProvider with ChangeNotifier {
}
return false;
}
//获取统计列表
Future getStatisticsList(BuildContext context, Map<String, String> params,
{needLoading = true}) async {
if (needLoading) {
pageState = PageState.Loading;
notifyListeners();
}
pageState = PageState.Loading;
notifyListeners();
BaseResp<List> baseResp = await DioUtil()
.request<List>(context, Method.get, HttpUrl.get_statistics_list,
data: params, showLoading: false)
.catchError((error) {
print(error.toString());
if (error is MyError) {
switch (error.type) {
case 1:
pageState = PageState.ConnectivityError;
break;
case 2:
pageState = PageState.ConnectivityTimeOut;
break;
default:
pageState = PageState.ConnectivityError;
break;
}
}
notifyListeners();
});
if (baseResp == null) return null;
if (baseResp.code == Constant.status_success) {
dataStatics = StaticsModel.fromJson(baseResp.responseData).data;
if (dataStatics.isEmpty) {
pageState = PageState.Empty;
notifyListeners();
} else {
pageState = PageState.Success;
}
} else {
pageState = PageState.ConnectivityError;
notifyListeners();
Utils.showToast(baseResp.msg ?? "");
}
return dataStatics;
}
}
... ...
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:one_key/res/colors.dart';
class InputDoneView extends StatelessWidget {
final VoidCallback callback;
const InputDoneView({Key key, this.callback}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
color: Colors.white,
child: Align(
alignment: Alignment.topRight,
child: Padding(
padding: const EdgeInsets.only(top: 4.0, bottom: 4.0),
child: CupertinoButton(
padding: EdgeInsets.only(right: 24.0, top: 8.0, bottom: 8.0),
onPressed: () {
FocusScope.of(context).requestFocus(new FocusNode());
callback();
},
child: Text("完成",
style: TextStyle(
color: MyColours.color_199095,
fontWeight: FontWeight.bold)),
),
),
),
);
}
}
... ...