glglove 10 saat önce
ebeveyn
işleme
73c30caa9f
31 değiştirilmiş dosya ile 2079 ekleme ve 466 silme
  1. 0 1
      .fvm/versions/3.24.5
  2. 4 1
      .gitignore
  3. 2 2
      app/android/app/build.gradle
  4. 62 49
      packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff.dart
  5. 184 7
      packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_controller.dart
  6. 25 0
      packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_state.dart
  7. 116 24
      packages/cpt_uk/lib/modules/job/labour_request_add/widget/lab_request_and_request_review_form.dart
  8. 4 1
      packages/cpt_uk/lib/modules/job/labour_request_add/widget/labour_request_interface.dart
  9. 64 29
      packages/cpt_uk/lib/modules/job/labour_request_preselected_list/widget/preselected_add_staff.dart
  10. 169 3
      packages/cpt_uk/lib/modules/job/template_add/template_add_controller.dart
  11. 169 11
      packages/cpt_uk/lib/modules/job/template_add/template_add_page.dart
  12. 36 0
      packages/cpt_uk/lib/modules/job/template_add/template_add_state.dart
  13. 2 0
      packages/cpt_uk/lib/modules/main/main_controller.dart
  14. 150 0
      packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_controller.dart
  15. 24 0
      packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_state.dart
  16. 7 0
      packages/cs_domain/lib/constants/api_constants.dart
  17. 70 67
      packages/cs_domain/lib/entity/response/hotel_info_entity.dart
  18. 57 12
      packages/cs_domain/lib/entity/response/uk_lab_req_show_template_entity.dart
  19. 69 29
      packages/cs_domain/lib/entity/response/uk_labour_request_detail_entity.dart
  20. 7 6
      packages/cs_domain/lib/entity/response/uk_labour_request_preselect_addstaff_list_entity.dart
  21. 67 20
      packages/cs_domain/lib/entity/response/uk_template_detail_entity.dart
  22. 23 4
      packages/cs_domain/lib/entity/response/uk_template_detail_index_entity.dart
  23. 44 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  24. 175 160
      packages/cs_domain/lib/generated/json/hotel_info_entity.g.dart
  25. 120 1
      packages/cs_domain/lib/generated/json/uk_lab_req_show_template_entity.g.dart
  26. 109 5
      packages/cs_domain/lib/generated/json/uk_labour_request_detail_entity.g.dart
  27. 7 0
      packages/cs_domain/lib/generated/json/uk_labour_request_preselect_addstaff_list_entity.g.dart
  28. 128 1
      packages/cs_domain/lib/generated/json/uk_template_detail_entity.g.dart
  29. 45 0
      packages/cs_domain/lib/generated/json/uk_template_detail_index_entity.g.dart
  30. 81 0
      packages/cs_domain/lib/repository/uk_job_repository.dart
  31. 59 33
      packages/cs_domain/lib/repository/uk_labour_repository.dart

+ 0 - 1
.fvm/versions/3.24.5

@@ -1 +0,0 @@
-I:/programInstall/fvm/versions/3.24.5

+ 4 - 1
.gitignore

@@ -28,4 +28,7 @@
 .pub-cache/
 .pub/
 /build/
-proguardMapping.txt
+proguardMapping.txt
+
+# FVM Version Cache
+.fvm/

+ 2 - 2
app/android/app/build.gradle

@@ -57,8 +57,8 @@ android {
 
         ndk {
             //选择要添加的对应 cpu 类型的 .so 库。
-//            abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
-            abiFilters 'armeabi-v7a', 'arm64-v8a'
+            abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
+//            abiFilters 'armeabi-v7a', 'arm64-v8a'
 //            abiFilters 'armeabi-v7a'
 //            abiFilters 'arm64-v8a'
         }

+ 62 - 49
packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff.dart

@@ -9,6 +9,7 @@ import 'package:flutter/widgets.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:get/get.dart';
 import 'package:plugin_basic/modules/global_web_page.dart';
+import 'package:plugin_basic/service/user_service.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 import 'package:widgets/ext/ex_widget.dart';
@@ -554,56 +555,68 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
             //   ],
             // ).marginOnly(top: 5),
             //
-            // //电话
-            // Row(
-            //   children: [
-            //     MyTextView(
-            //       "Phone:",
-            //       marginRight: 3,
-            //       textColor: ColorConstants.black66,
-            //       fontSize: 13,
-            //       isFontRegular: true,
-            //     ),
-            //     MyTextView(
-            //       item.phone ?? "-",
-            //       textColor: ColorConstants.black66,
-            //       fontSize: 13,
-            //       isFontRegular: true,
-            //     ),
-            //   ],
-            // ).marginOnly(top: 5),
-            Row(
-              mainAxisSize: MainAxisSize.max,
-              children: [
-                MyTextView(
-                  "CV".tr + ":",
-                  marginRight: 3,
-                  textColor: ColorConstants.black66,
-                  fontSize: 13,
-                  isFontRegular: true,
-                ),
-                Expanded(
-                  child: Container(
-                    padding: const EdgeInsets.only(right: 5),
-                    child: MyTextView(
-                      (item.resume ==null || item.resume!.isEmpty == true)? "-": item.resume!,
-                      textColor: ColorConstants.black66,
-                      fontSize: 13,
-                      isFontRegular: true,
-                      maxLines: 1,
-                      isTextEllipsis: true,
-                      onClick: (){
-                        // 点击查看 打开webview 页面
-                        if(item.resume?.isNotEmpty == true && Utils.isNetworkUrl(item.resume!)){
-                          controller.handlerScanFile(item.resume!);
-                        }
-                      },
-                    ),
+            //电话
+            Visibility(
+              visible: UserService.to.hotelInfo!.value!.mobileNumberShow?.toString() == "1"? true: false,
+              child: Row(
+                children: [
+                  MyTextView(
+                    "Phone:",
+                    marginRight: 3,
+                    textColor: ColorConstants.black66,
+                    fontSize: 13,
+                    isFontRegular: true,
                   ),
-                ),
-              ],
-            ).marginOnly(top: 5),
-
+                  MyTextView(
+                    item.phone ?? "-",
+                    textColor: ColorConstants.black66,
+                    fontSize: 13,
+                    isFontRegular: true,
+                  ),
+                ],
+              ).marginOnly(top: 5),
+            ),
+            Obx(
+              () {
+                return Visibility(
+                  visible: UserService.to.hotelInfo!.value!.cvShow?.toString() == "1"? true: false,
+                  child: Visibility(
+                    visible: UserService.to.hotelInfo!.value!.cvShow?.toString() == "1"? true: false,
+                    child: Row(
+                      mainAxisSize: MainAxisSize.max,
+                      children: [
+                        MyTextView(
+                          "CV".tr + ":",
+                          marginRight: 3,
+                          textColor: ColorConstants.black66,
+                          fontSize: 13,
+                          isFontRegular: true,
+                        ),
+                        Expanded(
+                          child: Container(
+                            padding: const EdgeInsets.only(right: 5),
+                            child: MyTextView(
+                              (item.resume ==null || item.resume!.isEmpty == true)? "-": item.resume!,
+                              textColor: ColorConstants.black66,
+                              fontSize: 13,
+                              isFontRegular: true,
+                              maxLines: 1,
+                              isTextEllipsis: true,
+                              onClick: (){
+                                // 点击查看 打开webview 页面
+                                if(item.resume?.isNotEmpty == true && Utils.isNetworkUrl(item.resume!)){
+                                  controller.handlerScanFile(item.resume!);
+                                }
+                              },
+                            ),
+                          ),
+                        ),
+                      ],
+                    ).marginOnly(top: 5),
+                  )
+                );
+              }
+            ),
             Row(
               children: [
                 MyTextView(

+ 184 - 7
packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_controller.dart

@@ -2,7 +2,9 @@ import 'dart:io';
 
 import 'package:cpt_uk/modules/job/labour_request_add/widget/labour_request_interface.dart';
 import 'package:cpt_uk/modules/job/labour_request_add/widget/uploadFileField.dart';
+import 'package:domain/entity/response/uk_lab_req_show_template_entity.dart';
 import 'package:domain/entity/response/uk_labour_request_detail_entity.dart';
+import 'package:domain/entity/response/uk_template_detail_index_entity.dart';
 import 'package:domain/repository/labour_repository.dart';
 import 'package:domain/repository/uk_job_repository.dart';
 import 'package:domain/repository/uk_labour_repository.dart';
@@ -10,6 +12,7 @@ import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 import 'package:plugin_basic/constants/app_constant.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/engine/loading/loading_engine.dart';
 import 'package:plugin_platform/engine/notify/notify_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/http/http_result.dart';
@@ -44,11 +47,10 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
     Future<HttpResult<UkLabourRequestDetailEntity>> taskFuture;
     // Log.d("请求的state.appliedId  ${state.appliedId}");
     if (Utils.isNotEmpty(state.appliedId) && state.appliedId != "0") {
-      // 编辑
-      // Log.d("请求的state.appliedId3333  ${state.appliedId}");
+      // 非新增获取详情
       taskFuture = _ukLabourRepository.fetchLabourRequestDetail(state.appliedId);
     } else {
-      // 新增时获取详情
+      // 新增时获取选项
       taskFuture = _ukLabourRepository.fetchLabourRequestAddOption();
     }
 
@@ -65,8 +67,8 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
       state.selectedDate = state.labReqOption?.jobStart == null ? null : DateTimeUtils.getDateTime(state.labReqOption!.jobStart!);
       state.selectedStartTime = state.labReqOption?.jobStart == null ? null : DateTimeUtils.getDateTime(state.labReqOption!.jobStart!);
       state.selectedEndTime = state.labReqOption?.jobEnd == null ? null : DateTimeUtils.getDateTime(state.labReqOption!.jobEnd!);
-      state.location = state.labReqOption?.location ?? '';
 
+      state.location = state.labReqOption?.location ?? '';
 
       Log.d("获取到的 atturl  ${state.labReqOption?.attUrl}");
 
@@ -136,6 +138,9 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         // 新增
         state.noStaff = '';
         state.amount =  '';
+        state.selectedCountryStr = '';
+        state.selectedCityStr = '';
+        state.location = '';
 
         // choose Type 下拉里面 永远只有一个选项 所以默认选择第一个
         if (state.labReqOption?.employmentList != null && state.labReqOption!.employmentList!.isNotEmpty) {
@@ -146,6 +151,30 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         state.noStaff = state.labReqOption?.needNum?.toString() == "0" ? "" : state.labReqOption?.needNum.toString();
         state.amount = state.labReqOption?.amount?.toString() == "0" ? "" : state.labReqOption?.amount.toString();
 
+        //  state.labReqOption.countryList 中找到  selected 为  true 的项
+        int? countryIndex = state.labReqOption?.countryList?.indexWhere((e) => e.selected == "selected") ?? -1;
+        if(countryIndex != -1){
+          state.selectedCountryStr = state.labReqOption?.countryList?[countryIndex].txt.toString();
+
+          // state.labReqOption?.countryList 遍历后 创建 state.countryOptionEntityList
+          state.countryOptionEntityList = state.labReqOption?.countryList
+              ?.map((item) => UkLabReqShowTemplateCountryList()
+            ..id = item.value
+            ..name = item.txt
+          ).toList();
+        }
+
+        //  state.labReqOption.cityList 中找到  selected 为  true 的项
+        int? cityIndex = state.labReqOption?.cityList?.indexWhere((e) => e.selected == "selected") ?? -1;
+        if(cityIndex != -1){
+          state.selectedCityStr = state.labReqOption?.cityList?[cityIndex].txt.toString();
+          state.cityOptionEntityList = state.labReqOption?.cityList
+              ?.map((item) => UkLabReqShowTemplateCityList()
+            ..id = item.value
+            ..name = item.txt
+          ).toList();
+        }
+
       }
 
       var needNumController = state.formData['no_of_staff']!['controller'];
@@ -347,6 +376,8 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         "challenge25": state.selectedChallenge25Id?? "",
         "vehicle": state.selectedVehicleList?.join(",")??"",
         "description": remark,
+        "countryId": state.selectedCountryId,
+        "cityId": state.selectedCityId,
         "location": location,
         "employmentType": state.selectedTypeId,
         "eventName": event,
@@ -378,6 +409,8 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         needNum: params['needNum'],
         salaryBy: params['salaryBy'],
         amount: params['amount'],
+        countryId: params['countryId'],
+        cityId: params['cityId'],
         location: params['location'],
         certificate: params['certificate'],
         challenge25: params['challenge25'],
@@ -414,6 +447,8 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         "vehicle": state.selectedVehicleList?.join(",")??"",
         "jobApplyPreId": state.preSelectedIds,
         "description": remark,
+        "countryId": state.selectedCountryId,
+        "cityId": state.selectedCityId,
         "location": location,
         "employmentType": state.selectedTypeId,
         "eventName": event,
@@ -442,6 +477,8 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         salaryBy: params['salaryBy'],
         repeatDateStr: params['repeatDateStr'],
         amount: params['amount'],
+        countryId: params['countryId'],
+        cityId: params['cityId'],
         location: params['location'],
         certificate: params['certificate'],
         challenge25: params['challenge25'],
@@ -519,7 +556,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
             "";
         positionController.text = state.position;
 
-        // 并且需要根据 state.selectedTemplateId调用 接口 回显 证书 、vehicle
+        // 并且需要根据 state.selectedTemplateId调用 接口 回显 证书 、vehicle、country city location等
         await _getShowTemplateData(state.selectedTemplateId!);
 
       },
@@ -573,6 +610,24 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
           Log.d("切换模板后, 证书的回显 vehicleList: ${state.labReqOption?.challenge25List}");
 
         }
+
+        // 回显 国家 城市 location
+        if(state.showTemplateData?.countryId != null){
+          state.location = state.showTemplateData?.location.toString();
+
+          state.selectedCountryStr = state.showTemplateData?.countryList?.firstWhere(
+                (element) => element.id.toString() == state.showTemplateData?.countryId.toString(),
+            orElse: () => UkLabReqShowTemplateCountryList(),
+          )?.name;
+          state.countryOptionEntityList = state.showTemplateData?.countryList??[];
+
+          state.selectedCityStr = state.showTemplateData?.cityList?.firstWhere(
+                (element) => element.id.toString() == state.showTemplateData?.cityId.toString(),
+            orElse: () => UkLabReqShowTemplateCityList(),
+          )?.name;
+          state.cityOptionEntityList = state.showTemplateData?.cityList??[];
+
+        }
         // 更新
         update();
       }
@@ -757,13 +812,135 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
     }
   }
 
+  // 编辑状态时 修改 开始日期时间  YYYY-MM-DD HH:mm
+  @override
+  void pickJobStart() {
+    // TODO: implement pickJobStart
+    DatePickerUtil.showCupertinoDatePicker(
+      title: "Job Start".tr,
+      selectedDateTime: state.jobStart,
+      mode: CupertinoDatePickerMode.dateAndTime,
+      onDateTimeChanged: (date) {
+        Log.d("选取的开始日期时间:${date.toString()}");
+        Log.d("----------${DateTimeUtils.formatDate(date, format: 'yyyy-MM-dd HH:mm')}");
+        state.jobSelectJobStart = DateTimeUtils.formatDate(date, format: 'yyyy-MM-dd HH:mm');
+        update();
+      },
+    );
+
+  }
+
+  // 编辑状态时 修改 结束日期时间  YYYY-MM-DD HH:mm
   @override
   void pickJobEnd() {
     // TODO: implement pickJobEnd
+    DatePickerUtil.showCupertinoDatePicker(
+      title: "Job End".tr,
+      selectedDateTime: state.jobStart,
+      mode: CupertinoDatePickerMode.dateAndTime,
+      onDateTimeChanged: (date) {
+        Log.d("选取的结束日期时间:${date.toString()}");
+        state.jobSelectJobEnd = DateTimeUtils.formatDate(date, format: 'yyyy-MM-dd HH:mm');
+        update();
+      },
+    );
   }
 
+
+  // 新增时 选择 country
   @override
-  void pickJobStart() {
-    // TODO: implement pickJobStart
+  void showChooseCountryPicker(){
+    if(Utils.isEmpty(state.selectedTemplateId)){
+      return ToastEngine.show("Please select jobTitle");
+    }
+    int selectedOptionsIndex;
+    if (state.selectedCountryStr == null) {
+      selectedOptionsIndex = 0;
+    } else {
+      selectedOptionsIndex = state.countryOptionEntityList?.indexWhere((e) => e.name.toString() == state.selectedCountryStr)?? 0;
+    }
+
+    if (selectedOptionsIndex < 0) {
+      selectedOptionsIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: state.countryOptionEntityList?.map((e) => e.name.toString()).toList(growable: false)?? [],
+      initialSelectIndex: selectedOptionsIndex,
+      onPickerChanged: (_, index) async {
+        String lastSelectedOptionsStr = state.selectedCountryStr?? "";
+        String curSelectedStr = state.countryOptionEntityList?[index].name.toString() ?? "";
+        Log.d("当前选择的国家:$curSelectedStr");
+        if(lastSelectedOptionsStr != curSelectedStr){
+          state.selectedCountryStr = curSelectedStr;
+          state.selectedCityStr = "";
+          update();
+          // 需要调接口来获取工作标题的数据源
+          await _fetchCityOptionsList(null);
+        }
+      },
+    );
   }
+
+  @override
+  // 新增时 选择 city
+  void showChooseCityPicker(){
+    if(Utils.isEmpty(state.selectedCountryStr)){
+      return ToastEngine.show("Please select country first");
+    }
+    int selectedOptionsIndex;
+    if (state.selectedCityStr == null) {
+      selectedOptionsIndex = 0;
+    } else {
+      selectedOptionsIndex = state.cityOptionEntityList?.indexWhere((e) => e.name?.toString() == state.selectedCityStr)?? 0;
+    }
+
+    if (selectedOptionsIndex < 0) {
+      selectedOptionsIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: state.cityOptionEntityList?.map((e) => e.name.toString()).toList(growable: false)?? [],
+      initialSelectIndex: selectedOptionsIndex,
+      onPickerChanged: (_, index) {
+        String lastSelectedOptionsStr = state.selectedCityStr?? "";
+        String curSelectedStr = state.cityOptionEntityList?[index].name.toString() ?? "";
+        if(lastSelectedOptionsStr != curSelectedStr){
+          state.selectedCityStr = curSelectedStr;
+          update();
+        }
+      },
+    );
+  }
+
+
+  // 获取城市的数据源
+  Future _fetchCityOptionsList(String? cityId) async {
+    LoadingEngine.show();
+    try {
+      // 获取到数据
+      HttpResult<UkTemplateDetailIndexCountryList> taskResult;
+      taskResult = await _ukJobRepository.fetchCityOptiosByCountry(
+        state.selectedCountryId!,
+        cancelToken: cancelToken,
+      );
+      if (taskResult.isSuccess) {
+        state.cityOptionEntityList = taskResult.list!.map((e) => UkLabReqShowTemplateCityList.fromJson(e.toJson())).toList();
+        // 当前的 selectedCityStr
+        if(Utils.isEmpty(cityId)){
+          state.selectedCityStr = "";
+        }else {
+          state.selectedCityStr = taskResult.list?.firstWhere((e) => e.id.toString() == cityId, orElse: () => UkTemplateDetailIndexCountryList()).name ?? "";
+        }
+        update();
+      } else {
+        ToastEngine.show(taskResult.errorMsg ?? "Network Load Error".tr);
+      }
+    } catch (e) {
+      // Log.e(e);
+    } finally {
+      LoadingEngine.dismiss();
+    }
+  }
+
 }

+ 25 - 0
packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_state.dart

@@ -5,6 +5,7 @@ import 'package:cpt_uk/modules/job/labour_request_add/widget/uploadFileField.dar
 import 'package:domain/entity/response/uk_lab_req_show_template_entity.dart';
 import 'package:domain/entity/response/uk_labour_request_detail_entity.dart';
 import 'package:domain/entity/response/uk_labour_request_preselect_addstaff_list_entity.dart';
+import 'package:domain/entity/response/uk_template_detail_index_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:shared/utils/date_time_utils.dart';
@@ -192,4 +193,28 @@ class LabourRequestAddState implements CommonLabourRequestState {
     ''';
   @override
   List<FileFieldItem> uploadFieldList = [];
+
+  @override
+  String? selectedCountryStr;
+  List<UkLabReqShowTemplateCountryList>? countryOptionEntityList; // 新增时国家数据源
+  String? get selectedCountryId {
+    // 遍历 countryOptionEntityList 中获取 对应的 selectedCountryStr 的 id
+    final country = countryOptionEntityList?.firstWhere(
+          (e) => e.name?.toString() == selectedCountryStr,
+      orElse: () => UkLabReqShowTemplateCountryList(),
+    );
+    return country?.id?.toString();
+  }
+
+  @override
+  String? selectedCityStr;
+  List<UkLabReqShowTemplateCityList>? cityOptionEntityList; // 新增时城市数据源
+  String? get selectedCityId {
+    // 遍历 cityOptionEntityList 中获取 对应的 selectedCityStr 的 id
+    final city = cityOptionEntityList?.firstWhere(
+          (e) => e.name?.toString() == selectedCityStr,
+      orElse: () => UkLabReqShowTemplateCityList(),
+    );
+    return city?.id?.toString();
+  }
 }

+ 116 - 24
packages/cpt_uk/lib/modules/job/labour_request_add/widget/lab_request_and_request_review_form.dart

@@ -89,6 +89,11 @@ class CommonLabourRequestFormFields extends StatelessWidget {
           controller.pickJobTitle();
         }),
 
+        // 国家 和 城市
+        _buildTemplateJobCountryAndCityWidget(context, controller, isAddAction, isEditAction, isDetailAction),
+        // 详细地址 location
+        _buildTemplateJobDetailLocationWidget(context, controller, isAddAction, isEditAction, isDetailAction),
+
         if(isAddAction)
           // 新增时 工作时间筛选
           _getAddChooseDateAndTimeWidget(context, controller, true)
@@ -362,30 +367,6 @@ class CommonLabourRequestFormFields extends StatelessWidget {
           ).marginOnly(left: 0, right: 15, top: 10),
         ),
 
-        // location
-        FormRequireText(
-          text: "Location:".tr,
-          isRequired: false,
-        ).marginOnly(top: 15),
-
-        CustomTextField(
-          formKey: "location",
-          marginLeft: 0,
-          marginRight: 0,
-          paddingTop: 0,
-          paddingBottom: 0,
-          height: 45,
-          fillBackgroundColor: const Color(0xFF4DCFF6).withOpacity(state.pageType == 2 ? 0.5 : 0.2),
-          enabled: state.pageType != 2,
-          textInputType: TextInputType.text,
-          formData: state.formData,
-          textInputAction: TextInputAction.done,
-          onSubmit: (key, value) {
-            FocusScope.of(context).unfocus();
-          },
-          marginTop: 10,
-        ),
-
 
         // Type 选项  employment list
         FormRequireText(
@@ -631,6 +612,116 @@ class CommonLabourRequestFormFields extends StatelessWidget {
     );
   }
 
+  Widget _buildTemplateJobCountryAndCityWidget(BuildContext context, CommonLabourRequestController controller, bool isAdd, bool isEdit, bool isDetail){
+    final state = controller.commonState;
+    return Container(
+        child: Column(
+            mainAxisAlignment: MainAxisAlignment.start,
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              FormRequireText(text: "Country".tr, isRequired: false).marginOnly(top: 15),
+              //选择国家
+              Container(
+                padding: const EdgeInsets.only(left: 16, right: 10),
+                margin: const EdgeInsets.only(top: 10),
+                height: 45,
+                decoration: BoxDecoration(
+                  color: const Color(0xFF4DCFF6).withOpacity(isDetail ? 0.5 : 0.2),
+                  borderRadius: BorderRadius.all(Radius.circular(5)),
+                ),
+                child: Row(
+                  mainAxisSize: MainAxisSize.max,
+                  crossAxisAlignment: CrossAxisAlignment.center,
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  children: [
+                    MyTextView(
+                      state.selectedCountryStr ==null || Utils.isEmpty(state.selectedCountryStr)? '': state.selectedCountryStr! ,
+                      hint: "Choose Country".tr,
+                      textHintColor: ColorConstants.textGrayAECAE5,
+                      fontSize: 14,
+                      isFontMedium: true,
+                      textColor: ColorConstants.white,
+                    ).expanded(),
+                    const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                  ],
+                ),
+              ).onTap(() {
+                if(!isDetail){
+                  controller.showChooseCountryPicker();
+                }
+              }),
+
+              FormRequireText(text: "City".tr, isRequired: false).marginOnly(top: 15),
+              //选择城市
+              Container(
+                padding: const EdgeInsets.only(left: 16, right: 10),
+                margin: const EdgeInsets.only(top: 10),
+                height: 45,
+                decoration: BoxDecoration(
+                  color: const Color(0xFF4DCFF6).withOpacity(isDetail ? 0.5 : 0.2),
+                  borderRadius: BorderRadius.all(Radius.circular(5)),
+                ),
+                child: Row(
+                  mainAxisSize: MainAxisSize.max,
+                  crossAxisAlignment: CrossAxisAlignment.center,
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  children: [
+                    MyTextView(
+                      state.selectedCityStr ==null || Utils.isEmpty(state.selectedCityStr)? '': state.selectedCityStr! ,
+                      hint: "Choose City".tr,
+                      textHintColor: ColorConstants.textGrayAECAE5,
+                      fontSize: 14,
+                      isFontMedium: true,
+                      textColor: ColorConstants.white,
+                    ).expanded(),
+                    const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                  ],
+                ),
+              ).onTap(() {
+                if(!isDetail){
+                  controller.showChooseCityPicker();
+                }
+              }),
+            ]
+        )
+    );
+  }
+
+  Widget _buildTemplateJobDetailLocationWidget(BuildContext context, CommonLabourRequestController controller, bool isAdd, bool isEdit, bool isDetail) {
+    final state = controller.commonState;
+    return Container(
+        child: Column(
+            mainAxisAlignment: MainAxisAlignment.start,
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              // location
+              FormRequireText(
+                text: "Location:".tr,
+                isRequired: false,
+              ).marginOnly(top: 15),
+
+              CustomTextField(
+                formKey: "location",
+                marginLeft: 0,
+                marginRight: 0,
+                paddingTop: 0,
+                paddingBottom: 0,
+                height: 45,
+                fillBackgroundColor: const Color(0xFF4DCFF6).withOpacity(state.pageType == 2 ? 0.5 : 0.2),
+                enabled: state.pageType != 2,
+                textInputType: TextInputType.text,
+                formData: state.formData,
+                textInputAction: TextInputAction.done,
+                onSubmit: (key, value) {
+                  FocusScope.of(context).unfocus();
+                },
+                marginTop: 10,
+              ),
+            ]
+        )
+    );
+  }
+
   // 新增 时 的 选择日期 选择开始时间 选择结束时间
   Widget _getAddChooseDateAndTimeWidget(BuildContext context, CommonLabourRequestController controller, bool isAdd){
     final state = controller.commonState;
@@ -878,6 +969,7 @@ class CommonLabourRequestFormFields extends StatelessWidget {
           ),
         ).onTap(() {
           FocusScope.of(context).unfocus();
+          // Log.d("-----333--${state.jobStart}---${state.jobEnd}");
           controller.pickJobStart();
         }),
 

+ 4 - 1
packages/cpt_uk/lib/modules/job/labour_request_add/widget/labour_request_interface.dart

@@ -24,6 +24,8 @@ abstract class CommonLabourRequestState {
   String? get preSelectedNames;
   String? get attFilePath;
   String? get location;
+  String? get selectedCountryStr;
+  String? get selectedCityStr;
 
   List<String> selectedCertificateList = [];   //选中的 证书 certificate id
   List<String> selectedVehicleList = [];   //选中的 车辆 vehicle id
@@ -164,7 +166,6 @@ abstract class CommonLabourRequestState {
   dynamic? otherDocument;
 
 
-
   List<UkLabourRequestDetailCertificateList>? get certificateList => labReqOption?.certificateList;
   List<UkLabourRequestDetailVehicleList>? get vehicleList => labReqOption?.vehicleList;
   List<UkLabourRequestDetailChallenge25List>? get challenge25List => labReqOption?.challenge25List;
@@ -265,5 +266,7 @@ abstract class CommonLabourRequestController {
   void pickAttFile();
   void pickEmploymentType();
   void handlerSelectPreSelect();
+  void showChooseCountryPicker();
+  void showChooseCityPicker();
   void doSubmit();
 }

+ 64 - 29
packages/cpt_uk/lib/modules/job/labour_request_preselected_list/widget/preselected_add_staff.dart

@@ -8,6 +8,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter/widgets.dart';
 import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
 import 'package:get/get.dart';
+import 'package:plugin_basic/service/user_service.dart';
 import 'package:shared/utils/util.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:cs_resources/constants/color_constants.dart';
@@ -567,36 +568,70 @@ class _PreselectedAddStaffState extends State<PreselectedAddStaff> {
             //       ),
             //     ]
             // ).marginOnly(top: 5),
-            Row(
-              children: [
-                MyTextView(
-                  "CV".tr + ":",
-                  marginRight: 3,
-                  textColor: ColorConstants.black66,
-                  fontSize: 13,
-                  isFontRegular: true,
-                ),
-                Expanded(
-                  child: Container(
-                    padding: const EdgeInsets.only(right: 5),
-                    child: MyTextView(
-                      (item.resume ==null || item.resume!.isEmpty == true)? "-": item.resume!,
-                      textColor: ColorConstants.black66,
-                      fontSize: 13,
-                      isFontRegular: true,
-                      maxLines: 1,
-                      isTextEllipsis: true,
-                      onClick: (){
-                        // 点击查看 打开webview 页面
-                        if(item.resume?.isNotEmpty == true && Utils.isNetworkUrl(item.resume!)){
-                          controller.handlerScanFile(item.resume!);
-                        }
-                      },
-                    ),
+
+
+            //电话
+            Visibility(
+              visible: UserService.to.hotelInfo!.value!.mobileNumberShow?.toString() == "1"? true: false,
+              child: Row(
+                children: [
+                  MyTextView(
+                    "Phone:",
+                    marginRight: 3,
+                    textColor: ColorConstants.black66,
+                    fontSize: 13,
+                    isFontRegular: true,
                   ),
-                ),
-              ],
-            ).marginOnly(top: 5),
+                  MyTextView(
+                    item.phone??"-",
+                    textColor: ColorConstants.black66,
+                    fontSize: 13,
+                    isFontRegular: true,
+                  ),
+                ],
+              ).marginOnly(top: 5),
+            ),
+            Obx(
+                    () {
+                  return Visibility(
+                      visible: UserService.to.hotelInfo!.value!.cvShow?.toString() == "1"? true: false,
+                      child: Visibility(
+                        visible: UserService.to.hotelInfo!.value!.cvShow?.toString() == "1"? true: false,
+                        child: Row(
+                          mainAxisSize: MainAxisSize.max,
+                          children: [
+                            MyTextView(
+                              "CV".tr + ":",
+                              marginRight: 3,
+                              textColor: ColorConstants.black66,
+                              fontSize: 13,
+                              isFontRegular: true,
+                            ),
+                            Expanded(
+                              child: Container(
+                                padding: const EdgeInsets.only(right: 5),
+                                child: MyTextView(
+                                  (item.resume ==null || item.resume!.isEmpty == true)? "-": item.resume!,
+                                  textColor: ColorConstants.black66,
+                                  fontSize: 13,
+                                  isFontRegular: true,
+                                  maxLines: 1,
+                                  isTextEllipsis: true,
+                                  onClick: (){
+                                    // 点击查看 打开webview 页面
+                                    if(item.resume?.isNotEmpty == true && Utils.isNetworkUrl(item.resume!)){
+                                      controller.handlerScanFile(item.resume!);
+                                    }
+                                  },
+                                ),
+                              ),
+                            ),
+                          ],
+                        ).marginOnly(top: 5),
+                      )
+                  );
+                }
+            ),
 
             Row(
               children: [

+ 169 - 3
packages/cpt_uk/lib/modules/job/template_add/template_add_controller.dart

@@ -46,6 +46,18 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
       handlerAddDetailOptionsData(taskDetailOptionsResult);
     }
 
+    if(state.contactNoCountryCodeList.length == 0 || state.contactNoCountryCodeList == null ){
+      // 获取 country code list
+      final countryCodeListResult = await _labourRepository.fetchCountryCodeList(cancelToken: cancelToken);
+      if(countryCodeListResult.isSuccess){
+        state.contactNoCountryCodeList = countryCodeListResult.list
+            ?.map((e) => e.toString())
+            .whereType<String>()
+            .toList() ??
+            [];
+      }
+    }
+
     if (isNeedFetchDetail) {
       //编辑
       taskDetailResult = await _labourRepository.fetchJobTemplateDetail(templateId: templateId, cancelToken: cancelToken);
@@ -151,7 +163,6 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
     }
   }
 
-
   // 处理编辑的详情数据
   void handlerEditDetailData(HttpResult<UkTemplateDetailEntity> result) async {
     //处理数据
@@ -164,18 +175,39 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
         _fetchJobTitleOptionsList();
       }
 
+      state.selectedCountryStr = state.indexOptionEntity?.countryList?.firstWhere((element) => element.id == state.indexEntity?.row!.countryId, orElse: () => UkTemplateDetailIndexCountryList()).name ?? "";
+      if(Utils.isNotEmpty(state.selectedCountryStr)){
+        // 获取city 的下拉选项
+        String cityId = state.indexEntity?.row!.cityId?.toString() ?? "";
+        _fetchCityOptionsList(cityId);
+      }
+      var detailAddressController = state.formData['location']!['controller'];
+      detailAddressController.text = state.indexEntity?.row?.location ?? "";
+
       var clientNameController = state.formData['client_name']!['controller'];
       var descController = state.formData['desc']!['controller'];
       var noteController = state.formData['note']!['controller'];
       var contactNameController = state.formData['contact_name']!['controller'];
-      var contactNoController = state.formData['contact_no']!['controller'];
+
+      // 后台返回的结果
+      // "contact_country_code": 44,
+      // "contact_no": "+4418663654632",
+
+      if(Utils.isNotEmpty(state.indexEntity?.row?.contactCountryCode?.toString()?? '')){
+        // state.indexEntity?.row?.contactCountryCode 前面 拼接 +
+        state.selectedContactNoCountryCode = '+${state.indexEntity?.row?.contactCountryCode}';
+      }else {
+        state.selectedContactNoCountryCode = '+44';
+      }
 
 
+      var contactNoController = state.formData['contact_no']!['controller'];
+      contactNoController.text = state.indexEntity?.withoutCountryContactNo?.toString()??'';
+
       clientNameController.text = state.indexEntity?.row?.clientName ?? "";
       descController.text = state.indexEntity?.row?.description ?? "";
       noteController.text = state.indexEntity?.row?.note ?? "";
       contactNameController.text = state.indexEntity?.row?.contactName ?? "";
-      contactNoController.text = state.indexEntity?.row?.contactNo ?? "";
 
       // Log.d("获取详情后的 state.selectedJobTemplateStr---- ${state.selectedJobTemplateStr}");
       //
@@ -225,6 +257,13 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
     if (result.isSuccess) {
       state.indexOptionEntity = result.data;
       state.selectedJobTemplateStr = state.indexEntity?.templateTitle ?? "";
+      state.countryOptionEntityList = result.data?.countryList;
+      state.selectedCountryStr = "";
+      state.selectedCityStr = "";
+      var detailAddressController = state.formData['location']!['controller'];
+      detailAddressController.text = "";
+
+
       var clientNameController = state.formData['client_name']!['controller'];
       var descController = state.formData['desc']!['controller'];
       var noteController = state.formData['note']!['controller'];
@@ -335,6 +374,35 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
     }
   }
 
+  // 获取城市的数据源
+  void _fetchCityOptionsList(String? cityId) async {
+    LoadingEngine.show();
+    try {
+      // 获取到数据
+      HttpResult<UkTemplateDetailIndexCountryList> taskResult;
+      taskResult = await _labourRepository.fetchCityOptiosByCountry(
+        state.selectedCountryId!,
+        cancelToken: cancelToken,
+      );
+      if (taskResult.isSuccess) {
+        state.cityOptionEntityList = taskResult.list;
+        // 当前的 selectedCityStr
+        if(Utils.isEmpty(cityId)){
+          state.selectedCityStr = "";
+        }else {
+          state.selectedCityStr = taskResult.list?.firstWhere((e) => e.id.toString() == cityId, orElse: () => UkTemplateDetailIndexCountryList()).name ?? "";
+        }
+        update();
+      } else {
+        ToastEngine.show(taskResult.errorMsg ?? "Network Load Error".tr);
+      }
+    } catch (e) {
+      // Log.e(e);
+    } finally {
+      LoadingEngine.dismiss();
+    }
+  }
+
 
   // 显示工作标题picker
   void showChooseJobTitlePicker(){
@@ -361,6 +429,94 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
     );
   }
 
+  // 新增时 选择 country
+  void showChooseCountryPicker(){
+    int selectedOptionsIndex;
+    if (state.selectedCountryStr == null) {
+      selectedOptionsIndex = 0;
+    } else {
+      selectedOptionsIndex = state.indexOptionEntity?.countryList?.indexWhere((e) => e.toString() == state.selectedCountryStr)?? 0;
+    }
+
+    if (selectedOptionsIndex < 0) {
+      selectedOptionsIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: state.indexOptionEntity?.countryList?.map((e) => e.name.toString()).toList(growable: false)?? [],
+      initialSelectIndex: selectedOptionsIndex,
+      onPickerChanged: (_, index) {
+        String lastSelectedOptionsStr = state.selectedCountryStr?? "";
+        String curSelectedStr = state.indexOptionEntity?.countryList?[index].name.toString() ?? "";
+        if(lastSelectedOptionsStr != curSelectedStr){
+          state.selectedCountryStr = curSelectedStr;
+          state.selectedCityStr = "";
+          update();
+          // 需要调接口来获取工作标题的数据源
+          _fetchCityOptionsList(null);
+        }
+      },
+    );
+  }
+
+  // 新增时 选择 city
+  void showChooseCityPicker(){
+    if(Utils.isEmpty(state.selectedCountryStr)){
+      return ToastEngine.show("Please select country first");
+    }
+    int selectedOptionsIndex;
+    if (state.selectedCityStr == null) {
+      selectedOptionsIndex = 0;
+    } else {
+      selectedOptionsIndex = state.cityOptionEntityList?.indexWhere((e) => e.name?.toString() == state.selectedCityStr)?? 0;
+    }
+
+    if (selectedOptionsIndex < 0) {
+      selectedOptionsIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: state.cityOptionEntityList?.map((e) => e.name.toString()).toList(growable: false)?? [],
+      initialSelectIndex: selectedOptionsIndex,
+      onPickerChanged: (_, index) {
+        String lastSelectedOptionsStr = state.selectedCityStr?? "";
+        String curSelectedStr = state.cityOptionEntityList?[index].name.toString() ?? "";
+        if(lastSelectedOptionsStr != curSelectedStr){
+          state.selectedCityStr = curSelectedStr;
+          update();
+        }
+      },
+    );
+  }
+
+  // 新增时 选择 country code Picker
+  void showChooseCountryCodePicker(){
+    int selectedOptionsIndex;
+    if (state.selectedContactNoCountryCode == null) {
+      selectedOptionsIndex = 0;
+    } else {
+      selectedOptionsIndex = state.contactNoCountryCodeList?.indexWhere((template) => template.toString() == state.selectedContactNoCountryCode)?? 0;
+    }
+
+    if (selectedOptionsIndex < 0) {
+      selectedOptionsIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: state.contactNoCountryCodeList?.map((e) => e!).toList(growable: false)?? [],
+      initialSelectIndex: selectedOptionsIndex,
+      onPickerChanged: (_, index) {
+        String lastSelectedStr = state.selectedContactNoCountryCode?? "";
+        String curSelectedStr = state.contactNoCountryCodeList?[index] ?? "";
+        if(lastSelectedStr != curSelectedStr){
+          state.selectedContactNoCountryCode = curSelectedStr;
+          update();
+        }
+      },
+    );
+  }
+
+
   /// 提交
   void doSubmit() async {
     Log.d("提交时  state.selectedCertificateList ${state.selectedCertificateList}");
@@ -370,6 +526,7 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
     var noteController = state.formData['note']!['controller'];
     var contactNameController = state.formData['contact_name']!['controller'];
     var contactNoController = state.formData['contact_no']!['controller'];
+    var detailAddressController = state.formData['location']!['controller'];
 
 
 
@@ -380,6 +537,7 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
     String note = noteController.text.toString();
     String contactName = contactNameController.text.toString();
     String contactNo = contactNoController.text.toString();
+    String detailAddress = detailAddressController.text.toString();
 
     if (Utils.isEmpty(jobTemplate)) {
       ToastEngine.show("Enter Job Template".tr);
@@ -400,12 +558,16 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
         jobTemplateId: state.selectedJobTitleId?.toString()??'',
         jobTitle: jobTitle,
         clientName: clientName,
+        countryId: state.selectedCountryId?.toString()??'',
+        cityId: state.selectedCityId?.toString()??'',
+        location: detailAddress,
         certificate: state.selectedCertificateList,
         vehicle: state.selectedVehicleList,
         challenge25: state.selectedChallenge25Id,
         desc: desc,
         note: note,
         contactName: contactName,
+        contactCountryCode: state.selectedContactNoCountryCode,
         contactNo: contactNo,
         cancelToken: cancelToken,
       );
@@ -415,12 +577,16 @@ class TemplateAddController extends GetxController with DioCancelableMixin {
         jobTemplateId: state.selectedJobTitleId?.toString()??'',
         jobTitle: state.selectedJobTitleStr?? '',
         clientName: clientName,
+        countryId: state.selectedCountryId?.toString()??'',
+        cityId: state.selectedCityId?.toString()??'',
+        location: detailAddress,
         certificate: state.selectedCertificateList,
         vehicle: state.selectedVehicleList,
         challenge25: state.selectedChallenge25Id,
         desc: desc,
         note: note,
         contactName: contactName,
+        contactCountryCode: state.selectedContactNoCountryCode,
         contactNo: contactNo,
         cancelToken: cancelToken,
       );

+ 169 - 11
packages/cpt_uk/lib/modules/job/template_add/template_add_page.dart

@@ -122,6 +122,10 @@ class _LabourTemplateAddState extends BaseState<UKTemplateAddPage, TemplateAddCo
                             marginTop: 10,
                           ),
 
+                          // 国家 和 城市
+                          _buildTemplateJobCountryAndCityWidget(),
+                          // 详细地址 location
+                          _buildTemplateJobDetailLocationWidget(),
 
                           //证书
                           Visibility(
@@ -246,18 +250,66 @@ class _LabourTemplateAddState extends BaseState<UKTemplateAddPage, TemplateAddCo
 
                           // 联系人电话 Contact No
                           FormRequireText(text: "Contact No".tr, isRequired: false,).marginOnly(left: 15, top: 19),
-                          CustomTextField(
-                            formKey: "contact_no",
-                            formData: state.formData,
-                            height: 46,
-                            fontSize: 14,
-                            onSubmit: (key, value) {
-                              state.formData[key]!['focusNode'].unfocus();
-                              FocusScope.of(context).requestFocus(state.formData['note']!['focusNode']);
-                            },
-                            marginTop: 10,
+                          Container(
+                            padding: const EdgeInsets.only(left: 16, right: 0),
+                            margin: const EdgeInsets.only(top: 10),
+                            width: double.infinity, // 设置固定宽度
+                            // decoration: BoxDecoration(
+                            //   // color:  const Color(0xFF4DCFF6).withOpacity(0.2),
+                            //   borderRadius: BorderRadius.all(Radius.circular(5)),
+                            // ),
+                            child: Row(
+                              mainAxisSize: MainAxisSize.max,
+                              crossAxisAlignment: CrossAxisAlignment.center,
+                              mainAxisAlignment: MainAxisAlignment.start,
+                              children: [
+                                Container(
+                                  height: 50,
+                                  width: 60,
+                                  padding: EdgeInsets.only(left: 5, right:5),
+                                  decoration: BoxDecoration(
+                                    color:  const Color(0xFF4DCFF6).withOpacity(0.2),
+                                    borderRadius: BorderRadius.all(Radius.circular(5)),
+                                  ),
+                                  child: Row(
+                                    mainAxisSize: MainAxisSize.max,
+                                    crossAxisAlignment: CrossAxisAlignment.center,
+                                    children: [
+                                      MyTextView(
+                                        state.selectedContactNoCountryCode ==null || Utils.isEmpty(state.selectedContactNoCountryCode)? '': state.selectedContactNoCountryCode! ,
+                                        hint: "Choose Country Code".tr,
+                                        textHintColor: ColorConstants.textGrayAECAE5,
+                                        fontSize: 14,
+                                        isFontMedium: true,
+                                        textColor: ColorConstants.white,
+                                        marginRight: 5,
+                                        marginLeft: 5,
+                                      ),
+                                      const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                                    ]
+                                  ).onTap(() {
+                                    controller.showChooseCountryCodePicker();
+                                  }),
+                                ),
+                                Expanded(
+                                  flex: 1,
+                                  child: CustomTextField(
+                                    formKey: "contact_no",
+                                    formData: state.formData,
+                                    // height: 30,
+                                    fontSize: 14,
+                                    onSubmit: (key, value) {
+                                      state.formData[key]!['focusNode'].unfocus();
+                                      FocusScope.of(context).requestFocus(state.formData['note']!['focusNode']);
+                                    },
+                                    // marginTop: 10,
+                                  ),
+                                ),
+                              ],
+                            ),
                           ),
 
+
                           //备注
                           MyTextView(
                             "Note".tr,
@@ -432,7 +484,6 @@ class _LabourTemplateAddState extends BaseState<UKTemplateAddPage, TemplateAddCo
     );
   }
 
-
   Widget _buildTemplateJobTitleWidget() {
     return Container(
       margin: const EdgeInsets.only(left: 15, right: 15,),
@@ -475,4 +526,111 @@ class _LabourTemplateAddState extends BaseState<UKTemplateAddPage, TemplateAddCo
     );
   }
 
+  Widget _buildTemplateJobCountryAndCityWidget(){
+    return Container(
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.start,
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          Padding(
+            padding: const EdgeInsets.only(left: 15),
+            child: FormRequireText(text: "Country".tr, isRequired: false).marginOnly(top: 15),
+          ),
+          //选择国家
+          Padding(
+            padding: const EdgeInsets.only(left: 15, right: 15),
+            child: Container(
+              padding: const EdgeInsets.only(left: 16, right: 10),
+              margin: const EdgeInsets.only(top: 10),
+              height: 45,
+              decoration: BoxDecoration(
+                color:  const Color(0xFF4DCFF6).withOpacity(0.2),
+                borderRadius: BorderRadius.all(Radius.circular(5)),
+              ),
+              child: Row(
+                mainAxisSize: MainAxisSize.max,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                mainAxisAlignment: MainAxisAlignment.start,
+                children: [
+                  MyTextView(
+                    state.selectedCountryStr ==null || Utils.isEmpty(state.selectedCountryStr)? '': state.selectedCountryStr! ,
+                    hint: "Choose Country".tr,
+                    textHintColor: ColorConstants.textGrayAECAE5,
+                    fontSize: 14,
+                    isFontMedium: true,
+                    textColor: ColorConstants.white,
+                  ).expanded(),
+                  const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                ],
+              ),
+            ).onTap(() {
+              controller.showChooseCountryPicker();
+            }),
+          ),
+
+          Padding(
+            padding: const EdgeInsets.only(left: 15),
+            child: FormRequireText(text: "City".tr, isRequired: false).marginOnly(top: 15),
+          ),
+          //选择城市
+          Padding(
+            padding: const EdgeInsets.only(left: 15, right: 15),
+            child: Container(
+              padding: const EdgeInsets.only(left: 16, right: 10),
+              margin: const EdgeInsets.only(top: 10),
+              height: 45,
+              decoration: BoxDecoration(
+                color:  const Color(0xFF4DCFF6).withOpacity(0.2),
+                borderRadius: BorderRadius.all(Radius.circular(5)),
+              ),
+              child: Row(
+                mainAxisSize: MainAxisSize.max,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                mainAxisAlignment: MainAxisAlignment.start,
+                children: [
+                  MyTextView(
+                    state.selectedCityStr ==null || Utils.isEmpty(state.selectedCityStr)? '': state.selectedCityStr! ,
+                    hint: "Choose City".tr,
+                    textHintColor: ColorConstants.textGrayAECAE5,
+                    fontSize: 14,
+                    isFontMedium: true,
+                    textColor: ColorConstants.white,
+                  ).expanded(),
+                  const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                ],
+              ),
+            ).onTap(() {
+              controller.showChooseCityPicker();
+            }),
+          ),
+        ]
+      )
+    );
+  }
+
+  Widget _buildTemplateJobDetailLocationWidget() {
+    return Container(
+      child: Column(
+        mainAxisAlignment: MainAxisAlignment.start,
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          Padding(
+            padding: const EdgeInsets.only(left:15, right: 15),
+            child: FormRequireText(text: "Location".tr, isRequired: false,).marginOnly(top: 15),
+          ),
+          CustomTextField(
+            formKey: "location",
+            formData: state.formData,
+            height: 46,
+            fontSize: 14,
+            onSubmit: (key, value) {
+              state.formData[key]!['focusNode'].unfocus();
+              FocusScope.of(context).requestFocus(state.formData['contact_name']!['focusNode']);
+            },
+            marginTop: 10,
+          ),
+        ]
+      )
+    );
+  }
 }

+ 36 - 0
packages/cpt_uk/lib/modules/job/template_add/template_add_state.dart

@@ -22,6 +22,13 @@ class LabourTemplateAddState {
       'hintText': 'Enter...'.tr,
       'obsecure': false,
     },
+    'location': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Enter...'.tr,
+      'obsecure': false,
+    },
     'contact_name': {
       'value': '',
       'controller': TextEditingController(),
@@ -71,6 +78,31 @@ class LabourTemplateAddState {
   List<UkTemplateTitleOptionEntity>? jobTitleOptionEntityList; // 新增时工作标题的数据源
   String? selectedJobTitleStr;  // 新增时选择的工作标题
 
+  String? selectedCountryStr;  // 新增时选择的国家
+  List<UkTemplateDetailIndexCountryList>? countryOptionEntityList; // 新增时国家数据源
+  String? get selectedCountryId {
+    // 遍历 countryOptionEntityList 中获取 对应的 selectedCountryStr 的 id
+    final country = countryOptionEntityList?.firstWhere(
+          (e) => e.name?.toString() == selectedCountryStr,
+      orElse: () => UkTemplateDetailIndexCountryList(),
+    );
+    return country?.id?.toString();
+  }
+
+
+  String? selectedCityStr; // 新增时选择的城市
+  List<UkTemplateDetailIndexCountryList>? cityOptionEntityList; // 新增时城市数据源
+  String? get selectedCityId {
+    // 遍历 cityOptionEntityList 中获取 对应的 selectedCityStr 的 id
+    final city = cityOptionEntityList?.firstWhere(
+          (e) => e.name?.toString() == selectedCityStr,
+      orElse: () => UkTemplateDetailIndexCountryList(),
+    );
+    return city?.id?.toString();
+  }
+
+
+
   UkTemplateDetailEntity? indexEntity;  //新增或者编辑的详情
 
   UkTemplateDetailIndexEntity? indexOptionEntity; // 详情页的 数据源
@@ -78,4 +110,8 @@ class LabourTemplateAddState {
   List<String> selectedCertificateList = [];   //选中的 age 的 id
   List<String> selectedVehicleList = [];   //选中的 language 的 id
   String? selectedChallenge25Id; // 选中的 challenge25 的 id
+
+  String selectedContactNoCountryCode = "+44";
+  String get withoutSelectedContactNoCountryCode => selectedContactNoCountryCode.replaceAll("+", "");
+  List<String> contactNoCountryCodeList = [];
 }

+ 2 - 0
packages/cpt_uk/lib/modules/main/main_controller.dart

@@ -12,6 +12,7 @@ import 'package:plugin_basic/service/app_config_service.dart';
 import 'package:plugin_basic/service/user_service.dart';
 import 'package:plugin_platform/engine/sp/sp_util.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:router/componentRouter/component_router_service.dart';
@@ -62,6 +63,7 @@ class MainController extends GetxController {
 
     //处理数据
     if (result.isSuccess) {
+      Log.d("获取到数据  ${result.data}");
       final hotelInfo = result.data;
 
       if (hotelInfo != null) {

+ 150 - 0
packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_controller.dart

@@ -4,7 +4,9 @@ import 'package:cpt_uk/modules/job/labour_request_add/widget/labour_request_inte
 import 'package:cpt_uk/modules/job/labour_request_preselected_list/widget/preselected_add_staff.dart';
 import 'package:cpt_uk/widget/date_range_picker_dialog.dart';
 import 'package:domain/entity/response/labour_request_edit_index_entity.dart';
+import 'package:domain/entity/response/uk_lab_req_show_template_entity.dart';
 import 'package:domain/entity/response/uk_labour_request_detail_entity.dart';
+import 'package:domain/entity/response/uk_template_detail_index_entity.dart';
 import 'package:domain/repository/labour_repository.dart';
 import 'package:domain/repository/uk_job_repository.dart';
 import 'package:domain/repository/uk_labour_repository.dart';
@@ -12,6 +14,7 @@ import 'package:flutter/cupertino.dart';
 import 'package:get/get.dart';
 import 'package:plugin_basic/constants/app_constant.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/engine/loading/loading_engine.dart';
 import 'package:plugin_platform/engine/notify/notify_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
@@ -114,6 +117,9 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
         // 新增
         state.noStaff = '';
         state.amount =  '';
+        state.selectedCountryStr = '';
+        state.selectedCityStr = '';
+        state.location = '';
         // choose Type 下拉里面 永远只有一个选项 所以默认选择第一个
         if (state.labReqOption?.employmentList != null && state.labReqOption!.employmentList!.isNotEmpty) {
           state.selectedTypeId = state.labReqOption!.employmentList?.first.value.toString();
@@ -121,6 +127,30 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
       }else {
         state.noStaff = state.labReqOption?.needNum?.toString() == "0" ? "" : state.labReqOption?.needNum.toString();
         state.amount = state.labReqOption?.amount?.toString() == "0" ? "" : state.labReqOption?.amount.toString();
+
+        //  state.labReqOption.countryList 中找到  selected 为  true 的项
+        int? countryIndex = state.labReqOption?.countryList?.indexWhere((e) => e.selected == "selected") ?? -1;
+        if(countryIndex != -1){
+          state.selectedCountryStr = state.labReqOption?.countryList?[countryIndex].txt.toString();
+
+          // state.labReqOption?.countryList 遍历后 创建 state.countryOptionEntityList
+          state.countryOptionEntityList = state.labReqOption?.countryList
+              ?.map((item) => UkLabReqShowTemplateCountryList()
+            ..id = item.value
+            ..name = item.txt
+          ).toList();
+        }
+
+        //  state.labReqOption.cityList 中找到  selected 为  true 的项
+        int? cityIndex = state.labReqOption?.cityList?.indexWhere((e) => e.selected == "selected") ?? -1;
+        if(cityIndex != -1){
+          state.selectedCityStr = state.labReqOption?.cityList?[cityIndex].txt.toString();
+          state.cityOptionEntityList = state.labReqOption?.cityList
+              ?.map((item) => UkLabReqShowTemplateCityList()
+            ..id = item.value
+            ..name = item.txt
+          ).toList();
+        }
       }
 
       var needNumController = state.formData['no_of_staff']!['controller'];
@@ -329,6 +359,24 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
           Log.d("切换模板后, 证书的回显 vehicleList: ${state.labReqOption?.challenge25List}");
 
         }
+
+        // 回显 国家 城市 location
+        if(state.showTemplateData?.countryId != null){
+          state.location = state.showTemplateData?.location.toString();
+
+          state.selectedCountryStr = state.showTemplateData?.countryList?.firstWhere(
+                (element) => element.id.toString() == state.showTemplateData?.countryId.toString(),
+            orElse: () => UkLabReqShowTemplateCountryList(),
+          )?.name;
+          state.countryOptionEntityList = state.showTemplateData?.countryList??[];
+
+          state.selectedCityStr = state.showTemplateData?.cityList?.firstWhere(
+                (element) => element.id.toString() == state.showTemplateData?.cityId.toString(),
+            orElse: () => UkLabReqShowTemplateCityList(),
+          )?.name;
+          state.cityOptionEntityList = state.showTemplateData?.cityList??[];
+        }
+
         // 更新
         update();
       }
@@ -594,6 +642,8 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
       "jobEnd": "${DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd')} ${DateTimeUtils.formatDate(state.selectedEndTime, format: 'HH:mm')}:00",
       "departmentId": state.selectedDepartmentId,
       "needNum": needNum,
+      "countryId": state.selectedCountryId,
+      "cityId": state.selectedCityId,
       "location": location,
       "salaryBy": 'hour',
       "amount": state.labReqOption?.serviceType == 1 ? amount : null,
@@ -626,6 +676,8 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
       jobEnd: params['jobEnd'],
       departmentId: params['departmentId'],
       needNum: params['needNum'],
+      countryId: params['countryId'],
+      cityId: params['cityId'],
       location: params['location'],
       salaryBy: params['salaryBy'],
       amount: params['amount'],
@@ -670,4 +722,102 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
     }
   }
 
+
+  // 新增时 选择 country
+  @override
+  void showChooseCountryPicker(){
+    if(Utils.isEmpty(state.selectedTemplateId)){
+      return ToastEngine.show("Please select jobTitle");
+    }
+    int selectedOptionsIndex;
+    if (state.selectedCountryStr == null) {
+      selectedOptionsIndex = 0;
+    } else {
+      selectedOptionsIndex = state.countryOptionEntityList?.indexWhere((e) => e.name.toString() == state.selectedCountryStr)?? 0;
+    }
+
+    if (selectedOptionsIndex < 0) {
+      selectedOptionsIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: state.countryOptionEntityList?.map((e) => e.name.toString()).toList(growable: false)?? [],
+      initialSelectIndex: selectedOptionsIndex,
+      onPickerChanged: (_, index) async {
+        String lastSelectedOptionsStr = state.selectedCountryStr?? "";
+        String curSelectedStr = state.countryOptionEntityList?[index].name.toString() ?? "";
+        Log.d("当前选择的国家:$curSelectedStr");
+        if(lastSelectedOptionsStr != curSelectedStr){
+          state.selectedCountryStr = curSelectedStr;
+          state.selectedCityStr = "";
+          update();
+          // 需要调接口来获取工作标题的数据源
+          await _fetchCityOptionsList(null);
+        }
+      },
+    );
+  }
+
+  @override
+  // 新增时 选择 city
+  void showChooseCityPicker(){
+    if(Utils.isEmpty(state.selectedCountryStr)){
+      return ToastEngine.show("Please select country first");
+    }
+    int selectedOptionsIndex;
+    if (state.selectedCityStr == null) {
+      selectedOptionsIndex = 0;
+    } else {
+      selectedOptionsIndex = state.cityOptionEntityList?.indexWhere((e) => e.name?.toString() == state.selectedCityStr)?? 0;
+    }
+
+    if (selectedOptionsIndex < 0) {
+      selectedOptionsIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: state.cityOptionEntityList?.map((e) => e.name.toString()).toList(growable: false)?? [],
+      initialSelectIndex: selectedOptionsIndex,
+      onPickerChanged: (_, index) {
+        String lastSelectedOptionsStr = state.selectedCityStr?? "";
+        String curSelectedStr = state.cityOptionEntityList?[index].name.toString() ?? "";
+        if(lastSelectedOptionsStr != curSelectedStr){
+          state.selectedCityStr = curSelectedStr;
+          update();
+        }
+      },
+    );
+  }
+
+
+  // 获取城市的数据源
+  Future _fetchCityOptionsList(String? cityId) async {
+    LoadingEngine.show();
+    try {
+      // 获取到数据
+      HttpResult<UkTemplateDetailIndexCountryList> taskResult;
+      taskResult = await _ukJobRepository.fetchCityOptiosByCountry(
+        state.selectedCountryId!,
+        cancelToken: cancelToken,
+      );
+      if (taskResult.isSuccess) {
+        state.cityOptionEntityList = taskResult.list!.map((e) => UkLabReqShowTemplateCityList.fromJson(e.toJson())).toList();
+        // 当前的 selectedCityStr
+        if(Utils.isEmpty(cityId)){
+          state.selectedCityStr = "";
+        }else {
+          state.selectedCityStr = taskResult.list?.firstWhere((e) => e.id.toString() == cityId, orElse: () => UkTemplateDetailIndexCountryList()).name ?? "";
+        }
+        update();
+      } else {
+        ToastEngine.show(taskResult.errorMsg ?? "Network Load Error".tr);
+      }
+    } catch (e) {
+      // Log.e(e);
+    } finally {
+      LoadingEngine.dismiss();
+    }
+  }
+
+
 }

+ 24 - 0
packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_state.dart

@@ -181,4 +181,28 @@ class LabourReviewEditState implements CommonLabourRequestState {
   @override
   List<FileFieldItem> uploadFieldList = [];
 
+
+  @override
+  String? selectedCountryStr;
+  List<UkLabReqShowTemplateCountryList>? countryOptionEntityList; // 新增时国家数据源
+  String? get selectedCountryId {
+    // 遍历 countryOptionEntityList 中获取 对应的 selectedCountryStr 的 id
+    final country = countryOptionEntityList?.firstWhere(
+          (e) => e.name?.toString() == selectedCountryStr,
+      orElse: () => UkLabReqShowTemplateCountryList(),
+    );
+    return country?.id?.toString();
+  }
+
+  @override
+  String? selectedCityStr;
+  List<UkLabReqShowTemplateCityList>? cityOptionEntityList; // 新增时城市数据源
+  String? get selectedCityId {
+    // 遍历 cityOptionEntityList 中获取 对应的 selectedCityStr 的 id
+    final city = cityOptionEntityList?.firstWhere(
+          (e) => e.name?.toString() == selectedCityStr,
+      orElse: () => UkLabReqShowTemplateCityList(),
+    );
+    return city?.id?.toString();
+  }
 }

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

@@ -287,6 +287,13 @@ class ApiConstants {
   static const apiReviseLogListSG = "/index.php/api/v1/hotel/revise/logs";
 
   // =========================== 英国特有的一些接口 ↓=========================================
+
+  static const apiAccountInfoUk = "/index.php/api/v1/hotel/info";
+
+  // 工作详情中 根据所选国家 获取城市选项
+  static const apiCityOptionsUK = "/index.php/api/v1/hotel/temp/show-city";
+  // 添加工作模板 获取countrycode lIST
+  static const apiCountryCodeOptionsUK = "/index.php/api/v1/hotel/temp/show-country-code";
   // 添加工作模板 获取 工作模板 和 证书列表 和 交通工具 选项
   static const apiJobTemplateAddIndexUK = "/index.php/api/v1/hotel/temp/add-view";
   // 获取工作模板详情

+ 70 - 67
packages/cs_domain/lib/entity/response/hotel_info_entity.dart

@@ -1,68 +1,71 @@
-import 'package:domain/generated/json/base/json_field.dart';
-import 'package:domain/generated/json/hotel_info_entity.g.dart';
-import 'dart:convert';
-export 'package:domain/generated/json/hotel_info_entity.g.dart';
-
-@JsonSerializable()
-class HotelInfoEntity {
-	@JSONField(name: "admin_id")
-	int? adminId = 0;
-	String? name = '';
-	@JSONField(name: "hotel_id")
-	int? hotelId = 0;
-	@JSONField(name: "hotel_name")
-	String? hotelName = '';
-	List<HotelInfoMenus>? menus = [];
-	String? token = '';
-
-	HotelInfoEntity();
-
-	factory HotelInfoEntity.fromJson(Map<String, dynamic> json) => $HotelInfoEntityFromJson(json);
-
-	Map<String, dynamic> toJson() => $HotelInfoEntityToJson(this);
-
-	@override
-	String toString() {
-		return jsonEncode(this);
-	}
-}
-
-@JsonSerializable()
-class HotelInfoMenus {
-	String? key = '';
-	String? name = '';
-	String? route = '';  //泰国的根据这个判断类型
-	@JSONField(name: "red_dot")
-	String? redDot = '';
-	bool own = false;
-
-	List<HotelInfoMenusChildren>? children = [];
-
-	HotelInfoMenus();
-
-	factory HotelInfoMenus.fromJson(Map<String, dynamic> json) => $HotelInfoMenusFromJson(json);
-
-	Map<String, dynamic> toJson() => $HotelInfoMenusToJson(this);
-
-	@override
-	String toString() {
-		return jsonEncode(this);
-	}
-}
-
-@JsonSerializable()
-class HotelInfoMenusChildren {
-	String? key = '';
-	String? name = '';
-
-	HotelInfoMenusChildren();
-
-	factory HotelInfoMenusChildren.fromJson(Map<String, dynamic> json) => $HotelInfoMenusChildrenFromJson(json);
-
-	Map<String, dynamic> toJson() => $HotelInfoMenusChildrenToJson(this);
-
-	@override
-	String toString() {
-		return jsonEncode(this);
-	}
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/hotel_info_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/hotel_info_entity.g.dart';
+
+@JsonSerializable()
+class HotelInfoEntity {
+	@JSONField(name: 'admin_id')
+	int? adminId;
+	String? name;
+	@JSONField(name: 'hotel_id')
+	int? hotelId;
+	@JSONField(name: 'hotel_name')
+	String? hotelName;
+	@JSONField(name: 'cv_show')
+	int? cvShow;  // 英国 显示cv 证书 需要用到
+	@JSONField(name: 'mobile_number_show')
+	int? mobileNumberShow;  // 英国 显示手机号 需要用到
+	List<HotelInfoMenus>? menus;
+	String? token = '';
+
+	HotelInfoEntity();
+
+	factory HotelInfoEntity.fromJson(Map<String, dynamic> json) => $HotelInfoEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $HotelInfoEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class HotelInfoMenus {
+	String? key = '';
+	String? name = '';
+	String? route = '';  //泰国的根据这个判断类型
+	@JSONField(name: "red_dot")
+	String? redDot = '';
+	bool own = false;
+	List<HotelInfoMenusChildren>? children;
+
+	HotelInfoMenus();
+
+	factory HotelInfoMenus.fromJson(Map<String, dynamic> json) => $HotelInfoMenusFromJson(json);
+
+	Map<String, dynamic> toJson() => $HotelInfoMenusToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class HotelInfoMenusChildren {
+	String? key;
+	String? name;
+
+	HotelInfoMenusChildren();
+
+	factory HotelInfoMenusChildren.fromJson(Map<String, dynamic> json) => $HotelInfoMenusChildrenFromJson(json);
+
+	Map<String, dynamic> toJson() => $HotelInfoMenusChildrenToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
 }

+ 57 - 12
packages/cs_domain/lib/entity/response/uk_lab_req_show_template_entity.dart

@@ -6,13 +6,15 @@ export 'package:domain/generated/json/uk_lab_req_show_template_entity.g.dart';
 @JsonSerializable()
 class UkLabReqShowTemplateEntity {
 	int? id;
-	@JSONField(name: "company_id")
+	@JSONField(name: 'company_id')
 	int? companyId;
-	@JSONField(name: "job_title")
+	@JSONField(name: 'job_title')
 	String? jobTitle;
-	@JSONField(name: "contact_name")
+	@JSONField(name: 'contact_name')
 	String? contactName;
-	@JSONField(name: "contact_no")
+	@JSONField(name: 'contact_country_code')
+	int? contactCountryCode;
+	@JSONField(name: 'contact_no')
 	String? contactNo;
 	String? vehicle;
 	String? certificate;
@@ -21,22 +23,31 @@ class UkLabReqShowTemplateEntity {
 	int? gender;
 	String? description;
 	String? note;
-	@JSONField(name: "operator_id")
+	@JSONField(name: 'operator_id')
 	int? operatorId;
-	@JSONField(name: "created_at")
+	@JSONField(name: 'created_at')
 	String? createdAt;
-	@JSONField(name: "updated_at")
+	@JSONField(name: 'updated_at')
 	String? updatedAt;
-	@JSONField(name: "deleted_at")
+	@JSONField(name: 'deleted_at')
 	dynamic deletedAt;
-	@JSONField(name: "template_id")
+	@JSONField(name: 'template_id')
 	int? templateId;
-	@JSONField(name: "job_title_id")
+	@JSONField(name: 'job_title_id')
 	int? jobTitleId;
-	@JSONField(name: "client_name")
+	@JSONField(name: 'client_name')
 	String? clientName;
-	@JSONField(name: "challenge_25")
+	@JSONField(name: 'challenge_25')
 	int? challenge25;
+	@JSONField(name: 'country_id')
+	int? countryId;
+	@JSONField(name: 'city_id')
+	int? cityId;
+	String? location;
+	@JSONField(name: 'country_list')
+	List<UkLabReqShowTemplateCountryList>? countryList;
+	@JSONField(name: 'city_list')
+	List<UkLabReqShowTemplateCityList>? cityList;
 
 	UkLabReqShowTemplateEntity();
 
@@ -48,4 +59,38 @@ class UkLabReqShowTemplateEntity {
 	String toString() {
 		return jsonEncode(this);
 	}
+}
+
+@JsonSerializable()
+class UkLabReqShowTemplateCountryList {
+	int? id;
+	String? name;
+
+	UkLabReqShowTemplateCountryList();
+
+	factory UkLabReqShowTemplateCountryList.fromJson(Map<String, dynamic> json) => $UkLabReqShowTemplateCountryListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkLabReqShowTemplateCountryListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkLabReqShowTemplateCityList {
+	int? id;
+	String? name;
+
+	UkLabReqShowTemplateCityList();
+
+	factory UkLabReqShowTemplateCityList.fromJson(Map<String, dynamic> json) => $UkLabReqShowTemplateCityListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkLabReqShowTemplateCityListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
 }

+ 69 - 29
packages/cs_domain/lib/entity/response/uk_labour_request_detail_entity.dart

@@ -5,66 +5,70 @@ export 'package:domain/generated/json/uk_labour_request_detail_entity.g.dart';
 
 @JsonSerializable()
 class UkLabourRequestDetailEntity {
-	@JSONField(name: "request_id")
+	@JSONField(name: 'request_id')
 	int? requestId;
-	@JSONField(name: "job_title")
+	@JSONField(name: 'job_title')
 	String? jobTitle;
-	@JSONField(name: "job_start")
+	@JSONField(name: 'job_start')
 	String? jobStart;
-	@JSONField(name: "job_end")
+	@JSONField(name: 'job_end')
 	String? jobEnd;
-	@JSONField(name: "need_num")
+	@JSONField(name: 'need_num')
 	int? needNum;
-	@JSONField(name: "department_id")
+	@JSONField(name: 'department_id')
 	int? departmentId;
-	@JSONField(name: "template_id")
+	@JSONField(name: 'template_id')
 	int? templateId;
 	String? location;
-	@JSONField(name: "service_type")
+	@JSONField(name: 'service_type')
 	int? serviceType;
-	@JSONField(name: "salary_by")
+	@JSONField(name: 'salary_by')
 	String? salaryBy;
 	int? amount;
-	@JSONField(name: "employment_type")
+	@JSONField(name: 'employment_type')
 	int? employmentType;
-	@JSONField(name: "event_name")
-	dynamic eventName;
-	@JSONField(name: "event_type")
-	dynamic eventType;
+	@JSONField(name: 'event_name')
+	String? eventName;
+	@JSONField(name: 'event_type')
+	String? eventType;
 	int? passengers;
-	@JSONField(name: "est_revenue")
+	@JSONField(name: 'est_revenue')
 	dynamic estRevenue;
 	String? position;
 	String? description;
-	@JSONField(name: "att_url")
+	@JSONField(name: 'att_url')
 	String? attUrl;
-	@JSONField(name: "est_cost")
+	@JSONField(name: 'est_cost')
 	String? estCost;
-	@JSONField(name: "est_ratio")
+	@JSONField(name: 'est_ratio')
 	String? estRatio;
-	@JSONField(name: "video_text")
+	@JSONField(name: 'video_text')
 	String? videoText;
-	@JSONField(name: "video_cover")
+	@JSONField(name: 'video_cover')
 	String? videoCover;
 	String? video;
-	@JSONField(name: "other_image")
+	@JSONField(name: 'other_image')
 	String? otherImage;
-	@JSONField(name: "other_document")
+	@JSONField(name: 'other_document')
 	String? otherDocument;
-	@JSONField(name: "certificate_list")
+	@JSONField(name: 'certificate_list')
 	List<UkLabourRequestDetailCertificateList>? certificateList;
-	@JSONField(name: "vehicle_list")
+	@JSONField(name: 'vehicle_list')
 	List<UkLabourRequestDetailVehicleList>? vehicleList;
-	@JSONField(name: "challenge_25_list")
+	@JSONField(name: 'challenge_25_list')
 	List<UkLabourRequestDetailChallenge25List>? challenge25List;
-	@JSONField(name: "template_list")
+	@JSONField(name: 'template_list')
 	List<UkLabourRequestDetailTemplateList>? templateList;
-	@JSONField(name: "department_list")
+	@JSONField(name: 'department_list')
 	List<UkLabourRequestDetailDepartmentList>? departmentList;
-	@JSONField(name: "charge_list")
+	@JSONField(name: 'charge_list')
 	List<UkLabourRequestDetailChargeList>? chargeList;
-	@JSONField(name: "employment_list")
+	@JSONField(name: 'employment_list')
 	List<UkLabourRequestDetailEmploymentList>? employmentList;
+	@JSONField(name: 'country_list')
+	List<UkLabourRequestDetailCountryList>? countryList;
+	@JSONField(name: 'city_list')
+	List<UkLabourRequestDetailCityList>? cityList;
 
 	UkLabourRequestDetailEntity();
 
@@ -202,4 +206,40 @@ class UkLabourRequestDetailEmploymentList {
 	String toString() {
 		return jsonEncode(this);
 	}
+}
+
+@JsonSerializable()
+class UkLabourRequestDetailCountryList {
+	int? value;
+	String? txt;
+	String? selected;
+
+	UkLabourRequestDetailCountryList();
+
+	factory UkLabourRequestDetailCountryList.fromJson(Map<String, dynamic> json) => $UkLabourRequestDetailCountryListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkLabourRequestDetailCountryListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkLabourRequestDetailCityList {
+	int? value;
+	String? txt;
+	String? selected;
+
+	UkLabourRequestDetailCityList();
+
+	factory UkLabourRequestDetailCityList.fromJson(Map<String, dynamic> json) => $UkLabourRequestDetailCityListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkLabourRequestDetailCityListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
 }

+ 7 - 6
packages/cs_domain/lib/entity/response/uk_labour_request_preselect_addstaff_list_entity.dart

@@ -24,22 +24,23 @@ class UkLabourRequestPreselectAddstaffListEntity {
 class UkLabourRequestPreselectAddstaffListRows {
 	int? id;
 	String? name;
-	@JSONField(name: "is_favourite")
+	@JSONField(name: 'is_favourite')
 	int? isFavourite;
 	String? gender;
 	String? nric;
-	@JSONField(name: "profile_picture")
+	String? phone;
+	@JSONField(name: 'profile_picture')
 	String? profilePicture;
 	int? status;
-	@JSONField(name: "reviews_avg")
+	@JSONField(name: 'reviews_avg')
 	String? reviewsAvg;
 	String? skills;
-	@JSONField(name: "skills_short")
+	@JSONField(name: 'skills_short')
 	String? skillsShort;
 	String? resume;
-	@JSONField(name: "turn_up_rate")
+	@JSONField(name: 'turn_up_rate')
 	String? turnUpRate;
-	@JSONField(name: "apply_state")
+	@JSONField(name: 'apply_state')
 	int? applyState;
 
 	bool isSelected = false;

+ 67 - 20
packages/cs_domain/lib/entity/response/uk_template_detail_entity.dart

@@ -6,19 +6,25 @@ export 'package:domain/generated/json/uk_template_detail_entity.g.dart';
 @JsonSerializable()
 class UkTemplateDetailEntity {
 	UkTemplateDetailRow? row;
-	@JSONField(name: "job_template_id")
+	@JSONField(name: 'without_country_contact_no')
+	String? withoutCountryContactNo;
+	@JSONField(name: 'country_list')
+	List<UkTemplateDetailCountryList>? countryList;
+	@JSONField(name: 'city_list')
+	List<UkTemplateDetailCityList>? cityList;
+	@JSONField(name: 'job_template_id')
 	int? jobTemplateId;
-	@JSONField(name: "template_list")
+	@JSONField(name: 'template_list')
 	List<String>? templateList;
-	@JSONField(name: "template_title")
+	@JSONField(name: 'template_title')
 	String? templateTitle;
-	@JSONField(name: "title_list")
+	@JSONField(name: 'title_list')
 	List<UkTemplateDetailTitleList>? titleList;
-	@JSONField(name: "certificate_list")
+	@JSONField(name: 'certificate_list')
 	List<UkTemplateDetailCertificateList>? certificateList;
-	@JSONField(name: "vehicle_list")
+	@JSONField(name: 'vehicle_list')
 	List<UkTemplateDetailVehicleList>? vehicleList;
-	@JSONField(name: "challenge_25_list")
+	@JSONField(name: 'challenge_25_list')
 	List<UkTemplateDetailChallenge25List>? challenge25List;
 
 	UkTemplateDetailEntity();
@@ -36,13 +42,15 @@ class UkTemplateDetailEntity {
 @JsonSerializable()
 class UkTemplateDetailRow {
 	int? id;
-	@JSONField(name: "company_id")
+	@JSONField(name: 'company_id')
 	int? companyId;
-	@JSONField(name: "job_title")
+	@JSONField(name: 'job_title')
 	String? jobTitle;
-	@JSONField(name: "contact_name")
+	@JSONField(name: 'contact_name')
 	String? contactName;
-	@JSONField(name: "contact_no")
+	@JSONField(name: 'contact_country_code')
+	int? contactCountryCode;
+	@JSONField(name: 'contact_no')
 	String? contactNo;
 	String? vehicle;
 	String? certificate;
@@ -51,22 +59,27 @@ class UkTemplateDetailRow {
 	int? gender;
 	String? description;
 	String? note;
-	@JSONField(name: "operator_id")
+	@JSONField(name: 'operator_id')
 	int? operatorId;
-	@JSONField(name: "created_at")
+	@JSONField(name: 'created_at')
 	String? createdAt;
-	@JSONField(name: "updated_at")
+	@JSONField(name: 'updated_at')
 	String? updatedAt;
-	@JSONField(name: "deleted_at")
+	@JSONField(name: 'deleted_at')
 	dynamic deletedAt;
-	@JSONField(name: "template_id")
+	@JSONField(name: 'template_id')
 	int? templateId;
-	@JSONField(name: "job_title_id")
+	@JSONField(name: 'job_title_id')
 	int? jobTitleId;
-	@JSONField(name: "client_name")
+	@JSONField(name: 'client_name')
 	String? clientName;
-	@JSONField(name: "challenge_25")
+	@JSONField(name: 'challenge_25')
 	int? challenge25;
+	@JSONField(name: 'country_id')
+	int? countryId;
+	@JSONField(name: 'city_id')
+	int? cityId;
+	String? location;
 
 	UkTemplateDetailRow();
 
@@ -81,9 +94,43 @@ class UkTemplateDetailRow {
 }
 
 @JsonSerializable()
+class UkTemplateDetailCountryList {
+	int? id;
+	String? name;
+
+	UkTemplateDetailCountryList();
+
+	factory UkTemplateDetailCountryList.fromJson(Map<String, dynamic> json) => $UkTemplateDetailCountryListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkTemplateDetailCountryListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkTemplateDetailCityList {
+	int? id;
+	String? name;
+
+	UkTemplateDetailCityList();
+
+	factory UkTemplateDetailCityList.fromJson(Map<String, dynamic> json) => $UkTemplateDetailCityListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkTemplateDetailCityListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
 class UkTemplateDetailTitleList {
 	int? id;
-	@JSONField(name: "job_title")
+	@JSONField(name: 'job_title')
 	String? jobTitle;
 
 	UkTemplateDetailTitleList();

+ 23 - 4
packages/cs_domain/lib/entity/response/uk_template_detail_index_entity.dart

@@ -5,13 +5,15 @@ export 'package:domain/generated/json/uk_template_detail_index_entity.g.dart';
 
 @JsonSerializable()
 class UkTemplateDetailIndexEntity {
-	@JSONField(name: "template_list")
+	@JSONField(name: 'template_list')
 	List<String>? templateList;
-	@JSONField(name: "certificate_list")
+	@JSONField(name: 'country_list')
+	List<UkTemplateDetailIndexCountryList>? countryList;
+	@JSONField(name: 'certificate_list')
 	List<UkTemplateDetailIndexCertificateList>? certificateList;
-	@JSONField(name: "vehicle_list")
+	@JSONField(name: 'vehicle_list')
 	List<UkTemplateDetailIndexVehicleList>? vehicleList;
-	@JSONField(name: "challenge_25_list")
+	@JSONField(name: 'challenge_25_list')
 	List<UkTemplateDetailIndexChallenge25List>? challenge25List;
 
 	UkTemplateDetailIndexEntity();
@@ -27,6 +29,23 @@ class UkTemplateDetailIndexEntity {
 }
 
 @JsonSerializable()
+class UkTemplateDetailIndexCountryList {
+	int? id;
+	String? name;
+
+	UkTemplateDetailIndexCountryList();
+
+	factory UkTemplateDetailIndexCountryList.fromJson(Map<String, dynamic> json) => $UkTemplateDetailIndexCountryListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkTemplateDetailIndexCountryListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
 class UkTemplateDetailIndexCertificateList {
 	int? value;
 	String? txt;

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

@@ -1276,6 +1276,15 @@ class JsonConvert {
       return data.map<UkLabReqShowTemplateEntity>((Map<String, dynamic> e) =>
           UkLabReqShowTemplateEntity.fromJson(e)).toList() as M;
     }
+    if (<UkLabReqShowTemplateCountryList>[] is M) {
+      return data.map<UkLabReqShowTemplateCountryList>((
+          Map<String, dynamic> e) =>
+          UkLabReqShowTemplateCountryList.fromJson(e)).toList() as M;
+    }
+    if (<UkLabReqShowTemplateCityList>[] is M) {
+      return data.map<UkLabReqShowTemplateCityList>((Map<String, dynamic> e) =>
+          UkLabReqShowTemplateCityList.fromJson(e)).toList() as M;
+    }
     if (<UkLabourRequestDetailEntity>[] is M) {
       return data.map<UkLabourRequestDetailEntity>((Map<String, dynamic> e) =>
           UkLabourRequestDetailEntity.fromJson(e)).toList() as M;
@@ -1315,6 +1324,15 @@ class JsonConvert {
           Map<String, dynamic> e) =>
           UkLabourRequestDetailEmploymentList.fromJson(e)).toList() as M;
     }
+    if (<UkLabourRequestDetailCountryList>[] is M) {
+      return data.map<UkLabourRequestDetailCountryList>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestDetailCountryList.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestDetailCityList>[] is M) {
+      return data.map<UkLabourRequestDetailCityList>((Map<String, dynamic> e) =>
+          UkLabourRequestDetailCityList.fromJson(e)).toList() as M;
+    }
     if (<UkLabourRequestPreselectAddstaffListEntity>[] is M) {
       return data.map<UkLabourRequestPreselectAddstaffListEntity>((
           Map<String, dynamic> e) =>
@@ -1465,6 +1483,14 @@ class JsonConvert {
       return data.map<UkTemplateDetailRow>((Map<String, dynamic> e) =>
           UkTemplateDetailRow.fromJson(e)).toList() as M;
     }
+    if (<UkTemplateDetailCountryList>[] is M) {
+      return data.map<UkTemplateDetailCountryList>((Map<String, dynamic> e) =>
+          UkTemplateDetailCountryList.fromJson(e)).toList() as M;
+    }
+    if (<UkTemplateDetailCityList>[] is M) {
+      return data.map<UkTemplateDetailCityList>((Map<String, dynamic> e) =>
+          UkTemplateDetailCityList.fromJson(e)).toList() as M;
+    }
     if (<UkTemplateDetailTitleList>[] is M) {
       return data.map<UkTemplateDetailTitleList>((Map<String, dynamic> e) =>
           UkTemplateDetailTitleList.fromJson(e)).toList() as M;
@@ -1487,6 +1513,11 @@ class JsonConvert {
       return data.map<UkTemplateDetailIndexEntity>((Map<String, dynamic> e) =>
           UkTemplateDetailIndexEntity.fromJson(e)).toList() as M;
     }
+    if (<UkTemplateDetailIndexCountryList>[] is M) {
+      return data.map<UkTemplateDetailIndexCountryList>((
+          Map<String, dynamic> e) =>
+          UkTemplateDetailIndexCountryList.fromJson(e)).toList() as M;
+    }
     if (<UkTemplateDetailIndexCertificateList>[] is M) {
       return data.map<UkTemplateDetailIndexCertificateList>((
           Map<String, dynamic> e) =>
@@ -1875,6 +1906,10 @@ class JsonConvertClassCollection {
         .toString(): UkJobTemplateDetailBySelectTitleEntity.fromJson,
     (UkLabReqShowTemplateEntity).toString(): UkLabReqShowTemplateEntity
         .fromJson,
+    (UkLabReqShowTemplateCountryList)
+        .toString(): UkLabReqShowTemplateCountryList.fromJson,
+    (UkLabReqShowTemplateCityList).toString(): UkLabReqShowTemplateCityList
+        .fromJson,
     (UkLabourRequestDetailEntity).toString(): UkLabourRequestDetailEntity
         .fromJson,
     (UkLabourRequestDetailCertificateList)
@@ -1891,6 +1926,10 @@ class JsonConvertClassCollection {
         .toString(): UkLabourRequestDetailChargeList.fromJson,
     (UkLabourRequestDetailEmploymentList)
         .toString(): UkLabourRequestDetailEmploymentList.fromJson,
+    (UkLabourRequestDetailCountryList)
+        .toString(): UkLabourRequestDetailCountryList.fromJson,
+    (UkLabourRequestDetailCityList).toString(): UkLabourRequestDetailCityList
+        .fromJson,
     (UkLabourRequestPreselectAddstaffListEntity)
         .toString(): UkLabourRequestPreselectAddstaffListEntity.fromJson,
     (UkLabourRequestPreselectAddstaffListRows)
@@ -1944,6 +1983,9 @@ class JsonConvertClassCollection {
         .toString(): UkStaffLabourHistoryRowsWorkOut.fromJson,
     (UkTemplateDetailEntity).toString(): UkTemplateDetailEntity.fromJson,
     (UkTemplateDetailRow).toString(): UkTemplateDetailRow.fromJson,
+    (UkTemplateDetailCountryList).toString(): UkTemplateDetailCountryList
+        .fromJson,
+    (UkTemplateDetailCityList).toString(): UkTemplateDetailCityList.fromJson,
     (UkTemplateDetailTitleList).toString(): UkTemplateDetailTitleList.fromJson,
     (UkTemplateDetailCertificateList)
         .toString(): UkTemplateDetailCertificateList.fromJson,
@@ -1953,6 +1995,8 @@ class JsonConvertClassCollection {
         .toString(): UkTemplateDetailChallenge25List.fromJson,
     (UkTemplateDetailIndexEntity).toString(): UkTemplateDetailIndexEntity
         .fromJson,
+    (UkTemplateDetailIndexCountryList)
+        .toString(): UkTemplateDetailIndexCountryList.fromJson,
     (UkTemplateDetailIndexCertificateList)
         .toString(): UkTemplateDetailIndexCertificateList.fromJson,
     (UkTemplateDetailIndexVehicleList)

+ 175 - 160
packages/cs_domain/lib/generated/json/hotel_info_entity.g.dart

@@ -1,161 +1,176 @@
-import 'package:domain/generated/json/base/json_convert_content.dart';
-import 'package:domain/entity/response/hotel_info_entity.dart';
-
-HotelInfoEntity $HotelInfoEntityFromJson(Map<String, dynamic> json) {
-  final HotelInfoEntity hotelInfoEntity = HotelInfoEntity();
-  final int? adminId = jsonConvert.convert<int>(json['admin_id']);
-  if (adminId != null) {
-    hotelInfoEntity.adminId = adminId;
-  }
-  final String? name = jsonConvert.convert<String>(json['name']);
-  if (name != null) {
-    hotelInfoEntity.name = name;
-  }
-  final int? hotelId = jsonConvert.convert<int>(json['hotel_id']);
-  if (hotelId != null) {
-    hotelInfoEntity.hotelId = hotelId;
-  }
-  final String? hotelName = jsonConvert.convert<String>(json['hotel_name']);
-  if (hotelName != null) {
-    hotelInfoEntity.hotelName = hotelName;
-  }
-  final List<HotelInfoMenus>? menus = (json['menus'] as List<dynamic>?)
-      ?.map(
-          (e) => jsonConvert.convert<HotelInfoMenus>(e) as HotelInfoMenus)
-      .toList();
-  if (menus != null) {
-    hotelInfoEntity.menus = menus;
-  }
-  final String? token = jsonConvert.convert<String>(json['token']);
-  if (token != null) {
-    hotelInfoEntity.token = token;
-  }
-  return hotelInfoEntity;
-}
-
-Map<String, dynamic> $HotelInfoEntityToJson(HotelInfoEntity entity) {
-  final Map<String, dynamic> data = <String, dynamic>{};
-  data['admin_id'] = entity.adminId;
-  data['name'] = entity.name;
-  data['hotel_id'] = entity.hotelId;
-  data['hotel_name'] = entity.hotelName;
-  data['menus'] = entity.menus?.map((v) => v.toJson()).toList();
-  data['token'] = entity.token;
-  return data;
-}
-
-extension HotelInfoEntityExtension on HotelInfoEntity {
-  HotelInfoEntity copyWith({
-    int? adminId,
-    String? name,
-    int? hotelId,
-    String? hotelName,
-    List<HotelInfoMenus>? menus,
-    String? token,
-  }) {
-    return HotelInfoEntity()
-      ..adminId = adminId ?? this.adminId
-      ..name = name ?? this.name
-      ..hotelId = hotelId ?? this.hotelId
-      ..hotelName = hotelName ?? this.hotelName
-      ..menus = menus ?? this.menus
-      ..token = token ?? this.token;
-  }
-}
-
-HotelInfoMenus $HotelInfoMenusFromJson(Map<String, dynamic> json) {
-  final HotelInfoMenus hotelInfoMenus = HotelInfoMenus();
-  final String? key = jsonConvert.convert<String>(json['key']);
-  if (key != null) {
-    hotelInfoMenus.key = key;
-  }
-  final String? name = jsonConvert.convert<String>(json['name']);
-  if (name != null) {
-    hotelInfoMenus.name = name;
-  }
-  final String? route = jsonConvert.convert<String>(json['route']);
-  if (route != null) {
-    hotelInfoMenus.route = route;
-  }
-  final String? redDot = jsonConvert.convert<String>(json['red_dot']);
-  if (redDot != null) {
-    hotelInfoMenus.redDot = redDot;
-  }
-  final bool? own = jsonConvert.convert<bool>(json['own']);
-  if (own != null) {
-    hotelInfoMenus.own = own;
-  }
-  final List<HotelInfoMenusChildren>? children = (json['children'] as List<
-      dynamic>?)
-      ?.map(
-          (e) =>
-      jsonConvert.convert<HotelInfoMenusChildren>(e) as HotelInfoMenusChildren)
-      .toList();
-  if (children != null) {
-    hotelInfoMenus.children = children;
-  }
-  return hotelInfoMenus;
-}
-
-Map<String, dynamic> $HotelInfoMenusToJson(HotelInfoMenus entity) {
-  final Map<String, dynamic> data = <String, dynamic>{};
-  data['key'] = entity.key;
-  data['name'] = entity.name;
-  data['route'] = entity.route;
-  data['red_dot'] = entity.redDot;
-  data['own'] = entity.own;
-  data['children'] = entity.children?.map((v) => v.toJson()).toList();
-  return data;
-}
-
-extension HotelInfoMenusExtension on HotelInfoMenus {
-  HotelInfoMenus copyWith({
-    String? key,
-    String? name,
-    String? route,
-    String? redDot,
-    bool? own,
-    List<HotelInfoMenusChildren>? children,
-  }) {
-    return HotelInfoMenus()
-      ..key = key ?? this.key
-      ..name = name ?? this.name
-      ..route = route ?? this.route
-      ..redDot = redDot ?? this.redDot
-      ..own = own ?? this.own
-      ..children = children ?? this.children;
-  }
-}
-
-HotelInfoMenusChildren $HotelInfoMenusChildrenFromJson(
-    Map<String, dynamic> json) {
-  final HotelInfoMenusChildren hotelInfoMenusChildren = HotelInfoMenusChildren();
-  final String? key = jsonConvert.convert<String>(json['key']);
-  if (key != null) {
-    hotelInfoMenusChildren.key = key;
-  }
-  final String? name = jsonConvert.convert<String>(json['name']);
-  if (name != null) {
-    hotelInfoMenusChildren.name = name;
-  }
-  return hotelInfoMenusChildren;
-}
-
-Map<String, dynamic> $HotelInfoMenusChildrenToJson(
-    HotelInfoMenusChildren entity) {
-  final Map<String, dynamic> data = <String, dynamic>{};
-  data['key'] = entity.key;
-  data['name'] = entity.name;
-  return data;
-}
-
-extension HotelInfoMenusChildrenExtension on HotelInfoMenusChildren {
-  HotelInfoMenusChildren copyWith({
-    String? key,
-    String? name,
-  }) {
-    return HotelInfoMenusChildren()
-      ..key = key ?? this.key
-      ..name = name ?? this.name;
-  }
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/hotel_info_entity.dart';
+
+HotelInfoEntity $HotelInfoEntityFromJson(Map<String, dynamic> json) {
+  final HotelInfoEntity hotelInfoEntity = HotelInfoEntity();
+  final int? adminId = jsonConvert.convert<int>(json['admin_id']);
+  if (adminId != null) {
+    hotelInfoEntity.adminId = adminId;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    hotelInfoEntity.name = name;
+  }
+  final int? hotelId = jsonConvert.convert<int>(json['hotel_id']);
+  if (hotelId != null) {
+    hotelInfoEntity.hotelId = hotelId;
+  }
+  final String? hotelName = jsonConvert.convert<String>(json['hotel_name']);
+  if (hotelName != null) {
+    hotelInfoEntity.hotelName = hotelName;
+  }
+  final int? cvShow = jsonConvert.convert<int>(json['cv_show']);
+  if (cvShow != null) {
+    hotelInfoEntity.cvShow = cvShow;
+  }
+  final int? mobileNumberShow = jsonConvert.convert<int>(
+      json['mobile_number_show']);
+  if (mobileNumberShow != null) {
+    hotelInfoEntity.mobileNumberShow = mobileNumberShow;
+  }
+  final List<HotelInfoMenus>? menus = (json['menus'] as List<dynamic>?)
+      ?.map(
+          (e) => jsonConvert.convert<HotelInfoMenus>(e) as HotelInfoMenus)
+      .toList();
+  if (menus != null) {
+    hotelInfoEntity.menus = menus;
+  }
+  final String? token = jsonConvert.convert<String>(json['token']);
+  if (token != null) {
+    hotelInfoEntity.token = token;
+  }
+  return hotelInfoEntity;
+}
+
+Map<String, dynamic> $HotelInfoEntityToJson(HotelInfoEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['admin_id'] = entity.adminId;
+  data['name'] = entity.name;
+  data['hotel_id'] = entity.hotelId;
+  data['hotel_name'] = entity.hotelName;
+  data['cv_show'] = entity.cvShow;
+  data['mobile_number_show'] = entity.mobileNumberShow;
+  data['menus'] = entity.menus?.map((v) => v.toJson()).toList();
+  data['token'] = entity.token;
+  return data;
+}
+
+extension HotelInfoEntityExtension on HotelInfoEntity {
+  HotelInfoEntity copyWith({
+    int? adminId,
+    String? name,
+    int? hotelId,
+    String? hotelName,
+    int? cvShow,
+    int? mobileNumberShow,
+    List<HotelInfoMenus>? menus,
+    String? token,
+  }) {
+    return HotelInfoEntity()
+      ..adminId = adminId ?? this.adminId
+      ..name = name ?? this.name
+      ..hotelId = hotelId ?? this.hotelId
+      ..hotelName = hotelName ?? this.hotelName
+      ..cvShow = cvShow ?? this.cvShow
+      ..mobileNumberShow = mobileNumberShow ?? this.mobileNumberShow
+      ..menus = menus ?? this.menus
+      ..token = token ?? this.token;
+  }
+}
+
+HotelInfoMenus $HotelInfoMenusFromJson(Map<String, dynamic> json) {
+  final HotelInfoMenus hotelInfoMenus = HotelInfoMenus();
+  final String? key = jsonConvert.convert<String>(json['key']);
+  if (key != null) {
+    hotelInfoMenus.key = key;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    hotelInfoMenus.name = name;
+  }
+  final String? route = jsonConvert.convert<String>(json['route']);
+  if (route != null) {
+    hotelInfoMenus.route = route;
+  }
+  final String? redDot = jsonConvert.convert<String>(json['red_dot']);
+  if (redDot != null) {
+    hotelInfoMenus.redDot = redDot;
+  }
+  final bool? own = jsonConvert.convert<bool>(json['own']);
+  if (own != null) {
+    hotelInfoMenus.own = own;
+  }
+  final List<HotelInfoMenusChildren>? children = (json['children'] as List<
+      dynamic>?)
+      ?.map(
+          (e) =>
+      jsonConvert.convert<HotelInfoMenusChildren>(e) as HotelInfoMenusChildren)
+      .toList();
+  if (children != null) {
+    hotelInfoMenus.children = children;
+  }
+  return hotelInfoMenus;
+}
+
+Map<String, dynamic> $HotelInfoMenusToJson(HotelInfoMenus entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['key'] = entity.key;
+  data['name'] = entity.name;
+  data['route'] = entity.route;
+  data['red_dot'] = entity.redDot;
+  data['own'] = entity.own;
+  data['children'] = entity.children?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension HotelInfoMenusExtension on HotelInfoMenus {
+  HotelInfoMenus copyWith({
+    String? key,
+    String? name,
+    String? route,
+    String? redDot,
+    bool? own,
+    List<HotelInfoMenusChildren>? children,
+  }) {
+    return HotelInfoMenus()
+      ..key = key ?? this.key
+      ..name = name ?? this.name
+      ..route = route ?? this.route
+      ..redDot = redDot ?? this.redDot
+      ..own = own ?? this.own
+      ..children = children ?? this.children;
+  }
+}
+
+HotelInfoMenusChildren $HotelInfoMenusChildrenFromJson(
+    Map<String, dynamic> json) {
+  final HotelInfoMenusChildren hotelInfoMenusChildren = HotelInfoMenusChildren();
+  final String? key = jsonConvert.convert<String>(json['key']);
+  if (key != null) {
+    hotelInfoMenusChildren.key = key;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    hotelInfoMenusChildren.name = name;
+  }
+  return hotelInfoMenusChildren;
+}
+
+Map<String, dynamic> $HotelInfoMenusChildrenToJson(
+    HotelInfoMenusChildren entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['key'] = entity.key;
+  data['name'] = entity.name;
+  return data;
+}
+
+extension HotelInfoMenusChildrenExtension on HotelInfoMenusChildren {
+  HotelInfoMenusChildren copyWith({
+    String? key,
+    String? name,
+  }) {
+    return HotelInfoMenusChildren()
+      ..key = key ?? this.key
+      ..name = name ?? this.name;
+  }
 }

+ 120 - 1
packages/cs_domain/lib/generated/json/uk_lab_req_show_template_entity.g.dart

@@ -20,6 +20,11 @@ UkLabReqShowTemplateEntity $UkLabReqShowTemplateEntityFromJson(
   if (contactName != null) {
     ukLabReqShowTemplateEntity.contactName = contactName;
   }
+  final int? contactCountryCode = jsonConvert.convert<int>(
+      json['contact_country_code']);
+  if (contactCountryCode != null) {
+    ukLabReqShowTemplateEntity.contactCountryCode = contactCountryCode;
+  }
   final String? contactNo = jsonConvert.convert<String>(json['contact_no']);
   if (contactNo != null) {
     ukLabReqShowTemplateEntity.contactNo = contactNo;
@@ -84,6 +89,36 @@ UkLabReqShowTemplateEntity $UkLabReqShowTemplateEntityFromJson(
   if (challenge25 != null) {
     ukLabReqShowTemplateEntity.challenge25 = challenge25;
   }
+  final int? countryId = jsonConvert.convert<int>(json['country_id']);
+  if (countryId != null) {
+    ukLabReqShowTemplateEntity.countryId = countryId;
+  }
+  final int? cityId = jsonConvert.convert<int>(json['city_id']);
+  if (cityId != null) {
+    ukLabReqShowTemplateEntity.cityId = cityId;
+  }
+  final String? location = jsonConvert.convert<String>(json['location']);
+  if (location != null) {
+    ukLabReqShowTemplateEntity.location = location;
+  }
+  final List<
+      UkLabReqShowTemplateCountryList>? countryList = (json['country_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkLabReqShowTemplateCountryList>(
+          e) as UkLabReqShowTemplateCountryList).toList();
+  if (countryList != null) {
+    ukLabReqShowTemplateEntity.countryList = countryList;
+  }
+  final List<
+      UkLabReqShowTemplateCityList>? cityList = (json['city_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkLabReqShowTemplateCityList>(
+          e) as UkLabReqShowTemplateCityList).toList();
+  if (cityList != null) {
+    ukLabReqShowTemplateEntity.cityList = cityList;
+  }
   return ukLabReqShowTemplateEntity;
 }
 
@@ -94,6 +129,7 @@ Map<String, dynamic> $UkLabReqShowTemplateEntityToJson(
   data['company_id'] = entity.companyId;
   data['job_title'] = entity.jobTitle;
   data['contact_name'] = entity.contactName;
+  data['contact_country_code'] = entity.contactCountryCode;
   data['contact_no'] = entity.contactNo;
   data['vehicle'] = entity.vehicle;
   data['certificate'] = entity.certificate;
@@ -110,6 +146,11 @@ Map<String, dynamic> $UkLabReqShowTemplateEntityToJson(
   data['job_title_id'] = entity.jobTitleId;
   data['client_name'] = entity.clientName;
   data['challenge_25'] = entity.challenge25;
+  data['country_id'] = entity.countryId;
+  data['city_id'] = entity.cityId;
+  data['location'] = entity.location;
+  data['country_list'] = entity.countryList?.map((v) => v.toJson()).toList();
+  data['city_list'] = entity.cityList?.map((v) => v.toJson()).toList();
   return data;
 }
 
@@ -119,6 +160,7 @@ extension UkLabReqShowTemplateEntityExtension on UkLabReqShowTemplateEntity {
     int? companyId,
     String? jobTitle,
     String? contactName,
+    int? contactCountryCode,
     String? contactNo,
     String? vehicle,
     String? certificate,
@@ -135,12 +177,18 @@ extension UkLabReqShowTemplateEntityExtension on UkLabReqShowTemplateEntity {
     int? jobTitleId,
     String? clientName,
     int? challenge25,
+    int? countryId,
+    int? cityId,
+    String? location,
+    List<UkLabReqShowTemplateCountryList>? countryList,
+    List<UkLabReqShowTemplateCityList>? cityList,
   }) {
     return UkLabReqShowTemplateEntity()
       ..id = id ?? this.id
       ..companyId = companyId ?? this.companyId
       ..jobTitle = jobTitle ?? this.jobTitle
       ..contactName = contactName ?? this.contactName
+      ..contactCountryCode = contactCountryCode ?? this.contactCountryCode
       ..contactNo = contactNo ?? this.contactNo
       ..vehicle = vehicle ?? this.vehicle
       ..certificate = certificate ?? this.certificate
@@ -156,6 +204,77 @@ extension UkLabReqShowTemplateEntityExtension on UkLabReqShowTemplateEntity {
       ..templateId = templateId ?? this.templateId
       ..jobTitleId = jobTitleId ?? this.jobTitleId
       ..clientName = clientName ?? this.clientName
-      ..challenge25 = challenge25 ?? this.challenge25;
+      ..challenge25 = challenge25 ?? this.challenge25
+      ..countryId = countryId ?? this.countryId
+      ..cityId = cityId ?? this.cityId
+      ..location = location ?? this.location
+      ..countryList = countryList ?? this.countryList
+      ..cityList = cityList ?? this.cityList;
+  }
+}
+
+UkLabReqShowTemplateCountryList $UkLabReqShowTemplateCountryListFromJson(
+    Map<String, dynamic> json) {
+  final UkLabReqShowTemplateCountryList ukLabReqShowTemplateCountryList = UkLabReqShowTemplateCountryList();
+  final int? id = jsonConvert.convert<int>(json['id']);
+  if (id != null) {
+    ukLabReqShowTemplateCountryList.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    ukLabReqShowTemplateCountryList.name = name;
+  }
+  return ukLabReqShowTemplateCountryList;
+}
+
+Map<String, dynamic> $UkLabReqShowTemplateCountryListToJson(
+    UkLabReqShowTemplateCountryList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  return data;
+}
+
+extension UkLabReqShowTemplateCountryListExtension on UkLabReqShowTemplateCountryList {
+  UkLabReqShowTemplateCountryList copyWith({
+    int? id,
+    String? name,
+  }) {
+    return UkLabReqShowTemplateCountryList()
+      ..id = id ?? this.id
+      ..name = name ?? this.name;
+  }
+}
+
+UkLabReqShowTemplateCityList $UkLabReqShowTemplateCityListFromJson(
+    Map<String, dynamic> json) {
+  final UkLabReqShowTemplateCityList ukLabReqShowTemplateCityList = UkLabReqShowTemplateCityList();
+  final int? id = jsonConvert.convert<int>(json['id']);
+  if (id != null) {
+    ukLabReqShowTemplateCityList.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    ukLabReqShowTemplateCityList.name = name;
+  }
+  return ukLabReqShowTemplateCityList;
+}
+
+Map<String, dynamic> $UkLabReqShowTemplateCityListToJson(
+    UkLabReqShowTemplateCityList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  return data;
+}
+
+extension UkLabReqShowTemplateCityListExtension on UkLabReqShowTemplateCityList {
+  UkLabReqShowTemplateCityList copyWith({
+    int? id,
+    String? name,
+  }) {
+    return UkLabReqShowTemplateCityList()
+      ..id = id ?? this.id
+      ..name = name ?? this.name;
   }
 }

+ 109 - 5
packages/cs_domain/lib/generated/json/uk_labour_request_detail_entity.g.dart

@@ -52,11 +52,11 @@ UkLabourRequestDetailEntity $UkLabourRequestDetailEntityFromJson(
   if (employmentType != null) {
     ukLabourRequestDetailEntity.employmentType = employmentType;
   }
-  final dynamic eventName = json['event_name'];
+  final String? eventName = jsonConvert.convert<String>(json['event_name']);
   if (eventName != null) {
     ukLabourRequestDetailEntity.eventName = eventName;
   }
-  final dynamic eventType = json['event_type'];
+  final String? eventType = jsonConvert.convert<String>(json['event_type']);
   if (eventType != null) {
     ukLabourRequestDetailEntity.eventType = eventType;
   }
@@ -172,6 +172,24 @@ UkLabourRequestDetailEntity $UkLabourRequestDetailEntityFromJson(
   if (employmentList != null) {
     ukLabourRequestDetailEntity.employmentList = employmentList;
   }
+  final List<
+      UkLabourRequestDetailCountryList>? countryList = (json['country_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkLabourRequestDetailCountryList>(
+          e) as UkLabourRequestDetailCountryList).toList();
+  if (countryList != null) {
+    ukLabourRequestDetailEntity.countryList = countryList;
+  }
+  final List<
+      UkLabourRequestDetailCityList>? cityList = (json['city_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkLabourRequestDetailCityList>(
+          e) as UkLabourRequestDetailCityList).toList();
+  if (cityList != null) {
+    ukLabourRequestDetailEntity.cityList = cityList;
+  }
   return ukLabourRequestDetailEntity;
 }
 
@@ -215,6 +233,8 @@ Map<String, dynamic> $UkLabourRequestDetailEntityToJson(
   data['charge_list'] = entity.chargeList?.map((v) => v.toJson()).toList();
   data['employment_list'] =
       entity.employmentList?.map((v) => v.toJson()).toList();
+  data['country_list'] = entity.countryList?.map((v) => v.toJson()).toList();
+  data['city_list'] = entity.cityList?.map((v) => v.toJson()).toList();
   return data;
 }
 
@@ -232,8 +252,8 @@ extension UkLabourRequestDetailEntityExtension on UkLabourRequestDetailEntity {
     String? salaryBy,
     int? amount,
     int? employmentType,
-    dynamic eventName,
-    dynamic eventType,
+    String? eventName,
+    String? eventType,
     int? passengers,
     dynamic estRevenue,
     String? position,
@@ -253,6 +273,8 @@ extension UkLabourRequestDetailEntityExtension on UkLabourRequestDetailEntity {
     List<UkLabourRequestDetailDepartmentList>? departmentList,
     List<UkLabourRequestDetailChargeList>? chargeList,
     List<UkLabourRequestDetailEmploymentList>? employmentList,
+    List<UkLabourRequestDetailCountryList>? countryList,
+    List<UkLabourRequestDetailCityList>? cityList,
   }) {
     return UkLabourRequestDetailEntity()
       ..requestId = requestId ?? this.requestId
@@ -287,7 +309,9 @@ extension UkLabourRequestDetailEntityExtension on UkLabourRequestDetailEntity {
       ..templateList = templateList ?? this.templateList
       ..departmentList = departmentList ?? this.departmentList
       ..chargeList = chargeList ?? this.chargeList
-      ..employmentList = employmentList ?? this.employmentList;
+      ..employmentList = employmentList ?? this.employmentList
+      ..countryList = countryList ?? this.countryList
+      ..cityList = cityList ?? this.cityList;
   }
 }
 
@@ -569,4 +593,84 @@ extension UkLabourRequestDetailEmploymentListExtension on UkLabourRequestDetailE
       ..txt = txt ?? this.txt
       ..selected = selected ?? this.selected;
   }
+}
+
+UkLabourRequestDetailCountryList $UkLabourRequestDetailCountryListFromJson(
+    Map<String, dynamic> json) {
+  final UkLabourRequestDetailCountryList ukLabourRequestDetailCountryList = UkLabourRequestDetailCountryList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    ukLabourRequestDetailCountryList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    ukLabourRequestDetailCountryList.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    ukLabourRequestDetailCountryList.selected = selected;
+  }
+  return ukLabourRequestDetailCountryList;
+}
+
+Map<String, dynamic> $UkLabourRequestDetailCountryListToJson(
+    UkLabourRequestDetailCountryList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension UkLabourRequestDetailCountryListExtension on UkLabourRequestDetailCountryList {
+  UkLabourRequestDetailCountryList copyWith({
+    int? value,
+    String? txt,
+    String? selected,
+  }) {
+    return UkLabourRequestDetailCountryList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected;
+  }
+}
+
+UkLabourRequestDetailCityList $UkLabourRequestDetailCityListFromJson(
+    Map<String, dynamic> json) {
+  final UkLabourRequestDetailCityList ukLabourRequestDetailCityList = UkLabourRequestDetailCityList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    ukLabourRequestDetailCityList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    ukLabourRequestDetailCityList.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    ukLabourRequestDetailCityList.selected = selected;
+  }
+  return ukLabourRequestDetailCityList;
+}
+
+Map<String, dynamic> $UkLabourRequestDetailCityListToJson(
+    UkLabourRequestDetailCityList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension UkLabourRequestDetailCityListExtension on UkLabourRequestDetailCityList {
+  UkLabourRequestDetailCityList copyWith({
+    int? value,
+    String? txt,
+    String? selected,
+  }) {
+    return UkLabourRequestDetailCityList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected;
+  }
 }

+ 7 - 0
packages/cs_domain/lib/generated/json/uk_labour_request_preselect_addstaff_list_entity.g.dart

@@ -62,6 +62,10 @@ UkLabourRequestPreselectAddstaffListRows $UkLabourRequestPreselectAddstaffListRo
   if (nric != null) {
     ukLabourRequestPreselectAddstaffListRows.nric = nric;
   }
+  final String? phone = jsonConvert.convert<String>(json['phone']);
+  if (phone != null) {
+    ukLabourRequestPreselectAddstaffListRows.phone = phone;
+  }
   final String? profilePicture = jsonConvert.convert<String>(
       json['profile_picture']);
   if (profilePicture != null) {
@@ -110,6 +114,7 @@ Map<String, dynamic> $UkLabourRequestPreselectAddstaffListRowsToJson(
   data['is_favourite'] = entity.isFavourite;
   data['gender'] = entity.gender;
   data['nric'] = entity.nric;
+  data['phone'] = entity.phone;
   data['profile_picture'] = entity.profilePicture;
   data['status'] = entity.status;
   data['reviews_avg'] = entity.reviewsAvg;
@@ -129,6 +134,7 @@ extension UkLabourRequestPreselectAddstaffListRowsExtension on UkLabourRequestPr
     int? isFavourite,
     String? gender,
     String? nric,
+    String? phone,
     String? profilePicture,
     int? status,
     String? reviewsAvg,
@@ -145,6 +151,7 @@ extension UkLabourRequestPreselectAddstaffListRowsExtension on UkLabourRequestPr
       ..isFavourite = isFavourite ?? this.isFavourite
       ..gender = gender ?? this.gender
       ..nric = nric ?? this.nric
+      ..phone = phone ?? this.phone
       ..profilePicture = profilePicture ?? this.profilePicture
       ..status = status ?? this.status
       ..reviewsAvg = reviewsAvg ?? this.reviewsAvg

+ 128 - 1
packages/cs_domain/lib/generated/json/uk_template_detail_entity.g.dart

@@ -9,6 +9,28 @@ UkTemplateDetailEntity $UkTemplateDetailEntityFromJson(
   if (row != null) {
     ukTemplateDetailEntity.row = row;
   }
+  final String? withoutCountryContactNo = jsonConvert.convert<String>(
+      json['without_country_contact_no']);
+  if (withoutCountryContactNo != null) {
+    ukTemplateDetailEntity.withoutCountryContactNo = withoutCountryContactNo;
+  }
+  final List<
+      UkTemplateDetailCountryList>? countryList = (json['country_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkTemplateDetailCountryList>(
+          e) as UkTemplateDetailCountryList).toList();
+  if (countryList != null) {
+    ukTemplateDetailEntity.countryList = countryList;
+  }
+  final List<UkTemplateDetailCityList>? cityList = (json['city_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkTemplateDetailCityList>(
+          e) as UkTemplateDetailCityList).toList();
+  if (cityList != null) {
+    ukTemplateDetailEntity.cityList = cityList;
+  }
   final int? jobTemplateId = jsonConvert.convert<int>(json['job_template_id']);
   if (jobTemplateId != null) {
     ukTemplateDetailEntity.jobTemplateId = jobTemplateId;
@@ -68,6 +90,9 @@ Map<String, dynamic> $UkTemplateDetailEntityToJson(
     UkTemplateDetailEntity entity) {
   final Map<String, dynamic> data = <String, dynamic>{};
   data['row'] = entity.row?.toJson();
+  data['without_country_contact_no'] = entity.withoutCountryContactNo;
+  data['country_list'] = entity.countryList?.map((v) => v.toJson()).toList();
+  data['city_list'] = entity.cityList?.map((v) => v.toJson()).toList();
   data['job_template_id'] = entity.jobTemplateId;
   data['template_list'] = entity.templateList;
   data['template_title'] = entity.templateTitle;
@@ -83,6 +108,9 @@ Map<String, dynamic> $UkTemplateDetailEntityToJson(
 extension UkTemplateDetailEntityExtension on UkTemplateDetailEntity {
   UkTemplateDetailEntity copyWith({
     UkTemplateDetailRow? row,
+    String? withoutCountryContactNo,
+    List<UkTemplateDetailCountryList>? countryList,
+    List<UkTemplateDetailCityList>? cityList,
     int? jobTemplateId,
     List<String>? templateList,
     String? templateTitle,
@@ -93,6 +121,10 @@ extension UkTemplateDetailEntityExtension on UkTemplateDetailEntity {
   }) {
     return UkTemplateDetailEntity()
       ..row = row ?? this.row
+      ..withoutCountryContactNo = withoutCountryContactNo ??
+          this.withoutCountryContactNo
+      ..countryList = countryList ?? this.countryList
+      ..cityList = cityList ?? this.cityList
       ..jobTemplateId = jobTemplateId ?? this.jobTemplateId
       ..templateList = templateList ?? this.templateList
       ..templateTitle = templateTitle ?? this.templateTitle
@@ -121,6 +153,11 @@ UkTemplateDetailRow $UkTemplateDetailRowFromJson(Map<String, dynamic> json) {
   if (contactName != null) {
     ukTemplateDetailRow.contactName = contactName;
   }
+  final int? contactCountryCode = jsonConvert.convert<int>(
+      json['contact_country_code']);
+  if (contactCountryCode != null) {
+    ukTemplateDetailRow.contactCountryCode = contactCountryCode;
+  }
   final String? contactNo = jsonConvert.convert<String>(json['contact_no']);
   if (contactNo != null) {
     ukTemplateDetailRow.contactNo = contactNo;
@@ -185,6 +222,18 @@ UkTemplateDetailRow $UkTemplateDetailRowFromJson(Map<String, dynamic> json) {
   if (challenge25 != null) {
     ukTemplateDetailRow.challenge25 = challenge25;
   }
+  final int? countryId = jsonConvert.convert<int>(json['country_id']);
+  if (countryId != null) {
+    ukTemplateDetailRow.countryId = countryId;
+  }
+  final int? cityId = jsonConvert.convert<int>(json['city_id']);
+  if (cityId != null) {
+    ukTemplateDetailRow.cityId = cityId;
+  }
+  final String? location = jsonConvert.convert<String>(json['location']);
+  if (location != null) {
+    ukTemplateDetailRow.location = location;
+  }
   return ukTemplateDetailRow;
 }
 
@@ -194,6 +243,7 @@ Map<String, dynamic> $UkTemplateDetailRowToJson(UkTemplateDetailRow entity) {
   data['company_id'] = entity.companyId;
   data['job_title'] = entity.jobTitle;
   data['contact_name'] = entity.contactName;
+  data['contact_country_code'] = entity.contactCountryCode;
   data['contact_no'] = entity.contactNo;
   data['vehicle'] = entity.vehicle;
   data['certificate'] = entity.certificate;
@@ -210,6 +260,9 @@ Map<String, dynamic> $UkTemplateDetailRowToJson(UkTemplateDetailRow entity) {
   data['job_title_id'] = entity.jobTitleId;
   data['client_name'] = entity.clientName;
   data['challenge_25'] = entity.challenge25;
+  data['country_id'] = entity.countryId;
+  data['city_id'] = entity.cityId;
+  data['location'] = entity.location;
   return data;
 }
 
@@ -219,6 +272,7 @@ extension UkTemplateDetailRowExtension on UkTemplateDetailRow {
     int? companyId,
     String? jobTitle,
     String? contactName,
+    int? contactCountryCode,
     String? contactNo,
     String? vehicle,
     String? certificate,
@@ -235,12 +289,16 @@ extension UkTemplateDetailRowExtension on UkTemplateDetailRow {
     int? jobTitleId,
     String? clientName,
     int? challenge25,
+    int? countryId,
+    int? cityId,
+    String? location,
   }) {
     return UkTemplateDetailRow()
       ..id = id ?? this.id
       ..companyId = companyId ?? this.companyId
       ..jobTitle = jobTitle ?? this.jobTitle
       ..contactName = contactName ?? this.contactName
+      ..contactCountryCode = contactCountryCode ?? this.contactCountryCode
       ..contactNo = contactNo ?? this.contactNo
       ..vehicle = vehicle ?? this.vehicle
       ..certificate = certificate ?? this.certificate
@@ -256,7 +314,76 @@ extension UkTemplateDetailRowExtension on UkTemplateDetailRow {
       ..templateId = templateId ?? this.templateId
       ..jobTitleId = jobTitleId ?? this.jobTitleId
       ..clientName = clientName ?? this.clientName
-      ..challenge25 = challenge25 ?? this.challenge25;
+      ..challenge25 = challenge25 ?? this.challenge25
+      ..countryId = countryId ?? this.countryId
+      ..cityId = cityId ?? this.cityId
+      ..location = location ?? this.location;
+  }
+}
+
+UkTemplateDetailCountryList $UkTemplateDetailCountryListFromJson(
+    Map<String, dynamic> json) {
+  final UkTemplateDetailCountryList ukTemplateDetailCountryList = UkTemplateDetailCountryList();
+  final int? id = jsonConvert.convert<int>(json['id']);
+  if (id != null) {
+    ukTemplateDetailCountryList.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    ukTemplateDetailCountryList.name = name;
+  }
+  return ukTemplateDetailCountryList;
+}
+
+Map<String, dynamic> $UkTemplateDetailCountryListToJson(
+    UkTemplateDetailCountryList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  return data;
+}
+
+extension UkTemplateDetailCountryListExtension on UkTemplateDetailCountryList {
+  UkTemplateDetailCountryList copyWith({
+    int? id,
+    String? name,
+  }) {
+    return UkTemplateDetailCountryList()
+      ..id = id ?? this.id
+      ..name = name ?? this.name;
+  }
+}
+
+UkTemplateDetailCityList $UkTemplateDetailCityListFromJson(
+    Map<String, dynamic> json) {
+  final UkTemplateDetailCityList ukTemplateDetailCityList = UkTemplateDetailCityList();
+  final int? id = jsonConvert.convert<int>(json['id']);
+  if (id != null) {
+    ukTemplateDetailCityList.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    ukTemplateDetailCityList.name = name;
+  }
+  return ukTemplateDetailCityList;
+}
+
+Map<String, dynamic> $UkTemplateDetailCityListToJson(
+    UkTemplateDetailCityList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  return data;
+}
+
+extension UkTemplateDetailCityListExtension on UkTemplateDetailCityList {
+  UkTemplateDetailCityList copyWith({
+    int? id,
+    String? name,
+  }) {
+    return UkTemplateDetailCityList()
+      ..id = id ?? this.id
+      ..name = name ?? this.name;
   }
 }
 

+ 45 - 0
packages/cs_domain/lib/generated/json/uk_template_detail_index_entity.g.dart

@@ -12,6 +12,15 @@ UkTemplateDetailIndexEntity $UkTemplateDetailIndexEntityFromJson(
     ukTemplateDetailIndexEntity.templateList = templateList;
   }
   final List<
+      UkTemplateDetailIndexCountryList>? countryList = (json['country_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkTemplateDetailIndexCountryList>(
+          e) as UkTemplateDetailIndexCountryList).toList();
+  if (countryList != null) {
+    ukTemplateDetailIndexEntity.countryList = countryList;
+  }
+  final List<
       UkTemplateDetailIndexCertificateList>? certificateList = (json['certificate_list'] as List<
       dynamic>?)?.map(
           (e) =>
@@ -45,6 +54,7 @@ Map<String, dynamic> $UkTemplateDetailIndexEntityToJson(
     UkTemplateDetailIndexEntity entity) {
   final Map<String, dynamic> data = <String, dynamic>{};
   data['template_list'] = entity.templateList;
+  data['country_list'] = entity.countryList?.map((v) => v.toJson()).toList();
   data['certificate_list'] =
       entity.certificateList?.map((v) => v.toJson()).toList();
   data['vehicle_list'] = entity.vehicleList?.map((v) => v.toJson()).toList();
@@ -56,18 +66,53 @@ Map<String, dynamic> $UkTemplateDetailIndexEntityToJson(
 extension UkTemplateDetailIndexEntityExtension on UkTemplateDetailIndexEntity {
   UkTemplateDetailIndexEntity copyWith({
     List<String>? templateList,
+    List<UkTemplateDetailIndexCountryList>? countryList,
     List<UkTemplateDetailIndexCertificateList>? certificateList,
     List<UkTemplateDetailIndexVehicleList>? vehicleList,
     List<UkTemplateDetailIndexChallenge25List>? challenge25List,
   }) {
     return UkTemplateDetailIndexEntity()
       ..templateList = templateList ?? this.templateList
+      ..countryList = countryList ?? this.countryList
       ..certificateList = certificateList ?? this.certificateList
       ..vehicleList = vehicleList ?? this.vehicleList
       ..challenge25List = challenge25List ?? this.challenge25List;
   }
 }
 
+UkTemplateDetailIndexCountryList $UkTemplateDetailIndexCountryListFromJson(
+    Map<String, dynamic> json) {
+  final UkTemplateDetailIndexCountryList ukTemplateDetailIndexCountryList = UkTemplateDetailIndexCountryList();
+  final int? id = jsonConvert.convert<int>(json['id']);
+  if (id != null) {
+    ukTemplateDetailIndexCountryList.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    ukTemplateDetailIndexCountryList.name = name;
+  }
+  return ukTemplateDetailIndexCountryList;
+}
+
+Map<String, dynamic> $UkTemplateDetailIndexCountryListToJson(
+    UkTemplateDetailIndexCountryList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  return data;
+}
+
+extension UkTemplateDetailIndexCountryListExtension on UkTemplateDetailIndexCountryList {
+  UkTemplateDetailIndexCountryList copyWith({
+    int? id,
+    String? name,
+  }) {
+    return UkTemplateDetailIndexCountryList()
+      ..id = id ?? this.id
+      ..name = name ?? this.name;
+  }
+}
+
 UkTemplateDetailIndexCertificateList $UkTemplateDetailIndexCertificateListFromJson(
     Map<String, dynamic> json) {
   final UkTemplateDetailIndexCertificateList ukTemplateDetailIndexCertificateList = UkTemplateDetailIndexCertificateList();

+ 81 - 0
packages/cs_domain/lib/repository/uk_job_repository.dart

@@ -2,6 +2,7 @@ import 'package:get/get.dart';
 import 'package:plugin_platform/http/http_provider.dart';
 import 'package:plugin_platform/http/http_result.dart';
 import 'package:plugin_platform/platform_export.dart';
+import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 
 import '../constants/api_constants.dart';
@@ -77,6 +78,23 @@ class UKJobRepository extends GetxService {
     return result.convert();
   }
 
+  /// 添加用工模版 时详情里面的 数据源
+  Future<HttpResult> fetchCountryCodeList({
+    CancelToken? cancelToken,
+  }) async {
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiCountryCodeOptionsUK,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getListJson();
+      return result.convert(list: json);
+    }
+    return result.convert();
+  }
+
   /// 添加用工模版 时详情里 根据所选template 获取工作标题选项
   Future<HttpResult<UkTemplateTitleOptionEntity>> fetchJobTitleOptiosByTemplate(
       String templateTitle,
@@ -107,6 +125,36 @@ class UKJobRepository extends GetxService {
     return result.convert<UkTemplateTitleOptionEntity>();
   }
 
+  /// 添加用工模版 时详情里 根据所选国家 获取城市的选项
+  Future<HttpResult<UkTemplateDetailIndexCountryList>> fetchCityOptiosByCountry(
+    String countryId,
+    {
+      CancelToken? cancelToken,
+    }) async {
+
+    Map<String, String> params = {};
+    params['country_id'] = countryId;
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiCityOptionsUK,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final jsonList = result.getListJson();
+      var list = jsonList?.map((e) {
+        if (e is Map<String, dynamic>) {
+          return UkTemplateDetailIndexCountryList.fromJson(e);
+        } else {
+          return null;
+        }
+      }).whereType<UkTemplateDetailIndexCountryList>().toList();
+      return result.convert<UkTemplateDetailIndexCountryList>(list: list);
+    }
+    return result.convert<UkTemplateDetailIndexCountryList>();
+  }
+
   /// 编辑时获取的用工模版中的详情
   Future<HttpResult<UkTemplateDetailEntity>> fetchJobTemplateDetail({
     required String? templateId,
@@ -158,12 +206,16 @@ class UKJobRepository extends GetxService {
     required String jobTemplateId ,
     required String jobTitle,
     String? clientName,
+    String? countryId,
+    String? cityId,
+    String? location,
     List<String>? certificate,
     List<String>? vehicle,
     String? challenge25, // 1.yes,0.no
     String? note,
     String? desc,
     String? contactName,
+    String? contactCountryCode,
     String? contactNo,
     CancelToken? cancelToken,
   }) async {
@@ -177,6 +229,16 @@ class UKJobRepository extends GetxService {
       params['client_name'] = clientName ?? "";
     }
 
+    if (Utils.isNotEmpty(countryId)) {
+      params['country_id'] = countryId ?? "";
+    }
+    if (Utils.isNotEmpty(cityId)) {
+      params['city_id'] = cityId ?? "";
+    }
+    if (Utils.isNotEmpty(location)) {
+      params['location'] = location ?? "";
+    }
+
     if (certificate != null && certificate.isNotEmpty) {
       params['certificate[]'] = certificate;
     }
@@ -192,6 +254,9 @@ class UKJobRepository extends GetxService {
     if (Utils.isNotEmpty(contactName)) {
       params['contact_name'] = contactName ?? "";
     }
+    if (Utils.isNotEmpty(contactCountryCode)) {
+      params['contact_country_code'] = contactCountryCode ?? "";
+    }
     if (Utils.isNotEmpty(contactNo)) {
       params['contact_no'] = contactNo ?? "";
     }
@@ -220,12 +285,16 @@ class UKJobRepository extends GetxService {
     required String jobTemplateId,
     required String jobTitle,
     String? clientName,
+    String? countryId,
+    String? cityId,
+    String? location,
     List<String>? certificate,
     List<String>? vehicle,
     String? challenge25, // 1 yse  0 no
     String? note,
     String? desc,
     String? contactName,
+    String? contactCountryCode,
     String? contactNo,
     CancelToken? cancelToken,
   }) async {
@@ -238,6 +307,15 @@ class UKJobRepository extends GetxService {
     if (Utils.isNotEmpty(clientName)) {
       params['client_name'] = clientName ?? "";
     }
+    if (Utils.isNotEmpty(countryId)) {
+      params['country_id'] = countryId ?? "";
+    }
+    if (Utils.isNotEmpty(cityId)) {
+      params['city_id'] = cityId ?? "";
+    }
+    if (Utils.isNotEmpty(location)) {
+      params['location'] = location ?? "";
+    }
 
     if (certificate != null && certificate.isNotEmpty) {
       params['certificate[]'] = certificate;
@@ -254,6 +332,9 @@ class UKJobRepository extends GetxService {
     if (Utils.isNotEmpty(contactName)) {
       params['contact_name'] = contactName ?? "";
     }
+    if (Utils.isNotEmpty(contactCountryCode)) {
+      params['contact_country_code'] = contactCountryCode ?? "";
+    }
     if (Utils.isNotEmpty(contactNo)) {
       params['contact_no'] = contactNo ?? "";
     }

+ 59 - 33
packages/cs_domain/lib/repository/uk_labour_repository.dart

@@ -194,6 +194,8 @@ class UkLabourRepository extends GetxService {
       String? salaryBy,
       String? repeatDateStr,
       String? amount,
+      String? countryId,
+      String? cityId,
       String? location,
       String? certificate, // 多个逗号隔开
       String? challenge25,
@@ -231,6 +233,13 @@ class UkLabourRepository extends GetxService {
     if (!Utils.isEmpty(amount)) {
       params["amount"] = amount!;
     }
+    if (!Utils.isEmpty(countryId)) {
+      params["country_id"] = countryId!;
+    }
+    if (!Utils.isEmpty(cityId)) {
+      params["city_id"] = cityId!;
+    }
+
     if (!Utils.isEmpty(location)) {
       params["location"] = location!;
     }
@@ -332,21 +341,24 @@ class UkLabourRepository extends GetxService {
     return result.convert();
   }
 
-  /// lab-request-review 的编辑用工请求发布
-  Future<HttpResult> editLabourRequestReviewSubmit({
-    String? requestId,
+  /// lab-request 的新增 labourequest用工请求发布
+  Future<HttpResult> addLabourRequestSubmit({
     String? templateId,
+    String? jobDate,
     String? jobStart,
     String? jobEnd,
     String? departmentId,
     String? needNum,
-    String? location,
     String? salaryBy,
     String? repeatDateStr,
     String? amount,
+    String? countryId,
+    String? cityId,
+    String? location,
     String? certificate, // 多个逗号隔开
     String? challenge25,
     String? vehicle, // 多个逗号隔开
+    String? jobApplyPreId,
     String? description,
     String? employmentType,
     String? eventName,
@@ -363,13 +375,12 @@ class UkLabourRepository extends GetxService {
     dynamic? otherDocument,
     CancelToken? cancelToken,
   }) async {
-
     //参数
     Map<String, dynamic> params = {};
-    params['request_id'] = requestId ?? "";
     params['template_id'] = templateId ?? "";
-    params['job_start'] = jobStart ?? "";
-    params['job_end'] = jobEnd ?? "";
+    params['job_date'] = jobDate ?? "";
+    params['start_time'] = jobStart ?? "";
+    params['end_time'] = jobEnd ?? "";
     params['need_num'] = needNum ?? "";
     if (!Utils.isEmpty(departmentId)) {
       params["co_department_id"] = departmentId!;
@@ -377,14 +388,26 @@ class UkLabourRepository extends GetxService {
 
     params['salary_by'] = salaryBy ?? "";
 
+    if(!Utils.isEmpty(repeatDateStr)){
+      params["select"] = repeatDateStr!;
+    }
+
+    if(!Utils.isEmpty(jobApplyPreId)){
+      params["job_apply_pre_id"] = jobApplyPreId!;
+    }
+
     if (!Utils.isEmpty(amount)) {
       params["amount"] = amount!;
     }
-
+    if (!Utils.isEmpty(countryId)) {
+      params["country_id"] = countryId!;
+    }
+    if (!Utils.isEmpty(cityId)) {
+      params["city_id"] = cityId!;
+    }
     if (!Utils.isEmpty(location)) {
       params["location"] = location!;
     }
-
     if(!Utils.isEmpty(certificate)){
       params["certificate"] = certificate!;
     }
@@ -395,10 +418,6 @@ class UkLabourRepository extends GetxService {
       params["vehicle"] = vehicle!;
     }
 
-    if(!Utils.isEmpty(repeatDateStr)) {
-      params["select"] = repeatDateStr!;
-    }
-
     params['description'] = description ?? "";
     params['employment_type'] = employmentType ?? "";
     params['event_name'] = eventName ?? "";
@@ -462,8 +481,9 @@ class UkLabourRepository extends GetxService {
       }
     }
 
+
     final result = await httpProvider.requestNetResult(
-      ApiConstants.apiLabourRequestReViewEditUK,
+      ApiConstants.apiLabourRequestAddSubmit,
       method: HttpMethod.POST,
       params: params,
       paths: filePathParams,
@@ -480,22 +500,23 @@ class UkLabourRepository extends GetxService {
     return result.convert();
   }
 
-  /// lab-request 的新增 labourequest用工请求发布
-  Future<HttpResult> addLabourRequestSubmit({
+  /// lab-request-review 的编辑用工请求发布
+  Future<HttpResult> editLabourRequestReviewSubmit({
+    String? requestId,
     String? templateId,
-    String? jobDate,
     String? jobStart,
     String? jobEnd,
     String? departmentId,
     String? needNum,
+    String? countryId,
+    String? cityId,
+    String? location,
     String? salaryBy,
     String? repeatDateStr,
     String? amount,
-    String? location,
     String? certificate, // 多个逗号隔开
     String? challenge25,
     String? vehicle, // 多个逗号隔开
-    String? jobApplyPreId,
     String? description,
     String? employmentType,
     String? eventName,
@@ -512,12 +533,13 @@ class UkLabourRepository extends GetxService {
     dynamic? otherDocument,
     CancelToken? cancelToken,
   }) async {
+
     //参数
     Map<String, dynamic> params = {};
+    params['request_id'] = requestId ?? "";
     params['template_id'] = templateId ?? "";
-    params['job_date'] = jobDate ?? "";
-    params['start_time'] = jobStart ?? "";
-    params['end_time'] = jobEnd ?? "";
+    params['job_start'] = jobStart ?? "";
+    params['job_end'] = jobEnd ?? "";
     params['need_num'] = needNum ?? "";
     if (!Utils.isEmpty(departmentId)) {
       params["co_department_id"] = departmentId!;
@@ -525,20 +547,20 @@ class UkLabourRepository extends GetxService {
 
     params['salary_by'] = salaryBy ?? "";
 
-    if(!Utils.isEmpty(repeatDateStr)){
-      params["select"] = repeatDateStr!;
-    }
-
-    if(!Utils.isEmpty(jobApplyPreId)){
-      params["job_apply_pre_id"] = jobApplyPreId!;
-    }
-
     if (!Utils.isEmpty(amount)) {
       params["amount"] = amount!;
     }
+    if (!Utils.isEmpty(countryId)) {
+      params["country_id"] = countryId!;
+    }
+    if (!Utils.isEmpty(cityId)) {
+      params["city_id"] = cityId!;
+    }
+
     if (!Utils.isEmpty(location)) {
       params["location"] = location!;
     }
+
     if(!Utils.isEmpty(certificate)){
       params["certificate"] = certificate!;
     }
@@ -549,6 +571,10 @@ class UkLabourRepository extends GetxService {
       params["vehicle"] = vehicle!;
     }
 
+    if(!Utils.isEmpty(repeatDateStr)) {
+      params["select"] = repeatDateStr!;
+    }
+
     params['description'] = description ?? "";
     params['employment_type'] = employmentType ?? "";
     params['event_name'] = eventName ?? "";
@@ -612,9 +638,8 @@ class UkLabourRepository extends GetxService {
       }
     }
 
-
     final result = await httpProvider.requestNetResult(
-      ApiConstants.apiLabourRequestAddSubmit,
+      ApiConstants.apiLabourRequestReViewEditUK,
       method: HttpMethod.POST,
       params: params,
       paths: filePathParams,
@@ -631,6 +656,7 @@ class UkLabourRepository extends GetxService {
     return result.convert();
   }
 
+
   /// 用工请求 快速复制
   Future<HttpResult> quickCopyLabourRequestSubmit(
       String? requestId,