Bladeren bron

新加坡的酒店端,中介的模块接口调试

liukai 2 weken geleden
bovenliggende
commit
6fd91cc9b5
29 gewijzigde bestanden met toevoegingen van 1101 en 221 verwijderingen
  1. 6 1
      packages/cpt_auth/lib/modules/login/login_controller.dart
  2. 79 86
      packages/cpt_sg/lib/modules/agency/agency_add/agency_add_controller.dart
  3. 4 4
      packages/cpt_sg/lib/modules/agency/agency_add/agency_add_page.dart
  4. 2 1
      packages/cpt_sg/lib/modules/agency/agency_add/agency_add_state.dart
  5. 35 1
      packages/cpt_sg/lib/modules/agency/agency_category/agency_category_controller.dart
  6. 5 2
      packages/cpt_sg/lib/modules/agency/agency_category/agency_category_state.dart
  7. 26 39
      packages/cpt_sg/lib/modules/agency/agency_list/agency_item.dart
  8. 74 54
      packages/cpt_sg/lib/modules/agency/agency_list/agency_list_controller.dart
  9. 2 2
      packages/cpt_sg/lib/modules/agency/agency_list/agency_list_page.dart
  10. 5 4
      packages/cpt_sg/lib/modules/agency/agency_list/agency_list_state.dart
  11. 9 12
      packages/cpt_sg/lib/modules/main/main_controller.dart
  12. 2 3
      packages/cpt_sg/lib/modules/main/main_state.dart
  13. 27 1
      packages/cs_domain/lib/constants/api_constants.dart
  14. 73 0
      packages/cs_domain/lib/entity/response/agency_detail_entity.dart
  15. 22 0
      packages/cs_domain/lib/entity/response/agency_option_entity.dart
  16. 53 0
      packages/cs_domain/lib/entity/response/agency_table_entity.dart
  17. 25 0
      packages/cs_domain/lib/entity/response/index_option_entity.dart
  18. 186 0
      packages/cs_domain/lib/generated/json/agency_detail_entity.g.dart
  19. 29 0
      packages/cs_domain/lib/generated/json/agency_option_entity.g.dart
  20. 114 0
      packages/cs_domain/lib/generated/json/agency_table_entity.g.dart
  21. 14 0
      packages/cs_domain/lib/generated/json/attendance_entity.g.dart
  22. 28 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  23. 47 0
      packages/cs_domain/lib/generated/json/index_option_entity.g.dart
  24. 6 5
      packages/cs_domain/lib/repository/auth_repository.dart
  25. 218 0
      packages/cs_domain/lib/repository/sg_agency_repository.dart
  26. 2 0
      packages/cs_initializer/lib/global_services_injection.dart
  27. 1 0
      packages/cs_resources/lib/local/language/en_US.dart
  28. 1 0
      packages/cs_resources/lib/local/language/zh_CN.dart
  29. 6 6
      packages/cs_widgets/lib/picker/option_pick_util.dart

+ 6 - 1
packages/cpt_auth/lib/modules/login/login_controller.dart

@@ -59,7 +59,12 @@ class LoginController extends GetxController with DioCancelableMixin {
 
   /// 请求接口执行登录
   void _request2LoginPassword() async {
-    var result = await authRepository.userLogin(state.code, state.password, cancelToken: cancelToken);
+    var result = await authRepository.userLogin(
+      state.code,
+      state.password,
+      version: ConfigService.to.selectCountry.value == 1 ? 2 : 1,  //新加坡用 V2版本
+      cancelToken: cancelToken,
+    );
 
     //处理数据
     if (result.isSuccess) {

+ 79 - 86
packages/cpt_sg/lib/modules/agency/agency_add/agency_add_controller.dart

@@ -1,61 +1,59 @@
+import 'package:domain/entity/response/agency_detail_entity.dart';
 import 'package:domain/repository/labour_sg_repository.dart';
+import 'package:domain/repository/sg_agency_repository.dart';
 import 'package:get/get.dart';
+import 'package:plugin_platform/engine/notify/notify_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:plugin_platform/http/http_result.dart';
+import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import 'agency_add_state.dart';
 
 class AgencyAddController extends GetxController with DioCancelableMixin {
-  final LabourSGRepository _labourRepository = Get.find();
+  final SGAgencyRepository _agencyRepository = Get.find();
   final AgencyAddState state = AgencyAddState();
 
   // 获取添加或者编辑的详情
-  void _fetchAddEditIndexDetail() async {
-    // //获取到数据
-    // Future<HttpResult<JobTemplateEditIndexEntity>> taskFuture;
-    // if (Utils.isNotEmpty(state.templateId) && state.templateId != "0") {
-    //   //编辑
-    //   taskFuture = _labourRepository.fetchJobTemplateEditIndex(state.templateId, cancelToken: cancelToken);
-    // } else {
-    //   //新增
-    //   taskFuture = _labourRepository.fetchJobTemplateAddIndex(cancelToken: cancelToken);
-    // }
-    //
-    // var result = await taskFuture;
-    //
-    // //处理数据
-    // if (result.isSuccess) {
-    //   state.indexEntity = result.data;
-    //
-    //   var templateNameController = state.formData['template_name']!['controller'];
-    //   var descController = state.formData['desc']!['controller'];
-    //   var contactController = state.formData['contact']!['controller'];
-    //   var contactNoController = state.formData['contact_no']!['controller'];
-    //   var noteController = state.formData['note']!['controller'];
-    //   templateNameController.text = state.indexEntity?.name ?? "";
-    //   descController.text = state.indexEntity?.description ?? "";
-    //   contactController.text = state.indexEntity?.contact ?? "";
-    //   contactNoController.text = state.indexEntity?.contactNo ?? "";
-    //   noteController.text = state.indexEntity?.note ?? "";
-    //
-    //   //默认赋值
-    //   state.selectedAgeList = state.indexEntity?.ageList.where((e) => e.checked == "checked").map((e) => e.value!).toList() ?? [];
-    //   Log.d("当前选中的年龄1:${ state.selectedAgeList}");
-    //   state.selectedLanguageList = state.indexEntity?.languageList.where((e) => e.checked == "checked").map((e) => e.value!).toList() ?? [];
-    //   Log.d("当前选中的语言1:${ state.selectedLanguageList}");
-    //   state.foodCert = state.indexEntity?.withFoodCert.toString();
-    //
-    //   update();
-    // } else {
-    //   ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
-    // }
+  void _fetchEditDetail() async {
+
+    //如果是详情数据则请求接口展示
+    if (Utils.isNotEmpty(state.agentId) && state.agentId != "0"){
+
+      var result = await _agencyRepository.fetchAgencyEditDetail(pivotId: state.agentId);
+
+      //处理数据
+      if (result.isSuccess) {
+        AgencyDetailEntity? detailEntity = result.data;
+
+        var agencyNameController = state.formData['agency_name']!['controller'];
+        var acraController = state.formData['acra']!['controller'];
+        var personController = state.formData['person_in_charge']!['controller'];
+        var addressController = state.formData['address']!['controller'];
+        var emailController = state.formData['email']!['controller'];
+        var phoneController = state.formData['phone']!['controller'];
+
+        agencyNameController.text = detailEntity?.pivot?.agencyName ?? "";
+        acraController.text = detailEntity?.pivot?.uenNo ?? "";
+        personController.text = detailEntity?.pivot?.contactPerson ?? "";
+        addressController.text = detailEntity?.pivot?.address ?? "";
+        emailController.text = detailEntity?.pivot?.contactEmail ?? "";
+        phoneController.text = detailEntity?.pivot?.contactNo ?? "";
+
+        //默认赋值
+        state.statusOption = detailEntity?.statusRadios;
+
+        update();
+      } else {
+        ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      }
+
+    }
   }
 
   /// 提交
   void doSubmit() async {
-
-
     var agencyNameController = state.formData['agency_name']!['controller'];
     var acraController = state.formData['acra']!['controller'];
     var personController = state.formData['person_in_charge']!['controller'];
@@ -81,54 +79,49 @@ class AgencyAddController extends GetxController with DioCancelableMixin {
       return;
     }
 
-    // Future<HttpResult> taskFuture;
-    // if (Utils.isNotEmpty(state.templateId) && state.templateId != "0") {
-    //   taskFuture = _labourRepository.editJobTemplateSubmit(
-    //     state.templateId,
-    //     templateName,
-    //     contact,
-    //     contactNo,
-    //     desc,
-    //     note,
-    //     state.selectedAgeList.join(","),
-    //     state.gender,
-    //     state.foodCert,
-    //     state.selectedLanguageList.join(","),
-    //     cancelToken: cancelToken,
-    //   );
-    // } else {
-    //   taskFuture = _labourRepository.addJobTemplateSubmit(
-    //     templateName,
-    //     contact,
-    //     contactNo,
-    //     desc,
-    //     note,
-    //     state.selectedAgeList.join(","),
-    //     state.gender,
-    //     state.foodCert,
-    //     state.selectedLanguageList.join(","),
-    //     cancelToken: cancelToken,
-    //   );
-    // }
-    //
-    // var result = await taskFuture;
-    //
-    // //处理数据
-    // if (result.isSuccess) {
-    //   NotifyEngine.showSuccess("Successful".tr);
-    //
-    //   //根据类型刷新
-    //   state.cb?.call(state.templateId);
-    //
-    //   Get.back();
-    // } else {
-    //   ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
-    // }
+    Future<HttpResult> taskFuture;
+    if (Utils.isNotEmpty(state.agentId) && state.agentId != "0") {
+      taskFuture = _agencyRepository.editAgencySubmit(
+        pivotId: state.agentId,
+        agencyName: agencyName,
+        acraNo: acra,
+        contactPerson: personName,
+        address: address,
+        contactNo: phone,
+        contactEmail: email,
+        status: state.statusId,
+        cancelToken: cancelToken,
+      );
+    } else {
+      taskFuture = _agencyRepository.addAgencySubmit(
+        agencyName: agencyName,
+        acraNo: acra,
+        contactPerson: personName,
+        address: address,
+        contactNo: phone,
+        contactEmail: email,
+        cancelToken: cancelToken,
+      );
+    }
+
+    var result = await taskFuture;
+
+    //处理数据
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      //根据类型刷新
+      state.cb?.call(state.agentId);
+
+      Get.back();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
   }
 
   @override
   void onReady() {
     super.onReady();
-    _fetchAddEditIndexDetail();
+    _fetchEditDetail();
   }
 }

+ 4 - 4
packages/cpt_sg/lib/modules/agency/agency_add/agency_add_page.dart

@@ -224,13 +224,13 @@ class SGAgencyAddPage extends BaseStatelessPage<AgencyAddController> {
 
                       //单选
                       Visibility(
-                        visible: Utils.isNotEmpty(state.agentId),
+                        visible: state.statusOption!= null && state.statusOption!.isNotEmpty,
                         child: CustomRadioCheck(
-                          options: state.statusOption,
+                          options: state.statusOption?.map((e) => e.txt!).toList() ?? [],
                           onOptionSelected: (index, text) {
-                            state.statusId = index == 0 ? "1" : "0";
+                            state.statusId = state.statusOption![index].value;
                           },
-                          selectedPosition: 0,
+                          selectedPosition: state.statusOption?.indexWhere((e) => e.checked == "checked") ?? -1,
                         ).marginOnly(left: 15, right: 15, top: 10),
                       ),
 

+ 2 - 1
packages/cpt_sg/lib/modules/agency/agency_add/agency_add_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/response/index_option_entity.dart';
 import 'package:domain/entity/response/job_template_edit_index_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_basic/basic_export.dart';
@@ -49,7 +50,7 @@ class AgencyAddState {
     },
   };
 
-  final statusOption = ["Active".tr, "Inactive".tr];
+  List<IndexOptionEntity>? statusOption;
   String? statusId;
 
   String? agentId;

+ 35 - 1
packages/cpt_sg/lib/modules/agency/agency_category/agency_category_controller.dart

@@ -1,6 +1,9 @@
 import 'package:domain/entity/home_module.dart';
+import 'package:domain/entity/response/hotel_info_entity.dart';
 import 'package:get/get.dart';
+import 'package:plugin_basic/service/user_service.dart';
 import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/widget_export.dart';
 import '../agency_list/agency_list_page.dart';
 import '../contract_list/contract_list_page.dart';
@@ -22,12 +25,43 @@ class AgencyCategoryController extends GetxController with DioCancelableMixin {
   @override
   void onReady() {
     super.onReady();
+    setupAgencyList();
+  }
+
+  /// 筛选展示 Agency 的数据
+  void setupAgencyList() async {
+    final hotelInfo = UserService.to.getHotelInfo;
+
+    List<HotelInfoMenusChildren>? list = hotelInfo.menus?.firstWhereOrNull((element) => element.key == "agency")?.children;
+
+    Log.d("list:$list");
+
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      state.datas.clear();
+
+      //如果是管理员登录,根据Key筛选需要展示的模块
+      for (var children in list) {
+        if (children.key != null) {
+          state.datas.addAll(_filterModulesByKey(children.key!));
+        }
+      }
+    } else {
+      //清除
+      state.datas.clear();
+    }
+
+    update();
+  }
+
+  List<HomeModule> _filterModulesByKey(String key) {
+    return state.modules.where((module) => module.key == key).toList();
   }
 
   /// 跳转到指定的模块中去
   void gotoModulePage(HomeModule module) {
     switch (module.key) {
-      case 'agency':
+      case 'agencyList':
         SGAgencyListPage.startInstance();
         break;
       case 'contract':

+ 5 - 2
packages/cpt_sg/lib/modules/agency/agency_category/agency_category_state.dart

@@ -3,9 +3,12 @@ import 'package:domain/entity/home_module.dart';
 import 'package:plugin_basic/basic_export.dart';
 
 class AgencyCategoryState {
+  //当前显示的模块
+  List<HomeModule> datas = [];
+
   //全部的模块
-  final List<HomeModule> datas = [
-    HomeModule(key: 'agency', moduleName: 'Agency List'.tr, moduleIconPath: Assets. agencyCategoryAgency, iconWidth: 40, iconHeight: 40),
+  final List<HomeModule> modules = [
+    HomeModule(key: 'agencyList', moduleName: 'Agency List'.tr, moduleIconPath: Assets. agencyCategoryAgency, iconWidth: 40, iconHeight: 40),
     HomeModule(key: 'contract', moduleName: 'Contract Management'.tr, moduleIconPath: Assets.agencyCategoryContract, iconWidth: 40, iconHeight: 40),
     HomeModule(key: 'position', moduleName: 'Position List'.tr, moduleIconPath: Assets.agencyCategoryPosotion, iconWidth: 40, iconHeight: 40),
   ];

+ 26 - 39
packages/cpt_sg/lib/modules/agency/agency_list/agency_item.dart

@@ -1,6 +1,5 @@
 import 'package:cs_resources/constants/color_constants.dart';
-import 'package:domain/entity/response/labour_request_list_entity.dart';
-import 'package:domain/entity/response/labour_request_s_g_list_entity.dart';
+import 'package:domain/entity/response/agency_table_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
@@ -14,7 +13,7 @@ import 'package:widgets/my_text_view.dart';
  */
 class AgencyItem extends StatelessWidget {
   final int index;
-  final LabourRequestSGListRows item;
+  final AgencyTableRows item;
   final VoidCallback? onDeleteAction;
   final VoidCallback? onDetailAction;
   final VoidCallback? onEditAction;
@@ -56,7 +55,7 @@ class AgencyItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.jobTitle ?? "-",
+                item.agencyName ?? "-",
                 marginLeft: 5,
                 isFontMedium: true,
                 textColor: ColorConstants.textYellowFFBB1B,
@@ -85,7 +84,7 @@ class AgencyItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.outletName ?? "-",
+                item.uenNo ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -108,7 +107,7 @@ class AgencyItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.outletName ?? "-",
+                item.contactPerson ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -131,7 +130,7 @@ class AgencyItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.needNum.toString(),
+                item.contactEmail ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -154,7 +153,7 @@ class AgencyItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.needNum.toString(),
+                item.contactNo ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -178,14 +177,20 @@ class AgencyItem extends StatelessWidget {
 
               //状态
               MyTextView(
-                item.status == null ? "" : item.status!.tr,
+                "1" == item.status
+                    ? "No Register".tr
+                    : "2" == item.status
+                    ? "Active".tr
+                    : "3" == item.status
+                    ? "Inactive".tr
+                    : "-",
                 marginLeft: 5,
                 isFontRegular: true,
-                textColor: "Applied" == item.status
-                    ? ColorConstants.textGreen05DC82
-                    : "No Register" == item.status
+                textColor: "1" == item.status
                     ? ColorConstants.textRedFF6262
-                    : "Pending" == item.status
+                    : "2" == item.status
+                    ? ColorConstants.textBlue5CEEFF
+                    : "3" == item.status
                     ? ColorConstants.textYellowFFBB1B
                     : ColorConstants.white,
                 fontSize: 14,
@@ -195,25 +200,24 @@ class AgencyItem extends StatelessWidget {
 
           //按钮组
           Visibility(
-            visible: item.actionList?.isNotEmpty ?? false,
+            visible: true,
             child: Row(
               mainAxisSize: MainAxisSize.max,
               mainAxisAlignment: MainAxisAlignment.end,
               crossAxisAlignment: CrossAxisAlignment.center,
               children: [
-                //详情按钮
+
+                //Edit按钮
                 Visibility(
-                  visible: item.actionList?.contains("detail") ?? false,
+                  visible: true,
                   child: MyButton(
                     onPressed: () {
                       FocusScope.of(context).unfocus();
-                      onDetailAction?.call();
+                      onEditAction?.call();
                     },
-                    text: "Detail".tr,
+                    text: "Edit".tr,
                     textColor: ColorConstants.white,
-                    backgroundColor: hexToColor(
-                      "#56AAFF",
-                    ),
+                    backgroundColor: ColorConstants.textGreen0AC074,
                     radius: 17.25,
                     minWidth: 60,
                     minHeight: 35,
@@ -222,7 +226,7 @@ class AgencyItem extends StatelessWidget {
 
                 //Delete按钮
                 Visibility(
-                  visible: item.actionList?.contains("delete") ?? false,
+                  visible: true,
                   child: MyButton(
                     onPressed: () {
                       FocusScope.of(context).unfocus();
@@ -237,23 +241,6 @@ class AgencyItem extends StatelessWidget {
                   ).marginOnly(left: 12),
                 ),
 
-                //Edit按钮
-                Visibility(
-                  visible: item.actionList?.contains("edit") ?? false,
-                  child: MyButton(
-                    onPressed: () {
-                      FocusScope.of(context).unfocus();
-                      onEditAction?.call();
-                    },
-                    text: "Edit".tr,
-                    textColor: ColorConstants.white,
-                    backgroundColor: hexToColor("#FFBB1B"),
-                    radius: 17.25,
-                    minWidth: 60,
-                    minHeight: 35,
-                  ).marginOnly(left: 12),
-                ),
-
               ],
             ).marginOnly(top: 15, bottom: 2),
           ),

+ 74 - 54
packages/cpt_sg/lib/modules/agency/agency_list/agency_list_controller.dart

@@ -1,26 +1,23 @@
-import 'package:domain/entity/response/labour_request_s_g_list_entity.dart';
-import 'package:domain/repository/labour_sg_repository.dart';
+import 'package:domain/entity/response/agency_option_entity.dart';
+import 'package:domain/entity/response/agency_table_entity.dart';
 
-import 'package:domain/entity/response/labour_request_index_entity.dart';
+import 'package:domain/repository/sg_agency_repository.dart';
 import 'package:get/get.dart';
-import 'package:plugin_basic/constants/app_constant.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:plugin_platform/engine/notify/notify_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:plugin_platform/http/http_result.dart';
-import 'package:shared/utils/date_time_utils.dart';
-import 'package:shared/utils/event_bus.dart';
-import 'package:shared/utils/util.dart';
 import 'package:widgets/dialog/app_default_dialog.dart';
 import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/picker/option_pick_util.dart';
 import 'package:widgets/widget_export.dart';
 
 import '../agency_add/agency_add_page.dart';
 import 'agency_list_state.dart';
 
 class AgencyListController extends GetxController with DioCancelableMixin {
-  final LabourSGRepository _labourRepository = Get.find();
+  final SGAgencyRepository _agencyRepository = Get.find();
   final AgencyListState state = AgencyListState();
 
   var _curPage = 1;
@@ -45,41 +42,38 @@ class AgencyListController extends GetxController with DioCancelableMixin {
   // Refresh 刷新事件
   Future onRefresh() async {
     _curPage = 1;
-    fetchLabourRequestList();
+    fetchTableList();
   }
 
   // Refresh 加载事件
   Future loadMore() async {
     _curPage++;
-    fetchLabourRequestList();
+    fetchTableList();
   }
 
   // 重试请求
   Future retryRequest() async {
     _curPage = 1;
     _needShowPlaceholder = true;
-    fetchLabourRequestList();
+    fetchTableList();
   }
 
   /// 获取列表数据
-  Future fetchLabourRequestList() async {
+  Future fetchTableList() async {
     if (_needShowPlaceholder) {
       changeLoadingState(LoadState.State_Loading);
     }
 
     // 并发执行两个请求
     var futures = [
-      _labourRepository.fetchLabourRequestSGList(
-        state.keyword,
-        "",
-        "",
-        state.selectedStatusId,
-        "",
+      _agencyRepository.fetchAgencyTable(
+        keyword: state.keyword,
+        status: state.selectedStatusId,
         curPage: _curPage,
         cancelToken: cancelToken,
       ),
       state.indexOptions == null
-          ? _labourRepository.fetchLabourRequestSGIndex(
+          ? _agencyRepository.fetchAgencyOption(
               cancelToken: cancelToken,
             )
           : Future(() => HttpResult(isSuccess: true).convert(data: state.indexOptions!)),
@@ -87,8 +81,8 @@ class AgencyListController extends GetxController with DioCancelableMixin {
 
     //拿到结果
     var results = await Future.wait(futures);
-    var listResult = results[0] as HttpResult<LabourRequestSGListEntity>;
-    var optionResult = results[1] as HttpResult<LabourRequestIndexEntity>;
+    var listResult = results[0] as HttpResult<AgencyTableEntity>;
+    var optionResult = results[1] as HttpResult<AgencyOptionEntity>;
 
     //选项数据
     if (state.indexOptions == null && optionResult.isSuccess) {
@@ -108,7 +102,7 @@ class AgencyListController extends GetxController with DioCancelableMixin {
   }
 
   // 处理数据与展示的逻辑
-  void handleList(List<LabourRequestSGListRows>? list) {
+  void handleList(List<AgencyTableRows>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (_curPage == 1) {
@@ -150,6 +144,8 @@ class AgencyListController extends GetxController with DioCancelableMixin {
     state.keyword = "";
     state.searchController.text = "";
     state.selectedStatusId = null;
+    state.selectedStatusTxt = null;
+    update();
 
     //赋值之后刷新
     refreshController.callRefresh();
@@ -157,33 +153,33 @@ class AgencyListController extends GetxController with DioCancelableMixin {
 
   /// 根据ID获取Item对象,用于刷新
   void fetchItemByIdAndRefreshItem(String requestId) async {
-    var result = await _labourRepository.fetchItemByRequestId(
-      requestId,
-      cancelToken: cancelToken,
-    );
-
-    //处理数据
-    if (result.isSuccess) {
-      var data = result.data;
-      if (data != null && data.rows != null && data.rows!.isNotEmpty) {
-        final requestItem = data.rows![0];
-
-        //找到当前数据中的此 requestId,并替换对象,再刷新
-        var index = state.datas.indexWhere((element) => element.requestId == requestItem.requestId);
-        if (index >= 0) {
-          state.datas[index] = requestItem;
-          update();
-        }
-      }
-    } else {
-      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
-    }
+    // var result = await _labourRepository.fetchItemByRequestId(
+    //   requestId,
+    //   cancelToken: cancelToken,
+    // );
+    //
+    // //处理数据
+    // if (result.isSuccess) {
+    //   var data = result.data;
+    //   if (data != null && data.rows != null && data.rows!.isNotEmpty) {
+    //     final requestItem = data.rows![0];
+    //
+    //     //找到当前数据中的此 requestId,并替换对象,再刷新
+    //     var index = state.datas.indexWhere((element) => element.requestId == requestItem.requestId);
+    //     if (index >= 0) {
+    //       state.datas[index] = requestItem;
+    //       update();
+    //     }
+    //   }
+    // } else {
+    //   ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    // }
   }
 
   @override
   void onReady() {
     super.onReady();
-    fetchLabourRequestList();
+    fetchTableList();
   }
 
   @override
@@ -192,7 +188,6 @@ class AgencyListController extends GetxController with DioCancelableMixin {
     super.onClose();
   }
 
-
   //跳转到添加页面
   void gotoAddAgencyPage() {
     SGAgencyAddPage.startInstance("", (result) {
@@ -203,31 +198,31 @@ class AgencyListController extends GetxController with DioCancelableMixin {
   }
 
   //去详情页面
-  void gotoDetailPage(LabourRequestSGListRows data) {}
+  void gotoDetailPage(AgencyTableRows data) {}
 
   //去编辑页面
-  void gotoEditPage(LabourRequestSGListRows data) {
-    SGAgencyAddPage.startInstance("123", (result) {
+  void gotoEditPage(AgencyTableRows data) {
+    SGAgencyAddPage.startInstance(data.pivotId ?? "", (result) {
       if (result != null) {
-        fetchItemByIdAndRefreshItem(data.requestId.toString());
+        fetchItemByIdAndRefreshItem(data.pivotId ?? "");
       }
     });
   }
 
   //删除labourRequest
-  void doDelete(String? requestId, int index) {
+  void doDelete(String? pivotId, int index) {
     DialogEngine.show(
         widget: AppDefaultDialog(
       title: "Confirmation".tr,
       message: "Are you sure you want to delete this agency?".tr,
       confirmAction: () {
-        _submitDeleteRequest(requestId, index);
+        _submitDeleteRequest(pivotId, index);
       },
     ));
   }
 
-  void _submitDeleteRequest(String? requestId, int index) async {
-    var result = await _labourRepository.deleteLabourRequestSG(requestId, cancelToken: cancelToken);
+  void _submitDeleteRequest(String? pivotId, int index) async {
+    var result = await _agencyRepository.deleteAgencySubmit(pivotId, cancelToken: cancelToken);
 
     if (result.isSuccess) {
       NotifyEngine.showSuccess("Successful".tr);
@@ -244,5 +239,30 @@ class AgencyListController extends GetxController with DioCancelableMixin {
   }
 
   /// 选择中介公司状态
-  void pickAgencyStatus() {}
+  void pickAgencyStatus() {
+    if (state.indexOptions == null) return;
+
+    int selectedIndex;
+    if (state.selectedStatusId == null) {
+      selectedIndex = 0;
+    } else {
+      selectedIndex = state.indexOptions!.statusList!.indexWhere((department) => department.value.toString() == state.selectedStatusId);
+    }
+
+    if (selectedIndex < 0) {
+      selectedIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: state.indexOptions!.statusList!.map((e) => e.txt!.tr).toList(growable: false),
+      initialSelectIndex: selectedIndex,
+      onPickerChanged: (_, index) {
+        state.selectedStatusId = state.indexOptions!.statusList![index].value!.toString();
+        state.selectedStatusTxt = state.indexOptions!.statusList![index].txt!.toString();
+        update();
+
+        refreshController.callRefresh();
+      },
+    );
+  }
 }

+ 2 - 2
packages/cpt_sg/lib/modules/agency/agency_list/agency_list_page.dart

@@ -91,7 +91,7 @@ class _LabourRequestListState extends BaseState<SGAgencyListPage, AgencyListCont
                       mainAxisAlignment: MainAxisAlignment.start,
                       children: [
                         MyTextView(
-                          "",
+                          state.selectedStatusTxt??"",
                           fontSize: 14,
                           hint: "Status".tr,
                           textHintColor: ColorConstants.textGrayAECAE5,
@@ -213,7 +213,7 @@ class _LabourRequestListState extends BaseState<SGAgencyListPage, AgencyListCont
                             controller.gotoDetailPage(state.datas[index]);
                           },
                           onDeleteAction: () {
-                            controller.doDelete(state.datas[index].requestId,index);
+                            controller.doDelete(state.datas[index].pivotId,index);
                           },
                           onEditAction: () {
                             controller.gotoEditPage(state.datas[index]);

+ 5 - 4
packages/cpt_sg/lib/modules/agency/agency_list/agency_list_state.dart

@@ -1,5 +1,5 @@
-import 'package:domain/entity/response/labour_request_index_entity.dart';
-import 'package:domain/entity/response/labour_request_s_g_list_entity.dart';
+import 'package:domain/entity/response/agency_option_entity.dart';
+import 'package:domain/entity/response/agency_table_entity.dart';
 import 'package:flutter/material.dart';
 
 class AgencyListState {
@@ -8,8 +8,9 @@ class AgencyListState {
   final FocusNode focusNode = FocusNode();
   String keyword = "";
   String? selectedStatusId;
+  String? selectedStatusTxt;
 
   //页面的列表数据
-  List<LabourRequestSGListRows> datas = [];
-  LabourRequestIndexEntity? indexOptions;
+  List<AgencyTableRows> datas = [];
+  AgencyOptionEntity? indexOptions;
 }

+ 9 - 12
packages/cpt_sg/lib/modules/main/main_controller.dart

@@ -63,7 +63,7 @@ class MainController extends GetxController {
     }
 
     //获取到数据
-    var result = await _authRepository.fetchHotelInfo();
+    var result = await _authRepository.fetchHotelInfo(version: 2);
 
     //处理数据
     if (result.isSuccess) {
@@ -95,14 +95,11 @@ class MainController extends GetxController {
       int? isAdmin = SPUtil.getInt(AppConstant.storageIsAdmin);
       if (isAdmin == 1) {
         //如果是管理员登录,根据Key筛选需要展示的模块
-        // for (var hotelInfo in list) {
-        //   if (hotelInfo.key != null) {
-        //     state.datas.addAll(_filterModulesByKey(hotelInfo.key!));
-        //   }
-        // }
-
-        //ToDo 测试阶段加入全部模块
-        state.datas.addAll(state.modules);
+        for (var hotelInfo in list) {
+          if (hotelInfo.key != null) {
+            state.datas.addAll(_filterModulesByKey(hotelInfo.key!));
+          }
+        }
       } else {
         //如果只是签到签出模式,手动的添加模块
         state.datas.addAll(_filterModulesByKey("sign"));
@@ -130,7 +127,7 @@ class MainController extends GetxController {
   /// 跳转到指定的模块中去
   void gotoModulePage(HomeModule module) {
     switch (module.key) {
-      case 'dashboard':
+      case 'dash':
         ToastEngine.show("进入 dashboard");
         break;
       case 'agency':
@@ -142,7 +139,7 @@ class MainController extends GetxController {
       case 'jobList':
         JobListPage.startInstance();
         break;
-      case 'reqReview':
+      case 'labReview':
         SGLabourReviewPage.startInstance();
         break;
       case 'attReview':
@@ -155,9 +152,9 @@ class MainController extends GetxController {
         DeviceListPage.startInstance();
         break;
       case 'template':
-        JobTemplateListPage.startInstance();
         break;
       case 'jobTitle':
+        // JobTemplateListPage.startInstance();
         JobTitleListPage.startInstance();
         break;
       case 'report':

+ 2 - 3
packages/cpt_sg/lib/modules/main/main_state.dart

@@ -8,15 +8,14 @@ class MainState {
 
   //全部的模块
   final List<HomeModule> modules = [
-    HomeModule(key: 'dashboard', moduleName: 'Dashboard'.tr, moduleIconPath: Assets.mainHomeDashboard ,iconWidth: 54, iconHeight: 42.5),
+    HomeModule(key: 'dash', moduleName: 'Dashboard'.tr, moduleIconPath: Assets.mainHomeDashboard ,iconWidth: 54, iconHeight: 42.5),
     HomeModule(key: 'agency', moduleName: 'Agency'.tr, moduleIconPath: Assets.mainHomeAgency, iconWidth: 45.5, iconHeight: 45.5),
     HomeModule(key: 'labReq', moduleName: 'Labour Request'.tr, moduleIconPath: Assets.mainHomeLabourRequest, iconWidth: 50, iconHeight: 40.3),
     HomeModule(key: 'jobList', moduleName: 'Job List'.tr, moduleIconPath: Assets.mainHomeJobList, iconWidth: 45, iconHeight: 45),
-    HomeModule(key: 'reqReview', moduleName: 'Labour Request Review'.tr, moduleIconPath: Assets.mainHomeLabourRequestReview, iconWidth: 50.5, iconHeight: 43),
+    HomeModule(key: 'labReview', moduleName: 'Labour Request Review'.tr, moduleIconPath: Assets.mainHomeLabourRequestReview, iconWidth: 50.5, iconHeight: 43),
     HomeModule(key: 'attReview', moduleName: 'Attendance Review'.tr, moduleIconPath: Assets.mainHomeAttendanceReview, iconWidth: 47.5, iconHeight: 46),
     HomeModule(key: 'reviseList', moduleName: 'Revise List'.tr, moduleIconPath: Assets.mainHomeSignInOut, iconWidth: 44.5, iconHeight: 44.5),  //新加坡的修改列表
     HomeModule(key: 'device', moduleName: 'Devices'.tr, moduleIconPath: Assets.mainHomeDevices, iconWidth: 45.5, iconHeight: 45.5),
-    HomeModule(key: 'template', moduleName: 'Default Job Title'.tr, moduleIconPath: Assets.mainHomeJobTemplate, iconWidth: 48.5, iconHeight: 46.5), //越南的模版
     HomeModule(key: 'jobTitle', moduleName: 'Default Job Title'.tr, moduleIconPath: Assets.mainHomeJobTemplate, iconWidth: 48.5, iconHeight: 46.5), //新加坡的模板
     HomeModule(key: 'report', moduleName: 'Report'.tr, moduleIconPath: Assets.mainHomeReport, iconWidth: 50.5, iconHeight: 45.5),
   ];

+ 27 - 1
packages/cs_domain/lib/constants/api_constants.dart

@@ -5,7 +5,7 @@ class ApiConstants {
   static const isServerRelease = false;
 
   //新加坡的域名
-  static const sgBaseUrl = isServerRelease ? 'http://singapore-dev-v2.casualabour.com/' : 'http://singapore-dev-v2.casualabour.com/';
+  static const sgBaseUrl = isServerRelease ? 'http://singapore.casualabour.com' : 'http://singapore-dev.casualabour.com';
 
   //英国的域名
   static const ukBaseUrl = isServerRelease ? 'https://uk.casualabour.com' : 'http://vietnam-dev.casualabour.com';
@@ -307,4 +307,30 @@ class ApiConstants {
 
   // 考勤的批量拒绝
   static const apiAttendanceReviewReject = "/index.php/api/v1/hotel/att-review/reject";
+
+  // ===================================  新加坡 V2  ↓  ===================================
+
+  //登录
+  static const apiAuthLoginV2 = "/index.php/api/v2/hotel/login";
+
+  //首页信息
+  static const apiHotelInfoV2 = "/index.php/api/v2/hotel/info";
+
+  //中介列表Option
+  static const apiAgencyOption = "/index.php/api/v2/hotel/agency/index";
+
+  //中介列表
+  static const apiAgencyTable = "/index.php/api/v2/hotel/agency/table";
+
+  //中介的删除
+  static const apiAgencyDelete = "/index.php/api/v2/hotel/agency/destroy";
+
+  //添加中介
+  static const apiAgencyAdd = "/index.php/api/v2/hotel/agency/add-submit";
+
+  //中介详情
+  static const apiAgencyDetail = "/index.php/api/v2/hotel/agency/edit-view";
+
+  //编辑中介
+  static const apiAgencyEdit = "/index.php/api/v2/hotel/agency/edit-submit";
 }

+ 73 - 0
packages/cs_domain/lib/entity/response/agency_detail_entity.dart

@@ -0,0 +1,73 @@
+import 'package:domain/entity/response/index_option_entity.dart';
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/agency_detail_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/agency_detail_entity.g.dart';
+
+@JsonSerializable()
+class AgencyDetailEntity {
+	AgencyDetailPivot? pivot;
+	@JSONField(name: "status_radios")
+	List<IndexOptionEntity> statusRadios = [];
+	@JSONField(name: "contract_start")
+	String? contractStart;
+	@JSONField(name: "contract_end")
+	String? contractEnd;
+
+	AgencyDetailEntity();
+
+	factory AgencyDetailEntity.fromJson(Map<String, dynamic> json) => $AgencyDetailEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $AgencyDetailEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class AgencyDetailPivot {
+	@JSONField(name: "id")
+	String? pivotId;
+	@JSONField(name: "employer_id")
+	String? employerId;
+	@JSONField(name: "agency_id")
+	String? agencyId;
+	@JSONField(name: "agency_name")
+	String? agencyName;
+	@JSONField(name: "uen_no")
+	String? uenNo;
+	@JSONField(name: "company_no")
+	String? companyNo;
+	@JSONField(name: "contact_person")
+	String? contactPerson;
+	@JSONField(name: "contact_no")
+	String? contactNo;
+	@JSONField(name: "contact_email")
+	String? contactEmail;
+	String? address;
+	@JSONField(name: "contract_start")
+	String? contractStart;
+	@JSONField(name: "contract_end")
+	String? contractEnd;
+	String? attachment;
+	int status = 0;
+	@JSONField(name: "reg_token")
+	String? regToken;
+	@JSONField(name: "created_at")
+	String? createdAt;
+	@JSONField(name: "updated_at")
+	String? updatedAt;
+
+	AgencyDetailPivot();
+
+	factory AgencyDetailPivot.fromJson(Map<String, dynamic> json) => $AgencyDetailPivotFromJson(json);
+
+	Map<String, dynamic> toJson() => $AgencyDetailPivotToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 22 - 0
packages/cs_domain/lib/entity/response/agency_option_entity.dart

@@ -0,0 +1,22 @@
+import 'package:domain/entity/response/index_option_entity.dart';
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/agency_option_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/agency_option_entity.g.dart';
+
+@JsonSerializable()
+class AgencyOptionEntity {
+	@JSONField(name: "status_list")
+	List<IndexOptionEntity>? statusList = [];
+
+	AgencyOptionEntity();
+
+	factory AgencyOptionEntity.fromJson(Map<String, dynamic> json) => $AgencyOptionEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $AgencyOptionEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 53 - 0
packages/cs_domain/lib/entity/response/agency_table_entity.dart

@@ -0,0 +1,53 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/agency_table_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/agency_table_entity.g.dart';
+
+@JsonSerializable()
+class AgencyTableEntity {
+	int total = 0;
+	List<AgencyTableRows> rows = [];
+
+	AgencyTableEntity();
+
+	factory AgencyTableEntity.fromJson(Map<String, dynamic> json) => $AgencyTableEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $AgencyTableEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class AgencyTableRows {
+	@JSONField(name: "pivot_id")
+	String? pivotId;
+	@JSONField(name: "agency_name")
+	String? agencyName;
+	@JSONField(name: "uen_no")
+	String? uenNo;
+	@JSONField(name: "contact_person")
+	String? contactPerson;
+	@JSONField(name: "contact_no")
+	String? contactNo;
+	@JSONField(name: "contact_email")
+	String? contactEmail;
+	String? status;
+	@JSONField(name: "reg_url")
+	String? regUrl;
+	@JSONField(name: "created_at")
+	String? createdAt;
+
+	AgencyTableRows();
+
+	factory AgencyTableRows.fromJson(Map<String, dynamic> json) => $AgencyTableRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $AgencyTableRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 25 - 0
packages/cs_domain/lib/entity/response/index_option_entity.dart

@@ -0,0 +1,25 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/index_option_entity.g.dart';
+import 'dart:convert';
+
+/**
+ * 筛选的数据Option
+ */
+@JsonSerializable()
+class IndexOptionEntity {
+  String? value = null;
+  String? txt = null;
+  String? selected = null;
+  String? checked = null;
+
+  IndexOptionEntity();
+
+  factory IndexOptionEntity.fromJson(Map<String, dynamic> json) => $IndexOptionEntityFromJson(json);
+
+  Map<String, dynamic> toJson() => $IndexOptionEntityToJson(this);
+
+  @override
+  String toString() {
+    return jsonEncode(this);
+  }
+}

+ 186 - 0
packages/cs_domain/lib/generated/json/agency_detail_entity.g.dart

@@ -0,0 +1,186 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/agency_detail_entity.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
+
+
+AgencyDetailEntity $AgencyDetailEntityFromJson(Map<String, dynamic> json) {
+  final AgencyDetailEntity agencyDetailEntity = AgencyDetailEntity();
+  final AgencyDetailPivot? pivot = jsonConvert.convert<AgencyDetailPivot>(json['pivot']);
+  if (pivot != null) {
+    agencyDetailEntity.pivot = pivot;
+  }
+  final List<IndexOptionEntity>? statusRadios = (json['status_radios'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (statusRadios != null) {
+    agencyDetailEntity.statusRadios = statusRadios;
+  }
+  final String? contractStart = jsonConvert.convert<String>(json['contract_start']);
+  if (contractStart != null) {
+    agencyDetailEntity.contractStart = contractStart;
+  }
+  final String? contractEnd = jsonConvert.convert<String>(json['contract_end']);
+  if (contractEnd != null) {
+    agencyDetailEntity.contractEnd = contractEnd;
+  }
+  return agencyDetailEntity;
+}
+
+Map<String, dynamic> $AgencyDetailEntityToJson(AgencyDetailEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['pivot'] = entity.pivot?.toJson();
+  data['status_radios'] = entity.statusRadios.map((v) => v.toJson()).toList();
+  data['contract_start'] = entity.contractStart;
+  data['contract_end'] = entity.contractEnd;
+  return data;
+}
+
+extension AgencyDetailEntityExtension on AgencyDetailEntity {
+  AgencyDetailEntity copyWith({
+    AgencyDetailPivot? pivot,
+    List<IndexOptionEntity>? statusRadios,
+    String? contractStart,
+    String? contractEnd,
+  }) {
+    return AgencyDetailEntity()
+      ..pivot = pivot ?? this.pivot
+      ..statusRadios = statusRadios ?? this.statusRadios
+      ..contractStart = contractStart ?? this.contractStart
+      ..contractEnd = contractEnd ?? this.contractEnd;
+  }
+}
+
+AgencyDetailPivot $AgencyDetailPivotFromJson(Map<String, dynamic> json) {
+  final AgencyDetailPivot agencyDetailPivot = AgencyDetailPivot();
+  final String? pivotId = jsonConvert.convert<String>(json['id']);
+  if (pivotId != null) {
+    agencyDetailPivot.pivotId = pivotId;
+  }
+  final String? employerId = jsonConvert.convert<String>(json['employer_id']);
+  if (employerId != null) {
+    agencyDetailPivot.employerId = employerId;
+  }
+  final String? agencyId = jsonConvert.convert<String>(json['agency_id']);
+  if (agencyId != null) {
+    agencyDetailPivot.agencyId = agencyId;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    agencyDetailPivot.agencyName = agencyName;
+  }
+  final String? uenNo = jsonConvert.convert<String>(json['uen_no']);
+  if (uenNo != null) {
+    agencyDetailPivot.uenNo = uenNo;
+  }
+  final String? companyNo = jsonConvert.convert<String>(json['company_no']);
+  if (companyNo != null) {
+    agencyDetailPivot.companyNo = companyNo;
+  }
+  final String? contactPerson = jsonConvert.convert<String>(json['contact_person']);
+  if (contactPerson != null) {
+    agencyDetailPivot.contactPerson = contactPerson;
+  }
+  final String? contactNo = jsonConvert.convert<String>(json['contact_no']);
+  if (contactNo != null) {
+    agencyDetailPivot.contactNo = contactNo;
+  }
+  final String? contactEmail = jsonConvert.convert<String>(json['contact_email']);
+  if (contactEmail != null) {
+    agencyDetailPivot.contactEmail = contactEmail;
+  }
+  final String? address = jsonConvert.convert<String>(json['address']);
+  if (address != null) {
+    agencyDetailPivot.address = address;
+  }
+  final String? contractStart = jsonConvert.convert<String>(json['contract_start']);
+  if (contractStart != null) {
+    agencyDetailPivot.contractStart = contractStart;
+  }
+  final String? contractEnd = jsonConvert.convert<String>(json['contract_end']);
+  if (contractEnd != null) {
+    agencyDetailPivot.contractEnd = contractEnd;
+  }
+  final String? attachment = jsonConvert.convert<String>(json['attachment']);
+  if (attachment != null) {
+    agencyDetailPivot.attachment = attachment;
+  }
+  final int? status = jsonConvert.convert<int>(json['status']);
+  if (status != null) {
+    agencyDetailPivot.status = status;
+  }
+  final String? regToken = jsonConvert.convert<String>(json['reg_token']);
+  if (regToken != null) {
+    agencyDetailPivot.regToken = regToken;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    agencyDetailPivot.createdAt = createdAt;
+  }
+  final String? updatedAt = jsonConvert.convert<String>(json['updated_at']);
+  if (updatedAt != null) {
+    agencyDetailPivot.updatedAt = updatedAt;
+  }
+  return agencyDetailPivot;
+}
+
+Map<String, dynamic> $AgencyDetailPivotToJson(AgencyDetailPivot entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.pivotId;
+  data['employer_id'] = entity.employerId;
+  data['agency_id'] = entity.agencyId;
+  data['agency_name'] = entity.agencyName;
+  data['uen_no'] = entity.uenNo;
+  data['company_no'] = entity.companyNo;
+  data['contact_person'] = entity.contactPerson;
+  data['contact_no'] = entity.contactNo;
+  data['contact_email'] = entity.contactEmail;
+  data['address'] = entity.address;
+  data['contract_start'] = entity.contractStart;
+  data['contract_end'] = entity.contractEnd;
+  data['attachment'] = entity.attachment;
+  data['status'] = entity.status;
+  data['reg_token'] = entity.regToken;
+  data['created_at'] = entity.createdAt;
+  data['updated_at'] = entity.updatedAt;
+  return data;
+}
+
+extension AgencyDetailPivotExtension on AgencyDetailPivot {
+  AgencyDetailPivot copyWith({
+    String? pivotId,
+    String? employerId,
+    String? agencyId,
+    String? agencyName,
+    String? uenNo,
+    String? companyNo,
+    String? contactPerson,
+    String? contactNo,
+    String? contactEmail,
+    String? address,
+    String? contractStart,
+    String? contractEnd,
+    String? attachment,
+    int? status,
+    String? regToken,
+    String? createdAt,
+    String? updatedAt,
+  }) {
+    return AgencyDetailPivot()
+      ..pivotId = pivotId ?? this.pivotId
+      ..employerId = employerId ?? this.employerId
+      ..agencyId = agencyId ?? this.agencyId
+      ..agencyName = agencyName ?? this.agencyName
+      ..uenNo = uenNo ?? this.uenNo
+      ..companyNo = companyNo ?? this.companyNo
+      ..contactPerson = contactPerson ?? this.contactPerson
+      ..contactNo = contactNo ?? this.contactNo
+      ..contactEmail = contactEmail ?? this.contactEmail
+      ..address = address ?? this.address
+      ..contractStart = contractStart ?? this.contractStart
+      ..contractEnd = contractEnd ?? this.contractEnd
+      ..attachment = attachment ?? this.attachment
+      ..status = status ?? this.status
+      ..regToken = regToken ?? this.regToken
+      ..createdAt = createdAt ?? this.createdAt
+      ..updatedAt = updatedAt ?? this.updatedAt;
+  }
+}

+ 29 - 0
packages/cs_domain/lib/generated/json/agency_option_entity.g.dart

@@ -0,0 +1,29 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/agency_option_entity.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
+
+
+AgencyOptionEntity $AgencyOptionEntityFromJson(Map<String, dynamic> json) {
+  final AgencyOptionEntity agencyOptionEntity = AgencyOptionEntity();
+  final List<IndexOptionEntity>? statusList = (json['status_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (statusList != null) {
+    agencyOptionEntity.statusList = statusList;
+  }
+  return agencyOptionEntity;
+}
+
+Map<String, dynamic> $AgencyOptionEntityToJson(AgencyOptionEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['status_list'] = entity.statusList?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension AgencyOptionEntityExtension on AgencyOptionEntity {
+  AgencyOptionEntity copyWith({
+    List<IndexOptionEntity>? statusList,
+  }) {
+    return AgencyOptionEntity()
+      ..statusList = statusList ?? this.statusList;
+  }
+}

+ 114 - 0
packages/cs_domain/lib/generated/json/agency_table_entity.g.dart

@@ -0,0 +1,114 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/agency_table_entity.dart';
+
+AgencyTableEntity $AgencyTableEntityFromJson(Map<String, dynamic> json) {
+  final AgencyTableEntity agencyTableEntity = AgencyTableEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    agencyTableEntity.total = total;
+  }
+  final List<AgencyTableRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<AgencyTableRows>(e) as AgencyTableRows).toList();
+  if (rows != null) {
+    agencyTableEntity.rows = rows;
+  }
+  return agencyTableEntity;
+}
+
+Map<String, dynamic> $AgencyTableEntityToJson(AgencyTableEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension AgencyTableEntityExtension on AgencyTableEntity {
+  AgencyTableEntity copyWith({
+    int? total,
+    List<AgencyTableRows>? rows,
+  }) {
+    return AgencyTableEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+AgencyTableRows $AgencyTableRowsFromJson(Map<String, dynamic> json) {
+  final AgencyTableRows agencyTableRows = AgencyTableRows();
+  final String? pivotId = jsonConvert.convert<String>(json['pivot_id']);
+  if (pivotId != null) {
+    agencyTableRows.pivotId = pivotId;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    agencyTableRows.agencyName = agencyName;
+  }
+  final String? uenNo = jsonConvert.convert<String>(json['uen_no']);
+  if (uenNo != null) {
+    agencyTableRows.uenNo = uenNo;
+  }
+  final String? contactPerson = jsonConvert.convert<String>(json['contact_person']);
+  if (contactPerson != null) {
+    agencyTableRows.contactPerson = contactPerson;
+  }
+  final String? contactNo = jsonConvert.convert<String>(json['contact_no']);
+  if (contactNo != null) {
+    agencyTableRows.contactNo = contactNo;
+  }
+  final String? contactEmail = jsonConvert.convert<String>(json['contact_email']);
+  if (contactEmail != null) {
+    agencyTableRows.contactEmail = contactEmail;
+  }
+  final String? status = jsonConvert.convert<String>(json['status']);
+  if (status != null) {
+    agencyTableRows.status = status;
+  }
+  final String? regUrl = jsonConvert.convert<String>(json['reg_url']);
+  if (regUrl != null) {
+    agencyTableRows.regUrl = regUrl;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    agencyTableRows.createdAt = createdAt;
+  }
+  return agencyTableRows;
+}
+
+Map<String, dynamic> $AgencyTableRowsToJson(AgencyTableRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['pivot_id'] = entity.pivotId;
+  data['agency_name'] = entity.agencyName;
+  data['uen_no'] = entity.uenNo;
+  data['contact_person'] = entity.contactPerson;
+  data['contact_no'] = entity.contactNo;
+  data['contact_email'] = entity.contactEmail;
+  data['status'] = entity.status;
+  data['reg_url'] = entity.regUrl;
+  data['created_at'] = entity.createdAt;
+  return data;
+}
+
+extension AgencyTableRowsExtension on AgencyTableRows {
+  AgencyTableRows copyWith({
+    String? pivotId,
+    String? agencyName,
+    String? uenNo,
+    String? contactPerson,
+    String? contactNo,
+    String? contactEmail,
+    String? status,
+    String? regUrl,
+    String? createdAt,
+  }) {
+    return AgencyTableRows()
+      ..pivotId = pivotId ?? this.pivotId
+      ..agencyName = agencyName ?? this.agencyName
+      ..uenNo = uenNo ?? this.uenNo
+      ..contactPerson = contactPerson ?? this.contactPerson
+      ..contactNo = contactNo ?? this.contactNo
+      ..contactEmail = contactEmail ?? this.contactEmail
+      ..status = status ?? this.status
+      ..regUrl = regUrl ?? this.regUrl
+      ..createdAt = createdAt ?? this.createdAt;
+  }
+}

+ 14 - 0
packages/cs_domain/lib/generated/json/attendance_entity.g.dart

@@ -59,6 +59,14 @@ AttendanceList $AttendanceListFromJson(Map<String, dynamic> json) {
   if (endTime != null) {
     attendanceList.endTime = endTime;
   }
+  final String? securityIn = jsonConvert.convert<String>(json['security_in']);
+  if (securityIn != null) {
+    attendanceList.securityIn = securityIn;
+  }
+  final String? securityOut = jsonConvert.convert<String>(json['security_out']);
+  if (securityOut != null) {
+    attendanceList.securityOut = securityOut;
+  }
   final int? checkInId = jsonConvert.convert<int>(json['check_in_id']);
   if (checkInId != null) {
     attendanceList.checkInId = checkInId;
@@ -106,6 +114,8 @@ Map<String, dynamic> $AttendanceListToJson(AttendanceList entity) {
   data['job_date'] = entity.jobDate;
   data['start_time'] = entity.startTime;
   data['end_time'] = entity.endTime;
+  data['security_in'] = entity.securityIn;
+  data['security_out'] = entity.securityOut;
   data['check_in_id'] = entity.checkInId;
   data['check_in_time'] = entity.checkInTime;
   data['check_in_img'] = entity.checkInImg;
@@ -126,6 +136,8 @@ extension AttendanceListExtension on AttendanceList {
     String? jobDate,
     String? startTime,
     String? endTime,
+    String? securityIn,
+    String? securityOut,
     int? checkInId,
     String? checkInTime,
     String? checkInImg,
@@ -143,6 +155,8 @@ extension AttendanceListExtension on AttendanceList {
       ..jobDate = jobDate ?? this.jobDate
       ..startTime = startTime ?? this.startTime
       ..endTime = endTime ?? this.endTime
+      ..securityIn = securityIn ?? this.securityIn
+      ..securityOut = securityOut ?? this.securityOut
       ..checkInId = checkInId ?? this.checkInId
       ..checkInTime = checkInTime ?? this.checkInTime
       ..checkInImg = checkInImg ?? this.checkInImg

+ 28 - 0
packages/cs_domain/lib/generated/json/base/json_convert_content.dart

@@ -5,6 +5,9 @@
 // This file is automatically generated. DO NOT EDIT, all your changes would be lost.
 import 'package:flutter/material.dart' show debugPrint;
 import 'package:domain/entity/response/add_edit_revise_view_s_g_entity.dart';
+import 'package:domain/entity/response/agency_detail_entity.dart';
+import 'package:domain/entity/response/agency_option_entity.dart';
+import 'package:domain/entity/response/agency_table_entity.dart';
 import 'package:domain/entity/response/attendance_entity.dart';
 import 'package:domain/entity/response/attendance_review_entity.dart';
 import 'package:domain/entity/response/check_success_entity.dart';
@@ -12,6 +15,7 @@ import 'package:domain/entity/response/device_list_entity.dart';
 import 'package:domain/entity/response/fiance_report_entity.dart';
 import 'package:domain/entity/response/hotel_info_entity.dart';
 import 'package:domain/entity/response/id_name_entity.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
 import 'package:domain/entity/response/job_applied_edit_index_s_g_entity.dart';
 import 'package:domain/entity/response/job_applied_index_s_g_entity.dart';
 import 'package:domain/entity/response/job_applied_list_s_g_entity.dart';
@@ -193,6 +197,21 @@ class JsonConvert {
     if (<AddEditReviseViewSGEntity>[] is M) {
       return data.map<AddEditReviseViewSGEntity>((Map<String, dynamic> e) => AddEditReviseViewSGEntity.fromJson(e)).toList() as M;
     }
+    if (<AgencyDetailEntity>[] is M) {
+      return data.map<AgencyDetailEntity>((Map<String, dynamic> e) => AgencyDetailEntity.fromJson(e)).toList() as M;
+    }
+    if (<AgencyDetailPivot>[] is M) {
+      return data.map<AgencyDetailPivot>((Map<String, dynamic> e) => AgencyDetailPivot.fromJson(e)).toList() as M;
+    }
+    if (<AgencyOptionEntity>[] is M) {
+      return data.map<AgencyOptionEntity>((Map<String, dynamic> e) => AgencyOptionEntity.fromJson(e)).toList() as M;
+    }
+    if (<AgencyTableEntity>[] is M) {
+      return data.map<AgencyTableEntity>((Map<String, dynamic> e) => AgencyTableEntity.fromJson(e)).toList() as M;
+    }
+    if (<AgencyTableRows>[] is M) {
+      return data.map<AgencyTableRows>((Map<String, dynamic> e) => AgencyTableRows.fromJson(e)).toList() as M;
+    }
     if (<AttendanceEntity>[] is M) {
       return data.map<AttendanceEntity>((Map<String, dynamic> e) => AttendanceEntity.fromJson(e)).toList() as M;
     }
@@ -232,6 +251,9 @@ class JsonConvert {
     if (<IdNameEntity>[] is M) {
       return data.map<IdNameEntity>((Map<String, dynamic> e) => IdNameEntity.fromJson(e)).toList() as M;
     }
+    if (<IndexOptionEntity>[] is M) {
+      return data.map<IndexOptionEntity>((Map<String, dynamic> e) => IndexOptionEntity.fromJson(e)).toList() as M;
+    }
     if (<JobAppliedEditIndexSGEntity>[] is M) {
       return data.map<JobAppliedEditIndexSGEntity>((Map<String, dynamic> e) => JobAppliedEditIndexSGEntity.fromJson(e)).toList() as M;
     }
@@ -574,6 +596,11 @@ class JsonConvert {
 class JsonConvertClassCollection {
   Map<String, JsonConvertFunction> convertFuncMap = {
     (AddEditReviseViewSGEntity).toString(): AddEditReviseViewSGEntity.fromJson,
+    (AgencyDetailEntity).toString(): AgencyDetailEntity.fromJson,
+    (AgencyDetailPivot).toString(): AgencyDetailPivot.fromJson,
+    (AgencyOptionEntity).toString(): AgencyOptionEntity.fromJson,
+    (AgencyTableEntity).toString(): AgencyTableEntity.fromJson,
+    (AgencyTableRows).toString(): AgencyTableRows.fromJson,
     (AttendanceEntity).toString(): AttendanceEntity.fromJson,
     (AttendanceList).toString(): AttendanceList.fromJson,
     (AttendanceReviewEntity).toString(): AttendanceReviewEntity.fromJson,
@@ -587,6 +614,7 @@ class JsonConvertClassCollection {
     (HotelInfoMenus).toString(): HotelInfoMenus.fromJson,
     (HotelInfoMenusChildren).toString(): HotelInfoMenusChildren.fromJson,
     (IdNameEntity).toString(): IdNameEntity.fromJson,
+    (IndexOptionEntity).toString(): IndexOptionEntity.fromJson,
     (JobAppliedEditIndexSGEntity).toString(): JobAppliedEditIndexSGEntity.fromJson,
     (JobAppliedEditIndexSGStatusList).toString(): JobAppliedEditIndexSGStatusList.fromJson,
     (JobAppliedIndexSGEntity).toString(): JobAppliedIndexSGEntity.fromJson,

+ 47 - 0
packages/cs_domain/lib/generated/json/index_option_entity.g.dart

@@ -0,0 +1,47 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
+
+IndexOptionEntity $IndexOptionEntityFromJson(Map<String, dynamic> json) {
+  final IndexOptionEntity indexOptionEntity = IndexOptionEntity();
+  final String? value = jsonConvert.convert<String>(json['value']);
+  if (value != null) {
+    indexOptionEntity.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    indexOptionEntity.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    indexOptionEntity.selected = selected;
+  }
+  final String? checked = jsonConvert.convert<String>(json['checked']);
+  if (checked != null) {
+    indexOptionEntity.checked = checked;
+  }
+  return indexOptionEntity;
+}
+
+Map<String, dynamic> $IndexOptionEntityToJson(IndexOptionEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  data['checked'] = entity.checked;
+  return data;
+}
+
+extension IndexOptionEntityExtension on IndexOptionEntity {
+  IndexOptionEntity copyWith({
+    String? value,
+    String? txt,
+    String? selected,
+    String? checked,
+  }) {
+    return IndexOptionEntity()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected
+      ..checked = checked ?? this.checked;
+  }
+}

+ 6 - 5
packages/cs_domain/lib/repository/auth_repository.dart

@@ -16,6 +16,7 @@ class AuthRepository extends GetxService {
   Future<HttpResult<HotelInfoEntity>> userLogin(
     String? email,
     String? password, {
+    int version = 1,
     CancelToken? cancelToken,
   }) async {
     //Post请求
@@ -25,7 +26,7 @@ class AuthRepository extends GetxService {
 
     final result = await httpProvider.requestNetResult(
       method: HttpMethod.POST,
-      ApiConstants.apiUserLogin,
+      version == 2 ? ApiConstants.apiAuthLoginV2 : ApiConstants.apiUserLogin,
       params: params,
       networkDebounce: true,
       isShowLoadingDialog: true,
@@ -92,9 +93,11 @@ class AuthRepository extends GetxService {
   }
 
   /// 获取酒店信息
-  Future<HttpResult<HotelInfoEntity>> fetchHotelInfo() async {
+  Future<HttpResult<HotelInfoEntity>> fetchHotelInfo({int version = 1}) async {
     final result = await httpProvider.requestNetResult(
-      ApiConstants.apiHotelInfo,
+      version == 2 ? ApiConstants.apiHotelInfoV2 : ApiConstants.apiHotelInfo,
+      method: HttpMethod.GET,
+      networkDebounce: true,
     );
 
     //根据返回的结果,封装原始数据为Bean/Entity对象
@@ -142,7 +145,6 @@ class AuthRepository extends GetxService {
   Future<HttpResult> hotelDeactivate({
     CancelToken? cancelToken,
   }) async {
-
     final result = await httpProvider.requestNetResult(
       ApiConstants.apiHotelDeactivate,
       method: HttpMethod.POST,
@@ -158,5 +160,4 @@ class AuthRepository extends GetxService {
     }
     return result.convert();
   }
-
 }

+ 218 - 0
packages/cs_domain/lib/repository/sg_agency_repository.dart

@@ -0,0 +1,218 @@
+import 'package:domain/entity/response/agency_detail_entity.dart';
+import 'package:domain/entity/response/agency_option_entity.dart';
+import 'package:domain/entity/response/agency_table_entity.dart';
+import 'package:domain/entity/response/hotel_info_entity.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/http/http_provider.dart';
+import 'package:plugin_platform/http/http_result.dart';
+import 'package:plugin_platform/platform_export.dart';
+import 'package:shared/utils/util.dart';
+
+import '../constants/api_constants.dart';
+
+/// SG的中介相关数据仓库
+class SGAgencyRepository extends GetxService {
+  HttpProvider httpProvider;
+
+  SGAgencyRepository({required this.httpProvider});
+
+  /// 获取中介列表选项
+  Future<HttpResult<AgencyOptionEntity>> fetchAgencyOption({
+    CancelToken? cancelToken,
+  }) async {
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAgencyOption,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = AgencyOptionEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<AgencyOptionEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取中介列表Table
+  Future<HttpResult<AgencyTableEntity>> fetchAgencyTable({
+    required int curPage,
+    String? keyword,
+    String? status,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "10";
+
+    if (Utils.isNotEmpty(keyword)) {
+      params["keyword"] = keyword!;
+    }
+    if (Utils.isNotEmpty(status)) {
+      params["status"] = status!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAgencyTable,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = AgencyTableEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<AgencyTableEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 删除中介
+  Future<HttpResult> deleteAgencySubmit(
+    String? pivotId, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+
+    params['pivot_id'] = pivotId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAgencyDelete,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 添加中介
+  Future<HttpResult> addAgencySubmit({
+    required String? agencyName,
+    required String? acraNo,
+    String? contactPerson,
+    String? address,
+    String? contactNo,
+    String? contactEmail,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['agency_name'] = agencyName ?? "";
+    params['acra_no'] = acraNo ?? "";
+    if (!Utils.isEmpty(contactPerson)) {
+      params["contact_person"] = contactPerson!;
+    }
+    if (!Utils.isEmpty(address)) {
+      params["address"] = address!;
+    }
+    if (!Utils.isEmpty(contactNo)) {
+      params["contact_no"] = contactNo!;
+    }
+    if (!Utils.isEmpty(contactEmail)) {
+      params["contact_email"] = contactEmail!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAgencyAdd,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 编辑中介
+  Future<HttpResult> editAgencySubmit({
+    required String? pivotId,
+    required String? agencyName,
+    required String? acraNo,
+    String? contactPerson,
+    String? address,
+    String? contactNo,
+    String? contactEmail,
+    String? status,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['pivot_id'] = pivotId ?? "";
+    params['agency_name'] = agencyName ?? "";
+    params['acra_no'] = acraNo ?? "";
+    if (!Utils.isEmpty(contactPerson)) {
+      params["contact_person"] = contactPerson!;
+    }
+    if (!Utils.isEmpty(address)) {
+      params["address"] = address!;
+    }
+    if (!Utils.isEmpty(contactNo)) {
+      params["contact_no"] = contactNo!;
+    }
+    if (!Utils.isEmpty(contactEmail)) {
+      params["contact_email"] = contactEmail!;
+    }
+    if (!Utils.isEmpty(status)) {
+      params["status"] = status!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAgencyEdit,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 获取中介的编辑详情
+  Future<HttpResult<AgencyDetailEntity>> fetchAgencyEditDetail({
+    required String? pivotId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    if (!Utils.isEmpty(pivotId)) {
+      params["pivot_id"] = pivotId!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAgencyDetail,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = AgencyDetailEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<AgencyDetailEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+}

+ 2 - 0
packages/cs_initializer/lib/global_services_injection.dart

@@ -9,6 +9,7 @@ import 'package:domain/repository/uk_attendance_repository.dart';
 import 'package:domain/repository/uk_job_repository.dart';
 import 'package:domain/repository/uk_report_repository.dart';
 import 'package:domain/repository/uk_review_repository.dart';
+import 'package:domain/repository/sg_agency_repository.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:plugin_basic/dio_interceptors/interceptor_auth_dio.dart';
 import 'package:plugin_basic/dio_interceptors/interceptor_status_code_dio.dart';
@@ -45,6 +46,7 @@ class GlobalServicesInjection {
     Get.lazyPut(() => LabourRepository(httpProvider: Get.find()));
     Get.lazyPut(() => LabourSGRepository(httpProvider: Get.find()));
     Get.lazyPut(() => OtherRepository(httpProvider: Get.find()));
+    Get.lazyPut(() => SGAgencyRepository(httpProvider: Get.find()));
     //UK的数据仓库注入
     Get.lazyPut(() => UKJobRepository(httpProvider: Get.find()));
     Get.lazyPut(() => UKAttendanceRepository(httpProvider: Get.find()));

+ 1 - 0
packages/cs_resources/lib/local/language/en_US.dart

@@ -290,6 +290,7 @@ const Map<String, String> en_US = {
   'Eve of PH day': 'Eve of PH day',
   'PH Days': 'PH Days',
   'Contract Rate Management': 'Contract Rate Management',
+  'No Register': 'No Register',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

+ 1 - 0
packages/cs_resources/lib/local/language/zh_CN.dart

@@ -290,6 +290,7 @@ const Map<String, String> zh_CN = {
   'Eve of PH day': '法定假日前夕',
   'PH Days': '法定假日',
   'Contract Rate Management': '合同时薪管理',
+  'No Register': '未注册',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',

+ 6 - 6
packages/cs_widgets/lib/picker/option_pick_util.dart

@@ -34,18 +34,18 @@ class OptionPickerUtil {
                 mainAxisAlignment: MainAxisAlignment.spaceBetween,
                 children: [
                   CupertinoButton(
+                    onPressed: onReset ??
+                        () {
+                          SmartDialog.dismiss(tag: 'data_picker');
+                        },
                     child: Text(
                       cancelTextStr ?? 'Cancel'.tr,
-                      style: TextStyle(
+                      style: const TextStyle(
                         fontSize: 16,
                         fontWeight: FontWeight.w600,
                         color: ColorConstants.appBlue,
                       ),
                     ),
-                    onPressed: onReset ??
-                        () {
-                          SmartDialog.dismiss(tag: 'data_picker');
-                        },
                   ),
                   Text(
                     title ?? "",
@@ -58,7 +58,7 @@ class OptionPickerUtil {
                   CupertinoButton(
                     child: Text(
                       confirmTextStr ?? 'Confirm'.tr,
-                      style: TextStyle(
+                      style: const TextStyle(
                         fontSize: 16,
                         fontWeight: FontWeight.w600,
                         color: ColorConstants.appBlue,