Commit ee8fc2d8abb8aa6805f87d71ad2b09efb296399f

Authored by wdn127929
1 parent a19c84af

群发短信 sms

... ... @@ -191,7 +191,7 @@ class DioUtil {
queryParameters: data,
options: _checkOptions(method, options, needHeader: needHeader),
cancelToken: cancelToken);
_printHttpLog(response);
_printHttpLog(response);
String _status;
int _code;
String _msg;
... ...
... ... @@ -182,5 +182,11 @@ class HttpUrl {
"?service=App.GuestManage.CreateMarketing"; // 创建营销
static const String set_guest_info =
"?service=App.GuestManage.SetGuestInfo"; // 修改客户信息
static const String seller_guest_set =
"?service=App.GuestManage.SellerGuestSet"; // 商家修改客情配置
static const String create_label_by_sellerid =
"?service=App.GuestManage.CreateLabelBySellerid"; // 商家创建商家标签
static const String create_marketing_by_seller =
"?service=App.GuestManage.CreateMarketingBySeller"; // 商家创建营销
}
... ...
... ... @@ -496,7 +496,8 @@ class _CustomerDetailPageState extends State<CustomerDetailPage> {
fontSize: 26,
isBold: false,
onPressed: () {
NavigatorUtil.goFestivalEditPage(context);
NavigatorUtil.goFestivalEditPage(context,
customerProvider.guestInfoSunModel.guest);
},
),
],
... ...
... ... @@ -134,15 +134,14 @@ class _CustomerListPageState extends State<CustomerListPage>
onTap: () {
if (customerProvider.selectCustomer == null ||
customerProvider.selectCustomer.length == 0) {
Utils.showToast('请选择顾客');
Utils.showToast('请至少选择1名顾客');
return;
}
customerMakingProvider.labels = customerProvider.labels;
customerMakingProvider.selectCustomer =
customerProvider.selectCustomer;
customerMakingProvider.fromPage = widget.fromPage;
NavigatorUtil.goMakeMarkingPage(context,
Utils.listToStringEnglish(customerProvider.selectCustomer));
NavigatorUtil.goMakeMarkingPage(context);
},
child: Container(
alignment: Alignment.center,
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.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/utils/dialog_util.dart';
import 'package:one_key/utils/utils.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 CustomerSettingPage extends StatefulWidget {
CustomerSettingPage({Key key}) : super(key: key);
... ... @@ -15,6 +18,42 @@ class CustomerSettingPage extends StatefulWidget {
class _CustomerSettingPageState extends State<CustomerSettingPage> {
bool swichState = true;
CustomerProvider customerProvider;
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) async {
// _getContantData();
});
}
///修改客情配置
_sellerGuestSet() async {
Map<String, String> params = {
"sellerid": Provider.of<UserModel>(context, listen: false).user.sellerid,
'is_additional': swichState ? "1" : "0"
};
bool success = await customerProvider.setSellerGuest(context, params);
if (success) {
}
}
///商家创建商家标签
_createLabelBySellerid(String name) async {
Map<String, String> params = {
"sellerid": Provider.of<UserModel>(context, listen: false).user.sellerid,
'label': name
};
bool success =
await customerProvider.createLabelBySellerid(context, params);
if (success) {
//刷新当前标签列表
Utils.showToast('标签添加成功');
//调用获取标签接口
// 。。。。。。
}
}
//构建标签
List<Widget> _buildLabelItem(List<String> data) {
... ... @@ -51,9 +90,11 @@ class _CustomerSettingPageState extends State<CustomerSettingPage> {
hintText: '例:高频客户',
text: '',
lenghtLimit: false,
toast: '请输入标签名称', rCallback: (name) {
toast: '请输入标签名称',
lCallback: () {}, rCallback: (name) {
print(name);
// _addCookbookClass(name, showLoading: true);
_createLabelBySellerid(name);
});
},
child: Container(
... ... @@ -74,6 +115,7 @@ class _CustomerSettingPageState extends State<CustomerSettingPage> {
@override
Widget build(BuildContext context) {
customerProvider = Provider.of<CustomerProvider>(context, listen: true);
return Scaffold(
backgroundColor: Color.fromRGBO(246, 248, 250, 1),
appBar: SystemAppBar(
... ... @@ -95,6 +137,7 @@ class _CustomerSettingPageState extends State<CustomerSettingPage> {
setState(() {
swichState = !swichState;
});
_sellerGuestSet();
},
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
... ...
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.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 FestivalEditPage extends StatefulWidget {
FestivalEditPage({Key key}) : super(key: key);
final Guest guest;
FestivalEditPage({Key key, this.guest}) : super(key: key);
@override
_FestivalEditPageState createState() => _FestivalEditPageState();
}
class _FestivalEditPageState extends State<FestivalEditPage> {
CustomerProvider customerProvider;
_setGuestInfo(String cday) async {
Map<String, String> params = {"id": widget.guest.id, 'c_day': cday};
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);
//刷新当前页? 还没做???????
}
}
@override
Widget build(BuildContext context) {
customerProvider = Provider.of<CustomerProvider>(context, listen: true);
return Scaffold(
backgroundColor: MyColours.color_ffffff,
appBar: SystemAppBar(
... ... @@ -77,7 +101,14 @@ class _FestivalEditPageState extends State<FestivalEditPage> {
height: ScreenUtil().setWidth(80),
fontSize: 26,
isBold: false,
onPressed: () {},
onPressed: () {
DialogUtil.festivalAlertDialog(context, '', 520,
rCallback: (name) {
print(name);
_setGuestInfo(name);
// _addCookbookClass(name, showLoading: true);
});
},
),
VEmptyView(30)
])));
... ...
import 'dart:io';
import 'package:common_utils/common_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/screenutil.dart';
import 'package:flutter_sms/flutter_sms.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/customer_list_model.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';
... ... @@ -15,12 +19,12 @@ 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';
import 'package:sendsms/sendsms.dart';
typedef ClickCallback = void Function(dynamic value);
class MakeMarkingPage extends StatefulWidget {
final String gid;
MakeMarkingPage({Key key, this.gid}) : super(key: key);
MakeMarkingPage({Key key}) : super(key: key);
@override
_MakeMarkingPageState createState() => _MakeMarkingPageState();
... ... @@ -32,13 +36,18 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
final GlobalKey<ScaffoldState> scaffoldKey = GlobalKey<ScaffoldState>();
FocusNode _focusNode = FocusNode();
bool showDateSelWidget = false;
String limitDate = '';
CustomerProvider customerProvider;
CustomerMakingProvider customerMakingProvider;
bool needClear = true;
String gid = '';
String andriodPhone = '';
List<String> iosPhone = [];
@override
void initState() {
super.initState();
_focusNode.addListener(() {
if (_focusNode.hasFocus) {
//有焦点
... ... @@ -52,6 +61,20 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
}
});
WidgetsBinding.instance.addPostFrameCallback((_) async {
for (CustomerListSunModel item in customerMakingProvider.selectCustomer) {
gid += '${item.id},';
if (Platform.isIOS) {
iosPhone.add(item.phone);
} else {
andriodPhone += "${item.phone};";
}
}
if (gid.endsWith(',')) {
gid = gid.substring(0, gid.length - 1);
}
if (!Platform.isIOS && andriodPhone.endsWith(';')) {
andriodPhone = andriodPhone.substring(0, andriodPhone.length - 1);
}
_couponNetworkData(isShowLoading: false);
});
}
... ... @@ -59,7 +82,10 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
@override
void dispose() {
super.dispose();
customerMakingProvider.clearData();
if (needClear) {
customerMakingProvider.clearData();
}
//
}
///消费券
... ... @@ -91,7 +117,7 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
}
Map<String, String> params = {
"uid": Provider.of<UserModel>(context, listen: false).user.openid,
"gid": widget.gid,
"gid": gid,
"content": customerMakingProvider.controller.text
};
if (customerMakingProvider.youhui != '选择优惠' &&
... ... @@ -99,7 +125,74 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
params['aid'] =
'${customerProvider.couponListSelect[customerMakingProvider.couponSelectIndex].id}';
}
await customerProvider.createMarketing(context, params);
await customerProvider.createMarketing(context, params, showLoading: true);
_goSms();
}
/// 商家创建营销
_createMarketingBySeller() async {
if (customerMakingProvider.controller.text.trim().length == 0) {
Utils.showToast('请输入营销内容');
return;
}
Map<String, String> params = {
"uid": Provider.of<UserModel>(context, listen: false).user.openid,
"sellerid": Provider.of<UserModel>(context, listen: false).user.sellerid,
"gid": gid,
"content": customerMakingProvider.controller.text,
'is_update': customerMakingProvider.isUpdate ? '0' : '1'
};
if (customerMakingProvider.youhui != '选择优惠' &&
customerMakingProvider.isUse) {
params['aid'] =
'${customerProvider.couponListSelect[customerMakingProvider.couponSelectIndex].id}';
}
if (customerMakingProvider.isDate) {
if (customerMakingProvider.edate == '' ||
customerMakingProvider.edate == null) {
Utils.showToast('请选择最晚完成期限');
return;
}
params['edate'] = customerMakingProvider.edate;
}
await customerProvider.createMarketingBySeller(context, params,
showLoading: true);
_goSms();
}
_goSms() async {
// DialogUtil.cupertinoAlertDialog(context,
// title: '确认发送', content: '是否确定为当前所选顾客发送该优惠券', lCallback: () {
// print('取消发送');
// }, rCallback: () async {
if (Platform.isIOS) {
// List<String> phoneNumber = ['18161963378', '18729572142', '18765432345'];
String message = "test";
try {
String _result = await sendSMS(message: message, recipients: iosPhone);
print(_result);
} catch (error) {
print(error.toString());
}
} else {
print('确定发送');
// String phoneNumber = "18161963378;18729572142";
String message = "test";
// await Sendsms.onGetPermission();
// if (await Sendsms.hasPermission()) {
await Sendsms.onSendSMS(andriodPhone, message);
}
// }
// SmsModel smsModel = new SmsModel();
// // String sms = await smsModel.getSmsContent(context, params);
// String phoneNumber = "";
// await Sendsms.onSendSMS(phoneNumber, '短信内容');
// });
}
_buttonChoose(String title, ClickCallback callback) {
... ... @@ -313,25 +406,39 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
: 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),
),
]),
InkWell(
onTap: () {
customerMakingProvider.isUpdate =
!customerMakingProvider.isUpdate;
setState(() {});
},
child: Row(children: [
Image.asset(
Utils.getImgPath(customerMakingProvider.isUpdate
? '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)),
InkWell(
onTap: () {
customerMakingProvider.isDate =
!customerMakingProvider.isDate;
setState(() {});
},
child: Image.asset(
Utils.getImgPath(customerMakingProvider.isDate
? 'c_mul_select'
: 'c_mul_select_un'),
width: ScreenUtil().setWidth(30))),
HEmptyView(15),
Text(
'最晚完成期限',
... ... @@ -355,13 +462,15 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
if (value != null) {
setState(() {
print(value);
limitDate = DateUtil.formatDateStr(value,
format: DateFormats.full);
customerMakingProvider.edate =
DateUtil.formatDateStr(value,
format: DateFormats.full);
});
}
showDateSelWidget = false;
},
dateTime: DateUtil.getDateTime(limitDate),
dateTime: DateUtil.getDateTime(
customerMakingProvider.edate),
onCancel: () {
showDateSelWidget = false;
});
... ... @@ -380,12 +489,12 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
color: Color.fromRGBO(
175, 176, 177, 1),
width: ScreenUtil().setWidth(2)))),
child: Text(
limitDate,
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: MyColours.color_333333),
)),
child: Text(customerMakingProvider.edate,
style: TextStyle(
fontSize: ScreenUtil().setSp(26),
color: customerMakingProvider.isDate
? MyColours.color_333333
: MyColours.color_999999))),
Image.asset(
Utils.getImgPath('c_arrow_down'),
width: ScreenUtil().setWidth(30),
... ... @@ -442,6 +551,7 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
HEmptyView(10),
InkWell(
onTap: () {
needClear = false;
Navigator.pop(context);
// NavigatorUtil.goMarketingRecordsDetailPage(context);
},
... ... @@ -483,6 +593,9 @@ class _MakeMarkingPageState extends State<MakeMarkingPage> {
FromPage.FromPageMyCustomer) {
//群发短信
_createMarketing();
} else {
//确认下发任务
_createMarketingBySeller();
}
},
),
... ...
import 'package:flutter/material.dart';
import 'package:one_key/constant/state.dart';
import 'package:one_key/models/customer_list_model.dart';
class CustomerMakingProvider extends ChangeNotifier {
String labels;
List<String> selectCustomer = [];
List<CustomerListSunModel> selectCustomer = [];
TextEditingController controller = TextEditingController();
FromPage fromPage;
int couponSelectIndex = 0;
String youhui = '选择优惠';
bool isUse = true; //营销加入优惠
bool isUpdate = true; //客户经理不可修改短信内容
bool isDate = true; //最晚完成期限
String edate = '';
clearData() {
labels = '';
... ... @@ -18,5 +22,8 @@ class CustomerMakingProvider extends ChangeNotifier {
couponSelectIndex = 0;
youhui = '选择优惠';
isUse = true; //营销加入优惠
isUpdate = true; //客户经理不可修改短信内容
isDate = true; //最晚完成期限
edate = '';
}
}
... ...
... ... @@ -37,7 +37,7 @@ class CustomerProvider extends ChangeNotifier {
PageState pageStateGuestReserve = PageState.Loading; //订单统计
GuestInfoSunModel guestInfoSunModel;
GuestReserveSunModel guestReserveSunModel;
List<String> selectCustomer = [];
List<CustomerListSunModel> selectCustomer = [];
int index = 0;
bool checkValue = true;
String labels = '';
... ... @@ -350,7 +350,7 @@ class CustomerProvider extends ChangeNotifier {
selectCustomer = [];
for (var i = 0; i < temp.length; i++) {
temp[i].select = true;
selectCustomer.add(temp[i].id);
selectCustomer.add(temp[i]);
}
_giveValue(temp);
checkValue = true;
... ... @@ -408,7 +408,7 @@ class CustomerProvider extends ChangeNotifier {
List<CustomerListSunModel> temp = returnNowList();
temp[index].select = true;
_giveValue(temp);
selectCustomer.add(temp[index].id);
selectCustomer.add(temp[index]);
labelsValue();
notifyListeners();
}
... ... @@ -619,4 +619,85 @@ class CustomerProvider extends ChangeNotifier {
}
return guestSunmodel;
}
/** 商家客情 */
//商家修改客情配置
Future<bool> setSellerGuest(BuildContext context, Map<String, String> params,
{bool showLoading = false}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(context, Method.get, HttpUrl.seller_guest_set,
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;
}
}
// 商家创建商家标签
Future<bool> createLabelBySellerid(
BuildContext context, Map<String, String> params,
{bool showLoading = false}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(context, Method.get, HttpUrl.create_label_by_sellerid,
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'] != null &&
baseResp.responseData['data']['id'] != '') {
return true;
}
return false;
} else {
if (baseResp != null) {
Utils.showToast(baseResp.msg ?? "");
}
return false;
}
}
// 商家创建营销
createMarketingBySeller(BuildContext context, Map<String, String> params,
{bool showLoading = false}) async {
BaseResp<dynamic> baseResp = await DioUtil()
.request<dynamic>(
context, Method.get, HttpUrl.create_marketing_by_seller,
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();
}
}
... ...
... ... @@ -567,9 +567,9 @@ class NavigatorUtil {
}
/// 创建营销
static Future<dynamic> goMakeMarkingPage(BuildContext context, String gid,
static Future<dynamic> goMakeMarkingPage(BuildContext context,
{replace = false}) {
return _navigateTo(context, "${Routes.make_marketing_page}?gid=$gid",
return _navigateTo(context, "${Routes.make_marketing_page}",
replace: replace);
}
... ... @@ -599,10 +599,12 @@ class NavigatorUtil {
///纪念日
static Future<dynamic> goFestivalEditPage(
BuildContext context, {
BuildContext context,
Guest guest, {
replace = false,
}) {
return _navigateTo(context, "${Routes.festival_edit_page}",
return _navigateTo(context,
"${Routes.festival_edit_page}?guest=${FluroConvertUtils.object2string(guest)}",
replace: replace);
}
... ...
... ... @@ -891,10 +891,10 @@ var marketingRecordsDetailPageHandle = new Handler(
///创建营销
var makeMarkingPageHandle = new Handler(
handlerFunc: (BuildContext context, Map<dynamic, List<Object>> params) {
String gid = params["gid"].first;
// String gid = params["gid"].first;
return ChangeNotifierProvider<CustomerProvider>(
create: (_) => CustomerProvider(), child: MakeMarkingPage(gid: gid));
create: (_) => CustomerProvider(), child: MakeMarkingPage());
});
///客户详情
... ... @@ -938,8 +938,13 @@ var festivalEditPageHandle = new Handler(
// UserHistoryEntity userHistoryEntity = UserHistoryEntity.fromJson(json.decode(
// FluroConvertUtils.fluroCnParamsDecode(
// params["userHistoryEntity"].first)));
Guest guest = Guest.fromJson(json
.decode(FluroConvertUtils.fluroCnParamsDecode(params["guest"].first)));
return ChangeNotifierProvider<CustomerProvider>(
create: (_) => CustomerProvider(), child: FestivalEditPage());
create: (_) => CustomerProvider(),
child: FestivalEditPage(
guest: guest,
));
});
///客户订单
... ...
... ... @@ -1944,8 +1944,9 @@ class DialogUtil {
daySuffix: "日",
minHour: 00,
maxHour: 23,
yearBegin: 2021,
yearBegin: DateTime.now().year,
yearEnd: 2030,
minValue: DateTime.now(),
value: dateTime),
title: new Text(""),
height: ScreenUtil().setWidth(480),
... ... @@ -2476,25 +2477,23 @@ class DialogUtil {
stateSetter(() {
gongli = !gongli;
});
if (dayStr != '') {
List dayList = updateDay(
gongli,
yearStr == '选填'
? DateTime.now()
.year
.toString()
: yearStr,
monthStr == ''
? DateTime.now()
.month
.toString()
: monthStr);
if (!dayList.contains(dayStr)) {
stateSetter(() {
dayStr = '';
});
}
if (dayStr != '') {
List dayList = updateDay(
gongli,
yearStr == '选填'
? DateTime.now().year.toString()
: yearStr,
monthStr == ''
? DateTime.now()
.month
.toString()
: monthStr);
if (!dayList.contains(dayStr)) {
stateSetter(() {
dayStr = '';
});
}
}
},
child: Container(
padding: EdgeInsets.symmetric(
... ... @@ -2781,8 +2780,26 @@ class DialogUtil {
Utils.showToast('请输入纪念日名称');
return;
}
if (monthStr == '' ||
monthStr == null ||
dayStr == '' ||
dayStr == null) {
Utils.showToast('请输入完整纪念日日期');
return;
}
Navigator.of(context).pop();
rCallback(name);
String str = '';
str += '${name}:';
if (yearStr != '' &&
yearStr != null &&
yearStr != '选填') {
str += '${yearStr}年';
}
str += '${monthStr}月';
str += '${dayStr}日';
str += '(${gongli ? '公历' : '农历'})';
rCallback(str);
},
),
],
... ...