Commit 427a7014ba3e31bba8dd670a929c0840cf2c199d

Authored by wdn127929
2 parents eb6a83f9 cf21e590

Merge branch 'v5.2.2+' into v5.2.1+

@@ -18,19 +18,19 @@ if (flutterRoot == null) { @@ -18,19 +18,19 @@ if (flutterRoot == null) {
18 18
19 19
20 20
21 -def flutterVersionCode = "521" 21 +def flutterVersionCode = "522"
22 if (flutterVersionCode == null) { 22 if (flutterVersionCode == null) {
23 - flutterVersionCode = '521' 23 + flutterVersionCode = '522'
24 24
25 25
26 26
27 } 27 }
28 28
29 29
30 -def flutterVersionName = "5.2.1" 30 +def flutterVersionName = "5.2.2"
31 31
32 if (flutterVersionName == null) { 32 if (flutterVersionName == null) {
33 - flutterVersionName = '5.2.1' 33 + flutterVersionName = '5.2.2'
34 34
35 35
36 } 36 }
@@ -52,6 +52,7 @@ class GetDzSellerConfSunModel { @@ -52,6 +52,7 @@ class GetDzSellerConfSunModel {
52 String isMarketing; 52 String isMarketing;
53 53
54 String saiyouyun; 54 String saiyouyun;
  55 + Bookinginfo bookinginfo;
55 56
56 GetDzSellerConfSunModel( 57 GetDzSellerConfSunModel(
57 {this.id, 58 {this.id,
@@ -75,7 +76,8 @@ class GetDzSellerConfSunModel { @@ -75,7 +76,8 @@ class GetDzSellerConfSunModel {
75 this.isOpenCancel, 76 this.isOpenCancel,
76 this.isNotice, 77 this.isNotice,
77 this.isMarketing, 78 this.isMarketing,
78 - this.saiyouyun}); 79 + this.saiyouyun,
  80 + this.bookinginfo});
79 81
80 GetDzSellerConfSunModel.fromJson(Map<String, dynamic> json) { 82 GetDzSellerConfSunModel.fromJson(Map<String, dynamic> json) {
81 id = json['id']; 83 id = json['id'];
@@ -102,6 +104,9 @@ class GetDzSellerConfSunModel { @@ -102,6 +104,9 @@ class GetDzSellerConfSunModel {
102 isNotice = json['is_seller_notice']; 104 isNotice = json['is_seller_notice'];
103 isMarketing = json['is_seller_marketing']; 105 isMarketing = json['is_seller_marketing'];
104 saiyouyun = json['saiyouyun']; 106 saiyouyun = json['saiyouyun'];
  107 + bookinginfo = json['bookinginfo'] != null
  108 + ? new Bookinginfo.fromJson(json['bookinginfo'])
  109 + : null;
105 } 110 }
106 111
107 Map<String, dynamic> toJson() { 112 Map<String, dynamic> toJson() {
@@ -128,7 +133,35 @@ class GetDzSellerConfSunModel { @@ -128,7 +133,35 @@ class GetDzSellerConfSunModel {
128 data['is_seller_notice'] = this.isNotice; 133 data['is_seller_notice'] = this.isNotice;
129 data['is_seller_marketing'] = this.isMarketing; 134 data['is_seller_marketing'] = this.isMarketing;
130 data['saiyouyun'] = this.saiyouyun; 135 data['saiyouyun'] = this.saiyouyun;
  136 + if (this.bookinginfo != null) {
  137 + data['bookinginfo'] = this.bookinginfo.toJson();
  138 + }
  139 +
  140 + return data;
  141 + }
  142 +}
  143 +
  144 +class Bookinginfo {
  145 + String id;
  146 + String sid;
  147 + String smsCode;
  148 + String content;
131 149
  150 + Bookinginfo({this.id, this.sid, this.smsCode, this.content});
  151 +
  152 + Bookinginfo.fromJson(Map<String, dynamic> json) {
  153 + id = json['id'];
  154 + sid = json['sid'];
  155 + smsCode = json['sms_code'];
  156 + content = json['content'];
  157 + }
  158 +
  159 + Map<String, dynamic> toJson() {
  160 + final Map<String, dynamic> data = new Map<String, dynamic>();
  161 + data['id'] = this.id;
  162 + data['sid'] = this.sid;
  163 + data['sms_code'] = this.smsCode;
  164 + data['content'] = this.content;
132 return data; 165 return data;
133 } 166 }
134 } 167 }
  1 +class SaiYouYunChangeModel {
  2 + int ret;
  3 + List<SaiYouYunChangeSunModel> data;
  4 + String msg;
  5 +
  6 + SaiYouYunChangeModel({this.ret, this.data, this.msg});
  7 +
  8 + SaiYouYunChangeModel.fromJson(Map<String, dynamic> json) {
  9 + ret = json['ret'];
  10 + if (json['data'] != null) {
  11 + data = new List<SaiYouYunChangeSunModel>();
  12 + json['data'].forEach((v) {
  13 + data.add(new SaiYouYunChangeSunModel.fromJson(v));
  14 + });
  15 + }
  16 + msg = json['msg'];
  17 + }
  18 +
  19 + Map<String, dynamic> toJson() {
  20 + final Map<String, dynamic> data = new Map<String, dynamic>();
  21 + data['ret'] = this.ret;
  22 + if (this.data != null) {
  23 + data['data'] = this.data.map((v) => v.toJson()).toList();
  24 + }
  25 + data['msg'] = this.msg;
  26 + return data;
  27 + }
  28 +}
  29 +
  30 +class SaiYouYunChangeSunModel {
  31 + String temp;
  32 + Content content;
  33 + bool select = false;
  34 +
  35 + SaiYouYunChangeSunModel({this.temp, this.content});
  36 +
  37 + SaiYouYunChangeSunModel.fromJson(Map<String, dynamic> json) {
  38 + temp = json['temp'];
  39 + content =
  40 + json['content'] != null ? new Content.fromJson(json['content']) : null;
  41 + }
  42 +
  43 + Map<String, dynamic> toJson() {
  44 + final Map<String, dynamic> data = new Map<String, dynamic>();
  45 + data['temp'] = this.temp;
  46 + if (this.content != null) {
  47 + data['content'] = this.content.toJson();
  48 + }
  49 + return data;
  50 + }
  51 +}
  52 +
  53 +class Content {
  54 + String id;
  55 + String templateCode;
  56 + String templateParam;
  57 + String templateDemo;
  58 + String type;
  59 +
  60 + Content(
  61 + {this.id,
  62 + this.templateCode,
  63 + this.templateParam,
  64 + this.templateDemo,
  65 + this.type});
  66 +
  67 + Content.fromJson(Map<String, dynamic> json) {
  68 + id = json['id'];
  69 + templateCode = json['template_code'];
  70 + templateParam = json['template_param'];
  71 + templateDemo = json['template_demo'];
  72 + type = json['type'];
  73 + }
  74 +
  75 + Map<String, dynamic> toJson() {
  76 + final Map<String, dynamic> data = new Map<String, dynamic>();
  77 + data['id'] = this.id;
  78 + data['template_code'] = this.templateCode;
  79 + data['template_param'] = this.templateParam;
  80 + data['template_demo'] = this.templateDemo;
  81 + data['type'] = this.type;
  82 + return data;
  83 + }
  84 +}
  1 +class SmsChangeFieldModel {
  2 + int ret;
  3 + List<SmsChangeFieldSunModel> data;
  4 + String msg;
  5 +
  6 + SmsChangeFieldModel({this.ret, this.data, this.msg});
  7 +
  8 + SmsChangeFieldModel.fromJson(Map<String, dynamic> json) {
  9 + ret = json['ret'];
  10 + if (json['data'] != null) {
  11 + data = new List<SmsChangeFieldSunModel>();
  12 + json['data'].forEach((v) {
  13 + data.add(new SmsChangeFieldSunModel.fromJson(v));
  14 + });
  15 + }
  16 + msg = json['msg'];
  17 + }
  18 +
  19 + Map<String, dynamic> toJson() {
  20 + final Map<String, dynamic> data = new Map<String, dynamic>();
  21 + data['ret'] = this.ret;
  22 + if (this.data != null) {
  23 + data['data'] = this.data.map((v) => v.toJson()).toList();
  24 + }
  25 + data['msg'] = this.msg;
  26 + return data;
  27 + }
  28 +}
  29 +
  30 +class SmsChangeFieldSunModel {
  31 + String code;
  32 + String name;
  33 + String show;
  34 + int times = 0;
  35 +
  36 + SmsChangeFieldSunModel({this.code, this.name, this.show});
  37 +
  38 + SmsChangeFieldSunModel.fromJson(Map<String, dynamic> json) {
  39 + code = json['code'];
  40 + name = json['name'];
  41 + show = json['show'];
  42 + }
  43 +
  44 + Map<String, dynamic> toJson() {
  45 + final Map<String, dynamic> data = new Map<String, dynamic>();
  46 + data['code'] = this.code;
  47 + data['name'] = this.name;
  48 + data['show'] = this.show;
  49 + return data;
  50 + }
  51 +}
@@ -515,4 +515,15 @@ class HttpUrl { @@ -515,4 +515,15 @@ class HttpUrl {
515 static const String send_intention = 515 static const String send_intention =
516 "?service=App.SaiYouYun.SendIntention"; // 发送意向店铺通知短信 516 "?service=App.SaiYouYun.SendIntention"; // 发送意向店铺通知短信
517 517
  518 + static const String get_sai_you_yun_change_list =
  519 + "?service=App.SaiYouYun.GetSaiYouYunChangeList"; // 获取赛邮云短信可变模板列表
  520 +
  521 + static const String get_sms_change_field =
  522 + "?service=App.SaiYouYun.GetSmsChangeField"; // 获取可变模板允许配置字段
  523 +
  524 +
  525 +
  526 + static const String save_sai_you_yun_change =
  527 + "?service=App.SaiYouYun.SaveSaiYouYunChange"; // 配置可变模板内容
  528 +
518 } 529 }
@@ -38,6 +38,7 @@ class _CustomerNoticeSettingPageState extends State<CustomerNoticeSettingPage> { @@ -38,6 +38,7 @@ class _CustomerNoticeSettingPageState extends State<CustomerNoticeSettingPage> {
38 String themeName = ''; 38 String themeName = '';
39 String previewUrl = ''; //效果预览的图片链接 39 String previewUrl = ''; //效果预览的图片链接
40 String smsTemplate = ''; //短信模版 40 String smsTemplate = ''; //短信模版
  41 + String bookinginfo = ''; //可变模版内容
41 42
42 @override 43 @override
43 void initState() { 44 void initState() {
@@ -62,7 +63,7 @@ class _CustomerNoticeSettingPageState extends State<CustomerNoticeSettingPage> { @@ -62,7 +63,7 @@ class _CustomerNoticeSettingPageState extends State<CustomerNoticeSettingPage> {
62 @override 63 @override
63 void dispose() { 64 void dispose() {
64 bus.off('theme_color_type_name'); 65 bus.off('theme_color_type_name');
65 - bus.off('getDzSellerConf'); 66 + bus.off('getDzSellerConf');
66 super.dispose(); 67 super.dispose();
67 } 68 }
68 69
@@ -85,6 +86,10 @@ class _CustomerNoticeSettingPageState extends State<CustomerNoticeSettingPage> { @@ -85,6 +86,10 @@ class _CustomerNoticeSettingPageState extends State<CustomerNoticeSettingPage> {
85 : false; 86 : false;
86 87
87 smsTemplate = marketingCenterProvider.dzSellerConfModel.saiyouyun ?? ''; 88 smsTemplate = marketingCenterProvider.dzSellerConfModel.saiyouyun ?? '';
  89 + bookinginfo =
  90 + marketingCenterProvider.dzSellerConfModel.bookinginfo == null
  91 + ? ''
  92 + : marketingCenterProvider.dzSellerConfModel.bookinginfo?.content;
88 marketingCenterProvider.pageStateSetting = PageState.Success; 93 marketingCenterProvider.pageStateSetting = PageState.Success;
89 } else { 94 } else {
90 marketingCenterProvider.pageStateSetting = PageState.ConnectivityError; 95 marketingCenterProvider.pageStateSetting = PageState.ConnectivityError;
@@ -447,7 +452,7 @@ class _CustomerNoticeSettingPageState extends State<CustomerNoticeSettingPage> { @@ -447,7 +452,7 @@ class _CustomerNoticeSettingPageState extends State<CustomerNoticeSettingPage> {
447 InkWell( 452 InkWell(
448 onTap: () { 453 onTap: () {
449 NavigatorUtil.goSmsTemplateSettingPage( 454 NavigatorUtil.goSmsTemplateSettingPage(
450 - context, smsTemplate); 455 + context, smsTemplate, bookinginfo);
451 }, 456 },
452 child: Padding( 457 child: Padding(
453 padding: EdgeInsets.only( 458 padding: EdgeInsets.only(
@@ -460,7 +465,7 @@ class _CustomerNoticeSettingPageState extends State<CustomerNoticeSettingPage> { @@ -460,7 +465,7 @@ class _CustomerNoticeSettingPageState extends State<CustomerNoticeSettingPage> {
460 MainAxisAlignment.spaceBetween, 465 MainAxisAlignment.spaceBetween,
461 children: [ 466 children: [
462 Text( 467 Text(
463 - '预订通知短信模板选择', 468 + '预订通知短信模版选择',
464 style: TextStyle( 469 style: TextStyle(
465 color: MyColours.color_515151, 470 color: MyColours.color_515151,
466 fontSize: font(14)), 471 fontSize: font(14)),
@@ -9,6 +9,7 @@ import 'package:one_key/widgets/system_app_bar.dart'; @@ -9,6 +9,7 @@ import 'package:one_key/widgets/system_app_bar.dart';
9 import 'package:one_key/widgets/v_empty_view.dart'; 9 import 'package:one_key/widgets/v_empty_view.dart';
10 import 'package:provider/provider.dart'; 10 import 'package:provider/provider.dart';
11 11
  12 +import '../../../models/sai_you_yun_change_model.dart';
12 import '../../../models/sai_you_yun_model.dart'; 13 import '../../../models/sai_you_yun_model.dart';
13 import '../../../provider/marketing_center_provider.dart'; 14 import '../../../provider/marketing_center_provider.dart';
14 import '../../../utils/event_bus.dart'; 15 import '../../../utils/event_bus.dart';
@@ -21,7 +22,9 @@ import '../../../widgets/round_button.dart'; @@ -21,7 +22,9 @@ import '../../../widgets/round_button.dart';
21 22
22 class SmsTemplateSettingPage extends StatefulWidget { 23 class SmsTemplateSettingPage extends StatefulWidget {
23 final String smsTemplate; 24 final String smsTemplate;
24 - SmsTemplateSettingPage({Key key, this.smsTemplate}) : super(key: key); 25 + final String bookinginfo;
  26 + SmsTemplateSettingPage({Key key, this.smsTemplate, this.bookinginfo})
  27 + : super(key: key);
25 28
26 @override 29 @override
27 _SmsTemplateSettingPageState createState() => _SmsTemplateSettingPageState(); 30 _SmsTemplateSettingPageState createState() => _SmsTemplateSettingPageState();
@@ -40,6 +43,8 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> { @@ -40,6 +43,8 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> {
40 43
41 String smsSelectValue = ''; 44 String smsSelectValue = '';
42 45
  46 + int _cursorPosition = 0;
  47 +
43 @override 48 @override
44 void initState() { 49 void initState() {
45 // TODO: implement initState 50 // TODO: implement initState
@@ -51,6 +56,9 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> { @@ -51,6 +56,9 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> {
51 contentChangeStart = 56 contentChangeStart =
52 '尊敬的贵宾,您好!\n诚挚感谢您选择${Provider.of<UserModel>(context, listen: false).user.sellername}用餐!\n'; 57 '尊敬的贵宾,您好!\n诚挚感谢您选择${Provider.of<UserModel>(context, listen: false).user.sellername}用餐!\n';
53 _getSaiYouYunList(); 58 _getSaiYouYunList();
  59 + // _getSaiYouYunChangeList();
  60 + // _getSmsChangeField();
  61 + _getData();
54 }); 62 });
55 } 63 }
56 64
@@ -69,6 +77,91 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> { @@ -69,6 +77,91 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> {
69 marketingCenterProvider.notifyListeners(); 77 marketingCenterProvider.notifyListeners();
70 } 78 }
71 79
  80 + Future<bool> _getSaiYouYunChangeList() async {
  81 + bool sucess = await marketingCenterProvider.getSaiYouYunChangeList(context);
  82 + if (sucess) {
  83 + if (widget.smsTemplate != null && widget.smsTemplate.length > 0) {
  84 + //默认选中
  85 +
  86 + marketingCenterProvider.saiYouYunchangedData.forEach((element) {
  87 + if (element.temp == widget.smsTemplate) {
  88 + canChange = true;
  89 + element.select = true;
  90 + contentChangeStart = element.content.templateParam;
  91 + // controller.text = element.content;
  92 + }
  93 + });
  94 + }
  95 + setState(() {});
  96 + return true;
  97 + } else {
  98 + return false;
  99 + }
  100 +
  101 + // marketingCenterProvider.notifyListeners();
  102 + }
  103 +
  104 + _getData() async {
  105 + Future.wait<bool>([_getSmsChangeField(), _getSaiYouYunChangeList()])
  106 + .then((results) async {
  107 + print(results[0]);
  108 + if (results[0] && results[1]) {
  109 + //成功
  110 + String temp = widget.bookinginfo;
  111 + marketingCenterProvider.smsChangeFieldData.forEach((element) {
  112 + int count = widget.bookinginfo.split(element.code).length - 1;
  113 +
  114 + element.times = count;
  115 + if (temp.contains(element.code)) {
  116 + temp = temp.replaceAll(element.code, element.show);
  117 + }
  118 + });
  119 + controller.text = temp;
  120 + setState(() {});
  121 + } else {
  122 + // if (!results[0]) {
  123 + // //没有优惠券
  124 + // } else {}
  125 + // if (!results[1]) {
  126 + // //没有营销中心数据
  127 + // } else {}
  128 + setState(() {});
  129 + }
  130 + }).catchError((e) {
  131 + print(e);
  132 + });
  133 + }
  134 +
  135 + /// 获取可变模板允许配置字段
  136 + Future<bool> _getSmsChangeField() async {
  137 + bool suceess = await marketingCenterProvider.getSmsChangeField(context);
  138 + if (suceess) {
  139 + return true;
  140 + } else {
  141 + return false;
  142 + }
  143 + }
  144 +
  145 + ///设置店铺短信可变模版
  146 + Future<bool> _saveSaiYouYunChange(String text,
  147 + {bool isShowLoading = true}) async {
  148 + Map<String, String> params = {
  149 + 'sid': Provider.of<UserModel>(context, listen: false).user.sellerid,
  150 + 'sms_code': smsSelectValue,
  151 + 'bookinginfo': text.startsWith('\n') ? text : '\n' + text,
  152 + };
  153 +
  154 + bool success = await marketingCenterProvider
  155 + .saveSaiYouYunChange(context, params, showLoading: isShowLoading);
  156 + // await _setTempleteSMS();
  157 +
  158 + if (success) {
  159 + await _setTempleteSMS();
  160 + } else {
  161 + return false;
  162 + }
  163 + }
  164 +
72 ///设置店铺短信固定模版 165 ///设置店铺短信固定模版
73 Future<bool> _setTempleteSMS({bool isShowLoading = true}) async { 166 Future<bool> _setTempleteSMS({bool isShowLoading = true}) async {
74 Map<String, String> params = { 167 Map<String, String> params = {
@@ -94,46 +187,95 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> { @@ -94,46 +187,95 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> {
94 List<Widget> data = []; 187 List<Widget> data = [];
95 for (var i = 0; i < temData.length; i++) { 188 for (var i = 0; i < temData.length; i++) {
96 data.add(btnItem(temData[i].temp, temData[i].select, onTap: () { 189 data.add(btnItem(temData[i].temp, temData[i].select, onTap: () {
97 - if (title == '固定模版') {  
98 - canChange = false;  
99 - marketingCenterProvider.saiYouYunFixedData.forEach((element) {  
100 - element.select = false;  
101 - });  
102 - // i 的select = true;  
103 - temData[i].select = true;  
104 - smsSelectValue = temData[i].temp;  
105 - controller.text = temData[i].content;  
106 - marketingCenterProvider.saiYouYunchangedData.forEach((element) {  
107 - element.select = false;  
108 - });  
109 - } else {  
110 - canChange = true;  
111 - marketingCenterProvider.saiYouYunchangedData.forEach((element) {  
112 - element.select = false;  
113 - });  
114 - // i 的select = true;  
115 - temData[i].select = true;  
116 - smsSelectValue = temData[i].temp;  
117 - controller.text = temData[i].content;  
118 - marketingCenterProvider.saiYouYunFixedData.forEach((element) {  
119 - element.select = false;  
120 - });  
121 - } 190 + // if (title == '固定模版') {
  191 + canChange = false;
  192 + marketingCenterProvider.saiYouYunFixedData.forEach((element) {
  193 + element.select = false;
  194 + });
  195 + // i 的select = true;
  196 + temData[i].select = true;
  197 + smsSelectValue = temData[i].temp;
  198 + controller.text = temData[i].content;
  199 + marketingCenterProvider.saiYouYunchangedData.forEach((element) {
  200 + element.select = false;
  201 + });
  202 + // } else {
  203 + // canChange = true;
  204 + // marketingCenterProvider.saiYouYunchangedData.forEach((element) {
  205 + // element.select = false;
  206 + // });
  207 + // // i 的select = true;
  208 + // temData[i].select = true;
  209 + // smsSelectValue = temData[i].temp;
  210 + // controller.text = temData[i].content;
  211 + // marketingCenterProvider.saiYouYunFixedData.forEach((element) {
  212 + // element.select = false;
  213 + // });
  214 + // }
122 setState(() {}); 215 setState(() {});
123 })); 216 }));
124 } 217 }
125 return data; 218 return data;
126 } 219 }
127 220
128 - List<Widget> btnWidgets(List<String> temData) { 221 + List<Widget> templateChangesWidgets(
  222 + String title, List<SaiYouYunChangeSunModel> temData) {
129 List<Widget> data = []; 223 List<Widget> data = [];
130 for (var i = 0; i < temData.length; i++) { 224 for (var i = 0; i < temData.length; i++) {
131 - data.add(btnItem(temData[i], true, onTap: () {  
132 - // setState(() {  
133 - // contentChangeStart += temData[i] + '\n';  
134 - // }); 225 + data.add(btnItem(temData[i].temp, temData[i].select, onTap: () {
  226 + if (!canChange) {
  227 + //从固定模版变更过来的,清空文本框内容
  228 + controller.text = '';
  229 + }
  230 + canChange = true;
  231 + marketingCenterProvider.saiYouYunchangedData.forEach((element) {
  232 + element.select = false;
  233 + });
  234 + // i 的select = true;
  235 + contentChangeStart = temData[i].content.templateParam;
  236 + temData[i].select = true;
  237 + smsSelectValue = temData[i].temp;
  238 +
  239 + // controller.text = temData[i].content.templateCode;
  240 + marketingCenterProvider.saiYouYunFixedData.forEach((element) {
  241 + element.select = false;
  242 + });
135 243
136 - // 在光标出插入内容 244 + setState(() {});
  245 + }));
  246 + }
  247 + return data;
  248 + }
  249 +
  250 + List<Widget> btnWidgets() {
  251 + List<Widget> data = [];
  252 + for (var i = 0;
  253 + i < marketingCenterProvider.smsChangeFieldData.length;
  254 + i++) {
  255 + data.add(btnItem(marketingCenterProvider.smsChangeFieldData[i].name, true,
  256 + onTap: () {
  257 + marketingCenterProvider.smsChangeFieldData[i].times++;
  258 + print(controller.text);
  259 +
  260 + // 获取当前光标位置
  261 + int cursorPosition = _cursorPosition;
  262 +
  263 + // 插入文本
  264 + controller.text = controller.text.substring(0, cursorPosition) +
  265 + marketingCenterProvider.smsChangeFieldData[i].show +
  266 + controller.text.substring(cursorPosition);
  267 +
  268 + print(controller.text);
  269 +
  270 + // 设置新的光标位置
  271 + controller.selection = TextSelection.fromPosition(TextPosition(
  272 + offset: cursorPosition +
  273 + marketingCenterProvider.smsChangeFieldData[i].show.length,
  274 + affinity: TextAffinity.downstream));
  275 + setState(() {
  276 + _cursorPosition = controller.selection.baseOffset;
  277 + // cursorPosition = _cursorPosition;
  278 + });
137 })); 279 }));
138 } 280 }
139 return data; 281 return data;
@@ -174,11 +316,11 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> { @@ -174,11 +316,11 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> {
174 child: Wrap( 316 child: Wrap(
175 spacing: w(5), 317 spacing: w(5),
176 runSpacing: w(5), 318 runSpacing: w(5),
177 - children: templateWidgets(  
178 - title,  
179 - title == '固定模版'  
180 - ? marketingCenterProvider.saiYouYunFixedData  
181 - : marketingCenterProvider.saiYouYunchangedData), 319 + children: title == '固定模版'
  320 + ? templateWidgets(
  321 + title, marketingCenterProvider.saiYouYunFixedData)
  322 + : templateChangesWidgets(
  323 + title, marketingCenterProvider.saiYouYunchangedData),
182 )) 324 ))
183 ], 325 ],
184 ), 326 ),
@@ -191,7 +333,7 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> { @@ -191,7 +333,7 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> {
191 Provider.of<MarketingCenterProvider>(context, listen: true); 333 Provider.of<MarketingCenterProvider>(context, listen: true);
192 return Scaffold( 334 return Scaffold(
193 backgroundColor: MyColours.color_ffffff, 335 backgroundColor: MyColours.color_ffffff,
194 - appBar: SystemAppBar('预订通知短信模板选择'), 336 + appBar: SystemAppBar('预订通知短信模版选择'),
195 body: Column( 337 body: Column(
196 children: [ 338 children: [
197 Expanded( 339 Expanded(
@@ -200,7 +342,7 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> { @@ -200,7 +342,7 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> {
200 crossAxisAlignment: CrossAxisAlignment.start, 342 crossAxisAlignment: CrossAxisAlignment.start,
201 children: [ 343 children: [
202 _templeteWidget('固定模版'), 344 _templeteWidget('固定模版'),
203 - // _templeteWidget('可变模版'), 345 + _templeteWidget('可变模版'),
204 VEmptyView(10), 346 VEmptyView(10),
205 Container( 347 Container(
206 width: double.infinity, 348 width: double.infinity,
@@ -255,7 +397,19 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> { @@ -255,7 +397,19 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> {
255 ), 397 ),
256 contentPadding: EdgeInsets.zero, 398 contentPadding: EdgeInsets.zero,
257 ), 399 ),
258 - onChanged: (value) {}, 400 + onChanged: (value) {
  401 + //添加的代码:光标一直在文本框后面
  402 + // controller.value = TextEditingValue(
  403 + // text: controller.text,
  404 + // selection:
  405 + // TextSelection.fromPosition(TextPosition(
  406 + // affinity: TextAffinity.downstream,
  407 + // offset: controller.text.length,
  408 + // )));
  409 + setState(() {
  410 + _cursorPosition = controller.selection.baseOffset;
  411 + });
  412 + },
259 onEditingComplete: () { 413 onEditingComplete: () {
260 FocusScope.of(context) 414 FocusScope.of(context)
261 .requestFocus(FocusNode()); //点击空白处隐藏键盘 415 .requestFocus(FocusNode()); //点击空白处隐藏键盘
@@ -273,7 +427,7 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> { @@ -273,7 +427,7 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> {
273 crossAxisAlignment: WrapCrossAlignment.start, 427 crossAxisAlignment: WrapCrossAlignment.start,
274 spacing: w(10), 428 spacing: w(10),
275 runSpacing: w(10), 429 runSpacing: w(10),
276 - children: btnWidgets(btnData), 430 + children: btnWidgets(),
277 )) 431 ))
278 ], 432 ],
279 ), 433 ),
@@ -336,7 +490,45 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> { @@ -336,7 +490,45 @@ class _SmsTemplateSettingPageState extends State<SmsTemplateSettingPage> {
336 Utils.showToast('请选择模版类型'); 490 Utils.showToast('请选择模版类型');
337 return; 491 return;
338 } 492 }
339 - _setTempleteSMS(); 493 + if (canChange) {
  494 + if (controller.text.trim().length == 0) {
  495 + Utils.showToast('请输入内容后保存');
  496 + return;
  497 + }
  498 +
  499 + bool canRequest = marketingCenterProvider
  500 + .smsChangeFieldData
  501 + .every((element) {
  502 + if (element.times > 0) {
  503 + int count =
  504 + controller.text.split(element.show).length -
  505 + 1;
  506 +
  507 + if (count != element.times) {
  508 + Utils.showToast('${element.show}不符合规范,请检查');
  509 +
  510 + return false;
  511 + }
  512 + }
  513 + return true;
  514 + });
  515 +
  516 + if (canRequest) {
  517 + String tempStr = controller.text;
  518 + marketingCenterProvider.smsChangeFieldData
  519 + .forEach((element) {
  520 + if (tempStr.contains(element.show)) {
  521 + tempStr = tempStr.replaceAll(
  522 + element.show, element.code);
  523 + }
  524 + });
  525 +
  526 + _saveSaiYouYunChange(tempStr);
  527 + }
  528 + print('fffff');
  529 + } else {
  530 + _setTempleteSMS();
  531 + }
340 }, 532 },
341 ), 533 ),
342 ) 534 )
@@ -9,8 +9,10 @@ import '../constant/error.dart'; @@ -9,8 +9,10 @@ import '../constant/error.dart';
9 import '../models/GetDzSellerConfModel.dart'; 9 import '../models/GetDzSellerConfModel.dart';
10 import '../models/mark_data_model.dart'; 10 import '../models/mark_data_model.dart';
11 import '../models/recharge_notice_model.dart'; 11 import '../models/recharge_notice_model.dart';
  12 +import '../models/sai_you_yun_change_model.dart';
12 import '../models/sai_you_yun_model.dart'; 13 import '../models/sai_you_yun_model.dart';
13 import '../models/seller_template_color_list_model.dart'; 14 import '../models/seller_template_color_list_model.dart';
  15 +import '../models/sms_change_field_model.dart';
14 import '../models/tableOuter.dart'; 16 import '../models/tableOuter.dart';
15 import '../net/base_resp.dart'; 17 import '../net/base_resp.dart';
16 import '../net/dio_util.dart'; 18 import '../net/dio_util.dart';
@@ -44,7 +46,9 @@ class MarketingCenterProvider extends ChangeNotifier { @@ -44,7 +46,9 @@ class MarketingCenterProvider extends ChangeNotifier {
44 List<SellerTemplateColorListSunModel> templeteDatas = []; //后台配置的模版数据 46 List<SellerTemplateColorListSunModel> templeteDatas = []; //后台配置的模版数据
45 47
46 List<SaiYouYunSunModel> saiYouYunFixedData = []; //塞邮云固定模版数据 48 List<SaiYouYunSunModel> saiYouYunFixedData = []; //塞邮云固定模版数据
47 - List<SaiYouYunSunModel> saiYouYunchangedData = []; //塞邮云固定模版数据 49 + List<SaiYouYunChangeSunModel> saiYouYunchangedData = []; //塞邮云可变模版数据
  50 +
  51 + List<SmsChangeFieldSunModel> smsChangeFieldData = []; // 获取可变模板允许配置字段
48 52
49 // 获取赛邮云短信模板列表 (固定模版) 53 // 获取赛邮云短信模板列表 (固定模版)
50 54
@@ -74,6 +78,65 @@ class MarketingCenterProvider extends ChangeNotifier { @@ -74,6 +78,65 @@ class MarketingCenterProvider extends ChangeNotifier {
74 return false; 78 return false;
75 } 79 }
76 80
  81 + // 获取赛邮云短信模板列表 (可变模版)
  82 +
  83 + Future<bool> getSaiYouYunChangeList(BuildContext context,
  84 + {bool showLoading = true}) async {
  85 + Map<String, String> params = {
  86 + 'sid': Provider.of<UserModel>(context, listen: false).user.sellerid
  87 + };
  88 + BaseResp<dynamic> baseResp = await DioUtil()
  89 + .request<dynamic>(
  90 + context, Method.get, HttpUrl.get_sai_you_yun_change_list,
  91 + data: params, showLoading: showLoading)
  92 + .catchError((error) {
  93 + print(error.toString());
  94 + Utils.showToast('请求失败,请重试');
  95 + return false;
  96 + });
  97 + if (baseResp.code == Constant.status_success) {
  98 + saiYouYunchangedData =
  99 + SaiYouYunChangeModel.fromJson(baseResp.responseData).data;
  100 + // if (saiYouYunFixedData.length > 0) {
  101 + // saiYouYunFixedData[0].select = true;
  102 + // }
  103 + // notifyListeners();
  104 + return true;
  105 + } else {
  106 + Utils.showToast(baseResp.msg ?? '请求失败,请重试');
  107 + }
  108 + return false;
  109 + }
  110 +
  111 + // 获取可变模板允许配置字段
  112 +
  113 + Future<bool> getSmsChangeField(BuildContext context,
  114 + {bool showLoading = true}) async {
  115 + // Map<String, String> params = {
  116 + // 'sid': Provider.of<UserModel>(context, listen: false).user.sellerid
  117 + // };
  118 + BaseResp<dynamic> baseResp = await DioUtil()
  119 + .request<dynamic>(context, Method.get, HttpUrl.get_sms_change_field,
  120 + showLoading: showLoading)
  121 + .catchError((error) {
  122 + print(error.toString());
  123 + Utils.showToast('请求失败,请重试');
  124 + return false;
  125 + });
  126 + if (baseResp.code == Constant.status_success) {
  127 + smsChangeFieldData =
  128 + SmsChangeFieldModel.fromJson(baseResp.responseData).data;
  129 + // if (saiYouYunFixedData.length > 0) {
  130 + // saiYouYunFixedData[0].select = true;
  131 + // }
  132 + // notifyListeners();
  133 + return true;
  134 + } else {
  135 + Utils.showToast(baseResp.msg ?? '请求失败,请重试');
  136 + }
  137 + return false;
  138 + }
  139 +
77 //获取桌位列表 140 //获取桌位列表
78 getTableList(context, {needLoading = true}) async { 141 getTableList(context, {needLoading = true}) async {
79 UserModel userModel = Provider.of<UserModel>(context, listen: false); 142 UserModel userModel = Provider.of<UserModel>(context, listen: false);
@@ -160,6 +223,30 @@ class MarketingCenterProvider extends ChangeNotifier { @@ -160,6 +223,30 @@ class MarketingCenterProvider extends ChangeNotifier {
160 return false; 223 return false;
161 } 224 }
162 225
  226 + // 配置可变模板内容
  227 + Future<bool> saveSaiYouYunChange(
  228 + BuildContext context, Map<String, String> params,
  229 + {bool showLoading = true}) async {
  230 + BaseResp<dynamic> baseResp = await DioUtil()
  231 + .request<dynamic>(context, Method.get, HttpUrl.save_sai_you_yun_change,
  232 + data: params, showLoading: showLoading)
  233 + .catchError((error) {
  234 + print(error.toString());
  235 + Utils.showToast('配置可变模板内容失败,请重试');
  236 + return false;
  237 + });
  238 + if (baseResp.code == Constant.status_success) {
  239 + // if (baseResp.data == 0 || baseResp.data == 1) {
  240 + return true;
  241 + // } else {
  242 + // Utils.showToast('配置可变模板内容失败,请重试');
  243 + // }
  244 + } else {
  245 + Utils.showToast(baseResp.msg ?? '商配置可变模板内容失败,请重试');
  246 + }
  247 + return false;
  248 + }
  249 +
163 // 设置订座商家配置信息 250 // 设置订座商家配置信息
164 Future<bool> setConfing(BuildContext context, Map<String, String> params, 251 Future<bool> setConfing(BuildContext context, Map<String, String> params,
165 {bool showLoading = true, bool needToast = true}) async { 252 {bool showLoading = true, bool needToast = true}) async {
@@ -1893,14 +1893,15 @@ class NavigatorUtil { @@ -1893,14 +1893,15 @@ class NavigatorUtil {
1893 replace: replace); 1893 replace: replace);
1894 } 1894 }
1895 1895
1896 - ///预订通知短信模板选择 1896 + ///预订通知短信模版选择
1897 static Future<dynamic> goSmsTemplateSettingPage( 1897 static Future<dynamic> goSmsTemplateSettingPage(
1898 BuildContext context, 1898 BuildContext context,
1899 - String smsTemplate, { 1899 + String smsTemplate,
  1900 + String bookinginfo, {
1900 replace = false, 1901 replace = false,
1901 }) { 1902 }) {
1902 return _navigateTo(context, 1903 return _navigateTo(context,
1903 - "${Routes.sms_template_setting_page}?smsTemplate=${Uri.encodeComponent(smsTemplate)}", 1904 + "${Routes.sms_template_setting_page}?smsTemplate=${Uri.encodeComponent(smsTemplate)}&bookinginfo=${Uri.encodeComponent(bookinginfo)}",
1904 replace: replace); 1905 replace: replace);
1905 } 1906 }
1906 1907
@@ -3228,15 +3228,16 @@ var exportBookDataPageHandle = new Handler( @@ -3228,15 +3228,16 @@ var exportBookDataPageHandle = new Handler(
3228 create: (_) => CustomerProvider(), child: ExportBookDataPage()); 3228 create: (_) => CustomerProvider(), child: ExportBookDataPage());
3229 }); 3229 });
3230 3230
3231 -//预订通知短信模板选择 3231 +//预订通知短信模版选择
3232 3232
3233 var smsTemplateSettingPageHandle = new Handler( 3233 var smsTemplateSettingPageHandle = new Handler(
3234 handlerFunc: (BuildContext context, Map<String, List<Object>> params) { 3234 handlerFunc: (BuildContext context, Map<String, List<Object>> params) {
3235 // String rid = params["rid"].first; 3235 // String rid = params["rid"].first;
3236 String smsTemplate = params["smsTemplate"].first; 3236 String smsTemplate = params["smsTemplate"].first;
  3237 + String bookinginfo = params["bookinginfo"].first;
3237 return ChangeNotifierProvider<MarketingCenterProvider>( 3238 return ChangeNotifierProvider<MarketingCenterProvider>(
3238 create: (_) => MarketingCenterProvider(), 3239 create: (_) => MarketingCenterProvider(),
3239 - child: SmsTemplateSettingPage(smsTemplate: smsTemplate)); 3240 + child: SmsTemplateSettingPage(smsTemplate: smsTemplate,bookinginfo:bookinginfo));
3240 }); 3241 });
3241 3242
3242 //优惠券海报 3243 //优惠券海报