周睿 2 vuotta sitten
vanhempi
commit
02903063e7

+ 2 - 1
app_business/lib/app_config.dart

@@ -1,5 +1,6 @@
 class AppConfig {
-  static String apiHost = "otapi.beswell.com";
+  // static String apiHost = "otapi.beswell.com";
   // static String apiHost = "t-otapi.beswell.com";
+  static String apiHost = 'totapi-lc.beswell.com';
   static int apiPort = 10001;
 }

+ 15 - 0
app_business/lib/service/api.dart

@@ -3,6 +3,7 @@ import 'dart:typed_data';
 
 import 'package:app_business/app_config.dart';
 import 'package:app_business/generated/base.pb.dart' as pb;
+import 'package:app_business/generated/google/protobuf/timestamp.pb.dart' as pb;
 import 'package:app_business/generated/track_offical.pbgrpc.dart' as pb;
 import 'package:app_business/service/app.dart';
 import 'package:common_pub/model.dart';
@@ -12,6 +13,10 @@ import 'package:track_common/track_common.dart';
 
 import 'abase.dart';
 
+export 'package:app_business/generated/google/protobuf/timestamp.pb.dart';
+export 'package:app_business/generated/track_offical.pbgrpc.dart'
+    show ToMatchRegusterAddRequest, ToMatchRegusterListRequest;
+
 typedef SmsType = pb.SmsType;
 typedef IdRequest = pb.IdRequest;
 
@@ -21,6 +26,16 @@ extension _ImageExt on pb.NetImage {
   }
 }
 
+extension DateTimeExt on DateTime? {
+  pb.Timestamp toPb() {
+    if (this != null) {
+      return pb.Timestamp.fromDateTime(this!.toUtc());
+    } else {
+      return pb.Timestamp();
+    }
+  }
+}
+
 class ApiService extends IService {
   ClientChannel? channel;
 

+ 41 - 13
app_business/lib/view/home/event_manage/event_manage.dart

@@ -14,27 +14,55 @@ class EventManage extends GetView<EventManagerController> {
               level1: level1(),
               level2: level2(),
               level1Title: '赛事列表',
+              level1Action: wDate(context),
               level2Title: '用户列表',
               level2SubTitle: Obx(() => Text(
-                    c.selected.value?.name != null
-                        ? '(${c.selected.value!.name})'
-                        : '',
+                    c.selected?.name != null ? '(${c.selected!.name})' : '',
                     style: const TextStyle(color: Colors.grey, fontSize: 14.22),
                   )));
         });
   }
 
-  Iterable<Widget> level1() {
-    return controller.eventList.map((e) => Obx(() => AppTitleList(
-        title: e.name,
-        tail: Text('${e.userCount}'),
-        isSelected: controller.selected.value?.id == e.id)));
+  Widget wDate(BuildContext context) {
+    return GestureDetector(
+        onTap: () => _onTapDate(context),
+        child: Obx(() => Container(
+              height: 22.04,
+              padding: const EdgeInsets.symmetric(horizontal: 8),
+              decoration: BoxDecoration(
+                  border:
+                      Border.all(color: const Color(0xffe3e3e3), width: 0.71),
+                  borderRadius: BorderRadius.circular(2.13)),
+              child: Text(controller.dateStr),
+            )));
   }
 
-  Iterable<Widget> level2() {
-    return controller.eventList.map((e) => Obx(() => AppTitleList(
-        title: e.name,
-        tail: Text('${e.userCount}'),
-        isSelected: controller.selected.value?.id == e.id)));
+  Future<void> _onTapDate(BuildContext context) async {
+    final date = await showDatePicker(
+        context: context,
+        initialDate: controller.filterDate.value,
+        firstDate: DateTime.now(),
+        lastDate: DateTime.now().add(365.days));
+
+    if (date != null) {
+      controller.filterDate.value = date;
+      controller.flushList();
+    }
+  }
+
+  Widget level1() {
+    return Obx(() => ListView(
+        children: controller.eventList
+            .map((e) => AppTitleList(
+                  title: e.name,
+                  tail: Text('${e.userCount}'),
+                  isSelected: controller.selectedId.value == e.id,
+                  onTap: () => controller.selectedId.value = e.id,
+                ))
+            .toList()));
+  }
+
+  Widget level2() {
+    return SizedBox();
   }
 }

+ 65 - 1
app_business/lib/view/home/event_manage/event_manage_controller.dart

@@ -1,12 +1,76 @@
 import 'package:app_business/service/abase.dart';
+import 'package:app_business/service/api.dart';
+import 'package:fixnum/fixnum.dart';
+import 'package:track_common/service/map_watch.dart';
 
 class EventInManage {
   int id = 0;
   String name = '';
   int userCount = 0;
+  String qrCode = '';
+  var isAllowEdit = true;
+  var userList = <UserInManage>[];
+}
+
+class UserInManage {
+  var id = 0;
+  var checkId = 0;
+  var name = '';
+  var phone = '';
+  var checkTime = '';
 }
 
 class EventManagerController extends GetxController {
-  final selected = Rx<EventInManage?>(null);
+  final selectedId = Rx<int?>(null);
   final eventList = <EventInManage>[].obs;
+  ApiService get _api => Get.find();
+  final filterDate = DateTime.now().obs;
+
+  EventInManage? get selected {
+    for (var e in eventList) {
+      if (e.id == selectedId.value) {
+        return e;
+      }
+    }
+    return null;
+  }
+
+  Iterable<UserInManage> get userList => selected?.userList ?? [];
+
+  String get dateStr =>
+      '${filterDate.value.year}-${filterDate.value.month}-${filterDate.value.day}';
+
+  @override
+  void onInit() {
+    super.onInit();
+
+    flushList();
+  }
+
+  Future<void> flushList() async {
+    final mapWatch = Get.find<MapWatchService>().instance;
+
+    if (mapWatch != null) {
+      final date = filterDate.value;
+      final d = DateTime(date.year, date.month, date.day);
+
+      final r = await _api.stub.toMatchRegusterList(ToMatchRegusterListRequest()
+        ..mapId = mapWatch.id
+        ..startSecond = Int64(d.millisecondsSinceEpoch ~/ 1000));
+
+      eventList.value = r.list
+          .map((e) => EventInManage()
+            ..id = e.id
+            ..name = e.name
+            ..userList = e.userList
+                .map((u) => UserInManage()
+                  ..id = u.oId
+                  ..checkId = u.marId
+                  ..name = u.nickname
+                  ..phone = u.phone
+                  ..checkTime = u.chackInsTime)
+                .toList())
+          .toList();
+    }
+  }
 }

+ 16 - 4
app_business/lib/view/home/field_control.dart

@@ -24,10 +24,7 @@ class FieldControlPageImpl extends FieldControlPage {
                   width: double.infinity,
                   child: DarkButton(
                       onPressed: mapWatch != null
-                          ? () {
-                              Get.dialog(const RegisterDialog(),
-                                  arguments: mapWatch.id);
-                            }
+                          ? () => _onTapRegister(mapWatch)
                           : null,
                       child: const Text('注册比赛'))),
               Expanded(
@@ -42,6 +39,21 @@ class FieldControlPageImpl extends FieldControlPage {
     });
   }
 
+  Future<void> _onTapRegister(MapWatch mapWatch) async {
+    final r = await Get.dialog(const RegisterDialog(), arguments: mapWatch.id)
+        as RegisterInfo?;
+
+    if (r != null) {
+      Get.find<ApiService>().stub.toMatchRegusterAdd(ToMatchRegusterAddRequest()
+        ..actId = r.id
+        ..regName = r.name
+        ..startAt = r.startAt.toPb()
+        ..stopAt = r.stopAt.toPb()
+        ..isQueryPwd = r.password != null
+        ..queryPasswd = r.password ?? '');
+    }
+  }
+
   Widget eventView(EventOnMap event) {
     return Card(
       shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(3.56)),

+ 1 - 1
libs/track_common/lib/widget/app_title_list.dart

@@ -18,7 +18,7 @@ class AppTitleList extends StatelessWidget {
     return GestureDetector(
         onTap: onTap,
         child: Container(
-          decoration: const BoxDecoration(color: Color(0xff00a0ff), boxShadow: [
+          decoration: const BoxDecoration(color: Colors.white, boxShadow: [
             BoxShadow(color: Color(0x4d000000), blurRadius: 3.5)
           ]),
           height: 41.96,

+ 8 - 17
libs/track_common/lib/widget/level2_view.dart

@@ -9,10 +9,12 @@ class Level2View extends StatelessWidget {
       required this.level2,
       required this.level1Title,
       required this.level2Title,
-      required this.level2SubTitle});
+      required this.level2SubTitle,
+      this.level1Action});
 
-  final Iterable<Widget> level1;
-  final Iterable<Widget> level2;
+  final Widget level1;
+  final Widget level2;
+  final Widget? level1Action;
   final String level1Title;
   final String level2Title;
   final Widget level2SubTitle;
@@ -48,18 +50,11 @@ class Level2View extends StatelessWidget {
             const Padding(padding: EdgeInsets.all(8), child: TitlePoint()),
             Text(level1Title, style: titleStyle),
             const Spacer(),
-            Container(
-              decoration: BoxDecoration(
-                  border: Border.all(color: const Color(0xffe3e3e3))),
-              child: const Text('2023-06-26'),
-            )
+            level1Action ?? const SizedBox()
           ],
         ),
         const SizedBox(height: 20),
-        Expanded(
-            child: ListView(
-          children: level1.toList(),
-        )),
+        Expanded(child: level1),
       ],
     );
   }
@@ -75,11 +70,7 @@ class Level2View extends StatelessWidget {
           ],
         ),
         Expanded(
-            child: Padding(
-                padding: const EdgeInsets.all(18),
-                child: Column(
-                  children: level2.toList(),
-                )))
+            child: Padding(padding: const EdgeInsets.all(18), child: level2))
       ],
     );
   }

+ 1 - 1
protos/app_api

@@ -1 +1 @@
-Subproject commit d3a12a60fed1f9fec34513450b090c5786e5b5c5
+Subproject commit 66494ea951859413e1cb6362613bfa5a757213f1