Commit ead58bea70541ec879e91e2d95c6cae36a1bb94a

Authored by wdn127929
1 parent 07e3db1c

在线买单处理页面 OK

495 Bytes

547 Bytes

... ... @@ -23,6 +23,7 @@ import 'app.dart';
import 'net/dio_util.dart';
import 'net/http_url.dart';
import 'pages/login/login_page.dart';
import 'provider/order_food_provider.dart';
import 'provider/user_model.dart';
import 'route/navigate_service.dart';
import 'route/routes.dart';
... ... @@ -53,6 +54,9 @@ Future<void> main() async {
ChangeNotifierProvider<OnlineCheckEditProvider>(
create: (_) => OnlineCheckEditProvider(),
),
ChangeNotifierProvider<OrderFoodProvider>(
create: (_) => OrderFoodProvider(),
),
],
child: MyApp(),
));
... ...
import 'package:json_annotation/json_annotation.dart';
part 'order_info_model.g.dart';
@JsonSerializable()
class OrderInfoModel extends Object {
@JsonKey(name: 'ret')
int ret;
@JsonKey(name: 'data')
OrderInfoSunModel data;
@JsonKey(name: 'msg')
String msg;
OrderInfoModel(
this.ret,
this.data,
this.msg,
);
factory OrderInfoModel.fromJson(Map<String, dynamic> srcJson) =>
_$OrderInfoModelFromJson(srcJson);
Map<String, dynamic> toJson() => _$OrderInfoModelToJson(this);
}
@JsonSerializable()
class OrderInfoSunModel extends Object {
@JsonKey(name: 'id')
String id;
@JsonKey(name: 'order_no')
String orderNo;
@JsonKey(name: 'out_trade_no')
String outTradeNo;
@JsonKey(name: 'openid')
String openid;
@JsonKey(name: 'sid')
String sid;
@JsonKey(name: 'rid')
String rid;
@JsonKey(name: 'sellername')
String sellername;
@JsonKey(name: 'tablename')
String tablename;
@JsonKey(name: 'wechat_no')
String wechatNo;
@JsonKey(name: 'bill_list')
List<dynamic> billList;
@JsonKey(name: 'price')
String price;
@JsonKey(name: 'should_price')
String shouldPrice;
@JsonKey(name: 'subsidy_type')
String subsidyType;
@JsonKey(name: 'subsidy_price')
String subsidyPrice;
@JsonKey(name: 'is_wine')
String isWine;
@JsonKey(name: 'is_pack')
String isPack;
@JsonKey(name: 'status')
String status;
@JsonKey(name: 'pay_time')
String payTime;
@JsonKey(name: 'confirm_time')
String confirmTime;
@JsonKey(name: 'remarks')
String remarks;
@JsonKey(name: 'attach')
String attach;
@JsonKey(name: 'currency')
String currency;
@JsonKey(name: 'detail')
String detail;
@JsonKey(name: 'description')
String description;
@JsonKey(name: 'profit_sharing')
String profitSharing;
@JsonKey(name: 'create_time')
String createTime;
@JsonKey(name: 'discount')
List<dynamic> discount;
//订单备注
String get orderRemark {
String orderRemark = '';
if (isWine == '1' || isPack == '1') {
orderRemark = '*顾客';
if (isWine == '1') {
orderRemark += '有酒水要退';
}
if (isPack == '1') {
if (isWine == '1') {
orderRemark += ',菜品需要打包';
} else {
orderRemark += '菜品需要打包';
}
}
}
return orderRemark;
}
OrderInfoSunModel(
this.id,
this.orderNo,
this.outTradeNo,
this.openid,
this.sid,
this.rid,
this.sellername,
this.tablename,
this.wechatNo,
this.billList,
this.price,
this.shouldPrice,
this.subsidyType,
this.subsidyPrice,
this.isWine,
this.isPack,
this.status,
this.payTime,
this.confirmTime,
this.remarks,
this.attach,
this.currency,
this.detail,
this.description,
this.profitSharing,
this.createTime,
this.discount,
);
factory OrderInfoSunModel.fromJson(Map<String, dynamic> srcJson) =>
_$OrderInfoSunModelFromJson(srcJson);
Map<String, dynamic> toJson() => _$OrderInfoSunModelToJson(this);
}
... ...
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'order_info_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
OrderInfoModel _$OrderInfoModelFromJson(Map<String, dynamic> json) {
return OrderInfoModel(
json['ret'] as int,
json['data'] == null
? null
: OrderInfoSunModel.fromJson(json['data'] as Map<String, dynamic>),
json['msg'] as String);
}
Map<String, dynamic> _$OrderInfoModelToJson(OrderInfoModel instance) =>
<String, dynamic>{
'ret': instance.ret,
'data': instance.data,
'msg': instance.msg
};
OrderInfoSunModel _$OrderInfoSunModelFromJson(Map<String, dynamic> json) {
return OrderInfoSunModel(
json['id'] as String,
json['order_no'] as String,
json['out_trade_no'] as String,
json['openid'] as String,
json['sid'] as String,
json['rid'] as String,
json['sellername'] as String,
json['tablename'] as String,
json['wechat_no'] as String,
json['bill_list'] as List,
json['price'] as String,
json['should_price'] as String,
json['subsidy_type'] as String,
json['subsidy_price'] as String,
json['is_wine'] as String,
json['is_pack'] as String,
json['status'] as String,
json['pay_time'] as String,
json['confirm_time'] as String,
json['remarks'] as String,
json['attach'] as String,
json['currency'] as String,
json['detail'] as String,
json['description'] as String,
json['profit_sharing'] as String,
json['create_time'] as String,
json['discount'] as List);
}
Map<String, dynamic> _$OrderInfoSunModelToJson(OrderInfoSunModel instance) =>
<String, dynamic>{
'id': instance.id,
'order_no': instance.orderNo,
'out_trade_no': instance.outTradeNo,
'openid': instance.openid,
'sid': instance.sid,
'rid': instance.rid,
'sellername': instance.sellername,
'tablename': instance.tablename,
'wechat_no': instance.wechatNo,
'bill_list': instance.billList,
'price': instance.price,
'should_price': instance.shouldPrice,
'subsidy_type': instance.subsidyType,
'subsidy_price': instance.subsidyPrice,
'is_wine': instance.isWine,
'is_pack': instance.isPack,
'status': instance.status,
'pay_time': instance.payTime,
'confirm_time': instance.confirmTime,
'remarks': instance.remarks,
'attach': instance.attach,
'currency': instance.currency,
'detail': instance.detail,
'description': instance.description,
'profit_sharing': instance.profitSharing,
'create_time': instance.createTime,
'discount': instance.discount
};
... ...
import 'package:json_annotation/json_annotation.dart';
import 'package:one_key/utils/utils.dart';
part 'reserve_detail_model.g.dart';
... ... @@ -126,6 +127,89 @@ class ReserveDetailSunModel extends Object {
@JsonKey(name: 'order')
Order order;
///年月日 餐段
String get ddateStr {
String ymd = "";
if (ddate != null) {
DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(
int.parse(ddate.toString()) * 1000);
ymd = dateTime.year.toString() +
"/" +
Utils.addZeroNumber(dateTime.month) +
"/" +
Utils.addZeroNumber(dateTime.day);
} else {
ymd = ddate.substring(0, 10);
}
switch (ddateSolt) {
case "1": //早餐
return ymd + " 早餐";
case "2": //午餐
return ymd + " 午餐";
case "3": //晚餐
return ymd + " 晚餐";
default:
return ymd;
}
}
// 申请时间
String get cdateStr {
DateTime dateTime =
DateTime.fromMillisecondsSinceEpoch(int.parse(cdate.toString()) * 1000);
return dateTime.year.toString() +
"/" +
Utils.addZeroNumber(dateTime.month) +
"/" +
Utils.addZeroNumber(dateTime.day) +
" " +
Utils.addZeroNumber(dateTime.hour) +
":" +
Utils.addZeroNumber(dateTime.minute);
}
List<Map> get tableNameList {
String tableInfo = '';
List<Map> tableNameList = []; //全部类型
//1散座 2包间 3卡座
List<String> tableNameSunList1 = []; //单个类型包含的所有桌子名称
List<String> tableNameSunList2 = []; //单个类型包含的所有桌子名称
List<String> tableNameSunList3 = []; //单个类型包含的所有桌子名称
for (int i = 0; i < tables.length; i++) {
switch (tables[i].tid) {
case '1':
tableNameSunList1.add(tables[i].name);
break;
case '2':
tableNameSunList2.add(tables[i].name);
break;
case '3':
tableNameSunList3.add(tables[i].name);
break;
}
}
tableNameList = [
{'散座': tableNameSunList1},
{'包间': tableNameSunList2},
{'卡座': tableNameSunList3},
]; //全部类型
return tableNameList;
}
///顾客姓名
String get rnameStr {
// 预订人姓名:1:男 2:女
switch (sex) {
case "1":
return rname + '先生';
case "2":
return rname + '女士';
default:
return rname;
}
}
ReserveDetailSunModel(
this.id,
this.orderid,
... ...
import 'dart:io';
import 'package:flutter/material.dart';
class UploadImgModel {
File file; //本地图片地址
String qiniuUrl; //七牛云地址
double process; //图片上传进度
}
... ...
... ... @@ -65,5 +65,9 @@ class HttpUrl {
"?service=App.Reserve.Detail"; //订座详情页面
static const String get_qiniu_info =
"?service=App.Qiniu.GetUploadToken"; //获取七牛上传token信息
static const String get_order_info =
"?service=App.Customer.GetOrderInfo"; //获取账单详情
static const String update_order_info =
"?service=App.Customer.UpdateOrderInfo"; // 商家确认账单
}
... ...
... ... @@ -4,8 +4,8 @@ import 'dart:async';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/models/upload_img_model.dart';
import 'package:one_key/pages/online_check/photo_view_wiget.dart';
import 'package:one_key/pages/online_check/progress.dart';
... ... @@ -14,7 +14,6 @@ import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:path_provider/path_provider.dart';
import 'package:photo/photo.dart';
import 'package:provider/provider.dart';
... ... @@ -45,8 +44,7 @@ class ImgPickerWidget extends StatefulWidget {
class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
final picker = ImagePicker();
OnlineCheckEditProvider _onlineCheckEditProvider;
// 控制器,可以用于取消任务、获取上述的状态,进度等信息
PutController putController;
// 用户输入的文件名
String key;
// 用户输入的 partSize
... ... @@ -55,15 +53,15 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
String token;
/// storage 实例
Storage storage;
// 当前的进度
double progressValue = 0.01;
final Storage storage = Storage();
// 控制器,可以用于取消任务、获取上述的状态,进度等信息
// PutController putController = PutController();
// 当前的任务状态
StorageStatus statusValue;
@override
void initState() {
storage = Storage();
// storage = Storage();
// putController = PutController();
super.initState();
}
... ... @@ -75,17 +73,19 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
///#相机拍照,单图选择
Future _getFromPictureOrCamera(imageSource) async {
final pickedFile = await picker.getImage(source: imageSource);
setState(() {
if (pickedFile != null) {
_onlineCheckEditProvider.imageListFile.add(File(pickedFile.path));
_onlineCheckEditProvider.statusMap[pickedFile.path] = false;
UploadImgModel imgModel = UploadImgModel();
imgModel.file = File(pickedFile.path);
imgModel.process = 0.01;
_onlineCheckEditProvider.imageList.add(imgModel);
} else {
print('No image selected.');
}
});
if (pickedFile != null) {
startUpload(File(pickedFile.path));
startUpload(File(pickedFile.path),
_onlineCheckEditProvider.imageList.length - 1, true);
}
}
... ... @@ -109,8 +109,7 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
// the check box disable color
itemRadio: 0.88,
// the content item radio
maxSelected:
MAX_IMAGE_NUMBER - _onlineCheckEditProvider.imageListFile.length,
maxSelected: MAX_IMAGE_NUMBER - _onlineCheckEditProvider.imageList.length,
// max picker image count
// provider: I18nProvider.english,
provider: I18nProvider.chinese,
... ... @@ -138,57 +137,45 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
print("No pick item.");
return;
} else {
List<String> r = [];
for (var e in imgList) {
var file = await e.file;
r.add(file.absolute.path);
for (int i = 0; i < imgList.length; i++) {
var file = await imgList[i].file;
setState(() {
_onlineCheckEditProvider.imageListFile.add(File(file.absolute.path));
_onlineCheckEditProvider.statusMap[file.absolute.path] = false;
UploadImgModel imgModel = UploadImgModel();
imgModel.file = File(file.absolute.path);
imgModel.process = 0.01;
_onlineCheckEditProvider.imageList.add(imgModel);
});
startUpload(File(file.absolute.path));
startUpload(File(file.absolute.path),
_onlineCheckEditProvider.imageList.length - 1, false);
}
}
}
///七牛云sdk
void onStatus(StorageStatus status) {
print('状态变化: 当前任务状态:${status.toString()}');
setState(() => statusValue = status);
}
///任务进度变化:进度
void onProgress(double percent) {
setState(() => progressValue = percent);
print('任务进度变化:进度:${percent.toStringAsFixed(4)}');
}
///实际发送变化:进度
void onSendProgress(double percent) {
setState(() => progressValue = percent);
print('实际发送变化:进度:${percent.toStringAsFixed(4)}');
}
///上传到七牛云
void startUpload(File selectedFile) async {
print('创建 PutController');
putController = PutController();
// _onlineCheckEditProvider.statusMapProgress[selectedFile.path] =
// putController;
print('添加实际发送进度订阅');
addDisposer(putController.addSendProgressListener(onSendProgress));
void startUpload(File selectedFile, int index, bool needInit) async {
final PutController putController = PutController();
print(index);
print('添加任务进度订阅');
addDisposer(putController.addProgressListener(onProgress));
print('添加状态订阅');
addDisposer(putController.addStatusListener(onStatus));
// 添加状态监听
putController.addStatusListener((StorageStatus status) {
print('状态变化: 当前任务状态:${status.toString()}');
});
// 添加整体进度监听
putController.addProgressListener((percent) {
print('${index}任务进度变化:进度:${percent.toStringAsFixed(4)}');
_onlineCheckEditProvider.imageList[index].process = percent;
_onlineCheckEditProvider.notifyListeners();
});
// 添加实际发送进度订阅
putController.addSendProgressListener((percent) {
// _onlineCheckEditProvider.imageList[index].process = percent;
// setState(() {});
print('${index}实际发送变化:进度:${percent.toStringAsFixed(4)}');
});
if (token == null || token == '') {
await _onlineCheckEditProvider.getQiniuInfo(context, {});
}
var usedToken = _onlineCheckEditProvider.qiniuInfoSunModel.token;
if (usedToken == null || usedToken == '') {
print('token 不能为空');
return;
... ... @@ -204,14 +191,16 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
),
)
..then((PutResponse response) {
print('上传已完成: 原始响应数据: ${jsonEncode(response.rawData)}');
print('${index}上传已完成: 原始响应数据: ${jsonEncode(response.rawData)}');
print('------------------------');
String imgUrl = _onlineCheckEditProvider.qiniuInfoSunModel.domain +
'/' +
response.rawData['key'];
_onlineCheckEditProvider.imageListUrl.add(imgUrl);
_onlineCheckEditProvider.imageList[index].process = 1;
_onlineCheckEditProvider.imageList[index].qiniuUrl = imgUrl;
// 取消当前任务
putController.cancel();
// _image
_onlineCheckEditProvider.statusMap[selectedFile.path] = true;
_onlineCheckEditProvider.notifyListeners();
})
..catchError((dynamic error) {
... ... @@ -292,8 +281,8 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
),
InkWell(
onTap: () {
// pickAsset(PickType.onlyImage);
_getFromPictureOrCamera(ImageSource.gallery);
pickAsset(PickType.onlyImage);
// _getFromPictureOrCamera(ImageSource.gallery);
Navigator.pop(context);
},
child: Container(
... ... @@ -405,12 +394,11 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
Padding(
padding: EdgeInsets.all(ScreenUtil().setWidth(40)),
child: _getGridImg(
_onlineCheckEditProvider.imageListFile.length < MAX_IMAGE_NUMBER
? _onlineCheckEditProvider.imageListFile.length + 1
: _onlineCheckEditProvider.imageListFile.length,
_onlineCheckEditProvider.imageList.length < MAX_IMAGE_NUMBER
? _onlineCheckEditProvider.imageList.length + 1
: _onlineCheckEditProvider.imageList.length,
context,
_onlineCheckEditProvider.imageListFile.length ==
MAX_IMAGE_NUMBER
_onlineCheckEditProvider.imageList.length == MAX_IMAGE_NUMBER
? true
: false),
)
... ... @@ -477,13 +465,24 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
)),
);
}
return _provider.imageListFile.length < 1
return _provider.imageList.length < 1
? Text('')
: InkWell(
onTap: () {
///没有上传完成的不可以点击
_showPhotoView(
context, index, _provider.imageListUrl[index]);
_onlineCheckEditProvider.imageQiniuUrlList = [];
if (_onlineCheckEditProvider.imageList[index].qiniuUrl !=
null) {
for (int i = 0;
i < _onlineCheckEditProvider.imageList.length;
i++) {
_onlineCheckEditProvider.imageQiniuUrlList.add(
_onlineCheckEditProvider.imageList[i].qiniuUrl);
}
///没有上传完成的不可以点击
_showPhotoView(
context, index, _provider.imageQiniuUrlList);
}
},
child: Stack(
children: [
... ... @@ -491,14 +490,13 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
alignment: Alignment.topRight,
children: [
Image.file(
_provider.imageListFile[index],
_provider.imageList[index].file,
fit: BoxFit.cover,
width: ScreenUtil().setWidth(100 * 2),
height: ScreenUtil().setWidth(100 * 2),
),
Offstage(
offstage: !_provider
.statusMap[_provider.imageListFile[index].path],
offstage: _provider.imageList[index].process < 1,
child: GestureDetector(
child: Image.asset(
Utils.getImgPath("delete"),
... ... @@ -508,10 +506,12 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
onTap: () {
//点击删除按钮
setState(() {
_provider.imageListFile.removeWhere(
_provider.imageList.removeWhere((element) =>
element == _provider.imageList[index]);
_provider.imageQiniuUrlList.removeWhere(
(element) =>
element ==
_provider.imageListFile[index]);
_provider.imageQiniuUrlList[index]);
});
},
),
... ... @@ -519,9 +519,8 @@ class _ImgPickerWidgetState extends DisposableState<ImgPickerWidget> {
],
),
Offstage(
offstage: _provider
.statusMap[_provider.imageListFile[index].path],
child: Progress(progressValue),
offstage: _provider.imageList[index].process == 1,
child: Progress(_provider.imageList[index].process),
)
],
));
... ...
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/pages/online_check/img_picker_widget.dart';
import 'package:one_key/provider/online_check_edit_provider.dart';
import 'package:one_key/provider/order_food_provider.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/navigator_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/common_button.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/my_item.dart';
import 'package:one_key/widgets/system_app_bar.dart';
... ... @@ -14,7 +20,9 @@ import 'package:provider/provider.dart';
class OnlineCheckEditPage extends StatefulWidget {
final bool fromNotify;
OnlineCheckEditPage({Key key, this.fromNotify = false}) : super(key: key);
final String rid;
OnlineCheckEditPage({Key key, this.fromNotify = false, this.rid})
: super(key: key);
@override
_OnlineCheckEditPageState createState() => _OnlineCheckEditPageState();
... ... @@ -25,12 +33,17 @@ class _OnlineCheckEditPageState extends State<OnlineCheckEditPage> {
TextEditingController _editingController = TextEditingController();
FocusNode _focusNode = FocusNode();
OnlineCheckEditProvider _onlineCheckEditProvider;
OrderFoodProvider _orderFoodProvider;
int btnState = -1;
bool arrowStatus = true; // true合住 false展开
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
_getQiniuInfo();
_getTableInfoData();
_getOrderInfo();
});
_focusNode.addListener(() {
if (_focusNode.hasFocus) {
... ... @@ -38,15 +51,56 @@ class _OnlineCheckEditPageState extends State<OnlineCheckEditPage> {
_editingController.text = '¥';
} else {
//失去焦点
_editingController.text = '';
// _editingController.text = '';
}
});
}
@override
void dispose() {
_focusNode.unfocus();
_onlineCheckEditProvider.imageList = [];
_onlineCheckEditProvider.imageQiniuUrlList = [];
super.dispose();
// _onlineCheckEditProvider
}
///接口获取桌位信息
_getTableInfoData() async {
UserModel userModel = Provider.of<UserModel>(context, listen: false);
Map<String, String> params = {
"openid": userModel.user.openid,
"rid": widget.rid
};
//明天完成 桌位名称信息
await _orderFoodProvider.getTableInfoData(context, params);
}
_getOrderInfo() async {
UserModel userModel = Provider.of<UserModel>(context, listen: false);
Map<String, String> params = {"rid": widget.rid};
//remark信息获取
await _onlineCheckEditProvider.getOrderInfo(context, params);
}
///商家确认账单操作
_updateOrderInfo() async {
for (int i = 0; i < _onlineCheckEditProvider.imageList.length; i++) {
_onlineCheckEditProvider.imageQiniuUrlList
.add(_onlineCheckEditProvider.imageList[i].qiniuUrl);
}
UserModel userModel = Provider.of<UserModel>(context, listen: false);
Map<String, String> params = {
"price": _editingController.text,
"rid": widget.rid,
'bill_list': json.encode(_onlineCheckEditProvider.imageQiniuUrlList)
};
print(pragma);
//明天完成 桌位名称信息
bool result =
await _onlineCheckEditProvider.updateOrderInfo(context, params);
if (result) {
//跳转至在线买单处理完的详情页面
}
}
///获取七牛云token
... ... @@ -82,31 +136,135 @@ class _OnlineCheckEditPageState extends State<OnlineCheckEditPage> {
///桌位信息、应收金额
Widget _getTabAndMoneyInfoWidget() {
String showTable = '';
bool showArrow = false;
//1散座 2包间 3卡座
List<String> tableNameSunList1 = []; //单个类型包含的所有桌子名称
List<String> tableNameSunList2 = []; //单个类型包含的所有桌子名称
List<String> tableNameSunList3 = []; //单个类型包含的所有桌子名称
if (_orderFoodProvider.reserveDetailSunModel != null) {
tableNameSunList1 =
_orderFoodProvider.reserveDetailSunModel.tableNameList[0]['散座'];
tableNameSunList2 =
_orderFoodProvider.reserveDetailSunModel.tableNameList[1]['包间'];
tableNameSunList3 =
_orderFoodProvider.reserveDetailSunModel.tableNameList[2]['卡座'];
if (tableNameSunList2.length > 0) {
showTable = '【包间】${tableNameSunList2[0]}';
showArrow = true;
} else if (tableNameSunList3.length > 0) {
showTable = '【卡座】${tableNameSunList3[0]}';
showArrow = true;
} else if (tableNameSunList1.length > 0) {
showTable = '【散座】${tableNameSunList1[0]}';
showArrow = true;
}
}
return Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(ScreenUtil().setWidth(10))),
child: Column(
children: [
Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(36)),
child: Row(
InkWell(
onTap: () {
if (showArrow) {
//有arrow
arrowStatus = !arrowStatus;
_orderFoodProvider.notifyListeners();
}
},
child: Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(36)),
child: Row(
children: [
Text(
'桌位信息',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_707070),
),
Spacer(),
Text(
_orderFoodProvider.reserveDetailSunModel != null
? showTable
: '',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_353535),
),
Offstage(
offstage: !showArrow,
child: Row(
children: [
HEmptyView(20),
Image.asset(
arrowStatus
? Utils.getImgPath('down')
: Utils.getImgPath('up'),
width: ScreenUtil().setWidth(24),
height: ScreenUtil().setWidth(12))
],
),
)
],
),
),
),
Offstage(
offstage: arrowStatus,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'桌位信息',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_707070),
),
Spacer(),
Text(
'[包间]秦皇岛',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_353535),
)
tableNameSunList2.length > 0
? Padding(
padding: EdgeInsets.fromLTRB(
ScreenUtil().setWidth(60),
ScreenUtil().setWidth(0),
ScreenUtil().setWidth(60),
ScreenUtil().setWidth(10)),
child: Text(
'【包间】${Utils.listToString(tableNameSunList2)}',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_353535),
),
)
: Container(),
tableNameSunList3.length > 0
? Padding(
padding: EdgeInsets.fromLTRB(
ScreenUtil().setWidth(60),
ScreenUtil().setWidth(0),
ScreenUtil().setWidth(60),
ScreenUtil().setWidth(10)),
child: Text(
'【卡座】${Utils.listToString(tableNameSunList3)}',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_353535),
),
)
: Container(),
tableNameSunList1.length > 0
? Padding(
padding: EdgeInsets.fromLTRB(
ScreenUtil().setWidth(60),
ScreenUtil().setWidth(0),
ScreenUtil().setWidth(60),
ScreenUtil().setWidth(10)),
child: Text(
'【散座】${Utils.listToString(tableNameSunList1)}',
style: TextStyle(
fontSize: ScreenUtil().setSp(32),
color: MyColours.color_353535),
),
)
: Container(),
VEmptyView(36),
],
),
),
... ... @@ -159,13 +317,21 @@ class _OnlineCheckEditPageState extends State<OnlineCheckEditPage> {
print(value);
// currentRemark = value;
// print();
setState(() {
if (value != '¥' && value.trim().length > 0) {
btnState = 1;
} else {
btnState = -1;
}
});
},
onEditingComplete: () {
print('fff');
_editingController.text = '';
_focusNode.unfocus();
// _editingController.text = '';
// _needNode.unfocus();
},
// keyboardType: TextInputType.number,
keyboardType: TextInputType.number,
))
],
),
... ... @@ -175,6 +341,8 @@ class _OnlineCheckEditPageState extends State<OnlineCheckEditPage> {
);
}
///
///顾客信息
Widget _customInfoItemWidget(String title, String subTitle) {
return Row(
... ... @@ -236,13 +404,29 @@ class _OnlineCheckEditPageState extends State<OnlineCheckEditPage> {
ScreenUtil().setWidth(36)),
child: Column(
children: [
_customInfoItemWidget('买单顾客', 'ffff'),
_customInfoItemWidget(
'买单顾客',
_orderFoodProvider.reserveDetailSunModel != null
? _orderFoodProvider.reserveDetailSunModel.rnameStr
: ''),
VEmptyView(24),
_customInfoItemWidget('顾客电话', 'ffff'),
_customInfoItemWidget(
'顾客电话',
_orderFoodProvider.reserveDetailSunModel != null
? _orderFoodProvider.reserveDetailSunModel.phone
: ''),
VEmptyView(24),
_customInfoItemWidget('到店时间', 'ffff'),
_customInfoItemWidget(
'到店时间',
_orderFoodProvider.reserveDetailSunModel != null
? _orderFoodProvider.reserveDetailSunModel.ddateStr
: ''),
VEmptyView(24),
_customInfoItemWidget('申请时间', 'ffff')
_customInfoItemWidget(
'申请时间',
_orderFoodProvider.reserveDetailSunModel != null
? _orderFoodProvider.reserveDetailSunModel.cdateStr
: '')
],
),
)
... ... @@ -256,6 +440,7 @@ class _OnlineCheckEditPageState extends State<OnlineCheckEditPage> {
Widget build(BuildContext context) {
_onlineCheckEditProvider =
Provider.of<OnlineCheckEditProvider>(context, listen: true);
_orderFoodProvider = Provider.of<OrderFoodProvider>(context, listen: true);
return Scaffold(
backgroundColor: MyColours.color_f5f5f5,
appBar: SystemAppBar(
... ... @@ -268,38 +453,70 @@ class _OnlineCheckEditPageState extends State<OnlineCheckEditPage> {
}
},
),
body: SingleChildScrollView(
controller: _scrollController,
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(20),
vertical: ScreenUtil().setWidth(40)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
//图标
_getLogoWidget(),
VEmptyView(40),
_getTabAndMoneyInfoWidget(),
VEmptyView(10),
// 备注信息
Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(20)),
child: Text(
'*贾森基德款式经典福克斯肌肤快速反击',
style: TextStyle(
fontSize: ScreenUtil().setSp(28),
color: MyColours.color_FD5656),
),
),
VEmptyView(20),
ImgPickerWidget(scrollController: _scrollController),
VEmptyView(20),
_customInfoWidget()
],
)),
),
body: Padding(
padding: EdgeInsets.symmetric(horizontal: ScreenUtil().setWidth(20)),
child: Column(
children: [
Expanded(
child: SingleChildScrollView(
controller: _scrollController,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
VEmptyView(40),
//图标
_getLogoWidget(),
VEmptyView(40),
_getTabAndMoneyInfoWidget(),
VEmptyView(10),
// 备注信息
Offstage(
offstage:
_onlineCheckEditProvider.orderInfoSunModel !=
null
? _onlineCheckEditProvider
.orderInfoSunModel.orderRemark ==
''
: true,
child: Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(20)),
child: Text(
_onlineCheckEditProvider.orderInfoSunModel !=
null
? _onlineCheckEditProvider
.orderInfoSunModel.orderRemark
: '',
style: TextStyle(
fontSize: ScreenUtil().setSp(28),
color: MyColours.color_FD5656),
),
),
),
VEmptyView(20),
ImgPickerWidget(scrollController: _scrollController),
VEmptyView(20),
_customInfoWidget()
],
))),
Padding(
padding: EdgeInsets.fromLTRB(ScreenUtil().setWidth(16), 0,
ScreenUtil().setWidth(16), ScreenUtil().setWidth(40)),
child: CommonButton(
width: double.infinity,
height: 84,
fontSize: 34,
content: '发送给顾客',
state: btnState,
onPress: () async {
DialogUtil.confirmDialog(
context, _editingController.text, 426, onTap: () {
_updateOrderInfo();
});
},
))
],
)),
);
}
}
... ...
import 'package:flutter/material.dart';
import 'package:one_key/constant/constant.dart';
import 'package:one_key/models/order_info_model.dart';
import 'package:one_key/models/qiniu_info_model.dart';
import 'package:one_key/models/upload_img_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 OnlineCheckEditProvider extends ChangeNotifier {
List imageListFile = []; //本地图片显示
List imageListUrl = []; //七牛云地址
Map statusMap = {}; //图片上传状态 <bool> true显示图片 ******* false显示进度
List<UploadImgModel> imageList = []; //图片信息列表
List<String> imageQiniuUrlList = []; //七牛云地址列表
QiniuInfoSunModel qiniuInfoSunModel;
// Map statusMapProgress = {}; //图片上传状态 <bool> true显示图片 ******* false显示进度
OrderInfoSunModel orderInfoSunModel;
/// 获取七牛上传token信息
Future<QiniuInfoSunModel> getQiniuInfo(
... ... @@ -35,4 +36,49 @@ class OnlineCheckEditProvider extends ChangeNotifier {
}
}
}
///获取账单详情
getOrderInfo(BuildContext context, Map<String, String> params,
{isShowLoading = true}) async {
BaseResp<Map<String, dynamic>> baseResp = await DioUtil()
.request<Map<String, dynamic>>(
context, Method.get, HttpUrl.get_order_info,
data: params, showLoading: false)
.catchError((error) {});
if (baseResp.code == Constant.status_success) {
if (baseResp.data.isEmpty) {
} else {
//解析解析
orderInfoSunModel = OrderInfoModel.fromJson(baseResp.responseData).data;
}
notifyListeners();
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
}
}
///商家确认账单
updateOrderInfo(BuildContext context, Map<String, String> params,
{isShowLoading = true}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(context, Method.get, HttpUrl.update_order_info,
data: params, showLoading: false)
.catchError((error) {});
if (baseResp.code == Constant.status_success) {
//解析解析
if (baseResp.data == 1) {
print('成功');
return true;
} else {
Utils.showToast(baseResp.msg ?? "");
}
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
}
return false;
}
}
... ...
... ... @@ -179,9 +179,9 @@ var handleHasOrderFoodHandler = new Handler(
///提前买单编辑页面
var handleOnlineCheckEditHandler = new Handler(
handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
// String rid = params["rid"].first;
String rid = params["rid"].first;
bool fromNotify = FluroConvertUtils.string2bool(params["fromNotify"].first);
return ChangeNotifierProvider<OrderFoodProvider>(
create: (_) => OrderFoodProvider(),
child: OnlineCheckEditPage(fromNotify: fromNotify));
child: OnlineCheckEditPage(fromNotify: fromNotify,rid:rid));
});
... ...
... ... @@ -269,7 +269,6 @@ class DialogUtil {
});
messageModel.showMessageDialog = false;
}
//解析返回显示的日期
static String _parseDateDay(DateTime dateTime) {
... ... @@ -798,6 +797,82 @@ class DialogUtil {
});
}
static Future confirmDialog(BuildContext context, String title, double height,
{GestureTapCallback onTap, double fontSize = 36}) async {
String showTitle = title;
if (showTitle.startsWith('¥')) {
showTitle = title.substring(1, title.length);
}
final action = await showDialog(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
return Center(
child: Container(
height: ScreenUtil().setWidth(height),
width: ScreenUtil().setWidth(280 * 2),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(ScreenUtil().setWidth(10))),
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(
Radius.circular(ScreenUtil().setWidth(10)))), //设置圆角
child: Column(
children: [
VEmptyView(20),
InkWell(
onTap: () {
Navigator.of(context).pop();
},
child: Container(
height: ScreenUtil().setWidth(48),
color: Colors.white,
padding:
EdgeInsets.only(right: ScreenUtil().setWidth(36)),
alignment: Alignment.centerRight,
child: Image.asset(Utils.getImgPath('close1'),
width: ScreenUtil().setWidth(20),
height: ScreenUtil().setWidth(20)),
),
),
VEmptyView(36),
Text('应收金额',
style: TextStyle(
color: MyColours.color_707070,
fontSize: ScreenUtil().setSp(30),
)),
VEmptyView(16),
Container(
height: ScreenUtil().setWidth(46 * 2),
child:
Text('¥ ${double.parse(showTitle).toStringAsFixed(2)}',
style: TextStyle(
color: MyColours.color_353535,
fontSize: ScreenUtil().setSp(66),
)),
),
VEmptyView(34),
Padding(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(68 * 2)),
child: CommonButton(
width: double.infinity,
height: 84,
fontSize: 34,
content: '确定发送',
state: 1,
onPress: onTap,
)),
VEmptyView(50),
],
),
),
),
);
},
);
}
static Future openAlertDialog(BuildContext context, String title,
String content, String btnTitle, double height,
{GestureTapCallback onTap, double fontSize = 36}) async {
... ... @@ -807,8 +882,9 @@ class DialogUtil {
builder: (BuildContext context) {
return Center(
child: Container(
padding:
EdgeInsets.symmetric(horizontal: ScreenUtil().setWidth(72)),
height: ScreenUtil().setWidth(height),
width: ScreenUtil().setWidth(280 * 2),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(ScreenUtil().setWidth(30))),
child: Card(
... ...
... ... @@ -132,7 +132,8 @@ class NavigatorUtil {
/// 提前买单编辑页面
static void goOnlineCheckEditPage(BuildContext context,
{String rid, fromNotify = false, replace = false}) {
_navigateTo(context, "${Routes.online_check_edit}?fromNotify=${fromNotify}",
_navigateTo(context,
"${Routes.online_check_edit}?fromNotify=${fromNotify}&rid=${rid}",
replace: replace);
}
}
... ...
... ... @@ -212,6 +212,21 @@ class Utils {
return false;
}
static String listToString(List<String> list) {
if (list == null) {
return null;
}
String result;
list.forEach((string) {
if (result == null) {
result = string;
} else {
result = '$result,$string';
}
});
return result.toString();
}
/// 获取日期 今天 明天 后天等等
static int getDdate(List dateList) {
String ymyStr = ""; //年月日
... ...
... ... @@ -27,7 +27,7 @@ class CommonButton extends StatelessWidget {
switch (state) {
case -1:
boxDecoration = BoxDecoration(
color: MyColours.color_d8d8d8,
color: MyColours.color_74BBBE,
borderRadius: BorderRadius.circular(ScreenUtil().setWidth(10)),
);
fontColor = MyColours.color_ffffff;
... ...