This commit is contained in:
dzc committed 2025-03-10 14:22:20 +08:00
1 parent 08bf352984
commit 739c45b8c3
8 files changed
+285 -46

No files matched your search

@@ -54,7 +54,7 @@ enum OrderPayType implements BaseEnum {
/// 订单状态
enum OrderStatus implements BaseEnum {
// 查询使用
all("-1", "未付款"),
total("-1", "未付款"),
nonePay("1", "未付款"),
pay("5", "已付款"),
@@ -68,7 +68,7 @@ const _$OrderTypeEnumMap = {
};
const _$OrderStatusEnumMap = {
OrderStatus.all: 'all',
OrderStatus.total: 'total',
OrderStatus.nonePay: 'nonePay',
OrderStatus.pay: 'pay',
OrderStatus.offlinePay: 'offlinePay',
+6 -2
View File
@@ -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) {
+6 -2
View File
@@ -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) {
+71 -16
View File
@@ -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<AppControl>();
PrintManage get printManage => appC.printManage;
Rx<ProductHourType> 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<OrderStatus> currentTab = OrderStatus.total.obs;
RxList<OrderHistoryTableItem> tabList = <OrderHistoryTableItem>[].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<void> doTab(OrderStatus i) async {
if (i.code == currentTab.value.code) return;
currentTab.value = i;
currentPage.value = 1;
await getOrder();
}
Future<void> getTableList() async {
final total = await _getTotal();
List<OrderHistoryTableItem> 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<AppControl>();
Map<String, dynamic> 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();
}
}
}
+28 -7
View File
@@ -42,7 +42,7 @@ class OrderHistoryPage extends GetView<OrderHistoryController> {
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<OrderHistoryController> {
: theme.colorScheme.primary,
),
).width(150.w),
onPress: () => {},
onPress: () => controller.doTab(v.status),
);
})
.toList()
@@ -133,7 +133,7 @@ class OrderHistoryPage extends GetView<OrderHistoryController> {
DataColumn2(
label: Text('操作'),
headingRowAlignment: MainAxisAlignment.center,
fixedWidth: 150.w,
fixedWidth: 260.w,
),
],
rows: controller.orderList
@@ -185,10 +185,31 @@ class OrderHistoryPage extends GetView<OrderHistoryController> {
appPrice(context, v.payPrice).center(),
),
DataCell(
Text(
v.payType.title,
textAlign: TextAlign.center,
).center(),
<Widget>[
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,
),
),
]),
)
+37 -9
View File
@@ -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<AppControl>();
int detailId = -1;
Rx<OrderEntity?> detailData = null.obs;
RxList<ShopCardEntity> shopCardList = <ShopCardEntity>[].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<String, dynamic>;
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<void> getOrderDetail() async {
if (detailId == -1) return;
final detail = await appC.dataBase.getOrderDao.findById(
detailId,
);
detailData.value = detail;
}
Future<void> getShopOrderList() async {
if (detailId == -1) return;
final detail = await appC.dataBase.getShopCardDao.findByOrderId(
detailId,
);
shopCardList.value = detail;
shopCardList.refresh();
}
}
+135 -8
View File
@@ -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<OrderHistoryDetailController> {
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 <Widget>[
_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 <Widget>[
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 <Widget>[].toColumn().scrollable();
}
@override
Widget build(BuildContext context) {
final theme = FTheme.of(context);
final height = context.height;
return GetBuilder<OrderHistoryDetailController>(
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),
);
},
);