瀏覽代碼

中介的合同管理,列表,筛选,添加,编辑

liukai 2 周之前
父節點
當前提交
57940dfe3c
共有 19 個文件被更改,包括 871 次插入215 次删除
  1. 89 101
      packages/cpt_sg/lib/modules/agency/contract_add/contract_add_controller.dart
  2. 7 7
      packages/cpt_sg/lib/modules/agency/contract_add/contract_add_page.dart
  3. 8 3
      packages/cpt_sg/lib/modules/agency/contract_add/contract_add_state.dart
  4. 28 43
      packages/cpt_sg/lib/modules/agency/contract_list/contract_item.dart
  5. 88 47
      packages/cpt_sg/lib/modules/agency/contract_list/contract_list_controller.dart
  6. 3 2
      packages/cpt_sg/lib/modules/agency/contract_list/contract_list_page.dart
  7. 7 7
      packages/cpt_sg/lib/modules/agency/contract_list/contract_list_state.dart
  8. 21 0
      packages/cs_domain/lib/constants/api_constants.dart
  9. 56 0
      packages/cs_domain/lib/entity/response/contract_detail_entity.dart
  10. 24 0
      packages/cs_domain/lib/entity/response/contract_option_entity.dart
  11. 53 0
      packages/cs_domain/lib/entity/response/contract_table_entity.dart
  12. 23 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  13. 123 0
      packages/cs_domain/lib/generated/json/contract_detail_entity.g.dart
  14. 37 0
      packages/cs_domain/lib/generated/json/contract_option_entity.g.dart
  15. 121 0
      packages/cs_domain/lib/generated/json/contract_table_entity.g.dart
  16. 179 3
      packages/cs_domain/lib/repository/sg_agency_repository.dart
  17. 2 2
      packages/cs_plugin_platform/lib/engine/network/network_engine.dart
  18. 1 0
      packages/cs_resources/lib/local/language/en_US.dart
  19. 1 0
      packages/cs_resources/lib/local/language/zh_CN.dart

+ 89 - 101
packages/cpt_sg/lib/modules/agency/contract_add/contract_add_controller.dart

@@ -1,7 +1,14 @@
-import 'package:domain/repository/labour_sg_repository.dart';
+import 'package:domain/entity/response/contract_detail_entity.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
+import 'package:domain/repository/sg_agency_repository.dart';
 import 'package:flutter/cupertino.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/date_time_utils.dart';
+import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 import 'package:widgets/picker/date_picker_util.dart';
 import 'package:widgets/picker/option_pick_util.dart';
@@ -9,98 +16,81 @@ import 'package:widgets/picker/option_pick_util.dart';
 import 'contract_add_state.dart';
 
 class ContractAddController extends GetxController with DioCancelableMixin {
-  final LabourSGRepository _labourRepository = Get.find();
+  final SGAgencyRepository _agencyRepository = Get.find();
   final ContractAddState state = ContractAddState();
 
   // 获取添加或者编辑的详情
   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);
-    // }
+    Future<HttpResult<ContractDetailEntity>> taskFuture;
+    if (Utils.isNotEmpty(state.contractId) && state.contractId != "0") {
+      //编辑
+      taskFuture = _agencyRepository.fetchContractEditDetail(contractId: state.contractId, cancelToken: cancelToken);
+    } else {
+      //新增
+      taskFuture = _agencyRepository.fetchContractAddOption(cancelToken: cancelToken);
+    }
+
+    var result = await taskFuture;
+
+    //处理数据
+    if (result.isSuccess) {
+      state.detailOption = result.data;
+
+      state.selectedStartTime = result.data?.row?.startDate == null ? null : DateTimeUtils.getDateTime(result.data!.row!.startDate!);
+      state.selectedEndTime = result.data?.row?.endDate == null ? null : DateTimeUtils.getDateTime(result.data!.row!.endDate!);
+
+      state.agencyList = state.detailOption?.agencyList ?? [];
+
+      state.selectedAgencyId = state.detailOption?.agencyList.firstWhere((e) => e.selected == "selected", orElse: () => IndexOptionEntity()).value;
+      state.selectedAgencyTxt = state.detailOption?.agencyList.firstWhere((e) => e.selected == "selected", orElse: () => IndexOptionEntity()).txt;
+
+      if(Utils.isNotEmpty(state.detailOption?.row?.file)){
+       List<String> images = [state.detailOption!.row!.file!];
+        state.selectedPaths = images;
+      }
+
+      update();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
   }
 
   /// 提交
   void doSubmit() async {
-
-
-    // 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.contractId) && state.contractId != "0") {
+      taskFuture = _agencyRepository.editContractSubmit(
+        contractId: state.contractId,
+        agencyId: state.selectedAgencyId,
+        startDate: DateTimeUtils.formatDate(state.selectedStartTime!, format: 'yyyy-MM-dd'),
+        endDate: DateTimeUtils.formatDate(state.selectedEndTime!, format: 'yyyy-MM-dd'),
+        paths: state.selectedPaths,
+        cancelToken: cancelToken,
+      );
+    } else {
+      taskFuture = _agencyRepository.addContractSubmit(
+        agencyId: state.selectedAgencyId,
+        startDate: DateTimeUtils.formatDate(state.selectedStartTime!, format: 'yyyy-MM-dd'),
+        endDate: DateTimeUtils.formatDate(state.selectedEndTime!, format: 'yyyy-MM-dd'),
+        paths: state.selectedPaths,
+        cancelToken: cancelToken,
+      );
+    }
+
+    var result = await taskFuture;
+
+    //处理数据
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      //根据类型刷新
+      state.cb?.call(state.contractId);
+
+      Get.back();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
   }
 
   @override
@@ -111,7 +101,6 @@ class ContractAddController extends GetxController with DioCancelableMixin {
 
   //选择开始时间
   void pickStartTime() {
-
     DatePickerUtil.showCupertinoDatePicker(
       selectedDateTime: state.selectedStartTime,
       mode: CupertinoDatePickerMode.date,
@@ -125,7 +114,6 @@ class ContractAddController extends GetxController with DioCancelableMixin {
 
   // 选择结束时间
   void pickEndTime() {
-
     DatePickerUtil.showCupertinoDatePicker(
       selectedDateTime: state.selectedEndTime ?? state.selectedStartTime,
       mode: CupertinoDatePickerMode.date,
@@ -139,24 +127,25 @@ class ContractAddController extends GetxController with DioCancelableMixin {
 
   // 选择中介商
   void pickAgency() {
+    if (state.detailOption == null) return;
+
+    int selectedIndex;
+    if (state.selectedAgencyId == null) {
+      selectedIndex = 0;
+    } else {
+      selectedIndex = state.detailOption!.agencyList.indexWhere((bean) => bean.value.toString() == state.selectedAgencyId);
+    }
 
-    // int selectedTemplateIndex;
-    // if (state.selectedJobTitleId == null) {
-    //   selectedTemplateIndex = 0;
-    // } else {
-    //   selectedTemplateIndex = state.indexEntity!.titleList.indexWhere((department) => department.value.toString() == state.selectedJobTitleId);
-    // }
-    //
-    // if (selectedTemplateIndex < 0) {
-    //   selectedTemplateIndex = 0;
-    // }
+    if (selectedIndex < 0) {
+      selectedIndex = 0;
+    }
 
     OptionPickerUtil.showCupertinoOptionPicker(
-      items: state.agencyList,
-      initialSelectIndex: 0,
+      items: state.detailOption!.agencyList.map((e) => e.txt!.tr).toList(growable: false),
+      initialSelectIndex: selectedIndex,
       onPickerChanged: (_, index) {
-        state.selectedAgency =  state.agencyList[index];
-        state.selectedAgencyId = index.toString();
+        state.selectedAgencyId = state.detailOption!.agencyList[index].value!.toString();
+        state.selectedAgencyTxt = state.detailOption!.agencyList[index].txt!.toString();
         update();
       },
     );
@@ -167,5 +156,4 @@ class ContractAddController extends GetxController with DioCancelableMixin {
     state.selectedPaths = list;
     update();
   }
-
 }

+ 7 - 7
packages/cpt_sg/lib/modules/agency/contract_add/contract_add_page.dart

@@ -29,10 +29,10 @@ class SGContractAddPage extends BaseStatelessPage<ContractAddController> {
 
   //启动当前页面
   static void startInstance(
-    String agentId,
+    String? contractId,
     void Function(dynamic value)? cb,
   ) {
-    return Get.start(RouterPath.SGContractAdd, arguments: {'agentId': agentId, 'cb': cb});
+    return Get.start(RouterPath.SGContractAdd, arguments: {'contractId': contractId, 'cb': cb});
   }
 
   late ContractAddState state;
@@ -40,7 +40,7 @@ class SGContractAddPage extends BaseStatelessPage<ContractAddController> {
   @override
   void initState() {
     state = controller.state;
-    state.agentId = Get.arguments['agentId'];
+    state.contractId = Get.arguments['contractId'];
     state.cb = Get.arguments['cb'] as void Function(dynamic)?;
   }
 
@@ -54,7 +54,7 @@ class SGContractAddPage extends BaseStatelessPage<ContractAddController> {
     return autoCtlGetBuilder(builder: (controller) {
       return Scaffold(
         extendBodyBehindAppBar: true,
-        appBar: MyAppBar.appBar(context, Utils.isEmpty(state.agentId) ? "Add Contract".tr : "Edit Contract".tr),
+        appBar: MyAppBar.appBar(context, Utils.isEmpty(state.contractId) ? "Add Contract".tr : "Edit Contract".tr),
         body: SafeArea(
           bottom: true,
           top: false,
@@ -100,9 +100,9 @@ class SGContractAddPage extends BaseStatelessPage<ContractAddController> {
                           mainAxisAlignment: MainAxisAlignment.start,
                           children: [
                             MyTextView(
-                              state.selectedAgency ?? "",
+                              state.selectedAgencyTxt ?? "",
                               fontSize: 14,
-                              hint: "Choose Job Title".tr,
+                              hint: "Agency".tr,
                               textHintColor: ColorConstants.textGrayAECAE5,
                               isFontMedium: true,
                               textColor: ColorConstants.white,
@@ -196,7 +196,7 @@ class SGContractAddPage extends BaseStatelessPage<ContractAddController> {
                       //九宫格图片选择
                       ImageNineGrid(
                         isSelectEnable: true,
-                        maxImages: 9,
+                        maxImages: 1,
                         spacing: 15,
                         initialImages: state.selectedPaths,
                         onImagesChanged: (list) {

+ 8 - 3
packages/cpt_sg/lib/modules/agency/contract_add/contract_add_state.dart

@@ -1,16 +1,21 @@
 
+import 'package:domain/entity/response/contract_detail_entity.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
+
 class ContractAddState {
 
   DateTime? selectedStartTime;
   DateTime? selectedEndTime;
 
-  List<String> agencyList = ["瓜豆1", "瓜豆2", "瓜豆3"];
-  String? selectedAgency;
+  List<IndexOptionEntity> agencyList = [];
   String? selectedAgencyId;
+  String? selectedAgencyTxt;
 
   List<String> selectedPaths = [];  //选择的文件路径
 
-  String? agentId;
+  String? contractId;
+
+  ContractDetailEntity? detailOption;
   void Function(dynamic value)? cb;
 
 }

+ 28 - 43
packages/cpt_sg/lib/modules/agency/contract_list/contract_item.dart

@@ -1,7 +1,6 @@
 import 'package:cs_resources/constants/color_constants.dart';
 import 'package:cs_resources/generated/assets.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/contract_table_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
@@ -16,7 +15,7 @@ import 'package:widgets/my_text_view.dart';
  */
 class ContractItem extends StatelessWidget {
   final int index;
-  final LabourRequestSGListRows item;
+  final ContractTableRows item;
   final VoidCallback? onRenewAction;
   final VoidCallback? onDetailAction;
   final VoidCallback? onEditAction;
@@ -56,7 +55,7 @@ class ContractItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.jobTitle ?? "-",
+                item.agencyName ?? "-",
                 marginLeft: 5,
                 isFontMedium: true,
                 textColor: ColorConstants.textYellowFFBB1B,
@@ -85,7 +84,7 @@ class ContractItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.outletName ?? "-",
+                item.uenNo ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -108,7 +107,7 @@ class ContractItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.outletName ?? "-",
+                item.contactPerson ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -131,7 +130,7 @@ class ContractItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                "1",
+                item.positionNum.toString(),
                 backgroundColor: ColorConstants.textGreen0AC074,
                 cornerRadius: 20,
                 marginLeft: 5,
@@ -160,7 +159,7 @@ class ContractItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                " 2024-01-01",
+                item.startDate ?? "",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -183,7 +182,7 @@ class ContractItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                " 2025-01-01",
+                item.endDate ?? "",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -228,16 +227,18 @@ class ContractItem extends StatelessWidget {
 
               //状态
               MyTextView(
-                item.status == null ? "" : item.status!.tr,
+                1 == item.status
+                    ? "Active".tr
+                    : 2 == item.status
+                        ? "Expired".tr
+                        : "-",
                 marginLeft: 5,
                 isFontRegular: true,
-                textColor: "Applied" == item.status
-                    ? ColorConstants.textGreen05DC82
-                    : "No Register" == item.status
+                textColor: 1 == item.status
+                    ? ColorConstants.textBlue5CEEFF
+                    : 2 == item.status
                         ? ColorConstants.textRedFF6262
-                        : "Pending" == item.status
-                            ? ColorConstants.textYellowFFBB1B
-                            : ColorConstants.white,
+                        : ColorConstants.white,
                 fontSize: 14,
               ).expanded(),
             ],
@@ -268,34 +269,33 @@ class ContractItem extends StatelessWidget {
 
           //按钮组
           Visibility(
-            visible: item.actionList.isNotEmpty,
+            visible: true,
             child: Row(
               mainAxisSize: MainAxisSize.max,
               mainAxisAlignment: MainAxisAlignment.end,
               crossAxisAlignment: CrossAxisAlignment.center,
               children: [
-                //详情按钮
+
+                //Edit按钮
                 Visibility(
-                  visible: item.actionList.contains("detail"),
+                  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,
                   ).marginOnly(left: 12),
                 ),
 
-                //Delete按钮
+                // Renew按钮
                 Visibility(
-                  visible: item.actionList.contains("renew") ?? false,
+                  visible: true,
                   child: MyButton(
                     onPressed: () {
                       FocusScope.of(context).unfocus();
@@ -303,29 +303,14 @@ class ContractItem extends StatelessWidget {
                     },
                     text: "Renew".tr,
                     textColor: ColorConstants.white,
-                    backgroundColor: ColorConstants.textRedFF6262,
+                    backgroundColor: ColorConstants.textYellowFFBB1B,
                     radius: 17.25,
                     minWidth: 60,
                     minHeight: 35,
                   ).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),
           ),

+ 88 - 47
packages/cpt_sg/lib/modules/agency/contract_list/contract_list_controller.dart

@@ -1,19 +1,22 @@
 import 'package:cpt_sg/modules/agency/contract_add/contract_add_page.dart';
 import 'package:cpt_sg/modules/agency/contract_rate_list/contract_rate_list_page.dart';
+import 'package:domain/entity/response/contract_option_entity.dart';
+import 'package:domain/entity/response/contract_table_entity.dart';
 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/labour_request_index_entity.dart';
+import 'package:domain/repository/sg_agency_repository.dart';
 import 'package:get/get.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:widgets/load_state_layout.dart';
+import 'package:widgets/picker/option_pick_util.dart';
 import 'package:widgets/widget_export.dart';
 import 'contract_list_state.dart';
 
 class ContractListController extends GetxController with DioCancelableMixin {
-  final LabourSGRepository _labourRepository = Get.find();
+  final SGAgencyRepository _agencyRepository = Get.find();
   final ContractListState state = ContractListState();
 
   var _curPage = 1;
@@ -62,17 +65,14 @@ class ContractListController extends GetxController with DioCancelableMixin {
 
     // 并发执行两个请求
     var futures = [
-      _labourRepository.fetchLabourRequestSGList(
-        state.keyword,
-        "",
-        "",
-        state.selectedStatusId,
-        "",
+      _agencyRepository.fetchContractTable(
+        status: state.selectedStatusId,
+        agencyId: state.selectedAgencyId,
         curPage: _curPage,
         cancelToken: cancelToken,
       ),
       state.indexOptions == null
-          ? _labourRepository.fetchLabourRequestSGIndex(
+          ? _agencyRepository.fetchContractOption(
               cancelToken: cancelToken,
             )
           : Future(() => HttpResult(isSuccess: true).convert(data: state.indexOptions!)),
@@ -80,8 +80,8 @@ class ContractListController 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<ContractTableEntity>;
+    var optionResult = results[1] as HttpResult<ContractOptionEntity>;
 
     //选项数据
     if (state.indexOptions == null && optionResult.isSuccess) {
@@ -101,7 +101,7 @@ class ContractListController extends GetxController with DioCancelableMixin {
   }
 
   // 处理数据与展示的逻辑
-  void handleList(List<LabourRequestSGListRows>? list) {
+  void handleList(List<ContractTableRows>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (_curPage == 1) {
@@ -131,17 +131,9 @@ class ContractListController extends GetxController with DioCancelableMixin {
     }
   }
 
-  // 执行搜索
-  void doSearch(String keyword) {
-    state.keyword = keyword;
-    //赋值之后刷新
-    refreshController.callRefresh();
-  }
-
   // 清空搜索条件
   void resetFiltering() {
-    state.keyword = "";
-    state.searchController.text = "";
+    state.selectedAgencyId = null;
     state.selectedStatusId = null;
 
     //赋值之后刷新
@@ -150,27 +142,27 @@ class ContractListController 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
@@ -195,24 +187,73 @@ class ContractListController extends GetxController with DioCancelableMixin {
   }
 
   //去详情页面
-  void gotoDetailPage(LabourRequestSGListRows data) {
+  void gotoDetailPage(ContractTableRows data) {
     SGContractRateListPage.startInstance();
   }
 
   //去编辑页面
-  void gotoEditPage(LabourRequestSGListRows data) {
-    SGContractAddPage.startInstance("123", (result) {
+  void gotoEditPage(ContractTableRows data) {
+    SGContractAddPage.startInstance(data.id, (result) {
       if (result != null) {
-        fetchItemByIdAndRefreshItem(data.requestId.toString());
+        fetchItemByIdAndRefreshItem(data.id.toString());
       }
     });
   }
+
   /// 选择状态
-  void pickStatus() {}
+  void pickStatus() {
+    if (state.indexOptions == null) return;
+
+    int selectedIndex;
+    if (state.selectedStatusId == null) {
+      selectedIndex = 0;
+    } else {
+      selectedIndex = state.indexOptions!.statusList.indexWhere((bean) => bean.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();
+      },
+    );
+  }
 
   /// 选择中介
   void pickAgency() {
+    if (state.indexOptions == null) return;
 
+    int selectedIndex;
+    if (state.selectedAgencyId == null) {
+      selectedIndex = 0;
+    } else {
+      selectedIndex = state.indexOptions!.agencyList.indexWhere((bean) => bean.value.toString() == state.selectedAgencyId);
+    }
+
+    if (selectedIndex < 0) {
+      selectedIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: state.indexOptions!.agencyList.map((e) => e.txt!.tr).toList(growable: false),
+      initialSelectIndex: selectedIndex,
+      onPickerChanged: (_, index) {
+        state.selectedAgencyId = state.indexOptions!.agencyList[index].value!.toString();
+        state.selectedAgencyTxt = state.indexOptions!.agencyList[index].txt!.toString();
+        update();
+
+        refreshController.callRefresh();
+      },
+    );
   }
 
 }

+ 3 - 2
packages/cpt_sg/lib/modules/agency/contract_list/contract_list_page.dart

@@ -91,7 +91,8 @@ class _LabourRequestListState extends BaseState<SGContractListPage, ContractList
                       mainAxisAlignment: MainAxisAlignment.start,
                       children: [
                         MyTextView(
-                          "",
+                          state.selectedAgencyTxt??"",
+                          maxLines: 1,
                           fontSize: 14,
                           hint: "Agency".tr,
                           textHintColor: ColorConstants.textGrayAECAE5,
@@ -122,7 +123,7 @@ class _LabourRequestListState extends BaseState<SGContractListPage, ContractList
                       mainAxisAlignment: MainAxisAlignment.start,
                       children: [
                         MyTextView(
-                          "",
+                          state.selectedStatusTxt??"",
                           fontSize: 14,
                           hint: "Status".tr,
                           textHintColor: ColorConstants.textGrayAECAE5,

+ 7 - 7
packages/cpt_sg/lib/modules/agency/contract_list/contract_list_state.dart

@@ -1,15 +1,15 @@
-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/contract_option_entity.dart';
+import 'package:domain/entity/response/contract_table_entity.dart';
 import 'package:flutter/material.dart';
 
 class ContractListState {
   //筛选条件
-  final TextEditingController searchController = TextEditingController();
-  final FocusNode focusNode = FocusNode();
-  String keyword = "";
+  String? selectedAgencyId;
+  String? selectedAgencyTxt;
   String? selectedStatusId;
+  String? selectedStatusTxt;
 
   //页面的列表数据
-  List<LabourRequestSGListRows> datas = [];
-  LabourRequestIndexEntity? indexOptions;
+  List<ContractTableRows> datas = [];
+  ContractOptionEntity? indexOptions;
 }

+ 21 - 0
packages/cs_domain/lib/constants/api_constants.dart

@@ -346,4 +346,25 @@ class ApiConstants {
   //中介职位的删除
   static const apiAgencyPositionDelete = "/index.php/api/v2/hotel/position/destroy";
 
+  //中介合同列表Option
+  static const apiContractOption = "/index.php/api/v2/hotel/contract/index";
+
+  //中介合同列表
+  static const apiContractTable = "/index.php/api/v2/hotel/contract/table";
+
+  //中介合同添加Option
+  static const apiContractAddOption = "/index.php/api/v2/hotel/contract/add-view";
+
+  //中介合同添加的提交
+  static const apiContractAddSubmit = "/index.php/api/v2/hotel/contract/add-submit";
+
+  //中介合同的详情
+  static const apiContractDetail = "/index.php/api/v2/hotel/contract/edit-view";
+
+  //中介合同的编辑提交
+  static const apiContractEditSubmit = "/index.php/api/v2/hotel/contract/edit-submit";
+
+  //中介合同的renew操作
+  static const apiContractRenew = "/index.php/api/v2/hotel/contract/renew";
+
 }

+ 56 - 0
packages/cs_domain/lib/entity/response/contract_detail_entity.dart

@@ -0,0 +1,56 @@
+import 'package:domain/entity/response/index_option_entity.dart';
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/contract_detail_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/contract_detail_entity.g.dart';
+
+@JsonSerializable()
+class ContractDetailEntity {
+	ContractDetailRow? row;
+	@JSONField(name: "agency_list")
+	List<IndexOptionEntity> agencyList = [];
+
+	ContractDetailEntity();
+
+	factory ContractDetailEntity.fromJson(Map<String, dynamic> json) => $ContractDetailEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractDetailEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class ContractDetailRow {
+	String? id;
+	@JSONField(name: "employer_id")
+	String? employerId;
+	@JSONField(name: "agency_id")
+	String? agencyId;
+	@JSONField(name: "start_date")
+	String? startDate;
+	@JSONField(name: "end_date")
+	String? endDate;
+	String? file;
+	int? status;
+	@JSONField(name: "created_at")
+	String? createdAt;
+	@JSONField(name: "updated_at")
+	String? updatedAt;
+	@JSONField(name: "deleted_at")
+	String? deletedAt;
+
+	ContractDetailRow();
+
+	factory ContractDetailRow.fromJson(Map<String, dynamic> json) => $ContractDetailRowFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractDetailRowToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+

+ 24 - 0
packages/cs_domain/lib/entity/response/contract_option_entity.dart

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

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

@@ -0,0 +1,53 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/contract_table_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/contract_table_entity.g.dart';
+
+@JsonSerializable()
+class ContractTableEntity {
+	int total = 0;
+	List<ContractTableRows> rows = [];
+
+	ContractTableEntity();
+
+	factory ContractTableEntity.fromJson(Map<String, dynamic> json) => $ContractTableEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractTableEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class ContractTableRows {
+	String? id;
+	@JSONField(name: "agency_name")
+	String? agencyName;
+	@JSONField(name: "uen_no")
+	String? uenNo;
+	@JSONField(name: "contact_person")
+	String? contactPerson;
+	@JSONField(name: "start_date")
+	String? startDate;
+	@JSONField(name: "end_date")
+	String? endDate;
+	String? file;
+	@JSONField(name: "position_num")
+	int positionNum = 0;
+	int status = 0;
+	@JSONField(name: "created_at")
+	String? createdAt;
+
+	ContractTableRows();
+
+	factory ContractTableRows.fromJson(Map<String, dynamic> json) => $ContractTableRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractTableRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

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

@@ -11,6 +11,9 @@ 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';
+import 'package:domain/entity/response/contract_detail_entity.dart';
+import 'package:domain/entity/response/contract_option_entity.dart';
+import 'package:domain/entity/response/contract_table_entity.dart';
 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';
@@ -228,6 +231,21 @@ class JsonConvert {
     if (<CheckSuccessEntity>[] is M) {
       return data.map<CheckSuccessEntity>((Map<String, dynamic> e) => CheckSuccessEntity.fromJson(e)).toList() as M;
     }
+    if (<ContractDetailEntity>[] is M) {
+      return data.map<ContractDetailEntity>((Map<String, dynamic> e) => ContractDetailEntity.fromJson(e)).toList() as M;
+    }
+    if (<ContractDetailRow>[] is M) {
+      return data.map<ContractDetailRow>((Map<String, dynamic> e) => ContractDetailRow.fromJson(e)).toList() as M;
+    }
+    if (<ContractOptionEntity>[] is M) {
+      return data.map<ContractOptionEntity>((Map<String, dynamic> e) => ContractOptionEntity.fromJson(e)).toList() as M;
+    }
+    if (<ContractTableEntity>[] is M) {
+      return data.map<ContractTableEntity>((Map<String, dynamic> e) => ContractTableEntity.fromJson(e)).toList() as M;
+    }
+    if (<ContractTableRows>[] is M) {
+      return data.map<ContractTableRows>((Map<String, dynamic> e) => ContractTableRows.fromJson(e)).toList() as M;
+    }
     if (<DeviceListEntity>[] is M) {
       return data.map<DeviceListEntity>((Map<String, dynamic> e) => DeviceListEntity.fromJson(e)).toList() as M;
     }
@@ -613,6 +631,11 @@ class JsonConvertClassCollection {
     (AttendanceReviewEntity).toString(): AttendanceReviewEntity.fromJson,
     (AttendanceReviewRows).toString(): AttendanceReviewRows.fromJson,
     (CheckSuccessEntity).toString(): CheckSuccessEntity.fromJson,
+    (ContractDetailEntity).toString(): ContractDetailEntity.fromJson,
+    (ContractDetailRow).toString(): ContractDetailRow.fromJson,
+    (ContractOptionEntity).toString(): ContractOptionEntity.fromJson,
+    (ContractTableEntity).toString(): ContractTableEntity.fromJson,
+    (ContractTableRows).toString(): ContractTableRows.fromJson,
     (DeviceListEntity).toString(): DeviceListEntity.fromJson,
     (DeviceListRows).toString(): DeviceListRows.fromJson,
     (FianceReportEntity).toString(): FianceReportEntity.fromJson,

+ 123 - 0
packages/cs_domain/lib/generated/json/contract_detail_entity.g.dart

@@ -0,0 +1,123 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/contract_detail_entity.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
+
+
+ContractDetailEntity $ContractDetailEntityFromJson(Map<String, dynamic> json) {
+  final ContractDetailEntity contractDetailEntity = ContractDetailEntity();
+  final ContractDetailRow? row = jsonConvert.convert<ContractDetailRow>(json['row']);
+  if (row != null) {
+    contractDetailEntity.row = row;
+  }
+  final List<IndexOptionEntity>? agencyList = (json['agency_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (agencyList != null) {
+    contractDetailEntity.agencyList = agencyList;
+  }
+  return contractDetailEntity;
+}
+
+Map<String, dynamic> $ContractDetailEntityToJson(ContractDetailEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['row'] = entity.row?.toJson();
+  data['agency_list'] = entity.agencyList.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension ContractDetailEntityExtension on ContractDetailEntity {
+  ContractDetailEntity copyWith({
+    ContractDetailRow? row,
+    List<IndexOptionEntity>? agencyList,
+  }) {
+    return ContractDetailEntity()
+      ..row = row ?? this.row
+      ..agencyList = agencyList ?? this.agencyList;
+  }
+}
+
+ContractDetailRow $ContractDetailRowFromJson(Map<String, dynamic> json) {
+  final ContractDetailRow contractDetailRow = ContractDetailRow();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    contractDetailRow.id = id;
+  }
+  final String? employerId = jsonConvert.convert<String>(json['employer_id']);
+  if (employerId != null) {
+    contractDetailRow.employerId = employerId;
+  }
+  final String? agencyId = jsonConvert.convert<String>(json['agency_id']);
+  if (agencyId != null) {
+    contractDetailRow.agencyId = agencyId;
+  }
+  final String? startDate = jsonConvert.convert<String>(json['start_date']);
+  if (startDate != null) {
+    contractDetailRow.startDate = startDate;
+  }
+  final String? endDate = jsonConvert.convert<String>(json['end_date']);
+  if (endDate != null) {
+    contractDetailRow.endDate = endDate;
+  }
+  final String? file = jsonConvert.convert<String>(json['file']);
+  if (file != null) {
+    contractDetailRow.file = file;
+  }
+  final int? status = jsonConvert.convert<int>(json['status']);
+  if (status != null) {
+    contractDetailRow.status = status;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    contractDetailRow.createdAt = createdAt;
+  }
+  final String? updatedAt = jsonConvert.convert<String>(json['updated_at']);
+  if (updatedAt != null) {
+    contractDetailRow.updatedAt = updatedAt;
+  }
+  final String? deletedAt = jsonConvert.convert<String>(json['deleted_at']);
+  if (deletedAt != null) {
+    contractDetailRow.deletedAt = deletedAt;
+  }
+  return contractDetailRow;
+}
+
+Map<String, dynamic> $ContractDetailRowToJson(ContractDetailRow entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['employer_id'] = entity.employerId;
+  data['agency_id'] = entity.agencyId;
+  data['start_date'] = entity.startDate;
+  data['end_date'] = entity.endDate;
+  data['file'] = entity.file;
+  data['status'] = entity.status;
+  data['created_at'] = entity.createdAt;
+  data['updated_at'] = entity.updatedAt;
+  data['deleted_at'] = entity.deletedAt;
+  return data;
+}
+
+extension ContractDetailRowExtension on ContractDetailRow {
+  ContractDetailRow copyWith({
+    String? id,
+    String? employerId,
+    String? agencyId,
+    String? startDate,
+    String? endDate,
+    String? file,
+    int? status,
+    String? createdAt,
+    String? updatedAt,
+    String? deletedAt,
+  }) {
+    return ContractDetailRow()
+      ..id = id ?? this.id
+      ..employerId = employerId ?? this.employerId
+      ..agencyId = agencyId ?? this.agencyId
+      ..startDate = startDate ?? this.startDate
+      ..endDate = endDate ?? this.endDate
+      ..file = file ?? this.file
+      ..status = status ?? this.status
+      ..createdAt = createdAt ?? this.createdAt
+      ..updatedAt = updatedAt ?? this.updatedAt
+      ..deletedAt = deletedAt ?? this.deletedAt;
+  }
+}

+ 37 - 0
packages/cs_domain/lib/generated/json/contract_option_entity.g.dart

@@ -0,0 +1,37 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/contract_option_entity.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
+
+
+ContractOptionEntity $ContractOptionEntityFromJson(Map<String, dynamic> json) {
+  final ContractOptionEntity contractOptionEntity = ContractOptionEntity();
+  final List<IndexOptionEntity>? agencyList = (json['agency_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (agencyList != null) {
+    contractOptionEntity.agencyList = agencyList;
+  }
+  final List<IndexOptionEntity>? statusList = (json['status_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (statusList != null) {
+    contractOptionEntity.statusList = statusList;
+  }
+  return contractOptionEntity;
+}
+
+Map<String, dynamic> $ContractOptionEntityToJson(ContractOptionEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['agency_list'] = entity.agencyList.map((v) => v.toJson()).toList();
+  data['status_list'] = entity.statusList.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension ContractOptionEntityExtension on ContractOptionEntity {
+  ContractOptionEntity copyWith({
+    List<IndexOptionEntity>? agencyList,
+    List<IndexOptionEntity>? statusList,
+  }) {
+    return ContractOptionEntity()
+      ..agencyList = agencyList ?? this.agencyList
+      ..statusList = statusList ?? this.statusList;
+  }
+}

+ 121 - 0
packages/cs_domain/lib/generated/json/contract_table_entity.g.dart

@@ -0,0 +1,121 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/contract_table_entity.dart';
+
+ContractTableEntity $ContractTableEntityFromJson(Map<String, dynamic> json) {
+  final ContractTableEntity contractTableEntity = ContractTableEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    contractTableEntity.total = total;
+  }
+  final List<ContractTableRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<ContractTableRows>(e) as ContractTableRows).toList();
+  if (rows != null) {
+    contractTableEntity.rows = rows;
+  }
+  return contractTableEntity;
+}
+
+Map<String, dynamic> $ContractTableEntityToJson(ContractTableEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension ContractTableEntityExtension on ContractTableEntity {
+  ContractTableEntity copyWith({
+    int? total,
+    List<ContractTableRows>? rows,
+  }) {
+    return ContractTableEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+ContractTableRows $ContractTableRowsFromJson(Map<String, dynamic> json) {
+  final ContractTableRows contractTableRows = ContractTableRows();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    contractTableRows.id = id;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    contractTableRows.agencyName = agencyName;
+  }
+  final String? uenNo = jsonConvert.convert<String>(json['uen_no']);
+  if (uenNo != null) {
+    contractTableRows.uenNo = uenNo;
+  }
+  final String? contactPerson = jsonConvert.convert<String>(json['contact_person']);
+  if (contactPerson != null) {
+    contractTableRows.contactPerson = contactPerson;
+  }
+  final String? startDate = jsonConvert.convert<String>(json['start_date']);
+  if (startDate != null) {
+    contractTableRows.startDate = startDate;
+  }
+  final String? endDate = jsonConvert.convert<String>(json['end_date']);
+  if (endDate != null) {
+    contractTableRows.endDate = endDate;
+  }
+  final String? file = jsonConvert.convert<String>(json['file']);
+  if (file != null) {
+    contractTableRows.file = file;
+  }
+  final int? positionNum = jsonConvert.convert<int>(json['position_num']);
+  if (positionNum != null) {
+    contractTableRows.positionNum = positionNum;
+  }
+  final int? status = jsonConvert.convert<int>(json['status']);
+  if (status != null) {
+    contractTableRows.status = status;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    contractTableRows.createdAt = createdAt;
+  }
+  return contractTableRows;
+}
+
+Map<String, dynamic> $ContractTableRowsToJson(ContractTableRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['agency_name'] = entity.agencyName;
+  data['uen_no'] = entity.uenNo;
+  data['contact_person'] = entity.contactPerson;
+  data['start_date'] = entity.startDate;
+  data['end_date'] = entity.endDate;
+  data['file'] = entity.file;
+  data['position_num'] = entity.positionNum;
+  data['status'] = entity.status;
+  data['created_at'] = entity.createdAt;
+  return data;
+}
+
+extension ContractTableRowsExtension on ContractTableRows {
+  ContractTableRows copyWith({
+    String? id,
+    String? agencyName,
+    String? uenNo,
+    String? contactPerson,
+    String? startDate,
+    String? endDate,
+    String? file,
+    int? positionNum,
+    int? status,
+    String? createdAt,
+  }) {
+    return ContractTableRows()
+      ..id = id ?? this.id
+      ..agencyName = agencyName ?? this.agencyName
+      ..uenNo = uenNo ?? this.uenNo
+      ..contactPerson = contactPerson ?? this.contactPerson
+      ..startDate = startDate ?? this.startDate
+      ..endDate = endDate ?? this.endDate
+      ..file = file ?? this.file
+      ..positionNum = positionNum ?? this.positionNum
+      ..status = status ?? this.status
+      ..createdAt = createdAt ?? this.createdAt;
+  }
+}

+ 179 - 3
packages/cs_domain/lib/repository/sg_agency_repository.dart

@@ -1,6 +1,9 @@
 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/contract_detail_entity.dart';
+import 'package:domain/entity/response/contract_option_entity.dart';
+import 'package:domain/entity/response/contract_table_entity.dart';
 import 'package:domain/entity/response/hotel_info_entity.dart';
 import 'package:domain/entity/response/position_table_entity.dart';
 import 'package:get/get.dart';
@@ -71,8 +74,7 @@ class SGAgencyRepository extends GetxService {
   }
 
   /// 删除中介
-  Future<HttpResult> deleteAgencySubmit(
-    String? pivotId, {
+  Future<HttpResult> deleteAgencySubmit(String? pivotId, {
     CancelToken? cancelToken,
   }) async {
     //参数
@@ -245,7 +247,6 @@ class SGAgencyRepository extends GetxService {
       return result.convert<PositionTableEntity>(data: data);
     }
     return result.convert();
-
   }
 
   /// 添加职位
@@ -325,4 +326,179 @@ class SGAgencyRepository extends GetxService {
     return result.convert();
   }
 
+  /// 获取中介合同列表选项
+  Future<HttpResult<ContractOptionEntity>> fetchContractOption({
+    CancelToken? cancelToken,
+  }) async {
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractOption,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = ContractOptionEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<ContractOptionEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取中介合同列表Table
+  Future<HttpResult<ContractTableEntity>> fetchContractTable({
+    required int curPage,
+    String? agencyId,
+    String? status,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "10";
+
+    if (Utils.isNotEmpty(agencyId)) {
+      params["agency_id"] = agencyId!;
+    }
+    if (Utils.isNotEmpty(status)) {
+      params["status"] = status!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractTable,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = ContractTableEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<ContractTableEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取中介的合同添加详情
+  Future<HttpResult<ContractDetailEntity>> fetchContractAddOption({
+    CancelToken? cancelToken,
+  }) async {
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractAddOption,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = ContractDetailEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<ContractDetailEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取中介的合同编辑详情
+  Future<HttpResult<ContractDetailEntity>> fetchContractEditDetail({
+    required String? contractId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["contract_id"] = contractId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractDetail,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = ContractDetailEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<ContractDetailEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 添加合同
+  Future<HttpResult> addContractSubmit({
+    required String? agencyId,
+    required String? startDate,
+    required String? endDate,
+    List<String>? paths,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['agency_id'] = agencyId ?? "";
+    params['start_date'] = startDate ?? "";
+    params['end_date'] = endDate ?? "";
+
+    //文件
+    Map<String,String> fileParams = {};
+    if (paths != null && paths.isNotEmpty) {
+      fileParams['file'] = paths[0];
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractAddSubmit,
+      method: HttpMethod.POST,
+      params: params,
+      paths: fileParams,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 编辑合同
+  Future<HttpResult> editContractSubmit({
+    required String? contractId,
+    required String? agencyId,
+    required String? startDate,
+    required String? endDate,
+    List<String>? paths,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['contract_id'] = contractId ?? "";
+    params['agency_id'] = agencyId ?? "";
+    params['start_date'] = startDate ?? "";
+    params['end_date'] = endDate ?? "";
+
+    //文件
+    Map<String,String> fileParams = {};
+    if (paths != null && paths.isNotEmpty) {
+      fileParams['file'] = paths[0];
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractEditSubmit,
+      method: HttpMethod.POST,
+      params: params,
+      paths: fileParams,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
 }

+ 2 - 2
packages/cs_plugin_platform/lib/engine/network/network_engine.dart

@@ -88,7 +88,7 @@ class NetworkEngine {
         map.addAll(params);
       }
 
-      //Flie文件
+      //File 文件
       if (paths != null && paths.isNotEmpty) {
         for (final entry in paths.entries) {
           final key = entry.key;
@@ -111,7 +111,7 @@ class NetworkEngine {
         }
       }
 
-      //File文件流
+      //File 文件流
       if (pathStreams != null && pathStreams.isNotEmpty) {
         for (final entry in pathStreams.entries) {
           final key = entry.key;

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

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

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

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