Browse Source

uk 新需求修改0828

glglove 3 days ago
parent
commit
918dc97eb6
28 changed files with 1689 additions and 354 deletions
  1. 3 3
      packages/cpt_uk/lib/modules/job/job_applied/applied_staff_item.dart
  2. 329 90
      packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff.dart
  3. 187 4
      packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff_controller.dart
  4. 20 4
      packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_controller.dart
  5. 11 2
      packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_state.dart
  6. 25 1
      packages/cpt_uk/lib/modules/job/labour_request_add/widget/lab_request_and_request_review_form.dart
  7. 8 1
      packages/cpt_uk/lib/modules/job/labour_request_add/widget/labour_request_interface.dart
  8. 2 2
      packages/cpt_uk/lib/modules/job/labour_request_add/widget/uploadFileField.dart
  9. 340 105
      packages/cpt_uk/lib/modules/job/labour_request_preselected_list/widget/preselected_add_staff.dart
  10. 179 1
      packages/cpt_uk/lib/modules/job/labour_request_preselected_list/widget/preselected_add_staff_controller.dart
  11. 11 4
      packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_controller.dart
  12. 10 1
      packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_state.dart
  13. 4 0
      packages/cs_domain/lib/constants/api_constants.dart
  14. 9 1
      packages/cs_domain/lib/entity/response/uk_job_list_applied_staff_search_entity.dart
  15. 21 0
      packages/cs_domain/lib/entity/response/uk_job_list_applied_staff_selectoptions_entity.dart
  16. 2 24
      packages/cs_domain/lib/entity/response/uk_labour_request_detail_entity.dart
  17. 8 0
      packages/cs_domain/lib/entity/response/uk_labour_request_preselect_addstaff_list_entity.dart
  18. 294 33
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  19. 35 0
      packages/cs_domain/lib/generated/json/uk_job_list_applied_staff_search_entity.g.dart
  20. 35 0
      packages/cs_domain/lib/generated/json/uk_job_list_applied_staff_selectoptions_entity.g.dart
  21. 14 61
      packages/cs_domain/lib/generated/json/uk_labour_request_detail_entity.g.dart
  22. 36 8
      packages/cs_domain/lib/generated/json/uk_labour_request_preselect_addstaff_list_entity.g.dart
  23. 67 2
      packages/cs_domain/lib/repository/uk_job_repository.dart
  24. 25 3
      packages/cs_domain/lib/repository/uk_labour_repository.dart
  25. 3 2
      packages/cs_plugin_basic/lib/modules/global_web_page.dart
  26. 2 1
      packages/cs_resources/lib/local/language/en_US.dart
  27. 3 1
      packages/cs_resources/lib/local/language/zh_CN.dart
  28. 6 0
      packages/cs_shared/lib/utils/util.dart

+ 3 - 3
packages/cpt_uk/lib/modules/job/job_applied/applied_staff_item.dart

@@ -293,7 +293,7 @@ class AppliedStaffItem extends StatelessWidget {
               crossAxisAlignment: CrossAxisAlignment.center,
               children: [
                 MyTextView(
-                  "Tip:".tr,
+                  "Tip".tr + ":",
                   isFontRegular: true,
                   textColor: ColorConstants.textGrayAECAE5,
                   fontSize: 14,
@@ -334,7 +334,7 @@ class AppliedStaffItem extends StatelessWidget {
                   isFontRegular: true,
                   textColor: "Completed" == item.statusShow
                       ? ColorConstants.textGreen05DC82
-                      : "Cancelled" == item.statusShow || "Rejected" == item.statusShow
+                      : "Cancelled" == item.statusShow || " Rejected Request" == item.statusShow
                       ? ColorConstants.textRedFF6262
                       : "Revised" == item.statusShow || "Pending" == item.statusShow || "Approve" == item.statusShow
                       ? ColorConstants.textYellowFFBB1B
@@ -408,7 +408,7 @@ class AppliedStaffItem extends StatelessWidget {
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
               MyTextView(
-                "Reason:".tr,
+                "Reason".tr + ":",
                 isFontRegular: true,
                 textColor: ColorConstants.textGrayAECAE5,
                 fontSize: 14,

+ 329 - 90
packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff.dart

@@ -8,13 +8,17 @@ 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/modules/global_web_page.dart';
 import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/util.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:cs_resources/constants/color_constants.dart';
 import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_button.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 import 'package:widgets/search_app_bar.dart';
+import 'package:widgets/shatter/form_require_text.dart';
 import 'package:widgets/widget_export.dart';
 
 import 'applied_add_staff_controller.dart';
@@ -73,86 +77,78 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
                 ),
               ),
 
-              SearchAppBar(
-                value: controller.keyword,
-                searchBarHeight: 38,
-                searchBarBgColor: Colors.white,
-                searchBarBorderRadius: 15,
-                searchBarBorder: Border.all(
-                  color: Color(0XFFC3C3C3), // 设置边框颜色为灰色
-                  width: 0.5, // 设置边框宽度
-                ),
-                textHintColor: Color(0XFFAFB3B7),
-                textColor: ColorConstants.black33,
-                onSearch: (keyword) {
-                  controller.doSearch(keyword);
-                },
-                hintText: "Staff Name/ID/Phone".tr,
-                controller: controller.searchController,
-              ).marginOnly(left: 16.5, right: 1.5, bottom: 15.5),
-
+              // 搜索栏
               Container(
-                color: Colors.white,
-                child: EasyRefresh(
-                  header: ClassicHeader(
-                    dragText: 'Pull to refresh'.tr,
-                    armedText: 'Release ready'.tr,
-                    readyText: 'Refreshing...'.tr,
-                    processingText: 'Refreshing...'.tr,
-                    processedText: 'Succeeded'.tr,
-                    noMoreText: 'No more'.tr,
-                    failedText: 'Failed'.tr,
-                    messageText: 'Last updated at %T'.tr,
-                    textStyle: const TextStyle(color: ColorConstants.black66, fontSize: 14),
-                    messageStyle: const TextStyle(color: ColorConstants.black66, fontSize: 12),
-                    iconTheme: const IconThemeData(color: ColorConstants.black66),
-                    backgroundColor: Colors.transparent,
-                  ),
-                  footer: ClassicFooter(
-                    dragText: 'Pull to load'.tr,
-                    armedText: 'Release ready'.tr,
-                    readyText: 'Loading...'.tr,
-                    processingText: 'Loading...'.tr,
-                    processedText: 'Succeeded'.tr,
-                    noMoreText: 'No more'.tr,
-                    failedText: 'Failed'.tr,
-                    showMessage: false,
-                    triggerOffset: 50,
-                    iconDimension: 22,
-                    textStyle: const TextStyle(color: ColorConstants.black66, fontSize: 14),
-                    messageStyle: const TextStyle(color: ColorConstants.black66, fontSize: 12),
-                    iconTheme: const IconThemeData(color: ColorConstants.black66),
-                    backgroundColor: Colors.transparent,
-                  ),
-                  controller: controller.refreshController,
-                  onRefresh: controller.onRefresh,
-                  onLoad: controller.loadMore,
-                  child: LoadStateLayout(
-                    themeColor: ColorConstants.black66,
-                    state: controller.loadingState,
-                    errorMessage: controller.errorMessage,
-                    errorRetry: () {
-                      controller.retryRequest();
-                    },
-                    successSliverWidget: [
-                      SliverList(
-                          delegate: SliverChildBuilderDelegate(
-                        (context, index) {
-                          return _buildStaffItem(controller.datas[index], () {
-                            /// Item选中与未选中设置
-                            controller.datas[index].isSelected = !controller.datas[index].isSelected;
-                            controller.update();
-                          }, clickFavoriteCallback: () {
-                            // 调用 打标的 接口
-                            controller.handlerSetFavourite(controller.datas[index]);
-                          });
-                        },
-                        childCount: controller.datas.length,
-                      ))
-                    ],
+                height: 100,
+                // color: Colors.red,
+                padding: const EdgeInsets.only(left: 10, right: 10),
+                child: _buildSearchSection(controller),
+              ),
+
+              Expanded(
+                child: Container(
+                  color: Colors.white,
+                  child: EasyRefresh(
+                    header: ClassicHeader(
+                      dragText: 'Pull to refresh'.tr,
+                      armedText: 'Release ready'.tr,
+                      readyText: 'Refreshing...'.tr,
+                      processingText: 'Refreshing...'.tr,
+                      processedText: 'Succeeded'.tr,
+                      noMoreText: 'No more'.tr,
+                      failedText: 'Failed'.tr,
+                      messageText: 'Last updated at %T'.tr,
+                      textStyle: const TextStyle(color: ColorConstants.black66, fontSize: 14),
+                      messageStyle: const TextStyle(color: ColorConstants.black66, fontSize: 12),
+                      iconTheme: const IconThemeData(color: ColorConstants.black66),
+                      backgroundColor: Colors.transparent,
+                    ),
+                    footer: ClassicFooter(
+                      dragText: 'Pull to load'.tr,
+                      armedText: 'Release ready'.tr,
+                      readyText: 'Loading...'.tr,
+                      processingText: 'Loading...'.tr,
+                      processedText: 'Succeeded'.tr,
+                      noMoreText: 'No more'.tr,
+                      failedText: 'Failed'.tr,
+                      showMessage: false,
+                      triggerOffset: 50,
+                      iconDimension: 22,
+                      textStyle: const TextStyle(color: ColorConstants.black66, fontSize: 14),
+                      messageStyle: const TextStyle(color: ColorConstants.black66, fontSize: 12),
+                      iconTheme: const IconThemeData(color: ColorConstants.black66),
+                      backgroundColor: Colors.transparent,
+                    ),
+                    controller: controller.refreshController,
+                    onRefresh: controller.onRefresh,
+                    onLoad: controller.loadMore,
+                    child: LoadStateLayout(
+                      themeColor: ColorConstants.black66,
+                      state: controller.loadingState,
+                      errorMessage: controller.errorMessage,
+                      errorRetry: () {
+                        controller.retryRequest();
+                      },
+                      successSliverWidget: [
+                        SliverList(
+                            delegate: SliverChildBuilderDelegate(
+                          (context, index) {
+                            return _buildStaffItem(controller, controller.datas[index], () {
+                              /// Item选中与未选中设置
+                              controller.datas[index].isSelected = !controller.datas[index].isSelected;
+                              controller.update();
+                            }, clickFavoriteCallback: () {
+                              // 调用 打标的 接口
+                              controller.handlerSetFavourite(controller.datas[index]);
+                            });
+                          },
+                          childCount: controller.datas.length,
+                        ))
+                      ],
+                    ),
                   ),
                 ),
-              ).expanded(),
+              ),
 
               //按钮组
               Row(
@@ -209,7 +205,11 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
 
   //取消弹框
   void onCancel() async {
-    SmartDialog.dismiss();
+    // 添加异常处理
+    try {
+      SmartDialog.dismiss();
+    } catch (e) {
+    }
   }
 
   //执行回调
@@ -227,7 +227,170 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
 
   }
 
-  Widget _buildStaffItem(UkJobListAppliedStaffSearchRows item, VoidCallback clickItemCallback, { VoidCallback? clickFavoriteCallback }) {
+  Widget _buildSearchSection(AppliedAddStaffController controller,){
+    return Column(
+        mainAxisSize: MainAxisSize.min,
+        crossAxisAlignment: CrossAxisAlignment.start,
+        mainAxisAlignment: MainAxisAlignment.start,
+      children: [
+        Row(
+          children: [
+            // 行业
+            Expanded(child: _buildIndustrySelectWidget(controller)),
+            SizedBox(width: 10),
+            // 工作标题
+            Expanded(child: _buildJobTitleSelectWidget(controller)),
+          ],
+        ),
+        Row(
+          children: [
+            Expanded(
+              child: SearchAppBar(
+                  value: controller.keyword,
+                  searchBarHeight: 38,
+                  searchBarBgColor: Colors.white,
+                  searchBarBorderRadius: 15,
+                  searchBarBorder: Border.all(
+                    color: Color(0XFFC3C3C3), // 设置边框颜色为灰色
+                    width: 0.5, // 设置边框宽度
+                  ),
+                  textHintColor: Color(0XFFAFB3B7),
+                  textColor: ColorConstants.black33,
+                  onSearch: (keyword) {
+                    controller.searchInputSearch(keyword);
+                  },
+                  hintText: "Staff Name/ID/Phone".tr,
+                  controller: controller.searchController,
+              ),
+            ),
+            Row(
+              mainAxisAlignment: MainAxisAlignment.end,
+              crossAxisAlignment: CrossAxisAlignment.center,
+              children: [
+                // MyButton(
+                //   onPressed: () {
+                //     FocusScope.of(context).unfocus();
+                //     controller.doSearch();
+                //   },
+                //   text: "Filter".tr,
+                //   textColor: ColorConstants.white,
+                //   backgroundColor: hexToColor("#2BA9F9", opacity: 0.5),
+                //   radius: 20,
+                //   minWidth: 60,
+                //   minHeight: 35,
+                // ),
+                MyButton(
+                  onPressed: () {
+                    FocusScope.of(context).unfocus();
+                    controller.resetSearch();
+                  },
+                  text: "Reset".tr,
+                  textColor: ColorConstants.white,
+                  backgroundColor: hexToColor("#2BA9F9", opacity: 0.5),
+                  radius: 20,
+                  minWidth: 60,
+                  minHeight: 35,
+                ),
+              ],
+            ),
+          ],
+        ),
+      ],
+    );
+  }
+
+  // 行业选择
+  Widget _buildIndustrySelectWidget(AppliedAddStaffController controller) {
+    return Container(
+      child: Row(
+        mainAxisSize: MainAxisSize.max,
+        mainAxisAlignment: MainAxisAlignment.start,
+        crossAxisAlignment: CrossAxisAlignment.center,
+        children: [
+          // 行业
+          // FormRequireText(text: "Industry".tr, isRequired: false,).marginOnly(right: 38),
+          //选择行业
+          Expanded(
+            child: Container(
+              padding: const EdgeInsets.only(left: 5, right: 5),
+              margin: const EdgeInsets.only(top: 5),
+              height: 40,
+              decoration: BoxDecoration(
+                color:  Color(0xFF4DCFF6).withOpacity(0.2),
+                // border: Border.all(color: Colors.black12.withOpacity(0.05)),
+                borderRadius: const BorderRadius.all(Radius.circular(5)),
+              ),
+              child: Row(
+                mainAxisSize: MainAxisSize.max,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                mainAxisAlignment: MainAxisAlignment.start,
+                children: [
+                  MyTextView(
+                    controller.selectedJobIndustryStr ==null || Utils.isEmpty(controller.selectedJobIndustryStr)? '': controller.selectedJobIndustryStr! ,
+                    hint: "Choose Industry".tr,
+                    textHintColor: ColorConstants.textGrayAECAE5,
+                    fontSize: 12,
+                    isFontMedium: true,
+                    textColor: ColorConstants.black33,
+                  ).expanded(),
+                  const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                ],
+              ),
+            ).onTap(() {
+              controller.showChooseIndustryPicker();
+            }),
+          )
+        ],
+      ),
+    );
+  }
+
+  // 工作标题选择
+  Widget _buildJobTitleSelectWidget(AppliedAddStaffController controller) {
+    return Container(
+      child: Row(
+        mainAxisAlignment: MainAxisAlignment.start,
+        crossAxisAlignment: CrossAxisAlignment.center,
+        children: [
+          // 工作标题
+          // FormRequireText(text: "Job Title".tr, isRequired:false).marginOnly(top: 15),
+          //选择template
+          Expanded(
+            child: Container(
+              padding: const EdgeInsets.only(left: 5, right: 5),
+              margin: const EdgeInsets.only(top: 5),
+              height: 40,
+              decoration: BoxDecoration(
+                color:  Color(0xFF4DCFF6).withOpacity(0.2),
+                // border: Border.all(color: Colors.black12.withOpacity(0.05)),
+                borderRadius: const BorderRadius.all(Radius.circular(5)),
+              ),
+              child: Row(
+                mainAxisSize: MainAxisSize.max,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                mainAxisAlignment: MainAxisAlignment.start,
+                children: [
+                  MyTextView(
+                    controller.selectedJobTitleStr ==null || Utils.isEmpty(controller.selectedJobTitleStr)? '': controller.selectedJobTitleStr! ,
+                    hint: "Choose JobTitle".tr,
+                    textHintColor: ColorConstants.textGrayAECAE5,
+                    fontSize: 12,
+                    isFontMedium: true,
+                    textColor: ColorConstants.black33,
+                  ).expanded(),
+                  const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                ],
+              ),
+            ).onTap(() {
+              controller.showChooseJobTitlePicker();
+            }),
+          )
+        ],
+      ),
+    );
+  }
+
+  Widget _buildStaffItem(AppliedAddStaffController controller, UkJobListAppliedStaffSearchRows item, VoidCallback clickItemCallback, { VoidCallback? clickFavoriteCallback }) {
     return Stack(
       children: [
         Column(
@@ -269,60 +432,136 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
               ],
             ).marginOnly(top: 5),
 
-            //性别
+            // //性别
+            // Row(
+            //   children: [
+            //     MyTextView(
+            //       "Gender:",
+            //       marginRight: 3,
+            //       textColor: ColorConstants.black66,
+            //       fontSize: 13,
+            //       isFontRegular: true,
+            //     ),
+            //     MyTextView(
+            //       item.sex ?? "-",
+            //       textColor: ColorConstants.black66,
+            //       fontSize: 13,
+            //       isFontRegular: true,
+            //     ),
+            //   ],
+            // ).marginOnly(top: 5),
+            //
+            // //身份证
+            // Row(
+            //   children: [
+            //     MyTextView(
+            //       "NRIC:",
+            //       marginRight: 3,
+            //       textColor: ColorConstants.black66,
+            //       fontSize: 13,
+            //       isFontRegular: true,
+            //     ),
+            //     MyTextView(
+            //       item.nric ?? "-",
+            //       textColor: ColorConstants.black66,
+            //       fontSize: 13,
+            //       isFontRegular: true,
+            //     ),
+            //   ],
+            // ).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(
               children: [
                 MyTextView(
-                  "Gender:",
+                  "Turn-Up Rate".tr + ":",
                   marginRight: 3,
                   textColor: ColorConstants.black66,
                   fontSize: 13,
                   isFontRegular: true,
                 ),
                 MyTextView(
-                  item.sex ?? "-",
+                  item.turnUpRate ?? "-",
                   textColor: ColorConstants.black66,
                   fontSize: 13,
                   isFontRegular: true,
                 ),
               ],
             ).marginOnly(top: 5),
-
-            //身份证
             Row(
               children: [
                 MyTextView(
-                  "NRIC:",
+                  "Reviews".tr + ":",
                   marginRight: 3,
                   textColor: ColorConstants.black66,
                   fontSize: 13,
                   isFontRegular: true,
                 ),
                 MyTextView(
-                  item.nric ?? "-",
+                  item.reviewsAvg ?? "-",
                   textColor: ColorConstants.black66,
                   fontSize: 13,
                   isFontRegular: true,
                 ),
               ],
             ).marginOnly(top: 5),
-
-            //电话
             Row(
               children: [
                 MyTextView(
-                  "Phone:",
+                  "Skills".tr + ":",
                   marginRight: 3,
                   textColor: ColorConstants.black66,
                   fontSize: 13,
                   isFontRegular: true,
                 ),
                 MyTextView(
-                  item.phone ?? "-",
+                  item.skills ?? "-",
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ).expanded(),
+              ],
+            ).marginOnly(top: 5),
+
+            Row(
+              children: [
+                MyTextView(
+                  "CV".tr + ":",
+                  marginRight: 3,
                   textColor: ColorConstants.black66,
                   fontSize: 13,
                   isFontRegular: true,
                 ),
+                MyTextView(
+                  item.resume ?? "-",
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                  onClick: (){
+                    // 点击查看 打开webview 页面
+                    if(item.resume?.isNotEmpty == true && Utils.isNetworkUrl(item.resume!)){
+                      controller.handlerScanFile(item.resume!);
+                    }
+                  },
+                ).expanded(),
               ],
             ).marginOnly(top: 5),
 

+ 187 - 4
packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff_controller.dart

@@ -1,13 +1,23 @@
 import 'package:domain/entity/response/uk_job_list_applied_staff_search_entity.dart';
+import 'package:domain/entity/response/uk_job_list_applied_staff_selectoptions_entity.dart';
+import 'package:domain/entity/response/uk_template_detail_entity.dart';
+import 'package:domain/entity/response/uk_template_detail_index_entity.dart';
+import 'package:domain/entity/response/uk_template_title_option_entity.dart';
 import 'package:domain/repository/uk_job_repository.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_basic/basic_export.dart';
+import 'package:plugin_basic/modules/global_web_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:plugin_basic/widget/webview_page.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';
+import 'package:plugin_platform/http/http_result.dart';
+import 'package:router/path/router_path.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/picker/option_pick_util.dart';
 import 'package:widgets/widget_export.dart';
 
 /*
@@ -27,6 +37,28 @@ class AppliedAddStaffController extends GetxController with DioCancelableMixin {
 
   String keyword = "";
   String? jobId = null;
+
+
+  String? get selectedIndustryId {
+    // 遍历 industryOptionEntityList 中获取 对应的 selectedJobIndustryStr 的 id
+    var matchedItems = industryOptionEntityList?.where((e) => e.name == selectedJobIndustryStr);
+    return matchedItems?.isNotEmpty == true ? matchedItems!.first.id?.toString() : null;
+  }
+
+  String? get selectedJobTitleId {
+    // 遍历 jobTitleOptionEntityList 中获取 对应的 selectedJobTitleStr 的 id
+    var matchedItems = jobTitleOptionEntityList?.where((e) => e.name == selectedJobTitleStr);
+    return matchedItems?.isNotEmpty == true ? matchedItems!.first.id?.toString() : null;
+  }
+
+  List<UkJobListAppliedStaffSelectoptionsEntity>?  industryOptionEntityList;
+  String? selectedJobIndustryStr;  // 选中的工作行业
+
+  List<UkJobListAppliedStaffSelectoptionsEntity>? jobTitleOptionEntityList; // 新增时工作标题的数据源
+  String? selectedJobTitleStr;  // 选择的工作标题
+
+
+  
   List<UkJobListAppliedStaffSearchRows> datas = [];
 
   //刷新页面状态
@@ -60,16 +92,36 @@ class AppliedAddStaffController extends GetxController with DioCancelableMixin {
     fetchAllStaffList();
   }
 
+  /// 获取 industry 数据源
+  void _fetchIndexOption() async {
+    //获取到数据
+    if(industryOptionEntityList == null || industryOptionEntityList?.isEmpty == true){
+      // 获取选项
+      LoadingEngine.show();
+      final result = await _jobRepository.fetchAddStaffIndustryOptions(cancelToken: cancelToken);
+      if (result.isSuccess) {
+        LoadingEngine.dismiss();
+        industryOptionEntityList = result.list;
+        //刷新
+        update();
+      } else {
+        ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      }
+    }
+  }
+
+
   /// 获取列表数据
   Future fetchAllStaffList() async {
     if (_needShowPlaceholder) {
       changeLoadingState(LoadState.State_Loading);
     }
-
     // 获取 Staff 列表
     var listResult = await _jobRepository.searchStaffList(
       jobId,
       keyword,
+      selectedIndustryId,
+      selectedJobTitleId,
       curPage: _curPage,
       cancelToken: cancelToken,
     );
@@ -88,7 +140,6 @@ class AppliedAddStaffController extends GetxController with DioCancelableMixin {
 
   // 处理数据与展示的逻辑
   void handleList(List<UkJobListAppliedStaffSearchRows>? list) {
-    Log.d("563435  ${list}");
 
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
@@ -96,7 +147,6 @@ class AppliedAddStaffController extends GetxController with DioCancelableMixin {
         //刷新的方式
         datas.clear();
         datas.addAll(list);
-        Log.d("fdjskfjdskfjsd  ${datas}");
         refreshController.finishRefresh();
 
         //更新展示的状态
@@ -120,11 +170,110 @@ class AppliedAddStaffController extends GetxController with DioCancelableMixin {
     }
   }
 
+  //选择 industry
+  void showChooseIndustryPicker(){
+    int selectedIndustryIndex;
+    if (industryOptionEntityList == null || industryOptionEntityList?.isEmpty == true) {
+      selectedIndustryIndex = 0;
+    } else {
+      selectedIndustryIndex = industryOptionEntityList?.indexWhere((e) => e.name.toString() == selectedJobIndustryStr)?? 0;
+    }
+
+    if (selectedIndustryIndex < 0) {
+      selectedIndustryIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: industryOptionEntityList?.map((e) => e.name!).toList(growable: false)?? [],
+      initialSelectIndex: selectedIndustryIndex,
+      onPickerChanged: (_, index) {
+        String lastSelectedJobIndustryStr = selectedJobIndustryStr?? "";
+        String curSelectedIndustyStr = industryOptionEntityList?[index]?.name ?? "";
+        if(lastSelectedJobIndustryStr != curSelectedIndustyStr){
+          Log.d("选中的 curSelectedIndustyStr  ${curSelectedIndustyStr}");
+          selectedJobIndustryStr = curSelectedIndustyStr;
+          selectedJobTitleStr = "";
+          update();
+          // 需要调接口来获取工作标题的数据源
+          _fetchJobTitleOptionsList();
+        }
+      },
+    );
+  }
+
+  // 获取 工作标题的数据源
+  void _fetchJobTitleOptionsList() async {
+    LoadingEngine.show();
+    try {
+      // 获取到数据
+      HttpResult<UkJobListAppliedStaffSelectoptionsEntity> taskResult;
+
+      taskResult = await _jobRepository.fetchAddStaffJobTitleOptions(
+        selectedIndustryId!,
+        cancelToken: cancelToken,
+      );
+
+      if (taskResult.isSuccess) {
+        jobTitleOptionEntityList = taskResult.list;
+      } else {
+        ToastEngine.show(taskResult.errorMsg ?? "Network Load Error".tr);
+      }
+    } catch (e) {
+      // Log.e(e);
+    } finally {
+      LoadingEngine.dismiss();
+    }
+  }
+
+
+  // 显示工作标题picker
+  void showChooseJobTitlePicker(){
+    if(selectedIndustryId == null){
+      return ToastEngine.show("Please select industry first");
+    }
+    int selectedjobTitleIndex;
+    if (selectedJobTitleStr == null) {
+      selectedjobTitleIndex = 0;
+    } else {
+      selectedjobTitleIndex = jobTitleOptionEntityList?.indexWhere((e) => e.name.toString() == selectedJobTitleStr)?? 0;
+    }
+
+    if (selectedjobTitleIndex < 0) {
+      selectedjobTitleIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: jobTitleOptionEntityList?.map((e) => e.name.toString()!).toList(growable: false)?? [],
+      initialSelectIndex: selectedjobTitleIndex,
+      onPickerChanged: (_, index) {
+        selectedJobTitleStr = jobTitleOptionEntityList?[index]?.name?.toString()?? "";
+        update();
+        // 搜索
+        doSearch();
+      },
+    );
+  }
+
+
+
   //搜索
-  void doSearch(String keyword) {
+  void searchInputSearch(String keyword) {
     this.keyword = keyword;
+    doSearch();
+  }
+
+  // 搜索
+  void doSearch() {
     refreshController.callRefresh();
   }
+  // 重置搜索
+  void resetSearch() {
+    keyword = "";
+    selectedJobTitleStr = "";
+    selectedJobIndustryStr = "";
+    update();
+    doSearch();
+  }
 
   // 打标签
   Future handlerSetFavourite(UkJobListAppliedStaffSearchRows  data) async{
@@ -147,10 +296,44 @@ class AppliedAddStaffController extends GetxController with DioCancelableMixin {
     }
   }
 
+  // 浏览文件
+  void handlerScanFile(String url) {
+
+    if (url == null || url.isEmpty) {
+      ToastEngine.show("Invalid file URL");
+      return;
+    }
+
+    Log.d('原始URL: $url');
+
+    // 检查是否为PDF文件
+    if (url.toLowerCase().endsWith('.pdf')) {
+      // 使用PDF查看器打开或下载文件
+      String title = url!.substring(url!.lastIndexOf("/") + 1);
+
+      // 对URL进行正确解码
+      String decodedUrl = Uri.decodeComponent(url);
+      // 再编码
+      String encodedUrl = Uri.encodeFull(url);
+
+      Log.d('解码后URL: $decodedUrl');
+      Log.d('编码后URL: $encodedUrl');
+
+      // String urlNew = "https://yycircle-ap.s3.ap-southeast-1.amazonaws.com/202406/19/supporting_documents_to_submit.pdf";
+
+      GlobalWebPage.startInstance(title, url!, isNeedEncodeFull:false);
+
+    } else {
+      String title = url!.substring(url!.lastIndexOf("/") + 1);
+      GlobalWebPage.startInstance(title, url!);
+    }
+  }
+
   @override
   void onReady() {
     super.onReady();
     fetchAllStaffList();
+    _fetchIndexOption();
   }
 
   @override

+ 20 - 4
packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_controller.dart

@@ -65,6 +65,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 ?? '';
+
 
       Log.d("获取到的 atturl  ${state.labReqOption?.attUrl}");
 
@@ -145,6 +147,9 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
       var amountController = state.formData['amount']!['controller'];
       amountController.text = state.amount??state.amount!='null'??"0";
 
+      var locationController = state.formData['location']!['controller'];
+      locationController.text = state.location??'';
+
       var remarkController = state.formData['remark']!['controller'];
       var eventController = state.formData['event']!['controller'];
       var eventTypeController = state.formData['event_type']!['controller'];
@@ -153,6 +158,9 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
       var positionController = state.formData['position']!['controller'];
       var totalCostController = state.formData['total_cost']!['controller'];
 
+
+
+
       remarkController.text = state.labReqOption?.description ?? '';
       eventController.text = state.labReqOption?.eventName ?? "";
       eventTypeController.text = state.labReqOption?.eventType ?? "";
@@ -183,7 +191,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         fieldKey: 'video_cover_key',
         fieldLabel: 'Video Cover'.tr,
         fieldPathValueList: [''],
-        fieldPlaceholder: "Choose".tr,
+          fieldPlaceholder: "Choose File...".tr,
         maxSize: '10MB',
         allowedFileTypes: ['jpg', 'png', 'jpeg'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx'
         multiple: false,
@@ -203,7 +211,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         fieldKey: 'video_video_key',
         fieldLabel: 'Video'.tr,
         fieldPathValueList: [''],
-        fieldPlaceholder: "Choose".tr,
+        fieldPlaceholder: "Choose File...".tr,
         maxSize: '20MB',
         allowedFileTypes: ['mp4'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx'
         multiple: false,
@@ -222,7 +230,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         fieldKey: 'video_image_key',
         fieldLabel: 'Video Image'.tr,
         fieldPathValueList: [''],
-        fieldPlaceholder: "Choose".tr,
+        fieldPlaceholder: "Choose File...".tr,
         maxSize: '10MB',
         allowedFileTypes: ['jpg', 'png', 'jpeg'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx'
         multiple: false,
@@ -241,7 +249,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         fieldKey: 'video_document_key',
         fieldLabel: 'Video Document'.tr,
         fieldPathValueList: [''],
-        fieldPlaceholder: "Choose".tr,
+        fieldPlaceholder: "Choose File...".tr,
         maxSize: '10MB',
         allowedFileTypes: ['pdf','docx', 'doc'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx','doc'
         multiple: false,
@@ -270,6 +278,9 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
     String amount = amountController.text.toString();
     // String? jobApplyPreId = state.preSelectedIds;
 
+    var locationController = state.formData['location']!['controller'];
+
+
     var remarkController = state.formData['remark']!['controller'];
     var eventController = state.formData['event']!['controller'];
     var eventTypeController = state.formData['event_type']!['controller'];
@@ -285,6 +296,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
     String position = positionController.text.toString();
     String totalCost = totalCostController.text.toString();
     String remark = remarkController.text.toString();
+    String location = locationController.text.toString();
 
     var videoTextController = state.formData['video_text']!['controller'];
     String videoText = videoTextController.text.toString();
@@ -329,6 +341,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         "challenge25": state.selectedChallenge25Id?? "",
         "vehicle": state.selectedVehicleList?.join(",")??"",
         "description": remark,
+        "location": location,
         "employmentType": state.selectedTypeId,
         "eventName": event,
         "eventType": eventType,
@@ -359,6 +372,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         needNum: params['needNum'],
         salaryBy: params['salaryBy'],
         amount: params['amount'],
+        location: params['location'],
         certificate: params['certificate'],
         challenge25: params['challenge25'],
         vehicle: params['vehicle'],
@@ -394,6 +408,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         "vehicle": state.selectedVehicleList?.join(",")??"",
         "jobApplyPreId": state.preSelectedIds,
         "description": remark,
+        "location": location,
         "employmentType": state.selectedTypeId,
         "eventName": event,
         "eventType": eventType,
@@ -421,6 +436,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         salaryBy: params['salaryBy'],
         repeatDateStr: params['repeatDateStr'],
         amount: params['amount'],
+        location: params['location'],
         certificate: params['certificate'],
         challenge25: params['challenge25'],
         vehicle: params['vehicle'],

+ 11 - 2
packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_state.dart

@@ -87,6 +87,13 @@ class LabourRequestAddState implements CommonLabourRequestState {
       'hintText': 'Enter...'.tr,
       'obsecure': false,
     },
+    'location': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Enter...'.tr,
+      'obsecure': false,
+    },
     'event': {
       'value': '',
       'controller': TextEditingController(),
@@ -138,11 +145,13 @@ class LabourRequestAddState implements CommonLabourRequestState {
     }
   };
 
+
   @override
-  int get serviceType => labReqOption?.serviceType ?? 0;
+  String? location;
 
   @override
-  List<UkLabourRequestDetailLocationList>? get locationList => labReqOption?.locationList;
+  int get serviceType => labReqOption?.serviceType ?? 0;
+
   @override
   List<UkLabourRequestDetailTemplateList>? get templateList => labReqOption?.templateList;
   @override

+ 25 - 1
packages/cpt_uk/lib/modules/job/labour_request_add/widget/lab_request_and_request_review_form.dart

@@ -362,6 +362,30 @@ 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(
@@ -1048,7 +1072,7 @@ class CommonLabourRequestFormFields extends StatelessWidget {
             crossAxisAlignment: CrossAxisAlignment.start,
             children: [
               MyTextView(
-                "Video Text".tr,
+                "Text".tr,
                 fontSize: 15,
                 isFontRegular: true,
                 textColor: Colors.white,

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

@@ -23,12 +23,12 @@ abstract class CommonLabourRequestState {
   String? get selectedTypeId;
   String? get preSelectedNames;
   String? get attFilePath;
+  String? get location;
 
   List<String> selectedCertificateList = [];   //选中的 证书 certificate id
   List<String> selectedVehicleList = [];   //选中的 车辆 vehicle id
   String? selectedChallenge25Id;   // 选择的 challenge25 id
 
-  List<UkLabourRequestDetailLocationList>? get locationList;
   List<UkLabourRequestDetailTemplateList>? get templateList;
   List<UkLabourRequestDetailDepartmentList>? get departmentList;
   List<UkLabourRequestDetailChargeList>? get chargeList;
@@ -192,6 +192,13 @@ abstract class CommonLabourRequestState {
       'hintText': 'Enter...'.tr,
       'obsecure': false,
     },
+    'location': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Enter...'.tr,
+      'obsecure': false,
+    },
     'event': {
       'value': '',
       'controller': TextEditingController(),

+ 2 - 2
packages/cpt_uk/lib/modules/job/labour_request_add/widget/uploadFileField.dart

@@ -44,7 +44,7 @@ class FileFieldItem {
     this.onFilePreview,
     this.onFileDownload,
   }): this.fieldPathValueList = fieldPathValueList!=null?fieldPathValueList?.cast<String>()?? []: null,
-      this.fieldPlaceholder = fieldPlaceholder?? 'Choose File',
+      this.fieldPlaceholder = fieldPlaceholder?? 'Choose File...',
       this.canUpload = canUpload?? true,
       this.multiple = multiple?? false,
       this.disabled = disabled?? false,
@@ -364,7 +364,7 @@ class _UploadFileFieldState extends State<UploadFileField> {
               MyTextView(
                 '${_filedInputText}',
                 fontSize: 14,
-                hint: "Choose File".tr,
+                hint: "${widget.fileField.fieldPlaceholder}".tr,
                 textHintColor: ColorConstants.textGrayAECAE5,
                 isFontMedium: true,
                 textColor: ColorConstants.white,

+ 340 - 105
packages/cpt_uk/lib/modules/job/labour_request_preselected_list/widget/preselected_add_staff.dart

@@ -8,9 +8,11 @@ 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:shared/utils/util.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:cs_resources/constants/color_constants.dart';
 import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_button.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 import 'package:widgets/search_app_bar.dart';
@@ -73,88 +75,80 @@ class _PreselectedAddStaffState extends State<PreselectedAddStaff> {
                 ),
               ),
 
-              SearchAppBar(
-                value: controller.keyword,
-                searchBarHeight: 38,
-                searchBarBgColor: Colors.white,
-                searchBarBorderRadius: 15,
-                searchBarBorder: Border.all(
-                  color: Color(0XFFC3C3C3), // 设置边框颜色为灰色
-                  width: 0.5, // 设置边框宽度
-                ),
-                textHintColor: Color(0XFFAFB3B7),
-                textColor: ColorConstants.black33,
-                onSearch: (keyword) {
-                  controller.doSearch(keyword);
-                },
-                hintText: "Staff Name/ID/Phone".tr,
-                controller: controller.searchController,
-              ).marginOnly(left: 16.5, right: 1.5, bottom: 15.5),
-
+              // 搜索栏
               Container(
-                color: Colors.white,
-                child: EasyRefresh(
-                  header: ClassicHeader(
-                    dragText: 'Pull to refresh'.tr,
-                    armedText: 'Release ready'.tr,
-                    readyText: 'Refreshing...'.tr,
-                    processingText: 'Refreshing...'.tr,
-                    processedText: 'Succeeded'.tr,
-                    noMoreText: 'No more'.tr,
-                    failedText: 'Failed'.tr,
-                    messageText: 'Last updated at %T'.tr,
-                    textStyle: const TextStyle(color: ColorConstants.black66, fontSize: 14),
-                    messageStyle: const TextStyle(color: ColorConstants.black66, fontSize: 12),
-                    iconTheme: const IconThemeData(color: ColorConstants.black66),
-                    backgroundColor: Colors.transparent,
-                  ),
-                  footer: ClassicFooter(
-                    dragText: 'Pull to load'.tr,
-                    armedText: 'Release ready'.tr,
-                    readyText: 'Loading...'.tr,
-                    processingText: 'Loading...'.tr,
-                    processedText: 'Succeeded'.tr,
-                    noMoreText: 'No more'.tr,
-                    failedText: 'Failed'.tr,
-                    showMessage: false,
-                    triggerOffset: 50,
-                    iconDimension: 22,
-                    textStyle: const TextStyle(color: ColorConstants.black66, fontSize: 14),
-                    messageStyle: const TextStyle(color: ColorConstants.black66, fontSize: 12),
-                    iconTheme: const IconThemeData(color: ColorConstants.black66),
-                    backgroundColor: Colors.transparent,
-                  ),
-                  controller: controller.refreshController,
-                  onRefresh: controller.onRefresh,
-                  onLoad: controller.loadMore,
-                  child: LoadStateLayout(
-                    themeColor: ColorConstants.black66,
-                    state: controller.loadingState,
-                    errorMessage: controller.errorMessage,
-                    errorRetry: () {
-                      controller.retryRequest();
-                    },
-                    successSliverWidget: [
-                      SliverList(
-                          delegate: SliverChildBuilderDelegate(
-                                (context, index) {
-                              return _buildStaffItem(controller.datas[index], () {
-                                /// Item选中与未选中设置
-                                controller.datas[index].isSelected = !controller.datas[index].isSelected;
-                                controller.update();
+                height: 100,
+                // color: Colors.red,
+                padding: const EdgeInsets.only(left: 10, right: 10),
+                child: _buildSearchSection(controller),
+              ),
+
+              Expanded(
+                child: Container(
+                  color: Colors.white,
+                  child: EasyRefresh(
+                    header: ClassicHeader(
+                      dragText: 'Pull to refresh'.tr,
+                      armedText: 'Release ready'.tr,
+                      readyText: 'Refreshing...'.tr,
+                      processingText: 'Refreshing...'.tr,
+                      processedText: 'Succeeded'.tr,
+                      noMoreText: 'No more'.tr,
+                      failedText: 'Failed'.tr,
+                      messageText: 'Last updated at %T'.tr,
+                      textStyle: const TextStyle(color: ColorConstants.black66, fontSize: 14),
+                      messageStyle: const TextStyle(color: ColorConstants.black66, fontSize: 12),
+                      iconTheme: const IconThemeData(color: ColorConstants.black66),
+                      backgroundColor: Colors.transparent,
+                    ),
+                    footer: ClassicFooter(
+                      dragText: 'Pull to load'.tr,
+                      armedText: 'Release ready'.tr,
+                      readyText: 'Loading...'.tr,
+                      processingText: 'Loading...'.tr,
+                      processedText: 'Succeeded'.tr,
+                      noMoreText: 'No more'.tr,
+                      failedText: 'Failed'.tr,
+                      showMessage: false,
+                      triggerOffset: 50,
+                      iconDimension: 22,
+                      textStyle: const TextStyle(color: ColorConstants.black66, fontSize: 14),
+                      messageStyle: const TextStyle(color: ColorConstants.black66, fontSize: 12),
+                      iconTheme: const IconThemeData(color: ColorConstants.black66),
+                      backgroundColor: Colors.transparent,
+                    ),
+                    controller: controller.refreshController,
+                    onRefresh: controller.onRefresh,
+                    onLoad: controller.loadMore,
+                    child: LoadStateLayout(
+                      themeColor: ColorConstants.black66,
+                      state: controller.loadingState,
+                      errorMessage: controller.errorMessage,
+                      errorRetry: () {
+                        controller.retryRequest();
+                      },
+                      successSliverWidget: [
+                        SliverList(
+                            delegate: SliverChildBuilderDelegate(
+                                  (context, index) {
+                                return _buildStaffItem(controller, controller.datas[index], () {
+                                  /// Item选中与未选中设置
+                                  controller.datas[index].isSelected = !controller.datas[index].isSelected;
+                                  controller.update();
+                                },
+                                  clickFavoriteCallback: () {
+                                    // 调用 打标的 接口
+                                    controller.handlerSetFavourite(controller.datas[index]);
+                                  }
+                                );
                               },
-                                clickFavoriteCallback: () {
-                                  // 调用 打标的 接口
-                                  controller.handlerSetFavourite(controller.datas[index]);
-                                }
-                              );
-                            },
-                            childCount: controller.datas.length,
-                          ))
-                    ],
+                              childCount: controller.datas.length,
+                            ))
+                      ],
+                    ),
                   ),
                 ),
-              ).expanded(),
+              ),
 
               //按钮组
               Row(
@@ -229,7 +223,171 @@ class _PreselectedAddStaffState extends State<PreselectedAddStaff> {
 
   }
 
-  Widget _buildStaffItem(UkLabourRequestPreselectAddstaffListRows item, VoidCallback callback, { VoidCallback? clickFavoriteCallback }) {
+  Widget _buildSearchSection(PreselectedAddStaffController controller,){
+    return Column(
+      mainAxisSize: MainAxisSize.min,
+      crossAxisAlignment: CrossAxisAlignment.start,
+      mainAxisAlignment: MainAxisAlignment.start,
+      children: [
+        Row(
+          children: [
+            // 行业
+            Expanded(child: _buildIndustrySelectWidget(controller)),
+            SizedBox(width: 10),
+            // 工作标题
+            Expanded(child: _buildJobTitleSelectWidget(controller)),
+          ],
+        ),
+        Row(
+          children: [
+            Expanded(
+              child: SearchAppBar(
+                value: controller.keyword,
+                searchBarHeight: 38,
+                searchBarBgColor: Colors.white,
+                searchBarBorderRadius: 15,
+                searchBarBorder: Border.all(
+                  color: Color(0XFFC3C3C3), // 设置边框颜色为灰色
+                  width: 0.5, // 设置边框宽度
+                ),
+                textHintColor: Color(0XFFAFB3B7),
+                textColor: ColorConstants.black33,
+                onSearch: (keyword) {
+                  controller.searchInputSearch(keyword);
+                },
+                hintText: "Staff Name/ID/Phone".tr,
+                controller: controller.searchController,
+              ),
+            ),
+            Row(
+              mainAxisAlignment: MainAxisAlignment.end,
+              crossAxisAlignment: CrossAxisAlignment.center,
+              children: [
+                // MyButton(
+                //   onPressed: () {
+                //     FocusScope.of(context).unfocus();
+                //     controller.doSearch();
+                //   },
+                //   text: "Filter".tr,
+                //   textColor: ColorConstants.white,
+                //   backgroundColor: hexToColor("#2BA9F9", opacity: 0.5),
+                //   radius: 20,
+                //   minWidth: 60,
+                //   minHeight: 35,
+                // ),
+                MyButton(
+                  onPressed: () {
+                    FocusScope.of(context).unfocus();
+                    controller.resetSearch();
+                  },
+                  text: "Reset".tr,
+                  textColor: ColorConstants.white,
+                  backgroundColor: hexToColor("#2BA9F9", opacity: 0.5),
+                  radius: 20,
+                  minWidth: 60,
+                  minHeight: 35,
+                ),
+              ],
+            ),
+          ],
+        ),
+      ],
+    );
+  }
+
+  // 行业选择
+  Widget _buildIndustrySelectWidget(PreselectedAddStaffController controller) {
+    return Container(
+      child: Row(
+        mainAxisSize: MainAxisSize.max,
+        mainAxisAlignment: MainAxisAlignment.start,
+        crossAxisAlignment: CrossAxisAlignment.center,
+        children: [
+          // 行业
+          // FormRequireText(text: "Industry".tr, isRequired: false,).marginOnly(right: 38),
+          //选择行业
+          Expanded(
+            child: Container(
+              padding: const EdgeInsets.only(left: 5, right: 5),
+              margin: const EdgeInsets.only(top: 5),
+              height: 40,
+              decoration: BoxDecoration(
+                color:  Color(0xFF4DCFF6).withOpacity(0.2),
+                // border: Border.all(color: Colors.black12.withOpacity(0.05)),
+                borderRadius: const BorderRadius.all(Radius.circular(5)),
+              ),
+              child: Row(
+                mainAxisSize: MainAxisSize.max,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                mainAxisAlignment: MainAxisAlignment.start,
+                children: [
+                  MyTextView(
+                    controller.selectedJobIndustryStr ==null || Utils.isEmpty(controller.selectedJobIndustryStr)? '': controller.selectedJobIndustryStr! ,
+                    hint: "Choose Industry".tr,
+                    textHintColor: ColorConstants.textGrayAECAE5,
+                    fontSize: 12,
+                    isFontMedium: true,
+                    textColor: ColorConstants.black33,
+                  ).expanded(),
+                  const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                ],
+              ),
+            ).onTap(() {
+              controller.showChooseIndustryPicker();
+            }),
+          )
+        ],
+      ),
+    );
+  }
+
+  // 工作标题选择
+  Widget _buildJobTitleSelectWidget(PreselectedAddStaffController controller) {
+    return Container(
+      child: Row(
+        mainAxisAlignment: MainAxisAlignment.start,
+        crossAxisAlignment: CrossAxisAlignment.center,
+        children: [
+          // 工作标题
+          // FormRequireText(text: "Job Title".tr, isRequired:false).marginOnly(top: 15),
+          //选择template
+          Expanded(
+            child: Container(
+              padding: const EdgeInsets.only(left: 5, right: 5),
+              margin: const EdgeInsets.only(top: 5),
+              height: 40,
+              decoration: BoxDecoration(
+                color:  Color(0xFF4DCFF6).withOpacity(0.2),
+                // border: Border.all(color: Colors.black12.withOpacity(0.05)),
+                borderRadius: const BorderRadius.all(Radius.circular(5)),
+              ),
+              child: Row(
+                mainAxisSize: MainAxisSize.max,
+                crossAxisAlignment: CrossAxisAlignment.center,
+                mainAxisAlignment: MainAxisAlignment.start,
+                children: [
+                  MyTextView(
+                    controller.selectedJobTitleStr ==null || Utils.isEmpty(controller.selectedJobTitleStr)? '': controller.selectedJobTitleStr! ,
+                    hint: "Choose JobTitle".tr,
+                    textHintColor: ColorConstants.textGrayAECAE5,
+                    fontSize: 12,
+                    isFontMedium: true,
+                    textColor: ColorConstants.black33,
+                  ).expanded(),
+                  const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                ],
+              ),
+            ).onTap(() {
+              controller.showChooseJobTitlePicker();
+            }),
+          )
+        ],
+      ),
+    );
+  }
+
+
+  Widget _buildStaffItem(PreselectedAddStaffController controller, UkLabourRequestPreselectAddstaffListRows item, VoidCallback callback, { VoidCallback? clickFavoriteCallback }) {
     return Stack(
       children: [
         Column(
@@ -271,66 +429,143 @@ class _PreselectedAddStaffState extends State<PreselectedAddStaff> {
               ],
             ).marginOnly(top: 5),
 
-            //性别
+            // //性别
+            // Row(
+            //   children: [
+            //     MyTextView(
+            //       "Gender:".tr,
+            //       marginRight: 3,
+            //       textColor: ColorConstants.black66,
+            //       fontSize: 13,
+            //       isFontRegular: true,
+            //     ),
+            //     MyTextView(
+            //       item.gender ?? "-",
+            //       textColor: ColorConstants.black66,
+            //       fontSize: 13,
+            //       isFontRegular: true,
+            //     ),
+            //   ],
+            // ).marginOnly(top: 5),
+            //
+            // //身份证
+            // Row(
+            //   children: [
+            //     MyTextView(
+            //       "ID Card No.:".tr,
+            //       marginRight: 3,
+            //       textColor: ColorConstants.black66,
+            //       fontSize: 13,
+            //       isFontRegular: true,
+            //     ),
+            //     MyTextView(
+            //       item.nric ?? "-",
+            //       textColor: ColorConstants.black66,
+            //       fontSize: 13,
+            //       isFontRegular: true,
+            //     ),
+            //   ],
+            // ).marginOnly(top: 5),
+            //
+            // //status
+            // Row(
+            //     mainAxisAlignment: MainAxisAlignment.start,
+            //     crossAxisAlignment: CrossAxisAlignment.center,
+            //     children: [
+            //       MyTextView(
+            //         "Status:".tr,
+            //         isFontRegular: true,
+            //         textColor: ColorConstants.black66,
+            //         fontSize: 14,
+            //       ),
+            //
+            //       MyTextView(
+            //         _getStatusText(item.status),
+            //         marginLeft: 5,
+            //         isFontRegular: true,
+            //         textColor: ColorConstants.black66,
+            //         fontSize: 14,
+            //       ),
+            //     ]
+            // ).marginOnly(top: 5),
+
             Row(
               children: [
                 MyTextView(
-                  "Gender:".tr,
+                  "Turn-Up Rate".tr + ":",
                   marginRight: 3,
                   textColor: ColorConstants.black66,
                   fontSize: 13,
                   isFontRegular: true,
                 ),
                 MyTextView(
-                  item.gender ?? "-",
+                  item.turnUpRate ?? "-",
                   textColor: ColorConstants.black66,
                   fontSize: 13,
                   isFontRegular: true,
                 ),
               ],
             ).marginOnly(top: 5),
-
-            //身份证
             Row(
               children: [
                 MyTextView(
-                  "ID Card No.:".tr,
+                  "Reviews".tr + ":",
                   marginRight: 3,
                   textColor: ColorConstants.black66,
                   fontSize: 13,
                   isFontRegular: true,
                 ),
                 MyTextView(
-                  item.nric ?? "-",
+                  item.reviewsAvg ?? "-",
                   textColor: ColorConstants.black66,
                   fontSize: 13,
                   isFontRegular: true,
                 ),
               ],
             ).marginOnly(top: 5),
-
-            //status
             Row(
-                mainAxisAlignment: MainAxisAlignment.start,
-                crossAxisAlignment: CrossAxisAlignment.center,
-                children: [
-                  MyTextView(
-                    "Status:".tr,
-                    isFontRegular: true,
-                    textColor: ColorConstants.black66,
-                    fontSize: 14,
-                  ),
+              children: [
+                MyTextView(
+                  "Skills".tr + ":",
+                  marginRight: 3,
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ),
+                MyTextView(
+                  item.skills ?? "-",
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ).expanded(),
+              ],
+            ).marginOnly(top: 5),
 
-                  MyTextView(
-                    _getStatusText(item.status),
-                    marginLeft: 5,
-                    isFontRegular: true,
-                    textColor: ColorConstants.black66,
-                    fontSize: 14,
-                  ),
-                ]
+            Row(
+              children: [
+                MyTextView(
+                  "CV".tr + ":",
+                  marginRight: 3,
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ),
+                MyTextView(
+                  item.resume ?? "-",
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                  onClick: (){
+                    // 点击查看 打开webview 页面
+                    if(item.resume?.isNotEmpty == true && Utils.isNetworkUrl(item.resume!)){
+                      controller.handlerScanFile(item.resume!);
+                    }
+                  },
+                ).expanded(),
+              ],
             ).marginOnly(top: 5),
 
+
             Container(
               margin: EdgeInsets.only(top: 19),
               width: double.infinity,

+ 179 - 1
packages/cpt_uk/lib/modules/job/labour_request_preselected_list/widget/preselected_add_staff_controller.dart

@@ -1,16 +1,20 @@
 import 'package:domain/entity/response/job_list_applied_staff_search_entity.dart';
+import 'package:domain/entity/response/uk_job_list_applied_staff_selectoptions_entity.dart';
 import 'package:domain/entity/response/uk_labour_request_preselect_addstaff_list_entity.dart';
 import 'package:domain/repository/job_repository.dart';
 import 'package:domain/repository/uk_job_repository.dart';
 import 'package:domain/repository/uk_labour_repository.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_basic/basic_export.dart';
+import 'package:plugin_basic/modules/global_web_page.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';
+import 'package:plugin_platform/http/http_result.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/picker/option_pick_util.dart';
 import 'package:widgets/widget_export.dart';
 
 /*
@@ -31,6 +35,26 @@ class PreselectedAddStaffController extends GetxController with DioCancelableMix
 
   String keyword = "";
   String? jobId = null;
+
+  String? get selectedIndustryId {
+    // 遍历 industryOptionEntityList 中获取 对应的 selectedJobIndustryStr 的 id
+    var matchedItems = industryOptionEntityList?.where((e) => e.name == selectedJobIndustryStr);
+    return matchedItems?.isNotEmpty == true ? matchedItems!.first.id?.toString() : null;
+  }
+
+  String? get selectedJobTitleId {
+    // 遍历 jobTitleOptionEntityList 中获取 对应的 selectedJobTitleStr 的 id
+    var matchedItems = jobTitleOptionEntityList?.where((e) => e.name == selectedJobTitleStr);
+    return matchedItems?.isNotEmpty == true ? matchedItems!.first.id?.toString() : null;
+  }
+
+  List<UkJobListAppliedStaffSelectoptionsEntity>?  industryOptionEntityList;
+  String? selectedJobIndustryStr;  // 选中的工作行业
+
+  List<UkJobListAppliedStaffSelectoptionsEntity>? jobTitleOptionEntityList; // 新增时工作标题的数据源
+  String? selectedJobTitleStr;  // 选择的工作标题
+
+
   List<UkLabourRequestPreselectAddstaffListRows> datas = [];
 
   //刷新页面状态
@@ -64,6 +88,24 @@ class PreselectedAddStaffController extends GetxController with DioCancelableMix
     fetchAllStaffList();
   }
 
+  /// 获取 industry 数据源
+  void _fetchIndexOption() async {
+    //获取到数据
+    if(industryOptionEntityList == null || industryOptionEntityList?.isEmpty == true){
+      // 获取选项
+      LoadingEngine.show();
+      final result = await _jobRepository.fetchAddStaffIndustryOptions(cancelToken: cancelToken);
+      if (result.isSuccess) {
+        LoadingEngine.dismiss();
+        industryOptionEntityList = result.list;
+        //刷新
+        update();
+      } else {
+        ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      }
+    }
+  }
+
   /// 获取列表数据
   Future fetchAllStaffList() async {
     if (_needShowPlaceholder) {
@@ -74,6 +116,8 @@ class PreselectedAddStaffController extends GetxController with DioCancelableMix
     var listResult = await _labourRepository.fetchtPreselectedAddStaffList(
       keyword,
       jobId,
+      selectedIndustryId,
+      selectedJobTitleId,
       curPage: _curPage,
       cancelToken: cancelToken,
     );
@@ -122,11 +166,111 @@ class PreselectedAddStaffController extends GetxController with DioCancelableMix
     }
   }
 
+  //选择 industry
+  void showChooseIndustryPicker(){
+    int selectedIndustryIndex;
+    if (industryOptionEntityList == null || industryOptionEntityList?.isEmpty == true) {
+      selectedIndustryIndex = 0;
+    } else {
+      selectedIndustryIndex = industryOptionEntityList?.indexWhere((e) => e.name.toString() == selectedJobIndustryStr)?? 0;
+    }
+
+    if (selectedIndustryIndex < 0) {
+      selectedIndustryIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: industryOptionEntityList?.map((e) => e.name!).toList(growable: false)?? [],
+      initialSelectIndex: selectedIndustryIndex,
+      onPickerChanged: (_, index) {
+        String lastSelectedJobIndustryStr = selectedJobIndustryStr?? "";
+        String curSelectedIndustyStr = industryOptionEntityList?[index]?.name ?? "";
+        if(lastSelectedJobIndustryStr != curSelectedIndustyStr){
+          Log.d("选中的 curSelectedIndustyStr  ${curSelectedIndustyStr}");
+          selectedJobIndustryStr = curSelectedIndustyStr;
+          selectedJobTitleStr = "";
+          update();
+          // 需要调接口来获取工作标题的数据源
+          _fetchJobTitleOptionsList();
+        }
+      },
+    );
+  }
+
+  // 获取 工作标题的数据源
+  void _fetchJobTitleOptionsList() async {
+    LoadingEngine.show();
+    try {
+      // 获取到数据
+      HttpResult<UkJobListAppliedStaffSelectoptionsEntity> taskResult;
+
+      taskResult = await _jobRepository.fetchAddStaffJobTitleOptions(
+        selectedIndustryId!,
+        cancelToken: cancelToken,
+      );
+
+      if (taskResult.isSuccess) {
+        jobTitleOptionEntityList = taskResult.list;
+      } else {
+        ToastEngine.show(taskResult.errorMsg ?? "Network Load Error".tr);
+      }
+    } catch (e) {
+      // Log.e(e);
+    } finally {
+      LoadingEngine.dismiss();
+    }
+  }
+
+
+  // 显示工作标题picker
+  void showChooseJobTitlePicker(){
+    if(selectedIndustryId == null){
+      return ToastEngine.show("Please select industry first");
+    }
+    int selectedjobTitleIndex;
+    if (selectedJobTitleStr == null) {
+      selectedjobTitleIndex = 0;
+    } else {
+      selectedjobTitleIndex = jobTitleOptionEntityList?.indexWhere((e) => e.name.toString() == selectedJobTitleStr)?? 0;
+    }
+
+    if (selectedjobTitleIndex < 0) {
+      selectedjobTitleIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: jobTitleOptionEntityList?.map((e) => e.name.toString()!).toList(growable: false)?? [],
+      initialSelectIndex: selectedjobTitleIndex,
+      onPickerChanged: (_, index) {
+        selectedJobTitleStr = jobTitleOptionEntityList?[index]?.name?.toString()?? "";
+        update();
+        // 搜索
+        doSearch();
+      },
+    );
+  }
+
+
+
   //搜索
-  void doSearch(String keyword) {
+  void searchInputSearch(String keyword) {
     this.keyword = keyword;
+    doSearch();
+  }
+
+  // 搜索
+  void doSearch() {
     refreshController.callRefresh();
   }
+  // 重置搜索
+  void resetSearch() {
+    keyword = "";
+    selectedJobTitleStr = "";
+    selectedJobIndustryStr = "";
+    update();
+    doSearch();
+  }
+
 
   // 打标签
   Future handlerSetFavourite(UkLabourRequestPreselectAddstaffListRows  data) async{
@@ -149,10 +293,44 @@ class PreselectedAddStaffController extends GetxController with DioCancelableMix
     }
   }
 
+  // 浏览文件
+  void handlerScanFile(String url) {
+
+    if (url == null || url.isEmpty) {
+      ToastEngine.show("Invalid file URL");
+      return;
+    }
+
+    Log.d('原始URL: $url');
+
+    // 检查是否为PDF文件
+    if (url.toLowerCase().endsWith('.pdf')) {
+      // 使用PDF查看器打开或下载文件
+      String title = url!.substring(url!.lastIndexOf("/") + 1);
+
+      // 对URL进行正确解码
+      String decodedUrl = Uri.decodeComponent(url);
+      // 再编码
+      String encodedUrl = Uri.encodeFull(url);
+
+      Log.d('解码后URL: $decodedUrl');
+      Log.d('编码后URL: $encodedUrl');
+
+      // String urlNew = "https://yycircle-ap.s3.ap-southeast-1.amazonaws.com/202406/19/supporting_documents_to_submit.pdf";
+
+      GlobalWebPage.startInstance(title, url!, isNeedEncodeFull:false);
+
+    } else {
+      String title = url!.substring(url!.lastIndexOf("/") + 1);
+      GlobalWebPage.startInstance(title, url!);
+    }
+  }
+
   @override
   void onReady() {
     super.onReady();
     fetchAllStaffList();
+    _fetchIndexOption();
   }
 
   @override

+ 11 - 4
packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_controller.dart

@@ -58,6 +58,7 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
       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.selectedTypeId = state.labReqOption?.employmentType.toString() ?? '';
+      state.location = state.labReqOption?.location ?? '';
 
       state.attFilePath = state.labReqOption?.attUrl?? '';
       state.jobSelectJobStart = state.labReqOption?.jobStart?? '';
@@ -122,6 +123,8 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
       needNumController.text = state.noStaff??state.noStaff!='null'??"0";
       var amountController = state.formData['amount']!['controller'];
       amountController.text = state.amount??state.amount!='null'??"0";
+      var locationController = state.formData['location']!['controller'];
+      locationController.text = state.location??'';
 
       var remarkController = state.formData['remark']!['controller'];
       var eventController = state.formData['event']!['controller'];
@@ -161,7 +164,7 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
           fieldKey: 'video_cover_key',
           fieldLabel: 'Video Cover'.tr,
           fieldPathValueList: [''],
-          fieldPlaceholder: "Choose".tr,
+          fieldPlaceholder: "Choose File...".tr,
           maxSize: '10MB',
           allowedFileTypes: ['jpg', 'png', 'jpeg'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx'
           multiple: false,
@@ -181,7 +184,7 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
         fieldKey: 'video_video_key',
         fieldLabel: 'Video'.tr,
         fieldPathValueList: [''],
-        fieldPlaceholder: "Choose".tr,
+        fieldPlaceholder: "Choose File...".tr,
         maxSize: '20MB',
         allowedFileTypes: ['mp4'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx'
         multiple: false,
@@ -200,7 +203,7 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
         fieldKey: 'video_image_key',
         fieldLabel: 'Video Image'.tr,
         fieldPathValueList: [''],
-        fieldPlaceholder: "Choose".tr,
+        fieldPlaceholder: "Choose File...".tr,
         maxSize: '10MB',
         allowedFileTypes: ['jpg', 'png', 'jpeg'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx'
         multiple: false,
@@ -219,7 +222,7 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
         fieldKey: 'video_document_key',
         fieldLabel: 'Video Document'.tr,
         fieldPathValueList: [''],
-        fieldPlaceholder: "Choose".tr,
+        fieldPlaceholder: "Choose File...".tr,
         maxSize: '10MB',
         allowedFileTypes: ['pdf','docx', 'doc'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx','doc'
         multiple: false,
@@ -533,6 +536,7 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
     String needNum = needNumController.text.toString();
     String amount = amountController.text.toString();
     // String? jobApplyPreId = state.preSelectedIds;
+    var locationController = state.formData['location']!['controller'];
 
     var remarkController = state.formData['remark']!['controller'];
     var eventController = state.formData['event']!['controller'];
@@ -549,6 +553,7 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
     String position = positionController.text.toString();
     String totalCost = totalCostController.text.toString();
     String remark = remarkController.text.toString();
+    String location = locationController.text.toString();
 
     var videoTextController = state.formData['video_text']!['controller'];
     String videoText = videoTextController.text.toString();
@@ -585,6 +590,7 @@ 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,
+      "location": location,
       "salaryBy": 'hour',
       "amount": state.labReqOption?.serviceType == 1 ? amount : null,
       "certificate": state.selectedCertificateList?.join(",")?? "",
@@ -616,6 +622,7 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
       jobEnd: params['jobEnd'],
       departmentId: params['departmentId'],
       needNum: params['needNum'],
+      location: params['location'],
       salaryBy: params['salaryBy'],
       amount: params['amount'],
       certificate: params['certificate'],

+ 10 - 1
packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_state.dart

@@ -61,7 +61,6 @@ class LabourReviewEditState implements CommonLabourRequestState {
   String? chargeOptionId;
 
   int get serviceType => labReqOption?.serviceType ?? 0;
-  List<UkLabourRequestDetailLocationList>? get locationList => labReqOption?.locationList;
   List<UkLabourRequestDetailTemplateList>? get templateList => labReqOption?.templateList;
   List<UkLabourRequestDetailDepartmentList>? get departmentList => labReqOption?.departmentList;
   List<UkLabourRequestDetailChargeList>? get chargeList => labReqOption?.chargeList;
@@ -97,6 +96,13 @@ class LabourReviewEditState implements CommonLabourRequestState {
       'hintText': 'Enter...'.tr,
       'obsecure': false,
     },
+    'location': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Enter...'.tr,
+      'obsecure': false,
+    },
     'event': {
       'value': '',
       'controller': TextEditingController(),
@@ -149,6 +155,9 @@ class LabourReviewEditState implements CommonLabourRequestState {
   };
 
   @override
+  String? location;
+
+  @override
   String? videoText;
 
   @override

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

@@ -319,6 +319,10 @@ class ApiConstants {
   // labourrequest-review 批量审核(确认和拒绝)提交
   static const apiLabourRequestReViewBatchSubmitUK = "/index.php/api/v1/hotel/lab-req/review-batch";
 
+  // applied 行业列表
+  static const apiAppliedStaffIndustryListUK = "/index.php/api/v1/hotel/prestaff/industry";
+  // applied - 根据行业id 获取工作标题列表
+  static const apiAppliedStaffJobTitleListUK = "/index.php/api/v1/hotel/prestaff/show-job-title";
   // applied - 设置小费
   static const apiAppliedStaffBatchSetTipUK = "/index.php/api/v1/hotel/applied/batch-tips";
   // revise - 列表

+ 9 - 1
packages/cs_domain/lib/entity/response/uk_job_list_applied_staff_search_entity.dart

@@ -30,10 +30,18 @@ class UkJobListAppliedStaffSearchRows {
 	String? phone;
 	String? nric;
 	String? avatar;
+	@JSONField(name: "reviews_avg")
+	String? reviewsAvg;
+	String? skills;
+	@JSONField(name: "skills_short")
+	String? skillsShort;
+	String? resume;
+	@JSONField(name: "turn_up_rate")
+	String? turnUpRate;
 	@JSONField(name: "apply_state")
 	int? applyState;
 
-	bool isSelected=false;
+	bool isSelected = false;
 
 	UkJobListAppliedStaffSearchRows();
 

+ 21 - 0
packages/cs_domain/lib/entity/response/uk_job_list_applied_staff_selectoptions_entity.dart

@@ -0,0 +1,21 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/uk_job_list_applied_staff_selectoptions_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/uk_job_list_applied_staff_selectoptions_entity.g.dart';
+
+@JsonSerializable()
+class UkJobListAppliedStaffSelectoptionsEntity {
+	int? id;
+	String? name;
+
+	UkJobListAppliedStaffSelectoptionsEntity();
+
+	factory UkJobListAppliedStaffSelectoptionsEntity.fromJson(Map<String, dynamic> json) => $UkJobListAppliedStaffSelectoptionsEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkJobListAppliedStaffSelectoptionsEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 2 - 24
packages/cs_domain/lib/entity/response/uk_labour_request_detail_entity.dart

@@ -20,8 +20,6 @@ class UkLabourRequestDetailEntity {
 	@JSONField(name: "template_id")
 	int? templateId;
 	String? location;
-	@JSONField(name: "job_location_other")
-	String? jobLocationOther;
 	@JSONField(name: "service_type")
 	int? serviceType;
 	@JSONField(name: "salary_by")
@@ -30,9 +28,9 @@ class UkLabourRequestDetailEntity {
 	@JSONField(name: "employment_type")
 	int? employmentType;
 	@JSONField(name: "event_name")
-	String? eventName;
+	dynamic eventName;
 	@JSONField(name: "event_type")
-	String? eventType;
+	dynamic eventType;
 	int? passengers;
 	@JSONField(name: "est_revenue")
 	dynamic estRevenue;
@@ -59,8 +57,6 @@ class UkLabourRequestDetailEntity {
 	List<UkLabourRequestDetailVehicleList>? vehicleList;
 	@JSONField(name: "challenge_25_list")
 	List<UkLabourRequestDetailChallenge25List>? challenge25List;
-	@JSONField(name: "location_list")
-	List<UkLabourRequestDetailLocationList>? locationList;
 	@JSONField(name: "template_list")
 	List<UkLabourRequestDetailTemplateList>? templateList;
 	@JSONField(name: "department_list")
@@ -137,24 +133,6 @@ class UkLabourRequestDetailChallenge25List {
 }
 
 @JsonSerializable()
-class UkLabourRequestDetailLocationList {
-	String? value;
-	String? txt;
-	String? selected;
-
-	UkLabourRequestDetailLocationList();
-
-	factory UkLabourRequestDetailLocationList.fromJson(Map<String, dynamic> json) => $UkLabourRequestDetailLocationListFromJson(json);
-
-	Map<String, dynamic> toJson() => $UkLabourRequestDetailLocationListToJson(this);
-
-	@override
-	String toString() {
-		return jsonEncode(this);
-	}
-}
-
-@JsonSerializable()
 class UkLabourRequestDetailTemplateList {
 	int? value;
 	String? txt;

+ 8 - 0
packages/cs_domain/lib/entity/response/uk_labour_request_preselect_addstaff_list_entity.dart

@@ -31,6 +31,14 @@ class UkLabourRequestPreselectAddstaffListRows {
 	@JSONField(name: "profile_picture")
 	String? profilePicture;
 	int? status;
+	@JSONField(name: "reviews_avg")
+	String? reviewsAvg;
+	String? skills;
+	@JSONField(name: "skills_short")
+	String? skillsShort;
+	String? resume;
+	@JSONField(name: "turn_up_rate")
+	String? turnUpRate;
 	@JSONField(name: "apply_state")
 	int? applyState;
 

+ 294 - 33
packages/cs_domain/lib/generated/json/base/json_convert_content.dart

@@ -117,6 +117,7 @@ import 'package:domain/entity/response/uk_job_applied_revise_info_entity.dart';
 import 'package:domain/entity/response/uk_job_applied_revise_log_entity.dart';
 import 'package:domain/entity/response/uk_job_applied_staff_list_entity.dart';
 import 'package:domain/entity/response/uk_job_list_applied_staff_search_entity.dart';
+import 'package:domain/entity/response/uk_job_list_applied_staff_selectoptions_entity.dart';
 import 'package:domain/entity/response/uk_job_template_detail_by_select_title_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';
@@ -983,7 +984,241 @@ class JsonConvert {
           .toList() as M;
     }
     if (<UkJobAppliedReviseLogRecordsContentStatus>[] is M) {
-      return data.map<UkJobAppliedReviseLogRecordsContentStatus>((Map<String, dynamic> e) => UkJobAppliedReviseLogRecordsContentStatus.fromJson(e))
+      return data.map<UkJobAppliedReviseLogRecordsContentStatus>((
+          Map<String, dynamic> e) =>
+          UkJobAppliedReviseLogRecordsContentStatus.fromJson(e)).toList() as M;
+    }
+    if (<UkJobAppliedReviseLogRecordsContentReason>[] is M) {
+      return data.map<UkJobAppliedReviseLogRecordsContentReason>((
+          Map<String, dynamic> e) =>
+          UkJobAppliedReviseLogRecordsContentReason.fromJson(e)).toList() as M;
+    }
+    if (<UkJobAppliedStaffListEntity>[] is M) {
+      return data.map<UkJobAppliedStaffListEntity>((Map<String, dynamic> e) =>
+          UkJobAppliedStaffListEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkJobAppliedStaffListRows>[] is M) {
+      return data.map<UkJobAppliedStaffListRows>((Map<String, dynamic> e) =>
+          UkJobAppliedStaffListRows.fromJson(e)).toList() as M;
+    }
+    if (<UkJobAppliedStaffListRowsSecurityIn>[] is M) {
+      return data.map<UkJobAppliedStaffListRowsSecurityIn>((
+          Map<String, dynamic> e) =>
+          UkJobAppliedStaffListRowsSecurityIn.fromJson(e)).toList() as M;
+    }
+    if (<UkJobAppliedStaffListRowsSecurityOut>[] is M) {
+      return data.map<UkJobAppliedStaffListRowsSecurityOut>((
+          Map<String, dynamic> e) =>
+          UkJobAppliedStaffListRowsSecurityOut.fromJson(e)).toList() as M;
+    }
+    if (<UkJobAppliedStaffListRowsWorkIn>[] is M) {
+      return data.map<UkJobAppliedStaffListRowsWorkIn>((
+          Map<String, dynamic> e) =>
+          UkJobAppliedStaffListRowsWorkIn.fromJson(e)).toList() as M;
+    }
+    if (<UkJobAppliedStaffListRowsWorkOut>[] is M) {
+      return data.map<UkJobAppliedStaffListRowsWorkOut>((
+          Map<String, dynamic> e) =>
+          UkJobAppliedStaffListRowsWorkOut.fromJson(e)).toList() as M;
+    }
+    if (<UkJobListAppliedStaffSearchEntity>[] is M) {
+      return data.map<UkJobListAppliedStaffSearchEntity>((
+          Map<String, dynamic> e) =>
+          UkJobListAppliedStaffSearchEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkJobListAppliedStaffSearchRows>[] is M) {
+      return data.map<UkJobListAppliedStaffSearchRows>((
+          Map<String, dynamic> e) =>
+          UkJobListAppliedStaffSearchRows.fromJson(e)).toList() as M;
+    }
+    if (<UkJobListAppliedStaffSelectoptionsEntity>[] is M) {
+      return data.map<UkJobListAppliedStaffSelectoptionsEntity>((
+          Map<String, dynamic> e) =>
+          UkJobListAppliedStaffSelectoptionsEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkJobTemplateDetailBySelectTitleEntity>[] is M) {
+      return data.map<UkJobTemplateDetailBySelectTitleEntity>((
+          Map<String, dynamic> e) =>
+          UkJobTemplateDetailBySelectTitleEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkLabReqShowTemplateEntity>[] is M) {
+      return data.map<UkLabReqShowTemplateEntity>((Map<String, dynamic> e) =>
+          UkLabReqShowTemplateEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestDetailEntity>[] is M) {
+      return data.map<UkLabourRequestDetailEntity>((Map<String, dynamic> e) =>
+          UkLabourRequestDetailEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestDetailCertificateList>[] is M) {
+      return data.map<UkLabourRequestDetailCertificateList>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestDetailCertificateList.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestDetailVehicleList>[] is M) {
+      return data.map<UkLabourRequestDetailVehicleList>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestDetailVehicleList.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestDetailChallenge25List>[] is M) {
+      return data.map<UkLabourRequestDetailChallenge25List>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestDetailChallenge25List.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestDetailTemplateList>[] is M) {
+      return data.map<UkLabourRequestDetailTemplateList>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestDetailTemplateList.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestDetailDepartmentList>[] is M) {
+      return data.map<UkLabourRequestDetailDepartmentList>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestDetailDepartmentList.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestDetailChargeList>[] is M) {
+      return data.map<UkLabourRequestDetailChargeList>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestDetailChargeList.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestDetailEmploymentList>[] is M) {
+      return data.map<UkLabourRequestDetailEmploymentList>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestDetailEmploymentList.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestPreselectAddstaffListEntity>[] is M) {
+      return data.map<UkLabourRequestPreselectAddstaffListEntity>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestPreselectAddstaffListEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestPreselectAddstaffListRows>[] is M) {
+      return data.map<UkLabourRequestPreselectAddstaffListRows>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestPreselectAddstaffListRows.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestPreselectedListEntity>[] is M) {
+      return data.map<UkLabourRequestPreselectedListEntity>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestPreselectedListEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestPreselectedListRows>[] is M) {
+      return data.map<UkLabourRequestPreselectedListRows>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestPreselectedListRows.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestReviewDetailEntity>[] is M) {
+      return data.map<UkLabourRequestReviewDetailEntity>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestReviewDetailEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestReviewDetailOrder>[] is M) {
+      return data.map<UkLabourRequestReviewDetailOrder>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestReviewDetailOrder.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestReviewDetailOrderRequest>[] is M) {
+      return data.map<UkLabourRequestReviewDetailOrderRequest>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestReviewDetailOrderRequest.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestReviewDetailOrderRecords>[] is M) {
+      return data.map<UkLabourRequestReviewDetailOrderRecords>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestReviewDetailOrderRecords.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestReviewDetailRecords>[] is M) {
+      return data.map<UkLabourRequestReviewDetailRecords>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestReviewDetailRecords.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestReviewListEntity>[] is M) {
+      return data.map<UkLabourRequestReviewListEntity>((
+          Map<String, dynamic> e) =>
+          UkLabourRequestReviewListEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestReviewListRows>[] is M) {
+      return data.map<UkLabourRequestReviewListRows>((Map<String, dynamic> e) =>
+          UkLabourRequestReviewListRows.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestTableEntity>[] is M) {
+      return data.map<UkLabourRequestTableEntity>((Map<String, dynamic> e) =>
+          UkLabourRequestTableEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourRequestTableRows>[] is M) {
+      return data.map<UkLabourRequestTableRows>((Map<String, dynamic> e) =>
+          UkLabourRequestTableRows.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourReviewStatusEntity>[] is M) {
+      return data.map<UkLabourReviewStatusEntity>((Map<String, dynamic> e) =>
+          UkLabourReviewStatusEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourReviewStatusRow>[] is M) {
+      return data.map<UkLabourReviewStatusRow>((Map<String, dynamic> e) =>
+          UkLabourReviewStatusRow.fromJson(e)).toList() as M;
+    }
+    if (<UkLabourReviewStatusRecords>[] is M) {
+      return data.map<UkLabourReviewStatusRecords>((Map<String, dynamic> e) =>
+          UkLabourReviewStatusRecords.fromJson(e)).toList() as M;
+    }
+    if (<UkReportCasualEntity>[] is M) {
+      return data.map<UkReportCasualEntity>((Map<String, dynamic> e) =>
+          UkReportCasualEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkReportCasualRows>[] is M) {
+      return data.map<UkReportCasualRows>((Map<String, dynamic> e) =>
+          UkReportCasualRows.fromJson(e)).toList() as M;
+    }
+    if (<UkReportCasualTotal>[] is M) {
+      return data.map<UkReportCasualTotal>((Map<String, dynamic> e) =>
+          UkReportCasualTotal.fromJson(e)).toList() as M;
+    }
+    if (<UkReportCasualPayEntity>[] is M) {
+      return data.map<UkReportCasualPayEntity>((Map<String, dynamic> e) =>
+          UkReportCasualPayEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkReportCasualPayRows>[] is M) {
+      return data.map<UkReportCasualPayRows>((Map<String, dynamic> e) =>
+          UkReportCasualPayRows.fromJson(e)).toList() as M;
+    }
+    if (<UkReportCasualPayTotal>[] is M) {
+      return data.map<UkReportCasualPayTotal>((Map<String, dynamic> e) =>
+          UkReportCasualPayTotal.fromJson(e)).toList() as M;
+    }
+    if (<UkReportOutletEntity>[] is M) {
+      return data.map<UkReportOutletEntity>((Map<String, dynamic> e) =>
+          UkReportOutletEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkReportOutletRequestList>[] is M) {
+      return data.map<UkReportOutletRequestList>((Map<String, dynamic> e) =>
+          UkReportOutletRequestList.fromJson(e)).toList() as M;
+    }
+    if (<UkStaffDetailEntity>[] is M) {
+      return data.map<UkStaffDetailEntity>((Map<String, dynamic> e) =>
+          UkStaffDetailEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkStaffDetailCertificates>[] is M) {
+      return data.map<UkStaffDetailCertificates>((Map<String, dynamic> e) =>
+          UkStaffDetailCertificates.fromJson(e)).toList() as M;
+    }
+    if (<UkStaffLabourHistoryEntity>[] is M) {
+      return data.map<UkStaffLabourHistoryEntity>((Map<String, dynamic> e) =>
+          UkStaffLabourHistoryEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkStaffLabourHistoryRows>[] is M) {
+      return data.map<UkStaffLabourHistoryRows>((Map<String, dynamic> e) =>
+          UkStaffLabourHistoryRows.fromJson(e)).toList() as M;
+    }
+    if (<UkStaffLabourHistoryRowsSecurityIn>[] is M) {
+      return data.map<UkStaffLabourHistoryRowsSecurityIn>((
+          Map<String, dynamic> e) =>
+          UkStaffLabourHistoryRowsSecurityIn.fromJson(e)).toList() as M;
+    }
+    if (<UkStaffLabourHistoryRowsSecurityOut>[] is M) {
+      return data.map<UkStaffLabourHistoryRowsSecurityOut>((
+          Map<String, dynamic> e) =>
+          UkStaffLabourHistoryRowsSecurityOut.fromJson(e)).toList() as M;
+    }
+    if (<UkStaffLabourHistoryRowsWorkIn>[] is M) {
+      return data.map<UkStaffLabourHistoryRowsWorkIn>((
+          Map<String, dynamic> e) => UkStaffLabourHistoryRowsWorkIn.fromJson(e))
           .toList() as M;
     }
     if (<UkJobAppliedReviseLogRecordsContentReason>[] is M) {
@@ -1032,9 +1267,6 @@ class JsonConvert {
     if (<UkLabourRequestDetailChallenge25List>[] is M) {
       return data.map<UkLabourRequestDetailChallenge25List>((Map<String, dynamic> e) => UkLabourRequestDetailChallenge25List.fromJson(e)).toList() as M;
     }
-    if (<UkLabourRequestDetailLocationList>[] is M) {
-      return data.map<UkLabourRequestDetailLocationList>((Map<String, dynamic> e) => UkLabourRequestDetailLocationList.fromJson(e)).toList() as M;
-    }
     if (<UkLabourRequestDetailTemplateList>[] is M) {
       return data.map<UkLabourRequestDetailTemplateList>((Map<String, dynamic> e) => UkLabourRequestDetailTemplateList.fromJson(e)).toList() as M;
     }
@@ -1447,35 +1679,64 @@ class JsonConvertClassCollection {
     (UkJobAppliedReviseLogRecordsContentReason).toString(): UkJobAppliedReviseLogRecordsContentReason.fromJson,
     (UkJobAppliedStaffListEntity).toString(): UkJobAppliedStaffListEntity.fromJson,
     (UkJobAppliedStaffListRows).toString(): UkJobAppliedStaffListRows.fromJson,
-    (UkJobAppliedStaffListRowsSecurityIn).toString(): UkJobAppliedStaffListRowsSecurityIn.fromJson,
-    (UkJobAppliedStaffListRowsSecurityOut).toString(): UkJobAppliedStaffListRowsSecurityOut.fromJson,
-    (UkJobAppliedStaffListRowsWorkIn).toString(): UkJobAppliedStaffListRowsWorkIn.fromJson,
-    (UkJobAppliedStaffListRowsWorkOut).toString(): UkJobAppliedStaffListRowsWorkOut.fromJson,
-    (UkJobListAppliedStaffSearchEntity).toString(): UkJobListAppliedStaffSearchEntity.fromJson,
-    (UkJobListAppliedStaffSearchRows).toString(): UkJobListAppliedStaffSearchRows.fromJson,
-    (UkJobTemplateDetailBySelectTitleEntity).toString(): UkJobTemplateDetailBySelectTitleEntity.fromJson,
-    (UkLabReqShowTemplateEntity).toString(): UkLabReqShowTemplateEntity.fromJson,
-    (UkLabourRequestDetailEntity).toString(): UkLabourRequestDetailEntity.fromJson,
-    (UkLabourRequestDetailCertificateList).toString(): UkLabourRequestDetailCertificateList.fromJson,
-    (UkLabourRequestDetailVehicleList).toString(): UkLabourRequestDetailVehicleList.fromJson,
-    (UkLabourRequestDetailChallenge25List).toString(): UkLabourRequestDetailChallenge25List.fromJson,
-    (UkLabourRequestDetailLocationList).toString(): UkLabourRequestDetailLocationList.fromJson,
-    (UkLabourRequestDetailTemplateList).toString(): UkLabourRequestDetailTemplateList.fromJson,
-    (UkLabourRequestDetailDepartmentList).toString(): UkLabourRequestDetailDepartmentList.fromJson,
-    (UkLabourRequestDetailChargeList).toString(): UkLabourRequestDetailChargeList.fromJson,
-    (UkLabourRequestDetailEmploymentList).toString(): UkLabourRequestDetailEmploymentList.fromJson,
-    (UkLabourRequestPreselectAddstaffListEntity).toString(): UkLabourRequestPreselectAddstaffListEntity.fromJson,
-    (UkLabourRequestPreselectAddstaffListRows).toString(): UkLabourRequestPreselectAddstaffListRows.fromJson,
-    (UkLabourRequestPreselectedListEntity).toString(): UkLabourRequestPreselectedListEntity.fromJson,
-    (UkLabourRequestPreselectedListRows).toString(): UkLabourRequestPreselectedListRows.fromJson,
-    (UkLabourRequestReviewDetailEntity).toString(): UkLabourRequestReviewDetailEntity.fromJson,
-    (UkLabourRequestReviewDetailOrder).toString(): UkLabourRequestReviewDetailOrder.fromJson,
-    (UkLabourRequestReviewDetailOrderRequest).toString(): UkLabourRequestReviewDetailOrderRequest.fromJson,
-    (UkLabourRequestReviewDetailOrderRecords).toString(): UkLabourRequestReviewDetailOrderRecords.fromJson,
-    (UkLabourRequestReviewDetailRecords).toString(): UkLabourRequestReviewDetailRecords.fromJson,
-    (UkLabourRequestReviewListEntity).toString(): UkLabourRequestReviewListEntity.fromJson,
-    (UkLabourRequestReviewListRows).toString(): UkLabourRequestReviewListRows.fromJson,
-    (UkLabourRequestTableEntity).toString(): UkLabourRequestTableEntity.fromJson,
+    (UkJobAppliedStaffListRowsSecurityIn)
+        .toString(): UkJobAppliedStaffListRowsSecurityIn.fromJson,
+    (UkJobAppliedStaffListRowsSecurityOut)
+        .toString(): UkJobAppliedStaffListRowsSecurityOut.fromJson,
+    (UkJobAppliedStaffListRowsWorkIn)
+        .toString(): UkJobAppliedStaffListRowsWorkIn.fromJson,
+    (UkJobAppliedStaffListRowsWorkOut)
+        .toString(): UkJobAppliedStaffListRowsWorkOut.fromJson,
+    (UkJobListAppliedStaffSearchEntity)
+        .toString(): UkJobListAppliedStaffSearchEntity.fromJson,
+    (UkJobListAppliedStaffSearchRows)
+        .toString(): UkJobListAppliedStaffSearchRows.fromJson,
+    (UkJobListAppliedStaffSelectoptionsEntity)
+        .toString(): UkJobListAppliedStaffSelectoptionsEntity.fromJson,
+    (UkJobTemplateDetailBySelectTitleEntity)
+        .toString(): UkJobTemplateDetailBySelectTitleEntity.fromJson,
+    (UkLabReqShowTemplateEntity).toString(): UkLabReqShowTemplateEntity
+        .fromJson,
+    (UkLabourRequestDetailEntity).toString(): UkLabourRequestDetailEntity
+        .fromJson,
+    (UkLabourRequestDetailCertificateList)
+        .toString(): UkLabourRequestDetailCertificateList.fromJson,
+    (UkLabourRequestDetailVehicleList)
+        .toString(): UkLabourRequestDetailVehicleList.fromJson,
+    (UkLabourRequestDetailChallenge25List)
+        .toString(): UkLabourRequestDetailChallenge25List.fromJson,
+    (UkLabourRequestDetailTemplateList)
+        .toString(): UkLabourRequestDetailTemplateList.fromJson,
+    (UkLabourRequestDetailDepartmentList)
+        .toString(): UkLabourRequestDetailDepartmentList.fromJson,
+    (UkLabourRequestDetailChargeList)
+        .toString(): UkLabourRequestDetailChargeList.fromJson,
+    (UkLabourRequestDetailEmploymentList)
+        .toString(): UkLabourRequestDetailEmploymentList.fromJson,
+    (UkLabourRequestPreselectAddstaffListEntity)
+        .toString(): UkLabourRequestPreselectAddstaffListEntity.fromJson,
+    (UkLabourRequestPreselectAddstaffListRows)
+        .toString(): UkLabourRequestPreselectAddstaffListRows.fromJson,
+    (UkLabourRequestPreselectedListEntity)
+        .toString(): UkLabourRequestPreselectedListEntity.fromJson,
+    (UkLabourRequestPreselectedListRows)
+        .toString(): UkLabourRequestPreselectedListRows.fromJson,
+    (UkLabourRequestReviewDetailEntity)
+        .toString(): UkLabourRequestReviewDetailEntity.fromJson,
+    (UkLabourRequestReviewDetailOrder)
+        .toString(): UkLabourRequestReviewDetailOrder.fromJson,
+    (UkLabourRequestReviewDetailOrderRequest)
+        .toString(): UkLabourRequestReviewDetailOrderRequest.fromJson,
+    (UkLabourRequestReviewDetailOrderRecords)
+        .toString(): UkLabourRequestReviewDetailOrderRecords.fromJson,
+    (UkLabourRequestReviewDetailRecords)
+        .toString(): UkLabourRequestReviewDetailRecords.fromJson,
+    (UkLabourRequestReviewListEntity)
+        .toString(): UkLabourRequestReviewListEntity.fromJson,
+    (UkLabourRequestReviewListRows).toString(): UkLabourRequestReviewListRows
+        .fromJson,
+    (UkLabourRequestTableEntity).toString(): UkLabourRequestTableEntity
+        .fromJson,
     (UkLabourRequestTableRows).toString(): UkLabourRequestTableRows.fromJson,
     (UkLabourReviewStatusEntity).toString(): UkLabourReviewStatusEntity.fromJson,
     (UkLabourReviewStatusRow).toString(): UkLabourReviewStatusRow.fromJson,

+ 35 - 0
packages/cs_domain/lib/generated/json/uk_job_list_applied_staff_search_entity.g.dart

@@ -63,6 +63,26 @@ UkJobListAppliedStaffSearchRows $UkJobListAppliedStaffSearchRowsFromJson(Map<Str
   if (avatar != null) {
     ukJobListAppliedStaffSearchRows.avatar = avatar;
   }
+  final String? reviewsAvg = jsonConvert.convert<String>(json['reviews_avg']);
+  if (reviewsAvg != null) {
+    ukJobListAppliedStaffSearchRows.reviewsAvg = reviewsAvg;
+  }
+  final String? skills = jsonConvert.convert<String>(json['skills']);
+  if (skills != null) {
+    ukJobListAppliedStaffSearchRows.skills = skills;
+  }
+  final String? skillsShort = jsonConvert.convert<String>(json['skills_short']);
+  if (skillsShort != null) {
+    ukJobListAppliedStaffSearchRows.skillsShort = skillsShort;
+  }
+  final String? resume = jsonConvert.convert<String>(json['resume']);
+  if (resume != null) {
+    ukJobListAppliedStaffSearchRows.resume = resume;
+  }
+  final String? turnUpRate = jsonConvert.convert<String>(json['turn_up_rate']);
+  if (turnUpRate != null) {
+    ukJobListAppliedStaffSearchRows.turnUpRate = turnUpRate;
+  }
   final int? applyState = jsonConvert.convert<int>(json['apply_state']);
   if (applyState != null) {
     ukJobListAppliedStaffSearchRows.applyState = applyState;
@@ -83,6 +103,11 @@ Map<String, dynamic> $UkJobListAppliedStaffSearchRowsToJson(UkJobListAppliedStaf
   data['phone'] = entity.phone;
   data['nric'] = entity.nric;
   data['avatar'] = entity.avatar;
+  data['reviews_avg'] = entity.reviewsAvg;
+  data['skills'] = entity.skills;
+  data['skills_short'] = entity.skillsShort;
+  data['resume'] = entity.resume;
+  data['turn_up_rate'] = entity.turnUpRate;
   data['apply_state'] = entity.applyState;
   data['isSelected'] = entity.isSelected;
   return data;
@@ -97,6 +122,11 @@ extension UkJobListAppliedStaffSearchRowsExtension on UkJobListAppliedStaffSearc
     String? phone,
     String? nric,
     String? avatar,
+    String? reviewsAvg,
+    String? skills,
+    String? skillsShort,
+    String? resume,
+    String? turnUpRate,
     int? applyState,
     bool? isSelected,
   }) {
@@ -108,6 +138,11 @@ extension UkJobListAppliedStaffSearchRowsExtension on UkJobListAppliedStaffSearc
       ..phone = phone ?? this.phone
       ..nric = nric ?? this.nric
       ..avatar = avatar ?? this.avatar
+      ..reviewsAvg = reviewsAvg ?? this.reviewsAvg
+      ..skills = skills ?? this.skills
+      ..skillsShort = skillsShort ?? this.skillsShort
+      ..resume = resume ?? this.resume
+      ..turnUpRate = turnUpRate ?? this.turnUpRate
       ..applyState = applyState ?? this.applyState
       ..isSelected = isSelected ?? this.isSelected;
   }

+ 35 - 0
packages/cs_domain/lib/generated/json/uk_job_list_applied_staff_selectoptions_entity.g.dart

@@ -0,0 +1,35 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/uk_job_list_applied_staff_selectoptions_entity.dart';
+
+UkJobListAppliedStaffSelectoptionsEntity $UkJobListAppliedStaffSelectoptionsEntityFromJson(
+    Map<String, dynamic> json) {
+  final UkJobListAppliedStaffSelectoptionsEntity ukJobListAppliedStaffSelectoptionsEntity = UkJobListAppliedStaffSelectoptionsEntity();
+  final int? id = jsonConvert.convert<int>(json['id']);
+  if (id != null) {
+    ukJobListAppliedStaffSelectoptionsEntity.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    ukJobListAppliedStaffSelectoptionsEntity.name = name;
+  }
+  return ukJobListAppliedStaffSelectoptionsEntity;
+}
+
+Map<String, dynamic> $UkJobListAppliedStaffSelectoptionsEntityToJson(
+    UkJobListAppliedStaffSelectoptionsEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  return data;
+}
+
+extension UkJobListAppliedStaffSelectoptionsEntityExtension on UkJobListAppliedStaffSelectoptionsEntity {
+  UkJobListAppliedStaffSelectoptionsEntity copyWith({
+    int? id,
+    String? name,
+  }) {
+    return UkJobListAppliedStaffSelectoptionsEntity()
+      ..id = id ?? this.id
+      ..name = name ?? this.name;
+  }
+}

+ 14 - 61
packages/cs_domain/lib/generated/json/uk_labour_request_detail_entity.g.dart

@@ -35,10 +35,6 @@ UkLabourRequestDetailEntity $UkLabourRequestDetailEntityFromJson(Map<String, dyn
   if (location != null) {
     ukLabourRequestDetailEntity.location = location;
   }
-  final String? jobLocationOther = jsonConvert.convert<String>(json['job_location_other']);
-  if (jobLocationOther != null) {
-    ukLabourRequestDetailEntity.jobLocationOther = jobLocationOther;
-  }
   final int? serviceType = jsonConvert.convert<int>(json['service_type']);
   if (serviceType != null) {
     ukLabourRequestDetailEntity.serviceType = serviceType;
@@ -55,11 +51,11 @@ UkLabourRequestDetailEntity $UkLabourRequestDetailEntityFromJson(Map<String, dyn
   if (employmentType != null) {
     ukLabourRequestDetailEntity.employmentType = employmentType;
   }
-  final String? eventName = jsonConvert.convert<String>(json['event_name']);
+  final dynamic eventName = json['event_name'];
   if (eventName != null) {
     ukLabourRequestDetailEntity.eventName = eventName;
   }
-  final String? eventType = jsonConvert.convert<String>(json['event_type']);
+  final dynamic eventType = json['event_type'];
   if (eventType != null) {
     ukLabourRequestDetailEntity.eventType = eventType;
   }
@@ -126,13 +122,12 @@ UkLabourRequestDetailEntity $UkLabourRequestDetailEntityFromJson(Map<String, dyn
   if (challenge25List != null) {
     ukLabourRequestDetailEntity.challenge25List = challenge25List;
   }
-  final List<UkLabourRequestDetailLocationList>? locationList = (json['location_list'] as List<dynamic>?)?.map(
-          (e) => jsonConvert.convert<UkLabourRequestDetailLocationList>(e) as UkLabourRequestDetailLocationList).toList();
-  if (locationList != null) {
-    ukLabourRequestDetailEntity.locationList = locationList;
-  }
-  final List<UkLabourRequestDetailTemplateList>? templateList = (json['template_list'] as List<dynamic>?)?.map(
-          (e) => jsonConvert.convert<UkLabourRequestDetailTemplateList>(e) as UkLabourRequestDetailTemplateList).toList();
+  final List<
+      UkLabourRequestDetailTemplateList>? templateList = (json['template_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkLabourRequestDetailTemplateList>(
+          e) as UkLabourRequestDetailTemplateList).toList();
   if (templateList != null) {
     ukLabourRequestDetailEntity.templateList = templateList;
   }
@@ -164,7 +159,6 @@ Map<String, dynamic> $UkLabourRequestDetailEntityToJson(UkLabourRequestDetailEnt
   data['department_id'] = entity.departmentId;
   data['template_id'] = entity.templateId;
   data['location'] = entity.location;
-  data['job_location_other'] = entity.jobLocationOther;
   data['service_type'] = entity.serviceType;
   data['salary_by'] = entity.salaryBy;
   data['amount'] = entity.amount;
@@ -185,8 +179,8 @@ Map<String, dynamic> $UkLabourRequestDetailEntityToJson(UkLabourRequestDetailEnt
   data['other_document'] = entity.otherDocument;
   data['certificate_list'] = entity.certificateList?.map((v) => v.toJson()).toList();
   data['vehicle_list'] = entity.vehicleList?.map((v) => v.toJson()).toList();
-  data['challenge_25_list'] = entity.challenge25List?.map((v) => v.toJson()).toList();
-  data['location_list'] = entity.locationList?.map((v) => v.toJson()).toList();
+  data['challenge_25_list'] =
+      entity.challenge25List?.map((v) => v.toJson()).toList();
   data['template_list'] = entity.templateList?.map((v) => v.toJson()).toList();
   data['department_list'] = entity.departmentList?.map((v) => v.toJson()).toList();
   data['charge_list'] = entity.chargeList?.map((v) => v.toJson()).toList();
@@ -204,13 +198,12 @@ extension UkLabourRequestDetailEntityExtension on UkLabourRequestDetailEntity {
     int? departmentId,
     int? templateId,
     String? location,
-    String? jobLocationOther,
     int? serviceType,
     String? salaryBy,
     int? amount,
     int? employmentType,
-    String? eventName,
-    String? eventType,
+    dynamic eventName,
+    dynamic eventType,
     int? passengers,
     dynamic estRevenue,
     String? position,
@@ -226,7 +219,6 @@ extension UkLabourRequestDetailEntityExtension on UkLabourRequestDetailEntity {
     List<UkLabourRequestDetailCertificateList>? certificateList,
     List<UkLabourRequestDetailVehicleList>? vehicleList,
     List<UkLabourRequestDetailChallenge25List>? challenge25List,
-    List<UkLabourRequestDetailLocationList>? locationList,
     List<UkLabourRequestDetailTemplateList>? templateList,
     List<UkLabourRequestDetailDepartmentList>? departmentList,
     List<UkLabourRequestDetailChargeList>? chargeList,
@@ -241,7 +233,6 @@ extension UkLabourRequestDetailEntityExtension on UkLabourRequestDetailEntity {
       ..departmentId = departmentId ?? this.departmentId
       ..templateId = templateId ?? this.templateId
       ..location = location ?? this.location
-      ..jobLocationOther = jobLocationOther ?? this.jobLocationOther
       ..serviceType = serviceType ?? this.serviceType
       ..salaryBy = salaryBy ?? this.salaryBy
       ..amount = amount ?? this.amount
@@ -263,7 +254,6 @@ extension UkLabourRequestDetailEntityExtension on UkLabourRequestDetailEntity {
       ..certificateList = certificateList ?? this.certificateList
       ..vehicleList = vehicleList ?? this.vehicleList
       ..challenge25List = challenge25List ?? this.challenge25List
-      ..locationList = locationList ?? this.locationList
       ..templateList = templateList ?? this.templateList
       ..departmentList = departmentList ?? this.departmentList
       ..chargeList = chargeList ?? this.chargeList
@@ -385,45 +375,8 @@ extension UkLabourRequestDetailChallenge25ListExtension on UkLabourRequestDetail
   }
 }
 
-UkLabourRequestDetailLocationList $UkLabourRequestDetailLocationListFromJson(Map<String, dynamic> json) {
-  final UkLabourRequestDetailLocationList ukLabourRequestDetailLocationList = UkLabourRequestDetailLocationList();
-  final String? value = jsonConvert.convert<String>(json['value']);
-  if (value != null) {
-    ukLabourRequestDetailLocationList.value = value;
-  }
-  final String? txt = jsonConvert.convert<String>(json['txt']);
-  if (txt != null) {
-    ukLabourRequestDetailLocationList.txt = txt;
-  }
-  final String? selected = jsonConvert.convert<String>(json['selected']);
-  if (selected != null) {
-    ukLabourRequestDetailLocationList.selected = selected;
-  }
-  return ukLabourRequestDetailLocationList;
-}
-
-Map<String, dynamic> $UkLabourRequestDetailLocationListToJson(UkLabourRequestDetailLocationList entity) {
-  final Map<String, dynamic> data = <String, dynamic>{};
-  data['value'] = entity.value;
-  data['txt'] = entity.txt;
-  data['selected'] = entity.selected;
-  return data;
-}
-
-extension UkLabourRequestDetailLocationListExtension on UkLabourRequestDetailLocationList {
-  UkLabourRequestDetailLocationList copyWith({
-    String? value,
-    String? txt,
-    String? selected,
-  }) {
-    return UkLabourRequestDetailLocationList()
-      ..value = value ?? this.value
-      ..txt = txt ?? this.txt
-      ..selected = selected ?? this.selected;
-  }
-}
-
-UkLabourRequestDetailTemplateList $UkLabourRequestDetailTemplateListFromJson(Map<String, dynamic> json) {
+UkLabourRequestDetailTemplateList $UkLabourRequestDetailTemplateListFromJson(
+    Map<String, dynamic> json) {
   final UkLabourRequestDetailTemplateList ukLabourRequestDetailTemplateList = UkLabourRequestDetailTemplateList();
   final int? value = jsonConvert.convert<int>(json['value']);
   if (value != null) {

+ 36 - 8
packages/cs_domain/lib/generated/json/uk_labour_request_preselect_addstaff_list_entity.g.dart

@@ -63,14 +63,30 @@ UkLabourRequestPreselectAddstaffListRows $UkLabourRequestPreselectAddstaffListRo
   if (status != null) {
     ukLabourRequestPreselectAddstaffListRows.status = status;
   }
+  final String? reviewsAvg = jsonConvert.convert<String>(json['reviews_avg']);
+  if (reviewsAvg != null) {
+    ukLabourRequestPreselectAddstaffListRows.reviewsAvg = reviewsAvg;
+  }
+  final String? skills = jsonConvert.convert<String>(json['skills']);
+  if (skills != null) {
+    ukLabourRequestPreselectAddstaffListRows.skills = skills;
+  }
+  final String? skillsShort = jsonConvert.convert<String>(json['skills_short']);
+  if (skillsShort != null) {
+    ukLabourRequestPreselectAddstaffListRows.skillsShort = skillsShort;
+  }
+  final String? resume = jsonConvert.convert<String>(json['resume']);
+  if (resume != null) {
+    ukLabourRequestPreselectAddstaffListRows.resume = resume;
+  }
+  final String? turnUpRate = jsonConvert.convert<String>(json['turn_up_rate']);
+  if (turnUpRate != null) {
+    ukLabourRequestPreselectAddstaffListRows.turnUpRate = turnUpRate;
+  }
   final int? applyState = jsonConvert.convert<int>(json['apply_state']);
   if (applyState != null) {
     ukLabourRequestPreselectAddstaffListRows.applyState = applyState;
   }
-  final bool? isSelected = jsonConvert.convert<bool>(json['isSelected']);
-  if (isSelected != null) {
-    ukLabourRequestPreselectAddstaffListRows.isSelected = isSelected;
-  }
   return ukLabourRequestPreselectAddstaffListRows;
 }
 
@@ -83,8 +99,12 @@ Map<String, dynamic> $UkLabourRequestPreselectAddstaffListRowsToJson(UkLabourReq
   data['nric'] = entity.nric;
   data['profile_picture'] = entity.profilePicture;
   data['status'] = entity.status;
+  data['reviews_avg'] = entity.reviewsAvg;
+  data['skills'] = entity.skills;
+  data['skills_short'] = entity.skillsShort;
+  data['resume'] = entity.resume;
+  data['turn_up_rate'] = entity.turnUpRate;
   data['apply_state'] = entity.applyState;
-  data['isSelected'] = entity.isSelected;
   return data;
 }
 
@@ -97,8 +117,12 @@ extension UkLabourRequestPreselectAddstaffListRowsExtension on UkLabourRequestPr
     String? nric,
     String? profilePicture,
     int? status,
+    String? reviewsAvg,
+    String? skills,
+    String? skillsShort,
+    String? resume,
+    String? turnUpRate,
     int? applyState,
-    bool? isSelected,
   }) {
     return UkLabourRequestPreselectAddstaffListRows()
       ..id = id ?? this.id
@@ -108,7 +132,11 @@ extension UkLabourRequestPreselectAddstaffListRowsExtension on UkLabourRequestPr
       ..nric = nric ?? this.nric
       ..profilePicture = profilePicture ?? this.profilePicture
       ..status = status ?? this.status
-      ..applyState = applyState ?? this.applyState
-      ..isSelected = isSelected ?? this.isSelected;
+      ..reviewsAvg = reviewsAvg ?? this.reviewsAvg
+      ..skills = skills ?? this.skills
+      ..skillsShort = skillsShort ?? this.skillsShort
+      ..resume = resume ?? this.resume
+      ..turnUpRate = turnUpRate ?? this.turnUpRate
+      ..applyState = applyState ?? this.applyState;
   }
 }

+ 67 - 2
packages/cs_domain/lib/repository/uk_job_repository.dart

@@ -13,6 +13,7 @@ import '../entity/response/uk_job_applied_revise_info_entity.dart';
 import '../entity/response/uk_job_applied_revise_log_entity.dart';
 import '../entity/response/uk_job_applied_staff_list_entity.dart';
 import '../entity/response/uk_job_list_applied_staff_search_entity.dart';
+import '../entity/response/uk_job_list_applied_staff_selectoptions_entity.dart';
 import '../entity/response/uk_job_template_detail_by_select_title_entity.dart';
 import '../entity/response/uk_report_outlet_entity.dart';
 import '../entity/response/uk_staff_detail_entity.dart';
@@ -456,10 +457,69 @@ class UKJobRepository extends GetxService {
     return result.convert();
   }
 
+  /// 获取 添加员工 时的 industry options
+  Future<HttpResult<UkJobListAppliedStaffSelectoptionsEntity>> fetchAddStaffIndustryOptions(
+    {
+      CancelToken? cancelToken,
+    }
+  ) async {
+    //参数
+    Map<String, String> params = {};
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAppliedStaffIndustryListUK,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final listJson = result.getListJson();
+      var list = listJson
+          ?.map((e) => UkJobListAppliedStaffSelectoptionsEntity.fromJson(e as Map<String, dynamic>))
+          .toList();
+      //重新赋值data或list
+      return result.convert<UkJobListAppliedStaffSelectoptionsEntity>(list: list);
+    }
+    return result.convert();
+  }
+
+  /// 获取 添加员工 时根据 industry id 获取jobtitle options
+  Future<HttpResult<UkJobListAppliedStaffSelectoptionsEntity>> fetchAddStaffJobTitleOptions(
+    String industryId,
+    {
+        CancelToken? cancelToken,
+      }
+      ) async {
+    //参数
+    Map<String, String> params = {};
+    params["industry_id"] = industryId;
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAppliedStaffJobTitleListUK,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final listJson = result.getListJson();
+      var list = listJson
+          ?.map((e) => UkJobListAppliedStaffSelectoptionsEntity.fromJson(e as Map<String, dynamic>))
+          .toList();
+      //重新赋值data或list
+      return result.convert<UkJobListAppliedStaffSelectoptionsEntity>(list: list);
+    }
+    return result.convert();
+  }
+
   /// 添加员工的全部员工数据列表
   Future<HttpResult<UkJobListAppliedStaffSearchEntity>> searchStaffList(
       String? jobId,
-      String? keyword, {
+      String? keyword,
+      String? industryId,
+      String? skillId,
+      {
         required int curPage,
         CancelToken? cancelToken,
       }) async {
@@ -474,7 +534,12 @@ class UKJobRepository extends GetxService {
     if (!Utils.isEmpty(keyword)) {
       params["keyword"] = keyword!;
     }
-
+    if (!Utils.isEmpty(industryId)) {
+      params["industry_id"] = industryId!;
+    }
+    if (!Utils.isEmpty(skillId)) {
+      params["skill_id"] = skillId!;
+    }
     final result = await httpProvider.requestNetResult(
       ApiConstants.apiJobListAppliedStaffSearch,
       params: params,

+ 25 - 3
packages/cs_domain/lib/repository/uk_labour_repository.dart

@@ -194,6 +194,7 @@ class UkLabourRepository extends GetxService {
       String? salaryBy,
       String? repeatDateStr,
       String? amount,
+      String? location,
       String? certificate, // 多个逗号隔开
       String? challenge25,
       String? vehicle, // 多个逗号隔开
@@ -230,6 +231,9 @@ class UkLabourRepository extends GetxService {
     if (!Utils.isEmpty(amount)) {
       params["amount"] = amount!;
     }
+    if (!Utils.isEmpty(location)) {
+      params["location"] = location!;
+    }
 
     if(!Utils.isEmpty(certificate)){
       params["certificate"] = certificate!;
@@ -336,6 +340,7 @@ class UkLabourRepository extends GetxService {
     String? jobEnd,
     String? departmentId,
     String? needNum,
+    String? location,
     String? salaryBy,
     String? repeatDateStr,
     String? amount,
@@ -376,6 +381,10 @@ class UkLabourRepository extends GetxService {
       params["amount"] = amount!;
     }
 
+    if (!Utils.isEmpty(location)) {
+      params["location"] = location!;
+    }
+
     if(!Utils.isEmpty(certificate)){
       params["certificate"] = certificate!;
     }
@@ -482,6 +491,7 @@ class UkLabourRepository extends GetxService {
     String? salaryBy,
     String? repeatDateStr,
     String? amount,
+    String? location,
     String? certificate, // 多个逗号隔开
     String? challenge25,
     String? vehicle, // 多个逗号隔开
@@ -526,6 +536,9 @@ class UkLabourRepository extends GetxService {
     if (!Utils.isEmpty(amount)) {
       params["amount"] = amount!;
     }
+    if (!Utils.isEmpty(location)) {
+      params["location"] = location!;
+    }
     if(!Utils.isEmpty(certificate)){
       params["certificate"] = certificate!;
     }
@@ -690,8 +703,10 @@ class UkLabourRepository extends GetxService {
 
   /// 预选人-添加员工的列表
   Future<HttpResult<UkLabourRequestPreselectAddstaffListEntity>> fetchtPreselectedAddStaffList(
-      String? keyWord,
+      String? keyword,
       String? reQuestId,
+      String? industryId,
+      String? skillId,
       {
         required int curPage,
         CancelToken? cancelToken,
@@ -701,14 +716,21 @@ class UkLabourRepository extends GetxService {
     params["cur_page"] = curPage.toString();
     params["page_size"] = "20";
 
-    if (!Utils.isEmpty(keyWord)) {
-      params["keyword"] = keyWord!;
+    if (!Utils.isEmpty(keyword)) {
+      params["keyword"] = keyword!;
     }
 
     if (!Utils.isEmpty(reQuestId)) {
       params["request_id"] = reQuestId!;
     }
 
+    if (!Utils.isEmpty(industryId)) {
+      params["industry_id"] = industryId!;
+    }
+    if (!Utils.isEmpty(skillId)) {
+      params["skill_id"] = skillId!;
+    }
+
     final result = await httpProvider.requestNetResult(
       ApiConstants.apiLabourRequestPreSelectAddStaffListUK,
       params: params,

+ 3 - 2
packages/cs_plugin_basic/lib/modules/global_web_page.dart

@@ -21,8 +21,9 @@ class GlobalWebPage extends BaseStatelessPage {
     String title,
     String url, {
     bool isShowAppBar = true,
+        bool isNeedEncodeFull = true,
   }) {
-    return Get.start(RouterPath.globalWeb, arguments: {'title': title, 'initialUrl': Uri.encodeFull(url), 'isShowAppBar': isShowAppBar});
+    return Get.start(RouterPath.globalWeb, arguments: {'title': title, 'initialUrl': isNeedEncodeFull?Uri.encodeFull(url):url, 'isShowAppBar': isShowAppBar});
   }
 
   @override
@@ -40,7 +41,7 @@ class GlobalWebPage extends BaseStatelessPage {
     String title = Get.arguments['title'];
     Log.d("GlobalWebPage 的参数 isShowAppBar:$isShowAppBar title:$title initialUrl:$initialUrl ");
 
-    if (initialUrl.startsWith('http')) {
+    if (initialUrl.startsWith('http') || initialUrl.startsWith('https')) {
       //网页加载
       return WebViewPage(
         showAppbar: isShowAppBar,

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

@@ -370,10 +370,11 @@ const Map<String, String> en_US = {
   'Name': 'Name',
   'Industry': 'Industry',
   'Video': 'Video',
-  'Video Text': 'Video Text',
+  'Text': 'Text',
   'Video Cover': 'Video Cover',
   'Video Image': 'Video Image',
   'Video Document': 'Video Document',
+  'Choose File...': 'Please choose...',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

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

@@ -371,10 +371,12 @@ const Map<String, String> zh_CN = {
   'Name': '名称',
   'Industry': '行业',
   'Video': '视频',
-  'Video Text': '视频文字',
+  'Text': '视频文字',
   'Video Cover': '视频封面',
   'Video Image': '视频图片',
   'Video Document': '视频文档',
+  'Choose File...': '请选择...',
+
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',

+ 6 - 0
packages/cs_shared/lib/utils/util.dart

@@ -37,6 +37,12 @@ class Utils {
     }
   }
 
+  /// 判断是网络 地址
+  static bool isNetworkUrl(String url) {
+    return url.startsWith('http://') || url.startsWith('https://');
+  }
+
+
   /// 判断中国的11位手机号码
   static bool isChinaPhoneNumber(dynamic value) {
     RegExp regExp = RegExp(r"^1\d{10}$"); // 匹配以1开头的11位数字