From 781125437056d4309072d47d9eee43c0fe633b44 Mon Sep 17 00:00:00 2001 From: Weller <1812208341@qq.com> Date: Fri, 23 Oct 2020 17:53:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AE=A2=E5=8D=95=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dart_tool/package_config.json | 2 +- .../orders_page/bloc/order_content_bloc.dart | 21 ++- .../orders_page/bloc/order_page_bloc.dart | 50 +++++ .../models/order_filter_model.dart | 6 +- lib/pages/orders_page/models/order_model.dart | 108 ++++++++--- .../models/order_page_item_style_model.dart | 157 ++++++++++++++++ .../models/order_page_style_model.dart | 176 ++++++++++++++++++ lib/pages/orders_page/order_content_page.dart | 20 +- lib/pages/orders_page/orders_page.dart | 150 ++++++++------- lib/pages/orders_page/views/order_filter.dart | 159 +++++++++++++--- .../orders_page/views/order_item_widget.dart | 150 ++++++++++++--- .../orders_page/views/order_serch_widget.dart | 33 +++- .../views/order_tabbar_widget.dart | 39 ++-- 13 files changed, 874 insertions(+), 197 deletions(-) create mode 100644 lib/pages/orders_page/bloc/order_page_bloc.dart create mode 100644 lib/pages/orders_page/models/order_page_item_style_model.dart create mode 100644 lib/pages/orders_page/models/order_page_style_model.dart diff --git a/.dart_tool/package_config.json b/.dart_tool/package_config.json index f77227e..1b512ee 100644 --- a/.dart_tool/package_config.json +++ b/.dart_tool/package_config.json @@ -620,7 +620,7 @@ "languageVersion": "2.8" } ], - "generated": "2020-10-22T02:18:13.447793Z", + "generated": "2020-10-23T06:24:35.938865Z", "generator": "pub", "generatorVersion": "2.8.2" } diff --git a/lib/pages/orders_page/bloc/order_content_bloc.dart b/lib/pages/orders_page/bloc/order_content_bloc.dart index ac769bb..633ffee 100644 --- a/lib/pages/orders_page/bloc/order_content_bloc.dart +++ b/lib/pages/orders_page/bloc/order_content_bloc.dart @@ -19,9 +19,10 @@ class OrderContentBloc extends BlocBase { _ordersController = null; } - void loadData(OrderFilterModel filter) { + void loadData(String state, OrderFilterModel filter) { Map params = filter.toJson(); params.removeWhere((key, value) => value == null || value == ''); + params['state'] = state; NetUtil.request('/api/v1/order', method: NetMethod.POST, params: params, onCache: (data) { _loadData(data); @@ -33,15 +34,15 @@ class OrderContentBloc extends BlocBase { void _loadData(dynamic data) { List list = data ?? []; - OrderModel model = OrderModel(); - model.itemId = '6918577752399759376'; - model.imgUrl = - 'https://t7.baidu.com/it/u=3616242789,1098670747&fm=79&app=86&size=h300&n=0&g=4n&f=jpeg?sec=1603444938&t=04aeb23595ac79d419be19ab92bea668'; - model.title = '乐町百褶半身裙秋冬女2019新款复古麻花半身裙甜美百褶半身裙'; - model.price = '108'; - model.commission = '0'; - model.commissionRate = '9.2'; - _orders.add(model); + // OrderModel model = OrderModel(); + // model.itemId = '6918577752399759376'; + // model.imgUrl = + // 'https://t7.baidu.com/it/u=3616242789,1098670747&fm=79&app=86&size=h300&n=0&g=4n&f=jpeg?sec=1603444938&t=04aeb23595ac79d419be19ab92bea668'; + // model.title = '乐町百褶半身裙秋冬女2019新款复古麻花半身裙甜美百褶半身裙'; + // model.price = '108'; + // model.commission = '0'; + // model.commissionRate = '9.2'; + // _orders.add(model); _orders.addAll(list.map((item) { return OrderModel.fromJson(Map.from(item)); diff --git a/lib/pages/orders_page/bloc/order_page_bloc.dart b/lib/pages/orders_page/bloc/order_page_bloc.dart new file mode 100644 index 0000000..aed3a3a --- /dev/null +++ b/lib/pages/orders_page/bloc/order_page_bloc.dart @@ -0,0 +1,50 @@ +import 'dart:async'; +import 'dart:convert' as convert; + +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart'; +import 'package:zhiying_comm/util/base_bloc.dart'; +import 'package:zhiying_comm/zhiying_comm.dart'; + +class OrderPageBloc extends BlocBase { + OrderPageStyleModel _style; + + StreamController _styleController = + StreamController(); + + Stream get outData => _styleController.stream; + + @override + void dispose() { + _styleController.close(); + _styleController = null; + } + + void loadData(String skipIdentifier) async { + NetUtil.request('/api/v1/mod/${skipIdentifier.toString()}', + method: NetMethod.GET, onCache: (data) { + _loadData(data); + }, onSuccess: (data) { + _loadData(data); + }); + } + + void _loadData(dynamic data) { + try { + Map json = Map.from(data); + if (json == null || json.length == 0) { + return; + } + List mods = json['mod_list']; + if (mods.first != null) { + json = Map.from(mods.first); + String d = json['data']; + Map da = + Map.from(convert.jsonDecode(d)); + _style = OrderPageStyleModel.fromJson(da); + _styleController.add(_style); + } + } catch (err) { + Logger.error(err); + } + } +} diff --git a/lib/pages/orders_page/models/order_filter_model.dart b/lib/pages/orders_page/models/order_filter_model.dart index b846e13..abf8078 100644 --- a/lib/pages/orders_page/models/order_filter_model.dart +++ b/lib/pages/orders_page/models/order_filter_model.dart @@ -1,6 +1,5 @@ // 订单筛选条件 class OrderFilterModel { - String state; String keyword; String startTime; String endTime; @@ -10,8 +9,7 @@ class OrderFilterModel { String pageSize; OrderFilterModel( - {this.state, - this.keyword, + {this.keyword, this.startTime, this.endTime, this.type, @@ -20,7 +18,6 @@ class OrderFilterModel { this.pageSize}); OrderFilterModel.fromJson(Map json) { - state = json['state']; keyword = json['keyword']; startTime = json['start_time']; endTime = json['end_time']; @@ -32,7 +29,6 @@ class OrderFilterModel { Map toJson() { final Map data = new Map(); - data['state'] = this.state; data['keyword'] = this.keyword; data['start_time'] = this.startTime; data['end_time'] = this.endTime; diff --git a/lib/pages/orders_page/models/order_model.dart b/lib/pages/orders_page/models/order_model.dart index 7e52ef0..cb4460e 100644 --- a/lib/pages/orders_page/models/order_model.dart +++ b/lib/pages/orders_page/models/order_model.dart @@ -1,36 +1,100 @@ class OrderModel { + int uid; + String nickname; + bool hidOrder; + String ordId; + String providerOid; String itemId; - String title; - String price; - String commission; - String commissionRate; - String imgUrl; + int itemNum; + String itemTitle; + String itemPrice; + String provider; + String paidPrice; + int orderType; + String userCommission; + String userCommissionRate; + String reason; + int state; + String createAt; + String updateAt; + String confirmAt; + String settleAt; + String thumbnail; + Map data; // 保存原始数据 - OrderModel( - {this.itemId, - this.title, - this.price, - this.commission, - this.commissionRate, - this.imgUrl}); + OrderModel({ + this.uid, + this.nickname, + this.hidOrder, + this.ordId, + this.providerOid, + this.itemId, + this.itemNum, + this.itemTitle, + this.itemPrice, + this.provider, + this.paidPrice, + this.orderType, + this.userCommission, + this.userCommissionRate, + this.reason, + this.state, + this.createAt, + this.updateAt, + this.confirmAt, + this.settleAt, + this.thumbnail, + this.data, + }); OrderModel.fromJson(Map json) { + uid = json['uid']; + nickname = json['nickname']; + hidOrder = json['hid_order']; + ordId = json['ord_id']; + providerOid = json['provider_oid']; itemId = json['item_id']; - title = json['title']; - price = json['price']; - commission = json['commission']; - commissionRate = json['commission_rate']; - imgUrl = json['img_url']; + itemNum = json['item_num']; + itemTitle = json['item_title']; + itemPrice = json['item_price']; + provider = json['provider']; + paidPrice = json['paid_price']; + orderType = json['order_type']; + userCommission = json['user_commission']; + userCommissionRate = json['user_commission_rate']; + reason = json['reason']; + state = json['state']; + createAt = json['create_at']; + updateAt = json['update_at']; + confirmAt = json['confirm_at']; + settleAt = json['settle_at']; + thumbnail = json['thumbnail']; + data = json; } Map toJson() { final Map data = new Map(); + data['uid'] = this.uid; + data['nickname'] = this.nickname; + data['hid_order'] = this.hidOrder; + data['ord_id'] = this.ordId; + data['provider_oid'] = this.providerOid; data['item_id'] = this.itemId; - data['title'] = this.title; - data['price'] = this.price; - data['commission'] = this.commission; - data['commission_rate'] = this.commissionRate; - data['img_url'] = this.imgUrl; + data['item_num'] = this.itemNum; + data['item_title'] = this.itemTitle; + data['item_price'] = this.itemPrice; + data['provider'] = this.provider; + data['paid_price'] = this.paidPrice; + data['order_type'] = this.orderType; + data['user_commission'] = this.userCommission; + data['user_commission_rate'] = this.userCommissionRate; + data['reason'] = this.reason; + data['state'] = this.state; + data['create_at'] = this.createAt; + data['update_at'] = this.updateAt; + data['confirm_at'] = this.confirmAt; + data['settle_at'] = this.settleAt; + data['thumbnail'] = this.thumbnail; return data; } } diff --git a/lib/pages/orders_page/models/order_page_item_style_model.dart b/lib/pages/orders_page/models/order_page_item_style_model.dart new file mode 100644 index 0000000..98d28f9 --- /dev/null +++ b/lib/pages/orders_page/models/order_page_item_style_model.dart @@ -0,0 +1,157 @@ +class OrderPageItemStyleModel { + String textCopy; + String textOrderNo; + String textOrderTime; + String textFinishTime; + String colorProviderFont; + String colorProviderBg; + String colorOrderTypeFont; + String colorOrderStateFont; + String colorTitle; + String colorFont; + String colorCopyBg; + String colorTipsBg; + String colorAmountFont; + String colorIncomeFont; + String skipIdentifier; + List orderState; + List orderType; + + OrderPageItemStyleModel( + {this.textCopy, + this.textOrderNo, + this.textOrderTime, + this.textFinishTime, + this.colorProviderFont, + this.colorProviderBg, + this.colorOrderTypeFont, + this.colorOrderStateFont, + this.colorTitle, + this.colorFont, + this.colorCopyBg, + this.colorTipsBg, + this.colorAmountFont, + this.colorIncomeFont, + this.skipIdentifier, + this.orderState, + this.orderType}); + + OrderPageItemStyleModel.fromJson(Map json) { + textCopy = json['text_copy']; + textOrderNo = json['text_order_no']; + textOrderTime = json['text_order_time']; + textFinishTime = json['text_finish_time']; + colorProviderFont = json['color_provider_font']; + colorProviderBg = json['color_provider_bg']; + colorOrderTypeFont = json['color_order_type_font']; + colorOrderStateFont = json['color_order_state_font']; + colorTitle = json['color_title']; + colorFont = json['color_font']; + colorCopyBg = json['color_copy_bg']; + colorTipsBg = json['color_tips_bg']; + colorAmountFont = json['color_amount_font']; + colorIncomeFont = json['color_income_font']; + skipIdentifier = json['skip_identifier']; + if (json['order_state'] != null) { + orderState = new List(); + json['order_state'].forEach((v) { + orderState.add(new OrderStateModel.fromJson(v)); + }); + } + if (json['order_type'] != null) { + orderType = new List(); + json['order_type'].forEach((v) { + orderType.add(new OrderTypeModel.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = new Map(); + data['text_copy'] = this.textCopy; + data['text_order_no'] = this.textOrderNo; + data['text_order_time'] = this.textOrderTime; + data['text_finish_time'] = this.textFinishTime; + data['color_provider_font'] = this.colorProviderFont; + data['color_provider_bg'] = this.colorProviderBg; + data['color_order_type_font'] = this.colorOrderTypeFont; + data['color_order_state_font'] = this.colorOrderStateFont; + data['color_title'] = this.colorTitle; + data['color_font'] = this.colorFont; + data['color_copy_bg'] = this.colorCopyBg; + data['color_tips_bg'] = this.colorTipsBg; + data['color_amount_font'] = this.colorAmountFont; + data['color_income_font'] = this.colorIncomeFont; + data['skip_identifier'] = this.skipIdentifier; + if (this.orderState != null) { + data['order_state'] = this.orderState.map((v) => v.toJson()).toList(); + } + if (this.orderType != null) { + data['order_type'] = this.orderType.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class OrderStateModel { + String name; + String type; + String tips; + String tipsReplaceKey; + String tipsReplaceColor; + String amountText; + String incomeText; + + OrderStateModel( + {this.name, + this.type, + this.tips, + this.tipsReplaceKey, + this.tipsReplaceColor, + this.amountText, + this.incomeText}); + + OrderStateModel.fromJson(Map json) { + name = json['name']; + type = json['type']; + tips = json['tips']; + tipsReplaceKey = json['tips_replace_key']; + tipsReplaceColor = json['tips_replace_color']; + amountText = json['amount_text']; + incomeText = json['income_text']; + } + + Map toJson() { + final Map data = new Map(); + data['name'] = this.name; + data['type'] = this.type; + data['tips'] = this.tips; + data['tips_replace_key'] = this.tipsReplaceKey; + data['tips_replace_color'] = this.tipsReplaceColor; + data['amount_text'] = this.amountText; + data['income_text'] = this.incomeText; + return data; + } +} + +class OrderTypeModel { + String name; + String type; + String replaceKey; + + OrderTypeModel({this.name, this.type, this.replaceKey}); + + OrderTypeModel.fromJson(Map json) { + name = json['name']; + type = json['type']; + replaceKey = json['replace_key']; + } + + Map toJson() { + final Map data = new Map(); + data['name'] = this.name; + data['type'] = this.type; + data['replace_key'] = this.replaceKey; + return data; + } +} diff --git a/lib/pages/orders_page/models/order_page_style_model.dart b/lib/pages/orders_page/models/order_page_style_model.dart new file mode 100644 index 0000000..08003d9 --- /dev/null +++ b/lib/pages/orders_page/models/order_page_style_model.dart @@ -0,0 +1,176 @@ +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_item_style_model.dart'; + +class OrderPageStyleModel { + String appBarName; + String appBarNameColor; + String appBarBgImg; + String appBarBgColor; + String appBgColor; + String appActivateColor; + String searchBarLeftIcon; + String searchBarRightIcon; + String searchBarPlaceholder; + String searchBarHideTextColor; + String searchBarBgColor; + String searchBarBtnText; + String searchBarBtnTextColor; + String searchBarBtnBgColor; + String searchBtnReset; + String searchBtnOk; + String noticeSecurityIcon; + String noticeSecurityTitle; + String noticeSecuritySkipTitle; + String noticeSecuritySkipColor; + String noticeSecuritySkipIdentifier; + OrderPageFilterStyleModel filter; + OrderPageItemStyleModel list; + + OrderPageStyleModel( + {this.appBarName, + this.appBarNameColor, + this.appBarBgImg, + this.appBarBgColor, + this.appBgColor, + this.appActivateColor, + this.searchBarLeftIcon, + this.searchBarRightIcon, + this.searchBarPlaceholder, + this.searchBarHideTextColor, + this.searchBarBgColor, + this.searchBarBtnText, + this.searchBarBtnTextColor, + this.searchBarBtnBgColor, + this.searchBtnReset, + this.searchBtnOk, + this.noticeSecurityIcon, + this.noticeSecurityTitle, + this.noticeSecuritySkipTitle, + this.noticeSecuritySkipColor, + this.noticeSecuritySkipIdentifier, + this.filter, + this.list}); + + OrderPageStyleModel.fromJson(Map json) { + appBarName = json['app_bar_name']; + appBarNameColor = json['app_bar_name_color']; + appBarBgImg = json['app_bar_bg_img']; + appBarBgColor = json['app_bar_bg_color']; + appBgColor = json['app_bg_color']; + appActivateColor = json['app_activate_color']; + searchBarLeftIcon = json['search_bar_left_icon']; + searchBarRightIcon = json['search_bar_right_icon']; + searchBarPlaceholder = json['search_bar_placeholder']; + searchBarHideTextColor = json['search_bar_hide_text_color']; + searchBarBgColor = json['search_bar_bg_color']; + searchBarBtnText = json['search_bar_btn_text']; + searchBarBtnTextColor = json['search_bar_btn_text_color']; + searchBarBtnBgColor = json['search_bar_btn_bg_color']; + searchBtnReset = json['search_btn_reset']; + searchBtnOk = json['search_btn_ok']; + noticeSecurityIcon = json['notice_security_icon']; + noticeSecurityTitle = json['notice_security_title']; + noticeSecuritySkipTitle = json['notice_security_skip_title']; + noticeSecuritySkipColor = json['notice_security_skip_color']; + noticeSecuritySkipIdentifier = json['notice_security_skip_identifier']; + filter = json['filter'] != null + ? new OrderPageFilterStyleModel.fromJson(json['filter']) + : null; + list = json['list'] != null + ? OrderPageItemStyleModel.fromJson(json['list']) + : null; + } + + Map toJson() { + final Map data = new Map(); + data['app_bar_name'] = this.appBarName; + data['app_bar_name_color'] = this.appBarNameColor; + data['app_bar_bg_img'] = this.appBarBgImg; + data['app_bar_bg_color'] = this.appBarBgColor; + data['app_bg_color'] = this.appBgColor; + data['app_activate_color'] = this.appActivateColor; + data['search_bar_left_icon'] = this.searchBarLeftIcon; + data['search_bar_right_icon'] = this.searchBarRightIcon; + data['search_bar_placeholder'] = this.searchBarPlaceholder; + data['search_bar_hide_text_color'] = this.searchBarHideTextColor; + data['search_bar_bg_color'] = this.searchBarBgColor; + data['search_bar_btn_text'] = this.searchBarBtnText; + data['search_bar_btn_text_color'] = this.searchBarBtnTextColor; + data['search_bar_btn_bg_color'] = this.searchBarBtnBgColor; + data['search_btn_reset'] = this.searchBtnReset; + data['search_btn_ok'] = this.searchBtnOk; + data['notice_security_icon'] = this.noticeSecurityIcon; + data['notice_security_title'] = this.noticeSecurityTitle; + data['notice_security_skip_title'] = this.noticeSecuritySkipTitle; + data['notice_security_skip_color'] = this.noticeSecuritySkipColor; + data['notice_security_skip_identifier'] = this.noticeSecuritySkipIdentifier; + if (this.filter != null) { + data['filter'] = this.filter.toJson(); + } + if (this.list != null) { + data['list'] = this.list.toJson(); + } + return data; + } +} + +class OrderPageFilterStyleModel { + String icon; + List orderState; + String providerTitle; + List providerType; + String orderTitle; + List orderType; + String orderTimeTitle; + + OrderPageFilterStyleModel( + {this.icon, + this.orderState, + this.providerTitle, + this.providerType, + this.orderTitle, + this.orderType, + this.orderTimeTitle}); + + OrderPageFilterStyleModel.fromJson(Map json) { + icon = json['icon']; + if (json['order_state'] != null) { + orderState = new List(); + json['order_state'].forEach((v) { + orderState.add(new OrderTypeModel.fromJson(v)); + }); + } + providerTitle = json['provider_title']; + if (json['provider_type'] != null) { + providerType = new List(); + json['provider_type'].forEach((v) { + providerType.add(new OrderTypeModel.fromJson(v)); + }); + } + orderTitle = json['order_title']; + if (json['order_type'] != null) { + orderType = new List(); + json['order_type'].forEach((v) { + orderType.add(new OrderTypeModel.fromJson(v)); + }); + } + orderTimeTitle = json['order_time_title']; + } + + Map toJson() { + final Map data = new Map(); + data['icon'] = this.icon; + if (this.orderState != null) { + data['order_state'] = this.orderState.map((v) => v.toJson()).toList(); + } + data['provider_title'] = this.providerTitle; + if (this.providerType != null) { + data['provider_type'] = this.providerType.map((v) => v.toJson()).toList(); + } + data['order_title'] = this.orderTitle; + if (this.orderType != null) { + data['order_type'] = this.orderType.map((v) => v.toJson()).toList(); + } + data['order_time_title'] = this.orderTimeTitle; + return data; + } +} diff --git a/lib/pages/orders_page/order_content_page.dart b/lib/pages/orders_page/order_content_page.dart index de1671f..c7ef74f 100644 --- a/lib/pages/orders_page/order_content_page.dart +++ b/lib/pages/orders_page/order_content_page.dart @@ -2,14 +2,18 @@ import 'package:flutter/material.dart'; import 'package:zhiying_base_widget/pages/orders_page/bloc/order_content_bloc.dart'; import 'package:zhiying_base_widget/pages/orders_page/models/order_filter_model.dart'; import 'package:zhiying_base_widget/pages/orders_page/models/order_model.dart'; +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart'; import 'package:zhiying_base_widget/pages/orders_page/views/order_item_widget.dart'; import 'package:zhiying_base_widget/widgets/empty/empty_widget.dart'; import 'package:zhiying_comm/util/base_bloc.dart'; class OrderContentPage extends StatefulWidget { + final String state; // 订单状态 + final OrderPageStyleModel style; final OrderFilterModel filter; - const OrderContentPage({Key key, this.filter}) : super(key: key); + const OrderContentPage(this.state, {Key key, this.filter, this.style}) + : super(key: key); @override _OrderContentPageState createState() => _OrderContentPageState(); @@ -20,15 +24,18 @@ class _OrderContentPageState extends State { Widget build(BuildContext context) { return BlocProvider( bloc: OrderContentBloc(), - child: OrderContentContainer(widget.filter), + child: OrderContentContainer(widget.state, widget.filter, widget.style), ); } } class OrderContentContainer extends StatefulWidget { + final String state; // 订单状态 final OrderFilterModel filter; + final OrderPageStyleModel style; - const OrderContentContainer(this.filter, {Key key}) : super(key: key); + const OrderContentContainer(this.state, this.filter, this.style, {Key key}) + : super(key: key); @override _OrderContentContainerState createState() => _OrderContentContainerState(); @@ -40,7 +47,7 @@ class _OrderContentContainerState extends State { @override void initState() { _bloc = BlocProvider.of(context); - _bloc.loadData(widget.filter); + _bloc.loadData(widget.state, widget.filter); super.initState(); } @@ -65,7 +72,10 @@ class _OrderContentContainerState extends State { return ListView.builder( itemCount: orders.length, itemBuilder: (context, index) { - return OrderItemWidget(orders[index]); + return OrderItemWidget( + orders[index], + widget.style, + ); }); }); } diff --git a/lib/pages/orders_page/orders_page.dart b/lib/pages/orders_page/orders_page.dart index 2c365b6..f37157d 100644 --- a/lib/pages/orders_page/orders_page.dart +++ b/lib/pages/orders_page/orders_page.dart @@ -1,11 +1,15 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:zhiying_base_widget/pages/orders_page/bloc/order_page_bloc.dart'; import 'package:zhiying_base_widget/pages/orders_page/models/order_filter_model.dart'; +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_item_style_model.dart'; +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart'; import 'package:zhiying_base_widget/pages/orders_page/order_content_page.dart'; import 'package:zhiying_base_widget/pages/orders_page/order_search_page.dart'; import 'package:zhiying_base_widget/pages/orders_page/views/order_filter.dart'; import 'package:zhiying_base_widget/pages/orders_page/views/order_serch_widget.dart'; import 'package:zhiying_base_widget/pages/orders_page/views/order_tabbar_widget.dart'; +import 'package:zhiying_comm/util/base_bloc.dart'; // 订单页面 class OrdersPage extends StatefulWidget { @@ -27,8 +31,10 @@ class _OrdersPageState extends State { backgroundColor: Color(0xfff9f9f9), appBar: _createNav(), body: SafeArea( - child: _OrdersContainer(), - ), + child: BlocProvider( + bloc: OrderPageBloc(), + child: _OrdersContainer(widget.data), + )), ); } @@ -70,6 +76,10 @@ class _OrdersPageState extends State { } class _OrdersContainer extends StatefulWidget { + final Map data; + + const _OrdersContainer(this.data, {Key key}) : super(key: key); + @override _OrdersContainerState createState() => _OrdersContainerState(); } @@ -78,90 +88,92 @@ class _OrdersContainerState extends State<_OrdersContainer> with TickerProviderStateMixin { TabController _tabController; GlobalKey _tabKey = GlobalKey(); + OrderPageBloc _bloc; final OrderFilterModel _filter = OrderFilterModel(); bool _isFilterShow = false; - List _titles = [ - '全部', - '已付款', - '已结算', - '已失效', - '全部', - '已付款', - ]; + List _titles = []; List _contents = []; @override void initState() { - _tabController = TabController(length: 6, vsync: this); - _contents = [ - OrderContentPage( - filter: _filter, - ), - OrderContentPage( - filter: _filter, - ), - OrderContentPage( - filter: _filter, - ), - OrderContentPage( - filter: _filter, - ), - OrderContentPage( - filter: _filter, - ), - OrderContentPage( - filter: _filter, - ), - ]; + _bloc = BlocProvider.of(context); + if (widget.data.containsKey('skip_identifier')) { + _bloc.loadData(widget.data['skip_identifier']); + } + super.initState(); } @override Widget build(BuildContext context) { - return Column( - children: [ - GestureDetector( - child: OrderSearchWidget(), - onTap: () { - Navigator.of(context) - .push(CupertinoPageRoute(builder: (BuildContext context) { - return OrderSearchPage(); - })); - }, - ), - OrderTabbarWidget( - _tabController, - _titles, - key: _tabKey, - onMoreClick: () { - setState(() { - _isFilterShow = !_isFilterShow; - }); - }, - ), - Expanded( - child: Stack( + return StreamBuilder( + stream: _bloc.outData, + builder: (BuildContext context, AsyncSnapshot snapshot) { + OrderPageStyleModel model = snapshot.data; + if (model == null) { + return Container(); + } + List type = model.filter.orderState; + _tabController = + TabController(length: type?.length ?? 0, vsync: this); + _titles = List.generate(type?.length, (index) => type[index].name); + _contents = List.generate( + type?.length ?? 0, + (index) => OrderContentPage( + type[index].type, + style: model, + filter: _filter, + ), + ); + + return Column( children: [ - TabBarView( - children: _contents, - controller: _tabController, + GestureDetector( + child: OrderSearchWidget(model), + onTap: () { + Navigator.of(context) + .push(CupertinoPageRoute(builder: (BuildContext context) { + return OrderSearchPage(); + })); + }, ), - Visibility( - visible: _isFilterShow, - child: OrderFilterWidget( - onDismiss: () { - setState(() { - _isFilterShow = false; - }); - }, + OrderTabbarWidget( + model, + _tabController, + _titles, + key: _tabKey, + onMoreClick: () { + setState(() { + _isFilterShow = !_isFilterShow; + }); + }, + ), + Expanded( + child: Stack( + children: [ + TabBarView( + children: _contents, + controller: _tabController, + ), + Visibility( + visible: _isFilterShow, + child: OrderFilterWidget( + model, + _filter, + onDismiss: () { + setState(() { + _isFilterShow = false; + }); + }, + ), + ) + ], ), ) ], - ), - ) - ], - ); + ); + }); } } diff --git a/lib/pages/orders_page/views/order_filter.dart b/lib/pages/orders_page/views/order_filter.dart index 9157cfd..c6ff8ea 100644 --- a/lib/pages/orders_page/views/order_filter.dart +++ b/lib/pages/orders_page/views/order_filter.dart @@ -1,16 +1,56 @@ import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:zhiying_base_widget/pages/orders_page/models/order_filter_model.dart'; +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_item_style_model.dart'; +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart'; import 'package:zhiying_base_widget/widgets/others/action_date_alert/action_date_alert.dart'; +import 'package:zhiying_comm/zhiying_comm.dart'; class OrderFilterWidget extends StatefulWidget { + final OrderPageStyleModel style; + final OrderFilterModel filterModel; final VoidCallback onDismiss; - const OrderFilterWidget({Key key, this.onDismiss}) : super(key: key); + const OrderFilterWidget(this.style, this.filterModel, + {Key key, this.onDismiss}) + : super(key: key); @override _OrderFilterWidgetState createState() => _OrderFilterWidgetState(); } class _OrderFilterWidgetState extends State { + int _currentProvider = 0; //订单来源 + int _currentType = 0; // 订单类型 + int _startTime = 0; // 起始时间 + int _endTime = 0; // 结束时间 + + @override + void initState() { + if (widget?.filterModel?.provider != null && + widget.filterModel.provider != '') { + List list = widget?.style?.filter?.providerType; + for (int index = 0; index < list.length; index++) { + if (list[index].type == widget.filterModel.provider) { + _currentProvider = index; + break; + } + } + } + + if (widget?.filterModel?.type != null && widget.filterModel.type != '') { + List list = widget?.style?.filter?.orderType; + for (int index = 0; index < list.length; index++) { + if (list[index].type == widget.filterModel.type) { + _currentType = index; + break; + } + } + } + + super.initState(); + } + @override Widget build(BuildContext context) { return GestureDetector( @@ -24,11 +64,11 @@ class _OrderFilterWidgetState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.start, children: [ - _creteTitle('订单来源'), - _createTags(), - _creteTitle('订单类型'), - _createTags(), - _creteTitle('订单时间'), + _creteTitle(widget?.style?.filter?.providerTitle ?? ''), + _createSources(), + _creteTitle(widget?.style?.filter?.orderTitle ?? ''), + _createType(), + _creteTitle(widget?.style?.filter?.orderTimeTitle ?? ''), _creteTime(), Container( width: double.infinity, @@ -58,7 +98,7 @@ class _OrderFilterWidgetState extends State { ); } - Widget _createTags() { + Widget _createSources() { return Container( width: double.infinity, padding: @@ -68,22 +108,65 @@ class _OrderFilterWidgetState extends State { crossAxisAlignment: WrapCrossAlignment.start, spacing: 20, runSpacing: 10, - children: List.generate(10, (index) { - return Container( - padding: EdgeInsets.only(left: 12, right: 12, top: 6, bottom: 6), - decoration: BoxDecoration( - color: Color(0xfff1f1f1), - borderRadius: BorderRadius.circular(5)), - child: Text( - '全部', - style: TextStyle(fontSize: 12, color: Color(0xff999999)), - ), + children: List.generate( + widget?.style?.filter?.providerType?.length ?? 0, (index) { + return GestureDetector( + onTap: () { + setState(() { + _currentProvider = index; + }); + }, + child: _createTag( + widget.style.filter.providerType[index].name ?? '', + index == _currentProvider), + ); + }).toList(), + ), + ); + } + + Widget _createType() { + return Container( + width: double.infinity, + padding: + const EdgeInsets.only(left: 12.5, right: 12.5, bottom: 5, top: 5), + color: Colors.white, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.start, + spacing: 20, + runSpacing: 10, + children: List.generate(widget?.style?.filter?.orderType?.length ?? 0, + (index) { + return GestureDetector( + onTap: () { + setState(() { + _currentType = index; + }); + }, + child: _createTag(widget.style.filter.orderType[index].name ?? '', + _currentType == index), ); }).toList(), ), ); } + Widget _createTag(String title, bool isSelected) { + return Container( + padding: EdgeInsets.only(left: 12, right: 12, top: 6, bottom: 6), + decoration: BoxDecoration( + color: isSelected + ? HexColor.fromHex(widget?.style?.appActivateColor ?? '#ff4242') + : Color(0xfff1f1f1), + borderRadius: BorderRadius.circular(5)), + child: Text( + title ?? '', + style: TextStyle( + fontSize: 12, color: isSelected ? Colors.white : Color(0xff999999)), + ), + ); + } + Widget _createButtons() { return Container( height: 54, @@ -131,6 +214,18 @@ class _OrderFilterWidgetState extends State { } Widget _creteTime() { + var formatter = new DateFormat('yyyy-MM-dd'); + String starTime = + formatter.format(DateTime.fromMillisecondsSinceEpoch(_startTime)); + if (_startTime == 0) { + starTime = '不限'; + } + + String endTime = formatter.format(DateTime(_endTime)); + if (_endTime == 0) { + endTime = '不限'; + } + return Container( color: Colors.white, padding: EdgeInsets.only(left: 12, right: 12, top: 4, bottom: 20), @@ -146,7 +241,7 @@ class _OrderFilterWidgetState extends State { borderRadius: BorderRadius.circular(5)), child: Center( child: Text( - '2020-06', + starTime, style: TextStyle( fontSize: 12, color: Color(0xff999999), @@ -155,7 +250,7 @@ class _OrderFilterWidgetState extends State { ), ), onTap: () { - _selectDate(); + _selectStartDate(); }, ), Text( @@ -175,7 +270,7 @@ class _OrderFilterWidgetState extends State { borderRadius: BorderRadius.circular(5)), child: Center( child: Text( - '2020-06', + endTime, style: TextStyle( fontSize: 12, color: Color(0xff999999), @@ -184,7 +279,7 @@ class _OrderFilterWidgetState extends State { ), ), onTap: () { - _selectDate(); + _selectEndDate(); }, ), ], @@ -192,7 +287,7 @@ class _OrderFilterWidgetState extends State { ); } - void _selectDate() async { + void _selectStartDate() async { DateTime dateTime = await showModalBottomSheet( context: context, builder: (context) { @@ -203,8 +298,24 @@ class _OrderFilterWidgetState extends State { isScrollControlled: false, backgroundColor: Colors.transparent); if (dateTime != null) { - String timeStamp = - (dateTime.millisecondsSinceEpoch / 1000).ceil().toString(); + _startTime = dateTime.millisecondsSinceEpoch; + } + setState(() {}); + } + + void _selectEndDate() async { + DateTime dateTime = await showModalBottomSheet( + context: context, + builder: (context) { + return ActionDateAlert( + title: '选择结束日期', + ); + }, + isScrollControlled: false, + backgroundColor: Colors.transparent); + if (dateTime != null) { + _endTime = dateTime.millisecondsSinceEpoch; } + setState(() {}); } } diff --git a/lib/pages/orders_page/views/order_item_widget.dart b/lib/pages/orders_page/views/order_item_widget.dart index 0221a8c..2541a0f 100644 --- a/lib/pages/orders_page/views/order_item_widget.dart +++ b/lib/pages/orders_page/views/order_item_widget.dart @@ -1,11 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:fluttertoast/fluttertoast.dart'; import 'package:zhiying_base_widget/pages/orders_page/models/order_model.dart'; +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_item_style_model.dart'; +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart'; import 'package:zhiying_comm/zhiying_comm.dart'; class OrderItemWidget extends StatelessWidget { final OrderModel model; + final OrderPageStyleModel style; - const OrderItemWidget(this.model, {Key key}) : super(key: key); + const OrderItemWidget(this.model, this.style, {Key key}) : super(key: key); @override Widget build(BuildContext context) { @@ -19,19 +24,39 @@ class OrderItemWidget extends StatelessWidget { children: [ _createHeader(), _createCenter(), + _createTips(), ], ), ); } Widget _createHeader() { + List types = style.list.orderType; + OrderTypeModel orderType = types.firstWhere((element) { + return element.type == model.orderType.toString(); + }); + // orderType = types.last; + String type = ''; + type = orderType.name ?? ''; + String replaceKey = orderType.replaceKey ?? ''; + if (replaceKey.length > 4) { + String key = replaceKey.substring(2, replaceKey.length - 2); + Logger.debug(key); + if (model.data.containsKey(key)) { + type = orderType.name.replaceAll(replaceKey, model.data[key]); + } + } + + List states = style.list.orderState; + OrderStateModel state = + states.firstWhere((element) => element.type == model.state.toString()); return Padding( padding: const EdgeInsets.only(bottom: 8), child: Row( children: [ Expanded( child: Text( - '粉丝订单:Mickey', + type ?? '', maxLines: 1, style: TextStyle( fontSize: 12, @@ -41,7 +66,7 @@ class OrderItemWidget extends StatelessWidget { ), ), Text( - '待结算', + state.name ?? '', maxLines: 1, style: TextStyle( fontSize: 12, @@ -65,7 +90,7 @@ class OrderItemWidget extends StatelessWidget { child: ClipRRect( borderRadius: BorderRadius.circular(8), child: CachedNetworkImage( - imageUrl: model.imgUrl ?? '', + imageUrl: model.thumbnail ?? '', fit: BoxFit.cover, ), ), @@ -75,9 +100,42 @@ class OrderItemWidget extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ _createTitle(), - _creteText('订单编号:15487945211587'), - _creteText('下单时间:2020-06-18 17:11:15'), - _creteText('完成时间:2020-06-18 17:11:15'), + Row( + children: [ + _creteText( + '${style?.list?.textOrderNo ?? ''}${model?.ordId ?? ''}'), + GestureDetector( + onTap: () { + if (model?.ordId != null && model.ordId.length > 0) { + Fluttertoast.showToast(msg: '复制成功'); + Clipboard.setData(ClipboardData(text: model.ordId)); + } + }, + child: Container( + margin: EdgeInsets.only(left: 10), + padding: EdgeInsets.only( + left: 10, + right: 10, + ), + decoration: BoxDecoration( + color: Color(0xfff5f5f5), + borderRadius: BorderRadius.circular(2.5), + border: Border.all( + color: Color(0xffd6d6d6), + width: 0.5, + )), + child: Text( + style.list.textCopy, + style: TextStyle(fontSize: 9, color: Color(0xff999999)), + ), + ), + ) + ], + ), + _creteText( + '${style?.list?.textOrderTime ?? ''}${model?.createAt ?? ''}'), + _creteText( + '${style?.list?.textFinishTime ?? ''}${model?.confirmAt ?? ''}'), ], ), ) @@ -87,25 +145,36 @@ class OrderItemWidget extends StatelessWidget { Widget _createTitle() { List list = List(); - list.add(WidgetSpan( - child: Container( - padding: EdgeInsets.only(left: 2, right: 2, top: 3, bottom: 3), - margin: EdgeInsets.only(right: 4), - child: Text( - '淘宝', - style: TextStyle( - fontSize: 9, - height: 1, - color: Colors.white, + String shop = ''; + if (model?.provider != null && model.provider != '') { + shop = style.filter.providerType + .firstWhere((element) => element.type == model.provider) + ?.name ?? + ''; + } + if (shop != '') { + list.add(WidgetSpan( + child: Container( + padding: EdgeInsets.only(left: 2, right: 2, top: 3, bottom: 3), + margin: EdgeInsets.only(right: 4), + child: Text( + shop, + style: TextStyle( + fontSize: 9, + height: 1, + color: + HexColor.fromHex(style.list.colorProviderFont ?? '#ffffff'), + ), ), + decoration: BoxDecoration( + color: HexColor.fromHex(style.list.colorProviderBg ?? '#ffffff'), + borderRadius: BorderRadius.circular(2.5)), ), - decoration: BoxDecoration( - color: Colors.redAccent, borderRadius: BorderRadius.circular(2.5)), - ), - )); + )); + } list.add( TextSpan( - text: model.title, + text: model?.itemTitle ?? '', style: TextStyle( fontSize: 15, color: Color(0xff333333), @@ -120,14 +189,37 @@ class OrderItemWidget extends StatelessWidget { } Widget _creteText(String text) { - return Padding( - padding: EdgeInsets.only(top: 4), + return text == null || text == '' + ? Container() + : Padding( + padding: EdgeInsets.only(top: 2, bottom: 2), + child: Text( + text, + style: TextStyle( + fontSize: 10, + color: Color(0xff999999), + ), + ), + ); + } + + Widget _createTips() { + List states = style.list.orderState; + OrderStateModel state = + states.firstWhere((element) => element.type == model.state.toString()); + if (state == null || state.tips == null || state.tips == '') { + return Container(); + } + return Container( + margin: EdgeInsets.only(top: 8), + padding: EdgeInsets.only(left: 8, right: 8, top: 2, bottom: 2), + width: double.infinity, + decoration: BoxDecoration( + color: HexColor.fromHex(style.list.colorTipsBg ?? '#f5f5f5'), + borderRadius: BorderRadius.circular(4)), child: Text( - text, - style: TextStyle( - fontSize: 10, - color: Color(0xff999999), - ), + state?.tips ?? '', + style: TextStyle(color: Color(0xff666666), fontSize: 10), ), ); } diff --git a/lib/pages/orders_page/views/order_serch_widget.dart b/lib/pages/orders_page/views/order_serch_widget.dart index e09a4f2..0f17c53 100644 --- a/lib/pages/orders_page/views/order_serch_widget.dart +++ b/lib/pages/orders_page/views/order_serch_widget.dart @@ -1,7 +1,14 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart'; +import 'package:zhiying_comm/util/extension/color.dart'; +import 'package:zhiying_comm/zhiying_comm.dart'; class OrderSearchWidget extends StatelessWidget { + final OrderPageStyleModel model; + + const OrderSearchWidget(this.model, {Key key}) : super(key: key); + @override Widget build(BuildContext context) { return Container( @@ -12,13 +19,25 @@ class OrderSearchWidget extends StatelessWidget { child: Container( padding: EdgeInsets.only(left: 12, right: 12), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16), color: Color(0xfff9f9f9)), - child: Center( - child: Text( - '搜索商品标题/粉丝姓名/订单号', - textAlign: TextAlign.center, - style: TextStyle(color: Color(0xff999999), fontSize: 14), - ), + borderRadius: BorderRadius.circular(16), + color: HexColor.fromHex(model?.searchBarBgColor ?? '#f7f7f7')), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + width: 16, + height: 16, + margin: EdgeInsets.only(right: 4), + child: CachedNetworkImage( + imageUrl: model?.searchBarLeftIcon ?? '', + ), + ), + Text( + model?.searchBarPlaceholder ?? '', + textAlign: TextAlign.center, + style: TextStyle(color: Color(0xff999999), fontSize: 14), + ), + ], ), ), ); diff --git a/lib/pages/orders_page/views/order_tabbar_widget.dart b/lib/pages/orders_page/views/order_tabbar_widget.dart index 882b66f..68c54b3 100644 --- a/lib/pages/orders_page/views/order_tabbar_widget.dart +++ b/lib/pages/orders_page/views/order_tabbar_widget.dart @@ -1,12 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:zhiying_base_widget/pages/orders_page/models/order_page_style_model.dart'; import 'package:zhiying_base_widget/widgets/search/widget/my_tab.dart'; +import 'package:zhiying_comm/util/extension/color.dart'; +import 'package:zhiying_comm/zhiying_comm.dart'; class OrderTabbarWidget extends StatelessWidget { + final OrderPageStyleModel model; final TabController controller; final List titles; final VoidCallback onMoreClick; const OrderTabbarWidget( + this.model, this.controller, this.titles, { Key key, @@ -27,8 +32,10 @@ class OrderTabbarWidget extends StatelessWidget { isScrollable: true, indicatorSize: TabBarIndicatorSize.label, // tabs: widgets, - indicatorColor: Color(0xffff4242), - labelColor: Color(0xffff4242), + indicatorColor: + HexColor.fromHex(model?.appActivateColor ?? '#ff4242'), + labelColor: + HexColor.fromHex(model?.appActivateColor ?? '#ff4242'), unselectedLabelColor: Color(0xff999999), tabs: titles.map((item) { return MyTab( @@ -39,12 +46,14 @@ class OrderTabbarWidget extends StatelessWidget { ), ), GestureDetector( + behavior: HitTestBehavior.opaque, child: Container( width: 40, height: 40, - child: Icon( - Icons.filter_4, - size: 14, + padding: EdgeInsets.all(10), + child: CachedNetworkImage( + imageUrl: model?.filter?.icon ?? '', + fit: BoxFit.contain, ), ), onTap: () { @@ -57,23 +66,3 @@ class OrderTabbarWidget extends StatelessWidget { )); } } - -class OrderTabbarItemWidget extends StatelessWidget { - final String title; - final bool isSelected; - - const OrderTabbarItemWidget({Key key, this.title, this.isSelected = false}) - : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - height: 26, - child: Text( - title, - style: TextStyle( - color: isSelected ? Color(0xFFFF4242) : Color(0xff999999)), - ), - ); - } -}