Commit 9a6b91e31de29c1a12245dea3737ed09c72166b5

Authored by weixin_45529955
1 parent 2e973e78

语音播报修复

Showing 28 changed files with 334 additions and 237 deletions
... ... @@ -355,14 +355,10 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
... ... @@ -376,14 +372,10 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
... ... @@ -535,7 +527,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 703;
CURRENT_PROJECT_VERSION = 7100;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
... ... @@ -545,7 +537,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 7.0.3;
MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
... ... @@ -720,7 +712,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 703;
CURRENT_PROJECT_VERSION = 7100;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
... ... @@ -730,7 +722,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 7.0.3;
MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
... ... @@ -748,7 +740,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 703;
CURRENT_PROJECT_VERSION = 7100;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
... ... @@ -758,7 +750,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 7.0.3;
MARKETING_VERSION = 7.1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.naji.reserveLine;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
... ...
{
"images" : [
{
"filename" : "40.jpg",
"filename" : "40.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "60.jpg",
"filename" : "60.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"filename" : "29.jpg",
"filename" : "29.png",
"idiom" : "iphone",
"scale" : "1x",
"size" : "29x29"
},
{
"filename" : "58.jpg",
"filename" : "58.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "87.jpg",
"filename" : "87.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"filename" : "80 1.jpg",
"filename" : "80 1.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "120 1.jpg",
"filename" : "120 1.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"filename" : "120.jpg",
"filename" : "120.png",
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"filename" : "180.jpg",
"filename" : "180.png",
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"filename" : "20 1.jpg",
"filename" : "20 1.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"filename" : "40 1.jpg",
"filename" : "40 1.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"filename" : "29 1.jpg",
"filename" : "29 1.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"filename" : "58 1.jpg",
"filename" : "58 1.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"filename" : "40 2.jpg",
"filename" : "40 2.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"filename" : "80 2.jpg",
"filename" : "80 2.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"filename" : "76.jpg",
"filename" : "76.png",
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"filename" : "152.jpg",
"filename" : "152.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
"filename" : "167.jpg",
"filename" : "167.png",
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"filename" : "1024.jpg",
"filename" : "1024.png",
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
... ...

68 Bytes | W: | H:

8.61 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
... ... @@ -10,10 +10,10 @@ class Constant {
*
* 测试账号变更,已经删除0001 账户 代替为 0019!!!!!!!注意!!!!!!!!!!!!!!
* */
static const WXMiniProgramType wxMiniProgramType =
WXMiniProgramType.release; //正式版
// static const WXMiniProgramType wxMiniProgramType =
// WXMiniProgramType.preview; //体验版
// WXMiniProgramType.release; //正式版
static const WXMiniProgramType wxMiniProgramType =
WXMiniProgramType.preview; //体验版
// static const WXMiniProgramType wxMiniProgramType =
// WXMiniProgramType.test; //开发版
... ...
... ... @@ -511,6 +511,8 @@ class HttpUrl {
"?service=App.Seller.GetVoiceWelcomeConfig"; //获取商家语音欢迎致辞配置
static const String save_voice_welcome_config =
"?service=App.Seller.SaveVoiceWelcomeConfig"; //保存商家语音欢迎致辞配置
static const String get_voice_welcome_placeholder_buttons =
"?service=App.Seller.GetVoiceWelcomePlaceholderButtons"; //获取商家语音欢迎致辞配置占位符信息
static const String set_reserve_deposit =
"?service=App.Reserve.SetReserveDeposit"; // 取消订单设置订金走向
... ...
... ... @@ -19,7 +19,7 @@ import 'package:provider/provider.dart';
import '../../../../constant/state.dart';
import '../../../../models/get_seller_info_model.dart';
import '../../../../models/mark_data_model.dart';
import '../../../../models/sms_change_field_model.dart';
// import '../../../../models/sms_change_field_model.dart'; //附加语音欢迎致辞:暂时屏蔽
import '../../../../models/upload_img_model.dart';
import '../../../../provider/base_info_provider.dart';
import '../../../../provider/marketing_center_provider.dart';
... ... @@ -72,8 +72,9 @@ class _BookInfoPageState extends State<BookInfoPage> {
TextEditingController bookingIncoC = TextEditingController();
FocusNode bookingIncoNode = FocusNode();
TextEditingController voiceIncoC = TextEditingController();
FocusNode voiceIncoNode = FocusNode();
//附加语音欢迎致辞:暂时屏蔽
// TextEditingController voiceIncoC = TextEditingController();
// FocusNode voiceIncoNode = FocusNode();
String? date; //日期
String? dsolt; //餐段
... ... @@ -91,7 +92,7 @@ class _BookInfoPageState extends State<BookInfoPage> {
// bool addParking = false;
bool addPhone = true;
bool addBookingInfo = false; //预订信息致辞
bool addVoiceInfo = false; //附加语音欢迎致辞
// bool addVoiceInfo = false; //附加语音欢迎致辞
bool addCutomer = false; //附加预订客人信息(已录入客户姓名)
bool addFirstImage = false; //附加餐厅首图
... ... @@ -111,7 +112,7 @@ class _BookInfoPageState extends State<BookInfoPage> {
final picker = ImagePicker();
late UploadImageProvider _uploadImageProvider;
List<SmsChangeFieldSunModel> changeFieldData = []; //
// List<SmsChangeFieldSunModel> changeFieldData = []; //
// List<ChangeModel> data = []; //停车信息图片
List<String?> imgAll = [];
... ... @@ -120,55 +121,49 @@ class _BookInfoPageState extends State<BookInfoPage> {
void initState() {
super.initState();
SmsChangeFieldSunModel smsChangeFieldSunModel1 = SmsChangeFieldSunModel();
smsChangeFieldSunModel1.name = '年月日';
smsChangeFieldSunModel1.show = '{年月日}';
changeFieldData.add(smsChangeFieldSunModel1);
SmsChangeFieldSunModel smsChangeFieldSunModel2 = SmsChangeFieldSunModel();
smsChangeFieldSunModel2.name = '月日';
smsChangeFieldSunModel2.show = '{月日}';
changeFieldData.add(smsChangeFieldSunModel2);
SmsChangeFieldSunModel smsChangeFieldSunModel3 = SmsChangeFieldSunModel();
smsChangeFieldSunModel3.name = '餐段';
smsChangeFieldSunModel3.show = '{餐段}';
changeFieldData.add(smsChangeFieldSunModel3);
SmsChangeFieldSunModel smsChangeFieldSunModel4 = SmsChangeFieldSunModel();
smsChangeFieldSunModel4.name = '就餐时间';
smsChangeFieldSunModel4.show = '{就餐时间}';
changeFieldData.add(smsChangeFieldSunModel4);
SmsChangeFieldSunModel smsChangeFieldSunModel5 = SmsChangeFieldSunModel();
smsChangeFieldSunModel5.name = '包间名';
smsChangeFieldSunModel5.show = '{包间名}';
changeFieldData.add(smsChangeFieldSunModel5);
SmsChangeFieldSunModel smsChangeFieldSunModel6 = SmsChangeFieldSunModel();
smsChangeFieldSunModel6.name = '区域名+包间名';
smsChangeFieldSunModel6.show = '{区域名+包间名}';
changeFieldData.add(smsChangeFieldSunModel6);
SmsChangeFieldSunModel smsChangeFieldSunModel7 = SmsChangeFieldSunModel();
smsChangeFieldSunModel7.name = '经理名字';
smsChangeFieldSunModel7.show = '{经理名字}';
changeFieldData.add(smsChangeFieldSunModel7);
SmsChangeFieldSunModel smsChangeFieldSunModel8 = SmsChangeFieldSunModel();
smsChangeFieldSunModel8.name = '客人姓名';
smsChangeFieldSunModel8.show = '{客人姓名}';
changeFieldData.add(smsChangeFieldSunModel8);
SmsChangeFieldSunModel smsChangeFieldSunModel9 = SmsChangeFieldSunModel();
smsChangeFieldSunModel9.name = '客人姓氏';
smsChangeFieldSunModel9.show = '{客人姓氏}';
changeFieldData.add(smsChangeFieldSunModel9);
//附加语音欢迎致辞:暂时屏蔽(可变字段按钮初始化)
// SmsChangeFieldSunModel smsChangeFieldSunModel1 = SmsChangeFieldSunModel();
// smsChangeFieldSunModel1.name = '年月日';
// smsChangeFieldSunModel1.show = '{年月日}';
// changeFieldData.add(smsChangeFieldSunModel1);
// SmsChangeFieldSunModel smsChangeFieldSunModel2 = SmsChangeFieldSunModel();
// smsChangeFieldSunModel2.name = '月日';
// smsChangeFieldSunModel2.show = '{月日}';
// changeFieldData.add(smsChangeFieldSunModel2);
// SmsChangeFieldSunModel smsChangeFieldSunModel3 = SmsChangeFieldSunModel();
// smsChangeFieldSunModel3.name = '餐段';
// smsChangeFieldSunModel3.show = '{餐段}';
// changeFieldData.add(smsChangeFieldSunModel3);
// SmsChangeFieldSunModel smsChangeFieldSunModel4 = SmsChangeFieldSunModel();
// smsChangeFieldSunModel4.name = '就餐时间';
// smsChangeFieldSunModel4.show = '{就餐时间}';
// changeFieldData.add(smsChangeFieldSunModel4);
// SmsChangeFieldSunModel smsChangeFieldSunModel5 = SmsChangeFieldSunModel();
// smsChangeFieldSunModel5.name = '包间名';
// smsChangeFieldSunModel5.show = '{包间名}';
// changeFieldData.add(smsChangeFieldSunModel5);
// SmsChangeFieldSunModel smsChangeFieldSunModel6 = SmsChangeFieldSunModel();
// smsChangeFieldSunModel6.name = '区域名+包间名';
// smsChangeFieldSunModel6.show = '{区域名+包间名}';
// changeFieldData.add(smsChangeFieldSunModel6);
// SmsChangeFieldSunModel smsChangeFieldSunModel7 = SmsChangeFieldSunModel();
// smsChangeFieldSunModel7.name = '经理名字';
// smsChangeFieldSunModel7.show = '{经理名字}';
// changeFieldData.add(smsChangeFieldSunModel7);
// SmsChangeFieldSunModel smsChangeFieldSunModel8 = SmsChangeFieldSunModel();
// smsChangeFieldSunModel8.name = '客人姓名';
// smsChangeFieldSunModel8.show = '{客人姓名}';
// changeFieldData.add(smsChangeFieldSunModel8);
// SmsChangeFieldSunModel smsChangeFieldSunModel9 = SmsChangeFieldSunModel();
// smsChangeFieldSunModel9.name = '客人姓氏';
// smsChangeFieldSunModel9.show = '{客人姓氏}';
// changeFieldData.add(smsChangeFieldSunModel9);
WidgetsBinding.instance.addPostFrameCallback((_) async {
// _initData();
voiceIncoC.text =
'尊敬的贵宾,您好!\n感谢您选择${Provider.of<UserModel>(context, listen: false).user!.sellername}!\n您的就餐安排在{预订日期},{餐段},坐席位于{桌位}。预祝您用餐愉快,期待您的光临!';
//附加语音欢迎致辞默认文案:暂时屏蔽
// voiceIncoC.text =
// '尊敬的贵宾,您好!\n感谢您选择${Provider.of<UserModel>(context, listen: false).user!.sellername}!\n您的就餐安排在{预订日期},{餐段},坐席位于{桌位}。预祝您用餐愉快,期待您的光临!';
_getQiniuInfo();
await getSellerTemplateConf();
... ... @@ -255,10 +250,11 @@ class _BookInfoPageState extends State<BookInfoPage> {
bookingIncoC.text =
marketingCenterProvider.markDataModel!.reserve!.bookingInfo ?? '';
addVoiceInfo =
marketingCenterProvider.markDataModel!.reserve!.swichVoiceInfo == '1'
? true
: false;
//附加语音欢迎致辞开关状态:暂时屏蔽
// addVoiceInfo =
// marketingCenterProvider.markDataModel!.reserve!.swichVoiceInfo == '1'
// ? true
// : false;
addWelcome =
marketingCenterProvider.markDataModel!.reserve!.swichWelcome == '1'
? true
... ... @@ -306,10 +302,11 @@ class _BookInfoPageState extends State<BookInfoPage> {
? 1
: 0;
if (marketingCenterProvider.markDataModel!.reserve!.voiceInco != null) {
voiceIncoC.text =
marketingCenterProvider.markDataModel!.reserve!.voiceInco!;
}
//附加语音欢迎致辞内容:暂时屏蔽(原为取接口reserve.voice_info)
// if (marketingCenterProvider.markDataModel!.reserve!.voiceInco != null) {
// voiceIncoC.text =
// marketingCenterProvider.markDataModel!.reserve!.voiceInco!;
// }
}
if (marketingCenterProvider.markDataModel!.marketing != null) {
welcomeC.text =
... ... @@ -626,53 +623,51 @@ class _BookInfoPageState extends State<BookInfoPage> {
});
}
List<Widget> btnWidgets() {
List<Widget> data = [];
for (var i = 0; i < changeFieldData.length; i++) {
data.add(btnItem(changeFieldData[i].name!, true, onTap: () {
changeFieldData[i].times++;
print(voiceIncoC.text);
// 获取当前光标位置
// int cursorPosition = _cursorPosition;
int cursorPosition = voiceIncoC.selection.baseOffset;
if (cursorPosition != -1) {
// 插入文本
voiceIncoC.text = voiceIncoC.text.substring(0, cursorPosition) +
(changeFieldData[i].show??'') +
voiceIncoC.text.substring(cursorPosition);
print(voiceIncoC.text);
// 设置新的光标位置
voiceIncoC.selection = TextSelection.fromPosition(TextPosition(
offset: cursorPosition + changeFieldData[i].show!.length,
affinity: TextAffinity.downstream));
} else {
voiceIncoC.text += changeFieldData[i].show!;
}
}));
}
return data;
}
Widget btnItem(String title, bool select, {GestureTapCallback? onTap}) {
return InkWell(
onTap: onTap,
child: Container(
padding: EdgeInsets.all(w(3)),
decoration: BoxDecoration(
color: select ? MyColours.color_438E93 : MyColours.color_ffffff,
borderRadius: BorderRadius.circular(r(5)),
border: Border.all(width: w(1), color: MyColours.color_438E93)),
child: Text(title,
style: TextStyle(
color: select ? MyColours.color_ffffff : MyColours.color_438E93,
fontSize: font(12),
fontWeight: FontWeight.bold)),
),
);
}
//附加语音欢迎致辞可变字段按钮:暂时屏蔽
// List<Widget> btnWidgets() {
// List<Widget> data = [];
// for (var i = 0; i < changeFieldData.length; i++) {
// data.add(btnItem(changeFieldData[i].name!, true, onTap: () {
// changeFieldData[i].times++;
// print(voiceIncoC.text);
// // 获取当前光标位置
// // int cursorPosition = _cursorPosition;
// int cursorPosition = voiceIncoC.selection.baseOffset;
// if (cursorPosition != -1) {
// // 插入文本
// voiceIncoC.text = voiceIncoC.text.substring(0, cursorPosition) +
// (changeFieldData[i].show??'') +
// voiceIncoC.text.substring(cursorPosition);
// print(voiceIncoC.text);
// // 设置新的光标位置
// voiceIncoC.selection = TextSelection.fromPosition(TextPosition(
// offset: cursorPosition + changeFieldData[i].show!.length,
// affinity: TextAffinity.downstream));
// } else {
// voiceIncoC.text += changeFieldData[i].show!;
// }
// }));
// }
// return data;
// }
//
// Widget btnItem(String title, bool select, {GestureTapCallback? onTap}) {
// return InkWell(
// onTap: onTap,
// child: Container(
// padding: EdgeInsets.all(w(3)),
// decoration: BoxDecoration(
// color: select ? MyColours.color_438E93 : MyColours.color_ffffff,
// borderRadius: BorderRadius.circular(r(5)),
// border: Border.all(width: w(1), color: MyColours.color_438E93)),
// child: Text(title,
// style: TextStyle(
// color: select ? MyColours.color_ffffff : MyColours.color_438E93,
// fontSize: font(12),
// fontWeight: FontWeight.bold)),
// ),
// );
// }
/// 高级筛选输入框
Widget _textFeildWidget(
... ... @@ -1302,84 +1297,86 @@ class _BookInfoPageState extends State<BookInfoPage> {
// )),
// VEmptyView(24),
_item('附加语音欢迎致辞', select: addVoiceInfo, onTap: () {
setState(() {
addVoiceInfo = !addVoiceInfo;
});
}),
VEmptyView(24),
//输入框
Container(
width: double.infinity,
margin: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40)),
padding: EdgeInsets.symmetric(
horizontal: ScreenUtil().setWidth(40),
vertical: ScreenUtil().setWidth(20)),
alignment: Alignment.topLeft,
decoration: BoxDecoration(
color: MyColours.color_ffffff,
border: Border.all(
color: MyColours.color_DBDBDB,
width: ScreenUtil().setWidth(2)),
borderRadius: BorderRadius.circular(
ScreenUtil().setWidth(20))),
child: TextField(
controller: voiceIncoC,
focusNode: voiceIncoNode,
style: TextStyle(
color: MyColours.color_515151,
fontSize: ScreenUtil().setSp(28),
textBaseline: TextBaseline.alphabetic),
textAlignVertical: TextAlignVertical.center,
maxLines: 7,
// maxLength: 50,
decoration: InputDecoration(
hintText: "点击录入语音欢迎致辞",
hintStyle: TextStyle(
color: MyColours.color_999999,
fontSize: ScreenUtil().setSp(28),
),
contentPadding: EdgeInsets.zero,
border: OutlineInputBorder(
borderSide: BorderSide.none),
),
keyboardType: TextInputType.multiline,
onChanged: (value) {
setState(() {
// currentRemark = value ?? "";
});
}),
),
VEmptyView(24),
Container(
padding: EdgeInsets.symmetric(horizontal: w(20)),
child: Text(
'*{预定日期}、{餐段}、{桌位}不能修改,可以删除。',
style: TextStyle(
color: MyColours.color_999999,
fontSize: font(14)),
)),
VEmptyView(24),
Container(
padding: EdgeInsets.symmetric(horizontal: w(20)),
child: Wrap(
crossAxisAlignment: WrapCrossAlignment.start,
alignment: WrapAlignment.start,
spacing: w(10),
runSpacing: w(10),
children: btnWidgets(),
)),
VEmptyView(24),
Padding(
padding: EdgeInsets.symmetric(horizontal: w(20)),
child: MyDivider(
double.infinity,
w(0.5),
color: MyColours.color_DBDBDB,
)),
//附加语音欢迎致辞功能块:暂时屏蔽
// _item('附加语音欢迎致辞', select: addVoiceInfo, onTap: () {
// setState(() {
// addVoiceInfo = !addVoiceInfo;
// });
// }),
// VEmptyView(24),
// //输入框
// Container(
// width: double.infinity,
// margin: EdgeInsets.symmetric(
// horizontal: ScreenUtil().setWidth(40)),
// padding: EdgeInsets.symmetric(
// horizontal: ScreenUtil().setWidth(40),
// vertical: ScreenUtil().setWidth(20)),
// alignment: Alignment.topLeft,
// decoration: BoxDecoration(
// color: MyColours.color_ffffff,
// border: Border.all(
// color: MyColours.color_DBDBDB,
// width: ScreenUtil().setWidth(2)),
// borderRadius: BorderRadius.circular(
// ScreenUtil().setWidth(20))),
// child: TextField(
// controller: voiceIncoC,
// focusNode: voiceIncoNode,
// style: TextStyle(
// color: MyColours.color_515151,
// fontSize: ScreenUtil().setSp(28),
// textBaseline: TextBaseline.alphabetic),
// textAlignVertical: TextAlignVertical.center,
// maxLines: 7,
// // maxLength: 50,
// decoration: InputDecoration(
// hintText: "点击录入语音欢迎致辞",
// hintStyle: TextStyle(
// color: MyColours.color_999999,
// fontSize: ScreenUtil().setSp(28),
// ),
// contentPadding: EdgeInsets.zero,
// border: OutlineInputBorder(
// borderSide: BorderSide.none),
// ),
// keyboardType: TextInputType.multiline,
// onChanged: (value) {
// setState(() {
// // currentRemark = value ?? "";
// });
// }),
// ),
// VEmptyView(24),
//
// Container(
// padding: EdgeInsets.symmetric(horizontal: w(20)),
// child: Text(
// '*{预定日期}、{餐段}、{桌位}不能修改,可以删除。',
// style: TextStyle(
// color: MyColours.color_999999,
// fontSize: font(14)),
// )),
// VEmptyView(24),
//
// Container(
// padding: EdgeInsets.symmetric(horizontal: w(20)),
// child: Wrap(
// crossAxisAlignment: WrapCrossAlignment.start,
// alignment: WrapAlignment.start,
// spacing: w(10),
// runSpacing: w(10),
// children: btnWidgets(),
// )),
// VEmptyView(24),
//附加语音欢迎致辞分隔线:暂时屏蔽
// Padding(
// padding: EdgeInsets.symmetric(horizontal: w(20)),
// child: MyDivider(
// double.infinity,
// w(0.5),
// color: MyColours.color_DBDBDB,
// )),
// Padding(
// padding: EdgeInsets.symmetric(horizontal: w(20)),
... ... @@ -1646,10 +1643,11 @@ class _BookInfoPageState extends State<BookInfoPage> {
// Utils.showToast('请输入停车信息!');
// return false;
// }
if (addVoiceInfo && voiceIncoC.text.trim().length == 0) {
Utils.showToast('请输入语音欢迎致辞!');
return ;
}
//附加语音欢迎致辞校验:暂时屏蔽
// if (addVoiceInfo && voiceIncoC.text.trim().length == 0) {
// Utils.showToast('请输入语音欢迎致辞!');
// return ;
// }
// if (addParking && parkingIncoC.text.trim().length == 0) {
// Utils.showToast('请输入停车信息!');
// return false;
... ... @@ -1695,10 +1693,10 @@ class _BookInfoPageState extends State<BookInfoPage> {
'swich_manager': addManager ? '1' : '0',
// 'swich_park': addParking ? '1' : '0',
'swich_booking': addBookingInfo ? '1' : '0',
'swich_voice': addVoiceInfo ? '1' : '0',
// 'swich_voice': addVoiceInfo ? '1' : '0',
// 'park_info': parkingIncoC.text,
'book_info': bookingIncoC.text,
'voice_info': voiceIncoC.text,
// 'voice_info': voiceIncoC.text,
'swich_welcome': addWelcome ? '1' : '0',
'swich_slogan': addSlogan ? '1' : '0',
// 'park_info_images':
... ...
... ... @@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:one_key/constant/constant.dart';
import 'package:one_key/models/get_reserve_type_field_model.dart';
import 'package:one_key/models/mark_data_model.dart';
import 'package:one_key/models/voice_welcome_config_model.dart';
import 'package:one_key/net/base_resp.dart';
import 'package:one_key/net/dio_util.dart';
... ... @@ -45,8 +46,10 @@ class _VoiceWelcomeSettingPageState extends State<VoiceWelcomeSettingPage> {
List<GetReserveTypeFieldsSunModel>? mealTypes = []; //用餐类型
bool mealTypesError = false; //用餐类型接口加载失败
static const String defaultVoiceText =
static const String _localDefaultVoiceText =
'尊敬的贵宾,您好!\n欢迎您选择本店。\n您的就餐安排在{预订日期},{餐段},坐席位于{桌位}。\n预祝您用餐愉快,期待您的光临!';
//默认语音欢迎致辞,优先取接口数据(对应BookInfoPage附加语音欢迎致辞内容),接口无数据时用本地文本
String defaultVoiceText = _localDefaultVoiceText;
@override
void initState() {
... ... @@ -75,9 +78,20 @@ class _VoiceWelcomeSettingPageState extends State<VoiceWelcomeSettingPage> {
try {
String? sid =
Provider.of<UserModel>(context, listen: false).user?.sellerid;
//从预订安排模板接口获取默认语音欢迎致辞
await _getDefaultVoiceText();
//接口有默认文本时先填充,接口无数据时保持本地文本;配置接口失败时也使用该默认
voiceIncoC.text = defaultVoiceText;
guestDefaultC.text = defaultVoiceText;
guestSpecialC.text = defaultVoiceText;
BaseResp<dynamic> baseResp = await DioUtil().request<dynamic>(
context, Method.post, HttpUrl.get_voice_welcome_config,
data: {'sid': sid}, showLoading: false);
//可变字段按钮:独立于配置接口获取(未配置店铺时配置接口返回false而非对象)
List<VoiceWelcomePlaceholderModel>? buttons =
await _getPlaceholderButtons();
//用餐类型按钮:独立于配置接口获取(参考工程内App.Seller.GetReserveTypeField用法)
List<GetReserveTypeFieldsSunModel>? mealTypeList = await _getMealTypes();
if (baseResp.code == Constant.status_success &&
baseResp.data != null &&
baseResp.data is Map) {
... ... @@ -99,18 +113,20 @@ class _VoiceWelcomeSettingPageState extends State<VoiceWelcomeSettingPage> {
: defaultVoiceText;
specialVoiceEnabled =
model.isInviteeSpecialEnabled == '1' ? true : false;
//可变字段按钮
//可变字段按钮兜底:配置接口返回的占位符
changeFieldData = model.placeholderButtons ?? [];
//用餐类型及已选状态
//用餐类型兜底:配置接口返回的选项
mealTypes = [];
model.reserveTypeOptions?.forEach((v) {
GetReserveTypeFieldsSunModel temp =
GetReserveTypeFieldsSunModel(name: v, select: false);
mealTypes!.add(
GetReserveTypeFieldsSunModel(name: v, select: false));
});
//已选特殊用餐类型
mealTypes?.forEach((item) {
if (model.specialReserveTypes != null &&
model.specialReserveTypes!.contains(v)) {
temp.select = true;
model.specialReserveTypes!.contains(item.name)) {
item.select = true;
}
mealTypes!.add(temp);
});
mealTypesError = false;
} else {
... ... @@ -119,6 +135,26 @@ class _VoiceWelcomeSettingPageState extends State<VoiceWelcomeSettingPage> {
Utils.showToast(baseResp.msg!);
}
}
//按钮数据优先取专用占位符接口,失败时保持配置接口兜底
if (buttons != null && buttons.isNotEmpty) {
changeFieldData = buttons;
}
//用餐类型优先取专用接口,失败时保持配置接口兜底,并保留已选状态
if (mealTypeList != null && mealTypeList.isNotEmpty) {
List<String> selectedMealTypeNames = [];
mealTypes?.forEach((item) {
if (item.select ?? false) {
selectedMealTypeNames.add(item.name ?? '');
}
});
mealTypes = mealTypeList;
mealTypes!.forEach((item) {
if (selectedMealTypeNames.contains(item.name)) {
item.select = true;
}
});
mealTypesError = false;
}
} catch (error) {
print(error.toString());
mealTypesError = true;
... ... @@ -128,6 +164,72 @@ class _VoiceWelcomeSettingPageState extends State<VoiceWelcomeSettingPage> {
}
}
///从接口获取默认语音欢迎致辞(参考BookInfoPage附加语音欢迎致辞文本内容)
_getDefaultVoiceText() async {
try {
String? sid =
Provider.of<UserModel>(context, listen: false).user?.sellerid;
BaseResp<dynamic> baseResp = await DioUtil().request<dynamic>(
context, Method.post, HttpUrl.get_seller_template_conf,
data: {'sid': sid}, showLoading: false);
if (baseResp.code == Constant.status_success &&
baseResp.data != null &&
baseResp.data is Map) {
MarkDataModel model =
MarkDataModel.fromJson(baseResp.data as Map<String, dynamic>);
String? voiceInco = model.reserve?.voiceInco;
if (voiceInco != null && voiceInco.isNotEmpty) {
defaultVoiceText = voiceInco;
}
}
} catch (error) {
print(error.toString());
}
}
///从接口获取可变字段按钮数据(对应App.Seller.GetVoiceWelcomePlaceholderButtons)
Future<List<VoiceWelcomePlaceholderModel>?> _getPlaceholderButtons() async {
try {
BaseResp<dynamic> baseResp = await DioUtil().request<dynamic>(context,
Method.post, HttpUrl.get_voice_welcome_placeholder_buttons,
data: <String, dynamic>{}, showLoading: false);
if (baseResp.code == Constant.status_success &&
baseResp.data != null &&
baseResp.data is List) {
List<VoiceWelcomePlaceholderModel> list = [];
(baseResp.data as List).forEach((v) {
if (v is Map) {
list.add(VoiceWelcomePlaceholderModel.fromJson(
Map<String, dynamic>.from(v)));
}
});
return list;
}
} catch (error) {
print(error.toString());
}
return null;
}
///从接口获取用餐类型按钮数据(参考工程内App.Seller.GetReserveTypeField用法)
Future<List<GetReserveTypeFieldsSunModel>?> _getMealTypes() async {
try {
BaseResp<dynamic> baseResp = await DioUtil().request<dynamic>(context,
Method.post, HttpUrl.get_reserve_type_field,
showLoading: false);
if (baseResp.code == Constant.status_success &&
baseResp.responseData != null &&
baseResp.responseData is Map) {
GetReserveTypeFieldModel model = GetReserveTypeFieldModel.fromJson(
baseResp.responseData as Map<String, dynamic>);
return model.data ?? [];
}
} catch (error) {
print(error.toString());
}
return null;
}
///在光标处插入可变字段
_insertField(
TextEditingController controller, VoiceWelcomePlaceholderModel field) {
... ... @@ -389,14 +491,17 @@ class _VoiceWelcomeSettingPageState extends State<VoiceWelcomeSettingPage> {
selectedMealTypes.add(item.name ?? '');
}
});
//提交时把语音播报内容中的{预订日期}占位符替换为{年月日}
String replaceReserveDate(String text) =>
text.replaceAll('{预订日期}', '{年月日}');
Map<String, String?> params = {
'sid': Provider.of<UserModel>(context, listen: false).user?.sellerid,
'is_voice_welcome': addVoiceInfo ? '1' : '0',
'welcome_content': voiceIncoC.text,
'welcome_content': replaceReserveDate(voiceIncoC.text),
'invitee_same_as_reserver': guestVoiceSame ? '1' : '0',
'invitee_default_content': guestDefaultC.text,
'invitee_special_content': guestSpecialC.text,
'invitee_default_content': replaceReserveDate(guestDefaultC.text),
'invitee_special_content': replaceReserveDate(guestSpecialC.text),
'special_reserve_types': json.encode(selectedMealTypes),
'is_invitee_special_enabled': specialVoiceEnabled ? '1' : '0',
};
... ...