Browse Source

增加电子签名上传;

mq 11 months ago
parent
commit
8d048369b6

+ 0 - 1
.gitignore

@@ -73,7 +73,6 @@ unlinked_spec.ds
73 73
 **/android/local.properties
74 74
 **/android/**/GeneratedPluginRegistrant.java
75 75
 **/android/key.properties
76
-*.jks
77 76
 
78 77
 # iOS/XCode related
79 78
 **/ios/**/*.mode1v3

BIN
android/keystore.jks


+ 3 - 0
lib/model/rsp/sample_task_rsp.dart

@@ -112,6 +112,7 @@ class SampleTaskItem {
112 112
   num? tqqk; // 天气情况
113 113
   List<NonghuItem>? codeSamplingNonghuList; // 扦样农户信息
114 114
   String? xzqhCode; // 行政区划六位编码
115
+  List<String>? filePictureList; // 签名图片url
115 116
 
116 117
   SampleTaskItem({
117 118
     this.id,
@@ -201,6 +202,7 @@ class SampleTaskItem {
201 202
     this.tqqk,
202 203
     this.codeSamplingNonghuList,
203 204
     this.xzqhCode,
205
+    this.filePictureList,
204 206
   });
205 207
 
206 208
   SampleTaskItem createUI() {
@@ -286,6 +288,7 @@ class SampleTaskItem {
286 288
     if (nonghuList != null && nonghuList.isNotEmpty) {
287 289
       map['codeSamplingNonghuList'] = nonghuList.map((e) => e.toReqJson()).toList();
288 290
     }
291
+    map['filePictureList'] = filePictureList;
289 292
     return map;
290 293
   }
291 294
 }

+ 4 - 0
lib/model/rsp/sample_task_rsp.g.dart

@@ -126,6 +126,9 @@ SampleTaskItem _$SampleTaskItemFromJson(Map<String, dynamic> json) =>
126 126
           ?.map((e) => NonghuItem.fromJson(e as Map<String, dynamic>))
127 127
           .toList(),
128 128
       xzqhCode: const StringConverter().fromJson(json['xzqhCode']),
129
+      filePictureList: (json['filePictureList'] as List<dynamic>?)
130
+          ?.map((e) => e as String)
131
+          .toList(),
129 132
     );
130 133
 
131 134
 Map<String, dynamic> _$SampleTaskItemToJson(SampleTaskItem instance) =>
@@ -223,6 +226,7 @@ Map<String, dynamic> _$SampleTaskItemToJson(SampleTaskItem instance) =>
223 226
       'tqqk': const NumConverter().toJson(instance.tqqk),
224 227
       'codeSamplingNonghuList': instance.codeSamplingNonghuList,
225 228
       'xzqhCode': const StringConverter().toJson(instance.xzqhCode),
229
+      'filePictureList': instance.filePictureList,
226 230
     };
227 231
 
228 232
 EnterpriseItem _$EnterpriseItemFromJson(Map<String, dynamic> json) =>

+ 1 - 1
lib/network/api.dart

@@ -82,5 +82,5 @@ abstract class Api {
82 82
 
83 83
   /// 上传图片
84 84
   @POST('/admin-api/infra/file/upload')
85
-  Future<void> upload(@Part(name: 'path') File path);
85
+  Future<ApiRsp<String?>> upload(@Part(name: 'file') File file);
86 86
 }

+ 22 - 16
lib/network/api.g.dart

@@ -477,34 +477,40 @@ class _Api implements Api {
477 477
   }
478 478
 
479 479
   @override
480
-  Future<void> upload(File path) async {
480
+  Future<ApiRsp<String?>> upload(File file) async {
481 481
     const _extra = <String, dynamic>{};
482 482
     final queryParameters = <String, dynamic>{};
483 483
     final _headers = <String, dynamic>{};
484 484
     final _data = FormData();
485 485
     _data.files.add(MapEntry(
486
-      'path',
486
+      'file',
487 487
       MultipartFile.fromFileSync(
488
-        path.path,
489
-        filename: path.path.split(Platform.pathSeparator).last,
488
+        file.path,
489
+        filename: file.path.split(Platform.pathSeparator).last,
490 490
       ),
491 491
     ));
492
-    await _dio.fetch<void>(_setStreamType<void>(Options(
492
+    final _result = await _dio
493
+        .fetch<Map<String, dynamic>>(_setStreamType<ApiRsp<String>>(Options(
493 494
       method: 'POST',
494 495
       headers: _headers,
495 496
       extra: _extra,
496 497
     )
497
-        .compose(
498
-          _dio.options,
499
-          '/admin-api/infra/file/upload',
500
-          queryParameters: queryParameters,
501
-          data: _data,
502
-        )
503
-        .copyWith(
504
-            baseUrl: _combineBaseUrls(
505
-          _dio.options.baseUrl,
506
-          baseUrl,
507
-        ))));
498
+            .compose(
499
+              _dio.options,
500
+              '/admin-api/infra/file/upload',
501
+              queryParameters: queryParameters,
502
+              data: _data,
503
+            )
504
+            .copyWith(
505
+                baseUrl: _combineBaseUrls(
506
+              _dio.options.baseUrl,
507
+              baseUrl,
508
+            ))));
509
+    final value = ApiRsp<String?>.fromJson(
510
+      _result.data!,
511
+      (json) => json as String?,
512
+    );
513
+    return value;
508 514
   }
509 515
 
510 516
   RequestOptions _setStreamType<T>(RequestOptions requestOptions) {

+ 12 - 8
lib/page/sample_task/reap_sample_detail/reap_sample_task_page.dart

@@ -1,3 +1,6 @@
1
+import 'dart:io';
2
+import 'dart:typed_data';
3
+
1 4
 import 'package:flutter/material.dart';
2 5
 import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
3 6
 import 'package:lszlgl/base/base_lifecycle_state.dart';
@@ -8,10 +11,12 @@ import 'package:lszlgl/page/sample_task/reap_sample_detail/reap_sample_disaster_
8 11
 import 'package:lszlgl/page/sample_task/reap_sample_detail/reap_sample_medicine_detail_page.dart';
9 12
 import 'package:lszlgl/page/sample_task/reap_sample_detail/reap_sample_org_detail_page.dart';
10 13
 import 'package:lszlgl/page/sample_task/reap_sample_detail/reap_sample_variety_detail_page.dart';
14
+import 'package:lszlgl/page/signature/signature_page.dart';
11 15
 
12 16
 import '../../../base/base_vm.dart';
13 17
 import '../../../main.dart';
14 18
 import '../../../network/my_api.dart';
19
+import '../../../utils/file_utils.dart';
15 20
 import '../../../widget/button.dart';
16 21
 import '../../../widget/page_widget.dart';
17 22
 
@@ -76,27 +81,26 @@ class _ReapSampleTaskPageState extends BaseLifecycleState<ReapSampleTaskPage> wi
76 81
   }
77 82
 
78 83
   void submit() async {
79
-    /*
84
+    SampleTaskItem req = (pageStatus.value.data ?? SampleTaskItem());
80 85
     // 去签名
81
-    List<Uint8List?>? list = await MyRouter.startSignature();
86
+    var args = SignaturePageArgs(count: req.dgryName?.split(',').length ?? 0);
87
+    List<Uint8List?>? list = await MyRouter.startSignature(args: args);
82 88
     if (list == null || list.isEmpty) return;
83 89
     // 字节转文件
84 90
     List<File> fileList = [];
85 91
     for (int i = 0; i < list.length; i++) {
86 92
       fileList.add(await FileUtils.convertUint8ListToFile(list[i]!, 'signatrue_$i.png'));
87 93
     }
88
-    logger.d('图片:${fileList.map((e) async => await e.length()).toList()}');
89 94
     // 上传图片
90
-    await MyApi.get().upload(fileList.first);
91
-    return;
92
-
93
-     */
95
+    var rspList = await Future.wait(fileList.map((file) => MyApi.get().upload(file)));
96
+    logger.d('图片url:${rspList.map((e) => e.data)}');
97
+    req.filePictureList = rspList.map((e) => e.data ?? '').toList();
94 98
 
95 99
     MyNavigator.showLoading();
96 100
     // 已分解
97 101
     pageStatus.value.data?.state = 2;
98 102
     try {
99
-      var rsp = await MyApi.get().updateSampleTaskSgjc((pageStatus.value.data ?? SampleTaskItem()).getReqJson());
103
+      var rsp = await MyApi.get().updateSampleTaskSgjc(req.getReqJson());
100 104
       if (!mounted) return;
101 105
       if (rsp.data ?? false) {
102 106
         MyNavigator.showToast('提交成功');

+ 31 - 0
lib/widget/loading_widget.dart

@@ -0,0 +1,31 @@
1
+import 'package:flutter/material.dart';
2
+import 'package:flutter_spinkit/flutter_spinkit.dart';
3
+
4
+class LoadingWidget extends StatelessWidget {
5
+  const LoadingWidget({Key? key, required this.msg}) : super(key: key);
6
+
7
+  ///loading msg
8
+  final String msg;
9
+
10
+  @override
11
+  Widget build(BuildContext context) {
12
+    return Container(
13
+      padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 20),
14
+      decoration: BoxDecoration(
15
+        color: Colors.black,
16
+        borderRadius: BorderRadius.circular(15),
17
+      ),
18
+      child: Column(mainAxisSize: MainAxisSize.min, children: [
19
+        //loading animation
20
+        const SpinKitCircle(
21
+          color: Colors.white,
22
+        ),
23
+        //msg
24
+        Container(
25
+          margin: const EdgeInsets.only(top: 20),
26
+          child: Text(msg, style: const TextStyle(color: Colors.white)),
27
+        ),
28
+      ]),
29
+    );
30
+  }
31
+}

+ 2 - 0
pubspec.yaml

@@ -85,6 +85,8 @@ dependencies:
85 85
   qr_code_scanner: ^1.0.1
86 86
   # 手写签名
87 87
   signature: ^5.4.1
88
+  # loading集合
89
+  flutter_spinkit: ^5.2.1
88 90
 
89 91
 dev_dependencies:
90 92
   flutter_test: