Commit d4d895cbde0313f38d82bbdad147e0e8b973440f

Authored by wdn127929
1 parent cc48c5d6

导出文件存储权限获取:访问所有文件&&客户详情按钮显示颜色&&用餐类型默认普通用餐(下单时候传入)

... ... @@ -18,7 +18,7 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<application
... ...
... ... @@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
... ... @@ -51,6 +51,8 @@
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
720060DA25B9912C0014BE3B /* tts_all.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = tts_all.caf; sourceTree = "<group>"; };
7206E2DB26200F770055D76E /* 一键订Debug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "一键订Debug.entitlements"; sourceTree = "<group>"; };
72544E7E2B592D7D00A1A4EF /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = "<group>"; };
72544E7F2B592D7E00A1A4EF /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
728D93632B1DBD6C00EFD19A /* tts_voice.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = tts_voice.caf; sourceTree = "<group>"; };
728D93642B1DBD6C00EFD19A /* tts_deposit.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = tts_deposit.caf; sourceTree = "<group>"; };
728D93652B1DBD6C00EFD19A /* tts_wine_remind.caf */ = {isa = PBXFileReference; lastKnownFileType = file; path = tts_wine_remind.caf; sourceTree = "<group>"; };
... ... @@ -231,6 +233,7 @@
knownRegions = (
en,
Base,
"zh-Hans",
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
... ... @@ -464,6 +467,7 @@
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
72544E7E2B592D7D00A1A4EF /* zh-Hans */,
);
name = Main.storyboard;
sourceTree = "<group>";
... ... @@ -472,6 +476,7 @@
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
72544E7F2B592D7E00A1A4EF /* zh-Hans */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
... ... @@ -483,6 +488,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
... ... @@ -570,6 +576,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
... ... @@ -627,6 +634,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
... ... @@ -689,7 +697,7 @@
CURRENT_PROJECT_VERSION = 519;
DEVELOPMENT_TEAM = 8J59HM8B82;
ENABLE_BITCODE = NO;
FLUTTER_BUILD_MODE = release;
FLUTTER_BUILD_MODE = debug;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Flutter",
... ...
... ... @@ -118,7 +118,7 @@ class NotebookDetailPageState extends State<NotebookDetailPage> {
CollectStoreProvider collectStoreProvider;
ScrollController controller = ScrollController();
String reserveType = '请选择';
String reserveType = '普通用餐';
@override
void initState() {
... ... @@ -441,7 +441,7 @@ class NotebookDetailPageState extends State<NotebookDetailPage> {
reserveType =
detailEntity.reserve_type == null || detailEntity.reserve_type == ''
? '请选择'
? '普通用餐'
: detailEntity.reserve_type;
_initTime(int.parse(detailEntity.ddate_solt));
setState(() {
... ... @@ -1758,11 +1758,15 @@ class NotebookDetailPageState extends State<NotebookDetailPage> {
showMsg: "加载中,请稍后...",
);
} else {
UserModel userModel =
Provider.of<UserModel>(context, listen: false);
bool customerBtnHigh =
Provider.of<UserModel>(context, listen: false)
.user
.openid ==
detailEntity.guest_uid;
.user
.openid ==
detailEntity.guest_uid ||
userModel.user.role_name == '管理员' ||
userModel.user.role_name == '店长';
return Column(
children: [
Expanded(
... ...
... ... @@ -168,7 +168,7 @@ class InvicationPageState extends State<InvicationPage>
List<String> styleList = []; //餐单类型
String styleShow = '';
int styleIndex;
String reserveType = '请选择';
String reserveType = '普通用餐';
MyTextSelectionControls _myExtendedMaterialTextSelectionControls =
MyTextSelectionControls();
... ... @@ -1154,7 +1154,7 @@ class InvicationPageState extends State<InvicationPage>
reserveType =
detailEntity.reserve_type == null || detailEntity.reserve_type == ''
? '请选择'
? '普通用餐'
: detailEntity.reserve_type;
_initTime(int.parse(detailEntity.ddate_solt));
... ...
... ... @@ -100,13 +100,17 @@ class _ExportBookDataPageState extends State<ExportBookDataPage> {
// if()/
final directory = await getExternalStorageDirectory();
externalStorageDirPath = directory?.path;
// final directory = await getExternalStorageDirectory();
// externalStorageDirPath = directory?.path;
externalStorageDirPath = '/storage/emulated/0/Download';
} else if (Platform.isIOS) {
// externalStorageDirPath =
// (await getApplicationDocumentsDirectory()).absolute.path;
externalStorageDirPath = (await getTemporaryDirectory()).path;
// externalStorageDirPath = (await getTemporaryDirectory()).path;
externalStorageDirPath = (await getApplicationSupportDirectory()).path;
externalStorageDirPath =
externalStorageDirPath.replaceFirst("Library/Caches", "Documents");
... ... @@ -125,7 +129,7 @@ class _ExportBookDataPageState extends State<ExportBookDataPage> {
// return true;
// }
final status = await Permission.storage.status;
final status = await Permission.manageExternalStorage.status;
if (status == PermissionStatus.granted) {
return true;
}
... ... @@ -137,17 +141,18 @@ class _ExportBookDataPageState extends State<ExportBookDataPage> {
// print('failed to get downloads path: $err, $st');
// if()/
PermissionStatus permissionStatus = await Permission.storage.status;
PermissionStatus permissionStatus =
await Permission.manageExternalStorage.status;
if (permissionStatus != PermissionStatus.permanentlyDenied) {
//全局提示权限使用目的
BuildContext context = App.navigatorKey.currentState.overlay.context;
DialogUtil.showAuthorityDestination(
context, 'h_storage', '存储权限使用说明', '用于存储下载的预订表。');
context, 'h_storage', '访问所有文件权限', '用于存储下载的预订表。');
}
}
final result = await Permission.storage.request();
final result = await Permission.manageExternalStorage.request();
return result == PermissionStatus.granted;
}
... ... @@ -334,16 +339,31 @@ class _ExportBookDataPageState extends State<ExportBookDataPage> {
String starttime = fromDate.replaceAll('-', '');
String endtime = endDate.replaceAll('-', '');
String fileName = "/${sellername}${starttime}至${endtime}.xlsx";
String filePath = _localPath + fileName;
String filePath = _localPath + '${fileName}';
// Utils.showToast('文件已保存到${filePath}');
if (fileBytes != null) {
File file = File(filePath)
// File file =
File(filePath)
..createSync(recursive: true)
..writeAsBytesSync(fileBytes);
file.copy('/storage/emulated/0/Download${fileName}');
// try {
// // File file1 = File('/storage/emulated/0/Download${fileName}')
// // ..createSync(recursive: true)
// // ..writeAsBytesSync(fileBytes);
// // File file2 =
// // await file.copy('/storage/emulated/0/Documents${fileName}');
// File file1 = await file.copy('/storage/emulated/0/Download${fileName}');
// Utils.showToast('文件已保存到${file1.path}');
// } catch (e) {
// Utils.showToast('保存失败:${e}');
// }
Loading.hideLoading(context);
DialogUtil.cupertinoAlertDialog(context,
title: '提示',
content: '文件下载完成,是否打开?',
content: Platform.isAndroid
? '文件已保存到 /sdcard/Download${fileName}'
: '文件下载完成,是否打开?',
lTitle: '取消',
rTitle: '打开', lCallback: () {
progress = null;
... ... @@ -522,82 +542,81 @@ class _ExportBookDataPageState extends State<ExportBookDataPage> {
// return;
// }
if (timeType == '点击选择') {
Utils.showToast('请选择时间类型');
return;
}
if (fromDate == '点击选择') {
Utils.showToast('请选择开始日期');
return;
}
if (endDate == '点击选择') {
Utils.showToast('请选择结束日期');
return;
}
if (DateUtil.getDateTime(endDate)
.compareTo(DateUtil.getDateTime(fromDate)) <
0) {
Utils.showToast('结束日期不能早于开始日期!');
return;
}
// }
bool _permissionReady = await _checkPermission();
if (_permissionReady) {
await _prepareSaveDir();
if (timeType == '点击选择') {
Utils.showToast('请选择时间类型');
return;
}
if (fromDate == '点击选择') {
Utils.showToast('请选择开始日期');
return;
}
if (endDate == '点击选择') {
Utils.showToast('请选择结束日期');
return;
}
if (DateUtil.getDateTime(endDate)
.compareTo(DateUtil.getDateTime(fromDate)) <
0) {
Utils.showToast('结束日期不能早于开始日期!');
return;
}
// }
bool temp = customerProvider.reportFieldModelData
.any((element) => element.select);
if (!temp) {
Utils.showToast('请选择导出字段');
return;
}
bool temp = customerProvider.reportFieldModelData
.any((element) => element.select);
if (!temp) {
Utils.showToast('请选择导出字段');
return;
}
String from = fromDate + ' 00:00:00';
String end = endDate + ' 23:59:59';
String stime = fromDate == '点击设置开始日期'
? ""
: '${(DateUtil.getDateMsByTimeStr(from) / 1000).floor()}';
String etime = endDate == '点击设置结束日期'
? ''
: '${(DateUtil.getDateMsByTimeStr(end) / 1000).floor()}';
String fields = '';
customerProvider.reportFieldModelData.forEach((element) {
if (element.select) {
fields += element.code + ',';
String from = fromDate + ' 00:00:00';
String end = endDate + ' 23:59:59';
String stime = fromDate == '点击设置开始日期'
? ""
: '${(DateUtil.getDateMsByTimeStr(from) / 1000).floor()}';
String etime = endDate == '点击设置结束日期'
? ''
: '${(DateUtil.getDateMsByTimeStr(end) / 1000).floor()}';
String fields = '';
customerProvider.reportFieldModelData.forEach((element) {
if (element.select) {
fields += element.code + ',';
}
});
if (fields.endsWith(',')) {
fields = fields.substring(0, fields.length - 1);
}
});
if (fields.endsWith(',')) {
fields = fields.substring(0, fields.length - 1);
}
Map<String, String> pramas = {
'sid': Provider.of<UserModel>(context, listen: false)
.user
.sellerid,
'time': timeType == '到店时间' ? 'ddate' : 'cdate',
'rdate': stime,
'edate': etime,
'fields': fields
};
bool success =
await customerProvider.getExportInfo(context, pramas);
if (success) {
//成功
bool _permissionReady = await _checkPermission();
if (_permissionReady) {
await _prepareSaveDir();
Map<String, String> pramas = {
'sid': Provider.of<UserModel>(context, listen: false)
.user
.sellerid,
'time': timeType == '到店时间' ? 'ddate' : 'cdate',
'rdate': stime,
'edate': etime,
'fields': fields
};
bool success =
await customerProvider.getExportInfo(context, pramas);
if (success) {
//成功
_download();
} else {
String title = Platform.isAndroid ? '存储' : '相册';
//用户选择不在弹出权限提示框
print('never');
// Navigator.pop(context);
DialogUtil.openAlertDialog(context, '未获得${title}权限',
"请在手机的权限管理里,将${title}权限开启", '去设置', 340.0, onTap: () {
openSetting();
Navigator.pop(context, '');
});
}
} else {
// String title = Platform.isAndroid ? '存储' : '相册';
// //用户选择不在弹出权限提示框
// print('never');
// // Navigator.pop(context);
// DialogUtil.openAlertDialog(context, '未获得${title}权限',
// "请在手机的权限管理里,将${title}权限开启", '去设置', 340.0, onTap: () {
// openSetting();
// Navigator.pop(context, '');
// });
}
},
)
... ...
... ... @@ -417,14 +417,13 @@ class TableManagerModel with ChangeNotifier {
///录入更改内部预订
Future<SunReserveInfoModel> setReserveInfo(
BuildContext context,
CustomCallBack callback, {
needKeep = false,
Guest guest,
String pnum,
String tempTime,
String cusdem,
}) async {
BuildContext context, CustomCallBack callback,
{needKeep = false,
Guest guest,
String pnum,
String tempTime,
String cusdem,
String reserveType = '普通用餐'}) async {
if (selectTables.length == 0) {
Utils.showToast('请选择桌位');
return null;
... ... @@ -570,6 +569,8 @@ class TableManagerModel with ChangeNotifier {
}
}
params['reserve_type'] = reserveType;
print(params);
BaseResp<Map<String, dynamic>> baseResp = await DioUtil()
.request<Map<String, dynamic>>(
... ...
... ... @@ -965,42 +965,42 @@ packages:
name: path_provider
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.15"
version: "2.1.0"
path_provider_android:
dependency: transitive
description:
name: path_provider_android
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.14"
version: "2.1.0"
path_provider_foundation:
dependency: transitive
description:
name: path_provider_foundation
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.4"
version: "2.3.0"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.7"
version: "2.2.0"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.0.4"
version: "2.1.0"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.7"
version: "2.2.0"
pedantic:
dependency: transitive
description:
... ...
... ... @@ -53,11 +53,13 @@ dependencies:
# 权限管理
# permission_handler: ^10.0.0
permission_handler: ^11.0.1
# permission_handler: ^11.2.0
# permission_handler: ^5.0.1
# permission_handler: ^5.0.1+1 ^6.1.1 4.4.0
# 文件系统访问
# path_provider: ^1.6.5
path_provider: ^2.0.10
# path_provider: ^2.0.10
path_provider: ^2.1.0
## 官方image组件扩展,支持多种图片效果展示
# extended_image: ^1.1.1
# 任意位置访问navigator
... ...