Browse Source

展示扦样完成详情

mq 1 year ago
parent
commit
e822a19a40
28 changed files with 620 additions and 422 deletions
  1. 4 0
      lib/base/base_lifecycle_state.dart
  2. 39 0
      lib/config/reresh_config.dart
  3. 3 23
      lib/main.dart
  4. 29 0
      lib/model/req/sample_task_list_req.dart
  5. 1 6
      lib/network/api.dart
  6. 1 1
      lib/page/home/home_page.dart
  7. 1 1
      lib/page/login/login_page.dart
  8. 0 63
      lib/page/reap_step/reap_sample_detail/reap_sample_basic_detail_page.dart
  9. 0 61
      lib/page/reap_step/reap_sample_detail/reap_sample_variety_detail_page.dart
  10. 0 21
      lib/page/reap_step/sample_list_vm.dart
  11. 80 0
      lib/page/sample_task/reap_sample_detail/reap_sample_basic_detail_page.dart
  12. 5 3
      lib/page/reap_step/reap_sample_detail/reap_sample_disaster_detail_page.dart
  13. 5 3
      lib/page/reap_step/reap_sample_detail/reap_sample_medicine_detail_page.dart
  14. 5 3
      lib/page/reap_step/reap_sample_detail/reap_sample_org_detail_page.dart
  15. 71 0
      lib/page/sample_task/reap_sample_detail/reap_sample_variety_detail_page.dart
  16. 0 0
      lib/page/sample_task/reap_sample_task/reap_sample_basic_page.dart
  17. 0 0
      lib/page/sample_task/reap_sample_task/reap_sample_disaster_page.dart
  18. 0 0
      lib/page/sample_task/reap_sample_task/reap_sample_medicine_page.dart
  19. 0 0
      lib/page/sample_task/reap_sample_task/reap_sample_org_page.dart
  20. 40 19
      lib/page/reap_step/reap_sample_task/reap_sample_task_page.dart
  21. 2 1
      lib/page/reap_step/reap_sample_task/reap_sample_variety_page.dart
  22. 101 0
      lib/page/sample_task/sample_list_vm.dart
  23. 19 68
      lib/page/reap_step/sample_task_list_page.dart
  24. 14 1
      lib/page/reap_step/sample_task_list_tab_page.dart
  25. 5 7
      lib/router/my_router.dart
  26. 9 9
      lib/service/dict_service.dart
  27. 54 0
      lib/utils/date_time_utils.dart
  28. 132 132
      pubspec.lock

+ 4 - 0
lib/base/base_lifecycle_state.dart

@@ -1,6 +1,10 @@
1 1
 import 'package:flutter/material.dart';
2 2
 import 'package:flutter/services.dart';
3 3
 import 'package:lszlgl/base/base_state.dart';
4
+
5
+export 'package:lszlgl/config/pics.dart';
6
+export 'package:lszlgl/router/my_navigator.dart';
7
+export 'package:lszlgl/router/my_router.dart';
4 8
 export 'package:lszlgl/ext/value_notifier_ext.dart';
5 9
 
6 10
 /// 页面生命周期基类

+ 39 - 0
lib/config/reresh_config.dart

@@ -0,0 +1,39 @@
1
+import 'package:easy_refresh/easy_refresh.dart';
2
+
3
+class RefreshConfig {
4
+  RefreshConfig._();
5
+
6
+  static RefreshConfig? _instance;
7
+
8
+  static RefreshConfig get() => _instance ?? RefreshConfig._();
9
+
10
+  void initDefault({
11
+    ClassicHeader? header,
12
+    ClassicFooter? footer,
13
+  }) {
14
+    EasyRefresh.defaultHeaderBuilder = () =>
15
+        header ??
16
+        const ClassicHeader(
17
+          dragText: '下拉刷新',
18
+          armedText: '释放开始',
19
+          readyText: '刷新中...',
20
+          processingText: '刷新中...',
21
+          processedText: '成功了',
22
+          noMoreText: '已加载全部',
23
+          failedText: '刷新失败',
24
+          messageText: '最后更新于 %T',
25
+        );
26
+    EasyRefresh.defaultFooterBuilder = () =>
27
+        footer ??
28
+        const ClassicFooter(
29
+          dragText: '上拉加载',
30
+          armedText: '释放开始',
31
+          readyText: '加载中...',
32
+          processingText: '加载中...',
33
+          processedText: '成功了',
34
+          noMoreText: '已加载全部',
35
+          failedText: '加载失败',
36
+          messageText: '最后更新于 %T',
37
+        );
38
+  }
39
+}

+ 3 - 23
lib/main.dart

@@ -1,7 +1,6 @@
1 1
 import 'dart:async';
2 2
 import 'dart:isolate';
3 3
 
4
-import 'package:easy_refresh/easy_refresh.dart';
5 4
 import 'package:flutter/material.dart';
6 5
 import 'package:flutter/services.dart';
7 6
 import 'package:flutter_localizations/flutter_localizations.dart';
@@ -11,6 +10,8 @@ import 'package:lszlgl/network/base_dio.dart';
11 10
 import 'package:lszlgl/router/my_navigator.dart';
12 11
 import 'package:lszlgl/utils/sp_utils.dart';
13 12
 
13
+import 'config/reresh_config.dart';
14
+
14 15
 late Logger logger;
15 16
 
16 17
 void main() async {
@@ -22,29 +23,8 @@ void main() async {
22 23
       DeviceOrientation.portraitDown,
23 24
     ]);
24 25
     BaseDio.get().init();
25
-
26 26
     await SPUtils.getInstance().init();
27
-
28
-    EasyRefresh.defaultHeaderBuilder = () => const ClassicHeader(
29
-          dragText: '下拉刷新',
30
-          armedText: '释放开始',
31
-          readyText: '刷新中...',
32
-          processingText: '刷新中...',
33
-          processedText: '成功了',
34
-          noMoreText: '已加载全部',
35
-          failedText: '刷新失败',
36
-          messageText: '最后更新于 %T',
37
-        );
38
-    EasyRefresh.defaultFooterBuilder = () => const ClassicFooter(
39
-          dragText: '上拉加载',
40
-          armedText: '释放开始',
41
-          readyText: '加载中...',
42
-          processingText: '加载中...',
43
-          processedText: '成功了',
44
-          noMoreText: '已加载全部',
45
-          failedText: '加载失败',
46
-          messageText: '最后更新于 %T',
47
-        );
27
+    RefreshConfig.get().initDefault();
48 28
     runApp(const MyApp());
49 29
   });
50 30
 }

+ 29 - 0
lib/model/req/sample_task_list_req.dart

@@ -0,0 +1,29 @@
1
+import 'package:json_annotation/json_annotation.dart';
2
+
3
+part 'sample_task_list_req.g.dart';
4
+
5
+@JsonSerializable()
6
+class SampleTaskListReq {
7
+  /// 页码
8
+  int pageNo;
9
+
10
+  /// 条目
11
+  int pageSize;
12
+
13
+  /// 任务单任务状态:0是待扦样,1已扦样
14
+  int? deliveryStatus;
15
+
16
+  /// 环节类型:1收获环节,2库存环节
17
+  int? rwlx;
18
+
19
+  SampleTaskListReq({
20
+    this.pageNo = 1,
21
+    this.pageSize = 10,
22
+    this.deliveryStatus,
23
+    this.rwlx,
24
+  });
25
+
26
+  factory SampleTaskListReq.fromJson(Map<String, dynamic> json) => _$SampleTaskListReqFromJson(json);
27
+
28
+  Map<String, dynamic> toJson() => _$SampleTaskListReqToJson(this);
29
+}

+ 1 - 6
lib/network/api.dart

@@ -31,10 +31,5 @@ abstract class Api {
31 31
 
32 32
   /// 扦样任务单列表
33 33
   @GET('/admin-api/zj/code-sampling-task-details-sgjc/sampling_task_detail_page')
34
-  Future<ApiRsp<SampleTaskListRsp>> sampleTaskList(
35
-    @Query('pageNo') int pageNo,
36
-    @Query('pageSize') int pageSize, {
37
-    @Query('deliveryStatus') int? deliveryStatus,
38
-    @Query('rwlx') int? rwlx,
39
-  });
34
+  Future<ApiRsp<SampleTaskListRsp>> sampleTaskList(@Queries() Map<String, dynamic> map);
40 35
 }

+ 1 - 1
lib/page/home/home_page.dart

@@ -3,7 +3,7 @@ import 'package:card_swiper/card_swiper.dart';
3 3
 import 'package:flutter/cupertino.dart';
4 4
 import 'package:flutter/material.dart';
5 5
 import 'package:lszlgl/base/base_state.dart';
6
-import 'package:lszlgl/page/reap_step/sample_task_list_tab_page.dart';
6
+import 'package:lszlgl/page/sample_task/sample_task_list_tab_page.dart';
7 7
 
8 8
 /// 首页
9 9
 class HomePage extends StatefulWidget {

+ 1 - 1
lib/page/login/login_page.dart

@@ -50,7 +50,7 @@ class _LoginPageState extends BaseLifecycleState<LoginPage> {
50 50
       await UserService.get().saveUser(user.data);
51 51
       // 获取字典
52 52
       var dictData = await Api().getAllDict();
53
-      DictService.get().saveDictList(dictData.data);
53
+      DictService.saveDictList(dictData.data);
54 54
       // 进入主页
55 55
       SmartDialog.dismiss(status: SmartStatus.loading);
56 56
       startHome();

+ 0 - 63
lib/page/reap_step/reap_sample_detail/reap_sample_basic_detail_page.dart

@@ -1,63 +0,0 @@
1
-import 'package:flutter/material.dart';
2
-import 'package:lszlgl/base/base_state.dart';
3
-import 'package:lszlgl/widget/button.dart';
4
-import 'package:lszlgl/widget/card_item.dart';
5
-
6
-/// 收获扦样-基础信息
7
-class ReapSampleBasicDetailPage extends StatefulWidget {
8
-
9
-  const ReapSampleBasicDetailPage({
10
-    super.key,
11
-  });
12
-
13
-  @override
14
-  State<ReapSampleBasicDetailPage> createState() => _ReapSampleBasicDetailPageState();
15
-}
16
-
17
-class _ReapSampleBasicDetailPageState extends BaseState<ReapSampleBasicDetailPage> with AutomaticKeepAliveClientMixin {
18
-  @override
19
-  bool get wantKeepAlive => true;
20
-
21
-  @override
22
-  Widget build(BuildContext context) {
23
-    super.build(context);
24
-    return Column(
25
-      children: [
26
-        Expanded(child: SingleChildScrollView(child: buildList())),
27
-        buildButton(),
28
-      ],
29
-    );
30
-  }
31
-
32
-  Widget buildList() {
33
-    return Column(
34
-      children: [
35
-        CardItemWidget('扦样任务单号', rightText: '*****************', bottomLine: true),
36
-        CardItemWidget('扦样单位', rightText: '自动生成', bottomLine: true),
37
-        CardItemWidget('扦样人员', rightText: '李飞', bottomLine: true),
38
-        CardItemWidget('任务类型', rightText: '收购监测', bottomLine: true),
39
-        CardItemWidget('省份选择', rightText: '北京市', bottomLine: true),
40
-        CardItemWidget('市区选择', rightText: '市辖区', bottomLine: true),
41
-        CardItemWidget('区县选择', rightText: '平谷区', bottomLine: true),
42
-        CardItemWidget('乡镇选择', rightText: '黄松峪乡', bottomLine: true),
43
-        CardItemWidget('村选择', rightText: '黑豆峪村', bottomLine: true),
44
-        CardItemWidget('扦样地点经纬度', rightText: '经度118.17,纬度26.18', bottomLine: true),
45
-        CardItemWidget('种植面积(亩地)', rightText: '500', bottomLine: true),
46
-        CardItemWidget('土壤地理类型', rightText: '***********', bottomLine: true),
47
-        CardItemWidget('被调查农户或合作社', rightText: '***********', bottomLine: true),
48
-        CardItemWidget('联系方式', rightText: '***********', bottomLine: true),
49
-      ],
50
-    );
51
-  }
52
-
53
-  Widget buildButton() {
54
-    return Container(
55
-      color: const Color(0xFFF1F7F6),
56
-      padding: const EdgeInsets.all(12),
57
-      child: MyButton(
58
-        '重新录入',
59
-        onTap: () => MyRouter.startReapSampleTask(),
60
-      ),
61
-    );
62
-  }
63
-}

+ 0 - 61
lib/page/reap_step/reap_sample_detail/reap_sample_variety_detail_page.dart

@@ -1,61 +0,0 @@
1
-import 'package:flutter/material.dart';
2
-import 'package:lszlgl/base/base_state.dart';
3
-import 'package:lszlgl/widget/button.dart';
4
-import 'package:lszlgl/widget/card_item.dart';
5
-
6
-/// 收获扦样-品种信息
7
-class ReapSampleVarietyDetailPage extends StatefulWidget {
8
-  const ReapSampleVarietyDetailPage({
9
-    super.key,
10
-  });
11
-
12
-  @override
13
-  State<ReapSampleVarietyDetailPage> createState() => _ReapSampleVarietyDetailPageState();
14
-}
15
-
16
-class _ReapSampleVarietyDetailPageState extends BaseState<ReapSampleVarietyDetailPage>
17
-    with AutomaticKeepAliveClientMixin {
18
-  @override
19
-  bool get wantKeepAlive => true;
20
-
21
-  @override
22
-  Widget build(BuildContext context) {
23
-    super.build(context);
24
-    return Column(
25
-      children: [
26
-        Expanded(child: SingleChildScrollView(child: buildList())),
27
-        buildButton(),
28
-      ],
29
-    );
30
-  }
31
-
32
-  Widget buildList() {
33
-    return Column(
34
-      children: [
35
-        CardItemWidget('采样品种', rightText: '****', bottomLine: true),
36
-        CardItemWidget('粮食品类', rightText: '****', bottomLine: true),
37
-        CardItemWidget('样品编号', rightText: '****', bottomLine: true),
38
-        CardItemWidget('种植品种', rightText: '****', bottomLine: true),
39
-        CardItemWidget('是否优质品种', rightText: '****', bottomLine: true),
40
-        CardItemWidget('优质品种类型', rightText: '****', bottomLine: true),
41
-        CardItemWidget('收获时间', rightText: '****', bottomLine: true),
42
-        CardItemWidget('扦样时间', rightText: '****', bottomLine: true),
43
-        CardItemWidget('扦样数量(公斤)', rightText: '****', bottomLine: true),
44
-        CardItemWidget('扦样代表数量(公斤)', rightText: '****', bottomLine: true),
45
-        CardItemWidget('温度(℃)', rightText: '****', bottomLine: true),
46
-        CardItemWidget('湿度(%)', rightText: '****'),
47
-      ],
48
-    );
49
-  }
50
-
51
-  Widget buildButton() {
52
-    return Container(
53
-      color: const Color(0xFFF1F7F6),
54
-      padding: const EdgeInsets.all(12),
55
-      child: MyButton(
56
-        '重新录入',
57
-        onTap: () => MyRouter.startReapSampleTask(),
58
-      ),
59
-    );
60
-  }
61
-}

+ 0 - 21
lib/page/reap_step/sample_list_vm.dart

@@ -1,21 +0,0 @@
1
-import 'package:easy_refresh/easy_refresh.dart';
2
-import 'package:lszlgl/base/base_vm.dart';
3
-
4
-class SampleListVM extends BaseVM {
5
-  late final EasyRefreshController aCtrl;
6
-  late final EasyRefreshController bCtrl;
7
-
8
-  SampleListVM() {
9
-    aCtrl = EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true);
10
-    bCtrl = EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true);
11
-  }
12
-
13
-
14
-
15
-  @override
16
-  void dispose() {
17
-    aCtrl.dispose();
18
-    bCtrl.dispose();
19
-    super.dispose();
20
-  }
21
-}

+ 80 - 0
lib/page/sample_task/reap_sample_detail/reap_sample_basic_detail_page.dart

@@ -0,0 +1,80 @@
1
+import 'package:flutter/material.dart';
2
+import '../../../base/base_lifecycle_state.dart';
3
+import '../../../model/rsp/sample_task_rsp.dart';
4
+import '../../../service/dict_service.dart';
5
+import '../../../widget/button.dart';
6
+import '../../../widget/card_item.dart';
7
+
8
+/// 收获扦样-基础信息
9
+class ReapSampleBasicDetailPage extends StatefulWidget {
10
+  final SampleTaskItem? data;
11
+
12
+  const ReapSampleBasicDetailPage(this.data, {super.key});
13
+
14
+  @override
15
+  State<ReapSampleBasicDetailPage> createState() => _ReapSampleBasicDetailPageState();
16
+}
17
+
18
+class _ReapSampleBasicDetailPageState extends BaseLifecycleState<ReapSampleBasicDetailPage>
19
+    with AutomaticKeepAliveClientMixin {
20
+  SampleTaskItem? data;
21
+
22
+  @override
23
+  void onInit() {
24
+    data = widget.data;
25
+  }
26
+
27
+  @override
28
+  bool get wantKeepAlive => true;
29
+
30
+  @override
31
+  Widget build(BuildContext context) {
32
+    super.build(context);
33
+    return Column(
34
+      children: [
35
+        Expanded(child: SingleChildScrollView(child: buildList())),
36
+        buildButton(),
37
+      ],
38
+    );
39
+  }
40
+
41
+  Widget buildList() {
42
+    return Column(
43
+      children: [
44
+        CardItemWidget('扦样任务单号', rightText: data?.qyrwdh, bottomLine: true),
45
+        CardItemWidget('扦样单位', rightText: data?.dwmc, bottomLine: true),
46
+        CardItemWidget('扦样人员', rightText: data?.name, bottomLine: true),
47
+        CardItemWidget(
48
+          '监测类别',
49
+          rightText: DictService.getLabel(DictType.jclb, value: data?.jclb),
50
+          bottomLine: true,
51
+        ),
52
+        CardItemWidget('省份', rightText: data?.sheng, bottomLine: true),
53
+        CardItemWidget('市区', rightText: data?.shi, bottomLine: true),
54
+        CardItemWidget('区县', rightText: data?.qu, bottomLine: true),
55
+        CardItemWidget('乡镇', rightText: data?.xian, bottomLine: true),
56
+        CardItemWidget('村', rightText: data?.cun, bottomLine: true),
57
+        CardItemWidget('扦样地点经纬度', rightText: data?.qyddjwd, bottomLine: true),
58
+        CardItemWidget('种植面积(亩地)', rightText: data?.zzmj?.toString(), bottomLine: true),
59
+        CardItemWidget(
60
+          '土壤地理类型',
61
+          rightText: DictService.getLabel(DictType.jclb, value: data?.trdllx),
62
+          bottomLine: true,
63
+        ),
64
+        CardItemWidget('被调查农户或合作社', rightText: data?.bdcnhhhzs, bottomLine: true),
65
+        CardItemWidget('联系方式', rightText: data?.lxfs, bottomLine: true),
66
+      ],
67
+    );
68
+  }
69
+
70
+  Widget buildButton() {
71
+    return Container(
72
+      color: const Color(0xFFF1F7F6),
73
+      padding: const EdgeInsets.all(12),
74
+      child: MyButton(
75
+        '重新录入',
76
+        onTap: () => MyRouter.startReapSampleTask(),
77
+      ),
78
+    );
79
+  }
80
+}

+ 5 - 3
lib/page/reap_step/reap_sample_detail/reap_sample_disaster_detail_page.dart

@@ -3,11 +3,13 @@ import 'package:lszlgl/base/base_state.dart';
3 3
 import 'package:lszlgl/widget/button.dart';
4 4
 import 'package:lszlgl/widget/card_item.dart';
5 5
 
6
+import '../../../model/rsp/sample_task_rsp.dart';
7
+
6 8
 /// 收获扦样-灾害污染
7 9
 class ReapSampleDisasterDetailPage extends StatefulWidget {
8
-  const ReapSampleDisasterDetailPage({
9
-    super.key,
10
-  });
10
+  final SampleTaskItem? data;
11
+
12
+  const ReapSampleDisasterDetailPage(this.data, {super.key});
11 13
 
12 14
   @override
13 15
   State<ReapSampleDisasterDetailPage> createState() => _ReapSampleDisasterDetailPageState();

+ 5 - 3
lib/page/reap_step/reap_sample_detail/reap_sample_medicine_detail_page.dart

@@ -3,11 +3,13 @@ import 'package:lszlgl/base/base_state.dart';
3 3
 import 'package:lszlgl/widget/button.dart';
4 4
 import 'package:lszlgl/widget/card_item.dart';
5 5
 
6
+import '../../../model/rsp/sample_task_rsp.dart';
7
+
6 8
 /// 收获扦样-用药情况
7 9
 class ReapSampleMedicineDetailPage extends StatefulWidget {
8
-  const ReapSampleMedicineDetailPage({
9
-    super.key,
10
-  });
10
+  final SampleTaskItem? data;
11
+
12
+  const ReapSampleMedicineDetailPage(this.data, {super.key});
11 13
 
12 14
   @override
13 15
   State<ReapSampleMedicineDetailPage> createState() => _ReapSampleMedicineDetailPageState();

+ 5 - 3
lib/page/reap_step/reap_sample_detail/reap_sample_org_detail_page.dart

@@ -3,11 +3,13 @@ import 'package:lszlgl/base/base_state.dart';
3 3
 import 'package:lszlgl/widget/button.dart';
4 4
 import 'package:lszlgl/widget/card_item.dart';
5 5
 
6
+import '../../../model/rsp/sample_task_rsp.dart';
7
+
6 8
 /// 收获扦样-检验机构
7 9
 class ReapSampleOrgDetailPage extends StatefulWidget {
8
-  const ReapSampleOrgDetailPage({
9
-    super.key,
10
-  });
10
+  final SampleTaskItem? data;
11
+
12
+  const ReapSampleOrgDetailPage(this.data, {super.key});
11 13
 
12 14
   @override
13 15
   State<ReapSampleOrgDetailPage> createState() => _ReapSampleOrgDetailPageState();

+ 71 - 0
lib/page/sample_task/reap_sample_detail/reap_sample_variety_detail_page.dart

@@ -0,0 +1,71 @@
1
+import 'package:flutter/material.dart';
2
+import 'package:lszlgl/base/base_lifecycle_state.dart';
3
+import 'package:lszlgl/base/base_state.dart';
4
+import 'package:lszlgl/widget/button.dart';
5
+import 'package:lszlgl/widget/card_item.dart';
6
+
7
+import '../../../model/rsp/sample_task_rsp.dart';
8
+
9
+/// 收获扦样-品种信息
10
+class ReapSampleVarietyDetailPage extends StatefulWidget {
11
+  final SampleTaskItem? data;
12
+
13
+  const ReapSampleVarietyDetailPage(this.data, {super.key});
14
+
15
+  @override
16
+  State<ReapSampleVarietyDetailPage> createState() => _ReapSampleVarietyDetailPageState();
17
+}
18
+
19
+class _ReapSampleVarietyDetailPageState extends BaseLifecycleState<ReapSampleVarietyDetailPage>
20
+    with AutomaticKeepAliveClientMixin {
21
+  SampleTaskItem? data;
22
+
23
+  @override
24
+  void onInit() {
25
+    data = widget.data;
26
+  }
27
+
28
+  @override
29
+  bool get wantKeepAlive => true;
30
+
31
+  @override
32
+  Widget build(BuildContext context) {
33
+    super.build(context);
34
+    return Column(
35
+      children: [
36
+        Expanded(child: SingleChildScrollView(child: buildList())),
37
+        buildButton(),
38
+      ],
39
+    );
40
+  }
41
+
42
+  Widget buildList() {
43
+    return Column(
44
+      children: [
45
+        CardItemWidget('采样品种', rightText: data?.cypzName, bottomLine: true),
46
+        CardItemWidget('粮食品类', rightText: data?.lspz, bottomLine: true),
47
+        CardItemWidget('样品编号', rightText: data?.ypbh, bottomLine: true),
48
+        CardItemWidget('种植品种', rightText: data?.zzpz, bottomLine: true),
49
+        CardItemWidget('是否优质品种', rightText: data?.sfyzpz?.toString(), bottomLine: true),
50
+        CardItemWidget('优质品种类型', rightText: data?.yzpzlx?.toString(), bottomLine: true),
51
+        CardItemWidget('收获时间', rightText: data?.shsj, bottomLine: true),
52
+        CardItemWidget('扦样时间', rightText: data?.qysj, bottomLine: true),
53
+        CardItemWidget('扦样数量(公斤)', rightText: data?.qysl?.toString(), bottomLine: true),
54
+        CardItemWidget('扦样代表数量(公斤)', rightText: data?.qydbsl?.toString(), bottomLine: true),
55
+        CardItemWidget('温度(℃)', rightText: data?.wendu?.toString(), bottomLine: true),
56
+        CardItemWidget('湿度(%)', rightText: data?.shidu?.toString()),
57
+      ],
58
+    );
59
+  }
60
+
61
+  Widget buildButton() {
62
+    return Container(
63
+      color: const Color(0xFFF1F7F6),
64
+      padding: const EdgeInsets.all(12),
65
+      child: MyButton(
66
+        '重新录入',
67
+        onTap: () => MyRouter.startReapSampleTask(),
68
+      ),
69
+    );
70
+  }
71
+}

lib/page/reap_step/reap_sample_task/reap_sample_basic_page.dart → lib/page/sample_task/reap_sample_task/reap_sample_basic_page.dart


lib/page/reap_step/reap_sample_task/reap_sample_disaster_page.dart → lib/page/sample_task/reap_sample_task/reap_sample_disaster_page.dart


lib/page/reap_step/reap_sample_task/reap_sample_medicine_page.dart → lib/page/sample_task/reap_sample_task/reap_sample_medicine_page.dart


lib/page/reap_step/reap_sample_task/reap_sample_org_page.dart → lib/page/sample_task/reap_sample_task/reap_sample_org_page.dart


+ 40 - 19
lib/page/reap_step/reap_sample_task/reap_sample_task_page.dart

@@ -3,24 +3,43 @@ import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
3 3
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
4 4
 import 'package:lszlgl/base/base_state.dart';
5 5
 import 'package:lszlgl/config/colors.dart';
6
-import 'package:lszlgl/page/reap_step/reap_sample_detail/reap_sample_basic_detail_page.dart';
7
-import 'package:lszlgl/page/reap_step/reap_sample_detail/reap_sample_disaster_detail_page.dart';
8
-import 'package:lszlgl/page/reap_step/reap_sample_detail/reap_sample_medicine_detail_page.dart';
9
-import 'package:lszlgl/page/reap_step/reap_sample_detail/reap_sample_org_detail_page.dart';
10
-import 'package:lszlgl/page/reap_step/reap_sample_detail/reap_sample_variety_detail_page.dart';
11
-import 'package:lszlgl/page/reap_step/reap_sample_task/reap_sample_basic_page.dart';
12
-import 'package:lszlgl/page/reap_step/reap_sample_task/reap_sample_disaster_page.dart';
13
-import 'package:lszlgl/page/reap_step/reap_sample_task/reap_sample_medicine_page.dart';
14
-import 'package:lszlgl/page/reap_step/reap_sample_task/reap_sample_org_page.dart';
15
-import 'package:lszlgl/page/reap_step/reap_sample_task/reap_sample_variety_page.dart';
6
+import 'package:lszlgl/model/rsp/sample_task_rsp.dart';
7
+import 'package:lszlgl/page/sample_task/reap_sample_detail/reap_sample_basic_detail_page.dart';
8
+import 'package:lszlgl/page/sample_task/reap_sample_detail/reap_sample_disaster_detail_page.dart';
9
+import 'package:lszlgl/page/sample_task/reap_sample_detail/reap_sample_medicine_detail_page.dart';
10
+import 'package:lszlgl/page/sample_task/reap_sample_detail/reap_sample_org_detail_page.dart';
11
+import 'package:lszlgl/page/sample_task/reap_sample_detail/reap_sample_variety_detail_page.dart';
12
+import 'package:lszlgl/page/sample_task/reap_sample_task/reap_sample_basic_page.dart';
13
+import 'package:lszlgl/page/sample_task/reap_sample_task/reap_sample_disaster_page.dart';
14
+import 'package:lszlgl/page/sample_task/reap_sample_task/reap_sample_medicine_page.dart';
15
+import 'package:lszlgl/page/sample_task/reap_sample_task/reap_sample_org_page.dart';
16
+import 'package:lszlgl/page/sample_task/reap_sample_task/reap_sample_variety_page.dart';
17
+
18
+class ReapSampleTaskPageArgs {
19
+  final bool detail;
20
+  final SampleTaskItem? data;
21
+
22
+  ReapSampleTaskPageArgs({
23
+    this.detail = false,
24
+    this.data,
25
+  });
26
+
27
+  @override
28
+  String toString() {
29
+    return {
30
+      'detail': detail,
31
+      'data': data != null ? '...' : null,
32
+    }.toString();
33
+  }
34
+}
16 35
 
17 36
 /// 收货扦样任务
18 37
 class ReapSampleTaskPage extends StatefulWidget {
19
-  final bool? detail;
38
+  final ReapSampleTaskPageArgs args;
20 39
 
21 40
   const ReapSampleTaskPage({
22 41
     Key? key,
23
-    this.detail,
42
+    required this.args,
24 43
   }) : super(key: key);
25 44
 
26 45
   @override
@@ -28,6 +47,7 @@ class ReapSampleTaskPage extends StatefulWidget {
28 47
 }
29 48
 
30 49
 class _ReapSampleTaskPageState extends BaseState<ReapSampleTaskPage> with TickerProviderStateMixin {
50
+  late ReapSampleTaskPageArgs args;
31 51
   late PageController pageCtrl;
32 52
 
33 53
   late List<String> tabTextList;
@@ -54,14 +74,15 @@ class _ReapSampleTaskPageState extends BaseState<ReapSampleTaskPage> with Ticker
54 74
   @override
55 75
   void initState() {
56 76
     super.initState();
77
+    args = widget.args;
57 78
     tabTextList = ['基础信息', '品种信息', '灾害污染', '用药情况', '检验机构'];
58
-    if (widget.detail ?? false) {
79
+    if (args.detail) {
59 80
       pageList = [
60
-        ReapSampleBasicDetailPage(),
61
-        ReapSampleVarietyDetailPage(),
62
-        ReapSampleDisasterDetailPage(),
63
-        ReapSampleMedicineDetailPage(),
64
-        ReapSampleOrgDetailPage(),
81
+        ReapSampleBasicDetailPage(args.data),
82
+        ReapSampleVarietyDetailPage(args.data),
83
+        ReapSampleDisasterDetailPage(args.data),
84
+        ReapSampleMedicineDetailPage(args.data),
85
+        ReapSampleOrgDetailPage(args.data),
65 86
       ];
66 87
     } else {
67 88
       pageList = [
@@ -86,7 +107,7 @@ class _ReapSampleTaskPageState extends BaseState<ReapSampleTaskPage> with Ticker
86 107
       dismissOnCapturedTaps: true,
87 108
       child: Column(
88 109
         children: [
89
-          myAppBar(title:(widget.detail ?? false)?'扦样完成详情':'扦样任务单'),
110
+          myAppBar(title: args.detail ? '扦样完成详情' : '扦样任务单'),
90 111
           Expanded(
91 112
             child: Container(
92 113
               clipBehavior: Clip.hardEdge,

+ 2 - 1
lib/page/reap_step/reap_sample_task/reap_sample_variety_page.dart

@@ -1,6 +1,7 @@
1 1
 import 'package:date_format/date_format.dart';
2 2
 import 'package:flutter/material.dart';
3 3
 import 'package:lszlgl/base/base_state.dart';
4
+import 'package:lszlgl/utils/date_time_utils.dart';
4 5
 import 'package:lszlgl/widget/button.dart';
5 6
 import 'package:lszlgl/widget/card_item.dart';
6 7
 
@@ -36,7 +37,7 @@ class _ReapSampleVarietyPageState extends BaseState<ReapSampleVarietyPage> with
36 37
       lastDate: DateTime.now(),
37 38
     );
38 39
     if (date == null) return;
39
-    notifier.value = formatDate(date, [yyyy, '-', mm, '-', dd]);
40
+    notifier.value = DateTimeUtils.yyyymmdd(date: date);
40 41
   }
41 42
 
42 43
   @override

+ 101 - 0
lib/page/sample_task/sample_list_vm.dart

@@ -0,0 +1,101 @@
1
+import 'package:dio/dio.dart';
2
+import 'package:easy_refresh/easy_refresh.dart';
3
+import 'package:flutter/material.dart';
4
+import 'package:lszlgl/base/base_vm.dart';
5
+import 'package:lszlgl/main.dart';
6
+import 'package:lszlgl/model/req/sample_task_list_req.dart';
7
+import 'package:lszlgl/model/rsp/sample_task_rsp.dart';
8
+import 'package:lszlgl/network/api.dart';
9
+
10
+class SampleListVM extends BaseVM {
11
+  SampleListVM() {
12
+    _uncompletedCtrl = EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true);
13
+    _completeCtrl = EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true);
14
+    uncompletedReq = SampleTaskListReq(deliveryStatus: 0);
15
+    completeReq = SampleTaskListReq(deliveryStatus: 1);
16
+  }
17
+
18
+  /// 刷新控制
19
+  late final EasyRefreshController _uncompletedCtrl;
20
+  late final EasyRefreshController _completeCtrl;
21
+
22
+  /// 请求参数
23
+  late final SampleTaskListReq uncompletedReq;
24
+  late final SampleTaskListReq completeReq;
25
+
26
+  /// 页面数据
27
+  final uncompletedPageState =
28
+      DataStatusModel<List<SampleTaskItem>>().notifier<DataStatusModel<List<SampleTaskItem>>>();
29
+  final completePageState = DataStatusModel<List<SampleTaskItem>>().notifier<DataStatusModel<List<SampleTaskItem>>>();
30
+
31
+  /// 当前页面
32
+  final bool currentComplete = false;
33
+
34
+  EasyRefreshController getCtrl(bool complete) => complete ? _completeCtrl : _uncompletedCtrl;
35
+
36
+  SampleTaskListReq getReq(bool complete) => complete ? completeReq : uncompletedReq;
37
+
38
+  ValueNotifier<DataStatusModel<List<SampleTaskItem>>> getPageState(bool complete) =>
39
+      complete ? completePageState : uncompletedPageState;
40
+
41
+  void refresh(bool complete) {
42
+    if (complete) {
43
+      _completeCtrl.callRefresh(overOffset: 100);
44
+    } else {
45
+      _uncompletedCtrl.callRefresh(overOffset: 100);
46
+    }
47
+  }
48
+
49
+  void refreshAll() {
50
+    refresh(false);
51
+    refresh(true);
52
+  }
53
+
54
+  /// 获取数据
55
+  /// * [complete] 刷新页面
56
+  /// * [refresh] 是否刷新 true=刷新, false=加载更多
57
+  void getData(bool complete, {bool refresh = true}) async {
58
+    var req = getReq(complete);
59
+    var pageState = getPageState(complete);
60
+    var ctrl = getCtrl(complete);
61
+    if (refresh) {
62
+      req.pageNo = 1;
63
+    }
64
+    try {
65
+      var value = await Api().sampleTaskList(req.toJson());
66
+      List<SampleTaskItem> data = value.data?.list ?? [];
67
+      var list = pageState.value.data ?? [];
68
+      if (refresh) {
69
+        list = data;
70
+        ctrl.finishRefresh(IndicatorResult.success, true);
71
+        ctrl.resetFooter();
72
+      } else {
73
+        list.addAll(data);
74
+      }
75
+      pageState.update(pageState.value.success(data: list));
76
+      if (data.isEmpty) {
77
+        ctrl.finishLoad(IndicatorResult.noMore, true);
78
+      } else {
79
+        ctrl.finishLoad(IndicatorResult.success, true);
80
+      }
81
+      req.pageNo++;
82
+    } on DioException catch (err) {
83
+      logger.e('${err.message}');
84
+      if (req.pageNo == 1) pageState.update(pageState.value.error());
85
+      if (refresh) {
86
+        ctrl.finishRefresh(IndicatorResult.fail, true);
87
+      } else {
88
+        ctrl.finishLoad(IndicatorResult.fail, true);
89
+      }
90
+    }
91
+  }
92
+
93
+  @override
94
+  void dispose() {
95
+    _uncompletedCtrl.dispose();
96
+    _completeCtrl.dispose();
97
+    uncompletedPageState.dispose();
98
+    completePageState.dispose();
99
+    super.dispose();
100
+  }
101
+}

+ 19 - 68
lib/page/reap_step/sample_task_list_page.dart

@@ -1,18 +1,20 @@
1
-import 'package:dio/dio.dart';
2 1
 import 'package:easy_refresh/easy_refresh.dart';
3 2
 import 'package:flutter/material.dart';
4 3
 import 'package:lszlgl/base/base_lifecycle_state.dart';
5 4
 import 'package:lszlgl/base/base_state.dart';
6 5
 import 'package:lszlgl/base/base_vm.dart';
7 6
 import 'package:lszlgl/config/colors.dart';
8
-import 'package:lszlgl/main.dart';
9 7
 import 'package:lszlgl/model/rsp/sample_task_rsp.dart';
10
-import 'package:lszlgl/network/api.dart';
11
-import 'package:lszlgl/page/reap_step/sample_task_list_tab_page.dart';
8
+import 'package:lszlgl/page/sample_task/sample_list_vm.dart';
9
+import 'package:lszlgl/page/sample_task/sample_task_list_tab_page.dart';
12 10
 import 'package:lszlgl/service/dict_service.dart';
11
+import 'package:lszlgl/utils/date_time_utils.dart';
12
+import 'package:lszlgl/utils/inject.dart';
13 13
 import 'package:lszlgl/widget/button.dart';
14 14
 import 'package:lszlgl/widget/page_widget.dart';
15 15
 
16
+import 'reap_sample_task/reap_sample_task_page.dart';
17
+
16 18
 /// 扦样环节列表
17 19
 class SampleTaskListPage extends StatefulWidget {
18 20
   final StepType type;
@@ -29,19 +31,14 @@ class SampleTaskListPage extends StatefulWidget {
29 31
 }
30 32
 
31 33
 class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> with AutomaticKeepAliveClientMixin {
32
-  late EasyRefreshController refreshCtrl;
33
-
34
-  int pageNo = 1;
35
-  int pageSize = 10;
36
-
37
-  final pageState = DataStatusModel<List<SampleTaskItem>>().notifier<DataStatusModel<List<SampleTaskItem>>>();
34
+  late SampleListVM vm;
38 35
 
39 36
   /// 详情
40
-  void startDetail() {
37
+  void startDetail(SampleTaskItem data) {
41 38
     if (!widget.complete) return;
42 39
     switch (widget.type) {
43 40
       case StepType.reap:
44
-        MyRouter.startReapSampleTask(detail: true);
41
+        MyRouter.startReapSampleTask(args: ReapSampleTaskPageArgs(detail: true,data: data));
45 42
         break;
46 43
       case StepType.stock:
47 44
         break;
@@ -59,60 +56,14 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
59 56
     }
60 57
   }
61 58
 
62
-  void getData({bool first = false, bool refresh = true}) async {
63
-    if (refresh) {
64
-      pageNo = 1;
65
-    }
66
-    try {
67
-      var value = await Api().sampleTaskList(
68
-        pageNo,
69
-        pageSize,
70
-        deliveryStatus: widget.complete ? 1 : 0,
71
-        rwlx: widget.type.value,
72
-      );
73
-      List<SampleTaskItem> data = value.data?.list ?? [];
74
-      var list = pageState.value.data ?? [];
75
-      if (refresh) {
76
-        list = data;
77
-        refreshCtrl.finishRefresh(IndicatorResult.success, true);
78
-        refreshCtrl.resetFooter();
79
-      } else {
80
-        list.addAll(data);
81
-      }
82
-      pageState.update(pageState.value.success(data: list));
83
-      if (data.isEmpty) {
84
-        refreshCtrl.finishLoad(IndicatorResult.noMore, true);
85
-      } else {
86
-        refreshCtrl.finishLoad(IndicatorResult.success, true);
87
-      }
88
-      pageNo++;
89
-    } on DioException catch (err) {
90
-      logger.e('${err.message}');
91
-      if (pageNo == 1) pageState.update(pageState.value.error());
92
-      if (refresh) {
93
-        refreshCtrl.finishRefresh(IndicatorResult.fail, true);
94
-      } else {
95
-        refreshCtrl.finishLoad(IndicatorResult.fail, true);
96
-      }
97
-    }
98
-  }
99
-
100 59
   @override
101 60
   void onInit() {
102
-    refreshCtrl = EasyRefreshController(
103
-      controlFinishRefresh: true,
104
-      controlFinishLoad: true,
105
-    );
61
+    vm = Inject.get<SampleListVM>()!;
106 62
   }
107 63
 
108 64
   @override
109 65
   void onFirstShow(Duration timeStamp) {
110
-    refreshCtrl.callRefresh(overOffset: 200);
111
-  }
112
-
113
-  @override
114
-  void onDestroy() {
115
-    refreshCtrl.dispose();
66
+    vm.refresh(widget.complete);
116 67
   }
117 68
 
118 69
   @override
@@ -131,19 +82,19 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
131 82
 
132 83
   Widget buildBody() {
133 84
     return EasyRefresh.builder(
134
-      controller: refreshCtrl,
135
-      onRefresh: () => getData(refresh: true),
136
-      onLoad: () => getData(refresh: false),
85
+      controller: vm.getCtrl(widget.complete),
86
+      onRefresh: () => vm.getData(widget.complete, refresh: true),
87
+      onLoad: () => vm.getData(widget.complete, refresh: false),
137 88
       childBuilder: (_, physics) => buildList(physics),
138 89
     );
139 90
   }
140 91
 
141 92
   Widget buildList(ScrollPhysics physics) {
142
-    var sliver = pageState.builder((v) {
93
+    var sliver = vm.getPageState(widget.complete).builder((v) {
143 94
       var list = v.data;
144 95
       if (v.status == DataStatus.error) {
145 96
         // 加载失败
146
-        return SliverToBoxAdapter(child: PageLoadingWidget.error(onTap: () => refreshCtrl.callRefresh()));
97
+        return SliverToBoxAdapter(child: PageLoadingWidget.error(onTap: () => vm.refresh(widget.complete)));
147 98
       } else if (list == null || list.isEmpty) {
148 99
         // 无数据
149 100
         return const SliverToBoxAdapter(child: PageLoadingWidget.empty());
@@ -163,7 +114,7 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
163 114
   Widget buildItem(int index, SampleTaskItem item) {
164 115
     return GestureDetector(
165 116
       behavior: HitTestBehavior.opaque,
166
-      onTap: () => startDetail(),
117
+      onTap: () => startDetail(item),
167 118
       child: Container(
168 119
         margin: const EdgeInsets.only(left: 12, right: 12, top: 12),
169 120
         decoration: const BoxDecoration(
@@ -238,7 +189,7 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
238 189
 
239 190
   Widget buildGrid(SampleTaskItem item) {
240 191
     List<Map<String, String>> infoList;
241
-    var jclb = DictService.get().getLabel(DictType.jclb, value: item.jclb)?.label;
192
+    var jclb = DictService.getDict(DictType.jclb, value: item.jclb)?.label;
242 193
     if (widget.complete) {
243 194
       infoList = [
244 195
         {'采样品种': item.cypzName ?? ''},
@@ -286,7 +237,7 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
286 237
             const SizedBox(width: 12),
287 238
             Expanded(
288 239
               child: Text(
289
-                '[${item.qyryName ?? ''}]创建于${item.createTime ?? ''}',
240
+                '[${item.qyryName ?? ''}]创建于${DateTimeUtils.yyyymmdd(timestamp: item.createTime) ?? ''}',
290 241
                 style: const TextStyle(fontSize: 16, color: MyColor.c_666666),
291 242
               ),
292 243
             ),

+ 14 - 1
lib/page/reap_step/sample_task_list_tab_page.dart

@@ -1,7 +1,9 @@
1 1
 import 'package:flutter/material.dart';
2 2
 import 'package:lszlgl/base/base_lifecycle_state.dart';
3 3
 import 'package:lszlgl/config/colors.dart';
4
-import 'package:lszlgl/page/reap_step/sample_task_list_page.dart';
4
+import 'package:lszlgl/page/sample_task/sample_list_vm.dart';
5
+import 'package:lszlgl/page/sample_task/sample_task_list_page.dart';
6
+import 'package:lszlgl/utils/inject.dart';
5 7
 
6 8
 enum StepType {
7 9
   reap('收获环节', 1),
@@ -45,8 +47,14 @@ class _SampleTaskListTabPageState extends BaseLifecycleState<SampleTaskListTabPa
45 47
   late List<String> tabTextList;
46 48
   late List<Widget> pageList;
47 49
 
50
+  late SampleListVM vm;
51
+
48 52
   @override
49 53
   void onInit() {
54
+    vm = Inject.put<SampleListVM>(SampleListVM(), dispose: (v) => v.dispose());
55
+    vm.uncompletedReq.rwlx = widget.args.type.value;
56
+    vm.completeReq.rwlx = widget.args.type.value;
57
+
50 58
     tabCtrl = TabController(length: 2, vsync: this);
51 59
     pageCtrl = PageController();
52 60
 
@@ -58,6 +66,11 @@ class _SampleTaskListTabPageState extends BaseLifecycleState<SampleTaskListTabPa
58 66
   }
59 67
 
60 68
   @override
69
+  void onDestroy() {
70
+    Inject.remove<SampleListVM>();
71
+  }
72
+
73
+  @override
61 74
   Widget build(BuildContext context) {
62 75
     return myScaffold(child: buildBody());
63 76
   }

+ 5 - 7
lib/router/my_router.dart

@@ -1,7 +1,7 @@
1 1
 import 'package:lszlgl/page/login/login_page.dart';
2 2
 import 'package:lszlgl/page/main_tab_page.dart';
3
-import 'package:lszlgl/page/reap_step/reap_sample_task/reap_sample_task_page.dart';
4
-import 'package:lszlgl/page/reap_step/sample_task_list_tab_page.dart';
3
+import 'package:lszlgl/page/sample_task/reap_sample_task/reap_sample_task_page.dart';
4
+import 'package:lszlgl/page/sample_task/sample_task_list_tab_page.dart';
5 5
 import 'package:lszlgl/page/user_center/account_manage_page.dart';
6 6
 import 'package:lszlgl/page/user_center/change_pwd_page.dart';
7 7
 import 'package:lszlgl/page/user_center/setting_page.dart';
@@ -30,7 +30,7 @@ final Map<String, MyNavigatorBuilder> rRouteMap = {
30 30
   rSettingPage: (context, args) => const SettingPage(),
31 31
   rChangePwdPage: (context, args) => const ChangePwdPage(),
32 32
   rSampleTaskListTabPage: (context, args) => SampleTaskListTabPage(args: args as SampleTaskListTabPageArgs?),
33
-  rReapSampleTaskPage: (context, args) => ReapSampleTaskPage(detail: args as bool?),
33
+  rReapSampleTaskPage: (context, args) => ReapSampleTaskPage(args: args as ReapSampleTaskPageArgs),
34 34
 };
35 35
 
36 36
 class MyRouter {
@@ -75,9 +75,7 @@ class MyRouter {
75 75
   }
76 76
 
77 77
   /// 收获扦样任务
78
-  static void startReapSampleTask({bool detail = false}) {
79
-    MyNavigator.push(rReapSampleTaskPage, args: detail);
78
+  static void startReapSampleTask({ReapSampleTaskPageArgs? args}) {
79
+    MyNavigator.push(rReapSampleTaskPage, args: args ?? ReapSampleTaskPageArgs());
80 80
   }
81 81
 }
82
-
83
-

+ 9 - 9
lib/service/dict_service.dart

@@ -12,17 +12,13 @@ enum DictType {
12 12
 class DictService {
13 13
   DictService._();
14 14
 
15
-  static DictService? _instance;
15
+  static List<DictRsp>? _dictList;
16 16
 
17
-  static DictService get() => _instance ??= DictService._();
17
+  static List<DictRsp> get dictList => _dictList ??= [];
18 18
 
19
-  List<DictRsp>? _dictList;
19
+  static final Map<String, Map<String, DictRsp>> _dictMap = {};
20 20
 
21
-  List<DictRsp> get dictList => _dictList ??= [];
22
-
23
-  final Map<String, Map<String, DictRsp>> _dictMap = {};
24
-
25
-  void saveDictList(List<DictRsp>? list) {
21
+  static void saveDictList(List<DictRsp>? list) {
26 22
     if (list == null) return;
27 23
     _dictList = list;
28 24
     // 按类型存储字典
@@ -34,7 +30,7 @@ class DictService {
34 30
     }
35 31
   }
36 32
 
37
-  DictRsp? getLabel(DictType type, {num? value, String? valueStr}) {
33
+  static DictRsp? getDict(DictType type, {num? value, String? valueStr}) {
38 34
     String? v;
39 35
     if (valueStr == null) {
40 36
       if (value == null) return null;
@@ -44,4 +40,8 @@ class DictService {
44 40
     }
45 41
     return _dictMap[type.type]?[v];
46 42
   }
43
+
44
+  static String? getLabel(DictType type, {num? value, String? valueStr}) {
45
+    return getDict(type, value: value, valueStr: valueStr)?.label;
46
+  }
47 47
 }

+ 54 - 0
lib/utils/date_time_utils.dart

@@ -0,0 +1,54 @@
1
+import 'package:date_format/date_format.dart';
2
+
3
+class DateTimeUtils {
4
+  DateTimeUtils._();
5
+
6
+  /// 年-月-日
7
+  static String? yyyymmdd({
8
+    DateTime? date,
9
+    num? timestamp,
10
+  }) {
11
+    var dateTime = getDateTime(date: date, timestamp: timestamp);
12
+    if (dateTime == null) return null;
13
+    return formatDate(dateTime, [yyyy, '-', mm, '-', dd]);
14
+  }
15
+
16
+  /// 年-月-日 时:分:秒
17
+  static String? yyyymmddHHnnss({
18
+    DateTime? date,
19
+    num? timestamp,
20
+  }) {
21
+    var dateTime = getDateTime(date: date, timestamp: timestamp);
22
+    if (dateTime == null) return null;
23
+    return formatDate(dateTime, [yyyy, '-', mm, '-', dd, ' ', HH, ':', nn, ':', ss]);
24
+  }
25
+
26
+  /// 年-月-日 时:分
27
+  static String? yyyymmddHHnn({
28
+    DateTime? date,
29
+    num? timestamp,
30
+  }) {
31
+    var dateTime = getDateTime(date: date, timestamp: timestamp);
32
+    if (dateTime == null) return null;
33
+    return formatDate(dateTime, [yyyy, '-', mm, '-', dd, ' ', HH, ':', nn]);
34
+  }
35
+
36
+  /// 时:分:秒
37
+  static String? HHnnss({
38
+    DateTime? date,
39
+    num? timestamp,
40
+  }) {
41
+    var dateTime = getDateTime(date: date, timestamp: timestamp);
42
+    if (dateTime == null) return null;
43
+    return formatDate(dateTime, [HH, ':', nn, ':', ss]);
44
+  }
45
+
46
+  static DateTime? getDateTime({
47
+    DateTime? date,
48
+    num? timestamp,
49
+  }) {
50
+    if (date != null) return date;
51
+    if (timestamp != null) return DateTime.fromMillisecondsSinceEpoch(timestamp.toInt());
52
+    return null;
53
+  }
54
+}

File diff suppressed because it is too large
+ 132 - 132
pubspec.lock