Переглянути джерело

中介模块的其他页面与接口完善

liukai 1 тиждень тому
батько
коміт
2dae78316b
33 змінених файлів з 1850 додано та 410 видалено
  1. 22 22
      packages/cpt_sg/lib/modules/agency/agency_list/agency_list_controller.dart
  2. 27 23
      packages/cpt_sg/lib/modules/agency/contract_list/contract_list_controller.dart
  3. 11 11
      packages/cpt_sg/lib/modules/agency/contract_rate_edit_list/contract_rate_edit_item.dart
  4. 68 28
      packages/cpt_sg/lib/modules/agency/contract_rate_edit_list/contract_rate_edit_list_controller.dart
  5. 9 4
      packages/cpt_sg/lib/modules/agency/contract_rate_edit_list/contract_rate_edit_list_page.dart
  6. 6 3
      packages/cpt_sg/lib/modules/agency/contract_rate_edit_list/contract_rate_edit_list_state.dart
  7. 8 8
      packages/cpt_sg/lib/modules/agency/contract_rate_list/contract_rate_item.dart
  8. 74 23
      packages/cpt_sg/lib/modules/agency/contract_rate_list/contract_rate_list_controller.dart
  9. 15 3
      packages/cpt_sg/lib/modules/agency/contract_rate_list/contract_rate_list_page.dart
  10. 7 2
      packages/cpt_sg/lib/modules/agency/contract_rate_list/contract_rate_list_state.dart
  11. 169 124
      packages/cpt_sg/lib/modules/agency/contract_rate_setting/contract_rate_setting_controller.dart
  12. 14 8
      packages/cpt_sg/lib/modules/agency/contract_rate_setting/contract_rate_setting_page.dart
  13. 12 4
      packages/cpt_sg/lib/modules/agency/contract_rate_setting/contract_rate_setting_state.dart
  14. 68 111
      packages/cpt_sg/lib/modules/agency/contract_rate_specific_day/contract_rate_specific_controller.dart
  15. 7 3
      packages/cpt_sg/lib/modules/agency/contract_rate_specific_day/contract_rate_specific_page.dart
  16. 5 0
      packages/cpt_sg/lib/modules/agency/contract_rate_specific_day/contract_rate_specific_state.dart
  17. 25 23
      packages/cpt_sg/lib/modules/agency/position_list/position_list_controller.dart
  18. 33 0
      packages/cs_domain/lib/constants/api_constants.dart
  19. 30 0
      packages/cs_domain/lib/entity/response/contract_position_add_option_entity.dart
  20. 27 0
      packages/cs_domain/lib/entity/response/contract_position_option_entity.dart
  21. 50 0
      packages/cs_domain/lib/entity/response/contract_position_rate_detail_entity.dart
  22. 26 0
      packages/cs_domain/lib/entity/response/contract_position_rate_specific_option_entity.dart
  23. 47 0
      packages/cs_domain/lib/entity/response/contract_position_rate_table_entity.dart
  24. 47 0
      packages/cs_domain/lib/entity/response/contract_position_table_entity.dart
  25. 38 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  26. 57 0
      packages/cs_domain/lib/generated/json/contract_position_add_option_entity.g.dart
  27. 47 0
      packages/cs_domain/lib/generated/json/contract_position_option_entity.g.dart
  28. 131 0
      packages/cs_domain/lib/generated/json/contract_position_rate_detail_entity.g.dart
  29. 47 0
      packages/cs_domain/lib/generated/json/contract_position_rate_specific_option_entity.g.dart
  30. 100 0
      packages/cs_domain/lib/generated/json/contract_position_rate_table_entity.g.dart
  31. 100 0
      packages/cs_domain/lib/generated/json/contract_position_table_entity.g.dart
  32. 517 4
      packages/cs_domain/lib/repository/sg_agency_repository.dart
  33. 6 6
      packages/cs_resources/lib/local/language/zh_CN.dart

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

@@ -152,28 +152,28 @@ 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);
-    // }
+  void fetchItemByIdAndRefreshItem(String id) async {
+    var result = await _agencyRepository.fetchAgencyTableByIds(
+      id,
+      cancelToken: cancelToken,
+    );
+
+    //处理数据
+    if (result.isSuccess) {
+      var data = result.data;
+      if (data != null && data.rows.isNotEmpty) {
+        final requestItem = data.rows[0];  //只找第一个
+
+        //找到当前数据中的此 requestId,并替换对象,再刷新
+        var index = state.datas.indexWhere((element) => element.pivotId == requestItem.pivotId);
+        if (index >= 0) {
+          state.datas[index] = requestItem;
+          update();
+        }
+      }
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
   }
 
   @override

+ 27 - 23
packages/cpt_sg/lib/modules/agency/contract_list/contract_list_controller.dart

@@ -141,28 +141,28 @@ 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);
-    // }
+  void fetchItemByIdAndRefreshItem(String? id) async {
+    var result = await _agencyRepository.fetchContractTableByIds(
+      id,
+      cancelToken: cancelToken,
+    );
+
+    //处理数据
+    if (result.isSuccess) {
+      var data = result.data;
+      if (data != null && data.rows.isNotEmpty) {
+        final requestItem = data.rows[0];
+
+        //找到当前数据中的此 requestId,并替换对象,再刷新
+        var index = state.datas.indexWhere((element) => element.id == requestItem.id);
+        if (index >= 0) {
+          state.datas[index] = requestItem;
+          update();
+        }
+      }
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
   }
 
   @override
@@ -188,7 +188,11 @@ class ContractListController extends GetxController with DioCancelableMixin {
 
   //去详情页面
   void gotoDetailPage(ContractTableRows data) {
-    SGContractRateListPage.startInstance();
+    SGContractRateListPage.startInstance(data.id, (result) {
+      if (result != null){
+        fetchItemByIdAndRefreshItem(data.id);
+      }
+    });
   }
 
   //去编辑页面

+ 11 - 11
packages/cpt_sg/lib/modules/agency/contract_rate_edit_list/contract_rate_edit_item.dart

@@ -1,5 +1,5 @@
 import 'package:cs_resources/constants/color_constants.dart';
-import 'package:domain/entity/response/labour_request_s_g_list_entity.dart';
+import 'package:domain/entity/response/contract_position_rate_table_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
@@ -13,7 +13,7 @@ import 'package:widgets/my_text_view.dart';
  */
 class ContractRateEditItem extends StatelessWidget {
   final int index;
-  final LabourRequestSGListRows item;
+  final ContractPositionRateTableRows item;
   final VoidCallback? onEditAction;
   final VoidCallback? onDeleteAction;
 
@@ -52,7 +52,7 @@ class ContractRateEditItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.jobTitle ?? "-",
+                item.agencyName ?? "-",
                 marginLeft: 5,
                 isFontMedium: true,
                 textColor: ColorConstants.textYellowFFBB1B,
@@ -81,7 +81,7 @@ class ContractRateEditItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.outletName ?? "-",
+                item.position ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -104,7 +104,7 @@ class ContractRateEditItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.createdAt ?? "-",
+                item.specialShow ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -127,7 +127,7 @@ class ContractRateEditItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.needNum.toString(),
+                item.amount.toString(),
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -165,7 +165,7 @@ class ContractRateEditItem extends StatelessWidget {
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
               MyTextView(
-               "Updated At:".tr,
+               "${"Updated At".tr}:",
                 isFontRegular: true,
                 textColor: ColorConstants.textGrayAECAE5,
                 fontSize: 14,
@@ -173,7 +173,7 @@ class ContractRateEditItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.createdAt.toString(),
+                item.updatedAt.toString(),
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -184,7 +184,7 @@ class ContractRateEditItem extends StatelessWidget {
 
           //按钮组
           Visibility(
-            visible: item.actionList.isNotEmpty,
+            visible: true,
             child: Row(
               mainAxisSize: MainAxisSize.max,
               mainAxisAlignment: MainAxisAlignment.end,
@@ -193,7 +193,7 @@ class ContractRateEditItem extends StatelessWidget {
 
                 //Edit按钮
                 Visibility(
-                  visible: item.actionList.contains("edit"),
+                  visible: true,
                   child: MyButton(
                     onPressed: () {
                       FocusScope.of(context).unfocus();
@@ -210,7 +210,7 @@ class ContractRateEditItem extends StatelessWidget {
 
                 //Delete按钮
                 Visibility(
-                  visible: item.actionList.contains("delete"),
+                  visible: true,
                   child: MyButton(
                     onPressed: () {
                       FocusScope.of(context).unfocus();

+ 68 - 28
packages/cpt_sg/lib/modules/agency/contract_rate_edit_list/contract_rate_edit_list_controller.dart

@@ -1,5 +1,6 @@
+import 'package:domain/entity/response/contract_position_rate_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/repository/sg_agency_repository.dart';
 import 'package:get/get.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:plugin_platform/engine/notify/notify_engine.dart';
@@ -15,7 +16,7 @@ import 'contract_rate_edit_list_state.dart';
 import 'dialog/dialog_edit_rate.dart';
 
 class ContractRateEditListController extends GetxController with DioCancelableMixin {
-  final LabourSGRepository _labourRepository = Get.find();
+  final SGAgencyRepository _agencyRepository = Get.find();
   final ContractRateEditListState state = ContractRateEditListState();
 
   var _curPage = 1;
@@ -64,13 +65,10 @@ class ContractRateEditListController extends GetxController with DioCancelableMi
 
     // 并发执行两个请求
 
-    var listResult = await _labourRepository.fetchLabourRequestSGList(
-      "",
-      "",
-      "",
-      "",
-      "",
+    var listResult = await _agencyRepository.fetchContractPositionRateTable(
       curPage: _curPage,
+      contractId: state.contractId,
+      positionId: state.positionId,
       cancelToken: cancelToken,
     );
 
@@ -87,7 +85,7 @@ class ContractRateEditListController extends GetxController with DioCancelableMi
   }
 
   // 处理数据与展示的逻辑
-  void handleList(List<LabourRequestSGListRows>? list) {
+  void handleList(List<ContractPositionRateTableRows>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (_curPage == 1) {
@@ -117,7 +115,6 @@ class ContractRateEditListController extends GetxController with DioCancelableMi
     }
   }
 
-
   @override
   void onReady() {
     super.onReady();
@@ -126,52 +123,56 @@ class ContractRateEditListController extends GetxController with DioCancelableMi
 
   @override
   void onClose() {
+    state.cb?.call(state.positionId); //只要是进入当前页面,关闭的时候都刷新上一个页面
     state.datas.clear();
     super.onClose();
   }
 
   //去详情页面
   void gotoSettingPage() {
-    ContractRateSettingPage.startInstance("123", (result) {
-
+    ContractRateSettingPage.startInstance(state.contractId, state.positionId, (result) {
+      if (result != null) {
+        refreshController.callRefresh();
+      }
     });
   }
 
   //去设置特殊的日期
   void gotoAddSpecificPage() {
-    SGContractRateSpecificPage.startInstance((result){
-
+    SGContractRateSpecificPage.startInstance(state.contractId, state.positionId, (result) {
+      if (result != null) {
+        refreshController.callRefresh();
+      }
     });
   }
 
   /// 展示这个日期的编辑弹窗
-  void showEditDialog(LabourRequestSGListRows data) {
-
+  void showEditDialog(ContractPositionRateTableRows data) {
     DialogEngine.show(
       widget: EditRateDialog(
-        rate:"10",
+        rate: data.amount,
         confirmAction: (rate) {
-         ToastEngine.show("输入的时薪为:$rate");
+          _requestAmountModify(data.id, rate);
         },
       ),
     );
-
   }
 
   /// 删除的确认弹窗
-  void showDeleteDialog(LabourRequestSGListRows data,int index) {
+  void showDeleteDialog(ContractPositionRateTableRows data, int index) {
     DialogEngine.show(
         widget: AppDefaultDialog(
-          title: "Confirmation".tr,
-          message: "Are you sure you want to delete this Rate?".tr,
-          confirmAction: () {
-            _submitDeleteRequest(data.requestId.toString(),index);
-          },
-        ));
+      title: "Confirmation".tr,
+      message: "Are you sure you want to delete this Rate?".tr,
+      confirmAction: () {
+        _submitDeleteRequest(data.id, index);
+      },
+    ));
   }
 
-  void _submitDeleteRequest(String? requestId, int index) async {
-    var result = await _labourRepository.deleteLabourRequestSG(requestId, cancelToken: cancelToken);
+  // 执行删除的网络请求
+  void _submitDeleteRequest(String? id, int index) async {
+    var result = await _agencyRepository.deleteContractPositionRate(rateId: id, cancelToken: cancelToken);
 
     if (result.isSuccess) {
       NotifyEngine.showSuccess("Successful".tr);
@@ -187,4 +188,43 @@ class ContractRateEditListController extends GetxController with DioCancelableMi
     }
   }
 
+  // 执行更新金额的请求
+  void _requestAmountModify(String? rateId, String? rate) async {
+    var result = await _agencyRepository.editContractPositionRateAmountEdit(rateId: rateId, amount: rate, cancelToken: cancelToken);
+
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+      fetchItemByIdAndRefreshItem(rateId);
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
+  /// 根据ID获取Item对象,用于刷新
+  void fetchItemByIdAndRefreshItem(String? id) async {
+    var result = await _agencyRepository.fetchContractPositionRateTable(
+      curPage: 1,
+      contractId: state.contractId,
+      positionId: state.positionId,
+      rateId: id,
+      cancelToken: cancelToken,
+    );
+
+    //处理数据
+    if (result.isSuccess) {
+      var data = result.data;
+      if (data != null && data.rows.isNotEmpty) {
+        final requestItem = data.rows[0]; //只找第一个
+
+        //找到当前数据中的此 requestId,并替换对象,再刷新
+        var index = state.datas.indexWhere((element) => element.id == requestItem.id);
+        if (index >= 0) {
+          state.datas[index] = requestItem;
+          update();
+        }
+      }
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
 }

+ 9 - 4
packages/cpt_sg/lib/modules/agency/contract_rate_edit_list/contract_rate_edit_list_page.dart

@@ -11,8 +11,6 @@ import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_button.dart';
-import 'package:widgets/my_load_image.dart';
-import 'package:widgets/my_text_view.dart';
 import 'package:widgets/widget_export.dart';
 
 import 'contract_rate_edit_item.dart';
@@ -27,8 +25,12 @@ class SGContractRateEditListPage extends BaseStatefulPage<ContractRateEditListCo
   SGContractRateEditListPage({Key? key}) : super(key: key);
 
   //启动当前页面
-  static void startInstance() {
-    return Get.start(RouterPath.SGContractRateDayEdit);
+  static void startInstance(
+      String? contractId,
+      String? positionId,
+      void Function(dynamic value)? cb,
+      ) {
+    return Get.start(RouterPath.SGContractRateDayEdit, arguments: {'contractId': contractId, 'positionId': positionId, 'cb': cb});
   }
 
   @override
@@ -47,6 +49,9 @@ class _LabourRequestListState extends BaseState<SGContractRateEditListPage, Cont
   void initState() {
     super.initState();
     state = controller.state;
+    state.contractId = Get.arguments['contractId'];
+    state.positionId = Get.arguments['positionId'];
+    state.cb = Get.arguments['cb'] as void Function(dynamic)?;
   }
 
   @override

+ 6 - 3
packages/cpt_sg/lib/modules/agency/contract_rate_edit_list/contract_rate_edit_list_state.dart

@@ -1,8 +1,11 @@
-import 'package:domain/entity/response/labour_request_s_g_list_entity.dart';
+import 'package:domain/entity/response/contract_position_rate_table_entity.dart';
 
 class ContractRateEditListState {
 
-  //页面的列表数据
-  List<LabourRequestSGListRows> datas = [];
+  String? positionId;
+  String? contractId;
+  void Function(dynamic value)? cb;
 
+  //页面的列表数据
+  List<ContractPositionRateTableRows> datas = [];
 }

+ 8 - 8
packages/cpt_sg/lib/modules/agency/contract_rate_list/contract_rate_item.dart

@@ -1,5 +1,5 @@
 import 'package:cs_resources/constants/color_constants.dart';
-import 'package:domain/entity/response/labour_request_s_g_list_entity.dart';
+import 'package:domain/entity/response/contract_position_table_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
@@ -13,7 +13,7 @@ import 'package:widgets/my_text_view.dart';
  */
 class ContractRateItem extends StatelessWidget {
   final int index;
-  final LabourRequestSGListRows item;
+  final ContractPositionTableRows item;
   final VoidCallback? onEditAction;
 
   ContractRateItem({
@@ -50,7 +50,7 @@ class ContractRateItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.jobTitle ?? "-",
+                item.agencyName ?? "-",
                 marginLeft: 5,
                 isFontMedium: true,
                 textColor: ColorConstants.textYellowFFBB1B,
@@ -79,7 +79,7 @@ class ContractRateItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.outletName ?? "-",
+                item.position ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -102,7 +102,7 @@ class ContractRateItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.needNum.toString(),
+                item.hourlyRate.toString(),
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -125,7 +125,7 @@ class ContractRateItem extends StatelessWidget {
 
               //文本
               MyTextView(
-                item.createdAt.toString(),
+                item.contract.toString(),
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -160,7 +160,7 @@ class ContractRateItem extends StatelessWidget {
 
           //按钮组
           Visibility(
-            visible: item.actionList.isNotEmpty,
+            visible: true,
             child: Row(
               mainAxisSize: MainAxisSize.max,
               mainAxisAlignment: MainAxisAlignment.end,
@@ -169,7 +169,7 @@ class ContractRateItem extends StatelessWidget {
 
                 //Edit按钮
                 Visibility(
-                  visible: item.actionList.contains("edit"),
+                  visible: true,
                   child: MyButton(
                     onPressed: () {
                       FocusScope.of(context).unfocus();

+ 74 - 23
packages/cpt_sg/lib/modules/agency/contract_rate_list/contract_rate_list_controller.dart

@@ -1,7 +1,10 @@
-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/contract_position_option_entity.dart';
+import 'package:domain/entity/response/contract_position_table_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/widget_export.dart';
 
@@ -10,7 +13,7 @@ import '../contract_rate_setting/contract_rate_setting_page.dart';
 import 'contract_rate_list_state.dart';
 
 class ContractRateListController extends GetxController with DioCancelableMixin {
-  final LabourSGRepository _labourRepository = Get.find();
+  final SGAgencyRepository _agencyRepository = Get.find();
   final ContractRateListState state = ContractRateListState();
 
   var _curPage = 1;
@@ -35,39 +38,52 @@ class ContractRateListController 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 listResult = await _labourRepository.fetchLabourRequestSGList(
-      "",
-      "",
-      "",
-      "",
-      "",
-      curPage: _curPage,
-      cancelToken: cancelToken,
-    );
+    var futures = [
+      _agencyRepository.fetchContractPositionTable(
+        curPage: _curPage,
+        contractId: state.contractId,
+        cancelToken: cancelToken,
+      ),
+      state.indexOptions == null
+          ? _agencyRepository.fetchContractPositionOption(
+              contractId: state.contractId,
+              cancelToken: cancelToken,
+            )
+          : Future(() => HttpResult(isSuccess: true).convert(data: state.indexOptions!)),
+    ];
+
+    //拿到结果
+    var results = await Future.wait(futures);
+    var listResult = results[0] as HttpResult<ContractPositionTableEntity>;
+    var optionResult = results[1] as HttpResult<ContractPositionOptionEntity>;
+
+    //选项数据
+    if (state.indexOptions == null && optionResult.isSuccess) {
+      state.indexOptions = optionResult.data!;
+    }
 
     // 处理数据
     if (listResult.isSuccess) {
@@ -82,7 +98,7 @@ class ContractRateListController extends GetxController with DioCancelableMixin
   }
 
   // 处理数据与展示的逻辑
-  void handleList(List<LabourRequestSGListRows>? list) {
+  void handleList(List<ContractPositionTableRows>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (_curPage == 1) {
@@ -115,24 +131,59 @@ class ContractRateListController extends GetxController with DioCancelableMixin
   @override
   void onReady() {
     super.onReady();
-    fetchLabourRequestList();
+    fetchTableList();
   }
 
   @override
   void onClose() {
+    state.cb?.call(state.contractId);
     state.datas.clear();
     super.onClose();
   }
 
   //去详情页面
   void gotoAddPage() {
-    ContractRateSettingPage.startInstance("", (result){
-
+    ContractRateSettingPage.startInstance(state.contractId, null, (result) {
+      if (result != null) {
+        refreshController.callRefresh();
+      }
     });
   }
 
   //去编辑页面
-  void gotoEditPage(LabourRequestSGListRows data) {
-    SGContractRateEditListPage.startInstance();
+  void gotoEditPage(ContractPositionTableRows data) {
+    SGContractRateEditListPage.startInstance(state.contractId, data.positionId, (result) {
+      if (result != null) {
+        fetchItemByIdAndRefreshItem(data.positionId);
+      }
+    });
   }
+
+  /// 根据ID获取Item对象,用于刷新
+  void fetchItemByIdAndRefreshItem(String? id) async {
+    var result = await _agencyRepository.fetchContractPositionTable(
+      curPage: 1,
+      contractId: state.contractId,
+      positionId: id,
+      cancelToken: cancelToken,
+    );
+
+    //处理数据
+    if (result.isSuccess) {
+      var data = result.data;
+      if (data != null && data.rows.isNotEmpty) {
+        final requestItem = data.rows[0];  //只找第一个
+
+        //找到当前数据中的此 requestId,并替换对象,再刷新
+        var index = state.datas.indexWhere((element) => element.id == requestItem.id);
+        if (index >= 0) {
+          state.datas[index] = requestItem;
+          update();
+        }
+      }
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
 }

+ 15 - 3
packages/cpt_sg/lib/modules/agency/contract_rate_list/contract_rate_list_page.dart

@@ -26,8 +26,11 @@ class SGContractRateListPage extends BaseStatefulPage<ContractRateListController
   SGContractRateListPage({Key? key}) : super(key: key);
 
   //启动当前页面
-  static void startInstance() {
-    return Get.start(RouterPath.SGContractRateList);
+  static void startInstance(
+      String? contractId,
+      void Function(dynamic value)? cb,
+      ) {
+    return Get.start(RouterPath.SGContractRateList, arguments: {'contractId': contractId, 'cb': cb});
   }
 
   @override
@@ -46,6 +49,8 @@ class _LabourRequestListState extends BaseState<SGContractRateListPage, Contract
   void initState() {
     super.initState();
     state = controller.state;
+    state.contractId = Get.arguments['contractId'];
+    state.cb = Get.arguments['cb'] as void Function(dynamic)?;
   }
 
   @override
@@ -73,6 +78,14 @@ class _LabourRequestListState extends BaseState<SGContractRateListPage, Contract
             children: [
               MyAppBar.titleBar(context, "Contract Rate Management".tr),
 
+              MyTextView(
+                "${state.indexOptions?.agencyName ?? ""} ${state.indexOptions?.startDate ?? "-"} ~ ${state.indexOptions?.endDate ?? "-"}",
+                marginTop: 15,
+                fontSize: 16,
+                isFontMedium: true,
+                textColor: ColorConstants.white,
+              ),
+
               // 添加按钮
               MyButton(
                 type: ClickType.throttle,
@@ -110,7 +123,6 @@ class _LabourRequestListState extends BaseState<SGContractRateListPage, Contract
                           onEditAction: () {
                             controller.gotoEditPage(state.datas[index]);
                           },
-
                         );
                       },
                       childCount: state.datas.length,

+ 7 - 2
packages/cpt_sg/lib/modules/agency/contract_rate_list/contract_rate_list_state.dart

@@ -1,8 +1,13 @@
-import 'package:domain/entity/response/labour_request_s_g_list_entity.dart';
+import 'package:domain/entity/response/contract_position_option_entity.dart';
+import 'package:domain/entity/response/contract_position_table_entity.dart';
 
 class ContractRateListState {
 
+  String? contractId;
+  void Function(dynamic value)? cb;
+
   //页面的列表数据
-  List<LabourRequestSGListRows> datas = [];
+  List<ContractPositionTableRows> datas = [];
+  ContractPositionOptionEntity? indexOptions;
 
 }

+ 169 - 124
packages/cpt_sg/lib/modules/agency/contract_rate_setting/contract_rate_setting_controller.dart

@@ -1,132 +1,177 @@
 import 'package:domain/repository/labour_sg_repository.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/log_utils.dart';
 import 'package:shared/utils/util.dart';
 import 'package:widgets/picker/option_pick_util.dart';
 
 import 'contract_rate_setting_state.dart';
 
 class ContractRateSettingController extends GetxController with DioCancelableMixin {
-  final LabourSGRepository _labourRepository = Get.find();
+  final SGAgencyRepository _agencyRepository = Get.find();
   final ContractRateSettingState state = ContractRateSettingState();
 
   // 获取添加或者编辑的详情
   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);
-    // }
-
-    TextEditingController agencyController = state.formData['agency_name']!['controller'];
-    agencyController.text = "Hong Ye Group";
+    if (!state.isAddType) {
+      //编辑
+      final detailResult = await _agencyRepository.fetchContractPositionRateDetail(
+        contractId: state.contractId,
+        positionId: state.positionId,
+        cancelToken: cancelToken,
+      );
+
+      if (detailResult.isSuccess) {
+        state.editDetail = detailResult.data;
+
+        TextEditingController agencyNameController = state.formData['agency_name']!['controller'];
+        TextEditingController hourlyRateController = state.formData['hourly_rate']!['controller'];
+        TextEditingController weekdaysController = state.formData['weekdays']!['controller'];
+        TextEditingController weekendsController = state.formData['weekends']!['controller'];
+        TextEditingController sundayController = state.formData['sunday']!['controller'];
+        TextEditingController mondayController = state.formData['monday']!['controller'];
+        TextEditingController tuesdayController = state.formData['tuesday']!['controller'];
+        TextEditingController wednesdayController = state.formData['wednesday']!['controller'];
+        TextEditingController thursdayController = state.formData['thursday']!['controller'];
+        TextEditingController fridayController = state.formData['friday']!['controller'];
+        TextEditingController saturdayController = state.formData['saturday']!['controller'];
+        TextEditingController eveOfPHDayController = state.formData['eve_of_ph_day']!['controller'];
+        TextEditingController phDaysController = state.formData['ph_days']!['controller'];
+
+        agencyNameController.text = state.editDetail?.agencyName ?? "";
+        state.positionId = state.editDetail?.positionId ?? "";
+        state.positionName = state.editDetail?.position ?? "";
+        hourlyRateController.text = state.editDetail?.type1 ?? "";
+        weekdaysController.text = state.editDetail?.type2 ?? "";
+        weekendsController.text = state.editDetail?.type3 ?? "";
+        sundayController.text = state.editDetail?.type7 ?? "";
+        mondayController.text = state.editDetail?.type8 ?? "";
+        tuesdayController.text = state.editDetail?.type9 ?? "";
+        wednesdayController.text = state.editDetail?.type10 ?? "";
+        thursdayController.text = state.editDetail?.type11 ?? "";
+        fridayController.text = state.editDetail?.type12 ?? "";
+        saturdayController.text = state.editDetail?.type13 ?? "";
+        eveOfPHDayController.text = state.editDetail?.type20 ?? "";
+        phDaysController.text = state.editDetail?.type21 ?? "";
+      } else {
+        ToastEngine.show(detailResult.errorMsg ?? "");
+      }
+    } else {
+      //新增
+      final optionResult = await _agencyRepository.fetchContractPositionAddOption(
+        contractId: state.contractId,
+        cancelToken: cancelToken,
+      );
+
+      if (optionResult.isSuccess) {
+        state.addOption = optionResult.data;
+        state.positionList = optionResult.data?.positionList ?? [];
+
+        TextEditingController agencyNameController = state.formData['agency_name']!['controller'];
+        agencyNameController.text = state.addOption?.agencyName ?? "";
+      } else {
+        ToastEngine.show(optionResult.errorMsg ?? "");
+      }
+    }
+
+    update();
   }
 
   /// 提交
   void doSubmit() async {
-    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'];
-
-    String agencyName = agencyNameController.text.toString();
-    String acra = acraController.text.toString();
-    String personName = personController.text.toString();
-    String address = addressController.text.toString();
-    String email = emailController.text.toString();
-    String phone = phoneController.text.toString();
-
-    // //校验必填项
-    // if (Utils.isEmpty(agencyName)) {
-    //   ToastEngine.show("Enter Agency Name".tr);
-    //   return;
-    // }
-    //
-    // if (Utils.isEmpty(acra)) {
-    //   ToastEngine.show("Enter ACRA NO".tr);
-    //   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);
-    // }
+    var hourlyRateController = state.formData['hourly_rate']!['controller'];
+    var weekdaysController = state.formData['weekdays']!['controller'];
+    var weekendsController = state.formData['weekends']!['controller'];
+    var mondayController = state.formData['monday']!['controller'];
+    var tuesdayController = state.formData['tuesday']!['controller'];
+    var wednesdayController = state.formData['wednesday']!['controller'];
+    var thursdayController = state.formData['thursday']!['controller'];
+    var fridayController = state.formData['friday']!['controller'];
+    var saturdayController = state.formData['saturday']!['controller'];
+    var sundayController = state.formData['sunday']!['controller'];
+    var eveOfPHDayController = state.formData['eve_of_ph_day']!['controller'];
+    var phDaysController = state.formData['ph_days']!['controller'];
+
+    String hourlyRate = hourlyRateController.text.toString();
+    String weekdays = weekdaysController.text.toString();
+    String weekends = weekendsController.text.toString();
+    String sunday = sundayController.text.toString();
+    String monday = mondayController.text.toString();
+    String tuesday = tuesdayController.text.toString();
+    String wednesday = wednesdayController.text.toString();
+    String thursday = thursdayController.text.toString();
+    String friday = fridayController.text.toString();
+    String saturday = saturdayController.text.toString();
+    String eveOfPHDay = eveOfPHDayController.text.toString();
+    String phDays = phDaysController.text.toString();
+
+    if (Utils.isEmpty(state.positionId)) {
+      ToastEngine.show("Select Position".tr);
+      return;
+    }
+
+    if (Utils.isEmpty(hourlyRate)) {
+      ToastEngine.show("Enter Hourly Rate".tr);
+      return;
+    }
+
+    Future<HttpResult> taskFuture;
+    if (!state.isAddType) {
+      taskFuture = _agencyRepository.editContractPositionRateSubmit(
+        contractId: state.contractId,
+        positionId: state.positionId,
+        type_1: hourlyRate,
+        type_2: weekdays,
+        type_3: weekends,
+        type_7: sunday,
+        type_8: monday,
+        type_9: tuesday,
+        type_10: wednesday,
+        type_11: thursday,
+        type_12: friday,
+        type_13: saturday,
+        type_20: eveOfPHDay,
+        type_21: phDays,
+        cancelToken: cancelToken,
+      );
+    } else {
+      taskFuture = _agencyRepository.addContractPositionSubmit(
+        contractId: state.contractId,
+        positionId: state.positionId,
+        type_1: hourlyRate,
+        type_2: weekdays,
+        type_3: weekends,
+        type_7: sunday,
+        type_8: monday,
+        type_9: tuesday,
+        type_10: wednesday,
+        type_11: thursday,
+        type_12: friday,
+        type_13: saturday,
+        type_20: eveOfPHDay,
+        type_21: phDays,
+        cancelToken: cancelToken,
+      );
+    }
+
+    var result = await taskFuture;
+
+    //处理数据
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      //根据类型刷新
+      state.cb?.call(state.positionId);
+
+      Get.back();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
   }
 
   @override
@@ -137,23 +182,23 @@ class ContractRateSettingController extends GetxController with DioCancelableMix
 
   // 选择职位
   void pickPosition() {
-    // 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;
-    // }
+    int selectedIndex;
+    if (state.positionId == null) {
+      selectedIndex = 0;
+    } else {
+      selectedIndex = state.positionList.indexWhere((department) => department.value.toString() == state.positionId);
+    }
+
+    if (selectedIndex < 0) {
+      selectedIndex = 0;
+    }
 
     OptionPickerUtil.showCupertinoOptionPicker(
-      items: state.positionList,
-      initialSelectIndex: 0,
+      items: state.positionList.map((e) => e.txt!).toList(growable: false),
+      initialSelectIndex: selectedIndex,
       onPickerChanged: (_, index) {
-        state.selectedPosition = state.positionList[index];
-        state.selectedPositionId = index.toString();
+        state.positionName = state.positionList[index].txt;
+        state.positionId = state.positionList[index].value;
         update();
       },
     );

+ 14 - 8
packages/cpt_sg/lib/modules/agency/contract_rate_setting/contract_rate_setting_page.dart

@@ -2,6 +2,7 @@ import 'package:cs_resources/constants/color_constants.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/screen_util.dart';
 import 'package:shared/utils/util.dart';
 import 'package:widgets/ext/ex_widget.dart';
@@ -29,10 +30,11 @@ class ContractRateSettingPage extends BaseStatelessPage<ContractRateSettingContr
 
   //启动当前页面
   static void startInstance(
-    String agentId,
+    String? contractId,
+    String? positionId,
     void Function(dynamic value)? cb,
   ) {
-    return Get.start(RouterPath.SGContractRateSetting, arguments: {'agentId': agentId, 'cb': cb});
+    return Get.start(RouterPath.SGContractRateSetting, arguments: {'contractId': contractId, 'positionId': positionId, 'cb': cb});
   }
 
   late ContractRateSettingState state;
@@ -40,7 +42,9 @@ class ContractRateSettingPage extends BaseStatelessPage<ContractRateSettingContr
   @override
   void initState() {
     state = controller.state;
-    state.agentId = Get.arguments['agentId'];
+    state.contractId = Get.arguments['contractId'];
+    state.positionId = Get.arguments['positionId'];
+    state.isAddType = Utils.isEmpty(state.positionId);
     state.cb = Get.arguments['cb'] as void Function(dynamic)?;
   }
 
@@ -54,7 +58,7 @@ class ContractRateSettingPage extends BaseStatelessPage<ContractRateSettingContr
     return autoCtlGetBuilder(builder: (controller) {
       return Scaffold(
         extendBodyBehindAppBar: true,
-        appBar: MyAppBar.appBar(context, Utils.isEmpty(state.agentId) ? "Add New".tr : "Edit".tr),
+        appBar: MyAppBar.appBar(context, state.isAddType ? "Add New".tr : "Edit".tr),
         body: SafeArea(
           bottom: true,
           top: false,
@@ -115,7 +119,7 @@ class ContractRateSettingPage extends BaseStatelessPage<ContractRateSettingContr
                         margin: const EdgeInsets.only(top: 5, left: 15, right: 15),
                         height: 45,
                         decoration: BoxDecoration(
-                          color: const Color(0xFF4DCFF6).withOpacity(0.2),
+                          color: const Color(0xFF4DCFF6).withOpacity(state.isAddType ? 0.2 : 0.5),
                           borderRadius: const BorderRadius.all(Radius.circular(5)),
                         ),
                         child: Row(
@@ -124,7 +128,7 @@ class ContractRateSettingPage extends BaseStatelessPage<ContractRateSettingContr
                           mainAxisAlignment: MainAxisAlignment.start,
                           children: [
                             MyTextView(
-                              state.selectedPosition ?? "",
+                              state.positionName ?? "",
                               fontSize: 14,
                               hint: "Choose Position".tr,
                               textHintColor: ColorConstants.textGrayAECAE5,
@@ -137,8 +141,10 @@ class ContractRateSettingPage extends BaseStatelessPage<ContractRateSettingContr
                           ],
                         ),
                       ).onTap(() {
-                        FocusScope.of(context).unfocus();
-                        controller.pickPosition();
+                        if (state.positionList.isNotEmpty) {
+                          FocusScope.of(context).unfocus();
+                          controller.pickPosition();
+                        }
                       }),
 
                       //必填 - 默认时薪

+ 12 - 4
packages/cpt_sg/lib/modules/agency/contract_rate_setting/contract_rate_setting_state.dart

@@ -1,3 +1,6 @@
+import 'package:domain/entity/response/contract_position_add_option_entity.dart';
+import 'package:domain/entity/response/contract_position_rate_detail_entity.dart';
+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';
@@ -98,11 +101,16 @@ class ContractRateSettingState {
     },
   };
 
-  List<String> positionList = ["瓜豆1", "瓜豆2", "瓜豆3"];
-  String? selectedPosition;
-  String? selectedPositionId;
+  List<IndexOptionEntity> positionList = [];
+  String? positionName;
+  String? positionId;
+  String? contractId;
+  bool isAddType = false;  //是添加状态还是编辑状态
 
-  String? agentId;
+  //添加状态下的详情
+  ContractPositionAddOptionEntity? addOption;
+  //编辑状态下的详情
+  ContractPositionRateDetailEntity? editDetail;
 
   void Function(dynamic value)? cb;
 

+ 68 - 111
packages/cpt_sg/lib/modules/agency/contract_rate_specific_day/contract_rate_specific_controller.dart

@@ -1,8 +1,11 @@
 import 'package:domain/repository/labour_sg_repository.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:shared/utils/date_time_utils.dart';
 import 'package:shared/utils/util.dart';
 import 'package:widgets/picker/date_picker_util.dart';
 import 'package:widgets/picker/option_pick_util.dart';
@@ -10,126 +13,80 @@ import 'package:widgets/picker/option_pick_util.dart';
 import 'contract_rate_specific_state.dart';
 
 class ContractRateSpecificController extends GetxController with DioCancelableMixin {
-  final LabourSGRepository _labourRepository = Get.find();
+  final SGAgencyRepository _agencyRepository = Get.find();
   final ContractRateSpecificState state = ContractRateSpecificState();
 
   // 获取添加或者编辑的详情
   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);
-    // }
+    final result = await _agencyRepository.fetchContractPositionRateSpecificOption(
+      contractId: state.contractId,
+      positionId: state.positionId,
+      cancelToken: cancelToken,
+    );
 
-    TextEditingController agencyController = state.formData['agency_name']!['controller'];
-    TextEditingController positionController = state.formData['position']!['controller'];
-    agencyController.text = "Hong Ye Group";
-    positionController.text = "Clean";
+    if (result.isSuccess) {
+      state.optionEntity = result.data;
+
+      TextEditingController agencyController = state.formData['agency_name']!['controller'];
+      TextEditingController positionController = state.formData['position']!['controller'];
+      agencyController.text = state.optionEntity?.agencyName ?? "";
+      positionController.text = state.optionEntity?.position ?? "";
+
+    } 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'];
-    var addressController = state.formData['address']!['controller'];
-    var emailController = state.formData['email']!['controller'];
-    var phoneController = state.formData['phone']!['controller'];
-
-    String agencyName = agencyNameController.text.toString();
-    String acra = acraController.text.toString();
-    String personName = personController.text.toString();
-    String address = addressController.text.toString();
-    String email = emailController.text.toString();
-    String phone = phoneController.text.toString();
-
-    // //校验必填项
-    // if (Utils.isEmpty(agencyName)) {
-    //   ToastEngine.show("Enter Agency Name".tr);
-    //   return;
-    // }
-    //
-    // if (Utils.isEmpty(acra)) {
-    //   ToastEngine.show("Enter ACRA NO".tr);
-    //   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);
-    // }
+    TextEditingController agencyController = state.formData['agency_name']!['controller'];
+    TextEditingController positionController = state.formData['position']!['controller'];
+    TextEditingController hourlyRateController = state.formData['hourly_rate']!['controller'];
+
+    String agencyName = agencyController.text.toString();
+    String position = positionController.text.toString();
+    String rate = hourlyRateController.text.toString();
+
+    //校验必填项
+    if (Utils.isEmpty(agencyName)) {
+      ToastEngine.show("Enter Agency Name".tr);
+      return;
+    }
+
+    if (Utils.isEmpty(position)) {
+      ToastEngine.show("Enter Position".tr);
+      return;
+    }
+
+    if(state.selectedDate == null){
+      ToastEngine.show("Please Select Date".tr);
+      return;
+    }
+
+    if (Utils.isEmpty(rate)) {
+      ToastEngine.show("Enter Hourly Rate".tr);
+      return;
+    }
+
+    final result = await _agencyRepository.addContractPositionRateSpecificSubmit(
+      contractId: state.contractId,
+      positionId: state.positionId,
+      day: DateTimeUtils.formatDate(state.selectedDate!,format: "yyyy-MM-dd"),
+      amount: rate,
+      cancelToken: cancelToken,
+    );
+
+    //处理数据
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      //根据类型刷新
+      state.cb?.call(state.positionId);
+
+      Get.back();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
   }
 
   @override

+ 7 - 3
packages/cpt_sg/lib/modules/agency/contract_rate_specific_day/contract_rate_specific_page.dart

@@ -29,9 +29,11 @@ class SGContractRateSpecificPage extends BaseStatelessPage<ContractRateSpecificC
 
   //启动当前页面
   static void startInstance(
-    void Function(dynamic value)? cb,
-  ) {
-    return Get.start(RouterPath.SGContractRateSpecificDay, arguments: {'cb': cb});
+      String? contractId,
+      String? positionId,
+      void Function(dynamic value)? cb,
+      ) {
+    return Get.start(RouterPath.SGContractRateSpecificDay, arguments: {'contractId': contractId, 'positionId': positionId, 'cb': cb});
   }
 
   late ContractRateSpecificState state;
@@ -39,6 +41,8 @@ class SGContractRateSpecificPage extends BaseStatelessPage<ContractRateSpecificC
   @override
   void initState() {
     state = controller.state;
+    state.contractId = Get.arguments['contractId'];
+    state.positionId = Get.arguments['positionId'];
     state.cb = Get.arguments['cb'] as void Function(dynamic)?;
   }
 

+ 5 - 0
packages/cpt_sg/lib/modules/agency/contract_rate_specific_day/contract_rate_specific_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/response/contract_position_rate_specific_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';
@@ -30,6 +31,10 @@ class ContractRateSpecificState {
 
   DateTime? selectedDate;
 
+  String? positionId;
+  String? contractId;
   void Function(dynamic value)? cb;
 
+  ContractPositionRateSpecificOptionEntity? optionEntity;
+
 }

+ 25 - 23
packages/cpt_sg/lib/modules/agency/position_list/position_list_controller.dart

@@ -133,28 +133,28 @@ class PositionListController 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);
-    // }
+  void fetchItemByIdAndRefreshItem(String? id) async {
+    var result = await _agencyRepository.fetchPositionTableByIds(
+      id,
+      cancelToken: cancelToken,
+    );
+
+    //处理数据
+    if (result.isSuccess) {
+      var data = result.data;
+      if (data != null && data.rows.isNotEmpty) {
+        final requestItem = data.rows[0];
+
+        //找到当前数据中的此 requestId,并替换对象,再刷新
+        var index = state.datas.indexWhere((element) => element.id == requestItem.id);
+        if (index >= 0) {
+          state.datas[index] = requestItem;
+          update();
+        }
+      }
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
   }
 
   @override
@@ -181,7 +181,9 @@ class PositionListController extends GetxController with DioCancelableMixin {
   //去编辑页面
   void gotoEditPage(PositionTableRows data) {
     SGPositionAddPage.startInstance(data.id, data.name, (result) {
-      if (result != null) {}
+      if (result != null) {
+        fetchItemByIdAndRefreshItem(data.id);
+      }
     });
   }
 

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

@@ -367,4 +367,37 @@ class ApiConstants {
   //中介合同的renew操作
   static const apiContractRenew = "/index.php/api/v2/hotel/contract/renew";
 
+  //合同关联职位 Option
+  static const apiContractPositionOption = "/index.php/api/v2/hotel/contract-position/index";
+
+  //合同关联职位 Table
+  static const apiContractPositionTable = "/index.php/api/v2/hotel/contract-position/table";
+
+  //合同关联职位 添加
+  static const apiContractPositionAddOption = "/index.php/api/v2/hotel/contract-position/add-view";
+
+  //合同关联职位 添加提交
+  static const apiContractPositionAddSubmit = "/index.php/api/v2/hotel/contract-position/add-submit";
+
+  //合同关联职位 详情
+  static const apiContractPositionRateDetail = "/index.php/api/v2/hotel/contract-rate/setting-view";
+
+  //合同关联职位 编辑提交
+  static const apiContractPositionRateEditSubmit = "/index.php/api/v2/hotel/contract-rate/setting-submit";
+
+  //中介合同时薪列表
+  static const apiContractRateTable = "/index.php/api/v2/hotel/contract-rate/table";
+
+  //中介合同时薪 添加指定日期Option
+  static const apiContractRateSpecificOption = "/index.php/api/v2/hotel/contract-rate/special-view";
+
+  //中介合同时薪 添加指定日期 Submit
+  static const apiContractRateSpecificAddSubmit = "/index.php/api/v2/hotel/contract-rate/special-submit";
+
+  //中介合同时薪 修改金额
+  static const apiContractRateAmountEdit = "/index.php/api/v2/hotel/contract-rate/edit-amount";
+
+  //中介合同时薪 记录删除
+  static const apiContractRateDelete = "/index.php/api/v2/hotel/contract-rate/destroy";
+
 }

+ 30 - 0
packages/cs_domain/lib/entity/response/contract_position_add_option_entity.dart

@@ -0,0 +1,30 @@
+import 'package:domain/entity/response/index_option_entity.dart';
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/contract_position_add_option_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/contract_position_add_option_entity.g.dart';
+
+@JsonSerializable()
+class ContractPositionAddOptionEntity {
+	@JSONField(name: "contract_id")
+	String? contractId;
+	@JSONField(name: "start_date")
+	String? startDate;
+	@JSONField(name: "end_date")
+	String? endDate;
+	@JSONField(name: "agency_name")
+	String? agencyName;
+	@JSONField(name: "position_list")
+	List<IndexOptionEntity> positionList = [];
+
+	ContractPositionAddOptionEntity();
+
+	factory ContractPositionAddOptionEntity.fromJson(Map<String, dynamic> json) => $ContractPositionAddOptionEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractPositionAddOptionEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 27 - 0
packages/cs_domain/lib/entity/response/contract_position_option_entity.dart

@@ -0,0 +1,27 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/contract_position_option_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/contract_position_option_entity.g.dart';
+
+@JsonSerializable()
+class ContractPositionOptionEntity {
+	@JSONField(name: "contract_id")
+	String? contractId;
+	@JSONField(name: "start_date")
+	String? startDate;
+	@JSONField(name: "end_date")
+	String? endDate;
+	@JSONField(name: "agency_name")
+	String? agencyName;
+
+	ContractPositionOptionEntity();
+
+	factory ContractPositionOptionEntity.fromJson(Map<String, dynamic> json) => $ContractPositionOptionEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractPositionOptionEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 50 - 0
packages/cs_domain/lib/entity/response/contract_position_rate_detail_entity.dart

@@ -0,0 +1,50 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/contract_position_rate_detail_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/contract_position_rate_detail_entity.g.dart';
+
+@JsonSerializable()
+class ContractPositionRateDetailEntity {
+	@JSONField(name: "position_id")
+	String? positionId;
+	@JSONField(name: "agency_name")
+	String? agencyName;
+	String? position;
+	@JSONField(name: "contract_id")
+	String? contractId;
+	@JSONField(name: "type_1")
+	String? type1;
+	@JSONField(name: "type_2")
+	String? type2;
+	@JSONField(name: "type_3")
+	String? type3;
+	@JSONField(name: "type_7")
+	String? type7;
+	@JSONField(name: "type_8")
+	String? type8;
+	@JSONField(name: "type_9")
+	String? type9;
+	@JSONField(name: "type_10")
+	String? type10;
+	@JSONField(name: "type_11")
+	String? type11;
+	@JSONField(name: "type_12")
+	String? type12;
+	@JSONField(name: "type_13")
+	String? type13;
+	@JSONField(name: "type_20")
+	String? type20;
+	@JSONField(name: "type_21")
+	String? type21;
+
+	ContractPositionRateDetailEntity();
+
+	factory ContractPositionRateDetailEntity.fromJson(Map<String, dynamic> json) => $ContractPositionRateDetailEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractPositionRateDetailEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 26 - 0
packages/cs_domain/lib/entity/response/contract_position_rate_specific_option_entity.dart

@@ -0,0 +1,26 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/contract_position_rate_specific_option_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/contract_position_rate_specific_option_entity.g.dart';
+
+@JsonSerializable()
+class ContractPositionRateSpecificOptionEntity {
+	@JSONField(name: "position_id")
+	String? positionId;
+	@JSONField(name: "agency_name")
+	String? agencyName;
+	String? position;
+	@JSONField(name: "contract_id")
+	String? contractId;
+
+	ContractPositionRateSpecificOptionEntity();
+
+	factory ContractPositionRateSpecificOptionEntity.fromJson(Map<String, dynamic> json) => $ContractPositionRateSpecificOptionEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractPositionRateSpecificOptionEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 47 - 0
packages/cs_domain/lib/entity/response/contract_position_rate_table_entity.dart

@@ -0,0 +1,47 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/contract_position_rate_table_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/contract_position_rate_table_entity.g.dart';
+
+@JsonSerializable()
+class ContractPositionRateTableEntity {
+	int total = 0;
+	List<ContractPositionRateTableRows> rows = [];
+
+	ContractPositionRateTableEntity();
+
+	factory ContractPositionRateTableEntity.fromJson(Map<String, dynamic> json) => $ContractPositionRateTableEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractPositionRateTableEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class ContractPositionRateTableRows {
+	String? id;
+	@JSONField(name: "agency_name")
+	String? agencyName;
+	String? position;
+	@JSONField(name: "special_show")
+	String? specialShow;
+	String? amount;
+	@JSONField(name: "created_at")
+	String? createdAt;
+	@JSONField(name: "updated_at")
+	String? updatedAt;
+
+	ContractPositionRateTableRows();
+
+	factory ContractPositionRateTableRows.fromJson(Map<String, dynamic> json) => $ContractPositionRateTableRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractPositionRateTableRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 47 - 0
packages/cs_domain/lib/entity/response/contract_position_table_entity.dart

@@ -0,0 +1,47 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/contract_position_table_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/contract_position_table_entity.g.dart';
+
+@JsonSerializable()
+class ContractPositionTableEntity {
+	int total = 0;
+	List<ContractPositionTableRows> rows = [];
+
+	ContractPositionTableEntity();
+
+	factory ContractPositionTableEntity.fromJson(Map<String, dynamic> json) => $ContractPositionTableEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractPositionTableEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class ContractPositionTableRows {
+	String? id;
+	@JSONField(name: "agency_name")
+	String? agencyName;
+	@JSONField(name: "position_id")
+	String? positionId;
+	String? position;
+	@JSONField(name: "hourly_rate")
+	String? hourlyRate;
+	String? contract;
+	@JSONField(name: "created_at")
+	String? createdAt;
+
+	ContractPositionTableRows();
+
+	factory ContractPositionTableRows.fromJson(Map<String, dynamic> json) => $ContractPositionTableRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $ContractPositionTableRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

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

@@ -13,6 +13,12 @@ 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_position_add_option_entity.dart';
+import 'package:domain/entity/response/contract_position_option_entity.dart';
+import 'package:domain/entity/response/contract_position_rate_detail_entity.dart';
+import 'package:domain/entity/response/contract_position_rate_specific_option_entity.dart';
+import 'package:domain/entity/response/contract_position_rate_table_entity.dart';
+import 'package:domain/entity/response/contract_position_table_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';
@@ -240,6 +246,30 @@ class JsonConvert {
     if (<ContractOptionEntity>[] is M) {
       return data.map<ContractOptionEntity>((Map<String, dynamic> e) => ContractOptionEntity.fromJson(e)).toList() as M;
     }
+    if (<ContractPositionAddOptionEntity>[] is M) {
+      return data.map<ContractPositionAddOptionEntity>((Map<String, dynamic> e) => ContractPositionAddOptionEntity.fromJson(e)).toList() as M;
+    }
+    if (<ContractPositionOptionEntity>[] is M) {
+      return data.map<ContractPositionOptionEntity>((Map<String, dynamic> e) => ContractPositionOptionEntity.fromJson(e)).toList() as M;
+    }
+    if (<ContractPositionRateDetailEntity>[] is M) {
+      return data.map<ContractPositionRateDetailEntity>((Map<String, dynamic> e) => ContractPositionRateDetailEntity.fromJson(e)).toList() as M;
+    }
+    if (<ContractPositionRateSpecificOptionEntity>[] is M) {
+      return data.map<ContractPositionRateSpecificOptionEntity>((Map<String, dynamic> e) => ContractPositionRateSpecificOptionEntity.fromJson(e)).toList() as M;
+    }
+    if (<ContractPositionRateTableEntity>[] is M) {
+      return data.map<ContractPositionRateTableEntity>((Map<String, dynamic> e) => ContractPositionRateTableEntity.fromJson(e)).toList() as M;
+    }
+    if (<ContractPositionRateTableRows>[] is M) {
+      return data.map<ContractPositionRateTableRows>((Map<String, dynamic> e) => ContractPositionRateTableRows.fromJson(e)).toList() as M;
+    }
+    if (<ContractPositionTableEntity>[] is M) {
+      return data.map<ContractPositionTableEntity>((Map<String, dynamic> e) => ContractPositionTableEntity.fromJson(e)).toList() as M;
+    }
+    if (<ContractPositionTableRows>[] is M) {
+      return data.map<ContractPositionTableRows>((Map<String, dynamic> e) => ContractPositionTableRows.fromJson(e)).toList() as M;
+    }
     if (<ContractTableEntity>[] is M) {
       return data.map<ContractTableEntity>((Map<String, dynamic> e) => ContractTableEntity.fromJson(e)).toList() as M;
     }
@@ -634,6 +664,14 @@ class JsonConvertClassCollection {
     (ContractDetailEntity).toString(): ContractDetailEntity.fromJson,
     (ContractDetailRow).toString(): ContractDetailRow.fromJson,
     (ContractOptionEntity).toString(): ContractOptionEntity.fromJson,
+    (ContractPositionAddOptionEntity).toString(): ContractPositionAddOptionEntity.fromJson,
+    (ContractPositionOptionEntity).toString(): ContractPositionOptionEntity.fromJson,
+    (ContractPositionRateDetailEntity).toString(): ContractPositionRateDetailEntity.fromJson,
+    (ContractPositionRateSpecificOptionEntity).toString(): ContractPositionRateSpecificOptionEntity.fromJson,
+    (ContractPositionRateTableEntity).toString(): ContractPositionRateTableEntity.fromJson,
+    (ContractPositionRateTableRows).toString(): ContractPositionRateTableRows.fromJson,
+    (ContractPositionTableEntity).toString(): ContractPositionTableEntity.fromJson,
+    (ContractPositionTableRows).toString(): ContractPositionTableRows.fromJson,
     (ContractTableEntity).toString(): ContractTableEntity.fromJson,
     (ContractTableRows).toString(): ContractTableRows.fromJson,
     (DeviceListEntity).toString(): DeviceListEntity.fromJson,

+ 57 - 0
packages/cs_domain/lib/generated/json/contract_position_add_option_entity.g.dart

@@ -0,0 +1,57 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/contract_position_add_option_entity.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
+
+
+ContractPositionAddOptionEntity $ContractPositionAddOptionEntityFromJson(Map<String, dynamic> json) {
+  final ContractPositionAddOptionEntity contractPositionAddOptionEntity = ContractPositionAddOptionEntity();
+  final String? contractId = jsonConvert.convert<String>(json['contract_id']);
+  if (contractId != null) {
+    contractPositionAddOptionEntity.contractId = contractId;
+  }
+  final String? startDate = jsonConvert.convert<String>(json['start_date']);
+  if (startDate != null) {
+    contractPositionAddOptionEntity.startDate = startDate;
+  }
+  final String? endDate = jsonConvert.convert<String>(json['end_date']);
+  if (endDate != null) {
+    contractPositionAddOptionEntity.endDate = endDate;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    contractPositionAddOptionEntity.agencyName = agencyName;
+  }
+  final List<IndexOptionEntity>? positionList = (json['position_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (positionList != null) {
+    contractPositionAddOptionEntity.positionList = positionList;
+  }
+  return contractPositionAddOptionEntity;
+}
+
+Map<String, dynamic> $ContractPositionAddOptionEntityToJson(ContractPositionAddOptionEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['contract_id'] = entity.contractId;
+  data['start_date'] = entity.startDate;
+  data['end_date'] = entity.endDate;
+  data['agency_name'] = entity.agencyName;
+  data['position_list'] = entity.positionList.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension ContractPositionAddOptionEntityExtension on ContractPositionAddOptionEntity {
+  ContractPositionAddOptionEntity copyWith({
+    String? contractId,
+    String? startDate,
+    String? endDate,
+    String? agencyName,
+    List<IndexOptionEntity>? positionList,
+  }) {
+    return ContractPositionAddOptionEntity()
+      ..contractId = contractId ?? this.contractId
+      ..startDate = startDate ?? this.startDate
+      ..endDate = endDate ?? this.endDate
+      ..agencyName = agencyName ?? this.agencyName
+      ..positionList = positionList ?? this.positionList;
+  }
+}

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

@@ -0,0 +1,47 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/contract_position_option_entity.dart';
+
+ContractPositionOptionEntity $ContractPositionOptionEntityFromJson(Map<String, dynamic> json) {
+  final ContractPositionOptionEntity contractPositionOptionEntity = ContractPositionOptionEntity();
+  final String? contractId = jsonConvert.convert<String>(json['contract_id']);
+  if (contractId != null) {
+    contractPositionOptionEntity.contractId = contractId;
+  }
+  final String? startDate = jsonConvert.convert<String>(json['start_date']);
+  if (startDate != null) {
+    contractPositionOptionEntity.startDate = startDate;
+  }
+  final String? endDate = jsonConvert.convert<String>(json['end_date']);
+  if (endDate != null) {
+    contractPositionOptionEntity.endDate = endDate;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    contractPositionOptionEntity.agencyName = agencyName;
+  }
+  return contractPositionOptionEntity;
+}
+
+Map<String, dynamic> $ContractPositionOptionEntityToJson(ContractPositionOptionEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['contract_id'] = entity.contractId;
+  data['start_date'] = entity.startDate;
+  data['end_date'] = entity.endDate;
+  data['agency_name'] = entity.agencyName;
+  return data;
+}
+
+extension ContractPositionOptionEntityExtension on ContractPositionOptionEntity {
+  ContractPositionOptionEntity copyWith({
+    String? contractId,
+    String? startDate,
+    String? endDate,
+    String? agencyName,
+  }) {
+    return ContractPositionOptionEntity()
+      ..contractId = contractId ?? this.contractId
+      ..startDate = startDate ?? this.startDate
+      ..endDate = endDate ?? this.endDate
+      ..agencyName = agencyName ?? this.agencyName;
+  }
+}

+ 131 - 0
packages/cs_domain/lib/generated/json/contract_position_rate_detail_entity.g.dart

@@ -0,0 +1,131 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/contract_position_rate_detail_entity.dart';
+
+ContractPositionRateDetailEntity $ContractPositionRateDetailEntityFromJson(Map<String, dynamic> json) {
+  final ContractPositionRateDetailEntity contractPositionRateDetailEntity = ContractPositionRateDetailEntity();
+  final String? positionId = jsonConvert.convert<String>(json['position_id']);
+  if (positionId != null) {
+    contractPositionRateDetailEntity.positionId = positionId;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    contractPositionRateDetailEntity.agencyName = agencyName;
+  }
+  final String? position = jsonConvert.convert<String>(json['position']);
+  if (position != null) {
+    contractPositionRateDetailEntity.position = position;
+  }
+  final String? contractId = jsonConvert.convert<String>(json['contract_id']);
+  if (contractId != null) {
+    contractPositionRateDetailEntity.contractId = contractId;
+  }
+  final String? type1 = jsonConvert.convert<String>(json['type_1']);
+  if (type1 != null) {
+    contractPositionRateDetailEntity.type1 = type1;
+  }
+  final String? type2 = jsonConvert.convert<String>(json['type_2']);
+  if (type2 != null) {
+    contractPositionRateDetailEntity.type2 = type2;
+  }
+  final String? type3 = jsonConvert.convert<String>(json['type_3']);
+  if (type3 != null) {
+    contractPositionRateDetailEntity.type3 = type3;
+  }
+  final String? type7 = jsonConvert.convert<String>(json['type_7']);
+  if (type7 != null) {
+    contractPositionRateDetailEntity.type7 = type7;
+  }
+  final String? type8 = jsonConvert.convert<String>(json['type_8']);
+  if (type8 != null) {
+    contractPositionRateDetailEntity.type8 = type8;
+  }
+  final String? type9 = jsonConvert.convert<String>(json['type_9']);
+  if (type9 != null) {
+    contractPositionRateDetailEntity.type9 = type9;
+  }
+  final String? type10 = jsonConvert.convert<String>(json['type_10']);
+  if (type10 != null) {
+    contractPositionRateDetailEntity.type10 = type10;
+  }
+  final String? type11 = jsonConvert.convert<String>(json['type_11']);
+  if (type11 != null) {
+    contractPositionRateDetailEntity.type11 = type11;
+  }
+  final String? type12 = jsonConvert.convert<String>(json['type_12']);
+  if (type12 != null) {
+    contractPositionRateDetailEntity.type12 = type12;
+  }
+  final String? type13 = jsonConvert.convert<String>(json['type_13']);
+  if (type13 != null) {
+    contractPositionRateDetailEntity.type13 = type13;
+  }
+  final String? type20 = jsonConvert.convert<String>(json['type_20']);
+  if (type20 != null) {
+    contractPositionRateDetailEntity.type20 = type20;
+  }
+  final String? type21 = jsonConvert.convert<String>(json['type_21']);
+  if (type21 != null) {
+    contractPositionRateDetailEntity.type21 = type21;
+  }
+  return contractPositionRateDetailEntity;
+}
+
+Map<String, dynamic> $ContractPositionRateDetailEntityToJson(ContractPositionRateDetailEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['position_id'] = entity.positionId;
+  data['agency_name'] = entity.agencyName;
+  data['position'] = entity.position;
+  data['contract_id'] = entity.contractId;
+  data['type_1'] = entity.type1;
+  data['type_2'] = entity.type2;
+  data['type_3'] = entity.type3;
+  data['type_7'] = entity.type7;
+  data['type_8'] = entity.type8;
+  data['type_9'] = entity.type9;
+  data['type_10'] = entity.type10;
+  data['type_11'] = entity.type11;
+  data['type_12'] = entity.type12;
+  data['type_13'] = entity.type13;
+  data['type_20'] = entity.type20;
+  data['type_21'] = entity.type21;
+  return data;
+}
+
+extension ContractPositionRateDetailEntityExtension on ContractPositionRateDetailEntity {
+  ContractPositionRateDetailEntity copyWith({
+    String? positionId,
+    String? agencyName,
+    String? position,
+    String? contractId,
+    String? type1,
+    String? type2,
+    String? type3,
+    String? type7,
+    String? type8,
+    String? type9,
+    String? type10,
+    String? type11,
+    String? type12,
+    String? type13,
+    String? type20,
+    String? type21,
+  }) {
+    return ContractPositionRateDetailEntity()
+      ..positionId = positionId ?? this.positionId
+      ..agencyName = agencyName ?? this.agencyName
+      ..position = position ?? this.position
+      ..contractId = contractId ?? this.contractId
+      ..type1 = type1 ?? this.type1
+      ..type2 = type2 ?? this.type2
+      ..type3 = type3 ?? this.type3
+      ..type7 = type7 ?? this.type7
+      ..type8 = type8 ?? this.type8
+      ..type9 = type9 ?? this.type9
+      ..type10 = type10 ?? this.type10
+      ..type11 = type11 ?? this.type11
+      ..type12 = type12 ?? this.type12
+      ..type13 = type13 ?? this.type13
+      ..type20 = type20 ?? this.type20
+      ..type21 = type21 ?? this.type21;
+  }
+}

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

@@ -0,0 +1,47 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/contract_position_rate_specific_option_entity.dart';
+
+ContractPositionRateSpecificOptionEntity $ContractPositionRateSpecificOptionEntityFromJson(Map<String, dynamic> json) {
+  final ContractPositionRateSpecificOptionEntity contractPositionRateSpecificOptionEntity = ContractPositionRateSpecificOptionEntity();
+  final String? positionId = jsonConvert.convert<String>(json['position_id']);
+  if (positionId != null) {
+    contractPositionRateSpecificOptionEntity.positionId = positionId;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    contractPositionRateSpecificOptionEntity.agencyName = agencyName;
+  }
+  final String? position = jsonConvert.convert<String>(json['position']);
+  if (position != null) {
+    contractPositionRateSpecificOptionEntity.position = position;
+  }
+  final String? contractId = jsonConvert.convert<String>(json['contract_id']);
+  if (contractId != null) {
+    contractPositionRateSpecificOptionEntity.contractId = contractId;
+  }
+  return contractPositionRateSpecificOptionEntity;
+}
+
+Map<String, dynamic> $ContractPositionRateSpecificOptionEntityToJson(ContractPositionRateSpecificOptionEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['position_id'] = entity.positionId;
+  data['agency_name'] = entity.agencyName;
+  data['position'] = entity.position;
+  data['contract_id'] = entity.contractId;
+  return data;
+}
+
+extension ContractPositionRateSpecificOptionEntityExtension on ContractPositionRateSpecificOptionEntity {
+  ContractPositionRateSpecificOptionEntity copyWith({
+    String? positionId,
+    String? agencyName,
+    String? position,
+    String? contractId,
+  }) {
+    return ContractPositionRateSpecificOptionEntity()
+      ..positionId = positionId ?? this.positionId
+      ..agencyName = agencyName ?? this.agencyName
+      ..position = position ?? this.position
+      ..contractId = contractId ?? this.contractId;
+  }
+}

+ 100 - 0
packages/cs_domain/lib/generated/json/contract_position_rate_table_entity.g.dart

@@ -0,0 +1,100 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/contract_position_rate_table_entity.dart';
+
+ContractPositionRateTableEntity $ContractPositionRateTableEntityFromJson(Map<String, dynamic> json) {
+  final ContractPositionRateTableEntity contractPositionRateTableEntity = ContractPositionRateTableEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    contractPositionRateTableEntity.total = total;
+  }
+  final List<ContractPositionRateTableRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<ContractPositionRateTableRows>(e) as ContractPositionRateTableRows).toList();
+  if (rows != null) {
+    contractPositionRateTableEntity.rows = rows;
+  }
+  return contractPositionRateTableEntity;
+}
+
+Map<String, dynamic> $ContractPositionRateTableEntityToJson(ContractPositionRateTableEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension ContractPositionRateTableEntityExtension on ContractPositionRateTableEntity {
+  ContractPositionRateTableEntity copyWith({
+    int? total,
+    List<ContractPositionRateTableRows>? rows,
+  }) {
+    return ContractPositionRateTableEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+ContractPositionRateTableRows $ContractPositionRateTableRowsFromJson(Map<String, dynamic> json) {
+  final ContractPositionRateTableRows contractPositionRateTableRows = ContractPositionRateTableRows();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    contractPositionRateTableRows.id = id;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    contractPositionRateTableRows.agencyName = agencyName;
+  }
+  final String? position = jsonConvert.convert<String>(json['position']);
+  if (position != null) {
+    contractPositionRateTableRows.position = position;
+  }
+  final String? specialShow = jsonConvert.convert<String>(json['special_show']);
+  if (specialShow != null) {
+    contractPositionRateTableRows.specialShow = specialShow;
+  }
+  final String? amount = jsonConvert.convert<String>(json['amount']);
+  if (amount != null) {
+    contractPositionRateTableRows.amount = amount;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    contractPositionRateTableRows.createdAt = createdAt;
+  }
+  final String? updatedAt = jsonConvert.convert<String>(json['updated_at']);
+  if (updatedAt != null) {
+    contractPositionRateTableRows.updatedAt = updatedAt;
+  }
+  return contractPositionRateTableRows;
+}
+
+Map<String, dynamic> $ContractPositionRateTableRowsToJson(ContractPositionRateTableRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['agency_name'] = entity.agencyName;
+  data['position'] = entity.position;
+  data['special_show'] = entity.specialShow;
+  data['amount'] = entity.amount;
+  data['created_at'] = entity.createdAt;
+  data['updated_at'] = entity.updatedAt;
+  return data;
+}
+
+extension ContractPositionRateTableRowsExtension on ContractPositionRateTableRows {
+  ContractPositionRateTableRows copyWith({
+    String? id,
+    String? agencyName,
+    String? position,
+    String? specialShow,
+    String? amount,
+    String? createdAt,
+    String? updatedAt,
+  }) {
+    return ContractPositionRateTableRows()
+      ..id = id ?? this.id
+      ..agencyName = agencyName ?? this.agencyName
+      ..position = position ?? this.position
+      ..specialShow = specialShow ?? this.specialShow
+      ..amount = amount ?? this.amount
+      ..createdAt = createdAt ?? this.createdAt
+      ..updatedAt = updatedAt ?? this.updatedAt;
+  }
+}

+ 100 - 0
packages/cs_domain/lib/generated/json/contract_position_table_entity.g.dart

@@ -0,0 +1,100 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/contract_position_table_entity.dart';
+
+ContractPositionTableEntity $ContractPositionTableEntityFromJson(Map<String, dynamic> json) {
+  final ContractPositionTableEntity contractPositionTableEntity = ContractPositionTableEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    contractPositionTableEntity.total = total;
+  }
+  final List<ContractPositionTableRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<ContractPositionTableRows>(e) as ContractPositionTableRows).toList();
+  if (rows != null) {
+    contractPositionTableEntity.rows = rows;
+  }
+  return contractPositionTableEntity;
+}
+
+Map<String, dynamic> $ContractPositionTableEntityToJson(ContractPositionTableEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension ContractPositionTableEntityExtension on ContractPositionTableEntity {
+  ContractPositionTableEntity copyWith({
+    int? total,
+    List<ContractPositionTableRows>? rows,
+  }) {
+    return ContractPositionTableEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+ContractPositionTableRows $ContractPositionTableRowsFromJson(Map<String, dynamic> json) {
+  final ContractPositionTableRows contractPositionTableRows = ContractPositionTableRows();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    contractPositionTableRows.id = id;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    contractPositionTableRows.agencyName = agencyName;
+  }
+  final String? positionId = jsonConvert.convert<String>(json['position_id']);
+  if (positionId != null) {
+    contractPositionTableRows.positionId = positionId;
+  }
+  final String? position = jsonConvert.convert<String>(json['position']);
+  if (position != null) {
+    contractPositionTableRows.position = position;
+  }
+  final String? hourlyRate = jsonConvert.convert<String>(json['hourly_rate']);
+  if (hourlyRate != null) {
+    contractPositionTableRows.hourlyRate = hourlyRate;
+  }
+  final String? contract = jsonConvert.convert<String>(json['contract']);
+  if (contract != null) {
+    contractPositionTableRows.contract = contract;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    contractPositionTableRows.createdAt = createdAt;
+  }
+  return contractPositionTableRows;
+}
+
+Map<String, dynamic> $ContractPositionTableRowsToJson(ContractPositionTableRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['agency_name'] = entity.agencyName;
+  data['position_id'] = entity.positionId;
+  data['position'] = entity.position;
+  data['hourly_rate'] = entity.hourlyRate;
+  data['contract'] = entity.contract;
+  data['created_at'] = entity.createdAt;
+  return data;
+}
+
+extension ContractPositionTableRowsExtension on ContractPositionTableRows {
+  ContractPositionTableRows copyWith({
+    String? id,
+    String? agencyName,
+    String? positionId,
+    String? position,
+    String? hourlyRate,
+    String? contract,
+    String? createdAt,
+  }) {
+    return ContractPositionTableRows()
+      ..id = id ?? this.id
+      ..agencyName = agencyName ?? this.agencyName
+      ..positionId = positionId ?? this.positionId
+      ..position = position ?? this.position
+      ..hourlyRate = hourlyRate ?? this.hourlyRate
+      ..contract = contract ?? this.contract
+      ..createdAt = createdAt ?? this.createdAt;
+  }
+}

+ 517 - 4
packages/cs_domain/lib/repository/sg_agency_repository.dart

@@ -3,8 +3,13 @@ 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_position_add_option_entity.dart';
+import 'package:domain/entity/response/contract_position_option_entity.dart';
+import 'package:domain/entity/response/contract_position_rate_detail_entity.dart';
+import 'package:domain/entity/response/contract_position_rate_specific_option_entity.dart';
+import 'package:domain/entity/response/contract_position_rate_table_entity.dart';
+import 'package:domain/entity/response/contract_position_table_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';
 import 'package:plugin_platform/http/http_provider.dart';
@@ -73,8 +78,41 @@ class SGAgencyRepository extends GetxService {
     return result.convert();
   }
 
+  /// 根据ID获取主列表的Item数据,用于刷新Item
+  Future<HttpResult<AgencyTableEntity>> fetchAgencyTableByIds(
+    String? ids, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = "1";
+    params["page_size"] = "9999";
+
+    if (!Utils.isEmpty(ids)) {
+      params["pivot_id"] = ids!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAgencyTable,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    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, {
+  Future<HttpResult> deleteAgencySubmit(
+    String? pivotId, {
     CancelToken? cancelToken,
   }) async {
     //参数
@@ -249,6 +287,38 @@ class SGAgencyRepository extends GetxService {
     return result.convert();
   }
 
+  /// 根据ID获取主列表的Item数据,用于刷新Item
+  Future<HttpResult<PositionTableEntity>> fetchPositionTableByIds(
+    String? ids, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = "1";
+    params["page_size"] = "9999";
+
+    if (!Utils.isEmpty(ids)) {
+      params["id"] = ids!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAgencyPositionTable,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = PositionTableEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<PositionTableEntity>(data: data);
+    }
+    return result.convert();
+  }
+
   /// 添加职位
   Future<HttpResult> addPositionSubmit({
     required String? name,
@@ -379,6 +449,38 @@ class SGAgencyRepository extends GetxService {
     return result.convert();
   }
 
+  /// 根据ID获取主列表的Item数据,用于刷新Item
+  Future<HttpResult<ContractTableEntity>> fetchContractTableByIds(
+    String? ids, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = "1";
+    params["page_size"] = "9999";
+
+    if (!Utils.isEmpty(ids)) {
+      params["contract_id"] = ids!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractTable,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    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,
@@ -440,7 +542,7 @@ class SGAgencyRepository extends GetxService {
     params['end_date'] = endDate ?? "";
 
     //文件
-    Map<String,String> fileParams = {};
+    Map<String, String> fileParams = {};
     if (paths != null && paths.isNotEmpty) {
       fileParams['file'] = paths[0];
     }
@@ -479,7 +581,7 @@ class SGAgencyRepository extends GetxService {
     params['end_date'] = endDate ?? "";
 
     //文件
-    Map<String,String> fileParams = {};
+    Map<String, String> fileParams = {};
     if (paths != null && paths.isNotEmpty) {
       fileParams['file'] = paths[0];
     }
@@ -501,4 +603,415 @@ class SGAgencyRepository extends GetxService {
     return result.convert();
   }
 
+  /// 合同关联职位 Option
+  Future<HttpResult<ContractPositionOptionEntity>> fetchContractPositionOption({
+    required String? contractId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["contract_id"] = contractId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractPositionOption,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = ContractPositionOptionEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<ContractPositionOptionEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取中介合同列表Table
+  Future<HttpResult<ContractPositionTableEntity>> fetchContractPositionTable({
+    required int curPage,
+    required String? contractId,
+    String? positionId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "10";
+
+    params["contract_id"] = contractId ?? "";
+
+    if (Utils.isNotEmpty(positionId)) {
+      params["position_id"] = positionId!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractPositionTable,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = ContractPositionTableEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<ContractPositionTableEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 合同关联职位 添加Option
+  Future<HttpResult<ContractPositionAddOptionEntity>> fetchContractPositionAddOption({
+    required String? contractId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["contract_id"] = contractId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractPositionAddOption,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = ContractPositionAddOptionEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<ContractPositionAddOptionEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 合同关联职位 添加Submit
+  Future<HttpResult> addContractPositionSubmit({
+    required String? contractId,
+    required String? positionId,
+    String? type_1,
+    String? type_2,
+    String? type_3,
+    String? type_7,
+    String? type_8,
+    String? type_9,
+    String? type_10,
+    String? type_11,
+    String? type_12,
+    String? type_13,
+    String? type_20,
+    String? type_21,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['contract_id'] = contractId ?? "";
+    params['position_id'] = positionId ?? "";
+
+    if (Utils.isNotEmpty(type_1)) {
+      params['type_1'] = type_1!;
+    }
+    if (Utils.isNotEmpty(type_2)) {
+      params['type_2'] = type_2!;
+    }
+    if (Utils.isNotEmpty(type_3)) {
+      params['type_3'] = type_3!;
+    }
+    if (Utils.isNotEmpty(type_7)) {
+      params['type_7'] = type_7!;
+    }
+    if (Utils.isNotEmpty(type_8)) {
+      params['type_8'] = type_8!;
+    }
+    if (Utils.isNotEmpty(type_9)) {
+      params['type_9'] = type_9!;
+    }
+    if (Utils.isNotEmpty(type_10)) {
+      params['type_10'] = type_10!;
+    }
+    if (Utils.isNotEmpty(type_11)) {
+      params['type_11'] = type_11!;
+    }
+    if (Utils.isNotEmpty(type_12)) {
+      params['type_12'] = type_12!;
+    }
+    if (Utils.isNotEmpty(type_13)) {
+      params['type_13'] = type_13!;
+    }
+    if (Utils.isNotEmpty(type_20)) {
+      params['type_20'] = type_20!;
+    }
+    if (Utils.isNotEmpty(type_21)) {
+      params['type_21'] = type_21!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractPositionAddSubmit,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 合同关联职位 编辑详情
+  Future<HttpResult<ContractPositionRateDetailEntity>> fetchContractPositionRateDetail({
+    required String? contractId,
+    required String? positionId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["contract_id"] = contractId ?? "";
+    params["position_id"] = positionId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractPositionRateDetail,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = ContractPositionRateDetailEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<ContractPositionRateDetailEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 合同关联职位 费率编辑的Submit
+  Future<HttpResult> editContractPositionRateSubmit({
+    required String? contractId,
+    required String? positionId,
+    String? type_1,
+    String? type_2,
+    String? type_3,
+    String? type_7,
+    String? type_8,
+    String? type_9,
+    String? type_10,
+    String? type_11,
+    String? type_12,
+    String? type_13,
+    String? type_20,
+    String? type_21,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['contract_id'] = contractId ?? "";
+    params['position_id'] = positionId ?? "";
+
+    if (Utils.isNotEmpty(type_1)) {
+      params['type_1'] = type_1!;
+    }
+    if (Utils.isNotEmpty(type_2)) {
+      params['type_2'] = type_2!;
+    }
+    if (Utils.isNotEmpty(type_3)) {
+      params['type_3'] = type_3!;
+    }
+    if (Utils.isNotEmpty(type_7)) {
+      params['type_7'] = type_7!;
+    }
+    if (Utils.isNotEmpty(type_8)) {
+      params['type_8'] = type_8!;
+    }
+    if (Utils.isNotEmpty(type_9)) {
+      params['type_9'] = type_9!;
+    }
+    if (Utils.isNotEmpty(type_10)) {
+      params['type_10'] = type_10!;
+    }
+    if (Utils.isNotEmpty(type_11)) {
+      params['type_11'] = type_11!;
+    }
+    if (Utils.isNotEmpty(type_12)) {
+      params['type_12'] = type_12!;
+    }
+    if (Utils.isNotEmpty(type_13)) {
+      params['type_13'] = type_13!;
+    }
+    if (Utils.isNotEmpty(type_20)) {
+      params['type_20'] = type_20!;
+    }
+    if (Utils.isNotEmpty(type_21)) {
+      params['type_21'] = type_21!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractPositionRateEditSubmit,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 获取中介合同的时薪列表Table
+  Future<HttpResult<ContractPositionRateTableEntity>> fetchContractPositionRateTable({
+    required int curPage,
+    required String? contractId,
+    required String? positionId,
+    String? rateId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "20";
+    params["contract_id"] = contractId ?? "";
+    params["position_id"] = positionId ?? "";
+
+    if (Utils.isNotEmpty(rateId)) {
+      params["rate_id"] = rateId!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractRateTable,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = ContractPositionRateTableEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<ContractPositionRateTableEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取中介合同的时薪,指定日期Option
+  Future<HttpResult<ContractPositionRateSpecificOptionEntity>> fetchContractPositionRateSpecificOption({
+    required String? contractId,
+    required String? positionId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["contract_id"] = contractId ?? "";
+    params["position_id"] = positionId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractRateSpecificOption,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = ContractPositionRateSpecificOptionEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<ContractPositionRateSpecificOptionEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取中介合同的时薪,指定日期添加
+  Future<HttpResult> addContractPositionRateSpecificSubmit({
+    required String? contractId,
+    required String? positionId,
+    required String? day,
+    required String? amount,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['contract_id'] = contractId ?? "";
+    params['position_id'] = positionId ?? "";
+    params['special_day'] = day ?? "";
+    params['amount'] = amount ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractRateSpecificAddSubmit,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 中介合同时薪 修改金额
+  Future<HttpResult> editContractPositionRateAmountEdit({
+    required String? rateId,
+    required String? amount,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['rate_id'] = rateId ?? "";;
+    params['amount'] = amount ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractRateAmountEdit,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 中介合同时薪 删除记录
+  Future<HttpResult> deleteContractPositionRate({
+    required String? rateId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['rate_id'] = rateId ?? "";;
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiContractRateDelete,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
 }

+ 6 - 6
packages/cs_resources/lib/local/language/zh_CN.dart

@@ -65,12 +65,12 @@ const Map<String, String> zh_CN = {
   'Edit': '编辑',
   'Recall': '撤回',
   'Detail': '详情',
-  'Outlet:': '部门',
-  'DateTime:': '日期与时间',
-  'No. of Staff:': '需要的人员数量',
-  'Status:': '状态',
-  'Publish Status:': '发布状态',
-  'Created At:': '创建时间',
+  'Outlet:': '部门:',
+  'DateTime:': '日期与时间:',
+  'No. of Staff:': '需要的人员数量:',
+  'Status:': '状态:',
+  'Publish Status:': '发布状态:',
+  'Created At:': '创建时间:',
   'Published': '已发布',
   'Unpublished': '未发布',
   'Choose Outlet': '请选择部门',