6 Revīzijas 977e3d71bb ... 24b7688596

Autors SHA1 Ziņojums Datums
  glglove 24b7688596 uk 工作详情修改 员工详情修改等 1 nedēļu atpakaļ
  glglove ba4e24fe9f 员工详情证书显示修改 1 nedēļu atpakaļ
  glglove bd56ac7e75 revise list item 增加删除的逻辑 1 nedēļu atpakaļ
  glglove 4089e371f1 update 1 nedēļu atpakaļ
  glglove 348773f44e 优化一些反馈小需求点 1 nedēļu atpakaļ
  glglove 9c0ce0ef9d joblist 的详情页面修改 1 nedēļu atpakaļ
29 mainītis faili ar 2265 papildinājumiem un 147 dzēšanām
  1. 49 34
      packages/cpt_uk/lib/modules/job/job_applied/widget/applied_add_staff.dart
  2. 5 12
      packages/cpt_uk/lib/modules/job/job_applied_edit/job_applied_edit_controller.dart
  3. 2 1
      packages/cpt_uk/lib/modules/job/job_applied_edit/job_applied_edit_page.dart
  4. 25 0
      packages/cpt_uk/lib/modules/job/job_applied_revise_list/job_applied_revise_list_controller.dart
  5. 1 0
      packages/cpt_uk/lib/modules/job/job_applied_revise_list/job_applied_revise_list_page.dart
  6. 98 2
      packages/cpt_uk/lib/modules/job/job_applied_staff_detail/certification_dialog_widget.dart
  7. 68 0
      packages/cpt_uk/lib/modules/job/job_applied_staff_detail/staff_detail_widget.dart
  8. 210 3
      packages/cpt_uk/lib/modules/job/job_list_detail/job_list_detail_controller.dart
  9. 311 6
      packages/cpt_uk/lib/modules/job/job_list_detail/job_list_detail_page.dart
  10. 90 3
      packages/cpt_uk/lib/modules/job/job_list_detail/job_list_detail_state.dart
  11. 7 1
      packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_controller.dart
  12. 1 1
      packages/cpt_uk/lib/modules/job/labour_request_add/labour_request_add_state.dart
  13. 8 8
      packages/cpt_uk/lib/modules/job/labour_request_add/widget/lab_request_and_request_review_form.dart
  14. 1 1
      packages/cpt_uk/lib/modules/job/labour_request_add/widget/labour_request_interface.dart
  15. 41 29
      packages/cpt_uk/lib/modules/job/labour_request_preselected_list/widget/preselected_add_staff.dart
  16. 22 22
      packages/cpt_uk/lib/modules/job/template_add/template_add_page.dart
  17. 22 0
      packages/cpt_uk/lib/modules/job/template_list/item_template.dart
  18. 5 1
      packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_controller.dart
  19. 1 1
      packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_state.dart
  20. 3 0
      packages/cs_domain/lib/constants/api_constants.dart
  21. 282 0
      packages/cs_domain/lib/entity/response/uk_job_list_detail_entity.dart
  22. 17 15
      packages/cs_domain/lib/entity/response/uk_staff_detail_entity.dart
  23. 37 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  24. 889 0
      packages/cs_domain/lib/generated/json/uk_job_list_detail_entity.g.dart
  25. 18 4
      packages/cs_domain/lib/generated/json/uk_staff_detail_entity.g.dart
  26. 29 0
      packages/cs_domain/lib/repository/uk_job_repository.dart
  27. 13 3
      packages/cs_plugin_platform/lib/http/http_provider.dart
  28. 5 0
      packages/cs_resources/lib/local/language/en_US.dart
  29. 5 0
      packages/cs_resources/lib/local/language/zh_CN.dart

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

@@ -276,16 +276,17 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
                   key: Key("keyword"),
                   key: Key("keyword"),
                   value: controller.keyword,
                   value: controller.keyword,
                   searchBarHeight: 38,
                   searchBarHeight: 38,
-                  searchBarBgColor: Color(0xFF4DCFF6).withOpacity(0.2),
+                  // searchBarBgColor: Color(0xFF4DCFF6).withOpacity(0.2),
+                  searchBarBgColor: Colors.white,
                   searchBarBorderRadius: 15,
                   searchBarBorderRadius: 15,
-                  // searchBarBorder: Border.all(
-                  //   color: Color(0XFFC3C3C3), // 设置边框颜色为灰色
-                  //   width: 0.5, // 设置边框宽度
-                  // ),
+                  searchBarBorder: Border.all(
+                    color: Colors.black12.withOpacity(0.05), // 设置边框颜色为灰色
+                    width: 0.5, // 设置边框宽度
+                  ),
                   textHintColor: ColorConstants.textGrayAECAE5,
                   textHintColor: ColorConstants.textGrayAECAE5,
                   textColor: ColorConstants.black33,
                   textColor: ColorConstants.black33,
                   textFontSize: 12.0,
                   textFontSize: 12.0,
-                  showSearchIcon: false,
+                  showSearchIcon: true,
                   margin: EdgeInsets.only(right: 5),
                   margin: EdgeInsets.only(right: 5),
                   onSearch: (keyword) {
                   onSearch: (keyword) {
                     controller.searchKeywordInputSearch(keyword);
                     controller.searchKeywordInputSearch(keyword);
@@ -317,7 +318,8 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
                   },
                   },
                   text: "Reset".tr,
                   text: "Reset".tr,
                   textColor: ColorConstants.white,
                   textColor: ColorConstants.white,
-                  backgroundColor: hexToColor("#2BA9F9", opacity: 0.5),
+                  backgroundColor: hexToColor("#2BA9F9", opacity: 0.8),
+                  fontSize: 14,
                   radius: 20,
                   radius: 20,
                   minWidth: 60,
                   minWidth: 60,
                   minHeight: 35,
                   minHeight: 35,
@@ -345,11 +347,12 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
             child: Container(
             child: Container(
               padding: const EdgeInsets.only(left: 5, right: 5),
               padding: const EdgeInsets.only(left: 5, right: 5),
               margin: const EdgeInsets.only(top: 5),
               margin: const EdgeInsets.only(top: 5),
-              height: 40,
+              height: 38,
               decoration: BoxDecoration(
               decoration: BoxDecoration(
-                color:  Color(0xFF4DCFF6).withOpacity(0.2),
-                // border: Border.all(color: Colors.black12.withOpacity(0.05)),
-                borderRadius: const BorderRadius.all(Radius.circular(5)),
+                // color:  Color(0xFF4DCFF6).withOpacity(0.2),
+                color:  Colors.white,
+                border: Border.all(color: Colors.black12.withOpacity(0.05)),
+                borderRadius: const BorderRadius.all(Radius.circular(15)),
               ),
               ),
               child: Row(
               child: Row(
                 mainAxisSize: MainAxisSize.max,
                 mainAxisSize: MainAxisSize.max,
@@ -390,11 +393,11 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
             child: Container(
             child: Container(
               padding: const EdgeInsets.only(left: 5, right: 5),
               padding: const EdgeInsets.only(left: 5, right: 5),
               margin: const EdgeInsets.only(top: 5),
               margin: const EdgeInsets.only(top: 5),
-              height: 40,
+              height: 38,
               decoration: BoxDecoration(
               decoration: BoxDecoration(
-                color:  Color(0xFF4DCFF6).withOpacity(0.2),
-                // border: Border.all(color: Colors.black12.withOpacity(0.05)),
-                borderRadius: const BorderRadius.all(Radius.circular(5)),
+                color:  Colors.white,
+                border: Border.all(color: Colors.black12.withOpacity(0.05)),
+                borderRadius: const BorderRadius.all(Radius.circular(15)),
               ),
               ),
               child: Row(
               child: Row(
                 mainAxisSize: MainAxisSize.max,
                 mainAxisSize: MainAxisSize.max,
@@ -438,8 +441,9 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
               margin: const EdgeInsets.only(top: 5),
               margin: const EdgeInsets.only(top: 5),
               height: 38,
               height: 38,
               decoration: BoxDecoration(
               decoration: BoxDecoration(
-                color:  Color(0xFF4DCFF6).withOpacity(0.2),
-                // border: Border.all(color: Colors.black12.withOpacity(0.05)),
+                // color:  Color(0xFF4DCFF6).withOpacity(0.2),
+                color: Colors.white,
+                border: Border.all(color: Colors.black12.withOpacity(0.05)),
                 borderRadius: const BorderRadius.all(Radius.circular(15)),
                 borderRadius: const BorderRadius.all(Radius.circular(15)),
               ),
               ),
               child: Row(
               child: Row(
@@ -471,6 +475,7 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
     return Stack(
     return Stack(
       children: [
       children: [
         Column(
         Column(
+          mainAxisSize: MainAxisSize.max,
           children: [
           children: [
             //姓名
             //姓名
             Row(
             Row(
@@ -482,11 +487,13 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
                   marginRight: 3,
                   marginRight: 3,
                   isFontRegular: true,
                   isFontRegular: true,
                 ),
                 ),
-                MyTextView(
-                  item.name ?? "-",
-                  textColor: ColorConstants.black66,
-                  fontSize: 13,
-                  isFontRegular: true,
+                Expanded(
+                  child: MyTextView(
+                    item.name ?? "-",
+                    textColor: ColorConstants.black66,
+                    fontSize: 13,
+                    isFontRegular: true,
+                  ),
                 ),
                 ),
               ],
               ],
             ),
             ),
@@ -566,6 +573,7 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
             //   ],
             //   ],
             // ).marginOnly(top: 5),
             // ).marginOnly(top: 5),
             Row(
             Row(
+              mainAxisSize: MainAxisSize.max,
               children: [
               children: [
                 MyTextView(
                 MyTextView(
                   "CV".tr + ":",
                   "CV".tr + ":",
@@ -574,18 +582,25 @@ class _AppliedAddStaffState extends State<AppliedAddStaff> {
                   fontSize: 13,
                   fontSize: 13,
                   isFontRegular: true,
                   isFontRegular: true,
                 ),
                 ),
-                MyTextView(
-                  (item.resume ==null || item.resume!.isEmpty == true)? "-": 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(),
+                Expanded(
+                  child: Container(
+                    padding: const EdgeInsets.only(right: 5),
+                    child: MyTextView(
+                      (item.resume ==null || item.resume!.isEmpty == true)? "-": item.resume!,
+                      textColor: ColorConstants.black66,
+                      fontSize: 13,
+                      isFontRegular: true,
+                      maxLines: 1,
+                      isTextEllipsis: true,
+                      onClick: (){
+                        // 点击查看 打开webview 页面
+                        if(item.resume?.isNotEmpty == true && Utils.isNetworkUrl(item.resume!)){
+                          controller.handlerScanFile(item.resume!);
+                        }
+                      },
+                    ),
+                  ),
+                ),
               ],
               ],
             ).marginOnly(top: 5),
             ).marginOnly(top: 5),
 
 

+ 5 - 12
packages/cpt_uk/lib/modules/job/job_applied_edit/job_applied_edit_controller.dart

@@ -23,14 +23,6 @@ class JobAppliedEditController extends GetxController with DioCancelableMixin {
 
 
     if (result.isSuccess) {
     if (result.isSuccess) {
       state.appliedEditView = result.data;
       state.appliedEditView = result.data;
-      // 开始如果 state.appliedEditView?.workIn 为空时,则将 state.appliedEditView?.startTime 赋值给 state.appliedEditView?.workIn
-      if(Utils.isEmpty(state.appliedEditView?.workIn)){
-        state.appliedEditView?.workIn = state.appliedEditView?.startTime;
-      }
-      if(Utils.isEmpty(state.appliedEditView?.workOut)){
-        state.appliedEditView?.workOut = state.appliedEditView?.endTime;
-      }
-
 
 
       var addHourController = state.formData['add_hours']!['controller'];
       var addHourController = state.formData['add_hours']!['controller'];
       var totalRoomController = state.formData['total_room']!['controller'];
       var totalRoomController = state.formData['total_room']!['controller'];
@@ -116,9 +108,10 @@ class JobAppliedEditController extends GetxController with DioCancelableMixin {
   /// 选择时间
   /// 选择时间
   void pickWorkInTime() {
   void pickWorkInTime() {
     if (state.appliedEditView == null) return;
     if (state.appliedEditView == null) return;
-
+    DateTime? defaultSelectedDateTime = DateTimeUtils.getDateTime(state.appliedEditView!.startTime ?? "");
+    // Log.d("defaultSelectedDateTime  ${defaultSelectedDateTime}");
     DatePickerUtil.showCupertinoDatePicker(
     DatePickerUtil.showCupertinoDatePicker(
-      selectedDateTime: DateTimeUtils.getDateTime(state.appliedEditView!.workIn ?? ""),
+      selectedDateTime: defaultSelectedDateTime,
       mode: CupertinoDatePickerMode.dateAndTime,
       mode: CupertinoDatePickerMode.dateAndTime,
       onDateTimeChanged: (date) {
       onDateTimeChanged: (date) {
         state.appliedEditView!.workIn = DateTimeUtils.formatDate(date);
         state.appliedEditView!.workIn = DateTimeUtils.formatDate(date);
@@ -131,9 +124,9 @@ class JobAppliedEditController extends GetxController with DioCancelableMixin {
   /// 选择时间
   /// 选择时间
   void pickWorkOutTime() {
   void pickWorkOutTime() {
     if (state.appliedEditView == null) return;
     if (state.appliedEditView == null) return;
-
+    DateTime? defaultSelectedDateTime = DateTimeUtils.getDateTime(state.appliedEditView!.endTime ?? "");
     DatePickerUtil.showCupertinoDatePicker(
     DatePickerUtil.showCupertinoDatePicker(
-      selectedDateTime: DateTimeUtils.getDateTime(state.appliedEditView!.workOut ?? ""),
+      selectedDateTime: defaultSelectedDateTime,
       mode: CupertinoDatePickerMode.dateAndTime,
       mode: CupertinoDatePickerMode.dateAndTime,
       onDateTimeChanged: (date) {
       onDateTimeChanged: (date) {
         state.appliedEditView!.workOut = DateTimeUtils.formatDate(date);
         state.appliedEditView!.workOut = DateTimeUtils.formatDate(date);

+ 2 - 1
packages/cpt_uk/lib/modules/job/job_applied_edit/job_applied_edit_page.dart

@@ -302,7 +302,8 @@ class _JobAppliedEditState extends BaseState<UKJobAppliedEditPage, JobAppliedEdi
                           mainAxisAlignment: MainAxisAlignment.start,
                           mainAxisAlignment: MainAxisAlignment.start,
                           children: [
                           children: [
                             MyTextView(
                             MyTextView(
-                              Utils.isNotEmpty(state.appliedEditView?.workIn)? state.appliedEditView!.workIn! : (state.appliedEditView?.startTime ?? "-"),
+                              state.appliedEditView?.workIn?? '',
+                              // Utils.isNotEmpty(state.appliedEditView?.workIn)? state.appliedEditView!.workIn! : (state.appliedEditView?.startTime ?? "-"),
                               fontSize: 14,
                               fontSize: 14,
                               hint: "Work In".tr,
                               hint: "Work In".tr,
                               textHintColor: ColorConstants.textGrayAECAE5,
                               textHintColor: ColorConstants.textGrayAECAE5,

+ 25 - 0
packages/cpt_uk/lib/modules/job/job_applied_revise_list/job_applied_revise_list_controller.dart

@@ -236,6 +236,19 @@ class JobAppliedReviseListController extends GetxController with DioCancelableMi
         ));
         ));
   }
   }
 
 
+  /// 删除 操作
+  void doDeleteAction(int index) {
+    DialogEngine.show(
+      tag: 'deleteActionTag',
+        widget: AppDefaultDialog(
+          title: "Confirmation".tr,
+          message: "Are you sure you want to delete this revise?".tr,
+          confirmAction: () {
+            _requestDelete(index);
+          },
+        ));
+  }
+
   void _requestRecall(int index) async {
   void _requestRecall(int index) async {
     var result = await _ukjobRepository.reviseRecall(reviseId: state.datas[index].id!.toString(), cancelToken: cancelToken);
     var result = await _ukjobRepository.reviseRecall(reviseId: state.datas[index].id!.toString(), cancelToken: cancelToken);
 
 
@@ -248,6 +261,18 @@ class JobAppliedReviseListController extends GetxController with DioCancelableMi
     }
     }
   }
   }
 
 
+  void _requestDelete(int index) async {
+    var result = await _ukjobRepository.reviseDelete(reviseId: state.datas[index].id!.toString(), cancelToken: cancelToken);
+
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+      //赋值之后刷新
+      refreshController.callRefresh();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
   /// 去展示员工状态的审核流程页面
   /// 去展示员工状态的审核流程页面
   void gotoAppliedWorkflowPage(UkJobAppliedStaffListRows data) {
   void gotoAppliedWorkflowPage(UkJobAppliedStaffListRows data) {
     UKAppliedWorkflowPage.startInstance(data.appliedId.toString());
     UKAppliedWorkflowPage.startInstance(data.appliedId.toString());

+ 1 - 0
packages/cpt_uk/lib/modules/job/job_applied_revise_list/job_applied_revise_list_page.dart

@@ -127,6 +127,7 @@ class _JobAppliedState extends BaseState<UKJobAppliedRevisePage, JobAppliedRevis
                                 controller.doRecallAction(index);
                                 controller.doRecallAction(index);
                               },
                               },
                               onDeleteAction: () {
                               onDeleteAction: () {
+                                controller.doDeleteAction(index);
                               },
                               },
                             );
                             );
                           },
                           },

+ 98 - 2
packages/cpt_uk/lib/modules/job/job_applied_staff_detail/certification_dialog_widget.dart

@@ -13,6 +13,7 @@ import 'package:plugin_platform/engine/image/image_preview.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:shared/utils/date_time_utils.dart';
 import 'package:shared/utils/date_time_utils.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/util.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:cs_resources/constants/color_constants.dart';
 import 'package:cs_resources/constants/color_constants.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_load_image.dart';
@@ -133,6 +134,7 @@ class _certificationDialogState extends State<certificationDialog> {
                         ],
                         ],
                       ),
                       ),
                       SizedBox.fromSize(size: Size(0, 10)),
                       SizedBox.fromSize(size: Size(0, 10)),
+                      // status
                       Row(
                       Row(
                         children: [
                         children: [
                           MyTextView(
                           MyTextView(
@@ -146,13 +148,94 @@ class _certificationDialogState extends State<certificationDialog> {
                               widget.certificateItem.status.toString()??'-',
                               widget.certificateItem.status.toString()??'-',
                               fontSize: 15,
                               fontSize: 15,
                               isFontMedium: true,
                               isFontMedium: true,
-                              textColor: const Color(0xFF666666),
+                              // textColor: const Color(0xFF666666),
+                              textColor: _getStatusColor(widget.certificateItem.statusColor?? ''),
                               marginLeft: 20,
                               marginLeft: 20,
                             ),
                             ),
                           ),
                           ),
                         ],
                         ],
                       ),
                       ),
-                      SizedBox.fromSize(size: Size(0, 30)),
+                      // 过期时间
+                      Visibility(
+                        visible: Utils.isNotEmpty(widget.certificateItem.expiryDate)?true:false,
+                        child: Padding(
+                          padding: const EdgeInsets.only(top: 10,),
+                          child: Row(
+                            children: [
+                              MyTextView(
+                                "Expire Date".tr,
+                                fontSize: 15,
+                                isFontMedium: true,
+                                textColor: const Color(0xFF666666),
+                              ),
+                              Expanded(
+                                child: MyTextView(
+                                  widget.certificateItem.expiryDate?.toString()??'-',
+                                  fontSize: 15,
+                                  isFontMedium: true,
+                                  textColor: const Color(0xFF666666),
+                                  marginLeft: 20,
+                                ),
+                              ),
+                            ],
+                          ),
+                        ),
+                      ),
+                      // 签发时间
+                      Visibility(
+                        visible: Utils.isNotEmpty(widget.certificateItem.issueDate)?true:false,
+                        child: Padding(
+                          padding: const EdgeInsets.only(top: 10),
+                          child: Row(
+                            children: [
+                              MyTextView(
+                                "Issue Date".tr,
+                                fontSize: 15,
+                                isFontMedium: true,
+                                textColor: const Color(0xFF666666),
+                              ),
+                              Expanded(
+                                child: MyTextView(
+                                  widget.certificateItem.issueDate?.toString()??'-',
+                                  fontSize: 15,
+                                  isFontMedium: true,
+                                  textColor: const Color(0xFF666666),
+                                  marginLeft: 20,
+                                ),
+                              ),
+                            ],
+                          ),
+                        ),
+                      ),
+                      // reject reason
+                      Visibility(
+                        // statusCode 2 是 approved  statusCode 3 是 rejected
+                        visible: widget.certificateItem.statusCode == 3 ? true: false,
+                        child: Padding(
+                          padding: const EdgeInsets.only(top: 10),
+                          child: Row(
+                            children: [
+                              SizedBox.fromSize(size: Size(0, 10)),
+                              MyTextView(
+                                "Reject Reason".tr,
+                                fontSize: 15,
+                                isFontMedium: true,
+                                textColor: const Color(0xFF666666),
+                              ),
+                              Expanded(
+                                child: MyTextView(
+                                  widget.certificateItem.rejectReason?.toString()??'-',
+                                  fontSize: 15,
+                                  isFontMedium: true,
+                                  textColor: const Color(0xFF666666),
+                                  marginLeft: 20,
+                                ),
+                              ),
+                            ],
+                          ),
+                        ),
+                      ),
+                      SizedBox.fromSize(size: Size(0, 30))
                     ],
                     ],
                   ),
                   ),
                 ],
                 ],
@@ -173,6 +256,19 @@ class _certificationDialogState extends State<certificationDialog> {
     ).constrained(width: 285);
     ).constrained(width: 285);
   }
   }
 
 
+  Color _getStatusColor(String statusColor) {
+    switch (statusColor) {
+      case 'springgreen':
+        return Color(0xFF0AC074);
+      case 'red':
+        return Color(0xFFFF6262);
+      case 'dodgerblue':
+        return Colors.blue;
+      default:
+        return Color(0xFFEA9F0D);
+    }
+  }
+
   //取消弹框
   //取消弹框
   void onCancel() async {
   void onCancel() async {
     SmartDialog.dismiss();
     SmartDialog.dismiss();

+ 68 - 0
packages/cpt_uk/lib/modules/job/job_applied_staff_detail/staff_detail_widget.dart

@@ -112,6 +112,26 @@ class StaffDetailWidget extends StatelessWidget {
             ],
             ],
           ).marginOnly(left: 22, right: 22, top: 10),
           ).marginOnly(left: 22, right: 22, top: 10),
 
 
+          //challenge 25
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            children: [
+              MyTextView(
+                "Challenge 25:",
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                isFontRegular: true,
+              ),
+              MyTextView(
+                detail?.challenge25!.toString() == '1'? "Confirmed" : "Pending",
+                marginLeft: 5,
+                textColor: detail?.challenge25!.toString() == '1'? Color(0xFF0AC074): Colors.blue,
+                fontSize: 14,
+                isFontMedium: true,
+              ).expanded(),
+            ],
+          ).marginOnly(left: 22, right: 22, top: 10),
+
           // //性别
           // //性别
           // Row(
           // Row(
           //   mainAxisSize: MainAxisSize.max,
           //   mainAxisSize: MainAxisSize.max,
@@ -283,6 +303,10 @@ class StaffDetailWidget extends StatelessWidget {
                 UkStaffDetailCertificates certificate = entry.value;
                 UkStaffDetailCertificates certificate = entry.value;
                 return _buildCertificateWidget(context, certificate, index);
                 return _buildCertificateWidget(context, certificate, index);
               }).toList() ?? []),
               }).toList() ?? []),
+
+              // 上面循环的 detail.certificates 是用户上传的的所有证书 但是可能不是所有类型的证书(detail.certtypeList)
+              if (detail?.certtypeList != null && detail!.certtypeList!.isNotEmpty)
+                ..._buildRemainCertificatesWidgetList(context, detail!),
             ],
             ],
           ),
           ),
 
 
@@ -332,6 +356,8 @@ class StaffDetailWidget extends StatelessWidget {
               fontSize: 14,
               fontSize: 14,
               isFontRegular: true,
               isFontRegular: true,
               marginLeft: 5,
               marginLeft: 5,
+              textDecoration: TextDecoration.underline,
+              decorationColor: ColorConstants.textGreen0AC074,
               onClick: (){
               onClick: (){
                 onScanCertificateAction?.call(context, certificateItem);
                 onScanCertificateAction?.call(context, certificateItem);
               },
               },
@@ -341,6 +367,48 @@ class StaffDetailWidget extends StatelessWidget {
     ).marginOnly(left: 22, right: 22,top: 10);
     ).marginOnly(left: 22, right: 22,top: 10);
   }
   }
 
 
+  Widget _buildOtherWidgetItem(BuildContext context,String certificateTypeName, int index ){
+    return Row(
+        children: [
+          Flexible(
+            flex: 2,
+            child: MyTextView(
+              '${certificateTypeName!}:',
+              textColor: ColorConstants.textGrayAECAE5,
+              fontSize: 14,
+              isFontRegular: true,
+            ),
+          ),
+          Flexible(
+            flex: 1,
+            child: MyTextView(
+              "\/",
+              textColor: ColorConstants.textGrayAECAE5,
+              fontSize: 14,
+              isFontRegular: true,
+              marginLeft: 5,
+              onClick: (){
+              },
+            ),
+          ),
+        ]
+    ).marginOnly(left: 22, right: 22,top: 10);
+  }
+
+
+  List<Widget> _buildRemainCertificatesWidgetList(BuildContext context,UkStaffDetailEntity detail){
+    List<String> allCertTypesList = detail?.certtypeList ?? [];
+    List<String> curCerTypesList = detail?.certificates?.map((e) => e.type!).toList() ?? [];
+    List<String> remainCertTypesList = allCertTypesList.where((element) => !curCerTypesList.contains(element)).toList()?? [];
+    return [
+      ...(remainCertTypesList?.asMap().entries.map((entry) {
+        int index = entry.key;
+        String certificateTypeName = entry.value;
+        return _buildOtherWidgetItem(context, certificateTypeName, index);
+      }).toList() ?? []),
+    ];
+  }
+
   Color _getStatusColor(String statusColor) {
   Color _getStatusColor(String statusColor) {
     switch (statusColor) {
     switch (statusColor) {
       case 'springgreen':
       case 'springgreen':

+ 210 - 3
packages/cpt_uk/lib/modules/job/job_list_detail/job_list_detail_controller.dart

@@ -1,17 +1,22 @@
+import 'dart:io';
+
 import 'package:domain/repository/job_repository.dart';
 import 'package:domain/repository/job_repository.dart';
+import 'package:domain/repository/uk_job_repository.dart';
 import 'package:get/get.dart';
 import 'package:get/get.dart';
 import 'package:plugin_platform/engine/toast/toast_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/dio/dio_cancelable_mixin.dart';
+import 'package:shared/utils/log_utils.dart';
+import '../labour_request_add/widget/uploadFileField.dart';
 import 'job_list_detail_state.dart';
 import 'job_list_detail_state.dart';
 
 
 class JobListDetailController extends GetxController with DioCancelableMixin {
 class JobListDetailController extends GetxController with DioCancelableMixin {
-  final JobRepository _jobRepository = Get.find();
+  final UKJobRepository _ukJobRepository = Get.find();
   final JobListDetailState state = JobListDetailState();
   final JobListDetailState state = JobListDetailState();
 
 
 
 
   /// 获取工作详情数据
   /// 获取工作详情数据
   void fetchJobListDetail() async {
   void fetchJobListDetail() async {
-    var result = await _jobRepository.fetchJobListDetail(
+    var result = await _ukJobRepository.fetchJobListDetail(
       state.jobId,
       state.jobId,
       cancelToken: cancelToken,
       cancelToken: cancelToken,
     );
     );
@@ -25,7 +30,76 @@ class JobListDetailController extends GetxController with DioCancelableMixin {
       var needNumController = state.formData['no_of_staff']!['controller'];
       var needNumController = state.formData['no_of_staff']!['controller'];
       needNumController.text = state.noStaff;
       needNumController.text = state.noStaff;
       state.selectedJobTitle = state.jobListDetail?.jobTitle;
       state.selectedJobTitle = state.jobListDetail?.jobTitle;
-      state.selectedDepartmentId = state.jobListDetail?.departmentId;
+      state.selectedDepartmentId = state.jobListDetail?.departmentId.toString();
+
+      state.client = state.jobListDetail?.row?.client?.toString();
+      state.hourRate = state.jobListDetail?.row?.jobHourRate.toString();
+      var hourRateController = state.formData['hour_rate']!['controller'];
+      hourRateController.text = state.hourRate;
+
+      state.contact = state.jobListDetail?.row?.jobContactName;
+      var contactController = state.formData['contact']!['controller'];
+      contactController.text = state.contact;
+
+      state.contactNo = state.jobListDetail?.row?.jobContactNo?.toString();
+      var contactNoController = state.formData['contact_no']!['controller'];
+      contactNoController.text = state.contactNo;
+
+      state.selectedHideId = state.jobListDetail?.row?.hide?.toString();
+      state.hideOptionsList = [
+        commonSelectOptions()
+          ..value = 1
+          ..txt = "Yes"
+          ..checked = state.selectedHideId == "1" ? "checked" : "",
+        commonSelectOptions()
+          ..value = 0
+          ..txt = "No"
+          ..checked = state.selectedHideId == "0" ? "checked" : "",
+      ];
+
+      state.certificateOptionsList = state.jobListDetail?.certificateList ?? [];
+      state.challenge25OptionsList = state.jobListDetail?.challenge25List ?? [];
+      state.vehicleOptionsList = state.jobListDetail?.vehicleList ?? [];
+
+      state.selectedChallenge25Id = state.jobListDetail?.row?.challenge25?.toString();
+
+
+      state.videoText = state.jobListDetail?.row?.videoText?? '';
+      var vidoeTextController = state.formData['video_text']!['controller'];
+      vidoeTextController.text = state.videoText??'';
+
+      state.videoCover = state.jobListDetail?.row?.videoCover?? '';
+      state.video = state.jobListDetail?.row?.video?? '';
+      state.otherImage = state.jobListDetail?.row?.otherImage?? '';
+      state.otherDocument = state.jobListDetail?.row?.otherDocument?? '';
+      // 修改 state.uploadFieldList 对应的 fieldPathValueList
+      state.uploadFieldList.forEach((element) {
+        if (element.fieldKey == 'video_cover_key') {
+          element.fieldPathValueList?.clear();
+          element.fieldPathValueList?.add(state.videoCover ?? '');
+          Log.d("video_cover 初始值  ${element.fieldPathValueList}");
+        }
+        if (element.fieldKey == 'video_video_key') {
+          element.fieldPathValueList?.clear();
+          element.fieldPathValueList?.add(state.video ?? '');
+        }
+        if (element.fieldKey == 'video_image_key') {
+          element.fieldPathValueList?.clear();
+          element.fieldPathValueList?.add(state.otherImage ?? '');
+        }
+        if (element.fieldKey == 'video_document_key') {
+          element.fieldPathValueList?.clear();
+          element.fieldPathValueList?.add(state.otherDocument ?? '');
+        }
+      });
+
+      state.note = state.jobListDetail?.row?.jobNote?.toString()?? '';
+      var noteController = state.formData['note']!['controller'];
+      noteController.text = state.note;
+
+      state.requirements = state.jobListDetail?.row?.jobRequirements?.toString() ?? '';
+      var requirementsController = state.formData['requirements']!['controller'];
+      requirementsController.text = state.requirements;
 
 
       update();
       update();
     } else {
     } else {
@@ -36,6 +110,139 @@ class JobListDetailController extends GetxController with DioCancelableMixin {
   @override
   @override
   void onReady() {
   void onReady() {
     super.onReady();
     super.onReady();
+    state.uploadFieldList = [
+      FileFieldItem(
+        fieldKey: 'video_cover_key',
+        fieldLabel: 'Cover',
+        fieldPathValueList: [""],
+        fieldPlaceholder: "Cover".tr,
+        maxSize: '10MB',
+        allowedFileTypes: ['jpg', 'png', 'jpeg'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx'
+        multiple: false,
+        preview: false,
+        canUpload: false,
+        download: false, // 启用下载功能
+        disabled: true,
+        onFilesSelected: (List<File> files) {
+          print("选中的文件: ${files}");
+          // print("选中的文件: ${files.length}个");
+          if(files.length>0){
+            state.videoCover = files[0].path;
+            update();
+          }
+        },
+        onFileRemoved: (file) {
+          print("文件已移除: ${file.path}");
+        },
+        onFilePreview: (file) {
+          // 自定义预览逻辑
+          print("预览文件: ${file.path}");
+        },
+        onFileDownload: (file) {
+          // 自定义下载逻辑
+          print("下载文件: ${file.path}");
+        },
+      ),
+      FileFieldItem(
+        fieldKey: 'video_video_key',
+        fieldLabel: 'Video',
+        fieldPathValueList: [""],
+        fieldPlaceholder: "Video".tr,
+        maxSize: '20MB',
+        allowedFileTypes: ['mp4'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx'
+        multiple: false,
+        preview: false,
+        canUpload: false,
+        download: false, // 启用下载功能
+        disabled: true,
+        onFilesSelected: (List<File> files) {
+          print("选中的文件: ${files}");
+          if(files.length>0){
+            state.video = files[0].path;
+            update();
+          }
+        },
+        onFileRemoved: (file) {
+          print("文件已移除: ${file.path}");
+        },
+        onFilePreview: (file) {
+          // 自定义预览逻辑
+          print("预览文件: ${file.path}");
+        },
+        onFileDownload: (file) {
+          // 自定义下载逻辑
+          print("下载文件: ${file.path}");
+          // 可以在这里集成实际的下载实现
+          // 例如使用 dio 下载文件到指定目录
+        },
+      ),
+      FileFieldItem(
+        fieldKey: 'video_image_key',
+        fieldLabel: 'Image',
+        fieldPathValueList: [""],
+        fieldPlaceholder: "Image".tr,
+        maxSize: '10MB',
+        allowedFileTypes: ['jpg', 'png', 'jpeg'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx'
+        multiple: false,
+        preview: false,
+        canUpload: false,
+        download: false, // 启用下载功能
+        disabled: true,
+        onFilesSelected: (List<File> files) {
+          print("选中的文件: ${files}");
+          if(files.length>0){
+            state.otherImage = files[0].path;
+            update();
+          }
+        },
+        onFileRemoved: (file) {
+          print("文件已移除: ${file.path}");
+        },
+        onFilePreview: (file) {
+          // 自定义预览逻辑
+          print("预览文件: ${file.path}");
+        },
+        onFileDownload: (file) {
+          // 自定义下载逻辑
+          print("下载文件: ${file.path}");
+          // 可以在这里集成实际的下载实现
+          // 例如使用 dio 下载文件到指定目录
+        },
+      ),
+      FileFieldItem(
+        fieldKey: 'video_document_key',
+        fieldLabel: 'Document',
+        fieldPathValueList: [""],
+        fieldPlaceholder: "Document".tr,
+        maxSize: '10MB',
+        allowedFileTypes: ['pdf','docx', 'doc'],  // 'mp4', 'jpg', 'png', 'jpeg', 'pdf', 'docx','doc'
+        multiple: false,
+        preview: false,
+        canUpload: false,
+        download: false, // 启用下载功能
+        disabled: true,
+        onFilesSelected: (List<File> files) {
+          print("选中的文件: ${files}");
+          if(files.length>0){
+            state.otherDocument = files[0].path;
+            update();
+          }
+        },
+        onFileRemoved: (file) {
+          print("文件已移除: ${file.path}");
+        },
+        onFilePreview: (file) {
+          // 自定义预览逻辑
+          print("预览文件: ${file.path}");
+        },
+        onFileDownload: (file) {
+          // 自定义下载逻辑
+          print("下载文件: ${file.path}");
+          // 可以在这里集成实际的下载实现
+          // 例如使用 dio 下载文件到指定目录
+        },
+      ),
+    ];
     fetchJobListDetail();
     fetchJobListDetail();
   }
   }
 
 

+ 311 - 6
packages/cpt_uk/lib/modules/job/job_list_detail/job_list_detail_page.dart

@@ -1,6 +1,7 @@
 import 'package:cs_resources/constants/color_constants.dart';
 import 'package:cs_resources/constants/color_constants.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:cs_resources/generated/assets.dart';
 import 'package:domain/entity/response/job_list_detail_entity.dart';
 import 'package:domain/entity/response/job_list_detail_entity.dart';
+import 'package:domain/entity/response/uk_job_list_detail_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:flutter/services.dart';
@@ -10,14 +11,19 @@ import 'package:plugin_basic/base/base_state.dart';
 import 'package:plugin_basic/base/base_stateful_page.dart';
 import 'package:plugin_basic/base/base_stateful_page.dart';
 import 'package:plugin_basic/utils/ext_get_nav.dart';
 import 'package:plugin_basic/utils/ext_get_nav.dart';
 import 'package:router/path/router_path.dart';
 import 'package:router/path/router_path.dart';
+import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/screen_util.dart';
 import 'package:shared/utils/screen_util.dart';
+import 'package:shared/utils/util.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_appbar.dart';
 import 'package:widgets/my_text_view.dart';
 import 'package:widgets/my_text_view.dart';
 import 'package:widgets/no_shadow_scroll_behavior.dart';
 import 'package:widgets/no_shadow_scroll_behavior.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/form_require_text.dart';
 import 'package:widgets/shatter/round_my_text_field.dart';
 import 'package:widgets/shatter/round_my_text_field.dart';
 
 
+import '../labour_request_add/widget/uploadFileField.dart';
 import 'job_list_detail_controller.dart';
 import 'job_list_detail_controller.dart';
 import 'job_list_detail_state.dart';
 import 'job_list_detail_state.dart';
 
 
@@ -55,7 +61,7 @@ class _JobListDetailState extends BaseState<UKJobListDetailPage, JobListDetailCo
         extendBodyBehindAppBar: true,
         extendBodyBehindAppBar: true,
         appBar: MyAppBar.appBar(context, "Job Detail".tr),
         appBar: MyAppBar.appBar(context, "Job Detail".tr),
         body: SafeArea(
         body: SafeArea(
-        bottom: MediaQuery.of(context).padding.bottom > 38,
+          bottom: MediaQuery.of(context).padding.bottom > 38,
           top: false,
           top: false,
           child: Container(
           child: Container(
             width: double.infinity,
             width: double.infinity,
@@ -85,7 +91,6 @@ class _JobListDetailState extends BaseState<UKJobListDetailPage, JobListDetailCo
                       FormRequireText(
                       FormRequireText(
                         text: "Job Title".tr,
                         text: "Job Title".tr,
                       ).marginOnly(top: 15),
                       ).marginOnly(top: 15),
-
                       //工作标题
                       //工作标题
                       Container(
                       Container(
                         padding: EdgeInsets.only(left: 16, right: 10),
                         padding: EdgeInsets.only(left: 16, right: 10),
@@ -110,6 +115,34 @@ class _JobListDetailState extends BaseState<UKJobListDetailPage, JobListDetailCo
                         ),
                         ),
                       ),
                       ),
 
 
+                      //行业名称
+                      FormRequireText(
+                        text: "Client Name".tr,
+                      ).marginOnly(top: 15),
+                      //行业名称
+                      Container(
+                        padding: EdgeInsets.only(left: 16, right: 10),
+                        margin: EdgeInsets.only(top: 10),
+                        height: 45,
+                        decoration: BoxDecoration(
+                          color: Color(0xFF4DCFF6).withOpacity(0.5),
+                          borderRadius: const BorderRadius.all(Radius.circular(5)),
+                        ),
+                        child: Row(
+                          mainAxisSize: MainAxisSize.max,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          mainAxisAlignment: MainAxisAlignment.start,
+                          children: [
+                            MyTextView(
+                              Utils.isEmpty(state.client)? "-" : state.client??"-",
+                              fontSize: 14,
+                              isFontMedium: true,
+                              textColor: ColorConstants.white,
+                            ).expanded(),
+                          ],
+                        ),
+                      ),
+
                       //开始时间
                       //开始时间
                       FormRequireText(
                       FormRequireText(
                         text: "Start Time".tr,
                         text: "Start Time".tr,
@@ -167,7 +200,6 @@ class _JobListDetailState extends BaseState<UKJobListDetailPage, JobListDetailCo
                           ],
                           ],
                         ),
                         ),
                       ),
                       ),
-
                       //工作选择部门
                       //工作选择部门
                       FormRequireText(
                       FormRequireText(
                         text: "Outlet".tr,
                         text: "Outlet".tr,
@@ -192,7 +224,7 @@ class _JobListDetailState extends BaseState<UKJobListDetailPage, JobListDetailCo
                                   ? ""
                                   ? ""
                                   : state.jobListDetail!.departmentList?.firstWhere((element) {
                                   : state.jobListDetail!.departmentList?.firstWhere((element) {
                                         return element.value.toString() == state.selectedDepartmentId!;
                                         return element.value.toString() == state.selectedDepartmentId!;
-                                      }, orElse: () => JobListDetailDepartmentList()).txt ?? "",
+                                      }, orElse: () => UkJobListDetailDepartmentList()).txt ?? "",
                               fontSize: 14,
                               fontSize: 14,
                               hint: "Choose Outlet".tr,
                               hint: "Choose Outlet".tr,
                               textHintColor: ColorConstants.textGrayAECAE5,
                               textHintColor: ColorConstants.textGrayAECAE5,
@@ -203,11 +235,33 @@ class _JobListDetailState extends BaseState<UKJobListDetailPage, JobListDetailCo
                         ),
                         ),
                       ),
                       ),
 
 
+                      // Hour Rate
+                      FormRequireText(
+                        text: "Hour Rate".tr,
+                        isRequired: false,
+                      ).marginOnly(top: 15),
+                      CustomTextField(
+                        formKey: "hour_rate",
+                        marginLeft: 0,
+                        marginRight: 0,
+                        paddingTop: 0,
+                        paddingBottom: 0,
+                        height: 45,
+                        fillBackgroundColor: const Color(0xFF4DCFF6).withOpacity(0.5),
+                        enabled: false,
+                        textInputType: TextInputType.number,
+                        formData: state.formData,
+                        textInputAction: TextInputAction.done,
+                        marginTop: 10,
+                        onSubmit: (key, value) {
+                          FocusScope.of(context).unfocus();
+                        },
+                      ),
+
                       //需要的人数
                       //需要的人数
                       FormRequireText(
                       FormRequireText(
                         text: "No. of Staff".tr,
                         text: "No. of Staff".tr,
                       ).marginOnly(top: 15),
                       ).marginOnly(top: 15),
-
                       //输入框(只允许输入数字)
                       //输入框(只允许输入数字)
                       CustomTextField(
                       CustomTextField(
                         formKey: "no_of_staff",
                         formKey: "no_of_staff",
@@ -222,13 +276,193 @@ class _JobListDetailState extends BaseState<UKJobListDetailPage, JobListDetailCo
                         textInputType: TextInputType.number,
                         textInputType: TextInputType.number,
                         formData: state.formData,
                         formData: state.formData,
                         textInputAction: TextInputAction.done,
                         textInputAction: TextInputAction.done,
+                        marginTop: 10,
+                        onSubmit: (key, value) {
+                          FocusScope.of(context).unfocus();
+                        },
+                      ),
+                      // contact
+                      FormRequireText(
+                        text: "Contact".tr,
+                        isRequired: false,
+                      ).marginOnly(top: 15),
+                      CustomTextField(
+                        formKey: "contact",
+                        marginLeft: 0,
+                        marginRight: 0,
+                        paddingTop: 0,
+                        paddingBottom: 0,
+                        height: 45,
+                        fillBackgroundColor: const Color(0xFF4DCFF6).withOpacity(0.5),
+                        enabled: false,
+                        textInputType: TextInputType.text,
+                        formData: state.formData,
+                        textInputAction: TextInputAction.done,
+                        marginTop: 10,
+                        onSubmit: (key, value) {
+                          FocusScope.of(context).unfocus();
+                        },
+                      ),
+                      // contact no
+                      FormRequireText(
+                        text: "Contact No".tr,
+                        isRequired: false,
+                      ).marginOnly(top: 15),
+                      CustomTextField(
+                        formKey: "contact_no",
+                        marginLeft: 0,
+                        marginRight: 0,
+                        paddingTop: 0,
+                        paddingBottom: 0,
+                        height: 45,
+                        fillBackgroundColor: const Color(0xFF4DCFF6).withOpacity(0.5),
+                        enabled: false,
+                        textInputType: TextInputType.text,
+                        formData: state.formData,
+                        textInputAction: TextInputAction.done,
+                        marginTop: 10,
                         onSubmit: (key, value) {
                         onSubmit: (key, value) {
                           FocusScope.of(context).unfocus();
                           FocusScope.of(context).unfocus();
                         },
                         },
+                      ),
+
+                      // challenge25
+                      MyTextView(
+                        "Hide".tr,
+                        textColor: Colors.white,
+                        fontSize: 14,
+                        isFontRegular: true,
+                        marginTop: 15,
+                      ),
+
+                      // Hide
+                      Visibility(
+                        visible: state.hideOptionsList?.isNotEmpty == true,
+                        child: CustomRadioCheck(
+                          options: state.hideOptionsList?.map((e) => e.txt!).toList() ?? [],
+                          onOptionSelected: (index, text) {
+                            state.selectedHideId = state.hideOptionsList![index].value?.toString()??'';
+                          },
+                          selectedPosition: state.hideOptionsList?.indexWhere((e) => e.checked == "checked") ?? -1,
+                        ).marginOnly(left: 0, right: 15, top: 10),
+                      ),
+
+
+                      // 证书
+                      FormRequireText(
+                        text: "Certificate".tr,
+                        isRequired: false,
+                      ).marginOnly(top: 15),
+                      Visibility(
+                        visible: state.certificateOptionsList?.isNotEmpty == true,
+                        child: CustomCheckBox(
+                          options: state.certificateOptionsList.map<String>((e) => e.txt!).toList() ?? [],
+                          onOptionsSelected: (selectedIndexList) {
+                            // 转换选中的索引为对应的 value
+                            state.selectedCertificateList = selectedIndexList
+                                .map((index) {
+                              return state.certificateOptionsList?[index].value?.toString(); // 获取对应的 value
+                            })
+                                .whereType<String>()
+                                .toList();
+                          },
+                          selectedOptions: state.certificateOptionsList?.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.challenge25OptionsList?.isNotEmpty == true,
+                        child: CustomRadioCheck(
+                          options: state.challenge25OptionsList?.map((e) => e.txt!).toList() ?? [],
+                          onOptionSelected: (index, text) {
+                            state.selectedChallenge25Id = state.challenge25OptionsList![index].value?.toString()??'';
+                          },
+                          selectedPosition: state.challenge25OptionsList?.indexWhere((e) => e.checked == "checked") ?? -1,
+                        ).marginOnly(left: 0, right: 15, top: 10),
+                      ),
+
+                      // vehicle
+                      FormRequireText(
+                        text: "Vehicle".tr,
+                        isRequired: false,
+                      ).marginOnly(top: 15),
+                      Visibility(
+                        visible: state.vehicleOptionsList?.isNotEmpty == true,
+                        child: CustomCheckBox(
+                          options: state.vehicleOptionsList.map<String>((e) => e.txt!).toList() ?? [],
+                          onOptionsSelected: (selectedIndexList) {
+                            // 转换选中的索引为对应的 value
+                            state.selectedVehicleList = selectedIndexList
+                                .map((index) {
+                              return state.vehicleOptionsList?[index].value?.toString(); // 获取对应的 value
+                            })
+                                .whereType<String>()
+                                .toList();
+                          },
+                          selectedOptions: state.vehicleOptionsList?.where((e) => e.checked == "checked").map((e) => e.txt!).toList() ?? [],
+                        ).marginOnly(left: 0, right: 15, top: 10),
+                      ),
+
+                      // 视频部分
+                      _buildVideoSectionWidget(context, controller),
+
+                      // note
+                      FormRequireText(
+                        text: "Note".tr,
+                        isRequired: false,
+                      ).marginOnly(top: 15),
+                      CustomTextField(
+                        formKey: "note",
+                        marginLeft: 0,
+                        marginRight: 0,
+                        paddingTop: 0,
+                        paddingBottom: 0,
+                        height: 45,
+                        fillBackgroundColor: const Color(0xFF4DCFF6).withOpacity(0.5),
+                        enabled: false,
+                        textInputType: TextInputType.text,
+                        formData: state.formData,
+                        textInputAction: TextInputAction.done,
                         marginTop: 10,
                         marginTop: 10,
+                        onSubmit: (key, value) {
+                          FocusScope.of(context).unfocus();
+                        },
+                      ),
+
+                      // requirements
+                      FormRequireText(
+                        text: "Requirements".tr,
+                        isRequired: false,
+                      ).marginOnly(top: 15),
+                      CustomTextField(
+                        formKey: "requirements",
+                        marginLeft: 0,
+                        marginRight: 0,
+                        paddingTop: 0,
+                        paddingBottom: 0,
+                        height: 60,
+                        fillBackgroundColor: const Color(0xFF4DCFF6).withOpacity(0.5),
+                        enabled: false,
+                        textInputType: TextInputType.text,
+                        formData: state.formData,
+                        textInputAction: TextInputAction.done,
+                        marginTop: 10,
+                        onSubmit: (key, value) {
+                          FocusScope.of(context).unfocus();
+                        },
                       ),
                       ),
                     ],
                     ],
-                  ).paddingOnly(left: 15, right: 15),
+                  ).paddingOnly(left: 15, right: 15, bottom: 30),
                 ),
                 ),
               ),
               ),
             ),
             ),
@@ -237,4 +471,75 @@ class _JobListDetailState extends BaseState<UKJobListDetailPage, JobListDetailCo
       );
       );
     });
     });
   }
   }
+
+
+  Widget _buildVideoSectionWidget(BuildContext context, JobListDetailController controller) {
+    final state = controller.state;
+    String videoTips = state.videoTips;
+    List<FileFieldItem> uploadFieldList = state.uploadFieldList;
+    return Column(
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          MyTextView(
+            "Video".tr,
+            fontSize: 15,
+            isFontRegular: true,
+            textColor: Colors.white,
+            marginTop: 15,
+          ),
+          MyTextView(
+            "${videoTips}",
+            fontSize: 12,
+            isFontRegular: true,
+            textColor: Colors.white,
+            marginTop: 5,
+          ),
+
+          // video Text
+          Container(
+            child: Column(
+              mainAxisSize: MainAxisSize.max,
+              crossAxisAlignment: CrossAxisAlignment.start,
+              children: [
+                MyTextView(
+                  "Text".tr,
+                  fontSize: 15,
+                  isFontRegular: true,
+                  textColor: Colors.white,
+                ),
+
+                CustomTextField(
+                  formKey: "video_text",
+                  marginLeft: 0,
+                  marginRight: 0,
+                  paddingTop: 0,
+                  paddingBottom: 0,
+                  marginTop: 10,
+                  height: 45,
+                  fillBackgroundColor: const Color(0xFF4DCFF6).withOpacity(0.5),
+                  enabled: false,
+                  textInputType: TextInputType.text,
+                  formData: state.formData,
+                  textInputAction: TextInputAction.done,
+                  onSubmit: (key, value) {
+                    FocusScope.of(context).unfocus();
+                  },
+                ),
+              ],
+            ),
+          ),
+
+          for(int i =0; i< uploadFieldList.length; i++)
+            // video cover
+            _buildUploadFileWidget(context, controller, uploadFieldList[i], i)
+        ]
+    );
+  }
+
+  // 上传文件widget
+  Widget _buildUploadFileWidget(BuildContext context, JobListDetailController controller, FileFieldItem fileField, int index){
+    return UploadFileField(
+      fileField: fileField,
+    );
+  }
 }
 }

+ 90 - 3
packages/cpt_uk/lib/modules/job/job_list_detail/job_list_detail_state.dart

@@ -1,30 +1,117 @@
-import 'package:domain/entity/response/job_list_detail_entity.dart';
+import 'dart:io';
+
+import 'package:domain/entity/response/uk_job_list_detail_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:plugin_basic/basic_export.dart';
 
 
+import '../labour_request_add/widget/uploadFileField.dart';
+
+class commonSelectOptions {
+  int? value;
+  String? txt;
+  String? checked;
+}
+
 class JobListDetailState {
 class JobListDetailState {
 
 
   String? jobId;  //编辑和详情需要用到ID
   String? jobId;  //编辑和详情需要用到ID
 
 
   //页面对应的详情数据
   //页面对应的详情数据
-  JobListDetailEntity? jobListDetail;
+  UkJobListDetailEntity? jobListDetail;
 
 
   //页面对应的选择的条件
   //页面对应的选择的条件
   String? selectedJobTitle;
   String? selectedJobTitle;
+  String? client;
   String? selectedStartTime;
   String? selectedStartTime;
   String? selectedEndTime;
   String? selectedEndTime;
   String? selectedDepartmentId;
   String? selectedDepartmentId;
   String? noStaff;  //成员数量
   String? noStaff;  //成员数量
 
 
+  String? hourRate;
+  String? contact;
+  String? contactNo;
+
+
+
+  List<commonSelectOptions>? hideOptionsList = []; // hide 选项
+  String? selectedHideId; //
+
+  List<UkJobListDetailCertificateList> certificateOptionsList = []; // 证书选项
+  List<String> selectedCertificateList = []; // 选择的证书
+
+  List<UkJobListDetailChallenge25List>? challenge25OptionsList = []; // challenge25 选项
+  String? selectedChallenge25Id; // 选择的 challenge25
+
+  List<UkJobListDetailVehicleList> vehicleOptionsList = []; // 车辆选项
+  List<String> selectedVehicleList = []; // 选择的证书
+
+  String videoTips = '''
+    Video - video type (eg: mp4) and size 20MB
+    Document can be word/pdf,etc and the size 10MB
+    Cover、Image can be jpg,jpeg,png and the size 10MB.
+    ''';
+  List<FileFieldItem> uploadFieldList = [];
+  String videoText = '';
+  dynamic? videoCover;
+  dynamic? video;
+  dynamic? otherImage;
+  dynamic? otherDocument;
+
+
+  String note = '';
+  String requirements = '';
+
   //表单的校验与数据
   //表单的校验与数据
   Map<String, Map<String, dynamic>> formData = {
   Map<String, Map<String, dynamic>> formData = {
+    'hour_rate': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Hour Rate'.tr,
+      'obsecure': false,
+    },
     'no_of_staff': {
     'no_of_staff': {
       'value': '',
       'value': '',
       'controller': TextEditingController(),
       'controller': TextEditingController(),
       'focusNode': FocusNode(),
       'focusNode': FocusNode(),
-      'hintText': 'Enter No. of Staff'.tr,
+      'hintText': 'No. of Staff'.tr,
       'obsecure': false,
       'obsecure': false,
     },
     },
+    'contact': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Contact'.tr,
+      'obsecure': false,
+    },
+    'contact_no': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Contact No'.tr,
+      'obsecure': false,
+    },
+    'video_text': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Video Text'.tr,
+      'obsecure': false,
+    },
+    'note': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Note'.tr,
+      'obsecure': false,
+    },
+    'requirements': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Requirements'.tr,
+      'obsecure': false,
+    }
   };
   };
 
 
 }
 }

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

@@ -71,6 +71,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
       Log.d("获取到的 atturl  ${state.labReqOption?.attUrl}");
       Log.d("获取到的 atturl  ${state.labReqOption?.attUrl}");
 
 
       state.attFilePath = state.labReqOption?.attUrl?? '';
       state.attFilePath = state.labReqOption?.attUrl?? '';
+
       state.selectedTypeId = state.labReqOption?.employmentType.toString() ?? '';
       state.selectedTypeId = state.labReqOption?.employmentType.toString() ?? '';
 
 
       state.jobSelectJobStart = state.labReqOption?.jobStart?? '';
       state.jobSelectJobStart = state.labReqOption?.jobStart?? '';
@@ -135,6 +136,11 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
         // 新增
         // 新增
         state.noStaff = '';
         state.noStaff = '';
         state.amount =  '';
         state.amount =  '';
+
+        // choose Type 下拉里面 永远只有一个选项 所以默认选择第一个
+        if (state.labReqOption?.employmentList != null && state.labReqOption!.employmentList!.isNotEmpty) {
+          state.selectedTypeId = state.labReqOption!.employmentList?.first.value.toString();
+        }
       }else {
       }else {
         // 编辑/详情
         // 编辑/详情
         state.noStaff = state.labReqOption?.needNum?.toString() == "0" ? "" : state.labReqOption?.needNum.toString();
         state.noStaff = state.labReqOption?.needNum?.toString() == "0" ? "" : state.labReqOption?.needNum.toString();
@@ -319,7 +325,7 @@ class LabourRequestAddController extends GetxController with DioCancelableMixin
       ToastEngine.show("Enter No. of Staff".tr);
       ToastEngine.show("Enter No. of Staff".tr);
       return;
       return;
     } else if (state.labReqOption?.serviceType == 1 && Utils.isEmpty(amount)) {
     } else if (state.labReqOption?.serviceType == 1 && Utils.isEmpty(amount)) {
-      ToastEngine.show("Enter Amount".tr);
+      ToastEngine.show("Enter Hour Rate".tr);
       return;
       return;
     }else if(Utils.isEmpty(state.selectedTypeId)){
     }else if(Utils.isEmpty(state.selectedTypeId)){
       ToastEngine.show("Choose Employment Type".tr);
       ToastEngine.show("Choose Employment Type".tr);

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

@@ -77,7 +77,7 @@ class LabourRequestAddState implements CommonLabourRequestState {
       'value': '',
       'value': '',
       'controller': TextEditingController(),
       'controller': TextEditingController(),
       'focusNode': FocusNode(),
       'focusNode': FocusNode(),
-      'hintText': 'Enter Amount'.tr,
+      'hintText': 'Enter Hour Rate'.tr,
       'obsecure': false,
       'obsecure': false,
     },
     },
     'remark': {
     'remark': {

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

@@ -170,7 +170,7 @@ class CommonLabourRequestFormFields extends StatelessWidget {
         Visibility(
         Visibility(
           visible: state.labReqOption?.serviceType == 1,
           visible: state.labReqOption?.serviceType == 1,
           child: FormRequireText(
           child: FormRequireText(
-            text: "Amount".tr,
+            text: "Hour Rate".tr,
           ).marginOnly(top: 15),
           ).marginOnly(top: 15),
         ),
         ),
 
 
@@ -188,10 +188,10 @@ class CommonLabourRequestFormFields extends StatelessWidget {
             textInputType: TextInputType.number,
             textInputType: TextInputType.number,
             formData: state.formData,
             formData: state.formData,
             textInputAction: TextInputAction.done,
             textInputAction: TextInputAction.done,
+            marginTop: 10,
             onSubmit: (key, value) {
             onSubmit: (key, value) {
               FocusScope.of(context).unfocus();
               FocusScope.of(context).unfocus();
             },
             },
-            marginTop: 10,
           ),
           ),
         ),
         ),
 
 
@@ -291,11 +291,11 @@ class CommonLabourRequestFormFields extends StatelessWidget {
           visible: state.certificateList?.isNotEmpty == true,
           visible: state.certificateList?.isNotEmpty == true,
           child: CustomCheckBox(
           child: CustomCheckBox(
             options: state.certificateList?.map<String>((e) => e.txt!).toList() ?? [],
             options: state.certificateList?.map<String>((e) => e.txt!).toList() ?? [],
-            onOptionsSelected: (selected) {
-              Log.d("操作了证书选择的 index   ${selected}");
+            onOptionsSelected: (selectedIndexList) {
+              Log.d("操作了证书选择的 index   ${selectedIndexList}");
               Log.d("操作证书前的 state.certificateList   ${state.certificateList}");
               Log.d("操作证书前的 state.certificateList   ${state.certificateList}");
               // 转换选中的索引为对应的 value
               // 转换选中的索引为对应的 value
-              state.selectedCertificateList = selected
+              state.selectedCertificateList = selectedIndexList
                   .map((index) {
                   .map((index) {
                 return state.certificateList?[index].value?.toString(); // 获取对应的 value
                 return state.certificateList?[index].value?.toString(); // 获取对应的 value
               })
               })
@@ -344,11 +344,11 @@ class CommonLabourRequestFormFields extends StatelessWidget {
           visible: state.vehicleList?.isNotEmpty == true,
           visible: state.vehicleList?.isNotEmpty == true,
           child: CustomCheckBox(
           child: CustomCheckBox(
             options: state.vehicleList?.map((e) => e.txt!).toList() ?? [],
             options: state.vehicleList?.map((e) => e.txt!).toList() ?? [],
-            onOptionsSelected: (selected) {
-              Log.d("操作了交通工具选项的 index   ${selected}");
+            onOptionsSelected: (selectedIndexList) {
+              Log.d("操作了交通工具选项的 index   ${selectedIndexList}");
               Log.d("操作交通工具前的 state.selectedCertificateList   ${state.certificateList}");
               Log.d("操作交通工具前的 state.selectedCertificateList   ${state.certificateList}");
               // 转换选中的索引为对应的 value
               // 转换选中的索引为对应的 value
-              state.selectedVehicleList = selected
+              state.selectedVehicleList = selectedIndexList
                   .map((index) {
                   .map((index) {
                 return state.vehicleList?[index].value?.toString(); // 获取对应的 value
                 return state.vehicleList?[index].value?.toString(); // 获取对应的 value
               })
               })

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

@@ -182,7 +182,7 @@ abstract class CommonLabourRequestState {
       'value': '',
       'value': '',
       'controller': TextEditingController(),
       'controller': TextEditingController(),
       'focusNode': FocusNode(),
       'focusNode': FocusNode(),
-      'hintText': 'Enter Amount'.tr,
+      'hintText': 'Enter Hour Rate'.tr,
       'obsecure': false,
       'obsecure': false,
     },
     },
     'remark': {
     'remark': {

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

@@ -270,16 +270,17 @@ class _PreselectedAddStaffState extends State<PreselectedAddStaff> {
                 key: Key("keyword"),
                 key: Key("keyword"),
                 value: controller.keyword,
                 value: controller.keyword,
                 searchBarHeight: 38,
                 searchBarHeight: 38,
-                searchBarBgColor: Color(0xFF4DCFF6).withOpacity(0.2),
+                // searchBarBgColor: Color(0xFF4DCFF6).withOpacity(0.2),
+                searchBarBgColor: Colors.white,
                 searchBarBorderRadius: 15,
                 searchBarBorderRadius: 15,
-                // searchBarBorder: Border.all(
-                //   color: Color(0XFFC3C3C3), // 设置边框颜色为灰色
-                //   width: 0.5, // 设置边框宽度
-                // ),
+                searchBarBorder: Border.all(
+                  color: Colors.black12.withOpacity(0.05), // 设置边框颜色为灰色
+                  width: 0.5, // 设置边框宽度
+                ),
                 textHintColor: ColorConstants.textGrayAECAE5,
                 textHintColor: ColorConstants.textGrayAECAE5,
                 textColor: ColorConstants.black33,
                 textColor: ColorConstants.black33,
                 textFontSize: 12.0,
                 textFontSize: 12.0,
-                showSearchIcon: false,
+                showSearchIcon: true,
                 margin: EdgeInsets.only(right: 5),
                 margin: EdgeInsets.only(right: 5),
                 onSearch: (keyword) {
                 onSearch: (keyword) {
                   controller.searchKeywordInputSearch(keyword);
                   controller.searchKeywordInputSearch(keyword);
@@ -311,7 +312,8 @@ class _PreselectedAddStaffState extends State<PreselectedAddStaff> {
                   },
                   },
                   text: "Reset".tr,
                   text: "Reset".tr,
                   textColor: ColorConstants.white,
                   textColor: ColorConstants.white,
-                  backgroundColor: hexToColor("#2BA9F9", opacity: 0.5),
+                  backgroundColor: hexToColor("#2BA9F9", opacity: 0.8),
+                  fontSize: 14,
                   radius: 20,
                   radius: 20,
                   minWidth: 60,
                   minWidth: 60,
                   minHeight: 35,
                   minHeight: 35,
@@ -339,11 +341,12 @@ class _PreselectedAddStaffState extends State<PreselectedAddStaff> {
             child: Container(
             child: Container(
               padding: const EdgeInsets.only(left: 5, right: 5),
               padding: const EdgeInsets.only(left: 5, right: 5),
               margin: const EdgeInsets.only(top: 5),
               margin: const EdgeInsets.only(top: 5),
-              height: 40,
+              height: 38,
               decoration: BoxDecoration(
               decoration: BoxDecoration(
-                color:  Color(0xFF4DCFF6).withOpacity(0.2),
-                // border: Border.all(color: Colors.black12.withOpacity(0.05)),
-                borderRadius: const BorderRadius.all(Radius.circular(5)),
+                // color:  Color(0xFF4DCFF6).withOpacity(0.2),
+                color:  Colors.white,
+                border: Border.all(color: Colors.black12.withOpacity(0.05)),
+                borderRadius: const BorderRadius.all(Radius.circular(15)),
               ),
               ),
               child: Row(
               child: Row(
                 mainAxisSize: MainAxisSize.max,
                 mainAxisSize: MainAxisSize.max,
@@ -384,11 +387,12 @@ class _PreselectedAddStaffState extends State<PreselectedAddStaff> {
             child: Container(
             child: Container(
               padding: const EdgeInsets.only(left: 5, right: 5),
               padding: const EdgeInsets.only(left: 5, right: 5),
               margin: const EdgeInsets.only(top: 5),
               margin: const EdgeInsets.only(top: 5),
-              height: 40,
+              height: 38,
               decoration: BoxDecoration(
               decoration: BoxDecoration(
-                color:  Color(0xFF4DCFF6).withOpacity(0.2),
-                // border: Border.all(color: Colors.black12.withOpacity(0.05)),
-                borderRadius: const BorderRadius.all(Radius.circular(5)),
+                // color:  Color(0xFF4DCFF6).withOpacity(0.2),
+                color:  Colors.white,
+                border: Border.all(color: Colors.black12.withOpacity(0.05)),
+                borderRadius: const BorderRadius.all(Radius.circular(15)),
               ),
               ),
               child: Row(
               child: Row(
                 mainAxisSize: MainAxisSize.max,
                 mainAxisSize: MainAxisSize.max,
@@ -431,8 +435,9 @@ class _PreselectedAddStaffState extends State<PreselectedAddStaff> {
               margin: const EdgeInsets.only(top: 5),
               margin: const EdgeInsets.only(top: 5),
               height: 38,
               height: 38,
               decoration: BoxDecoration(
               decoration: BoxDecoration(
-                color:  Color(0xFF4DCFF6).withOpacity(0.2),
-                // border: Border.all(color: Colors.black12.withOpacity(0.05)),
+                // color:  Color(0xFF4DCFF6).withOpacity(0.2),
+                color: Colors.white,
+                border: Border.all(color: Colors.black12.withOpacity(0.05)),
                 borderRadius: const BorderRadius.all(Radius.circular(15)),
                 borderRadius: const BorderRadius.all(Radius.circular(15)),
               ),
               ),
               child: Row(
               child: Row(
@@ -571,18 +576,25 @@ class _PreselectedAddStaffState extends State<PreselectedAddStaff> {
                   fontSize: 13,
                   fontSize: 13,
                   isFontRegular: true,
                   isFontRegular: true,
                 ),
                 ),
-                MyTextView(
-                  (item.resume ==null || item.resume!.isEmpty == true)? "-": 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(),
+                Expanded(
+                  child: Container(
+                    padding: const EdgeInsets.only(right: 5),
+                    child: MyTextView(
+                      (item.resume ==null || item.resume!.isEmpty == true)? "-": item.resume!,
+                      textColor: ColorConstants.black66,
+                      fontSize: 13,
+                      isFontRegular: true,
+                      maxLines: 1,
+                      isTextEllipsis: true,
+                      onClick: (){
+                        // 点击查看 打开webview 页面
+                        if(item.resume?.isNotEmpty == true && Utils.isNetworkUrl(item.resume!)){
+                          controller.handlerScanFile(item.resume!);
+                        }
+                      },
+                    ),
+                  ),
+                ),
               ],
               ],
             ).marginOnly(top: 5),
             ).marginOnly(top: 5),
 
 

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

@@ -156,28 +156,6 @@ class _LabourTemplateAddState extends BaseState<UKTemplateAddPage, TemplateAddCo
                             ).marginOnly(left: 15, right: 15, top: 10),
                             ).marginOnly(left: 15, right: 15, top: 10),
                           ),
                           ),
 
 
-
-                          // challenge25
-                          MyTextView(
-                            "Challenge25".tr,
-                            textColor: Colors.white,
-                            fontSize: 14,
-                            isFontRegular: true,
-                            marginLeft: 15,
-                            marginTop: 15,
-                          ),
-
-                          // challenge25 radiobox
-                          Visibility(
-                            child: CustomRadioCheck(
-                              options: state.indexOptionEntity?.challenge25List?.map((e) => e.txt!).toList() ?? [],
-                              onOptionSelected: (index, text) {
-                                state.selectedChallenge25Id = state.indexOptionEntity?.challenge25List![index].value?.toString()??'';
-                              },
-                              selectedPosition: state.indexOptionEntity?.challenge25List?.indexWhere((e) => e.checked == "checked") ?? -1,
-                            ).marginOnly(left: 15, right: 15, top: 10),
-                          ),
-
                           // 交通工具
                           // 交通工具
                           MyTextView(
                           MyTextView(
                             "Vehicle".tr,
                             "Vehicle".tr,
@@ -207,6 +185,28 @@ class _LabourTemplateAddState extends BaseState<UKTemplateAddPage, TemplateAddCo
                             ).marginOnly(left: 15, right: 15, top: 10),
                             ).marginOnly(left: 15, right: 15, top: 10),
                           ),
                           ),
 
 
+
+                          // challenge25
+                          MyTextView(
+                            "Challenge25".tr,
+                            textColor: Colors.white,
+                            fontSize: 14,
+                            isFontRegular: true,
+                            marginLeft: 15,
+                            marginTop: 15,
+                          ),
+
+                          // challenge25 radiobox
+                          Visibility(
+                            child: CustomRadioCheck(
+                              options: state.indexOptionEntity?.challenge25List?.map((e) => e.txt!).toList() ?? [],
+                              onOptionSelected: (index, text) {
+                                state.selectedChallenge25Id = state.indexOptionEntity?.challenge25List![index].value?.toString()??'';
+                              },
+                              selectedPosition: state.indexOptionEntity?.challenge25List?.indexWhere((e) => e.checked == "checked") ?? -1,
+                            ).marginOnly(left: 15, right: 15, top: 10),
+                          ),
+
                           // 语言的多选
                           // 语言的多选
                           // GetBuilder<TemplateAddController>(
                           // GetBuilder<TemplateAddController>(
                           //   builder: (controller) {
                           //   builder: (controller) {

+ 22 - 0
packages/cpt_uk/lib/modules/job/template_list/item_template.dart

@@ -106,6 +106,28 @@ class TemplateItem extends StatelessWidget {
             ],
             ],
           ).marginOnly(top: 14),
           ).marginOnly(top: 14),
 
 
+          // challenge25
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "${"Challenge25".tr}:",
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //文本
+              MyTextView(
+                item.challenge25 ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 14),
 
 
           // 联系人
           // 联系人
           Row(
           Row(

+ 5 - 1
packages/cpt_uk/lib/modules/review/labour_review_edit/labour_review_edit_controller.dart

@@ -114,6 +114,10 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
         // 新增
         // 新增
         state.noStaff = '';
         state.noStaff = '';
         state.amount =  '';
         state.amount =  '';
+        // choose Type 下拉里面 永远只有一个选项 所以默认选择第一个
+        if (state.labReqOption?.employmentList != null && state.labReqOption!.employmentList!.isNotEmpty) {
+          state.selectedTypeId = state.labReqOption!.employmentList?.first.value.toString();
+        }
       }else {
       }else {
         state.noStaff = state.labReqOption?.needNum?.toString() == "0" ? "" : state.labReqOption?.needNum.toString();
         state.noStaff = state.labReqOption?.needNum?.toString() == "0" ? "" : state.labReqOption?.needNum.toString();
         state.amount = state.labReqOption?.amount?.toString() == "0" ? "" : state.labReqOption?.amount.toString();
         state.amount = state.labReqOption?.amount?.toString() == "0" ? "" : state.labReqOption?.amount.toString();
@@ -574,7 +578,7 @@ class LabourReviewEditController extends GetxController with DioCancelableMixin
       ToastEngine.show("Enter No. of Staff".tr);
       ToastEngine.show("Enter No. of Staff".tr);
       return;
       return;
     } else if (state.labReqOption?.serviceType == 1 && Utils.isEmpty(amount)) {
     } else if (state.labReqOption?.serviceType == 1 && Utils.isEmpty(amount)) {
-      ToastEngine.show("Enter Amount".tr);
+      ToastEngine.show("Enter Hour Rate".tr);
       return;
       return;
     }else if(Utils.isEmpty(state.selectedTypeId)){
     }else if(Utils.isEmpty(state.selectedTypeId)){
       ToastEngine.show("Choose Employment Type".tr);
       ToastEngine.show("Choose Employment Type".tr);

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

@@ -86,7 +86,7 @@ class LabourReviewEditState implements CommonLabourRequestState {
       'value': '',
       'value': '',
       'controller': TextEditingController(),
       'controller': TextEditingController(),
       'focusNode': FocusNode(),
       'focusNode': FocusNode(),
-      'hintText': 'Enter Amount'.tr,
+      'hintText': 'Enter Hour Rate'.tr,
       'obsecure': false,
       'obsecure': false,
     },
     },
     'remark': {
     'remark': {

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

@@ -356,6 +356,9 @@ class ApiConstants {
   // attentanceReview 获取批注
   // attentanceReview 获取批注
   static const apiAttendanceReviewRemarksUK = "/index.php/api/v1/hotel/applied/attn-remarks";
   static const apiAttendanceReviewRemarksUK = "/index.php/api/v1/hotel/applied/attn-remarks";
 
 
+  // job list
+  static const apiJobListDetailUk = "/index.php/api/v1/hotel/job/detail";
+
 
 
   //门卫的考勤选项
   //门卫的考勤选项
   static const apiSecurityAttendanceOptionUK = "/index.php/api/v1/hotel/security/index";
   static const apiSecurityAttendanceOptionUK = "/index.php/api/v1/hotel/security/index";

+ 282 - 0
packages/cs_domain/lib/entity/response/uk_job_list_detail_entity.dart

@@ -0,0 +1,282 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/uk_job_list_detail_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/uk_job_list_detail_entity.g.dart';
+
+@JsonSerializable()
+class UkJobListDetailEntity {
+	UkJobListDetailRow? row;
+	@JSONField(name: 'job_id')
+	int? jobId;
+	@JSONField(name: 'job_title')
+	String? jobTitle;
+	@JSONField(name: 'need_num')
+	int? needNum;
+	@JSONField(name: 'department_id')
+	int? departmentId;
+	@JSONField(name: 'start_time')
+	String? startTime;
+	@JSONField(name: 'end_time')
+	String? endTime;
+	@JSONField(name: 'department_list')
+	List<UkJobListDetailDepartmentList>? departmentList;
+	@JSONField(name: 'certificate_list')
+	List<UkJobListDetailCertificateList>? certificateList;
+	@JSONField(name: 'vehicle_list')
+	List<UkJobListDetailVehicleList>? vehicleList;
+	@JSONField(name: 'challenge_25_list')
+	List<UkJobListDetailChallenge25List>? challenge25List;
+
+	UkJobListDetailEntity();
+
+	factory UkJobListDetailEntity.fromJson(Map<String, dynamic> json) => $UkJobListDetailEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkJobListDetailEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkJobListDetailRow {
+	@JSONField(name: 'job_id')
+	int? jobId;
+	@JSONField(name: 'job_publish_admin_id')
+	int? jobPublishAdminId;
+	@JSONField(name: 'job_publish_admin_role')
+	String? jobPublishAdminRole;
+	@JSONField(name: 'job_employer_admin_id')
+	int? jobEmployerAdminId;
+	@JSONField(name: 'job_employer_company_name')
+	String? jobEmployerCompanyName;
+	@JSONField(name: 'job_recruiter_admin_id')
+	int? jobRecruiterAdminId;
+	@JSONField(name: 'job_recruiter_admin_name')
+	String? jobRecruiterAdminName;
+	@JSONField(name: 'job_title')
+	String? jobTitle;
+	@JSONField(name: 'job_title_id')
+	int? jobTitleId;
+	@JSONField(name: 'job_description')
+	String? jobDescription;
+	@JSONField(name: 'job_post')
+	String? jobPost;
+	@JSONField(name: 'job_image')
+	String? jobImage;
+	@JSONField(name: 'location_type')
+	int? locationType;
+	@JSONField(name: 'job_address')
+	String? jobAddress;
+	@JSONField(name: 'job_area_main_id')
+	int? jobAreaMainId;
+	@JSONField(name: 'job_area_child_id')
+	int? jobAreaChildId;
+	@JSONField(name: 'job_need_people_count')
+	int? jobNeedPeopleCount;
+	@JSONField(name: 'job_contact_name')
+	String? jobContactName;
+	@JSONField(name: 'job_contact_no')
+	String? jobContactNo;
+	@JSONField(name: 'job_start_date')
+	int? jobStartDate;
+	@JSONField(name: 'job_end_date')
+	int? jobEndDate;
+	@JSONField(name: 'job_hour_rate')
+	int? jobHourRate;
+	@JSONField(name: 'employer_rate')
+	int? employerRate;
+	@JSONField(name: 'job_note')
+	String? jobNote;
+	@JSONField(name: 'job_add_time')
+	int? jobAddTime;
+	@JSONField(name: 'job_update_time')
+	int? jobUpdateTime;
+	@JSONField(name: 'job_industry_id')
+	int? jobIndustryId;
+	@JSONField(name: 'job_industry_name')
+	String? jobIndustryName;
+	@JSONField(name: 'job_people_sex')
+	int? jobPeopleSex;
+	@JSONField(name: 'job_people_language')
+	String? jobPeopleLanguage;
+	@JSONField(name: 'job_people_nationality')
+	String? jobPeopleNationality;
+	@JSONField(name: 'job_people_age')
+	String? jobPeopleAge;
+	@JSONField(name: 'job_latitude')
+	String? jobLatitude;
+	@JSONField(name: 'job_longitude')
+	String? jobLongitude;
+	@JSONField(name: 'job_requirements')
+	String? jobRequirements;
+	@JSONField(name: 'job_geolocation')
+	String? jobGeolocation;
+	@JSONField(name: 'job_zip')
+	String? jobZip;
+	@JSONField(name: 'job_status')
+	int? jobStatus;
+	@JSONField(name: 'job_is_notify')
+	int? jobIsNotify;
+	@JSONField(name: 'recipient_id')
+	dynamic recipientId;
+	@JSONField(name: 'export_schedules_pdf')
+	int? exportSchedulesPdf;
+	@JSONField(name: 'employer_status')
+	int? employerStatus;
+	@JSONField(name: 'confirm_signature')
+	String? confirmSignature;
+	@JSONField(name: 'confirm_time')
+	int? confirmTime;
+	@JSONField(name: 'employement_status')
+	dynamic employementStatus;
+	@JSONField(name: 'food_certificate_required')
+	int? foodCertificateRequired;
+	@JSONField(name: 'rsa_certificate')
+	int? rsaCertificate;
+	@JSONField(name: 'food_handler')
+	int? foodHandler;
+	int? topping;
+	@JSONField(name: 'topping_at')
+	dynamic toppingAt;
+	@JSONField(name: 'job_is_notify_three')
+	int? jobIsNotifyThree;
+	@JSONField(name: 'whats_app')
+	String? whatsApp;
+	int? source;
+	@JSONField(name: 'job_break_hours')
+	int? jobBreakHours;
+	@JSONField(name: 'hotel_job_id')
+	int? hotelJobId;
+	@JSONField(name: 'revised_date')
+	dynamic revisedDate;
+	@JSONField(name: 'typhoid_vaccine')
+	int? typhoidVaccine;
+	int? hide;
+	@JSONField(name: 'check_status')
+	int? checkStatus;
+	@JSONField(name: 'check_date')
+	dynamic checkDate;
+	@JSONField(name: 'job_unit')
+	String? jobUnit;
+	@JSONField(name: 'co_department_id')
+	int? coDepartmentId;
+	@JSONField(name: 'job_instant_status')
+	int? jobInstantStatus;
+	@JSONField(name: 'service_type')
+	int? serviceType;
+	@JSONField(name: 'agency_rate')
+	String? agencyRate;
+	@JSONField(name: 'job_certificate')
+	String? jobCertificate;
+	@JSONField(name: 'job_vehicle')
+	String? jobVehicle;
+	@JSONField(name: 'challenge_25')
+	int? challenge25;
+	@JSONField(name: 'topping_admin_id')
+	int? toppingAdminId;
+	@JSONField(name: 'source_type')
+	int? sourceType;
+	@JSONField(name: 'agency_id')
+	int? agencyId;
+	@JSONField(name: 'agency_name')
+	String? agencyName;
+	String? video;
+	@JSONField(name: 'add_by')
+	String? addBy;
+	@JSONField(name: 'video_cover')
+	String? videoCover;
+	@JSONField(name: 'template_id')
+	int? templateId;
+	String? client;
+	@JSONField(name: 'other_image')
+	String? otherImage;
+	@JSONField(name: 'other_document')
+	String? otherDocument;
+	@JSONField(name: 'video_text')
+	String? videoText;
+
+	UkJobListDetailRow();
+
+	factory UkJobListDetailRow.fromJson(Map<String, dynamic> json) => $UkJobListDetailRowFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkJobListDetailRowToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkJobListDetailDepartmentList {
+	int? value;
+	String? txt;
+	String? selected;
+
+	UkJobListDetailDepartmentList();
+
+	factory UkJobListDetailDepartmentList.fromJson(Map<String, dynamic> json) => $UkJobListDetailDepartmentListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkJobListDetailDepartmentListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkJobListDetailCertificateList {
+	int? value;
+	String? txt;
+	String? checked;
+
+	UkJobListDetailCertificateList();
+
+	factory UkJobListDetailCertificateList.fromJson(Map<String, dynamic> json) => $UkJobListDetailCertificateListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkJobListDetailCertificateListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkJobListDetailVehicleList {
+	String? value;
+	String? txt;
+	String? checked;
+
+	UkJobListDetailVehicleList();
+
+	factory UkJobListDetailVehicleList.fromJson(Map<String, dynamic> json) => $UkJobListDetailVehicleListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkJobListDetailVehicleListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UkJobListDetailChallenge25List {
+	int? value;
+	String? txt;
+	String? checked;
+
+	UkJobListDetailChallenge25List();
+
+	factory UkJobListDetailChallenge25List.fromJson(Map<String, dynamic> json) => $UkJobListDetailChallenge25ListFromJson(json);
+
+	Map<String, dynamic> toJson() => $UkJobListDetailChallenge25ListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 17 - 15
packages/cs_domain/lib/entity/response/uk_staff_detail_entity.dart

@@ -5,7 +5,7 @@ export 'package:domain/generated/json/uk_staff_detail_entity.g.dart';
 
 
 @JsonSerializable()
 @JsonSerializable()
 class UkStaffDetailEntity {
 class UkStaffDetailEntity {
-	@JSONField(name: "member_id")
+	@JSONField(name: 'member_id')
 	int? memberId;
 	int? memberId;
 	String? name;
 	String? name;
 	String? avatar;
 	String? avatar;
@@ -17,20 +17,22 @@ class UkStaffDetailEntity {
 	String? address;
 	String? address;
 	String? natl;
 	String? natl;
 	String? lang;
 	String? lang;
-	@JSONField(name: "emer_name")
+	@JSONField(name: 'emer_name')
 	String? emerName;
 	String? emerName;
-	@JSONField(name: "emer_phone")
+	@JSONField(name: 'emer_phone')
 	List<String>? emerPhone;
 	List<String>? emerPhone;
-	@JSONField(name: "emer_name2")
+	@JSONField(name: 'emer_name2')
 	String? emerName2;
 	String? emerName2;
-	@JSONField(name: "emer_phone2")
+	@JSONField(name: 'emer_phone2')
 	List<String>? emerPhone2;
 	List<String>? emerPhone2;
-	@JSONField(name: "challenge_25")
+	@JSONField(name: 'challenge_25')
 	int? challenge25;
 	int? challenge25;
+	@JSONField(name: 'certtype_list')
+	List<String>? certtypeList;
 	List<UkStaffDetailCertificates>? certificates;
 	List<UkStaffDetailCertificates>? certificates;
-	@JSONField(name: "rem_num")
+	@JSONField(name: 'rem_num')
 	int? remNum;
 	int? remNum;
-	@JSONField(name: "rem_rate")
+	@JSONField(name: 'rem_rate')
 	int? remRate;
 	int? remRate;
 
 
 	UkStaffDetailEntity();
 	UkStaffDetailEntity();
@@ -49,19 +51,19 @@ class UkStaffDetailEntity {
 class UkStaffDetailCertificates {
 class UkStaffDetailCertificates {
 	int? id;
 	int? id;
 	String? type;
 	String? type;
-	@JSONField(name: "type_code")
+	@JSONField(name: 'type_code')
 	int? typeCode;
 	int? typeCode;
 	List<String>? url;
 	List<String>? url;
 	String? status;
 	String? status;
-	@JSONField(name: "status_color")
+	@JSONField(name: 'status_color')
 	String? statusColor;
 	String? statusColor;
-	@JSONField(name: "status_code")
+	@JSONField(name: 'status_code')
 	int? statusCode;
 	int? statusCode;
-	@JSONField(name: "reject_reason")
+	@JSONField(name: 'reject_reason')
 	String? rejectReason;
 	String? rejectReason;
-	@JSONField(name: "issue_date")
-	dynamic issueDate;
-	@JSONField(name: "expiry_date")
+	@JSONField(name: 'issue_date')
+	String? issueDate;
+	@JSONField(name: 'expiry_date')
 	String? expiryDate;
 	String? expiryDate;
 
 
 	UkStaffDetailCertificates();
 	UkStaffDetailCertificates();

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

@@ -118,6 +118,7 @@ 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_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_search_entity.dart';
 import 'package:domain/entity/response/uk_job_list_applied_staff_selectoptions_entity.dart';
 import 'package:domain/entity/response/uk_job_list_applied_staff_selectoptions_entity.dart';
+import 'package:domain/entity/response/uk_job_list_detail_entity.dart';
 import 'package:domain/entity/response/uk_job_template_detail_by_select_title_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_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_detail_entity.dart';
@@ -1036,6 +1037,32 @@ class JsonConvert {
           Map<String, dynamic> e) =>
           Map<String, dynamic> e) =>
           UkJobListAppliedStaffSelectoptionsEntity.fromJson(e)).toList() as M;
           UkJobListAppliedStaffSelectoptionsEntity.fromJson(e)).toList() as M;
     }
     }
+    if (<UkJobListDetailEntity>[] is M) {
+      return data.map<UkJobListDetailEntity>((Map<String, dynamic> e) =>
+          UkJobListDetailEntity.fromJson(e)).toList() as M;
+    }
+    if (<UkJobListDetailRow>[] is M) {
+      return data.map<UkJobListDetailRow>((Map<String, dynamic> e) =>
+          UkJobListDetailRow.fromJson(e)).toList() as M;
+    }
+    if (<UkJobListDetailDepartmentList>[] is M) {
+      return data.map<UkJobListDetailDepartmentList>((Map<String, dynamic> e) =>
+          UkJobListDetailDepartmentList.fromJson(e)).toList() as M;
+    }
+    if (<UkJobListDetailCertificateList>[] is M) {
+      return data.map<UkJobListDetailCertificateList>((
+          Map<String, dynamic> e) => UkJobListDetailCertificateList.fromJson(e))
+          .toList() as M;
+    }
+    if (<UkJobListDetailVehicleList>[] is M) {
+      return data.map<UkJobListDetailVehicleList>((Map<String, dynamic> e) =>
+          UkJobListDetailVehicleList.fromJson(e)).toList() as M;
+    }
+    if (<UkJobListDetailChallenge25List>[] is M) {
+      return data.map<UkJobListDetailChallenge25List>((
+          Map<String, dynamic> e) => UkJobListDetailChallenge25List.fromJson(e))
+          .toList() as M;
+    }
     if (<UkJobTemplateDetailBySelectTitleEntity>[] is M) {
     if (<UkJobTemplateDetailBySelectTitleEntity>[] is M) {
       return data.map<UkJobTemplateDetailBySelectTitleEntity>((
       return data.map<UkJobTemplateDetailBySelectTitleEntity>((
           Map<String, dynamic> e) =>
           Map<String, dynamic> e) =>
@@ -1693,6 +1720,16 @@ class JsonConvertClassCollection {
         .toString(): UkJobListAppliedStaffSearchRows.fromJson,
         .toString(): UkJobListAppliedStaffSearchRows.fromJson,
     (UkJobListAppliedStaffSelectoptionsEntity)
     (UkJobListAppliedStaffSelectoptionsEntity)
         .toString(): UkJobListAppliedStaffSelectoptionsEntity.fromJson,
         .toString(): UkJobListAppliedStaffSelectoptionsEntity.fromJson,
+    (UkJobListDetailEntity).toString(): UkJobListDetailEntity.fromJson,
+    (UkJobListDetailRow).toString(): UkJobListDetailRow.fromJson,
+    (UkJobListDetailDepartmentList).toString(): UkJobListDetailDepartmentList
+        .fromJson,
+    (UkJobListDetailCertificateList).toString(): UkJobListDetailCertificateList
+        .fromJson,
+    (UkJobListDetailVehicleList).toString(): UkJobListDetailVehicleList
+        .fromJson,
+    (UkJobListDetailChallenge25List).toString(): UkJobListDetailChallenge25List
+        .fromJson,
     (UkJobTemplateDetailBySelectTitleEntity)
     (UkJobTemplateDetailBySelectTitleEntity)
         .toString(): UkJobTemplateDetailBySelectTitleEntity.fromJson,
         .toString(): UkJobTemplateDetailBySelectTitleEntity.fromJson,
     (UkLabReqShowTemplateEntity).toString(): UkLabReqShowTemplateEntity
     (UkLabReqShowTemplateEntity).toString(): UkLabReqShowTemplateEntity

+ 889 - 0
packages/cs_domain/lib/generated/json/uk_job_list_detail_entity.g.dart

@@ -0,0 +1,889 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/uk_job_list_detail_entity.dart';
+
+UkJobListDetailEntity $UkJobListDetailEntityFromJson(
+    Map<String, dynamic> json) {
+  final UkJobListDetailEntity ukJobListDetailEntity = UkJobListDetailEntity();
+  final UkJobListDetailRow? row = jsonConvert.convert<UkJobListDetailRow>(
+      json['row']);
+  if (row != null) {
+    ukJobListDetailEntity.row = row;
+  }
+  final int? jobId = jsonConvert.convert<int>(json['job_id']);
+  if (jobId != null) {
+    ukJobListDetailEntity.jobId = jobId;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    ukJobListDetailEntity.jobTitle = jobTitle;
+  }
+  final int? needNum = jsonConvert.convert<int>(json['need_num']);
+  if (needNum != null) {
+    ukJobListDetailEntity.needNum = needNum;
+  }
+  final int? departmentId = jsonConvert.convert<int>(json['department_id']);
+  if (departmentId != null) {
+    ukJobListDetailEntity.departmentId = departmentId;
+  }
+  final String? startTime = jsonConvert.convert<String>(json['start_time']);
+  if (startTime != null) {
+    ukJobListDetailEntity.startTime = startTime;
+  }
+  final String? endTime = jsonConvert.convert<String>(json['end_time']);
+  if (endTime != null) {
+    ukJobListDetailEntity.endTime = endTime;
+  }
+  final List<
+      UkJobListDetailDepartmentList>? departmentList = (json['department_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkJobListDetailDepartmentList>(
+          e) as UkJobListDetailDepartmentList).toList();
+  if (departmentList != null) {
+    ukJobListDetailEntity.departmentList = departmentList;
+  }
+  final List<
+      UkJobListDetailCertificateList>? certificateList = (json['certificate_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkJobListDetailCertificateList>(
+          e) as UkJobListDetailCertificateList).toList();
+  if (certificateList != null) {
+    ukJobListDetailEntity.certificateList = certificateList;
+  }
+  final List<
+      UkJobListDetailVehicleList>? vehicleList = (json['vehicle_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkJobListDetailVehicleList>(
+          e) as UkJobListDetailVehicleList).toList();
+  if (vehicleList != null) {
+    ukJobListDetailEntity.vehicleList = vehicleList;
+  }
+  final List<
+      UkJobListDetailChallenge25List>? challenge25List = (json['challenge_25_list'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkJobListDetailChallenge25List>(
+          e) as UkJobListDetailChallenge25List).toList();
+  if (challenge25List != null) {
+    ukJobListDetailEntity.challenge25List = challenge25List;
+  }
+  return ukJobListDetailEntity;
+}
+
+Map<String, dynamic> $UkJobListDetailEntityToJson(
+    UkJobListDetailEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['row'] = entity.row?.toJson();
+  data['job_id'] = entity.jobId;
+  data['job_title'] = entity.jobTitle;
+  data['need_num'] = entity.needNum;
+  data['department_id'] = entity.departmentId;
+  data['start_time'] = entity.startTime;
+  data['end_time'] = entity.endTime;
+  data['department_list'] =
+      entity.departmentList?.map((v) => v.toJson()).toList();
+  data['certificate_list'] =
+      entity.certificateList?.map((v) => v.toJson()).toList();
+  data['vehicle_list'] = entity.vehicleList?.map((v) => v.toJson()).toList();
+  data['challenge_25_list'] =
+      entity.challenge25List?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension UkJobListDetailEntityExtension on UkJobListDetailEntity {
+  UkJobListDetailEntity copyWith({
+    UkJobListDetailRow? row,
+    int? jobId,
+    String? jobTitle,
+    int? needNum,
+    int? departmentId,
+    String? startTime,
+    String? endTime,
+    List<UkJobListDetailDepartmentList>? departmentList,
+    List<UkJobListDetailCertificateList>? certificateList,
+    List<UkJobListDetailVehicleList>? vehicleList,
+    List<UkJobListDetailChallenge25List>? challenge25List,
+  }) {
+    return UkJobListDetailEntity()
+      ..row = row ?? this.row
+      ..jobId = jobId ?? this.jobId
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..needNum = needNum ?? this.needNum
+      ..departmentId = departmentId ?? this.departmentId
+      ..startTime = startTime ?? this.startTime
+      ..endTime = endTime ?? this.endTime
+      ..departmentList = departmentList ?? this.departmentList
+      ..certificateList = certificateList ?? this.certificateList
+      ..vehicleList = vehicleList ?? this.vehicleList
+      ..challenge25List = challenge25List ?? this.challenge25List;
+  }
+}
+
+UkJobListDetailRow $UkJobListDetailRowFromJson(Map<String, dynamic> json) {
+  final UkJobListDetailRow ukJobListDetailRow = UkJobListDetailRow();
+  final int? jobId = jsonConvert.convert<int>(json['job_id']);
+  if (jobId != null) {
+    ukJobListDetailRow.jobId = jobId;
+  }
+  final int? jobPublishAdminId = jsonConvert.convert<int>(
+      json['job_publish_admin_id']);
+  if (jobPublishAdminId != null) {
+    ukJobListDetailRow.jobPublishAdminId = jobPublishAdminId;
+  }
+  final String? jobPublishAdminRole = jsonConvert.convert<String>(
+      json['job_publish_admin_role']);
+  if (jobPublishAdminRole != null) {
+    ukJobListDetailRow.jobPublishAdminRole = jobPublishAdminRole;
+  }
+  final int? jobEmployerAdminId = jsonConvert.convert<int>(
+      json['job_employer_admin_id']);
+  if (jobEmployerAdminId != null) {
+    ukJobListDetailRow.jobEmployerAdminId = jobEmployerAdminId;
+  }
+  final String? jobEmployerCompanyName = jsonConvert.convert<String>(
+      json['job_employer_company_name']);
+  if (jobEmployerCompanyName != null) {
+    ukJobListDetailRow.jobEmployerCompanyName = jobEmployerCompanyName;
+  }
+  final int? jobRecruiterAdminId = jsonConvert.convert<int>(
+      json['job_recruiter_admin_id']);
+  if (jobRecruiterAdminId != null) {
+    ukJobListDetailRow.jobRecruiterAdminId = jobRecruiterAdminId;
+  }
+  final String? jobRecruiterAdminName = jsonConvert.convert<String>(
+      json['job_recruiter_admin_name']);
+  if (jobRecruiterAdminName != null) {
+    ukJobListDetailRow.jobRecruiterAdminName = jobRecruiterAdminName;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    ukJobListDetailRow.jobTitle = jobTitle;
+  }
+  final int? jobTitleId = jsonConvert.convert<int>(json['job_title_id']);
+  if (jobTitleId != null) {
+    ukJobListDetailRow.jobTitleId = jobTitleId;
+  }
+  final String? jobDescription = jsonConvert.convert<String>(
+      json['job_description']);
+  if (jobDescription != null) {
+    ukJobListDetailRow.jobDescription = jobDescription;
+  }
+  final String? jobPost = jsonConvert.convert<String>(json['job_post']);
+  if (jobPost != null) {
+    ukJobListDetailRow.jobPost = jobPost;
+  }
+  final String? jobImage = jsonConvert.convert<String>(json['job_image']);
+  if (jobImage != null) {
+    ukJobListDetailRow.jobImage = jobImage;
+  }
+  final int? locationType = jsonConvert.convert<int>(json['location_type']);
+  if (locationType != null) {
+    ukJobListDetailRow.locationType = locationType;
+  }
+  final String? jobAddress = jsonConvert.convert<String>(json['job_address']);
+  if (jobAddress != null) {
+    ukJobListDetailRow.jobAddress = jobAddress;
+  }
+  final int? jobAreaMainId = jsonConvert.convert<int>(json['job_area_main_id']);
+  if (jobAreaMainId != null) {
+    ukJobListDetailRow.jobAreaMainId = jobAreaMainId;
+  }
+  final int? jobAreaChildId = jsonConvert.convert<int>(
+      json['job_area_child_id']);
+  if (jobAreaChildId != null) {
+    ukJobListDetailRow.jobAreaChildId = jobAreaChildId;
+  }
+  final int? jobNeedPeopleCount = jsonConvert.convert<int>(
+      json['job_need_people_count']);
+  if (jobNeedPeopleCount != null) {
+    ukJobListDetailRow.jobNeedPeopleCount = jobNeedPeopleCount;
+  }
+  final String? jobContactName = jsonConvert.convert<String>(
+      json['job_contact_name']);
+  if (jobContactName != null) {
+    ukJobListDetailRow.jobContactName = jobContactName;
+  }
+  final String? jobContactNo = jsonConvert.convert<String>(
+      json['job_contact_no']);
+  if (jobContactNo != null) {
+    ukJobListDetailRow.jobContactNo = jobContactNo;
+  }
+  final int? jobStartDate = jsonConvert.convert<int>(json['job_start_date']);
+  if (jobStartDate != null) {
+    ukJobListDetailRow.jobStartDate = jobStartDate;
+  }
+  final int? jobEndDate = jsonConvert.convert<int>(json['job_end_date']);
+  if (jobEndDate != null) {
+    ukJobListDetailRow.jobEndDate = jobEndDate;
+  }
+  final int? jobHourRate = jsonConvert.convert<int>(json['job_hour_rate']);
+  if (jobHourRate != null) {
+    ukJobListDetailRow.jobHourRate = jobHourRate;
+  }
+  final int? employerRate = jsonConvert.convert<int>(json['employer_rate']);
+  if (employerRate != null) {
+    ukJobListDetailRow.employerRate = employerRate;
+  }
+  final String? jobNote = jsonConvert.convert<String>(json['job_note']);
+  if (jobNote != null) {
+    ukJobListDetailRow.jobNote = jobNote;
+  }
+  final int? jobAddTime = jsonConvert.convert<int>(json['job_add_time']);
+  if (jobAddTime != null) {
+    ukJobListDetailRow.jobAddTime = jobAddTime;
+  }
+  final int? jobUpdateTime = jsonConvert.convert<int>(json['job_update_time']);
+  if (jobUpdateTime != null) {
+    ukJobListDetailRow.jobUpdateTime = jobUpdateTime;
+  }
+  final int? jobIndustryId = jsonConvert.convert<int>(json['job_industry_id']);
+  if (jobIndustryId != null) {
+    ukJobListDetailRow.jobIndustryId = jobIndustryId;
+  }
+  final String? jobIndustryName = jsonConvert.convert<String>(
+      json['job_industry_name']);
+  if (jobIndustryName != null) {
+    ukJobListDetailRow.jobIndustryName = jobIndustryName;
+  }
+  final int? jobPeopleSex = jsonConvert.convert<int>(json['job_people_sex']);
+  if (jobPeopleSex != null) {
+    ukJobListDetailRow.jobPeopleSex = jobPeopleSex;
+  }
+  final String? jobPeopleLanguage = jsonConvert.convert<String>(
+      json['job_people_language']);
+  if (jobPeopleLanguage != null) {
+    ukJobListDetailRow.jobPeopleLanguage = jobPeopleLanguage;
+  }
+  final String? jobPeopleNationality = jsonConvert.convert<String>(
+      json['job_people_nationality']);
+  if (jobPeopleNationality != null) {
+    ukJobListDetailRow.jobPeopleNationality = jobPeopleNationality;
+  }
+  final String? jobPeopleAge = jsonConvert.convert<String>(
+      json['job_people_age']);
+  if (jobPeopleAge != null) {
+    ukJobListDetailRow.jobPeopleAge = jobPeopleAge;
+  }
+  final String? jobLatitude = jsonConvert.convert<String>(json['job_latitude']);
+  if (jobLatitude != null) {
+    ukJobListDetailRow.jobLatitude = jobLatitude;
+  }
+  final String? jobLongitude = jsonConvert.convert<String>(
+      json['job_longitude']);
+  if (jobLongitude != null) {
+    ukJobListDetailRow.jobLongitude = jobLongitude;
+  }
+  final String? jobRequirements = jsonConvert.convert<String>(
+      json['job_requirements']);
+  if (jobRequirements != null) {
+    ukJobListDetailRow.jobRequirements = jobRequirements;
+  }
+  final String? jobGeolocation = jsonConvert.convert<String>(
+      json['job_geolocation']);
+  if (jobGeolocation != null) {
+    ukJobListDetailRow.jobGeolocation = jobGeolocation;
+  }
+  final String? jobZip = jsonConvert.convert<String>(json['job_zip']);
+  if (jobZip != null) {
+    ukJobListDetailRow.jobZip = jobZip;
+  }
+  final int? jobStatus = jsonConvert.convert<int>(json['job_status']);
+  if (jobStatus != null) {
+    ukJobListDetailRow.jobStatus = jobStatus;
+  }
+  final int? jobIsNotify = jsonConvert.convert<int>(json['job_is_notify']);
+  if (jobIsNotify != null) {
+    ukJobListDetailRow.jobIsNotify = jobIsNotify;
+  }
+  final dynamic recipientId = json['recipient_id'];
+  if (recipientId != null) {
+    ukJobListDetailRow.recipientId = recipientId;
+  }
+  final int? exportSchedulesPdf = jsonConvert.convert<int>(
+      json['export_schedules_pdf']);
+  if (exportSchedulesPdf != null) {
+    ukJobListDetailRow.exportSchedulesPdf = exportSchedulesPdf;
+  }
+  final int? employerStatus = jsonConvert.convert<int>(json['employer_status']);
+  if (employerStatus != null) {
+    ukJobListDetailRow.employerStatus = employerStatus;
+  }
+  final String? confirmSignature = jsonConvert.convert<String>(
+      json['confirm_signature']);
+  if (confirmSignature != null) {
+    ukJobListDetailRow.confirmSignature = confirmSignature;
+  }
+  final int? confirmTime = jsonConvert.convert<int>(json['confirm_time']);
+  if (confirmTime != null) {
+    ukJobListDetailRow.confirmTime = confirmTime;
+  }
+  final dynamic employementStatus = json['employement_status'];
+  if (employementStatus != null) {
+    ukJobListDetailRow.employementStatus = employementStatus;
+  }
+  final int? foodCertificateRequired = jsonConvert.convert<int>(
+      json['food_certificate_required']);
+  if (foodCertificateRequired != null) {
+    ukJobListDetailRow.foodCertificateRequired = foodCertificateRequired;
+  }
+  final int? rsaCertificate = jsonConvert.convert<int>(json['rsa_certificate']);
+  if (rsaCertificate != null) {
+    ukJobListDetailRow.rsaCertificate = rsaCertificate;
+  }
+  final int? foodHandler = jsonConvert.convert<int>(json['food_handler']);
+  if (foodHandler != null) {
+    ukJobListDetailRow.foodHandler = foodHandler;
+  }
+  final int? topping = jsonConvert.convert<int>(json['topping']);
+  if (topping != null) {
+    ukJobListDetailRow.topping = topping;
+  }
+  final dynamic toppingAt = json['topping_at'];
+  if (toppingAt != null) {
+    ukJobListDetailRow.toppingAt = toppingAt;
+  }
+  final int? jobIsNotifyThree = jsonConvert.convert<int>(
+      json['job_is_notify_three']);
+  if (jobIsNotifyThree != null) {
+    ukJobListDetailRow.jobIsNotifyThree = jobIsNotifyThree;
+  }
+  final String? whatsApp = jsonConvert.convert<String>(json['whats_app']);
+  if (whatsApp != null) {
+    ukJobListDetailRow.whatsApp = whatsApp;
+  }
+  final int? source = jsonConvert.convert<int>(json['source']);
+  if (source != null) {
+    ukJobListDetailRow.source = source;
+  }
+  final int? jobBreakHours = jsonConvert.convert<int>(json['job_break_hours']);
+  if (jobBreakHours != null) {
+    ukJobListDetailRow.jobBreakHours = jobBreakHours;
+  }
+  final int? hotelJobId = jsonConvert.convert<int>(json['hotel_job_id']);
+  if (hotelJobId != null) {
+    ukJobListDetailRow.hotelJobId = hotelJobId;
+  }
+  final dynamic revisedDate = json['revised_date'];
+  if (revisedDate != null) {
+    ukJobListDetailRow.revisedDate = revisedDate;
+  }
+  final int? typhoidVaccine = jsonConvert.convert<int>(json['typhoid_vaccine']);
+  if (typhoidVaccine != null) {
+    ukJobListDetailRow.typhoidVaccine = typhoidVaccine;
+  }
+  final int? hide = jsonConvert.convert<int>(json['hide']);
+  if (hide != null) {
+    ukJobListDetailRow.hide = hide;
+  }
+  final int? checkStatus = jsonConvert.convert<int>(json['check_status']);
+  if (checkStatus != null) {
+    ukJobListDetailRow.checkStatus = checkStatus;
+  }
+  final dynamic checkDate = json['check_date'];
+  if (checkDate != null) {
+    ukJobListDetailRow.checkDate = checkDate;
+  }
+  final String? jobUnit = jsonConvert.convert<String>(json['job_unit']);
+  if (jobUnit != null) {
+    ukJobListDetailRow.jobUnit = jobUnit;
+  }
+  final int? coDepartmentId = jsonConvert.convert<int>(
+      json['co_department_id']);
+  if (coDepartmentId != null) {
+    ukJobListDetailRow.coDepartmentId = coDepartmentId;
+  }
+  final int? jobInstantStatus = jsonConvert.convert<int>(
+      json['job_instant_status']);
+  if (jobInstantStatus != null) {
+    ukJobListDetailRow.jobInstantStatus = jobInstantStatus;
+  }
+  final int? serviceType = jsonConvert.convert<int>(json['service_type']);
+  if (serviceType != null) {
+    ukJobListDetailRow.serviceType = serviceType;
+  }
+  final String? agencyRate = jsonConvert.convert<String>(json['agency_rate']);
+  if (agencyRate != null) {
+    ukJobListDetailRow.agencyRate = agencyRate;
+  }
+  final String? jobCertificate = jsonConvert.convert<String>(
+      json['job_certificate']);
+  if (jobCertificate != null) {
+    ukJobListDetailRow.jobCertificate = jobCertificate;
+  }
+  final String? jobVehicle = jsonConvert.convert<String>(json['job_vehicle']);
+  if (jobVehicle != null) {
+    ukJobListDetailRow.jobVehicle = jobVehicle;
+  }
+  final int? challenge25 = jsonConvert.convert<int>(json['challenge_25']);
+  if (challenge25 != null) {
+    ukJobListDetailRow.challenge25 = challenge25;
+  }
+  final int? toppingAdminId = jsonConvert.convert<int>(
+      json['topping_admin_id']);
+  if (toppingAdminId != null) {
+    ukJobListDetailRow.toppingAdminId = toppingAdminId;
+  }
+  final int? sourceType = jsonConvert.convert<int>(json['source_type']);
+  if (sourceType != null) {
+    ukJobListDetailRow.sourceType = sourceType;
+  }
+  final int? agencyId = jsonConvert.convert<int>(json['agency_id']);
+  if (agencyId != null) {
+    ukJobListDetailRow.agencyId = agencyId;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    ukJobListDetailRow.agencyName = agencyName;
+  }
+  final String? video = jsonConvert.convert<String>(json['video']);
+  if (video != null) {
+    ukJobListDetailRow.video = video;
+  }
+  final String? addBy = jsonConvert.convert<String>(json['add_by']);
+  if (addBy != null) {
+    ukJobListDetailRow.addBy = addBy;
+  }
+  final String? videoCover = jsonConvert.convert<String>(json['video_cover']);
+  if (videoCover != null) {
+    ukJobListDetailRow.videoCover = videoCover;
+  }
+  final int? templateId = jsonConvert.convert<int>(json['template_id']);
+  if (templateId != null) {
+    ukJobListDetailRow.templateId = templateId;
+  }
+  final String? client = jsonConvert.convert<String>(json['client']);
+  if (client != null) {
+    ukJobListDetailRow.client = client;
+  }
+  final String? otherImage = jsonConvert.convert<String>(json['other_image']);
+  if (otherImage != null) {
+    ukJobListDetailRow.otherImage = otherImage;
+  }
+  final String? otherDocument = jsonConvert.convert<String>(
+      json['other_document']);
+  if (otherDocument != null) {
+    ukJobListDetailRow.otherDocument = otherDocument;
+  }
+  final String? videoText = jsonConvert.convert<String>(json['video_text']);
+  if (videoText != null) {
+    ukJobListDetailRow.videoText = videoText;
+  }
+  return ukJobListDetailRow;
+}
+
+Map<String, dynamic> $UkJobListDetailRowToJson(UkJobListDetailRow entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['job_id'] = entity.jobId;
+  data['job_publish_admin_id'] = entity.jobPublishAdminId;
+  data['job_publish_admin_role'] = entity.jobPublishAdminRole;
+  data['job_employer_admin_id'] = entity.jobEmployerAdminId;
+  data['job_employer_company_name'] = entity.jobEmployerCompanyName;
+  data['job_recruiter_admin_id'] = entity.jobRecruiterAdminId;
+  data['job_recruiter_admin_name'] = entity.jobRecruiterAdminName;
+  data['job_title'] = entity.jobTitle;
+  data['job_title_id'] = entity.jobTitleId;
+  data['job_description'] = entity.jobDescription;
+  data['job_post'] = entity.jobPost;
+  data['job_image'] = entity.jobImage;
+  data['location_type'] = entity.locationType;
+  data['job_address'] = entity.jobAddress;
+  data['job_area_main_id'] = entity.jobAreaMainId;
+  data['job_area_child_id'] = entity.jobAreaChildId;
+  data['job_need_people_count'] = entity.jobNeedPeopleCount;
+  data['job_contact_name'] = entity.jobContactName;
+  data['job_contact_no'] = entity.jobContactNo;
+  data['job_start_date'] = entity.jobStartDate;
+  data['job_end_date'] = entity.jobEndDate;
+  data['job_hour_rate'] = entity.jobHourRate;
+  data['employer_rate'] = entity.employerRate;
+  data['job_note'] = entity.jobNote;
+  data['job_add_time'] = entity.jobAddTime;
+  data['job_update_time'] = entity.jobUpdateTime;
+  data['job_industry_id'] = entity.jobIndustryId;
+  data['job_industry_name'] = entity.jobIndustryName;
+  data['job_people_sex'] = entity.jobPeopleSex;
+  data['job_people_language'] = entity.jobPeopleLanguage;
+  data['job_people_nationality'] = entity.jobPeopleNationality;
+  data['job_people_age'] = entity.jobPeopleAge;
+  data['job_latitude'] = entity.jobLatitude;
+  data['job_longitude'] = entity.jobLongitude;
+  data['job_requirements'] = entity.jobRequirements;
+  data['job_geolocation'] = entity.jobGeolocation;
+  data['job_zip'] = entity.jobZip;
+  data['job_status'] = entity.jobStatus;
+  data['job_is_notify'] = entity.jobIsNotify;
+  data['recipient_id'] = entity.recipientId;
+  data['export_schedules_pdf'] = entity.exportSchedulesPdf;
+  data['employer_status'] = entity.employerStatus;
+  data['confirm_signature'] = entity.confirmSignature;
+  data['confirm_time'] = entity.confirmTime;
+  data['employement_status'] = entity.employementStatus;
+  data['food_certificate_required'] = entity.foodCertificateRequired;
+  data['rsa_certificate'] = entity.rsaCertificate;
+  data['food_handler'] = entity.foodHandler;
+  data['topping'] = entity.topping;
+  data['topping_at'] = entity.toppingAt;
+  data['job_is_notify_three'] = entity.jobIsNotifyThree;
+  data['whats_app'] = entity.whatsApp;
+  data['source'] = entity.source;
+  data['job_break_hours'] = entity.jobBreakHours;
+  data['hotel_job_id'] = entity.hotelJobId;
+  data['revised_date'] = entity.revisedDate;
+  data['typhoid_vaccine'] = entity.typhoidVaccine;
+  data['hide'] = entity.hide;
+  data['check_status'] = entity.checkStatus;
+  data['check_date'] = entity.checkDate;
+  data['job_unit'] = entity.jobUnit;
+  data['co_department_id'] = entity.coDepartmentId;
+  data['job_instant_status'] = entity.jobInstantStatus;
+  data['service_type'] = entity.serviceType;
+  data['agency_rate'] = entity.agencyRate;
+  data['job_certificate'] = entity.jobCertificate;
+  data['job_vehicle'] = entity.jobVehicle;
+  data['challenge_25'] = entity.challenge25;
+  data['topping_admin_id'] = entity.toppingAdminId;
+  data['source_type'] = entity.sourceType;
+  data['agency_id'] = entity.agencyId;
+  data['agency_name'] = entity.agencyName;
+  data['video'] = entity.video;
+  data['add_by'] = entity.addBy;
+  data['video_cover'] = entity.videoCover;
+  data['template_id'] = entity.templateId;
+  data['client'] = entity.client;
+  data['other_image'] = entity.otherImage;
+  data['other_document'] = entity.otherDocument;
+  data['video_text'] = entity.videoText;
+  return data;
+}
+
+extension UkJobListDetailRowExtension on UkJobListDetailRow {
+  UkJobListDetailRow copyWith({
+    int? jobId,
+    int? jobPublishAdminId,
+    String? jobPublishAdminRole,
+    int? jobEmployerAdminId,
+    String? jobEmployerCompanyName,
+    int? jobRecruiterAdminId,
+    String? jobRecruiterAdminName,
+    String? jobTitle,
+    int? jobTitleId,
+    String? jobDescription,
+    String? jobPost,
+    String? jobImage,
+    int? locationType,
+    String? jobAddress,
+    int? jobAreaMainId,
+    int? jobAreaChildId,
+    int? jobNeedPeopleCount,
+    String? jobContactName,
+    String? jobContactNo,
+    int? jobStartDate,
+    int? jobEndDate,
+    int? jobHourRate,
+    int? employerRate,
+    String? jobNote,
+    int? jobAddTime,
+    int? jobUpdateTime,
+    int? jobIndustryId,
+    String? jobIndustryName,
+    int? jobPeopleSex,
+    String? jobPeopleLanguage,
+    String? jobPeopleNationality,
+    String? jobPeopleAge,
+    String? jobLatitude,
+    String? jobLongitude,
+    String? jobRequirements,
+    String? jobGeolocation,
+    String? jobZip,
+    int? jobStatus,
+    int? jobIsNotify,
+    dynamic recipientId,
+    int? exportSchedulesPdf,
+    int? employerStatus,
+    String? confirmSignature,
+    int? confirmTime,
+    dynamic employementStatus,
+    int? foodCertificateRequired,
+    int? rsaCertificate,
+    int? foodHandler,
+    int? topping,
+    dynamic toppingAt,
+    int? jobIsNotifyThree,
+    String? whatsApp,
+    int? source,
+    int? jobBreakHours,
+    int? hotelJobId,
+    dynamic revisedDate,
+    int? typhoidVaccine,
+    int? hide,
+    int? checkStatus,
+    dynamic checkDate,
+    String? jobUnit,
+    int? coDepartmentId,
+    int? jobInstantStatus,
+    int? serviceType,
+    String? agencyRate,
+    String? jobCertificate,
+    String? jobVehicle,
+    int? challenge25,
+    int? toppingAdminId,
+    int? sourceType,
+    int? agencyId,
+    String? agencyName,
+    String? video,
+    String? addBy,
+    String? videoCover,
+    int? templateId,
+    String? client,
+    String? otherImage,
+    String? otherDocument,
+    String? videoText,
+  }) {
+    return UkJobListDetailRow()
+      ..jobId = jobId ?? this.jobId
+      ..jobPublishAdminId = jobPublishAdminId ?? this.jobPublishAdminId
+      ..jobPublishAdminRole = jobPublishAdminRole ?? this.jobPublishAdminRole
+      ..jobEmployerAdminId = jobEmployerAdminId ?? this.jobEmployerAdminId
+      ..jobEmployerCompanyName = jobEmployerCompanyName ??
+          this.jobEmployerCompanyName
+      ..jobRecruiterAdminId = jobRecruiterAdminId ?? this.jobRecruiterAdminId
+      ..jobRecruiterAdminName = jobRecruiterAdminName ??
+          this.jobRecruiterAdminName
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..jobTitleId = jobTitleId ?? this.jobTitleId
+      ..jobDescription = jobDescription ?? this.jobDescription
+      ..jobPost = jobPost ?? this.jobPost
+      ..jobImage = jobImage ?? this.jobImage
+      ..locationType = locationType ?? this.locationType
+      ..jobAddress = jobAddress ?? this.jobAddress
+      ..jobAreaMainId = jobAreaMainId ?? this.jobAreaMainId
+      ..jobAreaChildId = jobAreaChildId ?? this.jobAreaChildId
+      ..jobNeedPeopleCount = jobNeedPeopleCount ?? this.jobNeedPeopleCount
+      ..jobContactName = jobContactName ?? this.jobContactName
+      ..jobContactNo = jobContactNo ?? this.jobContactNo
+      ..jobStartDate = jobStartDate ?? this.jobStartDate
+      ..jobEndDate = jobEndDate ?? this.jobEndDate
+      ..jobHourRate = jobHourRate ?? this.jobHourRate
+      ..employerRate = employerRate ?? this.employerRate
+      ..jobNote = jobNote ?? this.jobNote
+      ..jobAddTime = jobAddTime ?? this.jobAddTime
+      ..jobUpdateTime = jobUpdateTime ?? this.jobUpdateTime
+      ..jobIndustryId = jobIndustryId ?? this.jobIndustryId
+      ..jobIndustryName = jobIndustryName ?? this.jobIndustryName
+      ..jobPeopleSex = jobPeopleSex ?? this.jobPeopleSex
+      ..jobPeopleLanguage = jobPeopleLanguage ?? this.jobPeopleLanguage
+      ..jobPeopleNationality = jobPeopleNationality ?? this.jobPeopleNationality
+      ..jobPeopleAge = jobPeopleAge ?? this.jobPeopleAge
+      ..jobLatitude = jobLatitude ?? this.jobLatitude
+      ..jobLongitude = jobLongitude ?? this.jobLongitude
+      ..jobRequirements = jobRequirements ?? this.jobRequirements
+      ..jobGeolocation = jobGeolocation ?? this.jobGeolocation
+      ..jobZip = jobZip ?? this.jobZip
+      ..jobStatus = jobStatus ?? this.jobStatus
+      ..jobIsNotify = jobIsNotify ?? this.jobIsNotify
+      ..recipientId = recipientId ?? this.recipientId
+      ..exportSchedulesPdf = exportSchedulesPdf ?? this.exportSchedulesPdf
+      ..employerStatus = employerStatus ?? this.employerStatus
+      ..confirmSignature = confirmSignature ?? this.confirmSignature
+      ..confirmTime = confirmTime ?? this.confirmTime
+      ..employementStatus = employementStatus ?? this.employementStatus
+      ..foodCertificateRequired = foodCertificateRequired ??
+          this.foodCertificateRequired
+      ..rsaCertificate = rsaCertificate ?? this.rsaCertificate
+      ..foodHandler = foodHandler ?? this.foodHandler
+      ..topping = topping ?? this.topping
+      ..toppingAt = toppingAt ?? this.toppingAt
+      ..jobIsNotifyThree = jobIsNotifyThree ?? this.jobIsNotifyThree
+      ..whatsApp = whatsApp ?? this.whatsApp
+      ..source = source ?? this.source
+      ..jobBreakHours = jobBreakHours ?? this.jobBreakHours
+      ..hotelJobId = hotelJobId ?? this.hotelJobId
+      ..revisedDate = revisedDate ?? this.revisedDate
+      ..typhoidVaccine = typhoidVaccine ?? this.typhoidVaccine
+      ..hide = hide ?? this.hide
+      ..checkStatus = checkStatus ?? this.checkStatus
+      ..checkDate = checkDate ?? this.checkDate
+      ..jobUnit = jobUnit ?? this.jobUnit
+      ..coDepartmentId = coDepartmentId ?? this.coDepartmentId
+      ..jobInstantStatus = jobInstantStatus ?? this.jobInstantStatus
+      ..serviceType = serviceType ?? this.serviceType
+      ..agencyRate = agencyRate ?? this.agencyRate
+      ..jobCertificate = jobCertificate ?? this.jobCertificate
+      ..jobVehicle = jobVehicle ?? this.jobVehicle
+      ..challenge25 = challenge25 ?? this.challenge25
+      ..toppingAdminId = toppingAdminId ?? this.toppingAdminId
+      ..sourceType = sourceType ?? this.sourceType
+      ..agencyId = agencyId ?? this.agencyId
+      ..agencyName = agencyName ?? this.agencyName
+      ..video = video ?? this.video
+      ..addBy = addBy ?? this.addBy
+      ..videoCover = videoCover ?? this.videoCover
+      ..templateId = templateId ?? this.templateId
+      ..client = client ?? this.client
+      ..otherImage = otherImage ?? this.otherImage
+      ..otherDocument = otherDocument ?? this.otherDocument
+      ..videoText = videoText ?? this.videoText;
+  }
+}
+
+UkJobListDetailDepartmentList $UkJobListDetailDepartmentListFromJson(
+    Map<String, dynamic> json) {
+  final UkJobListDetailDepartmentList ukJobListDetailDepartmentList = UkJobListDetailDepartmentList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    ukJobListDetailDepartmentList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    ukJobListDetailDepartmentList.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    ukJobListDetailDepartmentList.selected = selected;
+  }
+  return ukJobListDetailDepartmentList;
+}
+
+Map<String, dynamic> $UkJobListDetailDepartmentListToJson(
+    UkJobListDetailDepartmentList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension UkJobListDetailDepartmentListExtension on UkJobListDetailDepartmentList {
+  UkJobListDetailDepartmentList copyWith({
+    int? value,
+    String? txt,
+    String? selected,
+  }) {
+    return UkJobListDetailDepartmentList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected;
+  }
+}
+
+UkJobListDetailCertificateList $UkJobListDetailCertificateListFromJson(
+    Map<String, dynamic> json) {
+  final UkJobListDetailCertificateList ukJobListDetailCertificateList = UkJobListDetailCertificateList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    ukJobListDetailCertificateList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    ukJobListDetailCertificateList.txt = txt;
+  }
+  final String? checked = jsonConvert.convert<String>(json['checked']);
+  if (checked != null) {
+    ukJobListDetailCertificateList.checked = checked;
+  }
+  return ukJobListDetailCertificateList;
+}
+
+Map<String, dynamic> $UkJobListDetailCertificateListToJson(
+    UkJobListDetailCertificateList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['checked'] = entity.checked;
+  return data;
+}
+
+extension UkJobListDetailCertificateListExtension on UkJobListDetailCertificateList {
+  UkJobListDetailCertificateList copyWith({
+    int? value,
+    String? txt,
+    String? checked,
+  }) {
+    return UkJobListDetailCertificateList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..checked = checked ?? this.checked;
+  }
+}
+
+UkJobListDetailVehicleList $UkJobListDetailVehicleListFromJson(
+    Map<String, dynamic> json) {
+  final UkJobListDetailVehicleList ukJobListDetailVehicleList = UkJobListDetailVehicleList();
+  final String? value = jsonConvert.convert<String>(json['value']);
+  if (value != null) {
+    ukJobListDetailVehicleList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    ukJobListDetailVehicleList.txt = txt;
+  }
+  final String? checked = jsonConvert.convert<String>(json['checked']);
+  if (checked != null) {
+    ukJobListDetailVehicleList.checked = checked;
+  }
+  return ukJobListDetailVehicleList;
+}
+
+Map<String, dynamic> $UkJobListDetailVehicleListToJson(
+    UkJobListDetailVehicleList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['checked'] = entity.checked;
+  return data;
+}
+
+extension UkJobListDetailVehicleListExtension on UkJobListDetailVehicleList {
+  UkJobListDetailVehicleList copyWith({
+    String? value,
+    String? txt,
+    String? checked,
+  }) {
+    return UkJobListDetailVehicleList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..checked = checked ?? this.checked;
+  }
+}
+
+UkJobListDetailChallenge25List $UkJobListDetailChallenge25ListFromJson(
+    Map<String, dynamic> json) {
+  final UkJobListDetailChallenge25List ukJobListDetailChallenge25List = UkJobListDetailChallenge25List();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    ukJobListDetailChallenge25List.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    ukJobListDetailChallenge25List.txt = txt;
+  }
+  final String? checked = jsonConvert.convert<String>(json['checked']);
+  if (checked != null) {
+    ukJobListDetailChallenge25List.checked = checked;
+  }
+  return ukJobListDetailChallenge25List;
+}
+
+Map<String, dynamic> $UkJobListDetailChallenge25ListToJson(
+    UkJobListDetailChallenge25List entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['checked'] = entity.checked;
+  return data;
+}
+
+extension UkJobListDetailChallenge25ListExtension on UkJobListDetailChallenge25List {
+  UkJobListDetailChallenge25List copyWith({
+    int? value,
+    String? txt,
+    String? checked,
+  }) {
+    return UkJobListDetailChallenge25List()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..checked = checked ?? this.checked;
+  }
+}

+ 18 - 4
packages/cs_domain/lib/generated/json/uk_staff_detail_entity.g.dart

@@ -69,8 +69,19 @@ UkStaffDetailEntity $UkStaffDetailEntityFromJson(Map<String, dynamic> json) {
   if (challenge25 != null) {
   if (challenge25 != null) {
     ukStaffDetailEntity.challenge25 = challenge25;
     ukStaffDetailEntity.challenge25 = challenge25;
   }
   }
-  final List<UkStaffDetailCertificates>? certificates = (json['certificates'] as List<dynamic>?)?.map(
-          (e) => jsonConvert.convert<UkStaffDetailCertificates>(e) as UkStaffDetailCertificates).toList();
+  final List<String>? certtypeList = (json['certtype_list'] as List<dynamic>?)
+      ?.map(
+          (e) => jsonConvert.convert<String>(e) as String)
+      .toList();
+  if (certtypeList != null) {
+    ukStaffDetailEntity.certtypeList = certtypeList;
+  }
+  final List<
+      UkStaffDetailCertificates>? certificates = (json['certificates'] as List<
+      dynamic>?)?.map(
+          (e) =>
+      jsonConvert.convert<UkStaffDetailCertificates>(
+          e) as UkStaffDetailCertificates).toList();
   if (certificates != null) {
   if (certificates != null) {
     ukStaffDetailEntity.certificates = certificates;
     ukStaffDetailEntity.certificates = certificates;
   }
   }
@@ -103,6 +114,7 @@ Map<String, dynamic> $UkStaffDetailEntityToJson(UkStaffDetailEntity entity) {
   data['emer_name2'] = entity.emerName2;
   data['emer_name2'] = entity.emerName2;
   data['emer_phone2'] = entity.emerPhone2;
   data['emer_phone2'] = entity.emerPhone2;
   data['challenge_25'] = entity.challenge25;
   data['challenge_25'] = entity.challenge25;
+  data['certtype_list'] = entity.certtypeList;
   data['certificates'] = entity.certificates?.map((v) => v.toJson()).toList();
   data['certificates'] = entity.certificates?.map((v) => v.toJson()).toList();
   data['rem_num'] = entity.remNum;
   data['rem_num'] = entity.remNum;
   data['rem_rate'] = entity.remRate;
   data['rem_rate'] = entity.remRate;
@@ -127,6 +139,7 @@ extension UkStaffDetailEntityExtension on UkStaffDetailEntity {
     String? emerName2,
     String? emerName2,
     List<String>? emerPhone2,
     List<String>? emerPhone2,
     int? challenge25,
     int? challenge25,
+    List<String>? certtypeList,
     List<UkStaffDetailCertificates>? certificates,
     List<UkStaffDetailCertificates>? certificates,
     int? remNum,
     int? remNum,
     int? remRate,
     int? remRate,
@@ -148,6 +161,7 @@ extension UkStaffDetailEntityExtension on UkStaffDetailEntity {
       ..emerName2 = emerName2 ?? this.emerName2
       ..emerName2 = emerName2 ?? this.emerName2
       ..emerPhone2 = emerPhone2 ?? this.emerPhone2
       ..emerPhone2 = emerPhone2 ?? this.emerPhone2
       ..challenge25 = challenge25 ?? this.challenge25
       ..challenge25 = challenge25 ?? this.challenge25
+      ..certtypeList = certtypeList ?? this.certtypeList
       ..certificates = certificates ?? this.certificates
       ..certificates = certificates ?? this.certificates
       ..remNum = remNum ?? this.remNum
       ..remNum = remNum ?? this.remNum
       ..remRate = remRate ?? this.remRate;
       ..remRate = remRate ?? this.remRate;
@@ -189,7 +203,7 @@ UkStaffDetailCertificates $UkStaffDetailCertificatesFromJson(Map<String, dynamic
   if (rejectReason != null) {
   if (rejectReason != null) {
     ukStaffDetailCertificates.rejectReason = rejectReason;
     ukStaffDetailCertificates.rejectReason = rejectReason;
   }
   }
-  final dynamic issueDate = json['issue_date'];
+  final String? issueDate = jsonConvert.convert<String>(json['issue_date']);
   if (issueDate != null) {
   if (issueDate != null) {
     ukStaffDetailCertificates.issueDate = issueDate;
     ukStaffDetailCertificates.issueDate = issueDate;
   }
   }
@@ -225,7 +239,7 @@ extension UkStaffDetailCertificatesExtension on UkStaffDetailCertificates {
     String? statusColor,
     String? statusColor,
     int? statusCode,
     int? statusCode,
     String? rejectReason,
     String? rejectReason,
-    dynamic issueDate,
+    String? issueDate,
     String? expiryDate,
     String? expiryDate,
   }) {
   }) {
     return UkStaffDetailCertificates()
     return UkStaffDetailCertificates()

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

@@ -14,6 +14,7 @@ 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_applied_staff_list_entity.dart';
 import '../entity/response/uk_job_list_applied_staff_search_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_list_applied_staff_selectoptions_entity.dart';
+import '../entity/response/uk_job_list_detail_entity.dart';
 import '../entity/response/uk_job_template_detail_by_select_title_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_report_outlet_entity.dart';
 import '../entity/response/uk_staff_detail_entity.dart';
 import '../entity/response/uk_staff_detail_entity.dart';
@@ -348,6 +349,34 @@ class UKJobRepository extends GetxService {
   }
   }
 
 
   // job-list ------------
   // job-list ------------
+  /// 工作列表的详情
+  Future<HttpResult<UkJobListDetailEntity>> fetchJobListDetail(
+      String? jobId, {
+        CancelToken? cancelToken,
+      }) async {
+    //参数
+    Map<String, String> params = {};
+    params['job_id'] = jobId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiJobListDetailUk,
+      params: params,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = UkJobListDetailEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<UkJobListDetailEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+
   /// 工作中已申请的成员列表
   /// 工作中已申请的成员列表
   Future<HttpResult<UkJobAppliedStaffListEntity>> fetchJobAppliedStaffs(
   Future<HttpResult<UkJobAppliedStaffListEntity>> fetchJobAppliedStaffs(
       String? jobId,
       String? jobId,

+ 13 - 3
packages/cs_plugin_platform/lib/http/http_provider.dart

@@ -184,6 +184,9 @@ class HttpProvider {
       }
       }
     } on DioException catch (e) {
     } on DioException catch (e) {
       Log.e("HttpProvider - DioException:$e  其他错误Error:${e.error.toString()}");
       Log.e("HttpProvider - DioException:$e  其他错误Error:${e.error.toString()}");
+      Log.e("444  ${e.response.toString()}");
+      Log.e("5455  ${e.message.toString()}");
+      Log.e("5  ${e.type}");
       if (e.response != null) {
       if (e.response != null) {
         // 如果其他的Http网络请求的Code的处理
         // 如果其他的Http网络请求的Code的处理
         Log.d("网络请求错误,data:${e.response?.data}");
         Log.d("网络请求错误,data:${e.response?.data}");
@@ -201,10 +204,17 @@ class HttpProvider {
       } else if (e.type == DioExceptionType.unknown) {
       } else if (e.type == DioExceptionType.unknown) {
         //未知错误中尝试打印具体的错误信息
         //未知错误中尝试打印具体的错误信息
         if (e.error != null) {
         if (e.error != null) {
-          if (e.error.toString().contains("HandshakeException")) {
+          String errorString = e.error.toString();
+          // 检查是否为 Connection reset by peer 错误
+          if (errorString.contains("Connection reset by peer") ||
+              errorString.contains("ECONNRESET")) {
+            return HttpResult(isSuccess: false, errorMsg: "网络连接错误,请稍后重试");
+          }
+          else if (errorString.contains("HandshakeException")) {
             return HttpResult(isSuccess: false, errorMsg: "网络连接错误,请检查网络连接");
             return HttpResult(isSuccess: false, errorMsg: "网络连接错误,请检查网络连接");
-          } else {
-            return HttpResult(isSuccess: false, errorMsg: e.error.toString()); //这里打印的就是英文错误了,没有格式化
+          }
+          else {
+            return HttpResult(isSuccess: false, errorMsg: errorString); //这里打印的就是英文错误了,没有格式化
           }
           }
         } else {
         } else {
           return HttpResult(isSuccess: false, errorMsg: "网络请求出现未知错误");
           return HttpResult(isSuccess: false, errorMsg: "网络请求出现未知错误");

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

@@ -101,6 +101,7 @@ const Map<String, String> en_US = {
   'No. of Staff': 'No. of Staff',
   'No. of Staff': 'No. of Staff',
   'Enter No. of Staff': 'Enter No. of Staff',
   'Enter No. of Staff': 'Enter No. of Staff',
   'Enter Amount': 'Enter Amount',
   'Enter Amount': 'Enter Amount',
+  'Enter Hour Rate': 'Enter Hour Rate',
   'Choose Employment Type': 'Choose Employment Type',
   'Choose Employment Type': 'Choose Employment Type',
   'Choose Start Date': 'Choose Start Date',
   'Choose Start Date': 'Choose Start Date',
   'Choose End Date': 'Choose End Date',
   'Choose End Date': 'Choose End Date',
@@ -378,6 +379,10 @@ const Map<String, String> en_US = {
   'Choose Industry': 'Choose Industry',
   'Choose Industry': 'Choose Industry',
   'Choose JobTitle': 'Choose JobTitle',
   'Choose JobTitle': 'Choose JobTitle',
   'Location': 'Location',
   'Location': 'Location',
+  'Client Name': 'Name',
+  'Requirements': 'Requirements',
+  'Hour Rate': 'Hour Rate',
+  'Hide': 'Hide',
 
 
   //插件的国际化
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',
   'Pull to refresh': 'Pull to refresh',

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

@@ -96,6 +96,7 @@ const Map<String, String> zh_CN = {
   'No. of Staff': '需要的人员数量',
   'No. of Staff': '需要的人员数量',
   'Enter No. of Staff': '请输入需要的人员数量',
   'Enter No. of Staff': '请输入需要的人员数量',
   'Enter Amount': '输入金额',
   'Enter Amount': '输入金额',
+  'Enter Hour Rate': '输入金额',
   'Choose Employment Type': '选择类型',
   'Choose Employment Type': '选择类型',
   'Choose Start Date': '请选择开始日期',
   'Choose Start Date': '请选择开始日期',
   'Choose End Date': '请选择结束日期',
   'Choose End Date': '请选择结束日期',
@@ -379,6 +380,10 @@ const Map<String, String> zh_CN = {
   'Choose Industry': '选择行业',
   'Choose Industry': '选择行业',
   'Choose JobTitle': '选择职位',
   'Choose JobTitle': '选择职位',
   'Location': '地点',
   'Location': '地点',
+  'Client Name': '客户名称',
+  'Requirements': '要求',
+  'Hour Rate': '时薪',
+  'Hide': '隐藏',
 
 
   //插件的国际化
   //插件的国际化
   'Pull to refresh': '下拉刷新',
   'Pull to refresh': '下拉刷新',