Selaa lähdekoodia

工作列表的编辑与操作

liukai 2 viikkoa sitten
vanhempi
commit
afa9099a04

+ 4 - 1
packages/cpt_th/lib/modules/job_er/job_list_er/job_list_er_controller.dart

@@ -1,3 +1,4 @@
+import 'package:cpt_th/modules/labour_er/labour_request_er_add/labour_request_er_add_page.dart';
 import 'package:domain/entity/response/job_list_e_r_option_entity.dart';
 import 'package:domain/entity/response/labour_list_e_r_entity.dart';
 import 'package:domain/repository/th_er_repository.dart';
@@ -200,7 +201,9 @@ class JobListController extends GetxController with DioCancelableMixin {
 
   /// 去编辑页面
   void gotoJobEditPage(LabourListERRows data) {
-    ToastEngine.show("去编辑页面");
+    LabourRequestERAddPage.startInstance(1, data.jobId, (result){
+      refreshController.callRefresh();
+    });
   }
 
   /// 去已申请的成员列表

+ 90 - 81
packages/cpt_th/lib/modules/labour_er/labour_request_er_add/labour_request_er_add_controller.dart

@@ -21,47 +21,63 @@ class LabourRequestERAddController extends GetxController with DioCancelableMixi
 
   // 获取添加选项数据
   void fetchLabourRequestEditDetail() async {
-    var result = await _erRepository.fetchERLabourRequestAddOption(
-      cancelToken: cancelToken,
-    );
-
-    LoadingEngine.dismiss();
-
-    if (result.isSuccess) {
-      state.editDetailEntity = result.data;
-      var needMallController = state.formData['need_male']!['controller'];
-      var needFemaleController = state.formData['need_female']!['controller'];
-      var needNumController = state.formData['need_no']!['controller'];
-      var remarkController = state.formData['remark']!['controller'];
-
-      if (state.editDetailEntity?.sexLimit == 1) {
-        state.genderOptionType = 1;
-        needMallController.text = state.editDetailEntity?.maleLimit?.toString();
-        needFemaleController.text = state.editDetailEntity?.femaleLimit?.toString();
-        needNumController.text = '';
+    if (Utils.isNotEmpty(state.jobId)) {
+      //编辑
+      var result = await _erRepository.fetchERJobListDetail(
+        jobId: state.jobId!,
+        cancelToken: cancelToken,
+      );
+
+      if (result.isSuccess) {
+        state.editDetailEntity = result.data;
+        var needMallController = state.formData['need_male']!['controller'];
+        var needFemaleController = state.formData['need_female']!['controller'];
+        var needNumController = state.formData['need_no']!['controller'];
+        var remarkController = state.formData['remark']!['controller'];
+        var eventNameController = state.formData['event_name']!['controller'];
+        var eventTypeController = state.formData['event_type']!['controller'];
+
+        if (state.editDetailEntity?.job?.sexLimit == '1') {
+          state.genderOptionType = 1;
+          needMallController.text = state.editDetailEntity?.job?.maleLimit?.toString();
+          needFemaleController.text = state.editDetailEntity?.job?.femaleLimit?.toString();
+          needNumController.text = '';
+        } else {
+          state.genderOptionType = 0;
+          needMallController.text = '';
+          needFemaleController.text = '';
+          needNumController.text = state.editDetailEntity?.job?.hiringNum?.toString();
+        }
+
+        state.selectTitleName = state.editDetailEntity?.job?.jobTitle;
+        state.selectTitleId = state.editDetailEntity?.job?.jobTitleId;
+
+        state.selectOutletName = state.editDetailEntity?.job?.outletName;
+        state.selectOutletId = state.editDetailEntity?.job?.outletId;
+
+        state.selectedStartTime = DateTimeUtils.getDateTime(state.editDetailEntity!.startTime!);
+        state.selectedEndTime = DateTimeUtils.getDateTime(state.editDetailEntity!.endTime!);
+
+        remarkController.text = state.editDetailEntity?.job?.description ?? '';
+        eventNameController.text = state.editDetailEntity?.job?.eventName ?? '';
+        eventTypeController.text = state.editDetailEntity?.job?.eventType ?? '';
       } else {
-        state.genderOptionType = 0;
-        needMallController.text = '';
-        needFemaleController.text = '';
-        needNumController.text = state.editDetailEntity?.hiringNum?.toString();
+        ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
       }
-
-      // remarkController.text = state.editDetailEntity?.description ?? '';
-      //
-      // state.selectedStartTime = DateTimeUtils.getDateTime(state.editDetailEntity!.startTime!);
-      // state.selectedEndTime = DateTimeUtils.getDateTime(state.editDetailEntity!.endTime!);
-      //
-      // state.selectedOutlet = state.editDetailEntity?.outletName;
-      // state.selectedOutletId = state.editDetailEntity?.labReq?.outletId?.toString();
-      //
-      // state.selectRequestTypeId = state.editDetailEntity?.labReq?.requestType?.toString();
-      // state.selectPositionId = state.editDetailEntity?.labReq?.positionId?.toString();
-      // state.selectPositionName = state.editDetailEntity?.labReq?.positionName?.toString();
-
-      update();
     } else {
-      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      //新增
+      var result = await _erRepository.fetchERLabourRequestAddOption(
+        cancelToken: cancelToken,
+      );
+
+      if (result.isSuccess) {
+        state.editDetailEntity = result.data;
+      } else {
+        ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      }
     }
+
+    update();
   }
 
   @override
@@ -72,10 +88,6 @@ class LabourRequestERAddController extends GetxController with DioCancelableMixi
 
   //选择开始时间
   void pickStartTime() {
-    // if (state.editDetailEntity == null) {
-    //   return;
-    // }
-
     DatePickerUtil.showCupertinoDatePicker(
       selectedDateTime: state.selectedStartTime,
       mode: CupertinoDatePickerMode.dateAndTime,
@@ -89,10 +101,6 @@ class LabourRequestERAddController extends GetxController with DioCancelableMixi
 
   // 选择结束时间
   void pickEndTime() {
-    if (state.editDetailEntity == null) {
-      return;
-    }
-
     DatePickerUtil.showCupertinoDatePicker(
       selectedDateTime: state.selectedEndTime ?? state.selectedStartTime,
       mode: CupertinoDatePickerMode.dateAndTime,
@@ -153,48 +161,49 @@ class LabourRequestERAddController extends GetxController with DioCancelableMixi
     }
 
     HttpResult result;
-    // if (state.pageType == 1) {
-    //   result = await _labourRepository.editLabourRequestSubmit(
-    //     requestId: state.requestId,
-    //     startTime: DateTimeUtils.formatDate(state.selectedStartTime),
-    //     endTime: DateTimeUtils.formatDate(state.selectedEndTime),
-    //     outletId: state.selectedOutletId,
-    //     sexLimit: state.genderOptionType,
-    //     maleLimit: maleNo,
-    //     femaleLimit: femaleNo,
-    //     needNum: needNo,
-    //     requestType: state.selectRequestTypeId,
-    //     positionId: state.selectPositionId,
-    //     remark: remark,
-    //     cancelToken: cancelToken,
-    //   );
-    // } else {
-
-    //新增
-    result = await _erRepository.addLabourRequestERSubmit(
-      jobTitleId: state.selectTitleId!,
-      startTime: DateTimeUtils.formatDate(state.selectedStartTime),
-      endTime: DateTimeUtils.formatDate(state.selectedEndTime),
-      outletId: state.selectOutletId!,
-      repeatStart: DateTimeUtils.formatDate(state.selectedRepeatStartTime,format: 'yyyy-MM-dd') ,
-      repeatEnd: DateTimeUtils.formatDate(state.selectedRepeatEndTime,format: 'yyyy-MM-dd'),
-      sexLimit: state.genderOptionType.toString(),
-      maleLimit: maleNo,
-      femaleLimit: femaleNo,
-      needNum: needNo,
-      eventName: eventName,
-      eventType: evenType,
-      remark: remark,
-      cancelToken: cancelToken,
-    );
-    // }
+    if (state.pageType == 1 && state.jobId != null) {
+      //编辑
+      result = await _erRepository.editLabourRequestERSubmit(
+        jobId: state.jobId!,
+        jobTitleId: state.selectTitleId!,
+        startTime: DateTimeUtils.formatDate(state.selectedStartTime),
+        endTime: DateTimeUtils.formatDate(state.selectedEndTime),
+        outletId: state.selectOutletId!,
+        sexLimit: state.genderOptionType.toString(),
+        maleLimit: maleNo,
+        femaleLimit: femaleNo,
+        needNum: needNo,
+        eventName: eventName,
+        eventType: evenType,
+        remark: remark,
+        cancelToken: cancelToken,
+      );
+    } else {
+      //新增
+      result = await _erRepository.addLabourRequestERSubmit(
+        jobTitleId: state.selectTitleId!,
+        startTime: DateTimeUtils.formatDate(state.selectedStartTime),
+        endTime: DateTimeUtils.formatDate(state.selectedEndTime),
+        outletId: state.selectOutletId!,
+        repeatStart: DateTimeUtils.formatDate(state.selectedRepeatStartTime, format: 'yyyy-MM-dd'),
+        repeatEnd: DateTimeUtils.formatDate(state.selectedRepeatEndTime, format: 'yyyy-MM-dd'),
+        sexLimit: state.genderOptionType.toString(),
+        maleLimit: maleNo,
+        femaleLimit: femaleNo,
+        needNum: needNo,
+        eventName: eventName,
+        eventType: evenType,
+        remark: remark,
+        cancelToken: cancelToken,
+      );
+    }
 
     //处理数据
     if (result.isSuccess) {
       NotifyEngine.showSuccess("Successful".tr);
 
       //根据类型刷新
-      state.cb?.call(state.requestId);
+      state.cb?.call(state.jobId);
 
       Get.back();
     } else {

+ 86 - 78
packages/cpt_th/lib/modules/labour_er/labour_request_er_add/labour_request_er_add_page.dart

@@ -49,7 +49,7 @@ class _LabourRequestAddState extends BaseState<LabourRequestERAddPage, LabourReq
     super.initState();
     state = controller.state;
     state.pageType = Get.arguments['pageType'];
-    state.requestId = Get.arguments['appliedId'];
+    state.jobId = Get.arguments['appliedId'];
     state.cb = Get.arguments['cb'] as void Function(dynamic)?;
   }
 
@@ -210,85 +210,93 @@ class _LabourRequestAddState extends BaseState<LabourRequestERAddPage, LabourReq
                       ).marginOnly(top: 10),
 
                       //选择重复时间
-                      MyTextView("Repeat".tr, fontSize: 15, textColor: Colors.white, isFontRegular: true, marginTop: 15),
+                      Visibility(
+                        visible: state.pageType == 0,
+                        child: MyTextView("Repeat".tr, fontSize: 15, textColor: Colors.white, isFontRegular: true, marginTop: 15),
+                      ),
 
-                      Row(
-                        mainAxisSize: MainAxisSize.max,
-                        crossAxisAlignment: CrossAxisAlignment.center,
-                        mainAxisAlignment: MainAxisAlignment.start,
-                        children: [
-                          //选择工作开始时间
-                          Expanded(
-                            child: Container(
-                              padding: const EdgeInsets.only(left: 16, right: 10),
-                              height: 45,
-                              decoration: BoxDecoration(
-                                color: const Color(0xFF4DCFF6).withOpacity(state.pageType == 2 ? 0.5 : 0.2),
-                                borderRadius: const BorderRadius.all(Radius.circular(5)),
-                              ),
-                              child: Row(
-                                mainAxisSize: MainAxisSize.max,
-                                crossAxisAlignment: CrossAxisAlignment.center,
-                                mainAxisAlignment: MainAxisAlignment.start,
-                                children: [
-                                  MyTextView(
-                                    state.selectedRepeatStartTime == null ? "" : DateTimeUtils.formatDate(state.selectedRepeatStartTime, format: "yyyy-MM-dd"),
-                                    fontSize: 14,
-                                    hint: "Repeat Start Time".tr,
-                                    textHintColor: ColorConstants.textGrayAECAE5,
-                                    isFontMedium: true,
-                                    textColor: ColorConstants.white,
-                                  ).expanded(),
-                                  //下拉选图标
-                                  Visibility(
-                                    visible: state.pageType != 2,
-                                    child: const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
-                                  ),
-                                ],
-                              ),
-                            ).onTap(() {
-                              FocusScope.of(context).unfocus();
-                              if (state.pageType != 2) controller.pickRepeatStartTime();
-                            }),
-                          ),
+                      Visibility(
+                        visible: state.pageType == 0,
+                        child: Row(
+                          mainAxisSize: MainAxisSize.max,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          mainAxisAlignment: MainAxisAlignment.start,
+                          children: [
+                            //开始时间
+                            Expanded(
+                              child: Container(
+                                padding: const EdgeInsets.only(left: 16, right: 10),
+                                height: 45,
+                                decoration: BoxDecoration(
+                                  color: const Color(0xFF4DCFF6).withOpacity(state.pageType == 2 ? 0.5 : 0.2),
+                                  borderRadius: const BorderRadius.all(Radius.circular(5)),
+                                ),
+                                child: Row(
+                                  mainAxisSize: MainAxisSize.max,
+                                  crossAxisAlignment: CrossAxisAlignment.center,
+                                  mainAxisAlignment: MainAxisAlignment.start,
+                                  children: [
+                                    MyTextView(
+                                      state.selectedRepeatStartTime == null
+                                          ? ""
+                                          : DateTimeUtils.formatDate(state.selectedRepeatStartTime, format: "yyyy-MM-dd"),
+                                      fontSize: 14,
+                                      hint: "Repeat Start Time".tr,
+                                      textHintColor: ColorConstants.textGrayAECAE5,
+                                      isFontMedium: true,
+                                      textColor: ColorConstants.white,
+                                    ).expanded(),
+                                    //下拉选图标
+                                    Visibility(
+                                      visible: state.pageType != 2,
+                                      child: const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                                    ),
+                                  ],
+                                ),
+                              ).onTap(() {
+                                FocusScope.of(context).unfocus();
+                                if (state.pageType != 2) controller.pickRepeatStartTime();
+                              }),
+                            ),
 
-                          //选择工作结束时间
-                          Expanded(
-                            child: Container(
-                              padding: const EdgeInsets.only(left: 16, right: 10),
-                              margin: const EdgeInsets.only(left: 10),
-                              height: 45,
-                              decoration: BoxDecoration(
-                                color: const Color(0xFF4DCFF6).withOpacity(state.pageType == 2 ? 0.5 : 0.2),
-                                borderRadius: const BorderRadius.all(Radius.circular(5)),
-                              ),
-                              child: Row(
-                                mainAxisSize: MainAxisSize.max,
-                                crossAxisAlignment: CrossAxisAlignment.center,
-                                mainAxisAlignment: MainAxisAlignment.start,
-                                children: [
-                                  MyTextView(
-                                    state.selectedRepeatEndTime == null ? "" : DateTimeUtils.formatDate(state.selectedRepeatEndTime, format: "yyyy-MM-dd"),
-                                    fontSize: 14,
-                                    hint: "Repeat End Time".tr,
-                                    textHintColor: ColorConstants.textGrayAECAE5,
-                                    isFontMedium: true,
-                                    textColor: ColorConstants.white,
-                                  ).expanded(),
-                                  //下拉选图标
-                                  Visibility(
-                                    visible: state.pageType != 2,
-                                    child: const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
-                                  ),
-                                ],
-                              ),
-                            ).onTap(() {
-                              FocusScope.of(context).unfocus();
-                              if (state.pageType != 2) controller.pickRepeatEndTime();
-                            }),
-                          ),
-                        ],
-                      ).marginOnly(top: 10),
+                            //结束时间
+                            Expanded(
+                              child: Container(
+                                padding: const EdgeInsets.only(left: 16, right: 10),
+                                margin: const EdgeInsets.only(left: 10),
+                                height: 45,
+                                decoration: BoxDecoration(
+                                  color: const Color(0xFF4DCFF6).withOpacity(state.pageType == 2 ? 0.5 : 0.2),
+                                  borderRadius: const BorderRadius.all(Radius.circular(5)),
+                                ),
+                                child: Row(
+                                  mainAxisSize: MainAxisSize.max,
+                                  crossAxisAlignment: CrossAxisAlignment.center,
+                                  mainAxisAlignment: MainAxisAlignment.start,
+                                  children: [
+                                    MyTextView(
+                                      state.selectedRepeatEndTime == null ? "" : DateTimeUtils.formatDate(state.selectedRepeatEndTime, format: "yyyy-MM-dd"),
+                                      fontSize: 14,
+                                      hint: "Repeat End Time".tr,
+                                      textHintColor: ColorConstants.textGrayAECAE5,
+                                      isFontMedium: true,
+                                      textColor: ColorConstants.white,
+                                    ).expanded(),
+                                    //下拉选图标
+                                    Visibility(
+                                      visible: state.pageType != 2,
+                                      child: const MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                                    ),
+                                  ],
+                                ),
+                              ).onTap(() {
+                                FocusScope.of(context).unfocus();
+                                if (state.pageType != 2) controller.pickRepeatEndTime();
+                              }),
+                            ),
+                          ],
+                        ).marginOnly(top: 10),
+                      ),
 
                       //工作选择部门
                       FormRequireText(

+ 3 - 2
packages/cpt_th/lib/modules/labour_er/labour_request_er_add/labour_request_er_add_state.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/response/job_list_e_r_detail_entity.dart';
 import 'package:domain/entity/response/labour_request_e_r_option_entity.dart';
 import 'package:flutter/material.dart';
 import 'package:plugin_basic/basic_export.dart';
@@ -51,13 +52,13 @@ class LabourRequestERAddState {
   };
 
   int pageType = 0;  //pageType 0新增  1是编辑  2是详情
-  String? requestId;  //编辑和详情需要用到ID
+  String? jobId;  //编辑和详情需要用到ID
   void Function(dynamic value)? cb;
 
   List<String> genderOptions = ["Gender Unlimited".tr, "Gender Limited".tr];
   int genderOptionType = 0;  //使用哪一种类型限制
 
-  LabourRequestEROptionEntity? editDetailEntity;
+  JobListERDetailEntity? editDetailEntity;
 
   DateTime? selectedStartTime;
   DateTime? selectedEndTime;

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

@@ -544,4 +544,9 @@ class ApiConstants {
   //ER 工作列表删除
   static const apiERJobListDeleteTH = "/index.php/api/er/job/action";
 
+  //ER 工作列表详情
+  static const apiERJobListDetailTH = "/index.php/api/er/job/view-edit";
+
+  // ER 的用工请求编辑提交
+  static const apiERLabourRequestEditSubmitTH = "/index.php/api/er/job/edit-submit";
 }

+ 117 - 0
packages/cs_domain/lib/entity/response/job_list_e_r_detail_entity.dart

@@ -0,0 +1,117 @@
+import 'package:domain/entity/response/index_option_entity.dart';
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/job_list_e_r_detail_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/job_list_e_r_detail_entity.g.dart';
+
+@JsonSerializable()
+class JobListERDetailEntity {
+	JobListERDetailJob? job;
+	@JSONField(name: "start_time")
+	String? startTime;
+	@JSONField(name: "end_time")
+	String? endTime;
+
+	@JSONField(name: "title_list")
+	List<IndexOptionEntity> titleList = [];
+	@JSONField(name: "limit_list")
+	List<IndexOptionEntity> limitList = [];
+	@JSONField(name: "outlet_list")
+	List<IndexOptionEntity> outletList = [];
+	String? view;
+
+	JobListERDetailEntity();
+
+	factory JobListERDetailEntity.fromJson(Map<String, dynamic> json) => $JobListERDetailEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobListERDetailEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class JobListERDetailJob {
+	String? id;
+	@JSONField(name: "employer_id")
+	String? employerId;
+	@JSONField(name: "employer_name")
+	String? employerName;
+	@JSONField(name: "e_admin_id")
+	String? eAdminId;
+	@JSONField(name: "yy_job_id")
+	String? yyJobId;
+	@JSONField(name: "source_type")
+	int sourceType = 0;
+	@JSONField(name: "agency_id")
+	String? agencyId;
+	@JSONField(name: "agency_name")
+	String? agencyName;
+	@JSONField(name: "job_title")
+	String? jobTitle;
+	@JSONField(name: "outlet_id")
+	String? outletId;
+	@JSONField(name: "outlet_name")
+	String? outletName;
+	@JSONField(name: "job_date")
+	String? jobDate;
+	@JSONField(name: "start_time")
+	String? startTime;
+	@JSONField(name: "end_time")
+	String? endTime;
+	@JSONField(name: "working_hours")
+	String? workingHours;
+	@JSONField(name: "hourly_rate")
+	String? hourlyRate;
+	@JSONField(name: "hiring_num")
+	String? hiringNum;
+	@JSONField(name: "real_num")
+	String? realNum;
+	int status = 0;
+	String? description;
+	@JSONField(name: "confirm_status")
+	int confirmStatus = 0;
+	@JSONField(name: "created_at")
+	String? createdAt;
+	@JSONField(name: "updated_at")
+	String? updatedAt;
+	@JSONField(name: "deleted_at")
+	String? deletedAt;
+	@JSONField(name: "event_name")
+	String? eventName;
+	@JSONField(name: "event_type")
+	String? eventType;
+	@JSONField(name: "with_typhoid")
+	int withTyphoid = 0;
+	@JSONField(name: "sync_payroll")
+	int syncPayroll = 0;
+	@JSONField(name: "agency_rate")
+	String? agencyRate;
+	@JSONField(name: "request_id")
+	String? requestId;
+	@JSONField(name: "job_title_id")
+	String? jobTitleId;
+	@JSONField(name: "is_ot")
+	int isOt = 0;
+	@JSONField(name: "position_id")
+	String? positionId;
+	@JSONField(name: "sex_limit")
+	String? sexLimit;
+	@JSONField(name: "male_limit")
+	String? maleLimit;
+	@JSONField(name: "female_limit")
+	String? femaleLimit;
+
+	JobListERDetailJob();
+
+	factory JobListERDetailJob.fromJson(Map<String, dynamic> json) => $JobListERDetailJobFromJson(json);
+
+	Map<String, dynamic> toJson() => $JobListERDetailJobToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

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

@@ -37,6 +37,7 @@ import 'package:domain/entity/response/job_list_applied_staff_list_entity.dart';
 import 'package:domain/entity/response/job_list_applied_staff_search_entity.dart';
 import 'package:domain/entity/response/job_list_applied_work_flow_entity.dart';
 import 'package:domain/entity/response/job_list_detail_entity.dart';
+import 'package:domain/entity/response/job_list_e_r_detail_entity.dart';
 import 'package:domain/entity/response/job_list_e_r_option_entity.dart';
 import 'package:domain/entity/response/job_list_edit_index_s_g_entity.dart';
 import 'package:domain/entity/response/job_list_entity.dart';
@@ -408,6 +409,12 @@ class JsonConvert {
     if (<JobListDetailDepartmentList>[] is M) {
       return data.map<JobListDetailDepartmentList>((Map<String, dynamic> e) => JobListDetailDepartmentList.fromJson(e)).toList() as M;
     }
+    if (<JobListERDetailEntity>[] is M) {
+      return data.map<JobListERDetailEntity>((Map<String, dynamic> e) => JobListERDetailEntity.fromJson(e)).toList() as M;
+    }
+    if (<JobListERDetailJob>[] is M) {
+      return data.map<JobListERDetailJob>((Map<String, dynamic> e) => JobListERDetailJob.fromJson(e)).toList() as M;
+    }
     if (<JobListEROptionEntity>[] is M) {
       return data.map<JobListEROptionEntity>((Map<String, dynamic> e) => JobListEROptionEntity.fromJson(e)).toList() as M;
     }
@@ -864,6 +871,8 @@ class JsonConvertClassCollection {
     (JobListAppliedWorkFlowRecords).toString(): JobListAppliedWorkFlowRecords.fromJson,
     (JobListDetailEntity).toString(): JobListDetailEntity.fromJson,
     (JobListDetailDepartmentList).toString(): JobListDetailDepartmentList.fromJson,
+    (JobListERDetailEntity).toString(): JobListERDetailEntity.fromJson,
+    (JobListERDetailJob).toString(): JobListERDetailJob.fromJson,
     (JobListEROptionEntity).toString(): JobListEROptionEntity.fromJson,
     (JobListEROptionFilter).toString(): JobListEROptionFilter.fromJson,
     (JobListEditIndexSGEntity).toString(): JobListEditIndexSGEntity.fromJson,

+ 342 - 0
packages/cs_domain/lib/generated/json/job_list_e_r_detail_entity.g.dart

@@ -0,0 +1,342 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/job_list_e_r_detail_entity.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
+
+
+JobListERDetailEntity $JobListERDetailEntityFromJson(Map<String, dynamic> json) {
+  final JobListERDetailEntity jobListERDetailEntity = JobListERDetailEntity();
+  final JobListERDetailJob? job = jsonConvert.convert<JobListERDetailJob>(json['job']);
+  if (job != null) {
+    jobListERDetailEntity.job = job;
+  }
+  final String? startTime = jsonConvert.convert<String>(json['start_time']);
+  if (startTime != null) {
+    jobListERDetailEntity.startTime = startTime;
+  }
+  final String? endTime = jsonConvert.convert<String>(json['end_time']);
+  if (endTime != null) {
+    jobListERDetailEntity.endTime = endTime;
+  }
+  final List<IndexOptionEntity>? titleList = (json['title_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (titleList != null) {
+    jobListERDetailEntity.titleList = titleList;
+  }
+  final List<IndexOptionEntity>? limitList = (json['limit_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (limitList != null) {
+    jobListERDetailEntity.limitList = limitList;
+  }
+  final List<IndexOptionEntity>? outletList = (json['outlet_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<IndexOptionEntity>(e) as IndexOptionEntity).toList();
+  if (outletList != null) {
+    jobListERDetailEntity.outletList = outletList;
+  }
+  final String? view = jsonConvert.convert<String>(json['view']);
+  if (view != null) {
+    jobListERDetailEntity.view = view;
+  }
+  return jobListERDetailEntity;
+}
+
+Map<String, dynamic> $JobListERDetailEntityToJson(JobListERDetailEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['job'] = entity.job?.toJson();
+  data['start_time'] = entity.startTime;
+  data['end_time'] = entity.endTime;
+  data['title_list'] = entity.titleList.map((v) => v.toJson()).toList();
+  data['limit_list'] = entity.limitList.map((v) => v.toJson()).toList();
+  data['outlet_list'] = entity.outletList.map((v) => v.toJson()).toList();
+  data['view'] = entity.view;
+  return data;
+}
+
+extension JobListERDetailEntityExtension on JobListERDetailEntity {
+  JobListERDetailEntity copyWith({
+    JobListERDetailJob? job,
+    String? startTime,
+    String? endTime,
+    List<IndexOptionEntity>? titleList,
+    List<IndexOptionEntity>? limitList,
+    List<IndexOptionEntity>? outletList,
+    String? view,
+  }) {
+    return JobListERDetailEntity()
+      ..job = job ?? this.job
+      ..startTime = startTime ?? this.startTime
+      ..endTime = endTime ?? this.endTime
+      ..titleList = titleList ?? this.titleList
+      ..limitList = limitList ?? this.limitList
+      ..outletList = outletList ?? this.outletList
+      ..view = view ?? this.view;
+  }
+}
+
+JobListERDetailJob $JobListERDetailJobFromJson(Map<String, dynamic> json) {
+  final JobListERDetailJob jobListERDetailJob = JobListERDetailJob();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    jobListERDetailJob.id = id;
+  }
+  final String? employerId = jsonConvert.convert<String>(json['employer_id']);
+  if (employerId != null) {
+    jobListERDetailJob.employerId = employerId;
+  }
+  final String? employerName = jsonConvert.convert<String>(json['employer_name']);
+  if (employerName != null) {
+    jobListERDetailJob.employerName = employerName;
+  }
+  final String? eAdminId = jsonConvert.convert<String>(json['e_admin_id']);
+  if (eAdminId != null) {
+    jobListERDetailJob.eAdminId = eAdminId;
+  }
+  final String? yyJobId = jsonConvert.convert<String>(json['yy_job_id']);
+  if (yyJobId != null) {
+    jobListERDetailJob.yyJobId = yyJobId;
+  }
+  final int? sourceType = jsonConvert.convert<int>(json['source_type']);
+  if (sourceType != null) {
+    jobListERDetailJob.sourceType = sourceType;
+  }
+  final String? agencyId = jsonConvert.convert<String>(json['agency_id']);
+  if (agencyId != null) {
+    jobListERDetailJob.agencyId = agencyId;
+  }
+  final String? agencyName = jsonConvert.convert<String>(json['agency_name']);
+  if (agencyName != null) {
+    jobListERDetailJob.agencyName = agencyName;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    jobListERDetailJob.jobTitle = jobTitle;
+  }
+  final String? outletId = jsonConvert.convert<String>(json['outlet_id']);
+  if (outletId != null) {
+    jobListERDetailJob.outletId = outletId;
+  }
+  final String? outletName = jsonConvert.convert<String>(json['outlet_name']);
+  if (outletName != null) {
+    jobListERDetailJob.outletName = outletName;
+  }
+  final String? jobDate = jsonConvert.convert<String>(json['job_date']);
+  if (jobDate != null) {
+    jobListERDetailJob.jobDate = jobDate;
+  }
+  final String? startTime = jsonConvert.convert<String>(json['start_time']);
+  if (startTime != null) {
+    jobListERDetailJob.startTime = startTime;
+  }
+  final String? endTime = jsonConvert.convert<String>(json['end_time']);
+  if (endTime != null) {
+    jobListERDetailJob.endTime = endTime;
+  }
+  final String? workingHours = jsonConvert.convert<String>(json['working_hours']);
+  if (workingHours != null) {
+    jobListERDetailJob.workingHours = workingHours;
+  }
+  final String? hourlyRate = jsonConvert.convert<String>(json['hourly_rate']);
+  if (hourlyRate != null) {
+    jobListERDetailJob.hourlyRate = hourlyRate;
+  }
+  final String? hiringNum = jsonConvert.convert<String>(json['hiring_num']);
+  if (hiringNum != null) {
+    jobListERDetailJob.hiringNum = hiringNum;
+  }
+  final String? realNum = jsonConvert.convert<String>(json['real_num']);
+  if (realNum != null) {
+    jobListERDetailJob.realNum = realNum;
+  }
+  final int? status = jsonConvert.convert<int>(json['status']);
+  if (status != null) {
+    jobListERDetailJob.status = status;
+  }
+  final String? description = jsonConvert.convert<String>(json['description']);
+  if (description != null) {
+    jobListERDetailJob.description = description;
+  }
+  final int? confirmStatus = jsonConvert.convert<int>(json['confirm_status']);
+  if (confirmStatus != null) {
+    jobListERDetailJob.confirmStatus = confirmStatus;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    jobListERDetailJob.createdAt = createdAt;
+  }
+  final String? updatedAt = jsonConvert.convert<String>(json['updated_at']);
+  if (updatedAt != null) {
+    jobListERDetailJob.updatedAt = updatedAt;
+  }
+  final String? deletedAt = jsonConvert.convert<String>(json['deleted_at']);
+  if (deletedAt != null) {
+    jobListERDetailJob.deletedAt = deletedAt;
+  }
+  final String? eventName = jsonConvert.convert<String>(json['event_name']);
+  if (eventName != null) {
+    jobListERDetailJob.eventName = eventName;
+  }
+  final String? eventType = jsonConvert.convert<String>(json['event_type']);
+  if (eventType != null) {
+    jobListERDetailJob.eventType = eventType;
+  }
+  final int? withTyphoid = jsonConvert.convert<int>(json['with_typhoid']);
+  if (withTyphoid != null) {
+    jobListERDetailJob.withTyphoid = withTyphoid;
+  }
+  final int? syncPayroll = jsonConvert.convert<int>(json['sync_payroll']);
+  if (syncPayroll != null) {
+    jobListERDetailJob.syncPayroll = syncPayroll;
+  }
+  final String? agencyRate = jsonConvert.convert<String>(json['agency_rate']);
+  if (agencyRate != null) {
+    jobListERDetailJob.agencyRate = agencyRate;
+  }
+  final String? requestId = jsonConvert.convert<String>(json['request_id']);
+  if (requestId != null) {
+    jobListERDetailJob.requestId = requestId;
+  }
+  final String? jobTitleId = jsonConvert.convert<String>(json['job_title_id']);
+  if (jobTitleId != null) {
+    jobListERDetailJob.jobTitleId = jobTitleId;
+  }
+  final int? isOt = jsonConvert.convert<int>(json['is_ot']);
+  if (isOt != null) {
+    jobListERDetailJob.isOt = isOt;
+  }
+  final String? positionId = jsonConvert.convert<String>(json['position_id']);
+  if (positionId != null) {
+    jobListERDetailJob.positionId = positionId;
+  }
+  final String? sexLimit = jsonConvert.convert<String>(json['sex_limit']);
+  if (sexLimit != null) {
+    jobListERDetailJob.sexLimit = sexLimit;
+  }
+  final String? maleLimit = jsonConvert.convert<String>(json['male_limit']);
+  if (maleLimit != null) {
+    jobListERDetailJob.maleLimit = maleLimit;
+  }
+  final String? femaleLimit = jsonConvert.convert<String>(json['female_limit']);
+  if (femaleLimit != null) {
+    jobListERDetailJob.femaleLimit = femaleLimit;
+  }
+  return jobListERDetailJob;
+}
+
+Map<String, dynamic> $JobListERDetailJobToJson(JobListERDetailJob entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['employer_id'] = entity.employerId;
+  data['employer_name'] = entity.employerName;
+  data['e_admin_id'] = entity.eAdminId;
+  data['yy_job_id'] = entity.yyJobId;
+  data['source_type'] = entity.sourceType;
+  data['agency_id'] = entity.agencyId;
+  data['agency_name'] = entity.agencyName;
+  data['job_title'] = entity.jobTitle;
+  data['outlet_id'] = entity.outletId;
+  data['outlet_name'] = entity.outletName;
+  data['job_date'] = entity.jobDate;
+  data['start_time'] = entity.startTime;
+  data['end_time'] = entity.endTime;
+  data['working_hours'] = entity.workingHours;
+  data['hourly_rate'] = entity.hourlyRate;
+  data['hiring_num'] = entity.hiringNum;
+  data['real_num'] = entity.realNum;
+  data['status'] = entity.status;
+  data['description'] = entity.description;
+  data['confirm_status'] = entity.confirmStatus;
+  data['created_at'] = entity.createdAt;
+  data['updated_at'] = entity.updatedAt;
+  data['deleted_at'] = entity.deletedAt;
+  data['event_name'] = entity.eventName;
+  data['event_type'] = entity.eventType;
+  data['with_typhoid'] = entity.withTyphoid;
+  data['sync_payroll'] = entity.syncPayroll;
+  data['agency_rate'] = entity.agencyRate;
+  data['request_id'] = entity.requestId;
+  data['job_title_id'] = entity.jobTitleId;
+  data['is_ot'] = entity.isOt;
+  data['position_id'] = entity.positionId;
+  data['sex_limit'] = entity.sexLimit;
+  data['male_limit'] = entity.maleLimit;
+  data['female_limit'] = entity.femaleLimit;
+  return data;
+}
+
+extension JobListERDetailJobExtension on JobListERDetailJob {
+  JobListERDetailJob copyWith({
+    String? id,
+    String? employerId,
+    String? employerName,
+    String? eAdminId,
+    String? yyJobId,
+    int? sourceType,
+    String? agencyId,
+    String? agencyName,
+    String? jobTitle,
+    String? outletId,
+    String? outletName,
+    String? jobDate,
+    String? startTime,
+    String? endTime,
+    String? workingHours,
+    String? hourlyRate,
+    String? hiringNum,
+    String? realNum,
+    int? status,
+    String? description,
+    int? confirmStatus,
+    String? createdAt,
+    String? updatedAt,
+    String? deletedAt,
+    String? eventName,
+    String? eventType,
+    int? withTyphoid,
+    int? syncPayroll,
+    String? agencyRate,
+    String? requestId,
+    String? jobTitleId,
+    int? isOt,
+    String? positionId,
+    String? sexLimit,
+    String? maleLimit,
+    String? femaleLimit,
+  }) {
+    return JobListERDetailJob()
+      ..id = id ?? this.id
+      ..employerId = employerId ?? this.employerId
+      ..employerName = employerName ?? this.employerName
+      ..eAdminId = eAdminId ?? this.eAdminId
+      ..yyJobId = yyJobId ?? this.yyJobId
+      ..sourceType = sourceType ?? this.sourceType
+      ..agencyId = agencyId ?? this.agencyId
+      ..agencyName = agencyName ?? this.agencyName
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..outletId = outletId ?? this.outletId
+      ..outletName = outletName ?? this.outletName
+      ..jobDate = jobDate ?? this.jobDate
+      ..startTime = startTime ?? this.startTime
+      ..endTime = endTime ?? this.endTime
+      ..workingHours = workingHours ?? this.workingHours
+      ..hourlyRate = hourlyRate ?? this.hourlyRate
+      ..hiringNum = hiringNum ?? this.hiringNum
+      ..realNum = realNum ?? this.realNum
+      ..status = status ?? this.status
+      ..description = description ?? this.description
+      ..confirmStatus = confirmStatus ?? this.confirmStatus
+      ..createdAt = createdAt ?? this.createdAt
+      ..updatedAt = updatedAt ?? this.updatedAt
+      ..deletedAt = deletedAt ?? this.deletedAt
+      ..eventName = eventName ?? this.eventName
+      ..eventType = eventType ?? this.eventType
+      ..withTyphoid = withTyphoid ?? this.withTyphoid
+      ..syncPayroll = syncPayroll ?? this.syncPayroll
+      ..agencyRate = agencyRate ?? this.agencyRate
+      ..requestId = requestId ?? this.requestId
+      ..jobTitleId = jobTitleId ?? this.jobTitleId
+      ..isOt = isOt ?? this.isOt
+      ..positionId = positionId ?? this.positionId
+      ..sexLimit = sexLimit ?? this.sexLimit
+      ..maleLimit = maleLimit ?? this.maleLimit
+      ..femaleLimit = femaleLimit ?? this.femaleLimit;
+  }
+}

+ 88 - 3
packages/cs_domain/lib/repository/th_er_repository.dart

@@ -1,4 +1,5 @@
 import 'package:domain/entity/response/hotel_info_entity.dart';
+import 'package:domain/entity/response/job_list_e_r_detail_entity.dart';
 import 'package:domain/entity/response/job_list_e_r_option_entity.dart';
 import 'package:domain/entity/response/labour_request_e_r_entity.dart';
 import 'package:domain/entity/response/sign_in_sign_out_entity.dart';
@@ -43,7 +44,7 @@ class THERRepository extends GetxService {
   }
 
   /// 获取 ER 用工请求选项
-  Future<HttpResult<LabourRequestEROptionEntity>> fetchERLabourRequestAddOption({
+  Future<HttpResult<JobListERDetailEntity>> fetchERLabourRequestAddOption({
     CancelToken? cancelToken,
   }) async {
     final result = await httpProvider.requestNetResult(
@@ -55,8 +56,8 @@ class THERRepository extends GetxService {
 
     if (result.isSuccess) {
       final json = result.getDataJson();
-      var data = LabourRequestEROptionEntity.fromJson(json!);
-      return result.convert<LabourRequestEROptionEntity>(data: data);
+      var data = JobListERDetailEntity.fromJson(json!);
+      return result.convert<JobListERDetailEntity>(data: data);
     }
     return result.convert();
   }
@@ -227,4 +228,88 @@ class THERRepository extends GetxService {
     return result.convert();
   }
 
+  /// 获取 ER 工作列表详情
+  Future<HttpResult<JobListERDetailEntity>> fetchERJobListDetail({
+    required String jobId,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["job_id"] = jobId;
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiERJobListDetailTH,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = JobListERDetailEntity.fromJson(json!);
+      return result.convert<JobListERDetailEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 编辑 ER 的用工请求
+  Future<HttpResult> editLabourRequestERSubmit({
+    required String jobId,
+    required String jobTitleId,
+    required String startTime,
+    required String endTime,
+    required String outletId,
+    String? sexLimit,
+    String? needNum,
+    String? maleLimit,
+    String? femaleLimit,
+    String? eventName,
+    String? eventType,
+    String? remark,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, String> params = {};
+    params["job_id"] = jobId;
+    params["job_title_id"] = jobTitleId;
+    params["start_time"] = startTime;
+    params["end_time"] = endTime;
+    params["outlet_id"] = outletId;
+    if (!Utils.isEmpty(sexLimit)) {
+      params["sex_limit"] = sexLimit!;
+    }
+    if (!Utils.isEmpty(needNum)) {
+      params["need_num"] = needNum!;
+    }
+    if (!Utils.isEmpty(maleLimit)) {
+      params["male_limit"] = maleLimit!;
+    }
+    if (!Utils.isEmpty(femaleLimit)) {
+      params["female_limit"] = femaleLimit!;
+    }
+    if (!Utils.isEmpty(eventName)) {
+      params["event_name"] = eventName!;
+    }
+    if (!Utils.isEmpty(eventType)) {
+      params["event_type"] = eventType!;
+    }
+    if (!Utils.isEmpty(remark)) {
+      params["remark"] = remark!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiERLabourRequestEditSubmitTH,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      return result.convert();
+    }
+    return result.convert();
+  }
+
 }