Bläddra i källkod

v0.0.7 修改App名称;增加待领取列表;灾害类型默认值为无;

mq 1 år sedan
förälder
incheckning
bf44e9d812

+ 1 - 1
android/app/src/main/AndroidManifest.xml

@@ -41,7 +41,7 @@
41 41
     <application
42 42
         android:name="${applicationName}"
43 43
         android:icon="@drawable/ic_launcher"
44
-        android:label="粮食质量管理">
44
+        android:label="粮食质">
45 45
         <activity
46 46
             android:name=".MainActivity"
47 47
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"

+ 29 - 7
lib/page/sample_task/reap_sample_detail/reap_sample_disaster_detail_page.dart

@@ -22,7 +22,8 @@ class ReapSampleDisasterDetailPage extends StatefulWidget {
22 22
   State<ReapSampleDisasterDetailPage> createState() => _ReapSampleDisasterDetailPageState();
23 23
 }
24 24
 
25
-class _ReapSampleDisasterDetailPageState extends BaseLifecycleState<ReapSampleDisasterDetailPage> with AutomaticKeepAliveClientMixin {
25
+class _ReapSampleDisasterDetailPageState extends BaseLifecycleState<ReapSampleDisasterDetailPage>
26
+    with AutomaticKeepAliveClientMixin {
26 27
   SampleTaskItem? data;
27 28
   late bool isDetail;
28 29
 
@@ -75,7 +76,8 @@ class _ReapSampleDisasterDetailPageState extends BaseLifecycleState<ReapSampleDi
75 76
     num? selValue,
76 77
   ) {
77 78
     // 菜单数据
78
-    notifier.value = (DictService.getDictList(type) ?? []).map((e) => CardMenuData(e.label, e.value)).toList();
79
+    notifier.value =
80
+        (DictService.getDictList(type) ?? []).map((e) => CardMenuData(e.label, num.parse(e.value ?? '0'))).toList();
79 81
     // 选中项
80 82
     DictRsp? dict = DictService.getDict(type, value: selValue);
81 83
     if (dict != null) selNotifier.value = CardMenuData(dict.label, dict.value);
@@ -91,18 +93,30 @@ class _ReapSampleDisasterDetailPageState extends BaseLifecycleState<ReapSampleDi
91 93
 
92 94
     // 工厂排污类型
93 95
     setDictMenuNotifier(gcpwlxList, gcpwlx, DictType.gcpwlx, data?.gcpwlx);
96
+    if (data?.gcpwlx == null) {
97
+      gcpwlx.value = gcpwlxList.value[0];
98
+      data?.gcpwlx = gcpwlxList.value[0].value;
99
+    }
94 100
 
95 101
     // 水源、土壤污染
96 102
     setBoolMenuSelNotifier(zztdzwsysytrsfywr, data?.zztdzwsysytrsfywr ?? false);
97 103
 
98 104
     // 污染物类型
99 105
     setDictMenuNotifier(wrwlxList, wrwlx, DictType.wrwlx, data?.wrwlx);
106
+    if (data?.wrwlx == null) {
107
+      wrwlx.value = wrwlxList.value[0];
108
+      data?.wrwlx = wrwlxList.value[0].value;
109
+    }
100 110
 
101 111
     // 病虫害
102 112
     setBoolMenuSelNotifier(scgczsffsbjyzdbch, data?.scgczsffsbjyzdbch ?? false);
103 113
 
104 114
     // 病虫害类型
105 115
     setDictMenuNotifier(bchlxList, bchlx, DictType.bchlx, data?.bchlx);
116
+    if (data?.bchlx == null) {
117
+      bchlx.value = bchlxList.value[0];
118
+      data?.bchlx = bchlxList.value[0].value;
119
+    }
106 120
 
107 121
     // 收货期间是否发生连阴雨天气
108 122
     setNumBoolMenuSelNotifier(shqjsffslyytq, data?.shqjsffslyytq ?? 1);
@@ -115,12 +129,20 @@ class _ReapSampleDisasterDetailPageState extends BaseLifecycleState<ReapSampleDi
115 129
 
116 130
     // 真菌毒素污染类型
117 131
     setDictMenuNotifier(zjdswrlxList, zjdswrlx, DictType.zjdswrlx, data?.zjdswrlx);
132
+    if (data?.zjdswrlx == null) {
133
+      zjdswrlx.value = zjdswrlxList.value[0];
134
+      data?.zjdswrlx = zjdswrlxList.value[0].value;
135
+    }
118 136
 
119 137
     // 近年来本地是否发生重金属污染
120 138
     setNumBoolMenuSelNotifier(jnlbdsfzjswr, data?.jnlbdsfzjswr ?? 1);
121 139
 
122 140
     // 重金属污染类型
123 141
     setDictMenuNotifier(zjswrlxList, zjswrlx, DictType.zjswrlx, data?.zjswrlx);
142
+    if (data?.zjswrlx == null) {
143
+      zjswrlx.value = zjswrlxList.value[0];
144
+      data?.zjswrlx = zjswrlxList.value[0].value;
145
+    }
124 146
   }
125 147
 
126 148
   @override
@@ -147,7 +169,7 @@ class _ReapSampleDisasterDetailPageState extends BaseLifecycleState<ReapSampleDi
147 169
           '工厂排污类型',
148 170
           gcpwlxList,
149 171
           gcpwlx,
150
-          (_, sel) => data?.gcpwlx = num.parse(sel.value),
172
+          (_, sel) => data?.gcpwlx = sel.value,
151 173
         ),
152 174
         CardWidgets.buildMenu(
153 175
           isDetail,
@@ -161,7 +183,7 @@ class _ReapSampleDisasterDetailPageState extends BaseLifecycleState<ReapSampleDi
161 183
           '污染物类型',
162 184
           wrwlxList,
163 185
           wrwlx,
164
-          (_, sel) => data?.wrwlx = num.parse(sel.value),
186
+          (_, sel) => data?.wrwlx = sel.value,
165 187
         ),
166 188
         CardWidgets.buildMenu(
167 189
           isDetail,
@@ -175,7 +197,7 @@ class _ReapSampleDisasterDetailPageState extends BaseLifecycleState<ReapSampleDi
175 197
           '病虫害类型',
176 198
           bchlxList,
177 199
           bchlx,
178
-          (_, sel) => data?.bchlx = num.parse(sel.value),
200
+          (_, sel) => data?.bchlx = sel.value,
179 201
         ),
180 202
         CardWidgets.buildMenu(
181 203
           isDetail,
@@ -203,7 +225,7 @@ class _ReapSampleDisasterDetailPageState extends BaseLifecycleState<ReapSampleDi
203 225
           '真菌毒素污染类型',
204 226
           zjdswrlxList,
205 227
           zjdswrlx,
206
-          (_, sel) => data?.zjdswrlx = num.parse(sel.value),
228
+          (_, sel) => data?.zjdswrlx = sel.value,
207 229
         ),
208 230
         CardWidgets.buildMenu(
209 231
           isDetail,
@@ -217,7 +239,7 @@ class _ReapSampleDisasterDetailPageState extends BaseLifecycleState<ReapSampleDi
217 239
           '重金属污染类型',
218 240
           zjswrlxList,
219 241
           zjswrlx,
220
-          (_, sel) => data?.zjswrlx = num.parse(sel.value),
242
+          (_, sel) => data?.zjswrlx = sel.value,
221 243
         ),
222 244
       ],
223 245
     );

+ 3 - 0
lib/page/sample_task/reap_sample_detail/reap_sample_task_page.dart

@@ -46,6 +46,8 @@ class ReapSampleTaskPage extends StatefulWidget {
46 46
 class _ReapSampleTaskPageState extends BaseLifecycleState<ReapSampleTaskPage> with TickerProviderStateMixin {
47 47
   late ReapSampleTaskPageArgs args;
48 48
 
49
+  bool isDetail = false;
50
+
49 51
   final pageStatus = DataStatusModel<SampleTaskItem?>().notifier<DataStatusModel<SampleTaskItem?>>();
50 52
 
51 53
   late PageController pageCtrl;
@@ -100,6 +102,7 @@ class _ReapSampleTaskPageState extends BaseLifecycleState<ReapSampleTaskPage> wi
100 102
       if (data == null) {
101 103
         pageStatus.update(pageStatus.value.empty());
102 104
       } else {
105
+        isDetail = data.deliveryStatus != 1;
103 106
         cratePageList(data);
104 107
         pageStatus.update(pageStatus.value.success(data: data));
105 108
       }

+ 15 - 7
lib/page/sample_task/reap_sample_detail/reap_sample_variety_detail_page.dart

@@ -25,7 +25,8 @@ class ReapSampleVarietyDetailPage extends StatefulWidget {
25 25
   State<ReapSampleVarietyDetailPage> createState() => _ReapSampleVarietyDetailPageState();
26 26
 }
27 27
 
28
-class _ReapSampleVarietyDetailPageState extends BaseLifecycleState<ReapSampleVarietyDetailPage> with AutomaticKeepAliveClientMixin {
28
+class _ReapSampleVarietyDetailPageState extends BaseLifecycleState<ReapSampleVarietyDetailPage>
29
+    with AutomaticKeepAliveClientMixin {
29 30
   SampleTaskItem? data;
30 31
   late bool isDetail;
31 32
   late Widget arrowDown;
@@ -41,6 +42,7 @@ class _ReapSampleVarietyDetailPageState extends BaseLifecycleState<ReapSampleVar
41 42
   /// 优质品种类型
42 43
   final yzpzlxList = <CardMenuData>[].notifier<List<CardMenuData>>();
43 44
   final yzpzlx = null.notifier<CardMenuData?>();
45
+  final yzpzlxEnable = true.notifier<bool>();
44 46
 
45 47
   /// 收获时间
46 48
   final shsj = null.notifier<String?>();
@@ -85,6 +87,10 @@ class _ReapSampleVarietyDetailPageState extends BaseLifecycleState<ReapSampleVar
85 87
       yzlxType = DictType.dgpzyzlx;
86 88
     } else if (cypzName.contains('大豆')) {
87 89
       yzlxType = DictType.ddyzpzlx;
90
+    } else {
91
+      yzpzlxEnable.value = false;
92
+      data?.sfyzpz = 1;
93
+      sfyzpz.value = CardMenuData(StringUtils.boolStrByNum(data?.sfyzpz), data?.sfyzpz);
88 94
     }
89 95
     // 优质品种类型下拉
90 96
     yzpzlxList.value = (DictService.getDictList(yzlxType) ?? []).map((e) => CardMenuData(e.label, e.value)).toList();
@@ -152,12 +158,14 @@ class _ReapSampleVarietyDetailPageState extends BaseLifecycleState<ReapSampleVar
152 158
           data?.jtpzmc,
153 159
           onChanged: (value) => data?.jtpzmc = value,
154 160
         ),
155
-        CardWidgets.buildMenu(
156
-          isDetail,
157
-          '是否优质品种',
158
-          sfList,
159
-          sfyzpz,
160
-          (_, sel) => data?.sfyzpz = sel.value,
161
+        yzpzlxEnable.builder(
162
+          (enable) => CardWidgets.buildMenu(
163
+            isDetail || !enable,
164
+            '是否优质品种',
165
+            sfList,
166
+            sfyzpz,
167
+            (_, sel) => data?.sfyzpz = sel.value,
168
+          ),
161 169
         ),
162 170
         CardWidgets.buildMenu(
163 171
           isDetail,

+ 35 - 41
lib/page/sample_task/sample_list_vm.dart

@@ -9,56 +9,48 @@ import 'package:lszlgl/model/rsp/sample_task_rsp.dart';
9 9
 import '../../network/my_api.dart';
10 10
 
11 11
 class SampleListVM extends BaseVM {
12
+  late List<EasyRefreshController> ctrlList;
13
+  late List<SampleTaskListReq> reqList;
14
+  late List<ValueNotifier<DataStatusModel<List<SampleTaskItem>>>> pageStateList;
15
+
12 16
   SampleListVM() {
13
-    _uncompletedCtrl = EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true);
14
-    _completeCtrl = EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true);
15
-    uncompletedReq = SampleTaskListReq(deliveryStatus: 1);
16
-    completeReq = SampleTaskListReq(deliveryStatus: 2);
17
+    pageStateList = [
18
+      DataStatusModel<List<SampleTaskItem>>().notifier<DataStatusModel<List<SampleTaskItem>>>(),
19
+      DataStatusModel<List<SampleTaskItem>>().notifier<DataStatusModel<List<SampleTaskItem>>>(),
20
+      DataStatusModel<List<SampleTaskItem>>().notifier<DataStatusModel<List<SampleTaskItem>>>(),
21
+    ];
22
+    ctrlList = [
23
+      EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true),
24
+      EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true),
25
+      EasyRefreshController(controlFinishRefresh: true, controlFinishLoad: true),
26
+    ];
27
+    reqList = [
28
+      SampleTaskListReq(deliveryStatus: 0),
29
+      SampleTaskListReq(deliveryStatus: 1),
30
+      SampleTaskListReq(deliveryStatus: 2),
31
+    ];
17 32
   }
18 33
 
19
-  /// 刷新控制
20
-  late final EasyRefreshController _uncompletedCtrl;
21
-  late final EasyRefreshController _completeCtrl;
22
-
23
-  /// 请求参数
24
-  late final SampleTaskListReq uncompletedReq;
25
-  late final SampleTaskListReq completeReq;
26
-
27
-  /// 页面数据
28
-  final uncompletedPageState =
29
-      DataStatusModel<List<SampleTaskItem>>().notifier<DataStatusModel<List<SampleTaskItem>>>();
30
-  final completePageState = DataStatusModel<List<SampleTaskItem>>().notifier<DataStatusModel<List<SampleTaskItem>>>();
31
-
32 34
   /// 当前页面
33 35
   final bool currentComplete = false;
34 36
 
35
-  EasyRefreshController getCtrl(bool complete) => complete ? _completeCtrl : _uncompletedCtrl;
36
-
37
-  SampleTaskListReq getReq(bool complete) => complete ? completeReq : uncompletedReq;
38
-
39
-  ValueNotifier<DataStatusModel<List<SampleTaskItem>>> getPageState(bool complete) =>
40
-      complete ? completePageState : uncompletedPageState;
41
-
42
-  void refresh(bool complete) {
43
-    if (complete) {
44
-      _completeCtrl.callRefresh(overOffset: 100);
45
-    } else {
46
-      _uncompletedCtrl.callRefresh(overOffset: 100);
47
-    }
37
+  void refresh(int index) {
38
+    ctrlList[index].callRefresh(overOffset: 100);
48 39
   }
49 40
 
50 41
   void refreshAll() {
51
-    refresh(false);
52
-    refresh(true);
42
+    refresh(0);
43
+    refresh(1);
44
+    refresh(2);
53 45
   }
54 46
 
55 47
   /// 获取数据
56
-  /// * [complete] 刷新页面
48
+  /// * [index] 页面索引
57 49
   /// * [refresh] 是否刷新 true=刷新, false=加载更多
58
-  void getData(bool complete, {bool refresh = true}) async {
59
-    var req = getReq(complete);
60
-    var pageState = getPageState(complete);
61
-    var ctrl = getCtrl(complete);
50
+  void getData(int index, {bool refresh = true}) async {
51
+    var req = reqList[index];
52
+    var pageState = pageStateList[index];
53
+    var ctrl = ctrlList[index];
62 54
     if (refresh) {
63 55
       req.pageNo = 1;
64 56
     }
@@ -93,10 +85,12 @@ class SampleListVM extends BaseVM {
93 85
 
94 86
   @override
95 87
   void dispose() {
96
-    _uncompletedCtrl.dispose();
97
-    _completeCtrl.dispose();
98
-    uncompletedPageState.dispose();
99
-    completePageState.dispose();
88
+    for (var ctrl in ctrlList) {
89
+      ctrl.dispose();
90
+    }
91
+    for (var pageState in pageStateList) {
92
+      pageState.dispose();
93
+    }
100 94
     super.dispose();
101 95
   }
102 96
 }

+ 14 - 13
lib/page/sample_task/sample_task_list_page.dart

@@ -1,7 +1,6 @@
1 1
 import 'package:easy_refresh/easy_refresh.dart';
2 2
 import 'package:flutter/material.dart';
3 3
 import 'package:lszlgl/base/base_lifecycle_state.dart';
4
-import 'package:lszlgl/base/base_state.dart';
5 4
 import 'package:lszlgl/base/base_vm.dart';
6 5
 import 'package:lszlgl/config/colors.dart';
7 6
 import 'package:lszlgl/model/rsp/sample_task_rsp.dart';
@@ -20,12 +19,12 @@ import 'stock_sample_detail/stock_sample_task_page.dart';
20 19
 /// 扦样环节列表
21 20
 class SampleTaskListPage extends StatefulWidget {
22 21
   final StepType type;
23
-  final bool complete;
22
+  final int tabIndex;
24 23
 
25 24
   const SampleTaskListPage({
26 25
     super.key,
27 26
     required this.type,
28
-    this.complete = false,
27
+    required this.tabIndex,
29 28
   });
30 29
 
31 30
   @override
@@ -73,7 +72,7 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
73 72
 
74 73
   @override
75 74
   void onFirstShow(Duration timeStamp) {
76
-    vm.refresh(widget.complete);
75
+    vm.refresh(widget.tabIndex);
77 76
   }
78 77
 
79 78
   @override
@@ -92,19 +91,19 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
92 91
 
93 92
   Widget buildBody() {
94 93
     return EasyRefresh.builder(
95
-      controller: vm.getCtrl(widget.complete),
96
-      onRefresh: () => vm.getData(widget.complete, refresh: true),
97
-      onLoad: () => vm.getData(widget.complete, refresh: false),
94
+      controller: vm.ctrlList[widget.tabIndex],
95
+      onRefresh: () => vm.getData(widget.tabIndex, refresh: true),
96
+      onLoad: () => vm.getData(widget.tabIndex, refresh: false),
98 97
       childBuilder: (_, physics) => buildList(physics),
99 98
     );
100 99
   }
101 100
 
102 101
   Widget buildList(ScrollPhysics physics) {
103
-    var sliver = vm.getPageState(widget.complete).builder((v) {
102
+    var sliver = vm.pageStateList[widget.tabIndex].builder((v) {
104 103
       var list = v.data;
105 104
       if (v.status == DataStatus.error) {
106 105
         // 加载失败
107
-        return SliverToBoxAdapter(child: PageLoadingWidget.error(onTap: () => vm.refresh(widget.complete)));
106
+        return SliverToBoxAdapter(child: PageLoadingWidget.error(onTap: () => vm.refresh(widget.tabIndex)));
108 107
       } else if (list == null || list.isEmpty) {
109 108
         // 无数据
110 109
         return const SliverToBoxAdapter(child: PageLoadingWidget.empty());
@@ -125,7 +124,7 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
125 124
     return GestureDetector(
126 125
       behavior: HitTestBehavior.opaque,
127 126
       onTap: () {
128
-        if (!widget.complete) return;
127
+        if (item.deliveryStatus != 2) return;
129 128
         startTaskDetail(true, item);
130 129
       },
131 130
       child: Container(
@@ -202,7 +201,8 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
202 201
 
203 202
   Widget buildGrid(SampleTaskItem item) {
204 203
     List<Map<String, String?>> infoList;
205
-    if (!widget.complete) {
204
+    if (item.deliveryStatus != 2) {
205
+      // 未扦样
206 206
       infoList = [
207 207
         {'采样品种': item.cypzName},
208 208
         {'检验指标': item.jyzb},
@@ -210,6 +210,7 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
210 210
         {'扦样地区': item.qydq},
211 211
       ];
212 212
     } else {
213
+      // 已扦样
213 214
       infoList = [
214 215
         {'采样品种': item.cypzName},
215 216
         {'检验指标': item.jyzb},
@@ -240,8 +241,8 @@ class _SampleTaskListPageState extends BaseLifecycleState<SampleTaskListPage> wi
240 241
   }
241 242
 
242 243
   Widget buildBottom(SampleTaskItem item) {
243
-    if (widget.complete) return const SizedBox.shrink();
244
-    Widget button;
244
+    if (item.deliveryStatus == 2) return const SizedBox.shrink();
245
+    Widget button = const SizedBox.shrink();
245 246
     if (widget.type == StepType.reap && item.deliveryStatus == 0) {
246 247
       button = MyButton(
247 248
         '任务领取',

+ 10 - 8
lib/page/sample_task/sample_task_list_tab_page.dart

@@ -52,17 +52,19 @@ class _SampleTaskListTabPageState extends BaseLifecycleState<SampleTaskListTabPa
52 52
   @override
53 53
   void onInit() {
54 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;
55
+    for (var req in vm.reqList) {
56
+      req.rwlx = widget.args.type.value;
57
+    }
57 58
 
58
-    tabCtrl = TabController(length: 2, vsync: this);
59
-    pageCtrl = PageController();
60
-
61
-    tabTextList = ['未扦样', '已扦样'];
59
+    tabTextList = ['待领取', '待扦样', '已扦样'];
62 60
     pageList = [
63
-      SampleTaskListPage(type: widget.args.type),
64
-      SampleTaskListPage(type: widget.args.type, complete: true),
61
+      SampleTaskListPage(type: widget.args.type, tabIndex: 0),
62
+      SampleTaskListPage(type: widget.args.type, tabIndex: 1),
63
+      SampleTaskListPage(type: widget.args.type, tabIndex: 2),
65 64
     ];
65
+
66
+    tabCtrl = TabController(length: tabTextList.length, vsync: this);
67
+    pageCtrl = PageController();
66 68
   }
67 69
 
68 70
   @override

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 135 - 135
pubspec.lock


+ 1 - 1
pubspec.yaml

@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
16 16
 # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
17 17
 # In Windows, build-name is used as the major, minor, and patch parts
18 18
 # of the product and file versions while build-number is used as the build suffix.
19
-version: 0.0.6+6
19
+version: 0.0.7+7
20 20
 
21 21
 environment:
22 22
   sdk: '>=3.1.5 <4.0.0'