Browse Source

编辑已申请的记录,页面与接口的调试

liukai 7 months ago
parent
commit
8a2c8fe6bc

+ 27 - 2
packages/cpt_job/lib/modules/job_applied/job_applied_controller.dart

@@ -1,12 +1,16 @@
+import 'package:cpt_job/modules/job_applied_edit/job_applied_edit_page.dart';
 import 'package:cpt_job/widget/applied_staff_reviews.dart';
 import 'package:cpt_job/widget/applied_staff_reviews.dart';
 import 'package:domain/entity/response/job_list_applied_staff_list_entity.dart';
 import 'package:domain/entity/response/job_list_applied_staff_list_entity.dart';
 import 'package:domain/repository/job_repository.dart';
 import 'package:domain/repository/job_repository.dart';
 import 'package:get/get.dart';
 import 'package:get/get.dart';
+import 'package:plugin_basic/constants/app_constant.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
 import 'package:plugin_platform/engine/notify/notify_engine.dart';
 import 'package:plugin_platform/engine/notify/notify_engine.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/date_time_utils.dart';
 import 'package:shared/utils/date_time_utils.dart';
+import 'package:shared/utils/event_bus.dart';
+import 'package:shared/utils/util.dart';
 import 'package:widgets/dialog/app_default_dialog.dart';
 import 'package:widgets/dialog/app_default_dialog.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 import 'package:widgets/widget_export.dart';
@@ -136,13 +140,35 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
   void onReady() {
   void onReady() {
     super.onReady();
     super.onReady();
     fetchAppliedStaffList();
     fetchAppliedStaffList();
+    registerEventBus();
   }
   }
 
 
   @override
   @override
   void onClose() {
   void onClose() {
+    unregisterEventBus();
+    state.datas.clear();
     super.onClose();
     super.onClose();
   }
   }
 
 
+  // EventBus 的事件接收
+  Subscription? subscribe;
+
+  void registerEventBus() {
+    subscribe = bus.on(AppConstant.eventAppliedListRefresh, (arg) {
+      var appliedId = arg as String;
+      if (Utils.isNotEmpty(appliedId)) {
+        fetchItemByIdAndRefreshItem(appliedId);
+      } else {
+        refreshController.callRefresh();
+      }
+    });
+  }
+
+  void unregisterEventBus() {
+    bus.off(AppConstant.eventAppliedListRefresh, subscribe);
+  }
+
+
   /// 搜索员工
   /// 搜索员工
   void doSearch(String keyword) {
   void doSearch(String keyword) {
     state.keyword = keyword;
     state.keyword = keyword;
@@ -180,7 +206,6 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
 
 
       //添加成功之后刷新页面
       //添加成功之后刷新页面
       refreshController.callRefresh();
       refreshController.callRefresh();
-
     } else {
     } else {
       ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
       ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
       return;
       return;
@@ -189,7 +214,7 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
 
 
   /// 去编辑员工信息页面
   /// 去编辑员工信息页面
   void gotoAppliedEditPage(JobListAppliedStaffListRows data) {
   void gotoAppliedEditPage(JobListAppliedStaffListRows data) {
-    ToastEngine.show("去编辑员工信息页面");
+    JobAppliedEditPage.startInstance(data.appliedId.toString());
   }
   }
 
 
   /// 展示评论的弹窗
   /// 展示评论的弹窗

+ 178 - 0
packages/cpt_job/lib/modules/job_applied_edit/job_applied_edit_controller.dart

@@ -0,0 +1,178 @@
+import 'package:domain/repository/job_repository.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:get/get.dart';
+import 'package:plugin_basic/constants/app_constant.dart';
+import 'package:plugin_platform/engine/notify/notify_engine.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:shared/utils/event_bus.dart';
+import 'package:widgets/picker/date_picker_util.dart';
+
+import 'job_applied_edit_state.dart';
+
+class JobAppliedEditController extends GetxController with DioCancelableMixin {
+  final JobRepository _jobRepository = Get.find();
+  final JobAppliedEditState state = JobAppliedEditState();
+
+  // 获取编辑的详情
+  void fetchAppliedEditView() async {
+    var result = await _jobRepository.fetchAppliedEditView(state.appliedId, cancelToken: cancelToken);
+
+    if (result.isSuccess) {
+      state.appliedEditView = result.data;
+
+      var addHourController = state.formData['add_hours']!['controller'];
+      var totalRoomController = state.formData['total_room']!['controller'];
+      var reasonController = state.formData['reason']!['controller'];
+
+      addHourController.text = state.appliedEditView?.adjustHours ?? "0";
+      totalRoomController.text = state.appliedEditView?.totalRooms.toString();
+      reasonController.text = state.appliedEditView?.coReason ?? "";
+
+      update();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      return;
+    }
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchAppliedEditView();
+  }
+
+  /// 选择时间
+  void pickStartTime() {
+    if (state.appliedEditView == null) return;
+
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: DateTimeUtils.getDateTime(state.appliedEditView!.startTime ?? ""),
+      mode: CupertinoDatePickerMode.dateAndTime,
+      onDateTimeChanged: (date) {
+        state.appliedEditView!.startTime = DateTimeUtils.formatDate(date);
+        update();
+      },
+      title: "Start Time".tr,
+    );
+  }
+
+  /// 选择时间
+  void pickEndTime() {
+    if (state.appliedEditView == null) return;
+
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: DateTimeUtils.getDateTime(state.appliedEditView!.endTime ?? ""),
+      mode: CupertinoDatePickerMode.dateAndTime,
+      onDateTimeChanged: (date) {
+        state.appliedEditView!.endTime = DateTimeUtils.formatDate(date);
+        update();
+      },
+      title: "End Time".tr,
+    );
+  }
+
+  /// 选择时间
+  void pickSecurityInTime() {
+    if (state.appliedEditView == null) return;
+
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: DateTimeUtils.getDateTime(state.appliedEditView!.securityIn ?? ""),
+      mode: CupertinoDatePickerMode.dateAndTime,
+      onDateTimeChanged: (date) {
+        state.appliedEditView!.securityIn = DateTimeUtils.formatDate(date);
+        update();
+      },
+      title: "Security In".tr,
+    );
+  }
+
+  /// 选择时间
+  void pickSecurityOutTime() {
+    if (state.appliedEditView == null) return;
+
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: DateTimeUtils.getDateTime(state.appliedEditView!.securityOut ?? ""),
+      mode: CupertinoDatePickerMode.dateAndTime,
+      onDateTimeChanged: (date) {
+        state.appliedEditView!.securityOut = DateTimeUtils.formatDate(date);
+        update();
+      },
+      title: "Security Out".tr,
+    );
+  }
+
+  /// 选择时间
+  void pickWorkInTime() {
+    if (state.appliedEditView == null) return;
+
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: DateTimeUtils.getDateTime(state.appliedEditView!.workIn ?? ""),
+      mode: CupertinoDatePickerMode.dateAndTime,
+      onDateTimeChanged: (date) {
+        state.appliedEditView!.workIn = DateTimeUtils.formatDate(date);
+        update();
+      },
+      title: "Work In".tr,
+    );
+  }
+
+  /// 选择时间
+  void pickWorkOutTime() {
+    if (state.appliedEditView == null) return;
+
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: DateTimeUtils.getDateTime(state.appliedEditView!.workOut ?? ""),
+      mode: CupertinoDatePickerMode.dateAndTime,
+      onDateTimeChanged: (date) {
+        state.appliedEditView!.workOut = DateTimeUtils.formatDate(date);
+        update();
+      },
+      title: "Work Out".tr,
+    );
+  }
+
+  /// 提交修改
+  void doSubmit() async {
+    if (state.appliedEditView == null) return;
+
+    //输入框的数据赋值
+    TextEditingController totalRoomController = state.formData['total_room']!['controller'];
+    TextEditingController addHourController = state.formData['add_hours']!['controller'];
+    TextEditingController reasonController = state.formData['reason']!['controller'];
+    // 获取文本并尝试转换为整数
+    String totalRoomText = totalRoomController.text;
+    if (totalRoomText.isNotEmpty) {
+      try {
+        // 尝试将文本转换为整数
+        int totalRooms = int.parse(totalRoomText);
+        // 赋值给 state.appliedEditView!.totalRooms
+        state.appliedEditView!.totalRooms = totalRooms;
+      } catch (e) {
+        // 如果转换失败,可以进行错误处理
+        print('Error parsing totalRooms: $e');
+      }
+    } else {
+      // 文本为空时的处理逻辑,例如设置默认值或提示用户
+      print('Total rooms input is empty');
+    }
+
+    state.appliedEditView!.adjustHours = addHourController.text.toString();
+    state.appliedEditView!.coReason = reasonController.text.toString();
+
+    //请求网络提交修改
+    var result = await _jobRepository.editAppliedSingleStaffInfo(state.appliedId, state.appliedEditView!);
+
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      bus.emit(AppConstant.eventAppliedListRefresh, state.appliedId);
+
+      Get.back();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      return;
+    }
+  }
+}

+ 515 - 0
packages/cpt_job/lib/modules/job_applied_edit/job_applied_edit_page.dart

@@ -0,0 +1,515 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:get/get.dart';
+import 'package:widgets/custom_radio_check.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/no_shadow_scroll_behavior.dart';
+import 'package:widgets/shatter/form_require_text.dart';
+import 'package:widgets/shatter/round_my_text_field.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'job_applied_edit_controller.dart';
+
+import 'package:plugin_basic/base/base_state.dart';
+import 'package:plugin_basic/base/base_stateful_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/my_appbar.dart';
+
+import 'job_applied_edit_state.dart';
+
+/**
+ * Applied列表中,编辑用户的此次工作打卡信息
+ */
+class JobAppliedEditPage extends BaseStatefulPage<JobAppliedEditController> {
+  JobAppliedEditPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance(String? appliedId) {
+    return Get.start(RouterPath.JOB_APPLIED_STAFF_EDIT, arguments: {'appliedId': appliedId});
+  }
+
+  @override
+  JobAppliedEditController createRawController() {
+    return JobAppliedEditController();
+  }
+
+  @override
+  State<JobAppliedEditPage> createState() => _JobAppliedEditState();
+}
+
+class _JobAppliedEditState extends BaseState<JobAppliedEditPage, JobAppliedEditController> {
+  late JobAppliedEditState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+    state.appliedId = Get.arguments['appliedId'];
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(context, "Edit".tr),
+        body: SafeArea(
+          bottom: true,
+          top: false,
+          child: Container(
+            width: double.infinity,
+            height: double.infinity,
+            padding: EdgeInsets.only(top: kToolbarHeight + ScreenUtil.getStatusBarH(context) + 1),
+            decoration: const BoxDecoration(
+              gradient: LinearGradient(
+                colors: [
+                  Color(0xFF091D44),
+                  Color(0xFF245A8A),
+                  Color(0xFF7F7CEC),
+                ],
+                begin: Alignment.topCenter,
+                end: Alignment.bottomCenter,
+              ),
+            ),
+            child: Scrollbar(
+              child: ScrollConfiguration(
+                behavior: NoShadowScrollBehavior(),
+                child: SingleChildScrollView(
+                  scrollDirection: Axis.vertical,
+                  physics: const BouncingScrollPhysics(),
+                  child: Column(
+                    crossAxisAlignment: CrossAxisAlignment.start,
+                    children: [
+                      //工作标题,选择模板
+                      MyTextView(
+                        "Staff Name".tr,
+                        textColor: Colors.white,
+                        fontSize: 15,
+                        marginTop: 15,
+                        isFontRegular: true,
+                      ),
+
+                      //工作标题
+                      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(
+                              state.appliedEditView?.memberName ?? "-",
+                              fontSize: 15,
+                              hint: "Choose Job Title".tr,
+                              textHintColor: ColorConstants.textGrayAECAE5,
+                              isFontMedium: true,
+                              textColor: ColorConstants.white,
+                            ).expanded(),
+                          ],
+                        ),
+                      ),
+
+                      //开始时间
+                      FormRequireText(
+                        text: "Start Time".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.2),
+                          borderRadius: const BorderRadius.all(Radius.circular(5)),
+                        ),
+                        child: Row(
+                          mainAxisSize: MainAxisSize.max,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          mainAxisAlignment: MainAxisAlignment.start,
+                          children: [
+                            MyTextView(
+                              state.appliedEditView?.startTime ?? "-",
+                              fontSize: 14,
+                              hint: "Job Start Time".tr,
+                              textHintColor: ColorConstants.textGrayAECAE5,
+                              isFontMedium: true,
+                              textColor: ColorConstants.white,
+                            ).expanded(),
+                            //下拉选图标
+                            MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                          ],
+                        ),
+                      ).onTap(() {
+                        FocusScope.of(context).unfocus();
+                        controller.pickStartTime();
+                      }),
+
+                      //门卫签到时间
+                      MyTextView(
+                        "Security In".tr,
+                        textColor: Colors.white,
+                        fontSize: 15,
+                        marginTop: 15,
+                        isFontRegular: true,
+                      ),
+
+                      //门卫签到时间
+                      Container(
+                        padding: EdgeInsets.only(left: 16, right: 10),
+                        margin: EdgeInsets.only(top: 10),
+                        height: 45,
+                        decoration: BoxDecoration(
+                          color: Color(0xFF4DCFF6).withOpacity(0.2),
+                          borderRadius: const BorderRadius.all(Radius.circular(5)),
+                        ),
+                        child: Row(
+                          mainAxisSize: MainAxisSize.max,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          mainAxisAlignment: MainAxisAlignment.start,
+                          children: [
+                            MyTextView(
+                              state.appliedEditView?.securityIn ?? "-",
+                              fontSize: 14,
+                              hint: "Security In".tr,
+                              textHintColor: ColorConstants.textGrayAECAE5,
+                              isFontMedium: true,
+                              textColor: ColorConstants.white,
+                            ).expanded(),
+                            //下拉选图标
+                            MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                          ],
+                        ),
+                      ).onTap(() {
+                        FocusScope.of(context).unfocus();
+                        controller.pickSecurityInTime();
+                      }),
+
+                      //工作地签到时间
+                      MyTextView(
+                        "Work In".tr,
+                        textColor: Colors.white,
+                        fontSize: 15,
+                        marginTop: 15,
+                        isFontRegular: true,
+                      ),
+
+                      //工作地签到时间
+                      Container(
+                        padding: EdgeInsets.only(left: 16, right: 10),
+                        margin: EdgeInsets.only(top: 10),
+                        height: 45,
+                        decoration: BoxDecoration(
+                          color: Color(0xFF4DCFF6).withOpacity(0.2),
+                          borderRadius: const BorderRadius.all(Radius.circular(5)),
+                        ),
+                        child: Row(
+                          mainAxisSize: MainAxisSize.max,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          mainAxisAlignment: MainAxisAlignment.start,
+                          children: [
+                            MyTextView(
+                              state.appliedEditView?.workIn ?? "-",
+                              fontSize: 14,
+                              hint: "Work In".tr,
+                              textHintColor: ColorConstants.textGrayAECAE5,
+                              isFontMedium: true,
+                              textColor: ColorConstants.white,
+                            ).expanded(),
+                            //下拉选图标
+                            MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                          ],
+                        ),
+                      ).onTap(() {
+                        FocusScope.of(context).unfocus();
+                        controller.pickWorkInTime();
+                      }),
+
+                      //结束时间
+                      FormRequireText(
+                        text: "End Time".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.2),
+                          borderRadius: const BorderRadius.all(Radius.circular(5)),
+                        ),
+                        child: Row(
+                          mainAxisSize: MainAxisSize.max,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          mainAxisAlignment: MainAxisAlignment.start,
+                          children: [
+                            MyTextView(
+                              state.appliedEditView?.endTime ?? "-",
+                              fontSize: 14,
+                              hint: "Job End Time".tr,
+                              textHintColor: ColorConstants.textGrayAECAE5,
+                              isFontMedium: true,
+                              textColor: ColorConstants.white,
+                            ).expanded(),
+
+                            //下拉选图标
+                            MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                          ],
+                        ),
+                      ).onTap(() {
+                        FocusScope.of(context).unfocus();
+                        controller.pickEndTime();
+                      }),
+
+                      //门卫签出时间
+                      MyTextView(
+                        "Security Out".tr,
+                        textColor: Colors.white,
+                        fontSize: 15,
+                        marginTop: 15,
+                        isFontRegular: true,
+                      ),
+
+                      //门卫签出时间
+                      Container(
+                        padding: EdgeInsets.only(left: 16, right: 10),
+                        margin: EdgeInsets.only(top: 10),
+                        height: 45,
+                        decoration: BoxDecoration(
+                          color: Color(0xFF4DCFF6).withOpacity(0.2),
+                          borderRadius: const BorderRadius.all(Radius.circular(5)),
+                        ),
+                        child: Row(
+                          mainAxisSize: MainAxisSize.max,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          mainAxisAlignment: MainAxisAlignment.start,
+                          children: [
+                            MyTextView(
+                              state.appliedEditView?.securityOut ?? "-",
+                              fontSize: 14,
+                              hint: "Security Out".tr,
+                              textHintColor: ColorConstants.textGrayAECAE5,
+                              isFontMedium: true,
+                              textColor: ColorConstants.white,
+                            ).expanded(),
+                            //下拉选图标
+                            MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                          ],
+                        ),
+                      ).onTap(() {
+                        FocusScope.of(context).unfocus();
+                        controller.pickSecurityOutTime();
+                      }),
+
+                      //工作地签出时间
+                      MyTextView(
+                        "Work Out".tr,
+                        textColor: Colors.white,
+                        fontSize: 15,
+                        marginTop: 15,
+                        isFontRegular: true,
+                      ),
+
+                      //工作地签出时间
+                      Container(
+                        padding: EdgeInsets.only(left: 16, right: 10),
+                        margin: EdgeInsets.only(top: 10),
+                        height: 45,
+                        decoration: BoxDecoration(
+                          color: Color(0xFF4DCFF6).withOpacity(0.2),
+                          borderRadius: const BorderRadius.all(Radius.circular(5)),
+                        ),
+                        child: Row(
+                          mainAxisSize: MainAxisSize.max,
+                          crossAxisAlignment: CrossAxisAlignment.center,
+                          mainAxisAlignment: MainAxisAlignment.start,
+                          children: [
+                            MyTextView(
+                              state.appliedEditView?.workOut ?? "-",
+                              fontSize: 14,
+                              hint: "Work Out".tr,
+                              textHintColor: ColorConstants.textGrayAECAE5,
+                              isFontMedium: true,
+                              textColor: ColorConstants.white,
+                            ).expanded(),
+                            //下拉选图标
+                            MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                          ],
+                        ),
+                      ).onTap(() {
+                        FocusScope.of(context).unfocus();
+                        controller.pickWorkOutTime();
+                      }),
+
+                      // + - 小时
+                      Visibility(
+                        visible: state.appliedEditView?.jobUnit == "hour",
+                        child: MyTextView(
+                          "+/- Hours".tr,
+                          textColor: Colors.white,
+                          fontSize: 15,
+                          marginTop: 15,
+                          isFontRegular: true,
+                        ),
+                      ),
+
+                      //+ - 小时输入框
+                      Visibility(
+                        visible: state.appliedEditView?.jobUnit == "hour",
+                        child: CustomTextField(
+                          formKey: "add_hours",
+                          marginLeft: 0,
+                          marginRight: 0,
+                          paddingTop: 0,
+                          paddingBottom: 0,
+                          height: 45,
+                          fillBackgroundColor: Color(0xFF4DCFF6).withOpacity(0.2),
+                          enabled: true,
+                          textInputType: TextInputType.number,
+                          formData: state.formData,
+                          textInputAction: TextInputAction.done,
+                          onSubmit: (key, value) {
+                            FocusScope.of(context).unfocus();
+                          },
+                          marginTop: 10,
+                        ),
+                      ),
+
+                      // 房间计费,房间数量
+                      Visibility(
+                        visible: state.appliedEditView?.jobUnit != "hour",
+                        child: MyTextView(
+                          "Total Rooms".tr,
+                          textColor: Colors.white,
+                          fontSize: 15,
+                          marginTop: 15,
+                          isFontRegular: true,
+                        ),
+                      ),
+
+                      // 房间计费,房间数量输入框
+                      Visibility(
+                        visible: state.appliedEditView?.jobUnit != "hour",
+                        child: CustomTextField(
+                          formKey: "total_room",
+                          marginLeft: 0,
+                          marginRight: 0,
+                          paddingTop: 0,
+                          paddingBottom: 0,
+                          height: 45,
+                          fillBackgroundColor: Color(0xFF4DCFF6).withOpacity(0.2),
+                          enabled: true,
+                          inputFormatters: <TextInputFormatter>[FilteringTextInputFormatter.digitsOnly],
+                          textInputType: TextInputType.number,
+                          formData: state.formData,
+                          textInputAction: TextInputAction.done,
+                          onSubmit: (key, value) {
+                            FocusScope.of(context).unfocus();
+                          },
+                          marginTop: 10,
+                        ),
+                      ),
+
+                      // 修改的理由
+                      MyTextView(
+                        "Reason".tr,
+                        textColor: Colors.white,
+                        fontSize: 15,
+                        marginTop: 15,
+                        isFontRegular: true,
+                      ),
+
+                      //选择签到功能还是全功能
+                      state.appliedEditView != null
+                          ? CustomRadioCheck(
+                              options: state.appliedEditView!.reasonList!.map((e) => e.txt).whereType<String>().toList(), //后台返回的数据展示,并且根据后台的数据匹配索引
+                              selectedPosition: state.appliedEditView!.reasonList!.indexWhere((element) => element.value == state.appliedEditView!.reasonType),
+                              onOptionSelected: (index, text) {
+                                //修改内存的值
+                                state.appliedEditView!.reasonType = state.appliedEditView!.reasonList![index].value;
+                              },
+                            ).marginOnly(top: 15, bottom: 20)
+                          : CircularProgressIndicator(),
+
+                      IgnoreKeyboardDismiss(
+                        child: Container(
+                          height: 130,
+                          padding: EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                          decoration: BoxDecoration(
+                            color: Color(0xFF4DCFF6).withOpacity(0.2),
+                            borderRadius: const BorderRadius.all(Radius.circular(5)),
+                          ),
+                          child: TextField(
+                            cursorColor: ColorConstants.white,
+                            cursorWidth: 1.5,
+                            autofocus: false,
+                            controller: state.formData["reason"]!['controller'],
+                            focusNode: state.formData["reason"]!['focusNode'],
+                            obscureText: state.formData["reason"]!['obsecure'],
+                            // 装饰
+                            decoration: InputDecoration(
+                              isDense: true,
+                              isCollapsed: true,
+                              border: InputBorder.none,
+                              hintText: state.formData["reason"]!['hintText'],
+                              hintStyle: TextStyle(
+                                color: ColorConstants.white,
+                                fontSize: 15.0,
+                                fontWeight: FontWeight.w400,
+                              ),
+                            ),
+                            style: TextStyle(
+                              color: ColorConstants.white,
+                              fontSize: 15.0,
+                              fontWeight: FontWeight.w400,
+                            ),
+                            // 键盘动作右下角图标
+                            textInputAction: TextInputAction.done,
+                            onSubmitted: (value) {
+                              FocusScope.of(context).unfocus();
+                            },
+                          ),
+                        ),
+                      ),
+
+                      //提交按钮
+                      MyButton(
+                        type: ClickType.throttle,
+                        milliseconds: 500,
+                        onPressed: () {
+                          FocusScope.of(context).unfocus();
+                          controller.doSubmit();
+                        },
+                        text: "Submit".tr,
+                        textColor: ColorConstants.white,
+                        fontSize: 16,
+                        radius: 22.5,
+                        backgroundColor: hexToColor("#FFBB1B"),
+                        fontWeight: FontWeight.w500,
+                      ).marginSymmetric(horizontal: 0, vertical: 30),
+                    ],
+                  ).paddingOnly(left: 15, right: 15),
+                ),
+              ),
+            ),
+          ),
+        ),
+      );
+    });
+  }
+}

+ 40 - 0
packages/cpt_job/lib/modules/job_applied_edit/job_applied_edit_state.dart

@@ -0,0 +1,40 @@
+import 'package:domain/entity/response/job_list_applied_edit_entity.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/basic_export.dart';
+
+class JobAppliedEditState {
+  //表单的校验与数据
+  Map<String, Map<String, dynamic>> formData = {
+    'add_hours': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': '0',
+      'obsecure': false,
+    },
+    'total_room': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': '0',
+      'obsecure': false,
+    },
+    'reason': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Enter...'.tr,
+      'obsecure': false,
+    },
+  };
+
+  JobListAppliedEditEntity? appliedEditView;
+
+  String? appliedId;
+
+  //功能选项
+  final editOption = ['None'.tr, 'Forgot to clock in/out'.tr, 'Technical issue'.tr, 'Others'.tr];
+
+  //选项默认选中索引为0
+  int editOptionPosition = 0;
+}

+ 8 - 0
packages/cpt_job/lib/router/page_router.dart

@@ -1,5 +1,6 @@
 import 'package:cpt_job/modules/applied_workflow/applied_workflow_page.dart';
 import 'package:cpt_job/modules/applied_workflow/applied_workflow_page.dart';
 import 'package:cpt_job/modules/job_applied/job_applied_page.dart';
 import 'package:cpt_job/modules/job_applied/job_applied_page.dart';
+import 'package:cpt_job/modules/job_applied_edit/job_applied_edit_page.dart';
 import 'package:get/get.dart';
 import 'package:get/get.dart';
 import 'package:router/path/router_path.dart';
 import 'package:router/path/router_path.dart';
 
 
@@ -38,5 +39,12 @@ class JobPageRouter {
       name: RouterPath.JOB_APPLIED_STAFF_WORKFLOW,
       name: RouterPath.JOB_APPLIED_STAFF_WORKFLOW,
       page: () => AppliedWorkflowPage(),
       page: () => AppliedWorkflowPage(),
     ),
     ),
+
+    //工作已申请列表
+    GetPage(
+      name: RouterPath.JOB_APPLIED_STAFF_EDIT,
+      page: () => JobAppliedEditPage(),
+    ),
+
   ];
   ];
 }
 }

+ 1 - 1
packages/cs_domain/lib/entity/response/job_list_applied_edit_entity.dart

@@ -24,7 +24,7 @@ class JobListAppliedEditEntity {
 	@JSONField(name: "work_out")
 	@JSONField(name: "work_out")
 	String? workOut = null;
 	String? workOut = null;
 	@JSONField(name: "adjust_hours")
 	@JSONField(name: "adjust_hours")
-	int adjustHours = 0;
+	String? adjustHours= null;
 	@JSONField(name: "total_rooms")
 	@JSONField(name: "total_rooms")
 	int totalRooms = 0;
 	int totalRooms = 0;
 	@JSONField(name: "reason_list")
 	@JSONField(name: "reason_list")

+ 2 - 2
packages/cs_domain/lib/generated/json/job_list_applied_edit_entity.g.dart

@@ -39,7 +39,7 @@ JobListAppliedEditEntity $JobListAppliedEditEntityFromJson(Map<String, dynamic>
   if (workOut != null) {
   if (workOut != null) {
     jobListAppliedEditEntity.workOut = workOut;
     jobListAppliedEditEntity.workOut = workOut;
   }
   }
-  final int? adjustHours = jsonConvert.convert<int>(json['adjust_hours']);
+  final String? adjustHours = jsonConvert.convert<String>(json['adjust_hours']);
   if (adjustHours != null) {
   if (adjustHours != null) {
     jobListAppliedEditEntity.adjustHours = adjustHours;
     jobListAppliedEditEntity.adjustHours = adjustHours;
   }
   }
@@ -93,7 +93,7 @@ extension JobListAppliedEditEntityExtension on JobListAppliedEditEntity {
     String? securityOut,
     String? securityOut,
     String? workIn,
     String? workIn,
     String? workOut,
     String? workOut,
-    int? adjustHours,
+    String? adjustHours,
     int? totalRooms,
     int? totalRooms,
     List<JobListAppliedEditReasonList>? reasonList,
     List<JobListAppliedEditReasonList>? reasonList,
     int? reasonType,
     int? reasonType,

+ 28 - 32
packages/cs_domain/lib/repository/job_repository.dart

@@ -405,7 +405,7 @@ class JobRepository extends GetxService {
   }
   }
 
 
   /// 获取单个员工的信息,准备修改
   /// 获取单个员工的信息,准备修改
-  Future<HttpResult<JobListAppliedEditEntity>> fetchAppliedStaffInfo(
+  Future<HttpResult<JobListAppliedEditEntity>> fetchAppliedEditView(
     String? appliedId, {
     String? appliedId, {
     CancelToken? cancelToken,
     CancelToken? cancelToken,
   }) async {
   }) async {
@@ -436,16 +436,7 @@ class JobRepository extends GetxService {
   /// 单独修改单个员工的信息
   /// 单独修改单个员工的信息
   Future<HttpResult> editAppliedSingleStaffInfo(
   Future<HttpResult> editAppliedSingleStaffInfo(
     String? appliedId,
     String? appliedId,
-    String? startTime,
-    String? endTime,
-    String? security_in,
-    String? security_out,
-    String? work_in,
-    String? work_out,
-    String? total_rooms,
-    String? adjust_hours,
-    String? co_reason_type,
-    String? co_reason, {
+    JobListAppliedEditEntity entity, {
     CancelToken? cancelToken,
     CancelToken? cancelToken,
   }) async {
   }) async {
     //参数
     //参数
@@ -453,35 +444,40 @@ class JobRepository extends GetxService {
     if (!Utils.isEmpty(appliedId)) {
     if (!Utils.isEmpty(appliedId)) {
       params["applied_id"] = appliedId!;
       params["applied_id"] = appliedId!;
     }
     }
-    if (!Utils.isEmpty(startTime)) {
-      params["start_time"] = startTime!;
-    }
-    if (!Utils.isEmpty(endTime)) {
-      params["end_time"] = endTime!;
+    if (!Utils.isEmpty(entity.startTime)) {
+      params["start_time"] = entity.startTime!;
     }
     }
-    if (!Utils.isEmpty(security_in)) {
-      params["security_in"] = security_in!;
+    if (!Utils.isEmpty(entity.endTime)) {
+      params["end_time"] = entity.endTime!;
     }
     }
-    if (!Utils.isEmpty(security_out)) {
-      params["security_out"] = security_out!;
+    if (!Utils.isEmpty(entity.securityIn)) {
+      params["security_in"] = entity.securityIn!;
     }
     }
-    if (!Utils.isEmpty(work_in)) {
-      params["work_in"] = work_in!;
+    if (!Utils.isEmpty(entity.securityOut)) {
+      params["security_out"] = entity.securityOut!;
     }
     }
-    if (!Utils.isEmpty(work_out)) {
-      params["work_out"] = work_out!;
+    if (!Utils.isEmpty(entity.workIn)) {
+      params["work_in"] = entity.workIn!;
     }
     }
-    if (!Utils.isEmpty(total_rooms)) {
-      params["total_rooms"] = total_rooms!;
+    if (!Utils.isEmpty(entity.workOut)) {
+      params["work_out"] = entity.workOut!;
     }
     }
-    if (!Utils.isEmpty(adjust_hours)) {
-      params["adjust_hours"] = adjust_hours!;
+
+    if (entity.jobUnit == "hour") {
+      if (!Utils.isEmpty(entity.adjustHours)) {
+        params["adjust_hours"] = entity.adjustHours!;
+      }
+    } else {
+      if (entity.totalRooms != 0) {
+        params["total_rooms"] = entity.totalRooms.toString();
+      }
     }
     }
-    if (!Utils.isEmpty(co_reason_type)) {
-      params["co_reason_type"] = co_reason_type!;
+
+    if (entity.reasonType != 0) {
+      params["co_reason_type"] = entity.reasonType.toString();
     }
     }
-    if (!Utils.isEmpty(co_reason)) {
-      params["co_reason"] = co_reason!;
+    if (!Utils.isEmpty(entity.coReason)) {
+      params["co_reason"] = entity.coReason!;
     }
     }
 
 
     final result = await httpProvider.requestNetResult(
     final result = await httpProvider.requestNetResult(

+ 1 - 0
packages/cs_plugin_basic/lib/constants/app_constant.dart

@@ -20,6 +20,7 @@ class AppConstant {
   //消息通知Key
   //消息通知Key
   static const eventProfile2Refresh = 'event_profile_refresh'; //通知用户信息需要刷新
   static const eventProfile2Refresh = 'event_profile_refresh'; //通知用户信息需要刷新
   static const eventLabourRequestRefresh = 'event_labour_request_refresh'; //用工请求的列表刷新
   static const eventLabourRequestRefresh = 'event_labour_request_refresh'; //用工请求的列表刷新
+  static const eventAppliedListRefresh = 'event_applied_list_refresh'; //已申请的列表刷新
 
 
 
 
   // navbar 导航栏高度
   // navbar 导航栏高度

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

@@ -115,6 +115,12 @@ const Map<String, String> en_US = {
   'Security In:': 'Security In:',
   'Security In:': 'Security In:',
   'Staff Name:': 'Staff Name:',
   'Staff Name:': 'Staff Name:',
   'Staff Name': 'Staff Name',
   'Staff Name': 'Staff Name',
+  'Work Out': 'Work Out',
+  'Work In': 'Work In',
+  'Security In': 'Security In',
+  'Security Out': 'Security Out',
+  '+/- Hours': '+/- Hours',
+  'Total Rooms': 'Total Rooms',
   'Operation Approve': 'Operation Approve',
   'Operation Approve': 'Operation Approve',
   'Batch Modify': 'Batch Modify',
   'Batch Modify': 'Batch Modify',
   'Please select the applied record': 'Please select the applied record',
   'Please select the applied record': 'Please select the applied record',
@@ -126,6 +132,11 @@ const Map<String, String> en_US = {
   'Enter...': 'Enter...',
   'Enter...': 'Enter...',
   'Please Enter Remark': 'Please Enter Remark',
   'Please Enter Remark': 'Please Enter Remark',
   'Choose Staff': 'Choose Staff',
   'Choose Staff': 'Choose Staff',
+  'Reason': 'Reason',
+  'None': 'None',
+  'Forgot to clock in/out': 'Forgot to clock in/out',
+  'Technical issue': 'Technical issue',
+  'Others': 'Others',
 
 
   //插件的国际化
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',
   'Pull to refresh': 'Pull to refresh',

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

@@ -115,6 +115,12 @@ const Map<String, String> zh_CN = {
   'Security In:': '门卫签到:',
   'Security In:': '门卫签到:',
   'Staff Name:': '员工姓名:',
   'Staff Name:': '员工姓名:',
   'Staff Name': '员工姓名',
   'Staff Name': '员工姓名',
+  'Work Out': '工作地签出',
+  'Work In': '工作地签到',
+  'Security In': '门卫签到',
+  'Security Out': '门卫签出',
+  '+/- Hours': '加/减小时',
+  'Total Rooms': '总房间数',
   'Operation Approve': '操作批准',
   'Operation Approve': '操作批准',
   'Batch Modify': '批量修改',
   'Batch Modify': '批量修改',
   'Please select the applied record': '请选择申请记录',
   'Please select the applied record': '请选择申请记录',
@@ -126,6 +132,11 @@ const Map<String, String> zh_CN = {
   'Enter...': '请输入...',
   'Enter...': '请输入...',
   'Please Enter Remark': '请输入评论内容',
   'Please Enter Remark': '请输入评论内容',
   'Choose Staff': '选择员工',
   'Choose Staff': '选择员工',
+  'Reason': '理由',
+  'None': '无',
+  'Forgot to clock in/out': '忘记签到/签出',
+  'Technical issue': '技术问题',
+  'Others': '其他',
 
 
   //插件的国际化
   //插件的国际化
   'Pull to refresh': '下拉刷新',
   'Pull to refresh': '下拉刷新',

+ 22 - 6
packages/cs_widgets/lib/custom_radio_check.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:flutter/material.dart';
 import 'package:flutter/material.dart';
+import 'package:get/get_utils/get_utils.dart';
 import 'package:get/get_utils/src/extensions/widget_extensions.dart';
 import 'package:get/get_utils/src/extensions/widget_extensions.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/ext/ex_widget.dart';
 import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_load_image.dart';
@@ -8,9 +9,14 @@ import 'package:widgets/my_text_view.dart';
 
 
 class CustomRadioCheck extends StatefulWidget {
 class CustomRadioCheck extends StatefulWidget {
   final List<String> options;
   final List<String> options;
+  int? selectedPosition;
   final Function(int index, String text) onOptionSelected;
   final Function(int index, String text) onOptionSelected;
 
 
-  CustomRadioCheck({required this.options, required this.onOptionSelected});
+  CustomRadioCheck({
+    required this.options,
+    required this.onOptionSelected,
+    this.selectedPosition = 0,
+  });
 
 
   @override
   @override
   _CustomRadioCheckState createState() => _CustomRadioCheckState();
   _CustomRadioCheckState createState() => _CustomRadioCheckState();
@@ -22,8 +28,12 @@ class _CustomRadioCheckState extends State<CustomRadioCheck> {
   @override
   @override
   void initState() {
   void initState() {
     super.initState();
     super.initState();
-    if (widget.options.isNotEmpty) {
-      _selectedOption = widget.options.first;
+    // 初始化 _selectedOption
+    if (widget.selectedPosition != null && widget.selectedPosition! >= 0 && widget.selectedPosition! < widget.options.length) {
+      _selectedOption = widget.options[widget.selectedPosition!];
+    } else {
+      // 默认选择第一个选项,如果 selectedPosition 不在有效范围内
+      _selectedOption = widget.options.isNotEmpty ? widget.options[0] : null;
     }
     }
   }
   }
 
 
@@ -59,11 +69,17 @@ class _CustomRadioCheckState extends State<CustomRadioCheck> {
       mainAxisSize: MainAxisSize.min,
       mainAxisSize: MainAxisSize.min,
       children: <Widget>[
       children: <Widget>[
         MyAssetImage(path, width: 22, height: 22),
         MyAssetImage(path, width: 22, height: 22),
-        SizedBox(width: 8),
-        MyTextView(text, marginLeft: 10, textColor: ColorConstants.white, fontSize: 14, isFontRegular: true),
+        SizedBox(width: 10),
+        MyTextView(
+          text.tr,
+          textColor: ColorConstants.white,
+          fontSize: 14,
+          isFontRegular: true,
+        ),
       ],
       ],
-    ).marginOnly(right: 20).onTap((){
+    ).marginOnly(right: 20, bottom: 5).onTap(() {
       onChanged(true);
       onChanged(true);
     });
     });
   }
   }
 }
 }
+