更新预约单数
This commit is contained in:
parent
1a88faae34
commit
411e85fb3d
|
|
@ -15,8 +15,6 @@ class MyEventChannel {
|
|||
static void onGetCallLogResult() {
|
||||
EventChannel channel = EventChannel(getChannelName(kCallLogCallback));
|
||||
channel.receiveBroadcastStream().listen((Object? o) {
|
||||
yjPrint("onGetCallLogResult");
|
||||
yjPrint(o);
|
||||
GetCallLogEvent event = GetCallLogEvent();
|
||||
if (o is String) {
|
||||
event.isSuccess = true;
|
||||
|
|
@ -24,6 +22,9 @@ class MyEventChannel {
|
|||
List<CallLogModel> callLogs = [];
|
||||
for (var item in list) {
|
||||
callLogs.add(CallLogModel.fromJson(item));
|
||||
if (callLogs.length >= 100) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
event.callLogs = callLogs.reversed.toList();
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:cashier_reserve/common/push/push.dart';
|
||||
import 'package:cashier_reserve/data_model/login/login_result.dart';
|
||||
import 'package:cashier_reserve/login/login_view.dart';
|
||||
import 'package:cashier_reserve/model/reserve_model.dart';
|
||||
|
||||
import '../base/ui.dart';
|
||||
import '../channel/channel_event.dart';
|
||||
|
|
@ -11,6 +12,8 @@ class AppManager {
|
|||
static BuildContext? globalContext;
|
||||
static bool _isAlertLogin = false;
|
||||
|
||||
static String _smsContent = "";
|
||||
|
||||
static Future<void> initThirdPackage() async {
|
||||
MyEventChannel.startListener();
|
||||
|
||||
|
|
@ -65,4 +68,12 @@ class AppManager {
|
|||
disposeLoginWidget();
|
||||
Navigator.of(globalContext!).pop();
|
||||
}
|
||||
|
||||
static Future<String> loadReserveSms() async {
|
||||
if (_smsContent.isNotEmpty) {
|
||||
return _smsContent;
|
||||
}
|
||||
_smsContent = await ReserveModel.getReserveSms();
|
||||
return _smsContent;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,58 @@
|
|||
import 'dart:convert';
|
||||
|
||||
/// consumeOrders : 0
|
||||
/// cancelOrders : 0
|
||||
/// phoneNumber : "10086"
|
||||
|
||||
ReserveLogModel reserveLogModelFromJson(String str) =>
|
||||
ReserveLogModel.fromJson(json.decode(str));
|
||||
|
||||
String reserveLogModelToJson(ReserveLogModel data) =>
|
||||
json.encode(data.toJson());
|
||||
|
||||
class ReserveLogModel {
|
||||
ReserveLogModel({
|
||||
num? consumeOrders,
|
||||
num? cancelOrders,
|
||||
String? phoneNumber,
|
||||
}) {
|
||||
_consumeOrders = consumeOrders;
|
||||
_cancelOrders = cancelOrders;
|
||||
_phoneNumber = phoneNumber;
|
||||
}
|
||||
|
||||
ReserveLogModel.fromJson(dynamic json) {
|
||||
_consumeOrders = json['consumeOrders'];
|
||||
_cancelOrders = json['cancelOrders'];
|
||||
_phoneNumber = json['phoneNumber'];
|
||||
}
|
||||
|
||||
num? _consumeOrders;
|
||||
num? _cancelOrders;
|
||||
String? _phoneNumber;
|
||||
|
||||
ReserveLogModel copyWith({
|
||||
num? consumeOrders,
|
||||
num? cancelOrders,
|
||||
String? phoneNumber,
|
||||
}) =>
|
||||
ReserveLogModel(
|
||||
consumeOrders: consumeOrders ?? _consumeOrders,
|
||||
cancelOrders: cancelOrders ?? _cancelOrders,
|
||||
phoneNumber: phoneNumber ?? _phoneNumber,
|
||||
);
|
||||
|
||||
num? get consumeOrders => _consumeOrders;
|
||||
|
||||
num? get cancelOrders => _cancelOrders;
|
||||
|
||||
String? get phoneNumber => _phoneNumber;
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final map = <String, dynamic>{};
|
||||
map['consumeOrders'] = _consumeOrders;
|
||||
map['cancelOrders'] = _cancelOrders;
|
||||
map['phoneNumber'] = _phoneNumber;
|
||||
return map;
|
||||
}
|
||||
}
|
||||
|
|
@ -45,17 +45,17 @@ class HomeViewModel extends BaseUIModel {
|
|||
});
|
||||
}
|
||||
|
||||
_checkLogin() {
|
||||
bool flag = AppManager.isLogin();
|
||||
yjPrint("is login $flag");
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_pageController?.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
_checkLogin() {
|
||||
bool flag = AppManager.isLogin();
|
||||
yjPrint("is login $flag");
|
||||
}
|
||||
|
||||
void setIndex(int index) {
|
||||
if (_currentIndex == index) {
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'package:cashier_reserve/common/base/ui.dart';
|
||||
import 'package:cashier_reserve/common/channel/call_log_model.dart';
|
||||
import 'package:cashier_reserve/common/print/print.dart';
|
||||
import 'package:cashier_reserve/data_model/reserve/reserve_log_model.dart';
|
||||
import 'package:cashier_reserve/home/reserve_view_model.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
|
||||
|
|
@ -121,6 +122,7 @@ class ReserveLeftContentView extends StatelessWidget {
|
|||
|
||||
/// _buildCallRecordItem 通话记录item
|
||||
Widget _buildCallRecordItem(BuildContext context, CallLogModel? model) {
|
||||
ReserveLogModel? reserveLogModel = provider.getReserveLogModel(model?.number ?? "");
|
||||
return Container(
|
||||
padding: const EdgeInsets.fromLTRB(15, 15, 15, 5),
|
||||
child: Column(
|
||||
|
|
@ -164,18 +166,18 @@ class ReserveLeftContentView extends StatelessWidget {
|
|||
const SizedBox(
|
||||
width: 15,
|
||||
),
|
||||
const Text(
|
||||
"已消费0单",
|
||||
Text(
|
||||
"已消费${reserveLogModel?.consumeOrders ?? '0'}单",
|
||||
style:
|
||||
TextStyle(color: Color(0xff333333), fontSize: 14),
|
||||
const TextStyle(color: Color(0xff333333), fontSize: 14),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 15,
|
||||
),
|
||||
const Text(
|
||||
"已撤0单",
|
||||
Text(
|
||||
"已撤${reserveLogModel?.cancelOrders ?? '0'}单",
|
||||
style:
|
||||
TextStyle(color: Color(0xff333333), fontSize: 14),
|
||||
const TextStyle(color: Color(0xff333333), fontSize: 14),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
@ -336,7 +338,9 @@ class ReserveLeftContentView extends StatelessWidget {
|
|||
_buildBookingActionBtn(context, "预约", () {
|
||||
provider.commitReserveInfo();
|
||||
}),
|
||||
_buildBookingActionBtn(context, "预约并短信", () {}),
|
||||
_buildBookingActionBtn(context, "预约并短信", () {
|
||||
provider.commitReserveInfo(sendSms: true);
|
||||
}),
|
||||
_buildBookingActionBtn(context, "发路线", () {}),
|
||||
_buildBookingActionBtn(context, "取消", () {
|
||||
provider.hideReserveInfoView();
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ class ReserveView extends BaseUI with TickerProviderStateMixin {
|
|||
width: 15,
|
||||
),
|
||||
InkWell(
|
||||
onTap: () {},
|
||||
onTap: () { },
|
||||
child: SizedBox(
|
||||
width: 40,
|
||||
height: 40,
|
||||
|
|
|
|||
|
|
@ -2,13 +2,17 @@ import 'package:cashier_reserve/common/base/ui.dart';
|
|||
import 'package:cashier_reserve/common/base/ui_model.dart';
|
||||
import 'package:cashier_reserve/common/channel/call_log_model.dart';
|
||||
import 'package:cashier_reserve/common/channel/channel_manager.dart';
|
||||
import 'package:cashier_reserve/common/manager/app_manager.dart';
|
||||
import 'package:cashier_reserve/common/manager/event_manager.dart';
|
||||
import 'package:cashier_reserve/common/print/print.dart';
|
||||
import 'package:cashier_reserve/common/utils/utils.dart';
|
||||
import 'package:cashier_reserve/data_model/reserve/reserve_log_model.dart';
|
||||
import 'package:cashier_reserve/data_model/reserve/table_area_model.dart';
|
||||
import 'package:cashier_reserve/data_model/reserve/table_model.dart';
|
||||
import 'package:cashier_reserve/model/reserve_model.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
class ReserveViewModel extends BaseUIModel {
|
||||
class ReserveViewModel extends BaseUIModel {
|
||||
Map<int, String> weekdayMap = {
|
||||
1: "星期一",
|
||||
2: "星期二",
|
||||
|
|
@ -38,39 +42,54 @@ class ReserveViewModel extends BaseUIModel {
|
|||
String bookingType = "lunch";
|
||||
|
||||
List<TableAreaModel?>? _tableAreaList;
|
||||
|
||||
List<TableAreaModel?>? get tableAreaList => _tableAreaList;
|
||||
Map<num, TableAreaModel?> _tableAreaMap = {};
|
||||
|
||||
List<TableModel?>? _tableList;
|
||||
|
||||
List<TableModel?>? get tableList => _tableList;
|
||||
Map<String, List<TableModel?>> tableMap = {};
|
||||
|
||||
List<CallLogModel?>? callLogs = [];
|
||||
|
||||
Map<String, ReserveLogModel?>? _reserveLogMap;
|
||||
|
||||
bool _isShowReserveInfoView = false;
|
||||
|
||||
/// bookingGender 预订人性别 1: 男 2: 女
|
||||
int bookingGender = 1;
|
||||
|
||||
/// bookingNumController 就餐人数
|
||||
TextEditingController bookingNumController = TextEditingController();
|
||||
|
||||
/// bookingPhoneController 联系电话
|
||||
TextEditingController bookingPhoneController = TextEditingController();
|
||||
|
||||
/// bookingNameController 预订人姓名
|
||||
TextEditingController bookingNameController = TextEditingController();
|
||||
|
||||
/// bookingTypeController 预订类型
|
||||
TextEditingController bookingTypeController = TextEditingController();
|
||||
|
||||
/// bookingTableNumController 预订台桌数量
|
||||
TextEditingController bookingTableNumController = TextEditingController();
|
||||
|
||||
/// bookingStandardController 预定餐标
|
||||
TextEditingController bookingStandardController = TextEditingController();
|
||||
|
||||
/// bookingRemarkController 备注
|
||||
TextEditingController bookingRemarkController = TextEditingController();
|
||||
|
||||
/// bookingSelectedTime 预订时间
|
||||
String bookingSelectedTime = "";
|
||||
|
||||
/// bookingFocus 重点关注
|
||||
bool bookingFocus = false;
|
||||
|
||||
/// bookingSms 短信通知
|
||||
bool bookingSms = false;
|
||||
|
||||
/// bookingStandardType 餐标类型
|
||||
String bookingStandardType = "table";
|
||||
|
||||
|
|
@ -86,8 +105,11 @@ class ReserveViewModel extends BaseUIModel {
|
|||
if (!event.isSuccess) {
|
||||
return;
|
||||
}
|
||||
|
||||
callLogs = event.callLogs;
|
||||
notifyListeners();
|
||||
|
||||
loadUserReserveLog();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -113,12 +135,23 @@ class ReserveViewModel extends BaseUIModel {
|
|||
loadCallLog();
|
||||
loadTableAreaList();
|
||||
loadAreaTableList(0);
|
||||
loadReserveSms();
|
||||
}
|
||||
|
||||
void loadCallLog() {
|
||||
ChannelManager.getCallLog("getCallLog");
|
||||
}
|
||||
|
||||
void loadUserReserveLog() async {
|
||||
List<String> phoneNos = [];
|
||||
for (var item in callLogs!) {
|
||||
phoneNos.add(item!.number ?? '');
|
||||
}
|
||||
_reserveLogMap = await ReserveModel.getUserReserveLog(phoneNos);
|
||||
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void loadTableAreaList() async {
|
||||
final r = await ReserveModel.getShopTableAreaList();
|
||||
|
||||
|
|
@ -137,7 +170,8 @@ class ReserveViewModel extends BaseUIModel {
|
|||
}
|
||||
|
||||
void loadAreaTableList(int areaId) async {
|
||||
final r = await ReserveModel.getAreaTableList(areaId, selectedDate, bookingType);
|
||||
final r =
|
||||
await ReserveModel.getAreaTableList(areaId, selectedDate, bookingType);
|
||||
|
||||
_tableList = r;
|
||||
|
||||
|
|
@ -156,7 +190,11 @@ class ReserveViewModel extends BaseUIModel {
|
|||
notifyListeners();
|
||||
}
|
||||
|
||||
void commitReserveInfo() async {
|
||||
loadReserveSms() async {
|
||||
AppManager.loadReserveSms();
|
||||
}
|
||||
|
||||
void commitReserveInfo({bool sendSms = false}) async {
|
||||
if (!_checkReserveInfo()) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -184,6 +222,31 @@ class ReserveViewModel extends BaseUIModel {
|
|||
Utils.toast("预定成功", context);
|
||||
hideReserveInfoView();
|
||||
loadAreaTableList(0);
|
||||
|
||||
if (sendSms) {
|
||||
String smsContent = await AppManager.loadReserveSms();
|
||||
if (smsContent.isNotEmpty) {
|
||||
yjPrint("send sms: $smsContent, phone: ${bookingPhoneController.text}");
|
||||
|
||||
goSendSms(phone: bookingPhoneController.text, message: smsContent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
goSendSms({required String phone, required String message}) async {
|
||||
final Uri smsUri = Uri(
|
||||
scheme: 'sms',
|
||||
path: phone,
|
||||
queryParameters: {
|
||||
'body': message,
|
||||
},
|
||||
);
|
||||
if (await canLaunchUrl(smsUri)) {
|
||||
await launchUrl(smsUri);
|
||||
} else {
|
||||
// 如果无法启动短信发送,可在此处添加相应的提示逻辑,比如打印错误信息等
|
||||
yjPrint('Could not launch SMS');
|
||||
}
|
||||
}
|
||||
|
||||
void setSelectedDateIndex(int index) {
|
||||
|
|
@ -198,11 +261,16 @@ class ReserveViewModel extends BaseUIModel {
|
|||
loadAreaTableList(0);
|
||||
}
|
||||
|
||||
void setAnimationController(AnimationController controller, Animation<double> sizeFactor) {
|
||||
void setAnimationController(
|
||||
AnimationController controller, Animation<double> sizeFactor) {
|
||||
_animationController = controller;
|
||||
_animationSizeFactor = sizeFactor;
|
||||
}
|
||||
|
||||
ReserveLogModel? getReserveLogModel(String phone) {
|
||||
return _reserveLogMap?[phone];
|
||||
}
|
||||
|
||||
showReserveInfoView() {
|
||||
_resetReserveData();
|
||||
_isShowReserveInfoView = true;
|
||||
|
|
@ -223,7 +291,8 @@ class ReserveViewModel extends BaseUIModel {
|
|||
}
|
||||
|
||||
updateBookingTime(int hour, int minute) {
|
||||
bookingSelectedTime = "${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}";
|
||||
bookingSelectedTime =
|
||||
"${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}";
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
|
|
@ -326,4 +395,4 @@ class ReserveViewModel extends BaseUIModel {
|
|||
DateTime offsetDay = now.add(Duration(days: offset));
|
||||
return weekdayMap[offsetDay.weekday] ?? "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:cashier_reserve/common/print/print.dart';
|
||||
import 'package:cashier_reserve/common/request/request_manager.dart';
|
||||
import 'package:cashier_reserve/data_model/reserve/reserve_log_model.dart';
|
||||
import 'package:cashier_reserve/data_model/reserve/table_area_model.dart';
|
||||
import 'package:cashier_reserve/data_model/reserve/table_model.dart';
|
||||
|
||||
|
|
@ -38,8 +39,30 @@ class ReserveModel {
|
|||
return list;
|
||||
}
|
||||
|
||||
/// commitReserveInfo 提交预定信息
|
||||
static Future<void> commitReserveInfo(Map<String, dynamic> params) async {
|
||||
final r = await RequestManager.post("/api/booking/shop-table", params);
|
||||
yjPrint(r);
|
||||
await RequestManager.post("/api/booking/shop-table", params);
|
||||
}
|
||||
|
||||
static Future<Map<String, ReserveLogModel?>> getUserReserveLog(List<String> phoneNos) async {
|
||||
final r = await RequestManager.post("/api/booking/shop-table/summary", {
|
||||
"phoneNos": phoneNos,
|
||||
});
|
||||
|
||||
Map<String, ReserveLogModel?> map = {};
|
||||
if (r == null) {
|
||||
return map;
|
||||
}
|
||||
|
||||
for (var item in r.entries) {
|
||||
map[item.key] = ReserveLogModel.fromJson(item.value);
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
|
||||
static Future<String> getReserveSms() async {
|
||||
final r = await RequestManager.get("/api/booking/shop-table/sms");
|
||||
return r.toString();
|
||||
}
|
||||
}
|
||||
64
pubspec.lock
64
pubspec.lock
|
|
@ -655,6 +655,70 @@ packages:
|
|||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.4.0"
|
||||
url_launcher:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: url_launcher
|
||||
sha256: "9d06212b1362abc2f0f0d78e6f09f726608c74e3b9462e8368bb03314aa8d603"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "6.3.1"
|
||||
url_launcher_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
sha256: "6fc2f56536ee873eeb867ad176ae15f304ccccc357848b351f6f0d8d4a40d193"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "6.3.14"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_ios
|
||||
sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "6.3.1"
|
||||
url_launcher_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_linux
|
||||
sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "3.2.1"
|
||||
url_launcher_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_macos
|
||||
sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "3.2.1"
|
||||
url_launcher_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_platform_interface
|
||||
sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
url_launcher_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_web
|
||||
sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.3.3"
|
||||
url_launcher_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_windows
|
||||
sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "3.1.3"
|
||||
uuid:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ dependencies:
|
|||
fluttertoast: ^8.2.8
|
||||
encrypt: ^5.0.3
|
||||
pointycastle: ^3.9.1
|
||||
url_launcher: ^6.3.1
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
|
|
|||
Loading…
Reference in New Issue