From 411e85fb3de7b60ec9b3f1500568ce249659efaa Mon Sep 17 00:00:00 2001 From: GYJ <1157756119@qq.com> Date: Wed, 27 Nov 2024 13:37:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A2=84=E7=BA=A6=E5=8D=95?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common/channel/channel_event.dart | 5 +- lib/common/manager/app_manager.dart | 11 +++ lib/data_model/reserve/reserve_log_model.dart | 58 +++++++++++++ lib/home/home_view_model.dart | 10 +-- lib/home/reserve_left_content_view.dart | 18 +++-- lib/home/reserve_view.dart | 2 +- lib/home/reserve_view_model.dart | 81 +++++++++++++++++-- lib/model/reserve_model.dart | 27 ++++++- pubspec.lock | 64 +++++++++++++++ pubspec.yaml | 1 + 10 files changed, 254 insertions(+), 23 deletions(-) create mode 100644 lib/data_model/reserve/reserve_log_model.dart diff --git a/lib/common/channel/channel_event.dart b/lib/common/channel/channel_event.dart index 710937e..78c7dfb 100644 --- a/lib/common/channel/channel_event.dart +++ b/lib/common/channel/channel_event.dart @@ -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 callLogs = []; for (var item in list) { callLogs.add(CallLogModel.fromJson(item)); + if (callLogs.length >= 100) { + break; + } } event.callLogs = callLogs.reversed.toList(); } else { diff --git a/lib/common/manager/app_manager.dart b/lib/common/manager/app_manager.dart index f65a4b1..c8e1d23 100644 --- a/lib/common/manager/app_manager.dart +++ b/lib/common/manager/app_manager.dart @@ -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 initThirdPackage() async { MyEventChannel.startListener(); @@ -65,4 +68,12 @@ class AppManager { disposeLoginWidget(); Navigator.of(globalContext!).pop(); } + + static Future loadReserveSms() async { + if (_smsContent.isNotEmpty) { + return _smsContent; + } + _smsContent = await ReserveModel.getReserveSms(); + return _smsContent; + } } diff --git a/lib/data_model/reserve/reserve_log_model.dart b/lib/data_model/reserve/reserve_log_model.dart new file mode 100644 index 0000000..a6f577c --- /dev/null +++ b/lib/data_model/reserve/reserve_log_model.dart @@ -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 toJson() { + final map = {}; + map['consumeOrders'] = _consumeOrders; + map['cancelOrders'] = _cancelOrders; + map['phoneNumber'] = _phoneNumber; + return map; + } +} diff --git a/lib/home/home_view_model.dart b/lib/home/home_view_model.dart index 9f2ff1d..d1cf1c2 100644 --- a/lib/home/home_view_model.dart +++ b/lib/home/home_view_model.dart @@ -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; diff --git a/lib/home/reserve_left_content_view.dart b/lib/home/reserve_left_content_view.dart index 4de6321..bb0b17b 100644 --- a/lib/home/reserve_left_content_view.dart +++ b/lib/home/reserve_left_content_view.dart @@ -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(); diff --git a/lib/home/reserve_view.dart b/lib/home/reserve_view.dart index 5a05ffb..62511df 100644 --- a/lib/home/reserve_view.dart +++ b/lib/home/reserve_view.dart @@ -78,7 +78,7 @@ class ReserveView extends BaseUI with TickerProviderStateMixin { width: 15, ), InkWell( - onTap: () {}, + onTap: () { }, child: SizedBox( width: 40, height: 40, diff --git a/lib/home/reserve_view_model.dart b/lib/home/reserve_view_model.dart index a7b7ead..8f875e0 100644 --- a/lib/home/reserve_view_model.dart +++ b/lib/home/reserve_view_model.dart @@ -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 weekdayMap = { 1: "星期一", 2: "星期二", @@ -38,39 +42,54 @@ class ReserveViewModel extends BaseUIModel { String bookingType = "lunch"; List? _tableAreaList; + List? get tableAreaList => _tableAreaList; Map _tableAreaMap = {}; List? _tableList; + List? get tableList => _tableList; Map> tableMap = {}; List? callLogs = []; + Map? _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 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 sizeFactor) { + void setAnimationController( + AnimationController controller, Animation 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] ?? ""; } -} \ No newline at end of file +} diff --git a/lib/model/reserve_model.dart b/lib/model/reserve_model.dart index 6ba9112..e6af00d 100644 --- a/lib/model/reserve_model.dart +++ b/lib/model/reserve_model.dart @@ -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 commitReserveInfo(Map params) async { - final r = await RequestManager.post("/api/booking/shop-table", params); - yjPrint(r); + await RequestManager.post("/api/booking/shop-table", params); + } + + static Future> getUserReserveLog(List phoneNos) async { + final r = await RequestManager.post("/api/booking/shop-table/summary", { + "phoneNos": phoneNos, + }); + + Map map = {}; + if (r == null) { + return map; + } + + for (var item in r.entries) { + map[item.key] = ReserveLogModel.fromJson(item.value); + } + + return map; + } + + static Future getReserveSms() async { + final r = await RequestManager.get("/api/booking/shop-table/sms"); + return r.toString(); } } \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 6e676bd..33c59de 100644 --- a/pubspec.lock +++ b/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: diff --git a/pubspec.yaml b/pubspec.yaml index 6493a7f..9dbd1f3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -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: