Browse Source

Revise的Applied 和单独的Revise 完成

liukai 7 months ago
parent
commit
9d9dab70c8
19 changed files with 876 additions and 18 deletions
  1. 1 1
      packages/cpt_job/lib/modules/applied_staff_detail/staff_labour_history_item.dart
  2. 1 1
      packages/cpt_job/lib/modules/sign_in_sign_out/sign_in_sign_out_page.dart
  3. 1 1
      packages/cpt_job_sg/lib/modules/applied_staff_detail/staff_labour_history_item.dart
  4. 6 1
      packages/cpt_job_sg/lib/modules/job_applied/job_applied_controller.dart
  5. 3 5
      packages/cpt_job_sg/lib/modules/job_applied/job_applied_page.dart
  6. 103 0
      packages/cpt_job_sg/lib/modules/revise_add_edit/revise_add_edit_controller.dart
  7. 70 0
      packages/cpt_job_sg/lib/modules/revise_add_edit/revise_add_edit_item.dart
  8. 223 0
      packages/cpt_job_sg/lib/modules/revise_add_edit/revise_add_edit_page.dart
  9. 33 0
      packages/cpt_job_sg/lib/modules/revise_add_edit/revise_add_edit_state.dart
  10. 243 0
      packages/cpt_job_sg/lib/modules/revise_applied/revise_applied_controller.dart
  11. 143 0
      packages/cpt_job_sg/lib/modules/revise_applied/revise_applied_page.dart
  12. 10 0
      packages/cpt_job_sg/lib/modules/revise_applied/revise_applied_state.dart
  13. 8 2
      packages/cpt_job_sg/lib/modules/revise_list/revise_list_controller.dart
  14. 12 0
      packages/cpt_job_sg/lib/router/page_router.dart
  15. 4 3
      packages/cpt_labour_sg/lib/modules/job_list/job_list_item.dart
  16. 2 0
      packages/cs_domain/lib/repository/job_sg_repository.dart
  17. 4 1
      packages/cs_resources/lib/local/language/en_US.dart
  18. 4 1
      packages/cs_resources/lib/local/language/vi_VN.dart
  19. 5 2
      packages/cs_resources/lib/local/language/zh_CN.dart

+ 1 - 1
packages/cpt_job/lib/modules/applied_staff_detail/staff_labour_history_item.dart

@@ -42,7 +42,7 @@ class StaffLabourHistoryItem extends StatelessWidget {
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
               MyTextView(
-                "Job Date:".tr,
+                "Job Date".tr+":",
                 isFontRegular: true,
                 textColor: ColorConstants.textGrayAECAE5,
                 fontSize: 14,

+ 1 - 1
packages/cpt_job/lib/modules/sign_in_sign_out/sign_in_sign_out_page.dart

@@ -254,7 +254,7 @@ class _SignInSignOutPageState extends BaseState<SignInSignOutPage, SignInSignOut
                   crossAxisAlignment: CrossAxisAlignment.center,
                   children: [
                     MyTextView(
-                      "Job Date:".tr,
+                      "Job Date".tr+":",
                       isFontRegular: true,
                       textColor: Color(0XFFAECAE5),
                       fontSize: 14,

+ 1 - 1
packages/cpt_job_sg/lib/modules/applied_staff_detail/staff_labour_history_item.dart

@@ -38,7 +38,7 @@ class StaffLabourHistoryItem extends StatelessWidget {
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
               MyTextView(
-                "Job Date:".tr,
+                "Job Date".tr+":",
                 isFontRegular: true,
                 textColor: ColorConstants.textGrayAECAE5,
                 fontSize: 14,

+ 6 - 1
packages/cpt_job_sg/lib/modules/job_applied/job_applied_controller.dart

@@ -1,4 +1,5 @@
 import 'package:cpt_job_sg/modules/applied_staff/applied_staff_page.dart';
+import 'package:cpt_job_sg/modules/revise_applied/revise_applied_page.dart';
 import 'package:domain/entity/response/job_applied_edit_index_s_g_entity.dart';
 import 'package:domain/entity/response/job_applied_list_s_g_entity.dart';
 import 'package:domain/repository/job_sg_repository.dart';
@@ -12,7 +13,6 @@ 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:router/componentRouter/component_router_service.dart';
 import 'package:shared/utils/date_time_utils.dart';
 import 'package:shared/utils/event_bus.dart';
 import 'package:shared/utils/log_utils.dart';
@@ -288,6 +288,11 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
     }
   }
 
+  /// 去 Revise Applied 的页面
+  void gotoReviseAppliedPage(JobAppliedListSGRows item) {
+    ReviseAppliedPage.startInstance(item.appliedId, state.appliedIndexEntity?.jobTitle, state.appliedIndexEntity?.jobDate);
+  }
+
   /// 去查看员工详情页面
   void gotoStaffDetailPage(JobAppliedListSGRows data) {
     AppliedStaffDetailPage.startInstance(data.memberId);

+ 3 - 5
packages/cpt_job_sg/lib/modules/job_applied/job_applied_page.dart

@@ -115,7 +115,6 @@ class _JobAppliedState extends BaseState<JobAppliedPage, JobAppliedController> {
                     FocusScope.of(context).unfocus();
                     controller.pickStatus();
                   }).expanded(),
-
                   SearchAppBar(
                     value: state.keyword,
                     searchBarHeight: 40,
@@ -126,7 +125,6 @@ class _JobAppliedState extends BaseState<JobAppliedPage, JobAppliedController> {
                     hintText: "Search".tr,
                     controller: state.searchController,
                   ).expanded(),
-
                   MyButton(
                     onPressed: () {
                       FocusScope.of(context).unfocus();
@@ -205,7 +203,7 @@ class _JobAppliedState extends BaseState<JobAppliedPage, JobAppliedController> {
                             controller.showRemarkDialog(state.datas[index]);
                           },
                           onReviseAction: () {
-
+                            controller.gotoReviseAppliedPage(state.datas[index]);
                           },
                           onModifyAction: () {
                             controller.showAppliedEditDialog(state.datas[index]);
@@ -216,8 +214,8 @@ class _JobAppliedState extends BaseState<JobAppliedPage, JobAppliedController> {
                           onMemberAction: () {
                             controller.gotoStaffDetailPage(state.datas[index]);
                           },
-                          onStatusAction: (targetContext){
-                             controller.dropDownStatus(index,targetContext);
+                          onStatusAction: (targetContext) {
+                            controller.dropDownStatus(index, targetContext);
                           },
                         );
                       },

+ 103 - 0
packages/cpt_job_sg/lib/modules/revise_add_edit/revise_add_edit_controller.dart

@@ -0,0 +1,103 @@
+import 'package:domain/entity/response/add_edit_revise_view_s_g_entity.dart';
+import 'package:domain/repository/job_sg_repository.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/engine/notify/notify_engine.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:plugin_platform/http/http_result.dart';
+import 'package:shared/utils/util.dart';
+
+import 'revise_add_edit_state.dart';
+
+class ReviseAddEditController extends GetxController with DioCancelableMixin {
+  final JobSGRepository _jobRepository = Get.find();
+  final ReviseAddEditState state = ReviseAddEditState();
+
+  /// 获取首页的数据
+  void fetchRequestDetail() async {
+    //获取到数据
+    Future<HttpResult<AddEditReviseViewSGEntity>> taskFuture;
+    if (state.pageType != 0 && Utils.isNotEmpty(state.id) && state.id != "0") {
+      taskFuture = _jobRepository.fetchReviseEditIndex(state.id, cancelToken: cancelToken);
+    } else {
+      taskFuture = _jobRepository.fetchReviseAddIndex(state.id);
+    }
+
+    var result = await taskFuture;
+
+    //处理数据
+    if (result.isSuccess) {
+      state.addEditEntity = result.data;
+
+      TextEditingController reviseHourController = state.formData['revise_hour']!['controller'];
+      TextEditingController reasonController = state.formData['reason']!['controller'];
+
+      reviseHourController.text = state.addEditEntity?.reviseHours ?? "";
+      reasonController.text = state.addEditEntity?.reviseMsg ?? "";
+
+      update();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchRequestDetail();
+  }
+
+  /// 提交
+  void doSubmit() async {
+    TextEditingController reviseHourController = state.formData['revise_hour']!['controller'];
+    TextEditingController reasonController = state.formData['reason']!['controller'];
+    String reviseHour = reviseHourController.text.toString();
+    String reason = reasonController.text.toString();
+
+    if (Utils.isEmpty(reviseHour)) {
+      ToastEngine.show("Enter Revise Hour".tr);
+      return;
+    } else if (Utils.isEmpty(reason)) {
+      ToastEngine.show("Enter Reason".tr);
+      return;
+    }
+
+    Future<HttpResult> taskFuture;
+    if (state.pageType != 0 && Utils.isNotEmpty(state.id) && state.id != "0") {
+      taskFuture = _jobRepository.submitReviseEdit(
+        state.id,
+        reviseHour,
+        reason,
+        cancelToken: cancelToken,
+      );
+    } else {
+      taskFuture = _jobRepository.submitReviseAdd(
+        state.id,
+        reviseHour,
+        reason,
+        cancelToken: cancelToken,
+      );
+    }
+
+    var result = await taskFuture;
+
+    //处理数据
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      //根据类型刷新
+      if (state.pageType != 0 && Utils.isNotEmpty(state.id) && state.id != "0") {
+        //编辑就发送指定的 reviseId 刷新
+        state.cb?.call(state.id ?? "");
+      } else {
+        //新增的就发送空
+        state.cb?.call("");
+      }
+
+      Get.back();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+}

+ 70 - 0
packages/cpt_job_sg/lib/modules/revise_add_edit/revise_add_edit_item.dart

@@ -0,0 +1,70 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/job_applied_list_s_g_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:plugin_basic/basic_export.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/shatter/border_select_widget.dart';
+
+/**
+ * 每一个选项
+ */
+class ReviseAddEditItem extends StatelessWidget {
+  final String title;
+  final String content;
+
+  ReviseAddEditItem({
+    required this.title,
+    required this.content,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Column(
+      mainAxisSize: MainAxisSize.min,
+      crossAxisAlignment: CrossAxisAlignment.start,
+      children: [
+
+        //工作标题,选择模板
+        MyTextView(
+          title,
+          textColor:ColorConstants.white,
+          isFontRegular: true,
+          marginTop: 14,
+          fontSize: 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(
+                content,
+                fontSize: 15,
+                isFontRegular: true,
+                textColor: ColorConstants.white,
+              ).expanded(),
+
+            ],
+          ),
+        ),
+
+      ],
+    );
+  }
+}

+ 223 - 0
packages/cpt_job_sg/lib/modules/revise_add_edit/revise_add_edit_page.dart

@@ -0,0 +1,223 @@
+import 'package:cpt_job_sg/modules/revise_add_edit/revise_add_edit_item.dart';
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter/widgets.dart';
+import 'package:get/get.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:shared/utils/util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.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 'revise_add_edit_controller.dart';
+import 'revise_add_edit_state.dart';
+
+/**
+ * Revise数据的添加,编辑,详情的页面
+ */
+class ReviseAddEditPage extends BaseStatefulPage<ReviseAddEditController> {
+  ReviseAddEditPage({Key? key}) : super(key: key);
+
+  //启动当前页面,pageType 0 是新增  1是编辑  2是详情
+  static void startInstance(int pageType, String? id, void Function(dynamic value)? cb) {
+    return Get.start(RouterPath.REVISE_EDIT_SG, arguments: {'pageType': pageType, 'id': id,'cb': cb});
+  }
+
+  @override
+  ReviseAddEditController createRawController() {
+    return ReviseAddEditController();
+  }
+
+  @override
+  State<ReviseAddEditPage> createState() => _LabourRequestAddState();
+}
+
+class _LabourRequestAddState extends BaseState<ReviseAddEditPage, ReviseAddEditController> {
+  late ReviseAddEditState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+    state.pageType = Get.arguments['pageType'];
+    state.id = Get.arguments['id'];
+    state.cb = Get.arguments['cb'] as void Function(dynamic)?;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(
+            context,
+            state.pageType == 0
+                ? "Add Revise".tr
+                : state.pageType == 1
+                    ? "Edit Revise".tr
+                    : "Detail".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: [
+                      ReviseAddEditItem(title: "Staff Name".tr, content: state.addEditEntity?.labourerName ?? ""),
+
+                      ReviseAddEditItem(title: "Job Date".tr, content: state.addEditEntity?.jobDate ?? ""),
+
+                      ReviseAddEditItem(title: "Job Start Time".tr, content: state.addEditEntity?.startTime ?? ""),
+
+                      ReviseAddEditItem(title: "Job End Time".tr, content: state.addEditEntity?.endTime ?? ""),
+
+                      ReviseAddEditItem(title: "Security Clock In".tr, content: state.addEditEntity?.securityIn ?? ""),
+
+                      ReviseAddEditItem(title: "Security Clock Out".tr, content: state.addEditEntity?.securityOut ?? ""),
+
+                      ReviseAddEditItem(title: "Work Clock In".tr, content: state.addEditEntity?.workIn ?? ""),
+
+                      ReviseAddEditItem(title: "Work Clock Out".tr, content: state.addEditEntity?.workOut ?? ""),
+
+                      ReviseAddEditItem(title: "+/- Hours".tr, content: state.addEditEntity?.adjustHours ?? ""),
+
+                      ReviseAddEditItem(title: "Total Hours".tr, content: state.addEditEntity?.totalHours ?? ""),
+
+                      //修改的小时
+                      FormRequireText(
+                        fontSize: 15,
+                        text: "Revise Hours".tr,
+                      ).marginOnly(top: 15),
+
+                      //输入框
+                      CustomTextField(
+                        formKey: "revise_hour",
+                        marginLeft: 0,
+                        marginRight: 0,
+                        paddingTop: 0,
+                        paddingBottom: 0,
+                        height: 45,
+                        fillBackgroundColor: Color(0xFF4DCFF6).withOpacity(state.pageType == 2 ? 0.5 : 0.2),
+                        enabled: state.pageType != 2,
+                        textInputType: TextInputType.number,
+                        formData: state.formData,
+                        textInputAction: TextInputAction.next,
+                        onSubmit: (key, value) {
+                          state.formData[key]!['focusNode'].unfocus();
+                          FocusScope.of(context).requestFocus(state.formData['reason']!['focusNode']);
+                        },
+                        marginTop: 10,
+                      ),
+
+                      //修改的原因
+                      FormRequireText(
+                        fontSize: 15,
+                        text: "Reason".tr,
+                      ).marginOnly(top: 15),
+
+                      //输入框
+                      IgnoreKeyboardDismiss(
+                        child: Container(
+                          height: 160,
+                          padding: EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                          decoration: BoxDecoration(
+                            color: Color(0xFF4DCFF6).withOpacity(state.pageType == 2 ? 0.5 : 0.2),
+                            borderRadius: const BorderRadius.all(Radius.circular(5)),
+                          ),
+                          child: TextField(
+                            enabled: state.pageType != 2,
+                            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.textGrayAECAE5,
+                                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();
+                              controller.doSubmit();
+                            },
+                          ),
+                        ),
+                      ).marginOnly(top: 10),
+
+                      //提交按钮
+                      Visibility(
+                        visible: state.pageType != 2,
+                        child: 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,
+                        ).marginOnly(top: 20),
+                      ),
+
+                      SizedBox(height: 20),
+                    ],
+                  ).paddingOnly(left: 15, right: 15),
+                ),
+              ),
+            ),
+          ),
+        ),
+      );
+    });
+  }
+}

+ 33 - 0
packages/cpt_job_sg/lib/modules/revise_add_edit/revise_add_edit_state.dart

@@ -0,0 +1,33 @@
+import 'package:domain/entity/response/add_edit_revise_view_s_g_entity.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/basic_export.dart';
+
+class ReviseAddEditState {
+
+  int pageType = 0;  //页面的状态 0 是新增  1是编辑  2是详情
+  String? id;  //编辑和详情需要用到ID,新增是 appliedId  编辑和详情是 reviseId
+  void Function(dynamic value)? cb;
+
+  //页面对应的详情数据
+  AddEditReviseViewSGEntity? addEditEntity;
+
+
+  //表单的校验与数据
+  Map<String, Map<String, dynamic>> formData = {
+    'revise_hour': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Enter...'.tr,
+      'obsecure': false,
+    },
+    'reason': {
+      'value': '',
+      'controller': TextEditingController(),
+      'focusNode': FocusNode(),
+      'hintText': 'Enter...'.tr,
+      'obsecure': false,
+    },
+  };
+
+}

+ 243 - 0
packages/cpt_job_sg/lib/modules/revise_applied/revise_applied_controller.dart

@@ -0,0 +1,243 @@
+import 'package:cpt_job_sg/modules/revise_add_edit/revise_add_edit_page.dart';
+import 'package:domain/entity/response/revise_list_s_g_entity.dart';
+import 'package:domain/repository/job_sg_repository.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/engine/notify/notify_engine.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:widgets/dialog/app_default_dialog.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../revise_log/revise_log_page.dart';
+import 'revise_applied_state.dart';
+
+class ReviseAppliedController extends GetxController with DioCancelableMixin {
+  final JobSGRepository _jobRepository = Get.find();
+  final ReviseAppliedState state = ReviseAppliedState();
+
+  var _curPage = 1;
+  var _needShowPlaceholder = true;
+
+  //页面PlaceHolder的展示
+  LoadState loadingState = LoadState.State_Success;
+  String? errorMessage;
+
+  //刷新页面状态
+  void changeLoadingState(LoadState state) {
+    loadingState = state;
+    update();
+  }
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,
+    controlFinishLoad: true,
+  );
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    _curPage = 1;
+    fetchNotifyList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchNotifyList();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchNotifyList();
+  }
+
+  /// 获取服务器数据,通知消息列表
+  Future fetchNotifyList() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading);
+    }
+
+    // 并发执行两个请求
+
+    var listResult = await _jobRepository.fetchReviseList(
+      state.appliedId,
+      null,
+      null,
+      null,
+      null,
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
+
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.rows);
+    } else {
+      errorMessage = listResult.errorMsg;
+      changeLoadingState(LoadState.State_Error);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+  // 处理数据与展示的逻辑
+  void handleList(List<ReviseListSGRows>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state.datas.clear();
+        state.datas.addAll(list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success);
+      } else {
+        //加载更多
+        state.datas.addAll(list);
+        refreshController.finishLoad();
+        update();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state.datas.clear();
+        changeLoadingState(LoadState.State_Empty);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchNotifyList();
+  }
+
+  @override
+  void onClose() {
+    state.datas.clear();
+    super.onClose();
+  }
+
+  /// 去日志页面
+  void gotoReviseLogsPage(int index) {
+    ReviseLogPage.startInstance(state.datas[index].reviseId);
+  }
+
+  /// 去详情页面
+  void gotoReviseEditPage(int index) {
+    ReviseAddEditPage.startInstance(1, state.datas[index].reviseId, (result) {
+      if (result is String) {
+        //编辑之后刷新当前Item
+        fetchItemByIdAndRefreshItem(result);
+      }
+    });
+  }
+
+  /// 去编辑页面
+  void gotoReviseDetailPage(int index) {
+    ReviseAddEditPage.startInstance(2, state.datas[index].reviseId, null);
+  }
+
+  //执行取消操作
+  void doRecallAction(int index) {
+    DialogEngine.show(
+        widget: AppDefaultDialog(
+      title: "Confirmation".tr,
+      message: "Are you sure you want to recall this revise?".tr,
+      confirmAction: () {
+        _requestRecall(index);
+      },
+    ));
+  }
+
+  //执行删除操作
+  void doDeleteAction(int index) {
+    DialogEngine.show(
+        widget: AppDefaultDialog(
+      title: "Confirmation".tr,
+      message: "Are you sure you want to delete this revise?".tr,
+      confirmAction: () {
+        _requestDeactivate(index);
+      },
+    ));
+  }
+
+  // 请求接口删除Job
+  void _requestDeactivate(int index) async {
+    var result = await _jobRepository.deleteRevise(state.datas[index].reviseId, cancelToken: cancelToken);
+
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      if (state.datas.length <= 1) {
+        refreshController.callRefresh();
+      } else {
+        state.datas.removeAt(index);
+        update();
+      }
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
+  void _requestRecall(int index) async {
+    var result = await _jobRepository.recallRevise(state.datas[index].reviseId, cancelToken: cancelToken);
+
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      fetchItemByIdAndRefreshItem(state.datas[index].reviseId ?? "");
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
+  /// 根据ID获取Item对象,用于刷新
+  void fetchItemByIdAndRefreshItem(String ids) async {
+    var result = await _jobRepository.fetchReviseListByIds(
+      ids,
+      cancelToken: cancelToken,
+    );
+
+    //处理数据
+    if (result.isSuccess) {
+      var data = result.data;
+      if (data != null && data.rows.isNotEmpty) {
+        List<ReviseListSGRows> newItem = data.rows;
+
+        // 创建一个 Map 来加速查找
+        Map<String, ReviseListSGRows> newItemMap = {for (var item in newItem) item.reviseId ?? "": item};
+
+        // 遍历 state.datas 进行替换
+        for (int i = 0; i < state.datas.length; i++) {
+          if (newItemMap.containsKey(state.datas[i].reviseId)) {
+            state.datas[i] = newItemMap[state.datas[i].reviseId]!;
+          }
+        }
+
+        //刷新
+        update();
+      }
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+    }
+  }
+
+  //去添加Revise
+  void gotoReviewAddPage() {
+    ReviseAddEditPage.startInstance(0, state.appliedId, (value) {
+      //添加成功,刷新页面
+      refreshController.callRefresh();
+    });
+  }
+}

+ 143 - 0
packages/cpt_job_sg/lib/modules/revise_applied/revise_applied_page.dart

@@ -0,0 +1,143 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.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/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_appbar.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../revise_list/revise_list_item.dart';
+import 'revise_applied_controller.dart';
+import 'revise_applied_state.dart';
+
+/**
+ * Revise的全部列表
+ */
+class ReviseAppliedPage extends BaseStatefulPage<ReviseAppliedController> {
+  ReviseAppliedPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance(String? appliedId, String? jobTitle, String? jobDate) {
+    return Get.start(RouterPath.REVISE_APPLIED_SG, arguments: {'appliedId': appliedId, 'jobTitle': jobTitle, 'jobDate': jobDate});
+  }
+
+  @override
+  ReviseAppliedController createRawController() {
+    return ReviseAppliedController();
+  }
+
+  @override
+  State<ReviseAppliedPage> createState() => _JobListState();
+}
+
+class _JobListState extends BaseState<ReviseAppliedPage, ReviseAppliedController> {
+  late ReviseAppliedState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+    state.appliedId = Get.arguments['appliedId'];
+    state.jobTitle = Get.arguments['jobTitle'];
+    state.jobDate = Get.arguments['jobDate'];
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return SafeArea(
+        bottom: true,
+        top: false,
+        child: Container(
+          width: double.infinity,
+          height: double.infinity,
+          padding: EdgeInsets.only(top: ScreenUtil.getStatusBarH(context)),
+          decoration: const BoxDecoration(
+            gradient: LinearGradient(
+              colors: [
+                Color(0xFF091D44),
+                Color(0xFF245A8A),
+                Color(0xFF7F7CEC),
+              ],
+              begin: Alignment.topCenter,
+              end: Alignment.bottomCenter,
+            ),
+          ),
+          child: Column(
+            children: [
+              MyAppBar.titleBar(
+                context,
+                state.jobTitle ?? "Title".tr,
+                subTitle: "(${state.jobDate ?? "-"})",
+                subTitleColor: ColorConstants.textGrayAECAE5,
+              ),
+
+              // 添加按钮
+              MyButton(
+                type: ClickType.throttle,
+                milliseconds: 500,
+                onPressed: () {
+                  FocusScope.of(context).unfocus();
+                  controller.gotoReviewAddPage();
+                },
+                text: "Add Revise".tr,
+                textColor: ColorConstants.white,
+                fontSize: 16,
+                radius: 20,
+                backgroundColor: hexToColor("#FFBB1B"),
+                fontWeight: FontWeight.w500,
+              ).marginOnly(left: 15, right: 15, top: 15, bottom: 5),
+
+              //底部的列表
+              EasyRefresh(
+                controller: controller.refreshController,
+                onRefresh: controller.onRefresh,
+                onLoad: controller.loadMore,
+                child: LoadStateLayout(
+                  state: controller.loadingState,
+                  errorMessage: controller.errorMessage,
+                  errorRetry: () {
+                    controller.retryRequest();
+                  },
+                  successSliverWidget: [
+                    SliverList(
+                        delegate: SliverChildBuilderDelegate(
+                      (context, index) {
+                        return ReviseListItem(
+                          index: index,
+                          item: state.datas[index],
+                          onDetailAction: () {
+                            controller.gotoReviseDetailPage(index);
+                          },
+                          onLogsAction: () {
+                            controller.gotoReviseLogsPage(index);
+                          },
+                          onDeleteAction: () {
+                            controller.doDeleteAction(index);
+                          },
+                          onRecallAction: () {
+                            controller.doRecallAction(index);
+                          },
+                          onEditAction: () {
+                            controller.gotoReviseEditPage(index);
+                          },
+                        );
+                      },
+                      childCount: state.datas.length,
+                    ))
+                  ],
+                ),
+              ).marginOnly(top: 5, bottom: 5).expanded(),
+            ],
+          ),
+        ),
+      );
+    });
+  }
+}

+ 10 - 0
packages/cpt_job_sg/lib/modules/revise_applied/revise_applied_state.dart

@@ -0,0 +1,10 @@
+import 'package:domain/entity/response/revise_list_s_g_entity.dart';
+
+class ReviseAppliedState {
+  String? appliedId;
+  String? jobTitle;
+  String? jobDate;
+
+  //页面的列表数据
+  List<ReviseListSGRows> datas = [];
+}

+ 8 - 2
packages/cpt_job_sg/lib/modules/revise_list/revise_list_controller.dart

@@ -1,3 +1,4 @@
+import 'package:cpt_job_sg/modules/revise_add_edit/revise_add_edit_page.dart';
 import 'package:domain/entity/response/revise_index_s_g_entity.dart';
 import 'package:domain/entity/response/revise_list_s_g_entity.dart';
 import 'package:domain/repository/job_sg_repository.dart';
@@ -198,12 +199,17 @@ class ReviseListController extends GetxController with DioCancelableMixin {
 
   /// 去详情页面
   void gotoReviseEditPage(int index) {
-
+    ReviseAddEditPage.startInstance(1, state.datas[index].reviseId,(result){
+      if (result is String){
+        //编辑之后刷新当前Item
+        fetchItemByIdAndRefreshItem(result);
+      }
+    });
   }
 
   /// 去编辑页面
   void gotoReviseDetailPage(int index) {
-
+    ReviseAddEditPage.startInstance(2, state.datas[index].reviseId,null);
   }
 
   //执行取消操作

+ 12 - 0
packages/cpt_job_sg/lib/router/page_router.dart

@@ -7,6 +7,8 @@ import '../modules/applied_staff/applied_staff_page.dart';
 import '../modules/applied_staff_detail/applied_staff_detail_page.dart';
 import '../modules/applied_staff_reviews/applied_staff_reviews_page.dart';
 import '../modules/job_applied/job_applied_page.dart';
+import '../modules/revise_add_edit/revise_add_edit_page.dart';
+import '../modules/revise_applied/revise_applied_page.dart';
 
 class JobPageSGRouter {
   static final routes = [
@@ -42,5 +44,15 @@ class JobPageSGRouter {
       page: () => ReviseLogPage(),
     ),
 
+    GetPage(
+      name: RouterPath.REVISE_EDIT_SG,
+      page: () => ReviseAddEditPage(),
+    ),
+
+    GetPage(
+      name: RouterPath.REVISE_APPLIED_SG,
+      page: () => ReviseAppliedPage(),
+    ),
+
   ];
 }

+ 4 - 3
packages/cpt_labour_sg/lib/modules/job_list/job_list_item.dart

@@ -63,7 +63,7 @@ class JobListItem extends StatelessWidget {
             crossAxisAlignment: CrossAxisAlignment.center,
             children: [
               MyTextView(
-                "Job Date:".tr,
+                "Job Date".tr + ":",
                 isFontRegular: true,
                 textColor: ColorConstants.textGrayAECAE5,
                 fontSize: 14,
@@ -145,7 +145,6 @@ class JobListItem extends StatelessWidget {
                 isFontRegular: true,
                 textColor: ColorConstants.textYellowFFBB1B,
                 fontSize: 14,
-                onClick: onAppliedAction,
               ).expanded(),
             ],
           ).marginOnly(top: 15),
@@ -253,6 +252,8 @@ class JobListItem extends StatelessWidget {
           ),
         ],
       ),
-    );
+    ).onTap(() {
+      onAppliedAction?.call();
+    });
   }
 }

+ 2 - 0
packages/cs_domain/lib/repository/job_sg_repository.dart

@@ -645,6 +645,7 @@ class JobSGRepository extends GetxService {
     final result = await httpProvider.requestNetResult(
       ApiConstants.apiAddReviseViewSG,
       params: params,
+      isShowLoadingDialog: true,
       cancelToken: cancelToken,
     );
 
@@ -670,6 +671,7 @@ class JobSGRepository extends GetxService {
     final result = await httpProvider.requestNetResult(
       ApiConstants.apiEditReviseViewSG,
       params: params,
+      isShowLoadingDialog: true,
       cancelToken: cancelToken,
     );
 

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

@@ -10,7 +10,7 @@ const Map<String, String> en_US = {
   'Name/Mobile': 'Name/Mobile',
   'Check In': 'Check In',
   'Check Out': 'Check Out',
-  'Job Date:': 'Job Date:',
+  'Job Date': 'Job Date',
   'Start Time:': 'Start Time:',
   'End Time:': 'End Time:',
   'Start Time': 'Start Time',
@@ -225,6 +225,9 @@ const Map<String, String> en_US = {
   'Date Time': 'Date Time',
   'Action': 'Action',
   'Content': 'Content',
+  'Revise': 'Revise',
+  'Add Revise': 'Add Revise',
+  'Edit Revise': 'Edit Revise',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

+ 4 - 1
packages/cs_resources/lib/local/language/vi_VN.dart

@@ -10,7 +10,7 @@ const Map<String, String> vi_VN = {
   "Name/Mobile": "Tên / Số điện thoại",
   "Check In": "Đăng ký vào",
   "Check Out": "Đăng ký ra",
-  "Job Date:": "Ngày làm việc:",
+  "Job Date": "Ngày làm việc",
   "Start Time:": "Thời gian bắt đầu:",
   "End Time:": "Thời gian kết thúc:",
   "Start Time": "Thời gian bắt đầu",
@@ -225,6 +225,9 @@ const Map<String, String> vi_VN = {
   'Date Time': 'Ngày giờ',
   'Action': 'Sự kiện',
   'Content': 'Nội dung',
+  'Revise': 'Sửa đổi',
+  'Add Revise': 'Thêm sửa đổi',
+  'Edit Revise': 'Sửa đổi',
 
   //插件的国际化
   "Pull to refresh": "Kéo để làm mới",

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

@@ -10,7 +10,7 @@ const Map<String, String> zh_CN = {
   'Name/Mobile': '请输入姓名或电话',
   'Check In': '签到',
   'Check Out': '签出',
-  'Job Date:': '工作日期:',
+  'Job Date': '工作日期',
   'Start Time:': '开始时间:',
   'End Time:': '结束时间:',
   'Start Time': '开始时间',
@@ -209,7 +209,7 @@ const Map<String, String> zh_CN = {
   'Work Clock In': '工作地签到',
   'Work Clock Out': '工作地签出',
   'Security Clock In': '门卫签到',
-  'Security Clock Out': '门卫签',
+  'Security Clock Out': '门卫签',
   'Applied': '已通过',
   'No Show': '缺席',
   'Modify': '修改',
@@ -225,6 +225,9 @@ const Map<String, String> zh_CN = {
   'Date Time': '日期时间',
   'Action': '事件',
   'Content': '内容',
+  'Revise': '修改',
+  'Add Revise': '添加修改',
+  'Edit Revise': '编辑修改',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',