11
This commit is contained in:
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',
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
),
|
||||
),
|
||||
]),
|
||||
)
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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),
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
Reference in new issue
Block a user