Explorar o código

工作列表 添加staff 可以给staff 添加favourite标记 修改lab-req lab-req-review 新增编辑 里面增加部分字段

glglove hai 4 semanas
pai
achega
81f019210d
Modificáronse 31 ficheiros con 1268 adicións e 204 borrados
  1. 1 0
      packages/cpt_sg/lib/modules/job/applied_staff/applied_staff_controller.dart
  2. 0 1
      packages/cpt_uk/lib/modules/job/job_applied/job_applied_controller.dart
  3. 16 2
      packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff.dart
  4. 32 5
      packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff_controller.dart
  5. 7 3
      packages/cpt_uk/lib/modules/job/job_applied_staff_detail/applied_staff_detail_controller.dart
  6. 42 1
      packages/cpt_uk/lib/modules/job/job_applied_staff_detail/applied_staff_detail_page.dart
  7. 22 19
      packages/cpt_uk/lib/modules/job/job_applied_staff_detail/staff_labour_history_item.dart
  8. 150 43
      packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_controller.dart
  9. 10 1
      packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_state.dart
  10. 84 0
      packages/cpt_uk/lib/modules/job/labour_request_add/widget/lab_request_and_request_review_form.dart
  11. 8 0
      packages/cpt_uk/lib/modules/job/labour_request_add/widget/labour_request_interface.dart
  12. 101 22
      packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_controller.dart
  13. 11 1
      packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_state.dart
  14. 10 2
      packages/cpt_uk/lib/modules/review/labour_review_list/labour_review_controller.dart
  15. 1 0
      packages/cpt_uk/lib/modules/review/labour_review_list/labour_review_page.dart
  16. 4 0
      packages/cs_domain/lib/constants/api_constants.dart
  17. 48 0
      packages/cs_domain/lib/entity/response/uk_job_list_applied_staff_search_entity.dart
  18. 47 0
      packages/cs_domain/lib/entity/response/uk_lab_req_show_template_entity.dart
  19. 66 6
      packages/cs_domain/lib/entity/response/uk_labour_request_detail_entity.dart
  20. 43 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  21. 121 0
      packages/cs_domain/lib/generated/json/uk_job_list_applied_staff_search_entity.g.dart
  22. 147 0
      packages/cs_domain/lib/generated/json/uk_lab_req_show_template_entity.g.dart
  23. 170 12
      packages/cs_domain/lib/generated/json/uk_labour_request_detail_entity.g.dart
  24. 69 0
      packages/cs_domain/lib/repository/uk_job_repository.dart
  25. 53 86
      packages/cs_domain/lib/repository/uk_labour_repository.dart
  26. BIN=BIN
      packages/cs_resources/assets/base_service/mark_active.webp
  27. BIN=BIN
      packages/cs_resources/assets/base_service/mark_inactive.webp
  28. 1 0
      packages/cs_resources/lib/constants/color_constants.dart
  29. 2 0
      packages/cs_resources/lib/generated/assets.dart
  30. 1 0
      packages/cs_resources/lib/local/language/en_US.dart
  31. 1 0
      packages/cs_resources/lib/local/language/zh_CN.dart

+ 1 - 0
packages/cpt_sg/lib/modules/job/applied_staff/applied_staff_controller.dart

@@ -68,6 +68,7 @@ class AppliedStaffController extends GetxController with DioCancelableMixin {
       cancelToken: cancelToken,
     );
 
+
     // 处理数据
     if (listResult.isSuccess) {
       handleList(listResult.data?.rows);

+ 0 - 1
packages/cpt_uk/lib/modules/job/job_applied/job_applied_controller.dart

@@ -225,7 +225,6 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
       if (filteredMessages.isNotEmpty) {
         //有错误信息
         NotifyEngine.showFailure(filteredMessages.join(" , "));
-        bus.emit(AppConstant.eventJobListChangeStaffNo, {'addStaffCount': state.addStaffCount,'jobId': state.jobId});
       } else {
         //无错误信息
         NotifyEngine.showSuccess("Successful".tr);

+ 16 - 2
packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff.dart

@@ -2,11 +2,13 @@ import 'dart:ui';
 
 import 'package:cs_resources/generated/assets.dart';
 import 'package:domain/entity/response/job_list_applied_staff_search_entity.dart';
+import 'package:domain/entity/response/uk_job_list_applied_staff_search_entity.dart';
 import 'package:flutter/cupertino.dart';
 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/log_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:cs_resources/constants/color_constants.dart';
 import 'package:widgets/load_state_layout.dart';
@@ -140,6 +142,9 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
                             /// Item选中与未选中设置
                             controller.datas[index].isSelected = !controller.datas[index].isSelected;
                             controller.update();
+                          }, clickFavoriteCallback: () {
+                            // 调用 打标的 接口
+                            controller.handlerSetFavourite(controller.datas[index]);
                           });
                         },
                         childCount: controller.datas.length,
@@ -222,7 +227,7 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
 
   }
 
-  Widget _buildStaffItem(JobListAppliedStaffSearchRows item, VoidCallback callback) {
+  Widget _buildStaffItem(UkJobListAppliedStaffSearchRows item, VoidCallback clickItemCallback, { VoidCallback? clickFavoriteCallback }) {
     return Stack(
       children: [
         Column(
@@ -330,6 +335,15 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
           ],
         ).paddingOnly(left: 19, right: 20, top: 17),
 
+        //是否打标记的员工
+        MyAssetImage(
+          (item.isFavourite !=null && item.isFavourite == 1) ? Assets.baseServiceMarkActive : Assets.baseServiceMarkInactive,
+          width: 20,
+          height: 18.5,
+        ).alignRight().marginOnly(right: 55, top: 17.5).onTap((){
+          clickFavoriteCallback?.call();
+        }),
+
         //是否勾选
         MyAssetImage(
           item.isSelected ? Assets.baseServiceItemSelectedIcon : Assets.baseServiceItemUnselectedGrayIcon,
@@ -337,6 +351,6 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
           height: 20.5,
         ).alignRight().marginOnly(right: 20, top: 17.5),
       ],
-    ).onTap(callback);
+    ).onTap(clickItemCallback);
   }
 }

+ 32 - 5
packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff_controller.dart

@@ -1,7 +1,10 @@
-import 'package:domain/entity/response/job_list_applied_staff_search_entity.dart';
-import 'package:domain/repository/job_repository.dart';
+import 'package:domain/entity/response/uk_job_list_applied_staff_search_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_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:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
@@ -11,7 +14,7 @@ import 'package:widgets/widget_export.dart';
  * 添加员工的弹窗的控制器
  */
 class AppliedAddStaffController extends GetxController with DioCancelableMixin {
-  final JobRepository _jobRepository = Get.find();
+  final UKJobRepository _jobRepository = Get.find();
 
   TextEditingController searchController = TextEditingController();
 
@@ -24,7 +27,7 @@ class AppliedAddStaffController extends GetxController with DioCancelableMixin {
 
   String keyword = "";
   String? jobId = null;
-  List<JobListAppliedStaffSearchRows> datas = [];
+  List<UkJobListAppliedStaffSearchRows> datas = [];
 
   //刷新页面状态
   void changeLoadingState(LoadState state) {
@@ -84,13 +87,16 @@ class AppliedAddStaffController extends GetxController with DioCancelableMixin {
   }
 
   // 处理数据与展示的逻辑
-  void handleList(List<JobListAppliedStaffSearchRows>? list) {
+  void handleList(List<UkJobListAppliedStaffSearchRows>? list) {
+    Log.d("563435  ${list}");
+
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
       if (_curPage == 1) {
         //刷新的方式
         datas.clear();
         datas.addAll(list);
+        Log.d("fdjskfjdskfjsd  ${datas}");
         refreshController.finishRefresh();
 
         //更新展示的状态
@@ -120,6 +126,27 @@ class AppliedAddStaffController extends GetxController with DioCancelableMixin {
     refreshController.callRefresh();
   }
 
+  // 打标签
+  Future handlerSetFavourite(UkJobListAppliedStaffSearchRows  data) async{
+    Log.d("点击前 isFavourite: ${data.isFavourite}");
+    String memberId = data.id!.toString();
+    String isFavourite = data.isFavourite?.toString()??"0";
+    String toFavourite = isFavourite == "0" ? "1" : "0";
+    Log.d("isFavourite需要设置成 : ${toFavourite}");
+
+    LoadingEngine.show();
+    final result = await _jobRepository.staffSetFavourite(memberId, toFavourite);
+    if(result.isSuccess){
+      data.isFavourite = int.parse(toFavourite);
+      update();
+      LoadingEngine.dismiss();
+      NotifyEngine.showSuccess("Successful".tr);
+    }else {
+      LoadingEngine.dismiss();
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
   @override
   void onReady() {
     super.onReady();

+ 7 - 3
packages/cpt_uk/lib/modules/job/job_applied_staff_detail/applied_staff_detail_controller.dart

@@ -87,11 +87,11 @@ class AppliedStaffDetailController extends GetxController with DioCancelableMixi
 
     //拿到结果
     var results = await Future.wait(futures);
-    var listResult = results[0] as HttpResult<UkStaffLabourHistoryEntity>;
     var detailResult = results[1] as HttpResult<UkStaffDetailEntity>;
+    var listResult = results[0] as HttpResult<UkStaffLabourHistoryEntity>;
 
     //详情数据
-    if (state.detail == null && detailResult.isSuccess) {
+    if (detailResult.isSuccess) {
       state.detail = detailResult.data!;
     }
 
@@ -141,7 +141,11 @@ class AppliedStaffDetailController extends GetxController with DioCancelableMixi
         // }
         //展示无数据的布局
         state.datas.clear();
-        changeLoadingState(LoadState.State_Empty);
+        if(state.detail == null){
+          changeLoadingState(LoadState.State_Empty);
+        }else {
+          changeLoadingState(LoadState.State_Success);
+        }
         refreshController.finishRefresh();
       } else {
         //展示加载完成,没有更多数据了

+ 42 - 1
packages/cpt_uk/lib/modules/job/job_applied_staff_detail/applied_staff_detail_page.dart

@@ -1,7 +1,9 @@
 import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
 import 'package:domain/entity/response/uk_staff_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_load_image.dart';
@@ -103,12 +105,13 @@ class _AppliedStaffDetailState extends BaseState<UKAppliedStaffDetailPage, Appli
                         ),
                   
                         //底部工作历史列表
+                        state.datas ==null ||  state.datas.isEmpty? _warpStateLayout(_emptyView(context)):
                         SliverList(
                             delegate: SliverChildBuilderDelegate(
                           (context, index) {
                             return StaffLabourHistoryItem(index: index, item: state.datas[index]);
                           },
-                          childCount: state.datas.length,
+                          childCount:  state.datas.length,
                         ))
                       ],
                     ),
@@ -145,4 +148,42 @@ class _AppliedStaffDetailState extends BaseState<UKAppliedStaffDetailPage, Appli
       ],
     );
   }
+
+  Widget _warpStateLayout(Widget widget) {
+    // return SliverFillViewport(
+    //   delegate: SliverChildBuilderDelegate(
+    //         (context, index) {
+    //       return widget;
+    //     },
+    //     childCount: 1,
+    //   ),
+    // );
+    return SliverToBoxAdapter(
+      child: widget,
+    );
+  }
+
+  ///数据为空的视图
+  Widget _emptyView(BuildContext context,) {
+    return Container(
+      width: double.infinity,
+      height: 200,
+      alignment: Alignment.center,
+      padding: const EdgeInsets.only(bottom: 10),
+      child: Column(
+        mainAxisSize: MainAxisSize.min,
+        crossAxisAlignment: CrossAxisAlignment.center,
+        mainAxisAlignment: MainAxisAlignment.center,
+        children: <Widget>[
+          const MyAssetImage(Assets.baseServicePageNoData, width: 123.5, height: 115.5, fit: BoxFit.contain),
+          MyTextView(
+            'There is currently no content available'.tr,
+            marginTop: 18,
+            fontSize: 14,
+            textColor: ColorConstants.primaryAppColor?? Color(0XFFD6E9F1),
+          ),
+        ],
+      ),
+    );
+  }
 }

+ 22 - 19
packages/cpt_uk/lib/modules/job/job_applied_staff_detail/staff_labour_history_item.dart

@@ -1,4 +1,6 @@
 import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:cs_resources/local/theme/theme_config.dart';
 import 'package:domain/entity/response/uk_staff_labour_history_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
@@ -49,7 +51,7 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //日期
               MyTextView(
-                item.jobDate ?? "-",
+                item?.jobDate ?? "-",
                 isFontRegular: true,
                 textColor: ColorConstants.white,
                 fontSize: 14,
@@ -74,7 +76,7 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //姓名
               MyTextView(
-                item.staffName ?? "-",
+                item?.staffName ?? "-",
                 isFontRegular: true,
                 textColor: ColorConstants.white,
                 fontSize: 14,
@@ -99,7 +101,7 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //标题
               MyTextView(
-                item.jobTitle ?? "-",
+                item?.jobTitle ?? "-",
                 isFontRegular: true,
                 textColor: ColorConstants.white,
                 fontSize: 14,
@@ -124,7 +126,7 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //部门
               MyTextView(
-                item.outletName ?? "-",
+                item?.outletName ?? "-",
                 isFontRegular: true,
                 textColor: ColorConstants.white,
                 fontSize: 14,
@@ -149,7 +151,7 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                item.startTime ?? "-",
+                item?.startTime ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -172,10 +174,10 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                item.securityIn?.time ?? "-",
+                item?.securityIn?.time ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
-                textColor: item.securityIn?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
+                textColor: item?.securityIn?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
                 fontSize: 14,
               ).expanded(),
             ],
@@ -195,10 +197,10 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                item.workIn?.time ?? "-",
+                item?.workIn?.time ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
-                textColor: item.workIn?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
+                textColor: item?.workIn?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
                 fontSize: 14,
               ).expanded(),
             ],
@@ -218,7 +220,7 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                item.endTime ?? "-",
+                item?.endTime ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -241,10 +243,10 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                item.workOut?.time ?? "-",
+                item?.workOut?.time ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
-                textColor: item.workOut?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
+                textColor: item?.workOut?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
                 fontSize: 14,
               ).expanded(),
             ],
@@ -264,10 +266,10 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                item.securityOut?.time ?? "-",
+                item?.securityOut?.time ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
-                textColor: item.securityOut?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
+                textColor: item?.securityOut?.changed == 1 ? ColorConstants.textRedFF6262 : Colors.white,
                 fontSize: 14,
               ).expanded(),
             ],
@@ -287,7 +289,7 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //发布状态
               MyTextView(
-                item.appliedAt ?? "-",
+                item?.appliedAt ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -310,14 +312,14 @@ class StaffLabourHistoryItem extends StatelessWidget {
 
               //发布状态
               MyTextView(
-                item.statusShow ?? "-",
+                item?.statusShow ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
-                textColor: "Completed" == item.statusShow
+                textColor: "Completed" == item?.statusShow
                     ? ColorConstants.textGreen05DC82
-                    : "Cancelled" == item.statusShow || "Rejected" == item.statusShow
+                    : "Cancelled" == item?.statusShow || "Rejected" == item?.statusShow
                         ? ColorConstants.textRedFF6262
-                        : "Revised" == item.statusShow || "Pending" == item.statusShow || "Approve" == item.statusShow
+                        : "Revised" == item?.statusShow || "Pending" == item?.statusShow || "Approve" == item?.statusShow
                             ? ColorConstants.textYellowFFBB1B
                             : ColorConstants.textBlue06D9FF,  //默认蓝色
                 fontSize: 14,
@@ -329,4 +331,5 @@ class StaffLabourHistoryItem extends StatelessWidget {
       ),
     );
   }
+
 }

+ 150 - 43
packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_controller.dart

@@ -123,12 +123,13 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
 
   /// 提交
   void doSubmit() async {
+    Log.d("labour_review controller 提交");
 
     var needNumController = state.formData['no_of_staff']!['controller'];
     var amountController = state.formData['amount']!['controller'];
     String needNum = needNumController.text.toString()??"0";
     String amount = amountController.text.toString();
-    String? jobApplyPreId = state.preSelectedIds;
+    // String? jobApplyPreId = state.preSelectedIds;
 
     var remarkController = state.formData['remark']!['controller'];
     var eventController = state.formData['event']!['controller'];
@@ -173,50 +174,110 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
 
     Future<HttpResult> taskFuture;
     if (state.pageType != 0 && Utils.isNotEmpty(state.appliedId) && state.appliedId != "0") {
+      Map<String, dynamic> params = {
+        "requestId": state.appliedId,
+        "templateId": state.selectedTemplateId,
+        "jobStart": "${DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd')} ${DateTimeUtils.formatDate(state.selectedStartTime, format: 'HH:mm')}:00",
+        "jobEnd": "${DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd')} ${DateTimeUtils.formatDate(state.selectedEndTime, format: 'HH:mm')}:00",
+        "departmentId": state.selectedDepartmentId,
+        "needNum": needNum,
+        "salaryBy": 'hour',
+        "amount": state.labReqOption?.serviceType == 1 ? amount : null,
+        "certificate": state.selectedCertificateList?.join(",")?? "",
+        "challenge25": state.selectedChallenge25Id?? "",
+        "vehicle": state.selectedVehicleList?.join(",")??"",
+        "description": remark,
+        "employmentType": state.selectedTypeId,
+        "eventName": event,
+        "eventType": eventType,
+        "passengers": eventPax,
+        "estRevenue": revenue,
+        "position": position,
+        "estCost": totalCost,
+        "attUrl": state.attFilePath,
+        'cancelToken': cancelToken
+      };
+      // Log.d("编辑时 state.selectedCertificateList  ${state.selectedCertificateList}");
+      // Log.d("编辑时 state.selectedCertificateList  ${state.selectedCertificateList.join(",")}");
+      // Log.d("编辑时 state.selectedVehicleList  ${state.selectedVehicleList.join(",")}");
+      //
+      // Log.d("编辑时准备提交的 params  ${params}");
       // 编辑
       taskFuture = _ukLabourRepository.editLabourRequestSubmit(
-        requestId: state.appliedId,
-        templateId: state.selectedTemplateId,
-        jobStart: "${DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd')} ${DateTimeUtils.formatDate(state.selectedStartTime, format: 'HH:mm')}:00",
-        jobEnd: "${DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd')} ${DateTimeUtils.formatDate(state.selectedEndTime, format: 'HH:mm')}:00",
-        departmentId: state.selectedDepartmentId,
-        needNum: needNum,
-        salaryBy: 'hour',
-        amount: state.labReqOption?.serviceType == 1 ? amount : null,
-        description: remark,
-        employmentType: state.selectedTypeId,
-        eventName: event,
-        eventType: eventType,
-        passengers: eventPax,
-        estRevenue: revenue,
-        position: position,
-        estCost: totalCost,
-        attUrl: state.attFilePath,
-        cancelToken: cancelToken
+        requestId: params['requestId'],
+        templateId: params['templateId'],
+        jobStart: params['jobStart'],
+        jobEnd: params['jobEnd'],
+        departmentId: params['departmentId'],
+        needNum: params['needNum'],
+        salaryBy: params['salaryBy'],
+        amount: params['amount'],
+        certificate: params['certificate'],
+        challenge25: params['challenge25'],
+        vehicle: params['vehicle'],
+        description: params['description'],
+        employmentType: params['employmentType'],
+        eventName: params['eventName'],
+        eventType: params['eventType'],
+        passengers: params['passengers'],
+        estRevenue: params['estRevenue'],
+        position: params['position'],
+        estCost: params['estCost'],
+        attUrl: params['attUrl'],
+        cancelToken: params['cancelToken'],
       );
     } else {
+      Map<String, dynamic> params = {
+        "templateId": state.selectedTemplateId,
+        "jobDate": DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd'),
+        "jobStart": "${DateTimeUtils.formatDate(state.selectedStartTime, format: 'HH:mm')}",
+        "jobEnd": "${DateTimeUtils.formatDate(state.selectedEndTime, format: 'HH:mm')}",
+        "departmentId": state.selectedDepartmentId,
+        "needNum": needNum,
+        "salaryBy": 'hour',
+        "repeatDateStr": state.repeatDateStr,
+        "amount": state.labReqOption?.serviceType == 1 ? amount : null,
+        "certificate": state.selectedCertificateList?.join(",")?? "",
+        "challenge25": state.selectedChallenge25Id?? "",
+        "vehicle": state.selectedVehicleList?.join(",")??"",
+        "jobApplyPreId": state.preSelectedIds,
+        "description": remark,
+        "employmentType": state.selectedTypeId,
+        "eventName": event,
+        "eventType": eventType,
+        "passengers": eventPax,
+        "estRevenue": revenue,
+        "position": position,
+        "estCost": totalCost,
+        "attUrl": state.attFilePath,
+        'cancelToken': cancelToken,
+      };
+      // Log.d("新增时准备提交的 params  ${params}");
       // 新增
       taskFuture = _ukLabourRepository.addLabourRequestSubmit(
-        templateId: state.selectedTemplateId,
-        jobDate: DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd'),
-        jobStart: "${DateTimeUtils.formatDate(state.selectedStartTime, format: 'HH:mm')}",
-        jobEnd: "${DateTimeUtils.formatDate(state.selectedEndTime, format: 'HH:mm')}",
-        departmentId: state.selectedDepartmentId,
-        needNum: needNum,
-        salaryBy: 'hour',
-        repeatDateStr: state.repeatDateStr,
-        amount: state.labReqOption?.serviceType == 1 ? amount : null,
-        jobApplyPreId: state.preSelectedIds,
-        description: remark,
-        employmentType: state.selectedTypeId,
-        eventName: event,
-        eventType: eventType,
-        passengers: eventPax,
-        estRevenue: revenue,
-        position: position,
-        estCost: totalCost,
-        attUrl: state.attFilePath,
-        cancelToken: cancelToken,
+        templateId: params['templateId'],
+        jobDate: params['jobDate'],
+        jobStart: params['jobStart'],
+        jobEnd: params['jobEnd'],
+        departmentId: params['departmentId'],
+        needNum: params['needNum'],
+        salaryBy: params['salaryBy'],
+        repeatDateStr: params['repeatDateStr'],
+        amount: params['amount'],
+        certificate: params['certificate'],
+        challenge25: params['challenge25'],
+        vehicle: params['vehicle'],
+        jobApplyPreId: params['jobApplyPreId'],
+        description: params['description'],
+        employmentType: params['employmentType'],
+        eventName: params['eventName'],
+        eventType: params['eventType'],
+        passengers: params['passengers'],
+        estRevenue: params['estRevenue'],
+        position: params['position'],
+        estCost: params['estCost'],
+        attUrl: params['attUrl'],
+        cancelToken: params['cancelToken'],
       );
     }
 
@@ -262,10 +323,10 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
     OptionPickerUtil.showCupertinoOptionPicker(
       items: state.labReqOption!.templateList!.map((e) => e.txt!).toList(growable: false),
       initialSelectIndex: selectedTemplateIndex,
-      onPickerChanged: (_, index) {
+      onPickerChanged: (_, index) async{
         state.selectedTemplateId = state.labReqOption!.templateList![index].value!.toString();
+        Log.d("选择标题后,此时选择的selectedTemplateId:${state.selectedTemplateId} ");
         // 选择了标题后 需要 将此时选择的 标题 回显 给position
-
         var positionController = state.formData['position']!['controller'];
         state.position = state.templateList!
             .firstWhere((element) => element.value.toString() == state.selectedTemplateId,
@@ -273,12 +334,58 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
             .txt ??
             "";
         positionController.text = state.position;
-        // 更新
-        update();
+
+        // 并且需要根据 state.selectedTemplateId调用 接口 回显 证书 、vehicle
+        await _getShowTemplateData(state.selectedTemplateId!);
+
       },
     );
   }
 
+  Future<HttpResult?> _getShowTemplateData(String templateId) async{
+    final result = await _ukLabourRepository.fetchLabourRequestShowTemplateData(templateId);
+    if (result.isSuccess) {
+      state.showTemplateData = result.data;
+      if (state.showTemplateData != null) {
+        // 回显 证书、vehicle
+        if((state.showTemplateData?.certificate??'').isNotEmpty){
+          state.selectedCertificateList = state.showTemplateData?.certificate?.split(',')?? [];
+          // 循环 state.labReqOption?.certificateList 满足条件修改  checked
+          state.labReqOption?.certificateList?.forEach((e)=> {
+            if(state.selectedCertificateList.contains(e.value.toString())){
+              e.checked = 'checked'
+            }else {
+              e.checked = ''
+            }
+          });
+
+          Log.d("切换模板后, 需要回显的证书列表: ${state.selectedCertificateList}");
+          Log.d("切换模板后, 证书的回显 selectedCertificateList: ${state.labReqOption?.certificateList}");
+
+          state.selectedVehicleList = state.showTemplateData?.vehicle?.split(',')?? [];
+          // 循环 state.labReqOption?.vehicleList 满足条件修改  checked
+          state.labReqOption?.vehicleList?.forEach((e)=> {
+            if(state.selectedVehicleList.contains(e.value.toString())){
+              e.checked = 'checked'
+            }else {
+              e.checked = ''
+            }
+          });
+
+
+          Log.d("切换模板后, 需要回显的vehicle列表: ${state.selectedVehicleList}");
+          Log.d("切换模板后, 证书的回显 vehicleList: ${state.labReqOption?.vehicleList}");
+
+        }
+        // 更新
+        update();
+      }
+    }else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
+
   //选择日期
   void pickJobDate() {
     if (state.labReqOption == null || state.pageType == 2) {

+ 10 - 1
packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_state.dart

@@ -1,6 +1,7 @@
 import 'dart:io';
 
 import 'package:cpt_uk/modules/job/labour_request_add/widget/labour_request_interface.dart';
+import 'package:domain/entity/response/uk_lab_req_show_template_entity.dart';
 import 'package:domain/entity/response/uk_labour_request_detail_entity.dart';
 import 'package:domain/entity/response/uk_labour_request_preselect_addstatff_list_entity.dart';
 import 'package:flutter/material.dart';
@@ -42,9 +43,14 @@ class LabourRequestAddState implements CommonLabourRequestState {
   String? preSelectedIds; // 预选人ids
   List<UkLabourRequestPreselectAddstatffListRows>? preSelectedList = []; // 预选人列表
 
+  UkLabReqShowTemplateEntity? showTemplateData; // 切换模板时 获取的回显的部分数据(证书、chanllenge25、vehicle)
+
+  List<String> selectedCertificateList = [];   //选中的 证书 certificate
+  List<String> selectedVehicleList = [];   //选中的 车辆 vehicle
+  String? selectedChallenge25Id;   // 选择的 challenge25 id
+
   String? selectedTypeId;
   String? selectedType;
-
   String? event;
   String? eventType;
   String? eventPax;
@@ -129,5 +135,8 @@ class LabourRequestAddState implements CommonLabourRequestState {
   List<UkLabourRequestDetailDepartmentList>? get departmentList => labReqOption?.departmentList;
   List<UkLabourRequestDetailChargeList>? get chargeList => labReqOption?.chargeList;
   List<UkLabourRequestDetailEmploymentList>? get employmentList => labReqOption?.employmentList;
+  List<UkLabourRequestDetailCertificateList>? get certificateList => labReqOption?.certificateList;
+  List<UkLabourRequestDetailVehicleList>? get vehicleList => labReqOption?.vehicleList;
+  List<UkLabourRequestDetailChallenge25List>? get challenge25List => labReqOption?.challenge25List;
 
 }

+ 84 - 0
packages/cpt_uk/lib/modules/job/labour_request_add/widget/lab_request_and_request_review_form.dart

@@ -12,6 +12,8 @@ import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_button.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/custom_check_box.dart';
+import 'package:widgets/shatter/custom_radio_check.dart';
 import 'package:widgets/shatter/form_require_text.dart';
 import 'package:widgets/shatter/round_my_text_field.dart';
 import 'package:widgets/widget_export.dart';
@@ -268,6 +270,88 @@ class CommonLabourRequestFormFields extends StatelessWidget {
           }),
         ),
 
+        // certificate 证书
+        Visibility(
+          visible: state.certificateList?.isNotEmpty == true,
+          child: MyTextView(
+            "Certificate".tr,
+            textColor: Colors.white,
+            fontSize: 14,
+            isFontRegular: true,
+            marginLeft: 0,
+            marginTop: 15,
+          ),
+        ),
+
+        // 证书的多选
+        Visibility(
+          visible: state.certificateList?.isNotEmpty == true,
+          child: CustomCheckBox(
+            options: state.certificateList?.map<String>((e) => e.txt!).toList() ?? [],
+            onOptionsSelected: (selected) {
+              Log.d("操作了证书后的 selected   ${selected}");
+              Log.d("操作证书时的 state.certificateList   ${state.certificateList}");
+              // 转换选中的索引为对应的 value
+              state.selectedCertificateList = selected
+                  .map((index) {
+                return state.certificateList?[index].value?.toString(); // 获取对应的 value
+              })
+                  .whereType<String>()
+                  .toList();
+              Log.d("操作了证书后的 selectedList   ${state.selectedCertificateList}");
+            },
+            selectedOptions: state.certificateList?.where((e) => e.checked == "checked").map((e) => e.txt!).toList() ?? [],
+          ).marginOnly(left: 0, right: 15, top: 10),
+        ),
+
+        // challenge25
+        MyTextView(
+          "Challenge25".tr,
+          textColor: Colors.white,
+          fontSize: 14,
+          isFontRegular: true,
+          marginTop: 15,
+        ),
+
+        // challenge25 radiobox
+        Visibility(
+          visible: state.challenge25List?.isNotEmpty == true,
+          child: CustomRadioCheck(
+            options: state.challenge25List?.map((e) => e.txt!).toList() ?? [],
+              onOptionSelected: (index, text) {
+                state.selectedChallenge25Id = state.challenge25List![index].value?.toString()??'';
+              },
+              selectedPosition: state.challenge25List?.indexWhere((e) => e.checked == "checked") ?? -1,
+          ).marginOnly(left: 0, right: 15, top: 10),
+    ),
+
+        // Vehicle  交通工具
+        MyTextView(
+          "Vehicle".tr,
+          textColor: Colors.white,
+          fontSize: 14,
+          isFontRegular: true,
+          marginTop: 15,
+        ),
+
+        //交通工具的多选
+        Visibility(
+          visible: state.vehicleList?.isNotEmpty == true,
+          child: CustomCheckBox(
+            options: state.vehicleList?.map((e) => e.txt!).toList() ?? [],
+            onOptionsSelected: (selected) {
+              // 转换选中的索引为对应的 value
+              state.selectedVehicleList = selected
+                  .map((index) {
+                return state.vehicleList?[index].value?.toString(); // 获取对应的 value
+              })
+                  .whereType<String>()
+                  .toList();
+            },
+            selectedOptions: state.vehicleList?.where((e) => e.checked == "checked").map((e) => e.txt!).toList() ?? [],
+          ).marginOnly(left: 0, right: 15, top: 10),
+        ),
+
 
         // Type 选项  employment list
         FormRequireText(

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

@@ -21,11 +21,19 @@ abstract class CommonLabourRequestState {
   String? get preSelectedNames;
   String? get attFilePath;
 
+  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;
   List<UkLabourRequestDetailEmploymentList>? get employmentList;
+  List<UkLabourRequestDetailCertificateList>? get certificateList => labReqOption?.certificateList;
+  List<UkLabourRequestDetailVehicleList>? get vehicleList => labReqOption?.vehicleList;
+  List<UkLabourRequestDetailChallenge25List>? get challenge25List => labReqOption?.challenge25List;
+
 
   Map<String, Map<String, dynamic>> formData = {
     'no_of_staff': {

+ 101 - 22
packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_controller.dart

@@ -129,13 +129,64 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
     OptionPickerUtil.showCupertinoOptionPicker(
       items: state.labReqOption!.templateList!.map((e) => e.txt!).toList(growable: false),
       initialSelectIndex: selectedTemplateIndex,
-      onPickerChanged: (_, index) {
+      onPickerChanged: (_, index) async{
         state.selectedTemplateId = state.labReqOption!.templateList![index].value!.toString();
-        update();
+        // 选择了标题后 需要 将此时选择的 标题 回显 给position
+        var positionController = state.formData['position']!['controller'];
+        state.position = state.templateList!
+            .firstWhere((element) => element.value.toString() == state.selectedTemplateId,
+            orElse: () => UkLabourRequestDetailTemplateList())
+            .txt ??
+            "";
+        positionController.text = state.position;
+
+        // 并且需要根据 state.selectedTemplateId调用 接口 回显 证书 、vehicle
+        await _getShowTemplateData(state.selectedTemplateId!);
       },
     );
   }
 
+  Future<HttpResult?> _getShowTemplateData(String templateId) async{
+    final result = await _ukLabourRepository.fetchLabourRequestShowTemplateData(templateId);
+    if (result.isSuccess) {
+      state.showTemplateData = result.data;
+      if (state.showTemplateData != null) {
+        // 回显 证书、vehicle
+        if((state.showTemplateData?.certificate??'').isNotEmpty){
+          List<String> selectedCertificateList = state.showTemplateData?.certificate?.split(',')?? [];
+          // 循环 state.labReqOption?.certificateList 满足条件修改  checked
+          state.labReqOption?.certificateList?.forEach((e)=> {
+            if(selectedCertificateList.contains(e.value.toString())){
+              e.checked = 'checked'
+            }else {
+              e.checked = ''
+            }
+          });
+          Log.d("切换模板后, 需要回显的证书列表: ${selectedCertificateList}");
+          Log.d("切换模板后, 证书的回显 selectedCertificateList: ${state.labReqOption?.certificateList}");
+
+          List<String> selectedVehicleList = state.showTemplateData?.vehicle?.split(',')?? [];
+          // 循环 state.labReqOption?.vehicleList 满足条件修改  checked
+          state.labReqOption?.vehicleList?.forEach((e)=> {
+            if(selectedVehicleList.contains(e.value.toString())){
+              e.checked = 'checked'
+            }else {
+              e.checked = ''
+            }
+          });
+
+          Log.d("切换模板后, 需要回显的vehicle列表: ${selectedVehicleList}");
+          Log.d("切换模板后, 证书的回显 vehicleList: ${state.labReqOption?.vehicleList}");
+
+        }
+        // 更新
+        update();
+      }
+    }else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
   //选择开始时间
   @override
   void pickStartTime() {
@@ -382,27 +433,55 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
 
     Future<HttpResult> taskFuture;
     // 编辑
-    taskFuture = _ukLabourRepository.labourRequestReviewEditSubmit(
-        requestId: state.requestId,
-        templateId: state.selectedTemplateId,
-        jobStart: "${DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd')} ${DateTimeUtils.formatDate(state.selectedStartTime, format: 'HH:mm')}:00",
-        jobEnd: "${DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd')} ${DateTimeUtils.formatDate(state.selectedEndTime, format: 'HH:mm')}:00",
-        departmentId: state.selectedDepartmentId,
-        needNum: needNum,
-        salaryBy: 'hour',
-        amount: state.labReqOption?.serviceType == 1 ? amount : null,
-        employmentType: state.selectedTypeId,
-        eventName: event,
-        eventType: eventType,
-        passengers: eventPax,
-        estRevenue: revenue,
-        position: position,
-        estCost: totalCost,
-        description: remark,
-        attUrl: state.attFilePath,
-        cancelToken: cancelToken
-    );
 
+    Map<String, dynamic> params = {
+      "requestId": state.requestId,
+      "templateId": state.selectedTemplateId,
+      "jobStart": "${DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd')} ${DateTimeUtils.formatDate(state.selectedStartTime, format: 'HH:mm')}:00",
+      "jobEnd": "${DateTimeUtils.formatDate(state.selectedDate, format: 'yyyy-MM-dd')} ${DateTimeUtils.formatDate(state.selectedEndTime, format: 'HH:mm')}:00",
+      "departmentId": state.selectedDepartmentId,
+      "needNum": needNum,
+      "salaryBy": 'hour',
+      "amount": state.labReqOption?.serviceType == 1 ? amount : null,
+      "certificate": state.selectedCertificateList?.join(",")?? "",
+      "challenge25": state.selectedChallenge25Id?? "",
+      "vehicle": state.selectedVehicleList?.join(",")??"",
+      "description": remark,
+      "employmentType": state.selectedTypeId,
+      "eventName": event,
+      "eventType": eventType,
+      "passengers": eventPax,
+      "estRevenue": revenue,
+      "position": position,
+      "estCost": totalCost,
+      "attUrl": state.attFilePath,
+      'cancelToken': cancelToken
+    };
+
+    // 调用的其实就是 lab-req 编辑的接口
+    taskFuture = _ukLabourRepository.editLabourRequestSubmit(
+      requestId: params['requestId'],
+      templateId: params['templateId'],
+      jobStart: params['jobStart'],
+      jobEnd: params['jobEnd'],
+      departmentId: params['departmentId'],
+      needNum: params['needNum'],
+      salaryBy: params['salaryBy'],
+      amount: params['amount'],
+      certificate: params['certificate'],
+      challenge25: params['challenge25'],
+      vehicle: params['vehicle'],
+      description: params['description'],
+      employmentType: params['employmentType'],
+      eventName: params['eventName'],
+      eventType: params['eventType'],
+      passengers: params['passengers'],
+      estRevenue: params['estRevenue'],
+      position: params['position'],
+      estCost: params['estCost'],
+      attUrl: params['attUrl'],
+      cancelToken: params['cancelToken'],
+    );
 
     var result = await taskFuture;
 

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

@@ -2,6 +2,7 @@ import 'dart:io';
 
 import 'package:cpt_uk/modules/job/labour_request_add/widget/labour_request_interface.dart';
 import 'package:domain/entity/response/labour_request_edit_index_entity.dart';
+import 'package:domain/entity/response/uk_lab_req_show_template_entity.dart';
 import 'package:domain/entity/response/uk_labour_request_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_basic/basic_export.dart';
@@ -37,9 +38,15 @@ class LabourReviewEditState implements CommonLabourRequestState {
   String? noStaff;  //成员数量
   String? amount;
 
+  List<String> selectedCertificateList = [];   //选中的 证书 certificate
+  List<String> selectedVehicleList = [];   //选中的 车辆 vehicle
+  String? selectedChallenge25Id;   // 选择的 challenge25 id
+
+  UkLabReqShowTemplateEntity? showTemplateData; // 切换模板时 获取的回显的部分数据(证书、chanllenge25、vehicle)
+
+
   String? selectedTypeId;
   String? selectedType;
-
   String? event;
   String? eventType;
   String? eventPax;
@@ -57,6 +64,9 @@ class LabourReviewEditState implements CommonLabourRequestState {
   List<UkLabourRequestDetailDepartmentList>? get departmentList => labReqOption?.departmentList;
   List<UkLabourRequestDetailChargeList>? get chargeList => labReqOption?.chargeList;
   List<UkLabourRequestDetailEmploymentList>? get employmentList => labReqOption?.employmentList;
+  List<UkLabourRequestDetailCertificateList>? get certificateList => labReqOption?.certificateList;
+  List<UkLabourRequestDetailVehicleList>? get vehicleList => labReqOption?.vehicleList;
+  List<UkLabourRequestDetailChallenge25List>? get challenge25List => labReqOption?.challenge25List;
 
   DateTime? get selectedDate => selectedStartTime;
   String? get repeatDateStr => '';

+ 10 - 2
packages/cpt_uk/lib/modules/review/labour_review_list/labour_review_controller.dart

@@ -297,8 +297,16 @@ class LabourReviewController extends GetxController with DioCancelableMixin {
     // 将逗号分隔的字符串转换为数组
     List<String> recordIdList = recordIds.split(',');
     // 移除列表中符合条件的项
-    state.datas.removeWhere((e) => recordIdList.contains(e.recordId.toString()));
-    // Log.d("移除后的 state.datas   ${state.datas}");
+    state.datas.removeWhere((e) {
+      final recordIdStr = e.recordId?.toString();
+      final shouldRemove = recordIdStr != null && recordIdList.contains(recordIdStr);
+      if (shouldRemove) {
+        Log.d("移除项目 recordId: ${recordIdStr}");
+      }
+      return shouldRemove;
+    });
+
+    Log.d("移除后的 state.datas   ${state.datas}");
     update();
   }
 

+ 1 - 0
packages/cpt_uk/lib/modules/review/labour_review_list/labour_review_page.dart

@@ -3,6 +3,7 @@ import 'package:cs_resources/generated/assets.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get.dart';
+import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/my_button.dart';

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

@@ -307,6 +307,8 @@ class ApiConstants {
   static const apiLabourRequestPreSelectAddBatchUK = "/index.php/api/v1/hotel/prestaff/staff-submit";
   // 预选人-删除员工
   static const apiLabourRequestPreSelectDeleteUK = "/index.php/api/v1/hotel/prestaff/delete";
+  // labourequest - 根据模板id 显示模板数据
+  static const apiLabourRequestTemplateShowUK = "/index.php/api/v1/hotel/lab-req/show-template";
 
   // labourequest-review 列表
   static const apiLabourRequestReViewListUK = "/index.php/api/v1/hotel/lab-req/review";
@@ -335,6 +337,8 @@ class ApiConstants {
   static const apiAppliedStaffReviseDeleteUK = "/index.php/api/v1/hotel/revise/delete";
   // revise logs
   static const apiAppliedStaffReviseLogsUK = "/index.php/api/v1/hotel/revise/logs";
+  // staff - set favourite
+  static const apiAppliedStaffSetFavouriteUK = "/index.php/api/v1/hotel/member/favourite";
   // staff - detail
   static const apiStaffDetailUK = "/index.php/api/v1/hotel/member/detail-new";
   // staff - labour history

+ 48 - 0
packages/cs_domain/lib/entity/response/uk_job_list_applied_staff_search_entity.dart

@@ -0,0 +1,48 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/uk_job_list_applied_staff_search_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/uk_job_list_applied_staff_search_entity.g.dart';
+
+@JsonSerializable()
+class UkJobListAppliedStaffSearchEntity {
+	int? total;
+	List<UkJobListAppliedStaffSearchRows>? rows;
+
+	UkJobListAppliedStaffSearchEntity();
+
+	factory UkJobListAppliedStaffSearchEntity.fromJson(Map<String, dynamic> json) => $UkJobListAppliedStaffSearchEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkJobListAppliedStaffSearchEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkJobListAppliedStaffSearchRows {
+	int? id;
+	String? name;
+	@JSONField(name: "is_favourite")
+	int? isFavourite;
+	String? sex;
+	String? phone;
+	String? nric;
+	String? avatar;
+	@JSONField(name: "apply_state")
+	int? applyState;
+
+	bool isSelected=false;
+
+	UkJobListAppliedStaffSearchRows();
+
+	factory UkJobListAppliedStaffSearchRows.fromJson(Map<String, dynamic> json) => $UkJobListAppliedStaffSearchRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkJobListAppliedStaffSearchRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

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

@@ -0,0 +1,47 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/uk_lab_req_show_template_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/uk_lab_req_show_template_entity.g.dart';
+
+@JsonSerializable()
+class UkLabReqShowTemplateEntity {
+	int? id;
+	@JSONField(name: "company_id")
+	int? companyId;
+	@JSONField(name: "job_title")
+	String? jobTitle;
+	@JSONField(name: "contact_name")
+	String? contactName;
+	@JSONField(name: "contact_no")
+	String? contactNo;
+	String? vehicle;
+	String? certificate;
+	dynamic age;
+	dynamic language;
+	int? gender;
+	String? description;
+	String? note;
+	@JSONField(name: "operator_id")
+	int? operatorId;
+	@JSONField(name: "created_at")
+	String? createdAt;
+	@JSONField(name: "updated_at")
+	String? updatedAt;
+	@JSONField(name: "deleted_at")
+	dynamic deletedAt;
+	@JSONField(name: "template_id")
+	int? templateId;
+	@JSONField(name: "job_title_id")
+	int? jobTitleId;
+
+	UkLabReqShowTemplateEntity();
+
+	factory UkLabReqShowTemplateEntity.fromJson(Map<String, dynamic> json) => $UkLabReqShowTemplateEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkLabReqShowTemplateEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 66 - 6
packages/cs_domain/lib/entity/response/uk_labour_request_detail_entity.dart

@@ -30,20 +30,26 @@ 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")
-	String? estRevenue;
+	dynamic estRevenue;
 	String? position;
-	String? description;
+	dynamic description;
 	@JSONField(name: "att_url")
-	String? attUrl;
+	dynamic attUrl;
 	@JSONField(name: "est_cost")
 	String? estCost;
 	@JSONField(name: "est_ratio")
-	int? estRatio;
+	String? estRatio;
+	@JSONField(name: "certificate_list")
+	List<UkLabourRequestDetailCertificateList>? certificateList;
+	@JSONField(name: "vehicle_list")
+	List<UkLabourRequestDetailVehicleList>? vehicleList;
+	@JSONField(name: "challenge_25_list")
+	List<UkLabourRequestDetailChallenge25List>? challenge25List;
 	@JSONField(name: "location_list")
 	List<UkLabourRequestDetailLocationList>? locationList;
 	@JSONField(name: "template_list")
@@ -68,6 +74,60 @@ class UkLabourRequestDetailEntity {
 }
 
 @JsonSerializable()
+class UkLabourRequestDetailCertificateList {
+	int? value;
+	String? txt;
+	String? checked;
+
+	UkLabourRequestDetailCertificateList();
+
+	factory UkLabourRequestDetailCertificateList.fromJson(Map<String, dynamic> json) => $UkLabourRequestDetailCertificateListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkLabourRequestDetailCertificateListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkLabourRequestDetailVehicleList {
+	String? value;
+	String? txt;
+	String? checked;
+
+	UkLabourRequestDetailVehicleList();
+
+	factory UkLabourRequestDetailVehicleList.fromJson(Map<String, dynamic> json) => $UkLabourRequestDetailVehicleListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkLabourRequestDetailVehicleListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkLabourRequestDetailChallenge25List {
+	int? value;
+	String? txt;
+	String? checked;
+
+	UkLabourRequestDetailChallenge25List();
+
+	factory UkLabourRequestDetailChallenge25List.fromJson(Map<String, dynamic> json) => $UkLabourRequestDetailChallenge25ListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkLabourRequestDetailChallenge25ListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
 class UkLabourRequestDetailLocationList {
 	String? value;
 	String? txt;

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

@@ -110,7 +110,9 @@ import 'package:domain/entity/response/uk_job_applied_revise_edit_detail_entity.
 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_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';
 import 'package:domain/entity/response/uk_labour_request_preselect_addstatff_list_entity.dart';
 import 'package:domain/entity/response/uk_labour_request_preselected_list_entity.dart';
@@ -1230,15 +1232,44 @@ class JsonConvert {
           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 (<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 (<UkLabourRequestDetailLocationList>[] is M) {
       return data.map<UkLabourRequestDetailLocationList>((
           Map<String, dynamic> e) =>
@@ -1789,10 +1820,22 @@ class JsonConvertClassCollection {
         .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)

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

@@ -0,0 +1,121 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/uk_job_list_applied_staff_search_entity.dart';
+
+UkJobListAppliedStaffSearchEntity $UkJobListAppliedStaffSearchEntityFromJson(
+    Map<String, dynamic> json) {
+  final UkJobListAppliedStaffSearchEntity ukJobListAppliedStaffSearchEntity = UkJobListAppliedStaffSearchEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    ukJobListAppliedStaffSearchEntity.total = total;
+  }
+  final List<UkJobListAppliedStaffSearchRows>? rows = (json['rows'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkJobListAppliedStaffSearchRows>(
+          e) as UkJobListAppliedStaffSearchRows).toList();
+  if (rows != null) {
+    ukJobListAppliedStaffSearchEntity.rows = rows;
+  }
+  return ukJobListAppliedStaffSearchEntity;
+}
+
+Map<String, dynamic> $UkJobListAppliedStaffSearchEntityToJson(
+    UkJobListAppliedStaffSearchEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension UkJobListAppliedStaffSearchEntityExtension on UkJobListAppliedStaffSearchEntity {
+  UkJobListAppliedStaffSearchEntity copyWith({
+    int? total,
+    List<UkJobListAppliedStaffSearchRows>? rows,
+  }) {
+    return UkJobListAppliedStaffSearchEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+UkJobListAppliedStaffSearchRows $UkJobListAppliedStaffSearchRowsFromJson(
+    Map<String, dynamic> json) {
+  final UkJobListAppliedStaffSearchRows ukJobListAppliedStaffSearchRows = UkJobListAppliedStaffSearchRows();
+  final int? id = jsonConvert.convert<int>(json['id']);
+  if (id != null) {
+    ukJobListAppliedStaffSearchRows.id = id;
+  }
+  final String? name = jsonConvert.convert<String>(json['name']);
+  if (name != null) {
+    ukJobListAppliedStaffSearchRows.name = name;
+  }
+  final int? isFavourite = jsonConvert.convert<int>(json['is_favourite']);
+  if (isFavourite != null) {
+    ukJobListAppliedStaffSearchRows.isFavourite = isFavourite;
+  }
+  final String? sex = jsonConvert.convert<String>(json['sex']);
+  if (sex != null) {
+    ukJobListAppliedStaffSearchRows.sex = sex;
+  }
+  final String? phone = jsonConvert.convert<String>(json['phone']);
+  if (phone != null) {
+    ukJobListAppliedStaffSearchRows.phone = phone;
+  }
+  final String? nric = jsonConvert.convert<String>(json['nric']);
+  if (nric != null) {
+    ukJobListAppliedStaffSearchRows.nric = nric;
+  }
+  final String? avatar = jsonConvert.convert<String>(json['avatar']);
+  if (avatar != null) {
+    ukJobListAppliedStaffSearchRows.avatar = avatar;
+  }
+  final int? applyState = jsonConvert.convert<int>(json['apply_state']);
+  if (applyState != null) {
+    ukJobListAppliedStaffSearchRows.applyState = applyState;
+  }
+  final bool? isSelected = jsonConvert.convert<bool>(json['isSelected']);
+  if (isSelected != null) {
+    ukJobListAppliedStaffSearchRows.isSelected = isSelected;
+  }
+  return ukJobListAppliedStaffSearchRows;
+}
+
+Map<String, dynamic> $UkJobListAppliedStaffSearchRowsToJson(
+    UkJobListAppliedStaffSearchRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['name'] = entity.name;
+  data['is_favourite'] = entity.isFavourite;
+  data['sex'] = entity.sex;
+  data['phone'] = entity.phone;
+  data['nric'] = entity.nric;
+  data['avatar'] = entity.avatar;
+  data['apply_state'] = entity.applyState;
+  data['isSelected'] = entity.isSelected;
+  return data;
+}
+
+extension UkJobListAppliedStaffSearchRowsExtension on UkJobListAppliedStaffSearchRows {
+  UkJobListAppliedStaffSearchRows copyWith({
+    int? id,
+    String? name,
+    int? isFavourite,
+    String? sex,
+    String? phone,
+    String? nric,
+    String? avatar,
+    int? applyState,
+    bool? isSelected,
+  }) {
+    return UkJobListAppliedStaffSearchRows()
+      ..id = id ?? this.id
+      ..name = name ?? this.name
+      ..isFavourite = isFavourite ?? this.isFavourite
+      ..sex = sex ?? this.sex
+      ..phone = phone ?? this.phone
+      ..nric = nric ?? this.nric
+      ..avatar = avatar ?? this.avatar
+      ..applyState = applyState ?? this.applyState
+      ..isSelected = isSelected ?? this.isSelected;
+  }
+}

+ 147 - 0
packages/cs_domain/lib/generated/json/uk_lab_req_show_template_entity.g.dart

@@ -0,0 +1,147 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/uk_lab_req_show_template_entity.dart';
+
+UkLabReqShowTemplateEntity $UkLabReqShowTemplateEntityFromJson(
+    Map<String, dynamic> json) {
+  final UkLabReqShowTemplateEntity ukLabReqShowTemplateEntity = UkLabReqShowTemplateEntity();
+  final int? id = jsonConvert.convert<int>(json['id']);
+  if (id != null) {
+    ukLabReqShowTemplateEntity.id = id;
+  }
+  final int? companyId = jsonConvert.convert<int>(json['company_id']);
+  if (companyId != null) {
+    ukLabReqShowTemplateEntity.companyId = companyId;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    ukLabReqShowTemplateEntity.jobTitle = jobTitle;
+  }
+  final String? contactName = jsonConvert.convert<String>(json['contact_name']);
+  if (contactName != null) {
+    ukLabReqShowTemplateEntity.contactName = contactName;
+  }
+  final String? contactNo = jsonConvert.convert<String>(json['contact_no']);
+  if (contactNo != null) {
+    ukLabReqShowTemplateEntity.contactNo = contactNo;
+  }
+  final String? vehicle = jsonConvert.convert<String>(json['vehicle']);
+  if (vehicle != null) {
+    ukLabReqShowTemplateEntity.vehicle = vehicle;
+  }
+  final String? certificate = jsonConvert.convert<String>(json['certificate']);
+  if (certificate != null) {
+    ukLabReqShowTemplateEntity.certificate = certificate;
+  }
+  final dynamic age = json['age'];
+  if (age != null) {
+    ukLabReqShowTemplateEntity.age = age;
+  }
+  final dynamic language = json['language'];
+  if (language != null) {
+    ukLabReqShowTemplateEntity.language = language;
+  }
+  final int? gender = jsonConvert.convert<int>(json['gender']);
+  if (gender != null) {
+    ukLabReqShowTemplateEntity.gender = gender;
+  }
+  final String? description = jsonConvert.convert<String>(json['description']);
+  if (description != null) {
+    ukLabReqShowTemplateEntity.description = description;
+  }
+  final String? note = jsonConvert.convert<String>(json['note']);
+  if (note != null) {
+    ukLabReqShowTemplateEntity.note = note;
+  }
+  final int? operatorId = jsonConvert.convert<int>(json['operator_id']);
+  if (operatorId != null) {
+    ukLabReqShowTemplateEntity.operatorId = operatorId;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    ukLabReqShowTemplateEntity.createdAt = createdAt;
+  }
+  final String? updatedAt = jsonConvert.convert<String>(json['updated_at']);
+  if (updatedAt != null) {
+    ukLabReqShowTemplateEntity.updatedAt = updatedAt;
+  }
+  final dynamic deletedAt = json['deleted_at'];
+  if (deletedAt != null) {
+    ukLabReqShowTemplateEntity.deletedAt = deletedAt;
+  }
+  final int? templateId = jsonConvert.convert<int>(json['template_id']);
+  if (templateId != null) {
+    ukLabReqShowTemplateEntity.templateId = templateId;
+  }
+  final int? jobTitleId = jsonConvert.convert<int>(json['job_title_id']);
+  if (jobTitleId != null) {
+    ukLabReqShowTemplateEntity.jobTitleId = jobTitleId;
+  }
+  return ukLabReqShowTemplateEntity;
+}
+
+Map<String, dynamic> $UkLabReqShowTemplateEntityToJson(
+    UkLabReqShowTemplateEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['company_id'] = entity.companyId;
+  data['job_title'] = entity.jobTitle;
+  data['contact_name'] = entity.contactName;
+  data['contact_no'] = entity.contactNo;
+  data['vehicle'] = entity.vehicle;
+  data['certificate'] = entity.certificate;
+  data['age'] = entity.age;
+  data['language'] = entity.language;
+  data['gender'] = entity.gender;
+  data['description'] = entity.description;
+  data['note'] = entity.note;
+  data['operator_id'] = entity.operatorId;
+  data['created_at'] = entity.createdAt;
+  data['updated_at'] = entity.updatedAt;
+  data['deleted_at'] = entity.deletedAt;
+  data['template_id'] = entity.templateId;
+  data['job_title_id'] = entity.jobTitleId;
+  return data;
+}
+
+extension UkLabReqShowTemplateEntityExtension on UkLabReqShowTemplateEntity {
+  UkLabReqShowTemplateEntity copyWith({
+    int? id,
+    int? companyId,
+    String? jobTitle,
+    String? contactName,
+    String? contactNo,
+    String? vehicle,
+    String? certificate,
+    dynamic age,
+    dynamic language,
+    int? gender,
+    String? description,
+    String? note,
+    int? operatorId,
+    String? createdAt,
+    String? updatedAt,
+    dynamic deletedAt,
+    int? templateId,
+    int? jobTitleId,
+  }) {
+    return UkLabReqShowTemplateEntity()
+      ..id = id ?? this.id
+      ..companyId = companyId ?? this.companyId
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..contactName = contactName ?? this.contactName
+      ..contactNo = contactNo ?? this.contactNo
+      ..vehicle = vehicle ?? this.vehicle
+      ..certificate = certificate ?? this.certificate
+      ..age = age ?? this.age
+      ..language = language ?? this.language
+      ..gender = gender ?? this.gender
+      ..description = description ?? this.description
+      ..note = note ?? this.note
+      ..operatorId = operatorId ?? this.operatorId
+      ..createdAt = createdAt ?? this.createdAt
+      ..updatedAt = updatedAt ?? this.updatedAt
+      ..deletedAt = deletedAt ?? this.deletedAt
+      ..templateId = templateId ?? this.templateId
+      ..jobTitleId = jobTitleId ?? this.jobTitleId;
+  }
+}

+ 170 - 12
packages/cs_domain/lib/generated/json/uk_labour_request_detail_entity.g.dart

@@ -57,11 +57,11 @@ UkLabourRequestDetailEntity $UkLabourRequestDetailEntityFromJson(
   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;
   }
@@ -69,7 +69,7 @@ UkLabourRequestDetailEntity $UkLabourRequestDetailEntityFromJson(
   if (passengers != null) {
     ukLabourRequestDetailEntity.passengers = passengers;
   }
-  final String? estRevenue = jsonConvert.convert<String>(json['est_revenue']);
+  final dynamic estRevenue = json['est_revenue'];
   if (estRevenue != null) {
     ukLabourRequestDetailEntity.estRevenue = estRevenue;
   }
@@ -77,11 +77,11 @@ UkLabourRequestDetailEntity $UkLabourRequestDetailEntityFromJson(
   if (position != null) {
     ukLabourRequestDetailEntity.position = position;
   }
-  final String? description = jsonConvert.convert<String>(json['description']);
+  final dynamic description = json['description'];
   if (description != null) {
     ukLabourRequestDetailEntity.description = description;
   }
-  final String? attUrl = jsonConvert.convert<String>(json['att_url']);
+  final dynamic attUrl = json['att_url'];
   if (attUrl != null) {
     ukLabourRequestDetailEntity.attUrl = attUrl;
   }
@@ -89,11 +89,38 @@ UkLabourRequestDetailEntity $UkLabourRequestDetailEntityFromJson(
   if (estCost != null) {
     ukLabourRequestDetailEntity.estCost = estCost;
   }
-  final int? estRatio = jsonConvert.convert<int>(json['est_ratio']);
+  final String? estRatio = jsonConvert.convert<String>(json['est_ratio']);
   if (estRatio != null) {
     ukLabourRequestDetailEntity.estRatio = estRatio;
   }
   final List<
+      UkLabourRequestDetailCertificateList>? certificateList = (json['certificate_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkLabourRequestDetailCertificateList>(
+          e) as UkLabourRequestDetailCertificateList).toList();
+  if (certificateList != null) {
+    ukLabourRequestDetailEntity.certificateList = certificateList;
+  }
+  final List<
+      UkLabourRequestDetailVehicleList>? vehicleList = (json['vehicle_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkLabourRequestDetailVehicleList>(
+          e) as UkLabourRequestDetailVehicleList).toList();
+  if (vehicleList != null) {
+    ukLabourRequestDetailEntity.vehicleList = vehicleList;
+  }
+  final List<
+      UkLabourRequestDetailChallenge25List>? challenge25List = (json['challenge_25_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkLabourRequestDetailChallenge25List>(
+          e) as UkLabourRequestDetailChallenge25List).toList();
+  if (challenge25List != null) {
+    ukLabourRequestDetailEntity.challenge25List = challenge25List;
+  }
+  final List<
       UkLabourRequestDetailLocationList>? locationList = (json['location_list'] as List<
       dynamic>?)?.map(
           (e) =>
@@ -166,6 +193,11 @@ Map<String, dynamic> $UkLabourRequestDetailEntityToJson(
   data['att_url'] = entity.attUrl;
   data['est_cost'] = entity.estCost;
   data['est_ratio'] = entity.estRatio;
+  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['template_list'] = entity.templateList?.map((v) => v.toJson()).toList();
   data['department_list'] =
@@ -191,15 +223,18 @@ extension UkLabourRequestDetailEntityExtension on UkLabourRequestDetailEntity {
     String? salaryBy,
     int? amount,
     int? employmentType,
-    String? eventName,
-    String? eventType,
+    dynamic eventName,
+    dynamic eventType,
     int? passengers,
-    String? estRevenue,
+    dynamic estRevenue,
     String? position,
-    String? description,
-    String? attUrl,
+    dynamic description,
+    dynamic attUrl,
     String? estCost,
-    int? estRatio,
+    String? estRatio,
+    List<UkLabourRequestDetailCertificateList>? certificateList,
+    List<UkLabourRequestDetailVehicleList>? vehicleList,
+    List<UkLabourRequestDetailChallenge25List>? challenge25List,
     List<UkLabourRequestDetailLocationList>? locationList,
     List<UkLabourRequestDetailTemplateList>? templateList,
     List<UkLabourRequestDetailDepartmentList>? departmentList,
@@ -229,6 +264,9 @@ extension UkLabourRequestDetailEntityExtension on UkLabourRequestDetailEntity {
       ..attUrl = attUrl ?? this.attUrl
       ..estCost = estCost ?? this.estCost
       ..estRatio = estRatio ?? this.estRatio
+      ..certificateList = certificateList ?? this.certificateList
+      ..vehicleList = vehicleList ?? this.vehicleList
+      ..challenge25List = challenge25List ?? this.challenge25List
       ..locationList = locationList ?? this.locationList
       ..templateList = templateList ?? this.templateList
       ..departmentList = departmentList ?? this.departmentList
@@ -237,6 +275,126 @@ extension UkLabourRequestDetailEntityExtension on UkLabourRequestDetailEntity {
   }
 }
 
+UkLabourRequestDetailCertificateList $UkLabourRequestDetailCertificateListFromJson(
+    Map<String, dynamic> json) {
+  final UkLabourRequestDetailCertificateList ukLabourRequestDetailCertificateList = UkLabourRequestDetailCertificateList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    ukLabourRequestDetailCertificateList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    ukLabourRequestDetailCertificateList.txt = txt;
+  }
+  final String? checked = jsonConvert.convert<String>(json['checked']);
+  if (checked != null) {
+    ukLabourRequestDetailCertificateList.checked = checked;
+  }
+  return ukLabourRequestDetailCertificateList;
+}
+
+Map<String, dynamic> $UkLabourRequestDetailCertificateListToJson(
+    UkLabourRequestDetailCertificateList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['checked'] = entity.checked;
+  return data;
+}
+
+extension UkLabourRequestDetailCertificateListExtension on UkLabourRequestDetailCertificateList {
+  UkLabourRequestDetailCertificateList copyWith({
+    int? value,
+    String? txt,
+    String? checked,
+  }) {
+    return UkLabourRequestDetailCertificateList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..checked = checked ?? this.checked;
+  }
+}
+
+UkLabourRequestDetailVehicleList $UkLabourRequestDetailVehicleListFromJson(
+    Map<String, dynamic> json) {
+  final UkLabourRequestDetailVehicleList ukLabourRequestDetailVehicleList = UkLabourRequestDetailVehicleList();
+  final String? value = jsonConvert.convert<String>(json['value']);
+  if (value != null) {
+    ukLabourRequestDetailVehicleList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    ukLabourRequestDetailVehicleList.txt = txt;
+  }
+  final String? checked = jsonConvert.convert<String>(json['checked']);
+  if (checked != null) {
+    ukLabourRequestDetailVehicleList.checked = checked;
+  }
+  return ukLabourRequestDetailVehicleList;
+}
+
+Map<String, dynamic> $UkLabourRequestDetailVehicleListToJson(
+    UkLabourRequestDetailVehicleList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['checked'] = entity.checked;
+  return data;
+}
+
+extension UkLabourRequestDetailVehicleListExtension on UkLabourRequestDetailVehicleList {
+  UkLabourRequestDetailVehicleList copyWith({
+    String? value,
+    String? txt,
+    String? checked,
+  }) {
+    return UkLabourRequestDetailVehicleList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..checked = checked ?? this.checked;
+  }
+}
+
+UkLabourRequestDetailChallenge25List $UkLabourRequestDetailChallenge25ListFromJson(
+    Map<String, dynamic> json) {
+  final UkLabourRequestDetailChallenge25List ukLabourRequestDetailChallenge25List = UkLabourRequestDetailChallenge25List();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    ukLabourRequestDetailChallenge25List.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    ukLabourRequestDetailChallenge25List.txt = txt;
+  }
+  final String? checked = jsonConvert.convert<String>(json['checked']);
+  if (checked != null) {
+    ukLabourRequestDetailChallenge25List.checked = checked;
+  }
+  return ukLabourRequestDetailChallenge25List;
+}
+
+Map<String, dynamic> $UkLabourRequestDetailChallenge25ListToJson(
+    UkLabourRequestDetailChallenge25List entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['checked'] = entity.checked;
+  return data;
+}
+
+extension UkLabourRequestDetailChallenge25ListExtension on UkLabourRequestDetailChallenge25List {
+  UkLabourRequestDetailChallenge25List copyWith({
+    int? value,
+    String? txt,
+    String? checked,
+  }) {
+    return UkLabourRequestDetailChallenge25List()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..checked = checked ?? this.checked;
+  }
+}
+
 UkLabourRequestDetailLocationList $UkLabourRequestDetailLocationListFromJson(
     Map<String, dynamic> json) {
   final UkLabourRequestDetailLocationList ukLabourRequestDetailLocationList = UkLabourRequestDetailLocationList();

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

@@ -13,6 +13,7 @@ import '../entity/response/uk_job_applied_revise_edit_detail_entity.dart';
 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_template_detail_by_select_title_entity.dart';
 import '../entity/response/uk_report_outlet_entity.dart';
 import '../entity/response/uk_staff_detail_entity.dart';
@@ -368,6 +369,7 @@ class UKJobRepository extends GetxService {
     return result.convert();
   }
 
+
   /// 根据ID获取主列表的Item数据,用于刷新Item
   Future<HttpResult<UkJobAppliedStaffListEntity>> fetchItemByAppliedIds(
       String? jobId,
@@ -436,6 +438,73 @@ class UKJobRepository extends GetxService {
     return result.convert();
   }
 
+  /// 添加员工的全部员工数据列表
+  Future<HttpResult<UkJobListAppliedStaffSearchEntity>> searchStaffList(
+      String? jobId,
+      String? keyword, {
+        required int curPage,
+        CancelToken? cancelToken,
+      }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "10";
+
+    if (!Utils.isEmpty(jobId)) {
+      params["job_id"] = jobId!;
+    }
+    if (!Utils.isEmpty(keyword)) {
+      params["keyword"] = keyword!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListAppliedStaffSearch,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = UkJobListAppliedStaffSearchEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<UkJobListAppliedStaffSearchEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 添加员工 时 给员工 打标记
+  Future<HttpResult> staffSetFavourite(
+      String? memberId,
+      String? isFavourite, {
+        CancelToken? cancelToken,
+      }) async {
+    //参数
+    Map<String, String> params = {};
+
+    if (!Utils.isEmpty(memberId)) {
+      params["member_id"] = memberId!;
+    }
+    if (!Utils.isEmpty(isFavourite)) {
+      params["is_favourite"] = isFavourite!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiAppliedStaffSetFavouriteUK,
+      method: HttpMethod.POST,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
   /// 获取revise 列表
   Future<HttpResult<UkJobAppliedReviseInfoEntity>> fetchJobAppliedReviseList(
       {

+ 53 - 86
packages/cs_domain/lib/repository/uk_labour_repository.dart

@@ -11,6 +11,7 @@ import 'package:plugin_platform/http/http_result.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 import '../constants/api_constants.dart';
+import '../entity/response/uk_lab_req_show_template_entity.dart';
 import '../entity/response/uk_labour_request_detail_entity.dart';
 import '../entity/response/uk_labour_request_preselect_addstatff_list_entity.dart';
 import '../entity/response/uk_labour_request_preselected_list_entity.dart';
@@ -103,7 +104,6 @@ class UkLabourRepository extends GetxService {
     return result.convert();
   }
 
-
   /// 添加用工的选项
   Future<HttpResult<UkLabourRequestDetailEntity>> fetchLabourRequestAddOption({
     CancelToken? cancelToken,
@@ -125,6 +125,33 @@ class UkLabourRepository extends GetxService {
     return result.convert();
   }
 
+  /// 根据模板id 回显 详情页相关数据
+  Future<HttpResult<UkLabReqShowTemplateEntity>> fetchLabourRequestShowTemplateData(
+      String templateId,
+      {
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, dynamic> params = {};
+    params['template_id'] = templateId;
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiLabourRequestTemplateShowUK,
+      params:  params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = UkLabReqShowTemplateEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<UkLabReqShowTemplateEntity>(data: data);
+    }
+    return result.convert();
+  }
+
   /// 获取labourequest 详情
   Future<HttpResult<UkLabourRequestDetailEntity>> fetchLabourRequestDetail(
       String? requestId, {
@@ -166,6 +193,9 @@ class UkLabourRepository extends GetxService {
       String? salaryBy,
       String? repeatDateStr,
       String? amount,
+      String? certificate, // 多个逗号隔开
+      String? challenge25,
+      String? vehicle, // 多个逗号隔开
       String? description,
       String? employmentType,
       String? eventName,
@@ -195,6 +225,16 @@ class UkLabourRepository extends GetxService {
       params["amount"] = amount!;
     }
 
+    if(!Utils.isEmpty(certificate)){
+      params["certificate"] = certificate!;
+    }
+    if(!Utils.isEmpty(challenge25)){
+      params["challenge_25"] = challenge25!;
+    }
+    if(!Utils.isEmpty(vehicle)){
+      params["vehicle"] = vehicle!;
+    }
+
     if(!Utils.isEmpty(repeatDateStr)) {
       params["select"] = repeatDateStr!;
     }
@@ -250,6 +290,9 @@ class UkLabourRepository extends GetxService {
     String? salaryBy,
     String? repeatDateStr,
     String? amount,
+    String? certificate, // 多个逗号隔开
+    String? challenge25,
+    String? vehicle, // 多个逗号隔开
     String? jobApplyPreId,
     String? description,
     String? employmentType,
@@ -286,6 +329,15 @@ class UkLabourRepository extends GetxService {
     if (!Utils.isEmpty(amount)) {
       params["amount"] = amount!;
     }
+    if(!Utils.isEmpty(certificate)){
+      params["certificate"] = certificate!;
+    }
+    if(!Utils.isEmpty(challenge25)){
+      params["challenge_25"] = challenge25!;
+    }
+    if(!Utils.isEmpty(vehicle)){
+      params["vehicle"] = vehicle!;
+    }
 
     params['description'] = description ?? "";
     params['employment_type'] = employmentType ?? "";
@@ -537,91 +589,6 @@ class UkLabourRepository extends GetxService {
     return result.convert();
   }
 
-  /// labourrequest -review 编辑提交
-  Future<HttpResult> labourRequestReviewEditSubmit(
-    {
-      String? requestId,
-      String? templateId,
-      String? location,
-      String? jobLocationOther,
-      String? jobStart, //开始时间  格式[Y-m-d H:i:s]
-      String? jobEnd, //结束时间  格式[Y-m-d H:i:s]
-      String? salaryBy,
-      String? departmentId,
-      String? needNum,
-      String? amount,  // service_type==1时 必填
-      String? repeatDateStr,
-      String? jobApplyPreId,
-      String? description,
-      String? employmentType,
-      String? eventName,
-      String? eventType,
-      String? passengers,
-      String? estRevenue,
-      String? position,
-      String? estCost,
-      dynamic? attUrl,
-      CancelToken? cancelToken,
-    }) async {
-    //参数
-    Map<String, dynamic> params = {};
-    params['request_id'] = requestId ?? "";
-    params['template_id'] = templateId ?? "";
-    params['job_start'] = jobStart ?? "";
-    params['job_end'] = jobEnd ?? "";
-    params['need_num'] = needNum ?? "";
-    if (!Utils.isEmpty(departmentId)) {
-      params["co_department_id"] = departmentId!;
-    }
-
-    params['salary_by'] = salaryBy ?? "";
-
-    if (!Utils.isEmpty(amount)) {
-      params["amount"] = amount!;
-    }
-
-    if(!Utils.isEmpty(repeatDateStr)) {
-      params["select"] = repeatDateStr!;
-    }
-
-    params['description'] = description ?? "";
-    params['employment_type'] = employmentType ?? "";
-    params['event_name'] = eventName ?? "";
-    params['event_type'] = eventType ?? "";
-    params['passengers'] = passengers ?? "";
-    params['est_revenue'] = estRevenue ?? "";
-    params['position'] = position ?? "";
-    params['est_cost'] = estCost ?? "";
-
-    //可能是file 也可能是  url
-    Map<String, String> filePathParams = {};
-    // 判断 http 或者 https 开头
-    if(Utils.isNotEmpty(attUrl)){
-      if(attUrl!.startsWith("http") || attUrl!.startsWith("https")){
-        params['att_url'] = attUrl;
-      }else {
-        filePathParams['att_url'] = attUrl;
-      }
-    }
-
-    final result = await httpProvider.requestNetResult(
-      ApiConstants.apiLabourRequestReViewEditUK,
-      method: HttpMethod.POST,
-      params: params,
-      paths: filePathParams,
-      networkDebounce: true,
-      isShowLoadingDialog: true,
-      cancelToken: cancelToken,
-    );
-
-    //根据返回的结果,封装原始数据为Bean/Entity对象
-    if (result.isSuccess) {
-      //重新赋值data或list
-      return result.convert();
-    }
-    return result.convert();
-  }
-
   /// labourrequest -review 批量审核(批量同意/批量拒绝)
   Future<HttpResult> labourRequestReviewBatchSubmit(
       {

BIN=BIN
packages/cs_resources/assets/base_service/mark_active.webp


BIN=BIN
packages/cs_resources/assets/base_service/mark_inactive.webp


+ 1 - 0
packages/cs_resources/lib/constants/color_constants.dart

@@ -4,6 +4,7 @@ class ColorConstants {
   // 私有的构造函数,防止实例化
   ColorConstants._();
 
+  static const Color primaryAppColor = Color(0xff00AFFF);
   //颜色的常量值
   static const Color lightScaffoldBackgroundColor = Color(0xffF9F9F9); //整体背景颜色(Light)
   static const Color darkScaffoldBackgroundColor = Color(0xFF0F0F0F); //整体背景颜色(Dark)

+ 2 - 0
packages/cs_resources/lib/generated/assets.dart

@@ -21,6 +21,8 @@ class Assets {
   static const String baseServiceItemSelectedIcon = 'assets/base_service/item_selected_icon.webp';
   static const String baseServiceItemUnselectedGrayIcon = 'assets/base_service/item_unselected_gray_icon.webp';
   static const String baseServiceItemUnselectedIcon = 'assets/base_service/item_unselected_icon.webp';
+  static const String baseServiceMarkActive = 'assets/base_service/mark_active.webp';
+  static const String baseServiceMarkInactive = 'assets/base_service/mark_inactive.webp';
   static const String baseServicePageLoadError = 'assets/base_service/page_load_error.webp';
   static const String baseServicePageNoData = 'assets/base_service/page_no_data.webp';
   static const String baseServiceRatingSelected = 'assets/base_service/rating_selected.webp';

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

@@ -333,6 +333,7 @@ const Map<String, String> en_US = {
   'Expired': 'Expired',
   'Certificate': 'Certificate',
   'Vehicle': 'Vehicle',
+  'Challenge25': 'Challenge25',
   'Contact Name': 'Contact Name',
   'Malaysia': 'Malaysia',
   'Netherlands': 'Netherlands',

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

@@ -329,6 +329,7 @@ const Map<String, String> zh_CN = {
   'Expired': '已过期',
   'Certificate': '证书',
   'Vehicle': '交通工具',
+  'Challenge25': '挑战25条',
   'Contact Name': '联系人',
   'Malaysia': '马来西亚',
   'Netherlands': '荷兰',