Commit a19c84af78351e3225d562c6f44cc6e6a05fb6ac

Authored by wdn127929
1 parent 82390f26

创建营销部分、编辑客户部分

... ... @@ -17,6 +17,7 @@ import 'package:one_key/pages/login/first_page.dart';
import 'package:one_key/provider/base_info_provider.dart';
import 'package:one_key/provider/coupon_provider.dart';
import 'package:one_key/provider/create_store_model.dart';
import 'package:one_key/provider/customer_making_provider.dart';
import 'package:one_key/provider/message_dialog_model.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:one_key/provider/message_model.dart';
... ... @@ -109,6 +110,9 @@ Future<void> main() async {
ChangeNotifierProvider<RemarkManagerModel>(
create: (_) => RemarkManagerModel(),
),
ChangeNotifierProvider<CustomerMakingProvider>(
create: (_) => CustomerMakingProvider(),
),
],
child: MyApp(),
));
... ...
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';
import 'package:json_annotation/json_annotation.dart';
import 'dart:convert' as convert;
import 'package:one_key/models/table_list.dart' as t;
... ... @@ -113,6 +115,42 @@ class ListData extends Object {
@JsonKey(name: 'phone')
String phone;
@JsonKey(name: 'status')
String status;
String get statusStr {
switch (status) {
case "0":
return "待确认";
break;
case "1":
return "已定座";
break;
case "2":
return "已到店";
break;
case "3":
return "已完成";
break;
case "4":
return "已取消";
break;
case "5":
return "已安排";
break;
case "6":
return "已拒绝";
break;
}
return '';
}
String get ddateStr {
DateTime dateTime =
DateTime.fromMillisecondsSinceEpoch(int.parse(ddate.toString()) * 1000);
return DateUtil.formatDate(dateTime, format: DateFormats.y_mo_d);
}
String get ddateSoltStr {
switch (ddateSolt) {
case "1":
... ... @@ -129,6 +167,9 @@ class ListData extends Object {
}
String get tableinfoName {
if (tableinfo == null) {
return '';
}
List<dynamic> tableinfoList = convert.jsonDecode(tableinfo);
print(tableinfo);
String _nameStr = '';
... ... @@ -152,6 +193,7 @@ class ListData extends Object {
this.uid,
this.nickName,
this.phone,
this.status,
);
factory ListData.fromJson(Map<String, dynamic> srcJson) =>
... ...
... ... @@ -75,6 +75,7 @@ ListData _$ListDataFromJson(Map<String, dynamic> json) {
json['uid'] as String,
json['nick_name'] as String,
json['phone'] as String,
json['status'] as String,
);
}
... ... @@ -88,4 +89,5 @@ Map<String, dynamic> _$ListDataToJson(ListData instance) => <String, dynamic>{
'uid': instance.uid,
'nick_name': instance.nickName,
'phone': instance.phone,
'status': instance.status,
};
... ...
... ... @@ -176,5 +176,11 @@ class HttpUrl {
"?service=App.GuestManage.GetCustomerList"; //用来获取客户列表
static const String get_guest_info =
"?service=App.GuestManage.GetGuestInfo"; // 获取客户详情
static const String get_guest_reserve =
"?service=App.GuestManage.GetGuestReserve"; // 客户订单统计
static const String create_marketing =
"?service=App.GuestManage.CreateMarketing"; // 创建营销
static const String set_guest_info =
"?service=App.GuestManage.SetGuestInfo"; // 修改客户信息
}
... ...
... ... @@ -232,8 +232,14 @@ class _EditReserverPageState extends State<EditReserverPage> {
),
onChanged: (value) {
print('ggg');
nameStr = value;
if (value.endsWith('先生') ||
value.endsWith('女士') ||
value.endsWith('公司')) {
nameStr = value.substring(
0, value.length - 2);
} else {
nameStr = value;
}
},
onEditingComplete: () {
print('fff');
... ...
... ... @@ -1528,7 +1528,14 @@ class _NoteBookChangeFPageState extends State<NoteBookChangeFPage> {
onChanged: (value) {
print('ggg');
nameStr = value;
if (value.endsWith('先生') ||
value.endsWith('女士') ||
value.endsWith('公司')) {
nameStr = value.substring(
0, value.length - 2);
} else {
nameStr = value;
}
},
onEditingComplete: () {
print('fff');
... ...
... ... @@ -1854,8 +1854,16 @@ class NotebookDetailPageState extends State<NotebookDetailPage> {
print(
'ggg');
nameStr =
value;
if (value.endsWith('先生') ||
value.endsWith('女士') ||
value.endsWith('公司')) {
nameStr = value.substring(
0,
value.length - 2);
} else {
nameStr =
value;
}
},
onEditingComplete:
() {
... ...
... ... @@ -1651,7 +1651,14 @@ class InvicationPageState extends State<InvicationPage>
onChanged: (value) {
print('ggg');
nameStr = value;
if (value.endsWith('先生') ||
value.endsWith('女士') ||
value.endsWith('公司')) {
nameStr = value.substring(
0, value.length - 2);
} else {
nameStr = value;
}
},
onEditingComplete: () {
print('fff');
... ...
... ... @@ -88,7 +88,7 @@ class _ContactListPageState extends State<ContactListPage> {
);
}
Widget _buildListItem(CustomerListSunModel model) {
Widget _buildListItem(CustomerListSunModel model, int index) {
String susTag = model.getSuspensionTag();
return Column(
... ... @@ -111,63 +111,78 @@ class _ContactListPageState extends State<ContactListPage> {
width: ScreenUtil().setWidth(2)))),
child: Row(
children: [
Stack(
alignment: Alignment.bottomCenter,
clipBehavior: Clip.none,
children: [
Stack(
alignment: Alignment.centerLeft,
clipBehavior: Clip.none,
children: [
CircleAvatar(
radius: ScreenUtil().setWidth(60),
backgroundColor: Color.fromRGBO(239, 239, 239, 1),
child: Text(
model.rnameStr != ''
? model.rnameStr.substring(0, 1)
: '',
style: TextStyle(
color: Color.fromRGBO(206, 206, 206, 1),
fontSize: ScreenUtil().setSp(42)),
),
),
Positioned(
left: ScreenUtil().setWidth(-18),
child: Image.asset(
Utils.getImgPath('select'),
width: ScreenUtil().setWidth(36),
))
]),
Positioned(
bottom: ScreenUtil().setWidth(-20),
child: Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(10),
vertical: ScreenUtil().setWidth(2),
),
decoration: BoxDecoration(
color: model.attr != null && model.attr != ''
? model.attr == '沉睡'
? Color.fromRGBO(223, 33, 81, 1)
: model.attr == '活跃'
? Color.fromRGBO(81, 170, 94, 1)
: model.attr == '流失'
? Color.fromRGBO(109, 101, 248, 1)
: Color.fromRGBO(239, 143, 49, 1)
: Colors.transparent,
borderRadius: BorderRadius.circular(
ScreenUtil().setWidth(10),
InkWell(
onTap: () {
List<CustomerListSunModel> data =
widget.provider.returnNowList();
data[index].select = !data[index].select;
if (data[index].select) {
widget.provider.addData(index);
} else {
widget.provider.cancelData(index);
}
widget.provider.getCheckValue();
},
child: Stack(
alignment: Alignment.bottomCenter,
clipBehavior: Clip.none,
children: [
Stack(
alignment: Alignment.centerLeft,
clipBehavior: Clip.none,
children: [
CircleAvatar(
radius: ScreenUtil().setWidth(60),
backgroundColor: Color.fromRGBO(239, 239, 239, 1),
child: Text(
model.rnameStr != ''
? model.rnameStr.substring(0, 1)
: '',
style: TextStyle(
color: Color.fromRGBO(206, 206, 206, 1),
fontSize: ScreenUtil().setSp(42)),
),
),
),
child: Text(
model.attr == null || model.attr == ''
? ''
: model.attr,
style: TextStyle(
color: MyColours.color_ffffff,
fontSize: ScreenUtil().setSp(28)))))
],
),
Positioned(
left: ScreenUtil().setWidth(-18),
child: Image.asset(
Utils.getImgPath(
model.select ? 'select' : 'unselect'),
width: ScreenUtil().setWidth(36),
))
]),
Positioned(
bottom: ScreenUtil().setWidth(-20),
child: Container(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(10),
vertical: ScreenUtil().setWidth(2),
),
decoration: BoxDecoration(
color: model.attr != null && model.attr != ''
? model.attr == '沉睡'
? Color.fromRGBO(223, 33, 81, 1)
: model.attr == '活跃'
? Color.fromRGBO(81, 170, 94, 1)
: model.attr == '流失'
? Color.fromRGBO(
109, 101, 248, 1)
: Color.fromRGBO(
239, 143, 49, 1)
: Colors.transparent,
borderRadius: BorderRadius.circular(
ScreenUtil().setWidth(10),
),
),
child: Text(
model.attr == null || model.attr == ''
? ''
: model.attr,
style: TextStyle(
color: MyColours.color_ffffff,
fontSize: ScreenUtil().setSp(28)))))
],
)),
HEmptyView(20),
Expanded(
child: Column(
... ... @@ -351,7 +366,7 @@ class _ContactListPageState extends State<ContactListPage> {
onTap: () {
NavigatorUtil.goCustomerDetailPage(context, model, widget.fromPage);
},
child: _buildListItem(model),
child: _buildListItem(model, index),
);
},
physics: BouncingScrollPhysics(),
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/guest_info_model.dart';
import 'package:one_key/provider/customer_provider.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/event_bus.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:provider/provider.dart';
class CustomerDetailEditPage extends StatefulWidget {
CustomerDetailEditPage({Key key}) : super(key: key);
final Guest guest;
final FromPage fromPage;
CustomerDetailEditPage({Key key, this.guest, this.fromPage})
: super(key: key);
@override
_CustomerDetailEditPageState createState() => _CustomerDetailEditPageState();
... ... @@ -32,6 +40,9 @@ class _CustomerDetailEditPageState extends State<CustomerDetailEditPage> {
TextEditingController xhController = TextEditingController();
TextEditingController fwController = TextEditingController();
bool showLabel = false;
CustomerProvider customerProvider;
String labelShow = '';
@override
void initState() {
super.initState();
... ... @@ -47,23 +58,85 @@ class _CustomerDetailEditPageState extends State<CustomerDetailEditPage> {
setState(() {});
});
WidgetsBinding.instance.addPostFrameCallback((_) {
// if (widget.name != '' &&
// widget.name != null &&
// widget.sex != '' &&
// widget.sex != null) {
// nameStr = widget.name;
// for (var item in detailModel.sexList) {
// item['select'] = false;
// if (item['code'] == widget.sex) {
// item['select'] = true;
// }
// }
// _addNameSuffix(nameStr, _nameSuffix());
// setState(() {});
// }
if (widget.guest.rname != '' &&
widget.guest.rname != null &&
widget.guest.sex != '' &&
widget.guest.sex != null) {
nameStr = widget.guest.rname;
for (var item in sexList) {
item['select'] = false;
if (item['code'] == widget.guest.sex) {
item['select'] = true;
}
}
_addNameSuffix(nameStr, _nameSuffix());
}
phoneController.text = widget.guest.phone ?? '';
adressController.text = widget.guest.company ?? '';
departmentController.text = widget.guest.section ?? '';
positionController.text = widget.guest.position ?? '';
jkController.text = widget.guest.taboos ?? '';
xhController.text = widget.guest.like ?? '';
fwController.text = widget.guest.serve ?? '';
labelShow = widget.guest.label ?? '';
setState(() {});
});
}
_setGuestInfo() async {
if (nameStr.trim().length == 0) {
Utils.showToast('请填写客户姓名');
return;
}
if (phoneController.text.trim().length == 0) {
Utils.showToast('请填写客户电话');
return;
}
String sex = '1';
for (var item in sexList) {
if (item['select']) {
sex = item['code'];
}
}
Map<String, String> params = {
"id": widget.guest.id,
'sex': sex,
'rname': nameStr,
'phone': phoneController.text
};
if (adressController.text.trim().length > 0) {
params['company'] = adressController.text;
}
if (departmentController.text.trim().length > 0) {
params['section'] = departmentController.text;
}
if (positionController.text.trim().length > 0) {
params['position'] = positionController.text;
}
if (labelShow != '') {
// params['label'] =
}
if (jkController.text.trim().length > 0) {
params['taboos'] = jkController.text;
}
if (xhController.text.trim().length > 0) {
params['like'] = xhController.text;
}
if (fwController.text.trim().length > 0) {
params['serve'] = fwController.text;
}
bool sucess =
await customerProvider.setGuestInfo(context, params, showLoading: true);
if (sucess) {
Utils.showToast('保存成功');
bus.emit('refresh_guest_info');
bus.emit('refresh_guest_list');
Navigator.pop(context);
// 刷新前一页
}
}
///称谓
_initSexList() {
// String sexStr = detailEntity.sex;
... ... @@ -192,17 +265,15 @@ class _CustomerDetailEditPageState extends State<CustomerDetailEditPage> {
contentPadding: EdgeInsets.zero,
border: OutlineInputBorder(borderSide: BorderSide.none),
),
onChanged: (value) {
print('ggg');
nameStr = value;
},
onChanged: (value) {},
onEditingComplete: () {
// if (controller == nameController) {
// nameFocus.unfocus();
// // _homeEnterModel.nameController.text =
// // nameStr + _nameSuffix();
// _addNameSuffix(nameStr, _nameSuffix());
// }
print('fff');
nameFocus.unfocus();
// _homeEnterModel.nameController.text =
// nameStr + _nameSuffix();
_addNameSuffix(nameStr, _nameSuffix());
},
keyboardType: TextInputType.text,
),
... ... @@ -279,6 +350,7 @@ class _CustomerDetailEditPageState extends State<CustomerDetailEditPage> {
@override
Widget build(BuildContext context) {
customerProvider = Provider.of<CustomerProvider>(context, listen: true);
return Scaffold(
backgroundColor: MyColours.color_ffffff,
appBar: SystemAppBar(
... ... @@ -348,7 +420,14 @@ class _CustomerDetailEditPageState extends State<CustomerDetailEditPage> {
onChanged: (value) {
print('ggg');
nameStr = value;
if (value.endsWith('先生') ||
value.endsWith('女士') ||
value.endsWith('公司')) {
nameStr = value.substring(
0, value.length - 2);
} else {
nameStr = value;
}
},
onEditingComplete: () {
print('fff');
... ... @@ -440,7 +519,7 @@ class _CustomerDetailEditPageState extends State<CustomerDetailEditPage> {
),
Expanded(
child: Text(
'低频高消费',
labelShow,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Color.fromRGBO(193, 194, 63, 1),
... ... @@ -458,67 +537,71 @@ class _CustomerDetailEditPageState extends State<CustomerDetailEditPage> {
],
),
)),
InkWell(
onTap: () {
// DialogUtil.showSelectCusmanDialog(
// context, couponList, (value) {
// if (value != null) {
// setState(() {
// couponSelectIndex = value.first;
// });
// }
// },
// selecteds: couponSelectIndex == null
// ? []
// : [couponSelectIndex])
// .then((value) {});
},
child: Container(
// height: ScreenUtil().setWidth(60),
padding: EdgeInsets.symmetric(
vertical: ScreenUtil().setWidth(50)),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
width: ScreenUtil().setWidth(2),
color: Color.fromRGBO(
220, 220, 220, 1)))),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
// color: Colors.red,
width: ScreenUtil().setWidth(150),
height: ScreenUtil().setWidth(35),
child: Text(
'客户经理',
style: TextStyle(
widget.fromPage == FromPage.FromPageMyCustomer
? SizedBox()
: InkWell(
onTap: () {
// DialogUtil.showSelectCusmanDialog(
// context, couponList, (value) {
// if (value != null) {
// setState(() {
// couponSelectIndex = value.first;
// });
// }
// },
// selecteds: couponSelectIndex == null
// ? []
// : [couponSelectIndex])
// .then((value) {});
},
child: Container(
// height: ScreenUtil().setWidth(60),
padding: EdgeInsets.symmetric(
vertical: ScreenUtil().setWidth(50)),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
width: ScreenUtil().setWidth(2),
color: Color.fromRGBO(
220, 220, 220, 1)))),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [
Container(
// color: Colors.red,
width: ScreenUtil().setWidth(150),
height: ScreenUtil().setWidth(35),
child: Text(
'客户经理',
style: TextStyle(
fontSize:
ScreenUtil().setSp(28),
color: MyColours.color_333333),
),
),
Expanded(
child: Text(
'xxxj',
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
color: MyColours.color_333333),
),
),
)),
HEmptyView(10),
Image.asset(
Utils.getImgPath(showLabel
? 'c_arrow_up'
: 'c_arrow_down'),
width: ScreenUtil().setWidth(24),
// height: ScreenUtil().setWidth(10),
)
],
),
Expanded(
child: Text(
'xxxj',
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(28),
),
)),
HEmptyView(10),
Image.asset(
Utils.getImgPath(showLabel
? 'c_arrow_up'
: 'c_arrow_down'),
width: ScreenUtil().setWidth(24),
// height: ScreenUtil().setWidth(10),
)
],
),
)),
)),
VEmptyView(60),
_textMulLine('忌口', '输入忌口的东西', jkController),
VEmptyView(30),
... ... @@ -536,7 +619,9 @@ class _CustomerDetailEditPageState extends State<CustomerDetailEditPage> {
height: ScreenUtil().setWidth(80),
fontSize: 26,
isBold: false,
onPressed: () {},
onPressed: () {
_setGuestInfo();
},
),
VEmptyView(30)
],
... ...
... ... @@ -8,6 +8,7 @@ import 'package:one_key/provider/customer_provider.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/route/navigator_util.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/event_bus.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/page_exception.dart';
... ... @@ -38,6 +39,15 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
WidgetsBinding.instance.addPostFrameCallback((_) async {
_getGuestInfo();
});
bus.on("refresh_guest_info", (arg) {
_getGuestInfo();
});
}
@override
void dispose() {
EventBus().emit('refresh_guest_info');
super.dispose();
}
_getGuestInfo() async {
... ... @@ -240,7 +250,8 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
fontSize: 26,
isBold: false,
onPressed: () {
NavigatorUtil.goCustomerDetailEditPage(context);
NavigatorUtil.goCustomerDetailEditPage(context,
customerProvider.guestInfoSunModel.guest, widget.fromPage);
},
),
],
... ... @@ -335,7 +346,11 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
)),
InkWell(
onTap: () {
NavigatorUtil.goCustomerOrderPage(context);
NavigatorUtil.goCustomerOrderPage(
context,
customerProvider.guestInfoSunModel.guest.id,
customerProvider
.guestInfoSunModel.guest.phone);
},
child: Text('更多',
style: TextStyle(
... ...
... ... @@ -4,6 +4,7 @@ import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/pages/my/customer_type/contant_list_page.dart';
import 'package:one_key/provider/customer_making_provider.dart';
import 'package:one_key/provider/customer_provider.dart';
import 'package:one_key/provider/user_model.dart';
... ... @@ -34,11 +35,12 @@ class CustomerListPage extends StatefulWidget {
}
class _CustomerListPageState extends State<CustomerListPage>
with TickerProviderStateMixin {
with TickerProviderStateMixin, SingleTickerProviderStateMixin {
List _tabBarTitle;
TabController tabController;
CustomerProvider customerProvider;
CustomerMakingProvider customerMakingProvider;
bool showFilter = false;
ScrollController _scrollCrl = ScrollController();
int dropValue = 0;
... ... @@ -51,9 +53,25 @@ class _CustomerListPageState extends State<CustomerListPage>
// timeTilte = ['大于', '等于', '小于'];
super.initState();
tabController = TabController(length: 4, vsync: this);
tabController.addListener(() {
if (tabController.index == tabController.animation.value) {
print(tabController.index);
customerProvider.index = tabController.index;
customerProvider.searchData(customerProvider.controller.text);
}
});
WidgetsBinding.instance.addPostFrameCallback((_) async {
_getContantData();
});
bus.on("refresh_guest_list", (arg) {
_getContantData();
});
}
@override
void dispose() {
EventBus().emit('refresh_guest_list');
super.dispose();
}
_getContantData() async {
... ... @@ -84,20 +102,47 @@ class _CustomerListPageState extends State<CustomerListPage>
)),
child: Row(
children: [
Image.asset(Utils.getImgPath('select'),
width: ScreenUtil().setWidth(30)),
HEmptyView(10),
Text(
'全选',
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
InkWell(
onTap: () {
if (customerProvider.checkValue) {
customerProvider.cancelAll();
} else {
customerProvider.addAll();
}
},
child: Row(
children: [
Image.asset(
Utils.getImgPath(customerProvider.checkValue
? 'c_mul_select'
: 'c_mul_select_un'),
width: ScreenUtil().setWidth(30)),
HEmptyView(10),
Text(
'全选',
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
),
HEmptyView(20),
],
),
),
HEmptyView(20),
Expanded(
child: InkWell(
onTap: () {
NavigatorUtil.goMakeMarkingPage(context);
if (customerProvider.selectCustomer == null ||
customerProvider.selectCustomer.length == 0) {
Utils.showToast('请选择顾客');
return;
}
customerMakingProvider.labels = customerProvider.labels;
customerMakingProvider.selectCustomer =
customerProvider.selectCustomer;
customerMakingProvider.fromPage = widget.fromPage;
NavigatorUtil.goMakeMarkingPage(context,
Utils.listToStringEnglish(customerProvider.selectCustomer));
},
child: Container(
alignment: Alignment.center,
... ... @@ -107,7 +152,7 @@ class _CustomerListPageState extends State<CustomerListPage>
BorderRadius.circular(ScreenUtil().setWidth(40)),
color: MyColours.color_199095),
child: Text(
'已选[全部]10000位顾客,下发营销任务',
'已选[${customerProvider.labels}]${customerProvider.selectCustomer.length}位顾客,下发营销任务',
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: TextStyle(
... ... @@ -1001,6 +1046,9 @@ class _CustomerListPageState extends State<CustomerListPage>
@override
Widget build(BuildContext context) {
customerProvider = Provider.of<CustomerProvider>(context, listen: true);
customerMakingProvider =
Provider.of<CustomerMakingProvider>(context, listen: true);
return Material(
child: InkWell(
onTap: () {
... ...
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/guest_reserve_model.dart';
import 'package:one_key/provider/customer_provider.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/MyDivider.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/page_exception.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:provider/provider.dart';
class CustomerOrderPage extends StatefulWidget {
CustomerOrderPage({Key key}) : super(key: key);
final String id;
final String phone;
CustomerOrderPage({Key key, this.id, this.phone}) : super(key: key);
@override
_CustomerOrderPageState createState() => _CustomerOrderPageState();
... ... @@ -16,8 +24,30 @@ class CustomerOrderPage extends StatefulWidget {
class _CustomerOrderPageState extends State<CustomerOrderPage> {
int year = DateTime.now().year;
CustomerProvider customerProvider;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
_getGuestReserve();
});
}
_getGuestReserve({bool showLoading = false}) async {
Map<String, String> params = {
"id": widget.id,
"phone": widget.phone,
'year': year.toString()
};
await customerProvider.getGuestReserve(context, params,
showLoading: showLoading);
// await customerProvider.searchData(customerProvider.controller.text);
}
@override
Widget build(BuildContext context) {
customerProvider = Provider.of<CustomerProvider>(context, listen: true);
return Scaffold(
backgroundColor: Color.fromRGBO(246, 248, 250, 1),
appBar: SystemAppBar(
... ... @@ -26,253 +56,157 @@ class _CustomerOrderPageState extends State<CustomerOrderPage> {
Navigator.pop(context);
},
),
body: Padding(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(40)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
InkWell(
onTap: () {
setState(() {
year--;
});
},
child: Image.asset(
Utils.getImgPath('c_arrow_left'),
width: ScreenUtil().setWidth(24),
)),
Padding(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(20)),
child: Text(
'${year}年',
style: TextStyle(
fontSize: ScreenUtil().setSp(34),
color: MyColours.color_333333),
),
),
InkWell(
onTap: () {
if (year >= DateTime.now().year) {
return;
}
setState(() {
year++;
});
},
child: Image.asset(
Utils.getImgPath(year != DateTime.now().year
? 'c_arrow_right'
: 'c_arrow_right_gray'),
width: ScreenUtil().setWidth(24),
))
],
),
VEmptyView(20),
Wrap(
body: Consumer<CustomerProvider>(builder: (context, model, _) {
if (model.pageStateGuestReserve != PageState.Success) {
return ExceptionPage(
pageState: model.pageStateGuestReserve,
callback: () {
model.pageStateGuestReserve = PageState.Loading;
model.notifyListeners();
_getGuestReserve();
},
emptyMsg: "暂时没有客户订单哦",
emptyImg: "empty_search",
showMsg: "加载中,请稍后...",
);
} else {
return Padding(
padding: EdgeInsets.symmetric(
// horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(40)),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'全年累计',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
' 2000 ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_199095),
),
Text(
'单',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(20),
Text(
'全年取消',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
' 2000 ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_199095),
),
Text(
'单',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
],
),
VEmptyView(20),
Wrap(
children: [
Text(
'记录全额订单:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'2000 ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'单',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(20),
Text(
'记录人数订单:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'2000 ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'单',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
],
),
VEmptyView(20),
Wrap(
children: [
Text(
'总消费:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'2000 ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'元',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(20),
Text(
'总人数:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'2000 ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'人',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(20),
Text(
'人均:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'2000 ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'元/人',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
],
),
VEmptyView(20),
MyDivider(
double.infinity,
ScreenUtil().setWidth(1),
color: MyColours.color_E0E0E0,
),
VEmptyView(20),
Expanded(
child: ListView.builder(
shrinkWrap: true,
itemCount: 10,
// controller: controller,
itemBuilder: (BuildContext context, int index) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
Row(
children: [
CircleAvatar(
radius: ScreenUtil().setWidth(10),
backgroundColor: MyColours.color_199095,
InkWell(
onTap: () {
setState(() {
year--;
});
_getGuestReserve(showLoading: true);
},
child: Padding(
padding: EdgeInsets.only(
left: ScreenUtil().setWidth(40),
right: ScreenUtil().setWidth(20)),
child: Image.asset(
Utils.getImgPath('c_arrow_left'),
width: ScreenUtil().setWidth(24),
))),
Text(
'${year}年',
style: TextStyle(
fontSize: ScreenUtil().setSp(34),
color: MyColours.color_333333),
),
HEmptyView(20),
Column(
InkWell(
onTap: () {
if (year >= DateTime.now().year) {
return;
}
setState(() {
year++;
});
_getGuestReserve(showLoading: true);
},
child: Padding(
padding: EdgeInsets.only(
left: ScreenUtil().setWidth(20),
right: ScreenUtil().setWidth(40)),
child: Image.asset(
Utils.getImgPath(year != DateTime.now().year
? 'c_arrow_right'
: 'c_arrow_right_gray'),
width: ScreenUtil().setWidth(24),
)))
],
),
Padding(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
VEmptyView(20),
Wrap(
children: [
Text(
'全年累计',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
' ${customerProvider.guestReserveSunModel.count.cumulative} ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_199095),
),
Text(
'单',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(20),
Text(
'全年取消',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
' ${customerProvider.guestReserveSunModel.count.cancel} ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_199095),
),
Text(
'单',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
],
),
VEmptyView(20),
Wrap(
children: [
Text(
'[已完成]',
'记录全额订单:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(10),
Text(
'42天前',
'${customerProvider.guestReserveSunModel.count.money} ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(10),
Text(
'2021-09-29',
'单',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(20),
Text(
'记录人数订单:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(10),
Text(
'午餐',
'${customerProvider.guestReserveSunModel.count.pnum} ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(10),
Text(
'【201】',
'单',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
... ... @@ -280,29 +214,60 @@ class _CustomerOrderPageState extends State<CustomerOrderPage> {
],
),
VEmptyView(20),
Row(
Wrap(
children: [
Text(
'人数:',
'总消费:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'${customerProvider.guestReserveSunModel.count.countMoney} ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'元',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(20),
Text(
'总人数:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'未记录',
'${customerProvider.guestReserveSunModel.count.countPnum} ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'人',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(20),
Text(
'消费:',
'人均:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'未记录',
'${customerProvider.guestReserveSunModel.count.capita} ',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
'元/人',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
... ... @@ -310,20 +275,112 @@ class _CustomerOrderPageState extends State<CustomerOrderPage> {
],
),
VEmptyView(20),
Text(
'客户经理:xxx 18739837273',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
MyDivider(
double.infinity,
ScreenUtil().setWidth(1),
color: MyColours.color_E0E0E0,
),
VEmptyView(40),
VEmptyView(20),
],
)
],
);
},
))
],
)));
)),
Expanded(
child: ListView.builder(
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
),
shrinkWrap: true,
itemCount:
customerProvider.guestReserveSunModel.list?.length,
// controller: controller,
itemBuilder: (BuildContext context, int index) {
ListData listData =
customerProvider.guestReserveSunModel.list[index];
String tableinfo = listData.tableinfoName != ''
? ' 【${listData.tableinfoName}】'
: '';
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(
top: ScreenUtil().setWidth(6)),
child: CircleAvatar(
radius: ScreenUtil().setWidth(10),
backgroundColor: MyColours.color_199095,
),
),
HEmptyView(20),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
constraints: BoxConstraints(
maxWidth: ScreenUtil.screenWidthDp -
ScreenUtil().setWidth(140)),
child: Text(
'[${listData.statusStr}] ${listData.ddateStr} ${listData.ddateSoltStr}${tableinfo}',
maxLines: 10,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
)),
VEmptyView(20),
Row(
children: [
Text(
'人数:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
listData.actualPum == null
? '未记录'
: listData.actualPum,
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
HEmptyView(20),
Text(
'消费:',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
Text(
listData.conAmount == null
? '未记录'
: listData.conAmount,
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
),
],
),
listData.nickName == null &&
listData.phone == null
? SizedBox()
: Padding(
padding: EdgeInsets.only(
top: ScreenUtil().setWidth(20)),
child: Text(
'客户经理:${listData.nickName == null ? '' : listData.nickName} ${listData.phone == null ? '' : listData.phone}',
style: TextStyle(
fontSize: ScreenUtil().setSp(24),
color: MyColours.color_353535),
)),
VEmptyView(40),
],
)
],
);
},
))
],
));
}
}));
}
}
... ...
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/pages/coupon/coupon_page.dart';
import 'package:one_key/provider/customer_making_provider.dart';
import 'package:one_key/provider/customer_provider.dart';
import 'package:one_key/provider/user_model.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/route/navigator_util.dart';
import 'package:one_key/utils/dialog_util.dart';
import 'package:one_key/utils/utils.dart';
import 'package:one_key/widgets/h_empty_view.dart';
import 'package:one_key/widgets/round_button.dart';
import 'package:one_key/widgets/system_app_bar.dart';
import 'package:one_key/widgets/v_empty_view.dart';
import 'package:provider/provider.dart';
typedef ClickCallback = void Function(dynamic value);
class MakeMarkingPage extends StatefulWidget {
MakeMarkingPage({Key key}) : super(key: key);
final String gid;
MakeMarkingPage({Key key, this.gid}) : super(key: key);
@override
_MakeMarkingPageState createState() => _MakeMarkingPageState();
}
class _MakeMarkingPageState extends State<MakeMarkingPage> {
TextEditingController controller = TextEditingController();
List<String> couponList = [
'98折(ccccckkkkshjhjsjsvc)kkkkkk',
'fffff',
'fffff',
'ffsdfasfaf'
];
int couponSelectIndex = 0;
List<String> couponList = [];
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
FocusNode _focusNode = FocusNode();
bool showDateSelWidget = false;
String limitDate = '';
CustomerProvider customerProvider;
CustomerMakingProvider customerMakingProvider;
@override
void initState() {
... ... @@ -48,6 +51,55 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
// _editingController.text = '';
}
});
WidgetsBinding.instance.addPostFrameCallback((_) async {
_couponNetworkData(isShowLoading: false);
});
}
@override
void dispose() {
super.dispose();
customerMakingProvider.clearData();
}
///消费券
_couponNetworkData({bool isShowLoading = true}) async {
// customerMakingProvider.couponSelectIndex = 0;
Map<String, String> params = {
"uid": Provider.of<UserModel>(context, listen: false).user.openid,
'status': '1'
};
await customerProvider.getCustomerSelectActivityNew(context, params,
isShowLoading: isShowLoading);
//此人已经新建好券
if (customerProvider.couponListSelect.length > 0) {
// couponProvider.initCouponSelect(context);
couponList = [];
for (int i = 0; i < customerProvider.couponListSelect.length; i++) {
couponList.add(customerProvider.couponListSelect[i].aname);
}
customerProvider.notifyListeners();
} else {
//没有新建的优惠券
}
}
_createMarketing() async {
if (customerMakingProvider.controller.text.trim().length == 0) {
Utils.showToast('请输入营销内容');
return;
}
Map<String, String> params = {
"uid": Provider.of<UserModel>(context, listen: false).user.openid,
"gid": widget.gid,
"content": customerMakingProvider.controller.text
};
if (customerMakingProvider.youhui != '选择优惠' &&
customerMakingProvider.isUse) {
params['aid'] =
'${customerProvider.couponListSelect[customerMakingProvider.couponSelectIndex].id}';
}
await customerProvider.createMarketing(context, params);
}
_buttonChoose(String title, ClickCallback callback) {
... ... @@ -72,13 +124,19 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
title,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: title == '时间(选填)' || title == '(选填)'
color: title == '时间(选填)' ||
title == '(选填)' ||
title == '选择优惠' ||
!customerMakingProvider.isUse
? MyColours.color_999999
: MyColours.color_199095,
fontSize: ScreenUtil().setWidth(30)),
)),
HEmptyView(10),
Image.asset(
// Utils.getImgPath(!customerMakingProvider.isUse
// ? 'c_arrow_down_unsel'
// : 'c_arrow_down'),
Utils.getImgPath('c_arrow_down'),
width: ScreenUtil().setWidth(30),
// height: ScreenUtil().setWidth(10),
... ... @@ -106,7 +164,7 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
// )),
// VEmptyView(30),
TextField(
controller: controller,
controller: customerMakingProvider.controller,
// keyboardType: TextInputType.number, //键盘类型,数字键盘
maxLines: 10,
focusNode: _focusNode,
... ... @@ -156,6 +214,8 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
children: [
InkWell(
onTap: () {
customerMakingProvider.controller.text = '';
setState(() {});
// NavigatorUtil.goMarketingRecordsDetailPage(context);
},
child: Padding(
... ... @@ -166,26 +226,34 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
color: MyColours.color_199095,
fontSize: ScreenUtil().setSp(26))),
)),
Text('共 ${controller.text.length} 字 0 条短信',
Text(
'共 ${customerMakingProvider.controller.text.length} 字 ${customerMakingProvider.selectCustomer.length} 条短信',
style: TextStyle(
color: MyColours.color_333333,
fontSize: ScreenUtil().setSp(26))),
],
),
VEmptyView(40),
Row(children: [
Image.asset(
Utils.getImgPath(true ? 'c_mul_select' : 'c_mul_select_un'),
width: ScreenUtil().setWidth(30)),
HEmptyView(15),
Text(
'营销加入优惠',
style: TextStyle(
fontSize: ScreenUtil().setSp(36),
fontWeight: FontWeight.bold,
color: MyColours.color_333333),
),
]),
InkWell(
onTap: () {
customerMakingProvider.isUse = !customerMakingProvider.isUse;
setState(() {});
},
child: Row(children: [
Image.asset(
Utils.getImgPath(customerMakingProvider.isUse
? 'c_mul_select'
: 'c_mul_select_un'),
width: ScreenUtil().setWidth(30)),
HEmptyView(15),
Text(
'营销加入优惠',
style: TextStyle(
fontSize: ScreenUtil().setSp(36),
fontWeight: FontWeight.bold,
color: MyColours.color_333333),
),
])),
VEmptyView(30),
Row(children: [
Expanded(
... ... @@ -197,25 +265,42 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
BorderRadius.circular(ScreenUtil().setWidth(10)),
color: Color.fromRGBO(239, 239, 239, 1)),
child:
_buttonChoose(couponList[couponSelectIndex], (value) {
_buttonChoose(customerMakingProvider.youhui, (value) {
FocusScope.of(context).requestFocus(FocusNode()); //隐藏键盘
if (couponList == null || couponList.length == 0) {
Utils.showToast('暂无优惠券,请创建新优惠');
return;
}
DialogUtil.showSelectCusmanDialog(context, couponList,
(value) {
if (value != null) {
setState(() {
couponSelectIndex = value.first;
customerMakingProvider.couponSelectIndex =
value.first;
customerMakingProvider.youhui = couponList[
customerMakingProvider.couponSelectIndex];
});
}
},
selecteds: couponSelectIndex == null
selecteds: customerMakingProvider
.couponSelectIndex ==
null
? []
: [couponSelectIndex])
: [customerMakingProvider.couponSelectIndex])
.then((value) {});
}))),
HEmptyView(30),
InkWell(
onTap: () {
onTap: () async {
// NavigatorUtil.goMarketingRecordsDetailPage(context);
bool needRefresh =
await NavigatorUtil.goCouponEditPage(context);
print(needRefresh);
if (needRefresh != null && needRefresh) {
//刷新页面数据
// _controller.callRefresh();
_couponNetworkData();
}
},
child: Text('创建新优惠',
style: TextStyle(
... ... @@ -223,85 +308,96 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
color: MyColours.color_199095,
fontSize: ScreenUtil().setSp(26)))),
]),
VEmptyView(30),
Row(children: [
Image.asset(
Utils.getImgPath(true ? 'c_mul_select' : 'c_mul_select_un'),
width: ScreenUtil().setWidth(30)),
HEmptyView(15),
Text(
'客户经理不可修改短信内容',
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
),
]),
VEmptyView(30),
Row(children: [
Image.asset(
Utils.getImgPath(true ? 'c_mul_select' : 'c_mul_select_un'),
width: ScreenUtil().setWidth(30)),
HEmptyView(15),
Text(
'最晚完成期限',
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
),
HEmptyView(15),
InkWell(
onTap: () {
FocusScope.of(context).requestFocus(FocusNode()); //点击空白处隐藏键盘
//弹出时间选择器
// showPickerDateTime(context);
showDateSelWidget = true;
DialogUtil.showPickerDateTime24(
context,
scaffoldKey,
(value) {
// {'text': picker.adapter.text, 'select': selecteds}
if (value != null) {
setState(() {
print(value);
limitDate = DateUtil.formatDateStr(value,
format: DateFormats.full);
});
}
showDateSelWidget = false;
},
dateTime: DateUtil.getDateTime(limitDate),
onCancel: () {
showDateSelWidget = false;
});
},
child: Row(
children: [
Container(
// height: ScreenUtil().setWidth(70),
alignment: Alignment.center,
// width: ScreenUtil().setWidth(280),
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(30)),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Color.fromRGBO(175, 176, 177, 1),
width: ScreenUtil().setWidth(2)))),
child: Text(
limitDate,
customerMakingProvider.fromPage == FromPage.FromPageMyCustomer
? SizedBox()
: Column(
children: [
VEmptyView(30),
Row(children: [
Image.asset(
Utils.getImgPath(
true ? 'c_mul_select' : 'c_mul_select_un'),
width: ScreenUtil().setWidth(30)),
HEmptyView(15),
Text(
'客户经理不可修改短信内容',
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
)),
Image.asset(
Utils.getImgPath('c_arrow_down'),
width: ScreenUtil().setWidth(30),
// height: ScreenUtil().setWidth(10),
)
],
),
),
]),
),
]),
VEmptyView(30),
Row(children: [
Image.asset(
Utils.getImgPath(
true ? 'c_mul_select' : 'c_mul_select_un'),
width: ScreenUtil().setWidth(30)),
HEmptyView(15),
Text(
'最晚完成期限',
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
),
HEmptyView(15),
InkWell(
onTap: () {
FocusScope.of(context)
.requestFocus(FocusNode()); //点击空白处隐藏键盘
//弹出时间选择器
// showPickerDateTime(context);
showDateSelWidget = true;
DialogUtil.showPickerDateTime24(
context,
scaffoldKey,
(value) {
// {'text': picker.adapter.text, 'select': selecteds}
if (value != null) {
setState(() {
print(value);
limitDate = DateUtil.formatDateStr(value,
format: DateFormats.full);
});
}
showDateSelWidget = false;
},
dateTime: DateUtil.getDateTime(limitDate),
onCancel: () {
showDateSelWidget = false;
});
},
child: Row(
children: [
Container(
// height: ScreenUtil().setWidth(70),
alignment: Alignment.center,
// width: ScreenUtil().setWidth(280),
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(30)),
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(
color: Color.fromRGBO(
175, 176, 177, 1),
width: ScreenUtil().setWidth(2)))),
child: Text(
limitDate,
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
)),
Image.asset(
Utils.getImgPath('c_arrow_down'),
width: ScreenUtil().setWidth(30),
// height: ScreenUtil().setWidth(10),
)
],
),
),
]),
VEmptyView(30),
],
)
],
),
);
... ... @@ -309,12 +405,16 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
@override
Widget build(BuildContext context) {
customerProvider = Provider.of<CustomerProvider>(context, listen: true);
customerMakingProvider =
Provider.of<CustomerMakingProvider>(context, listen: true);
return Scaffold(
backgroundColor: Color.fromRGBO(246, 248, 250, 1),
key: scaffoldKey,
appBar: SystemAppBar(
'创建营销任务',
onTap: () {
customerMakingProvider.clearData();
Navigator.pop(context);
},
),
... ... @@ -334,7 +434,7 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
children: [
Expanded(
child: Text(
'已选[沉睡、活跃、流失]100位顾客',
'已选[${customerMakingProvider.labels}]${customerMakingProvider.selectCustomer.length}位顾客',
style: TextStyle(
color: MyColours.color_ffffff,
fontSize: ScreenUtil().setSp(32)),
... ... @@ -342,6 +442,7 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
HEmptyView(10),
InkWell(
onTap: () {
Navigator.pop(context);
// NavigatorUtil.goMarketingRecordsDetailPage(context);
},
child: Text('查看',
... ... @@ -364,7 +465,9 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
),
)),
RoundButton(
text: '确认下发任务',
text: customerMakingProvider.fromPage == FromPage.FromPageMyCustomer
? '群发短信'
: '确认下发任务',
gradientStart: MyColours.color_199095,
gradientEnd: MyColours.color_199095,
// borderColor: MyColours.color_999999,
... ... @@ -376,6 +479,11 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
isBold: false,
onPressed: () {
// NavigatorUtil.goEnterStoreEnvironmentPage(context);
if (customerMakingProvider.fromPage ==
FromPage.FromPageMyCustomer) {
//群发短信
_createMarketing();
}
},
),
VEmptyView(30),
... ... @@ -392,15 +500,8 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
EdgeInsets.symmetric(horizontal: ScreenUtil().setWidth(230)),
isBold: false,
onPressed: () {
// DialogUtil.cupertinoAlertDialog(context,
// title: "取消任务",
// content: "点击确定立即取消任务,已完成的客户经理继续生效",
// lTitle: "返回",
// rTitle: "确定取消", lCallback: () {
// print("返回");
// }, rCallback: () {
// print("确定取消任务");
// });
customerMakingProvider.clearData();
Navigator.pop(context);
},
),
VEmptyView(40),
... ...
import 'package:flutter/material.dart';
import 'package:one_key/constant/state.dart';
class CustomerMakingProvider extends ChangeNotifier {
String labels;
List<String> selectCustomer = [];
TextEditingController controller = TextEditingController();
FromPage fromPage;
int couponSelectIndex = 0;
String youhui = '选择优惠';
bool isUse = true; //营销加入优惠
clearData() {
labels = '';
selectCustomer = [];
controller.text = '';
fromPage = null;
couponSelectIndex = 0;
youhui = '选择优惠';
isUse = true; //营销加入优惠
}
}
... ...
... ... @@ -4,9 +4,11 @@ import 'package:lpinyin/lpinyin.dart';
import 'package:one_key/constant/constant.dart';
import 'package:one_key/constant/error.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/coupon_model.dart';
import 'package:one_key/models/customer_list_model.dart';
import 'package:one_key/models/guest_info_model.dart';
import 'package:one_key/models/guest_manage_model.dart';
import 'package:one_key/models/guest_reserve_model.dart';
import 'package:one_key/models/user_history_entity.dart';
import 'package:one_key/net/base_resp.dart';
import 'package:one_key/net/dio_util.dart';
... ... @@ -31,8 +33,41 @@ class CustomerProvider extends ChangeNotifier {
PageState pageStateChenshui = PageState.Loading;
PageState pageStateLiushi = PageState.Loading;
GuestManageSunModel guestSunmodel;
PageState pageStateGuestInfo = PageState.Loading;
PageState pageStateGuestInfo = PageState.Loading; //客户详情
PageState pageStateGuestReserve = PageState.Loading; //订单统计
GuestInfoSunModel guestInfoSunModel;
GuestReserveSunModel guestReserveSunModel;
List<String> selectCustomer = [];
int index = 0;
bool checkValue = true;
String labels = '';
List<CouponSunModel> couponListSelect = [];
int couponSelectIndex;
///客户经理获取所创建活动列表(选择优惠券)
Future<List<CouponSunModel>> getCustomerSelectActivityNew(
BuildContext context, Map<String, String> params,
{isShowLoading = true}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(context, Method.get, HttpUrl.get_customer_activity,
data: params, showLoading: false)
.catchError((error) {
print(error.toString());
if (error is MyError) {
switch (error.type) {
}
}
});
if (baseResp.code == Constant.status_success) {
couponListSelect = CouponModel.fromJson(baseResp.responseData).data;
notifyListeners();
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
}
return couponListSelect;
}
//用来获取客户列表
getCustomerList(BuildContext context, Map<String, String> params) async {
... ... @@ -117,6 +152,7 @@ class CustomerProvider extends ChangeNotifier {
} else {
pageStateLiushi = PageState.Empty;
}
addAll();
pageState = PageState.Success;
}
notifyListeners();
... ... @@ -220,7 +256,206 @@ class CustomerProvider extends ChangeNotifier {
// }
// }
// 获取客户订单统计
getGuestReserve(BuildContext context, Map<String, String> params,
{bool showLoading = false}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(context, Method.get, HttpUrl.get_guest_reserve,
data: params, showLoading: showLoading)
.catchError((error) {
print(error.toString());
if (error is MyError) {
switch (error.type) {
case 1:
pageStateGuestReserve = PageState.ConnectivityError;
break;
case 2:
pageStateGuestReserve = PageState.ConnectivityTimeOut;
break;
default:
pageStateGuestReserve = PageState.ConnectivityError;
break;
}
}
notifyListeners();
});
if (baseResp != null && baseResp.code == Constant.status_success) {
pageStateGuestReserve = PageState.Success;
guestReserveSunModel =
GuestReserveModel.fromJson(baseResp.responseData).data;
notifyListeners();
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
pageStateGuestReserve = PageState.ConnectivityTimeOut;
}
notifyListeners();
}
// 创建营销
createMarketing(BuildContext context, Map<String, String> params,
{bool showLoading = false}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(context, Method.get, HttpUrl.create_marketing,
data: params, showLoading: showLoading)
.catchError((error) {
print(error.toString());
if (error is MyError) {}
notifyListeners();
});
if (baseResp != null && baseResp.code == Constant.status_success) {
// guestReserveSunModel =
// GuestReserveModel.fromJson(baseResp.responseData).data;
notifyListeners();
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
}
notifyListeners();
}
//修改客户信息
Future<bool> setGuestInfo(BuildContext context, Map<String, String> params,
{bool showLoading = false}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(context, Method.get, HttpUrl.set_guest_info,
data: params, showLoading: showLoading)
.catchError((error) {
print(error.toString());
if (error is MyError) {}
notifyListeners();
});
if (baseResp != null && baseResp.code == Constant.status_success) {
// guestReserveSunModel =
// GuestReserveModel.fromJson(baseResp.responseData).data;
if (baseResp.responseData['data'] == 1 ||
baseResp.responseData['data'] == 0) {
return true;
}
return false;
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
return false;
}
}
//全选按钮执行“全选”
addAll() async {
List<CustomerListSunModel> temp = returnNowList();
//把数据状态全部改成true,即选中状态
selectCustomer = [];
for (var i = 0; i < temp.length; i++) {
temp[i].select = true;
selectCustomer.add(temp[i].id);
}
_giveValue(temp);
checkValue = true;
labelsValue();
notifyListeners();
}
labelsValue() {
List<CustomerListSunModel> temp = returnNowList();
List<String> tempLabel = [];
for (CustomerListSunModel item in temp) {
if (item.select && item.attr != null) {
tempLabel.add(item.attr);
}
}
tempLabel = tempLabel.toSet().toList();
labels = Utils.listToStringEnglish(tempLabel);
}
_giveValue(List<CustomerListSunModel> temp) {
if (index == 0) {
userHistorysShow = temp; //全部
} else if (index == 1) {
userHistorysShowHuoyue = temp; //活跃
} else if (index == 2) {
userHistorysShowChenshui = temp; //沉睡
} else if (index == 3) {
userHistorysShowLiushi = temp; //流失
}
}
///清除选择
clearSelect() {
selectCustomer = [];
labelsValue();
// couponsShow = [];
}
//全选按钮执行“全不选”
cancelAll() async {
List<CustomerListSunModel> temp = returnNowList();
selectCustomer = [];
//把数据状态全部改成false,即不选中状态
for (var i = 0; i < temp.length; i++) {
temp[i].select = false;
}
_giveValue(temp);
checkValue = false;
labelsValue();
notifyListeners();
}
//选中
addData(int index) {
List<CustomerListSunModel> temp = returnNowList();
temp[index].select = true;
_giveValue(temp);
selectCustomer.add(temp[index].id);
labelsValue();
notifyListeners();
}
///返回目前选中的list
List<CustomerListSunModel> returnNowList() {
List<CustomerListSunModel> temp = [];
if (index == 0) {
temp = userHistorysShow; //全部
} else if (index == 1) {
temp = userHistorysShowHuoyue; //活跃
} else if (index == 2) {
temp = userHistorysShowChenshui; //沉睡
} else if (index == 3) {
temp = userHistorysShowLiushi; //流失
}
return temp;
}
//未选中
cancelData(int index) {
List<CustomerListSunModel> temp = returnNowList();
temp[index].select = false;
_giveValue(temp);
selectCustomer.removeWhere((element) => element == temp[index].id);
labelsValue();
notifyListeners();
}
//获取全选按钮的状态 true or false
getCheckValue() {
List<CustomerListSunModel> listData = returnNowList();
bool temp = listData.any((value) {
return value.select == false;
});
if (temp == true) {
checkValue = false;
} else {
checkValue = true;
}
notifyListeners();
}
searchData(String key) {
// userHistorys 接口请求结果
// userHistorysShow 侧边栏功能结果
// 全部,活跃,沉睡,流失的数据是在userHistorysShow 中筛选出来的
if (userHistorys.length > 0) {
if (key == '') {
userHistorysShow = userHistorys;
... ... @@ -258,6 +493,33 @@ class CustomerProvider extends ChangeNotifier {
pageState = PageState.Empty;
notifyListeners();
} else {
userHistorysShowHuoyue = [];
userHistorysShowChenshui = [];
userHistorysShowLiushi = [];
for (CustomerListSunModel item in userHistorysShow) {
if (item.attr == '活跃') {
userHistorysShowHuoyue.add(item);
} else if (item.attr == '沉睡') {
userHistorysShowChenshui.add(item);
} else if (item.attr == '流失') {
userHistorysShowLiushi.add(item);
}
}
if (userHistorysShowHuoyue.length > 0) {
pageStateHuoyue = PageState.Success;
} else {
pageStateHuoyue = PageState.Empty;
}
if (userHistorysShowChenshui.length > 0) {
pageStateChenshui = PageState.Success;
} else {
pageStateChenshui = PageState.Empty;
}
if (userHistorysShowLiushi.length > 0) {
pageStateLiushi = PageState.Success;
} else {
pageStateLiushi = PageState.Empty;
}
pageState = PageState.Success;
}
// if (contactsShow.length == 0) {
... ... @@ -271,6 +533,7 @@ class CustomerProvider extends ChangeNotifier {
}
}
//实时更新右边数据 ABCDEFGHIGK....
handleList(List<CustomerListSunModel> list, {bool needRefresh = false}) {
if (list == null || list.isEmpty) return;
for (int i = 0, length = list.length; i < length; i++) {
... ...
... ... @@ -4,6 +4,7 @@ import 'package:one_key/constant/state.dart';
import 'package:one_key/models/cookbook_model.dart';
import 'package:one_key/models/coupon_model.dart';
import 'package:one_key/models/customer_list_model.dart';
import 'package:one_key/models/guest_info_model.dart';
import 'package:one_key/models/integral_model.dart';
import 'package:one_key/models/notebook.dart';
import 'package:one_key/models/notebook_detail.dart';
... ... @@ -12,6 +13,7 @@ import 'package:one_key/models/sms_info.dart';
import 'package:one_key/models/statics_model.dart';
import 'package:one_key/models/table_list.dart';
import 'package:one_key/models/user_history_entity.dart';
import 'package:one_key/provider/customer_provider.dart';
import 'package:one_key/res/colors.dart';
import 'package:one_key/route/routes.dart';
import 'package:one_key/utils/fluro_convert_utils.dart';
... ... @@ -565,9 +567,9 @@ class NavigatorUtil {
}
/// 创建营销
static Future<dynamic> goMakeMarkingPage(BuildContext context,
static Future<dynamic> goMakeMarkingPage(BuildContext context, String gid,
{replace = false}) {
return _navigateTo(context, "${Routes.make_marketing_page}",
return _navigateTo(context, "${Routes.make_marketing_page}?gid=$gid",
replace: replace);
}
... ... @@ -585,10 +587,13 @@ class NavigatorUtil {
///编辑客户详情
static Future<dynamic> goCustomerDetailEditPage(
BuildContext context, {
BuildContext context,
Guest guest,
FromPage fromPage, {
replace = false,
}) {
return _navigateTo(context, "${Routes.customer_edit_detail_page}",
return _navigateTo(context,
"${Routes.customer_edit_detail_page}?guest=${FluroConvertUtils.object2string(guest)}&fromPage=${FluroConvertUtils.enumToString(fromPage)}",
replace: replace);
}
... ... @@ -603,10 +608,13 @@ class NavigatorUtil {
///客户订单
static Future<dynamic> goCustomerOrderPage(
BuildContext context, {
BuildContext context,
String id,
String phone, {
replace = false,
}) {
return _navigateTo(context, "${Routes.customer_order_page}",
return _navigateTo(
context, "${Routes.customer_order_page}?idstr=${id}&phone=${phone}",
replace: replace);
}
}
... ...
... ... @@ -6,6 +6,7 @@ import 'package:one_key/constant/state.dart';
import 'package:one_key/models/cookbook_model.dart';
import 'package:one_key/models/coupon_model.dart';
import 'package:one_key/models/customer_list_model.dart';
import 'package:one_key/models/guest_info_model.dart';
import 'package:one_key/models/integral_model.dart';
import 'package:one_key/models/notebook_detail.dart';
import 'package:one_key/models/personnel_manage_model.dart';
... ... @@ -890,9 +891,10 @@ var marketingRecordsDetailPageHandle = new Handler(
///创建营销
var makeMarkingPageHandle = new Handler(
handlerFunc: (BuildContext context, Map<dynamic, List<Object>> params) {
// String idstr = params["idstr"].first;
String gid = params["gid"].first;
return ChangeNotifierProvider<CustomerProvider>(
create: (_) => CustomerProvider(), child: MakeMarkingPage());
create: (_) => CustomerProvider(), child: MakeMarkingPage(gid: gid));
});
///客户详情
... ... @@ -917,11 +919,16 @@ var customerDetailPageHandle = new Handler(
var customerDetailEditPageHandle = new Handler(
handlerFunc: (BuildContext context, Map<dynamic, List<Object>> params) {
// String idstr = params["idstr"].first;
// UserHistoryEntity userHistoryEntity = UserHistoryEntity.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(
// params["userHistoryEntity"].first)));
Guest guest = Guest.fromJson(json
.decode(FluroConvertUtils.fluroCnParamsDecode(params["guest"].first)));
FromPage fromPage = FluroConvertUtils.enumFromString<FromPage>(
FromPage.values, params["fromPage"].first);
return ChangeNotifierProvider<CustomerProvider>(
create: (_) => CustomerProvider(), child: CustomerDetailEditPage());
create: (_) => CustomerProvider(),
child: CustomerDetailEditPage(
guest: guest,
fromPage: fromPage,
));
});
///纪念日
... ... @@ -938,10 +945,12 @@ var festivalEditPageHandle = new Handler(
///客户订单
var customerOrderPageHandle = new Handler(
handlerFunc: (BuildContext context, Map<dynamic, List<Object>> params) {
// String idstr = params["idstr"].first;
String idstr = params["idstr"].first;
String phone = params["phone"].first;
// UserHistoryEntity userHistoryEntity = UserHistoryEntity.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(
// params["userHistoryEntity"].first)));
return ChangeNotifierProvider<CustomerProvider>(
create: (_) => CustomerProvider(), child: CustomerOrderPage());
create: (_) => CustomerProvider(),
child: CustomerOrderPage(id: idstr, phone: phone));
});
... ...