From 739c45b8c33fb216be45cb5a173b99c41b25a77b Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 10 Mar 2025 14:22:20 +0800 Subject: [PATCH] 11 --- .../models/database/database_enum_models.dart | 2 +- .../database/entity/order_entity.g.dart | 2 +- lib/common/widgets/app/app_icon.dart | 8 +- lib/common/widgets/app/app_title.dart | 8 +- lib/pages/order_history/controller.dart | 87 +++++++++-- lib/pages/order_history/view.dart | 35 ++++- .../order_history_detail/controller.dart | 46 ++++-- lib/pages/order_history_detail/view.dart | 143 +++++++++++++++++- 8 files changed, 285 insertions(+), 46 deletions(-) diff --git a/lib/common/models/database/database_enum_models.dart b/lib/common/models/database/database_enum_models.dart index 25f7d6d..aca912a 100644 --- a/lib/common/models/database/database_enum_models.dart +++ b/lib/common/models/database/database_enum_models.dart @@ -54,7 +54,7 @@ enum OrderPayType implements BaseEnum { /// 订单状态 enum OrderStatus implements BaseEnum { // 查询使用 - all("-1", "未付款"), + total("-1", "未付款"), nonePay("1", "未付款"), pay("5", "已付款"), diff --git a/lib/common/services/database/entity/order_entity.g.dart b/lib/common/services/database/entity/order_entity.g.dart index 644fc17..83c8fd3 100644 --- a/lib/common/services/database/entity/order_entity.g.dart +++ b/lib/common/services/database/entity/order_entity.g.dart @@ -68,7 +68,7 @@ const _$OrderTypeEnumMap = { }; const _$OrderStatusEnumMap = { - OrderStatus.all: 'all', + OrderStatus.total: 'total', OrderStatus.nonePay: 'nonePay', OrderStatus.pay: 'pay', OrderStatus.offlinePay: 'offlinePay', diff --git a/lib/common/widgets/app/app_icon.dart b/lib/common/widgets/app/app_icon.dart index 1d84b8a..2bbdc4f 100644 --- a/lib/common/widgets/app/app_icon.dart +++ b/lib/common/widgets/app/app_icon.dart @@ -2,12 +2,16 @@ import 'package:ducafe_ui_core/ducafe_ui_core.dart'; import 'package:flutter/material.dart'; import 'package:forui/forui.dart'; -Widget appPrefixIcon(BuildContext context, SvgAsset icon) { +Widget appPrefixIcon( + BuildContext context, + SvgAsset icon, { + double padding = 20, +}) { final theme = FTheme.of(context); final iconStyle = theme.style.iconStyle.copyWith( size: theme.typography.xl.fontSize, ); - return FIcon(icon, size: iconStyle.size).paddingLeft(20.w); + return FIcon(icon, size: iconStyle.size).paddingLeft(padding.w); } Widget appSuffixIcon(BuildContext context, SvgAsset icon) { diff --git a/lib/common/widgets/app/app_title.dart b/lib/common/widgets/app/app_title.dart index e13d1c9..5cda721 100644 --- a/lib/common/widgets/app/app_title.dart +++ b/lib/common/widgets/app/app_title.dart @@ -3,11 +3,15 @@ import 'package:ducafe_ui_core/ducafe_ui_core.dart'; import 'package:flutter/material.dart'; import 'package:forui/forui.dart'; -Widget appPrefixTitle(BuildContext context, String? str) { +Widget appPrefixTitle( + BuildContext context, + String? str, { + double padding = 20, +}) { final theme = FTheme.of(context); final textStyle = theme.typography.xl; if (ObjectUtil.isEmpty(str)) str = "--"; - return Text(str!, style: textStyle).paddingLeft(20.w); + return Text(str!, style: textStyle).paddingLeft(padding.w); } Widget appSuffixTitle(BuildContext context, String? str) { diff --git a/lib/pages/order_history/controller.dart b/lib/pages/order_history/controller.dart index e221877..ca1cdb5 100644 --- a/lib/pages/order_history/controller.dart +++ b/lib/pages/order_history/controller.dart @@ -5,6 +5,10 @@ import 'package:get/get.dart'; import 'package:pj_supermarket_cloud/common/index.dart'; class OrderHistoryController extends GetxController { + final appC = Get.find(); + + PrintManage get printManage => appC.printManage; + Rx hourType = Rx(ProductHourType.morning); DateTime startOrderCreateTime = DateTime.now().subtract( @@ -15,12 +19,10 @@ class OrderHistoryController extends GetxController { const Duration(days: 1), ); - RxInt currentTab = 0.obs; + Rx currentTab = OrderStatus.total.obs; RxList tabList = [].obs; - String orderStatus = "-1"; - // table RxInt currentPage = 1.obs; @@ -71,7 +73,7 @@ class OrderHistoryController extends GetxController { final sysType = appSetting.sysType.name; final orderDao = app.dataBase.getOrderDao; final list = await orderDao.findAll( - orderStatus, + currentTab.value.code, startOrderCreateTime, endOrderCreateTime, pageSize.value, @@ -80,7 +82,7 @@ class OrderHistoryController extends GetxController { hourType.value.code, ); final total = await orderDao.count( - orderStatus, + currentTab.value.code, startOrderCreateTime, endOrderCreateTime, sysType, @@ -106,6 +108,13 @@ class OrderHistoryController extends GetxController { EasyLoading.dismiss(); } + Future doTab(OrderStatus i) async { + if (i.code == currentTab.value.code) return; + currentTab.value = i; + currentPage.value = 1; + await getOrder(); + } + Future getTableList() async { final total = await _getTotal(); List tabs = OrderStatus.values @@ -113,8 +122,10 @@ class OrderHistoryController extends GetxController { .toList(); for (int i = 0; i < tabs.length; i++) { final v = tabs[i]; + final currentTotal = total[v.status.name]; + if (currentTotal == null) continue; + v.total = currentTotal; } - // final total = total[v.status.name]; tabList.value = tabs; } @@ -123,19 +134,19 @@ class OrderHistoryController extends GetxController { final appSetting = await AppSettingTool.getSysSetting(); final app = Get.find(); Map map = { - "PAY": 0, - "NONE_PAY": 0, - "OFFLINE_PAY": 0, - "REFUND": 0, - "TOTAL": 0, + "pay": 0, + "nonePay": 0, + "offlinePay": 0, + "refund": 0, + "total": 0, }; String totalSql = """ SELECT - SUM(CASE WHEN status = 'PAY' THEN 1 ELSE 0 END) AS PAY, - SUM(CASE WHEN status = 'NONE_PAY' THEN 1 ELSE 0 END) AS NONE_PAY, - SUM(CASE WHEN status = 'OFFLINE_PAY' THEN 1 ELSE 0 END) AS OFFLINE_PAY, - SUM(CASE WHEN status = 'REFUND' THEN 1 ELSE 0 END) AS REFUND, - SUM(CASE WHEN 1 = 1 THEN 1 ELSE 0 END) AS TOTAL + SUM(CASE WHEN status = 'pay' THEN 1 ELSE 0 END) AS pay, + SUM(CASE WHEN status = 'nonePay' THEN 1 ELSE 0 END) AS nonePay, + SUM(CASE WHEN status = 'offlinePay' THEN 1 ELSE 0 END) AS offlinePay, + SUM(CASE WHEN status = 'refund' THEN 1 ELSE 0 END) AS refund, + SUM(CASE WHEN 1 = 1 THEN 1 ELSE 0 END) AS total FROM order_record WHERE sysType = ? @@ -161,4 +172,48 @@ class OrderHistoryController extends GetxController { } return map; } + + /// 跳转到订单详情 + void doDetail(OrderEntity v) { + Get.toNamed( + RouteNames.orderHistoryDetail, + arguments: {'id': v.id}, + ); + } + + /// 打印订单发票 + void doPrint(OrderEntity v) async { + final isOpen = await printManage.open(); + if (!isOpen) { + Toast.error(msg: "打开打印机失败"); + return; + } + EasyLoading.show( + status: '打印中...', + maskType: EasyLoadingMaskType.black, + ); + try { + final orderId = int.tryParse(v.serviceUniqueCode); + final pa = {"orderId": orderId}; + final res = await HardApi.generateInvoice(pa); + if (res.code != 0) throw Error(); + final data = res.data as ServiceGenerateInvoice; + if (ObjectUtil.isEmpty(data.historyId) || ObjectUtil.isEmpty(data.pic)) { + throw Error(); + } + await SyncPrintTool.addTask( + orderId: v.serviceUniqueCode, + androidOrderId: v.id.toString(), + historyId: data.historyId!, + pic: data.pic!, + ); + EasyLoading.dismiss(); + Toast.success(msg: "打印成功"); + } catch (e, stack) { + logger.e("打印订单发票失败error:|$e|stack:|$stack|"); + EasyLoading.dismiss(); + } finally { + await printManage.close(); + } + } } diff --git a/lib/pages/order_history/view.dart b/lib/pages/order_history/view.dart index e021529..28d2047 100644 --- a/lib/pages/order_history/view.dart +++ b/lib/pages/order_history/view.dart @@ -42,7 +42,7 @@ class OrderHistoryPage extends GetView { Obx( () => controller.tabList .map((v) { - final active = false; + final active = v.status.code == controller.currentTab.value.code; return FButton( style: active ? FButtonStyle.primary : FButtonStyle.secondary, label: Text( @@ -56,7 +56,7 @@ class OrderHistoryPage extends GetView { : theme.colorScheme.primary, ), ).width(150.w), - onPress: () => {}, + onPress: () => controller.doTab(v.status), ); }) .toList() @@ -133,7 +133,7 @@ class OrderHistoryPage extends GetView { DataColumn2( label: Text('操作'), headingRowAlignment: MainAxisAlignment.center, - fixedWidth: 150.w, + fixedWidth: 260.w, ), ], rows: controller.orderList @@ -185,10 +185,31 @@ class OrderHistoryPage extends GetView { appPrice(context, v.payPrice).center(), ), DataCell( - Text( - v.payType.title, - textAlign: TextAlign.center, - ).center(), + [ + FButton( + label: Text( + '打印发票', + style: theme.typography.sm.copyWith( + color: theme.colorScheme.primary, + ), + ), + style: FButtonStyle.outline, + onPress: () => controller.doPrint(v), + ), + FButton( + label: Text( + '查询详情', + style: theme.typography.sm.copyWith( + color: theme.colorScheme.primary, + ), + ), + style: FButtonStyle.outline, + onPress: () => controller.doDetail(v), + ), + ].toRowSpace( + space: 20.w, + mainAxisAlignment: MainAxisAlignment.center, + ), ), ]), ) diff --git a/lib/pages/order_history_detail/controller.dart b/lib/pages/order_history_detail/controller.dart index 8623e05..cfdcb55 100644 --- a/lib/pages/order_history_detail/controller.dart +++ b/lib/pages/order_history_detail/controller.dart @@ -1,7 +1,14 @@ import 'package:get/get.dart'; +import 'package:pj_supermarket_cloud/common/index.dart'; class OrderHistoryDetailController extends GetxController { - OrderHistoryDetailController(); + final appC = Get.find(); + + int detailId = -1; + + Rx detailData = null.obs; + + RxList shopCardList = [].obs; _initData() { update(["order_history_detail"]); @@ -9,10 +16,14 @@ class OrderHistoryDetailController extends GetxController { void onTap() {} - // @override - // void onInit() { - // super.onInit(); - // } + @override + void onInit() async { + super.onInit(); + final arguments = Get.arguments as Map; + detailId = arguments['id'] as int; + await getOrderDetail(); + await getShopOrderList(); + } @override void onReady() { @@ -20,8 +31,25 @@ class OrderHistoryDetailController extends GetxController { _initData(); } - // @override - // void onClose() { - // super.onClose(); - // } + @override + void onClose() { + super.onClose(); + } + + Future getOrderDetail() async { + if (detailId == -1) return; + final detail = await appC.dataBase.getOrderDao.findById( + detailId, + ); + detailData.value = detail; + } + + Future getShopOrderList() async { + if (detailId == -1) return; + final detail = await appC.dataBase.getShopCardDao.findByOrderId( + detailId, + ); + shopCardList.value = detail; + shopCardList.refresh(); + } } diff --git a/lib/pages/order_history_detail/view.dart b/lib/pages/order_history_detail/view.dart index 7050e39..8f5f778 100644 --- a/lib/pages/order_history_detail/view.dart +++ b/lib/pages/order_history_detail/view.dart @@ -1,30 +1,157 @@ +import 'package:common_utils/common_utils.dart'; +import 'package:ducafe_ui_core/ducafe_ui_core.dart'; import 'package:flutter/material.dart'; import 'package:forui/forui.dart'; import 'package:get/get.dart'; +import 'package:pj_supermarket_cloud/common/index.dart'; + import 'index.dart'; class OrderHistoryDetailPage extends GetView { const OrderHistoryDetailPage({super.key}); // 主视图 - Widget _buildView() { - return const Center( - child: Text("OrderHistoryDetailPage"), - ); + Widget _buildView(BuildContext context) { + final theme = FTheme.of(context); + final width = context.width; + return [ + _buildLeft(context).width(width * 0.3).height(double.infinity), + FDivider( + axis: Axis.vertical, + style: theme.dividerStyles.verticalStyle.copyWith( + color: theme.colorScheme.primary, + padding: EdgeInsets.zero, + ), + ).marginSymmetric(horizontal: 10.w), + _buildRight(context).expanded(), + ].toRow().marginOnly(bottom: 20.h); + } + + Widget _buildLeft(BuildContext context) { + return [ + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "机器订单ID", padding: 0), + details: appPrefixTitle( + context, + controller.detailData.value?.id.toString() ?? "", + ), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "服务端唯一标识", padding: 0), + details: appPrefixTitle( + context, controller.detailData.value?.serviceUniqueCode ?? ""), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "用户唯一标识", padding: 0), + details: appPrefixTitle( + context, + controller.detailData.value?.userCode ?? "", + ), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "用户名", padding: 0), + details: appPrefixTitle( + context, + controller.detailData.value?.username ?? "", + ), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "商品总价", padding: 0), + details: appPrice(context, controller.detailData.value?.price), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "额外支付", padding: 0), + details: appPrice(context, controller.detailData.value?.extraPrice), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "实际扣款", padding: 0), + details: appPrice(context, controller.detailData.value?.payPrice), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "订单类型", padding: 0), + details: appPrefixTitle( + context, + controller.detailData.value?.type.title ?? "", + ), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "订单状态", padding: 0), + details: appPrefixTitle( + context, + controller.detailData.value?.status.title ?? "", + ), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "支付方式", padding: 0), + details: appPrefixTitle( + context, + controller.detailData.value?.payType.title ?? "", + ), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "商品总数量", padding: 0), + details: appPrefixTitle( + context, + controller.detailData.value?.count.toString() ?? "", + ), + ), + FTile( + prefixIcon: appPrefixIcon(context, FAssets.icons.settings, padding: 0), + title: appPrefixTitle(context, "创建时间", padding: 0), + details: appPrefixTitle( + context, + controller.detailData.value?.createTime != null + ? DateUtil.formatDate(controller.detailData.value!.createTime) + : "未知", + ), + ), + ] + .toColumnSpace( + space: 20.h, + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.start, + ) + .scrollable(); + } + + Widget _buildRight(BuildContext context) { + return [].toColumn().scrollable(); } @override Widget build(BuildContext context) { + final theme = FTheme.of(context); + final height = context.height; return GetBuilder( init: OrderHistoryDetailController(), id: "order_history_detail", builder: (_) { return FScaffold( - header: FHeader(title: SizedBox.shrink()), - content: _buildView(), - contentPad: true, - resizeToAvoidBottomInset: true, + header: FHeader.nested( + title: Text("订单详情"), + prefixActions: [ + FHeaderAction.back(onPress: Get.back), + ], + style: theme.headerStyle.nestedStyle.copyWith( + titleTextStyle: theme.typography.lg, + actionStyle: theme.headerStyle.nestedStyle.actionStyle.copyWith( + size: theme.typography.xl2.fontSize, + ), + ), + ).height(height * 0.1), + content: _buildView(context), ); }, );