Ver código fonte

用工请求的入口页面

liukai 8 meses atrás
pai
commit
e146583934
42 arquivos alterados com 2313 adições e 187 exclusões
  1. 2 0
      app/lib/main.dart
  2. 1 1
      packages/cpt_auth/lib/modules/main/main_controller.dart
  3. 7 0
      packages/cpt_job/lib/modules/labour_request_add/labour_request_add_controller.dart
  4. 74 0
      packages/cpt_job/lib/modules/labour_request_add/labour_request_add_page.dart
  5. 5 0
      packages/cpt_job/lib/modules/labour_request_add/labour_request_add_state.dart
  6. 278 0
      packages/cpt_job/lib/modules/labour_request_list/labour_request_item.dart
  7. 190 0
      packages/cpt_job/lib/modules/labour_request_list/labour_request_list_controller.dart
  8. 170 0
      packages/cpt_job/lib/modules/labour_request_list/labour_request_list_page.dart
  9. 17 0
      packages/cpt_job/lib/modules/labour_request_list/labour_request_list_state.dart
  10. 7 0
      packages/cpt_job/lib/modules/labour_request_workflow/labour_request_workflow_controller.dart
  11. 75 0
      packages/cpt_job/lib/modules/labour_request_workflow/labour_request_workflow_page.dart
  12. 5 0
      packages/cpt_job/lib/modules/labour_request_workflow/labour_request_workflow_state.dart
  13. 0 81
      packages/cpt_job/lib/modules/sign_in_sign_out/sign_in_sign_out_page.dart
  14. 5 1
      packages/cpt_job/lib/router/job_service_impl.dart
  15. 21 1
      packages/cpt_job/lib/router/page_router.dart
  16. 346 0
      packages/cpt_job/lib/widget/labour_request_filter.dart
  17. 26 0
      packages/cs_domain/lib/constants/api_constants.dart
  18. 59 0
      packages/cs_domain/lib/entity/response/labour_request_add_option_entity.dart
  19. 67 0
      packages/cs_domain/lib/entity/response/labour_request_edit_index_entity.dart
  20. 59 0
      packages/cs_domain/lib/entity/response/labour_request_index_entity.dart
  21. 56 0
      packages/cs_domain/lib/entity/response/labour_request_list_entity.dart
  22. 48 0
      packages/cs_domain/lib/generated/json/base/json_convert_content.dart
  23. 111 0
      packages/cs_domain/lib/generated/json/labour_request_add_option_entity.g.dart
  24. 139 0
      packages/cs_domain/lib/generated/json/labour_request_edit_index_entity.g.dart
  25. 111 0
      packages/cs_domain/lib/generated/json/labour_request_index_entity.g.dart
  26. 122 0
      packages/cs_domain/lib/generated/json/labour_request_list_entity.g.dart
  27. 1 0
      packages/cs_domain/lib/repository/job_repository.dart
  28. 235 0
      packages/cs_domain/lib/repository/labour_repository.dart
  29. 2 0
      packages/cs_initializer/lib/global_services_injection.dart
  30. 4 4
      packages/cs_plugin_basic/lib/dio_interceptors/interceptor_auth_dio.dart
  31. 9 9
      packages/cs_plugin_platform/lib/engine/dialog/dialog_engine.dart
  32. BIN
      packages/cs_resources/assets/base_service/dialog_delete_icon.webp
  33. BIN
      packages/cs_resources/assets/base_service/title_bar_filter_icon.webp
  34. BIN
      packages/cs_resources/assets/base_service/triangle_drop_down_icon.webp
  35. 1 0
      packages/cs_resources/lib/constants/color_constants.dart
  36. 3 0
      packages/cs_resources/lib/generated/assets.dart
  37. 16 0
      packages/cs_resources/lib/local/language/en_US.dart
  38. 16 0
      packages/cs_resources/lib/local/language/zh_CN.dart
  39. 2 0
      packages/cs_router/lib/componentRouter/job_service.dart
  40. 8 3
      packages/cs_router/lib/path/router_path.dart
  41. 0 86
      packages/cs_widgets/lib/dialog/app_default_dialog.dart
  42. 15 1
      packages/cs_widgets/lib/my_text_view.dart

+ 2 - 0
app/lib/main.dart

@@ -75,6 +75,8 @@ class MyApp extends StatelessWidget {
           triggerOffset: 50,
           iconDimension: 22,
           textStyle: const TextStyle(color: Color(0XFFAECAE5), fontSize: 14),
+          messageStyle: const TextStyle(color: Color(0XFFAECAE5), fontSize: 12),
+          iconTheme: const IconThemeData(color: Color(0XFFAECAE5)),
           backgroundColor: Colors.transparent,
         );
 

+ 1 - 1
packages/cpt_auth/lib/modules/main/main_controller.dart

@@ -110,7 +110,7 @@ class MainController extends GetxController {
   void gotoModulePage(HomeModule module) {
     switch (module.key) {
       case 'labReq':
-        ToastEngine.show("进入 Labour Request 模块");
+        ComponentRouterServices.jobService.startLabourRequestPage();
         break;
       case 'jobList':
         ToastEngine.show("进入 Job List 模块");

+ 7 - 0
packages/cpt_job/lib/modules/labour_request_add/labour_request_add_controller.dart

@@ -0,0 +1,7 @@
+import 'package:get/get.dart';
+
+import 'labour_request_add_state.dart';
+
+class LabourRequestAddController extends GetxController {
+  final LabourRequestAddState state = LabourRequestAddState();
+}

+ 74 - 0
packages/cpt_job/lib/modules/labour_request_add/labour_request_add_page.dart

@@ -0,0 +1,74 @@
+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/my_appbar.dart';
+
+import 'labour_request_add_controller.dart';
+import 'labour_request_add_state.dart';
+
+
+class LabourRequestAddPage extends BaseStatefulPage<LabourRequestAddController> {
+  LabourRequestAddPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.JOB_LABOUR_REQUEST_ADD);
+  }
+
+  @override
+  LabourRequestAddController createRawController() {
+    return LabourRequestAddController();
+  }
+
+  @override
+  State<LabourRequestAddPage> createState() => _LabourRequestAddState();
+
+}
+
+class _LabourRequestAddState extends BaseState<LabourRequestAddPage, LabourRequestAddController> {
+
+  late LabourRequestAddState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(context, "Add Labour Requisition".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: Container(),
+          ),
+        ),
+      );
+    });
+  }
+}
+
+

+ 5 - 0
packages/cpt_job/lib/modules/labour_request_add/labour_request_add_state.dart

@@ -0,0 +1,5 @@
+class LabourRequestAddState {
+  LabourRequestAddState() {
+    ///Initialize variables
+  }
+}

+ 278 - 0
packages/cpt_job/lib/modules/labour_request_list/labour_request_item.dart

@@ -0,0 +1,278 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:domain/entity/response/labour_request_list_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_text_view.dart';
+
+/**
+ * 用工请求的主页面列表
+ */
+class LabourRequestItem extends StatelessWidget {
+  final int index;
+  final LabourRequestListRows item;
+  final VoidCallback? onStatusAction;
+  final VoidCallback? onRecallAction;
+  final VoidCallback? onDetailAction;
+  final VoidCallback? onEditAction;
+
+  LabourRequestItem({
+    required this.index,
+    required this.item,
+    this.onStatusAction,
+    this.onRecallAction,
+    this.onDetailAction,
+    this.onEditAction,
+  });
+
+  @override
+  Widget build(BuildContext context) {
+    return Container(
+      padding: EdgeInsets.symmetric(vertical: 23, horizontal: 21),
+      margin: EdgeInsets.only(left: 15, right: 15, top: 5, bottom: 5),
+      decoration: BoxDecoration(
+        color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
+        borderRadius: BorderRadius.circular(5), // 设置圆角
+      ),
+      child: Column(
+        mainAxisSize: MainAxisSize.max,
+        crossAxisAlignment: CrossAxisAlignment.start,
+        children: [
+          //工作标题
+          MyTextView(
+            item.jobTitle ?? "-",
+            isFontMedium: true,
+            textColor: ColorConstants.textYellowFFBB1B,
+            fontSize: 14,
+            textDecoration: TextDecoration.underline,
+            decorationColor: ColorConstants.textYellowFFBB1B, // 可选,设置下划线的颜色
+            decorationThickness: 2.0, // 可选,设置下划线的粗细
+            decorationStyle: TextDecorationStyle.solid, // 可选,设置下划线的样式
+          ),
+
+          // 部门
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Outlet:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //部门
+              MyTextView(
+                item.departmentName ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 15),
+
+          // 工作日期时间
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Datetime:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //日期时间
+              MyTextView(
+                item.jobTime ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 15),
+
+          // 人数
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "No. of Staff:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //人数
+              MyTextView(
+                item.needNum?.toString() ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 15),
+
+          // 状态
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Status:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //状态
+              MyTextView(
+                item.coStatusShow ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 15),
+
+          // 发布状态
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Publish Status:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //发布状态
+              MyTextView(
+                item.publishStatus ? " Published".tr : " Unpublished".tr,
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 15),
+
+          // 创建时间
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Created At:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //发布状态
+              MyTextView(
+                item.createdAt ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 15),
+
+          //按钮组
+          Visibility(
+            visible: item.actionList?.isNotEmpty ?? false,
+            child: Row(
+              mainAxisSize: MainAxisSize.max,
+              mainAxisAlignment: MainAxisAlignment.end,
+              crossAxisAlignment: CrossAxisAlignment.center,
+              children: [
+                //详情按钮
+                Visibility(
+                  visible: item.actionList?.contains("detail") ?? false,
+                  child: MyButton(
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      onDetailAction?.call();
+                    },
+                    text: "Detail".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor(
+                      "#56AAFF",
+                    ),
+                    radius: 17.25,
+                    minWidth: 60,
+                    minHeight: 35,
+                  ).marginOnly(left: 15),
+                ),
+
+                //Recall按钮
+                Visibility(
+                  visible: item.actionList?.contains("recall") ?? false,
+                  child: MyButton(
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      onRecallAction?.call();
+                    },
+                    text: "Recall".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor("#FFBB1B"),
+                    radius: 17.25,
+                    minWidth: 60,
+                    minHeight: 35,
+                  ).marginOnly(left: 15),
+                ),
+
+                //Edit按钮
+                Visibility(
+                  visible: item.actionList?.contains("edit") ?? false,
+                  child: MyButton(
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      onRecallAction?.call();
+                    },
+                    text: "Edit".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor("#FFBB1B"),
+                    radius: 17.25,
+                    minWidth: 60,
+                    minHeight: 35,
+                  ).marginOnly(left: 15),
+                ),
+
+                //状态工作流按钮
+                Visibility(
+                  visible: item.actionList?.contains("status") ?? false,
+                  child: MyButton(
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      onStatusAction?.call();
+                    },
+                    text: "Status".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor("#0AC074"),
+                    radius: 17.25,
+                    minWidth: 60,
+                    minHeight: 35,
+                  ).marginOnly(left: 15),
+                ),
+              ],
+            ).marginOnly(top: 18, bottom: 2),
+          ),
+        ],
+      ),
+    );
+  }
+}

+ 190 - 0
packages/cpt_job/lib/modules/labour_request_list/labour_request_list_controller.dart

@@ -0,0 +1,190 @@
+import 'package:cpt_job/modules/labour_request_add/labour_request_add_page.dart';
+import 'package:domain/entity/response/labour_request_index_entity.dart';
+import 'package:domain/entity/response/labour_request_list_entity.dart';
+import 'package:domain/repository/labour_repository.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
+import 'package:plugin_platform/http/http_result.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import '../../widget/labour_request_filter.dart';
+import 'labour_request_list_state.dart';
+
+class LabourRequestListController extends GetxController {
+  final LabourRepository _labourRepository = Get.find();
+  final LabourRequestListState state = LabourRequestListState();
+
+  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 futures = [
+      _labourRepository.fetchLabourRequestList(
+        state.keyword,
+        DateTimeUtils.formatDate(state.selectedStartDate, format: "yyyy-MM-dd"),
+        DateTimeUtils.formatDate(state.selectedEndDate, format: "yyyy-MM-dd"),
+        state.selectedStatusId,
+        state.selectedDepartmentId,
+        curPage: _curPage,
+      ),
+      state.indexOptions == null ? _labourRepository.fetchLabourRequestIndex() : Future(() => HttpResult(isSuccess: true).convert(data: state.indexOptions!)),
+    ];
+
+    //拿到结果
+    var results = await Future.wait(futures);
+    var listResult = results[0] as HttpResult<LabourRequestListEntity>;
+    var optionResult = results[1] as HttpResult<LabourRequestIndexEntity>;
+
+    //选项数据
+    if (state.indexOptions == null && optionResult.isSuccess) {
+      state.indexOptions = optionResult.data!;
+    }
+
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.rows);
+    } else {
+      errorMessage = listResult.errorMsg;
+      changeLoadingState(LoadState.State_Error);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+  // 处理数据与展示的逻辑
+  void handleList(List<LabourRequestListRows>? 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);
+      }
+    }
+  }
+
+  // 执行搜索
+  void doSearch(String keyword) {
+    state.keyword = keyword;
+    //赋值之后刷新
+    refreshController.callRefresh();
+  }
+
+  // 清空搜索条件
+  void resetFiltering() {
+    state.keyword = "";
+    state.searchController.text = "";
+
+    state.selectedStartDate = null;
+    state.selectedEndDate = null;
+    state.selectedStatusId = null;
+    state.selectedDepartmentId = null;
+
+    //赋值之后刷新
+    refreshController.callRefresh();
+  }
+
+  //展示筛选的弹窗
+  void showFilterDialog() {
+    if (state.indexOptions != null) {
+      DialogEngine.show(
+        widget: LabourRequestFilter(
+          optionResult: state.indexOptions!,
+          selectedStartDate: state.selectedStartDate,
+          selectedEndDate: state.selectedEndDate,
+          selectedStatusId: state.selectedStatusId,
+          selectedDepartmentId: state.selectedDepartmentId,
+          onResetAction: () {
+            //重置参数
+            resetFiltering();
+          },
+          onFilterAction: (startDate, endDate, statusId, departmentId) {
+            state.selectedStartDate = startDate;
+            state.selectedEndDate = endDate;
+            state.selectedStatusId = statusId;
+            state.selectedDepartmentId = departmentId;
+
+            //赋值之后刷新
+            refreshController.callRefresh();
+          },
+        ),
+        position: DialogPosition.top,
+        animType: DialogAnimation.fade,
+      );
+    }
+  }
+
+  //跳转到添加页面
+  void gotoAddLabourPage() {
+    LabourRequestAddPage.startInstance();
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchNotifyList();
+  }
+}

+ 170 - 0
packages/cpt_job/lib/modules/labour_request_list/labour_request_list_page.dart

@@ -0,0 +1,170 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.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:plugin_platform/engine/toast/toast_engine.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/my_load_image.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'labour_request_item.dart';
+import 'labour_request_list_controller.dart';
+import 'labour_request_list_state.dart';
+
+/**
+ * 用工请求的主页列表
+ */
+class LabourRequestListPage extends BaseStatefulPage<LabourRequestListController> {
+  LabourRequestListPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.JOB_LABOUR_REQUEST_LIST);
+  }
+
+  @override
+  LabourRequestListController createRawController() {
+    return LabourRequestListController();
+  }
+
+  @override
+  State<LabourRequestListPage> createState() => _LabourRequestListState();
+}
+
+class _LabourRequestListState extends BaseState<LabourRequestListPage, LabourRequestListController> {
+  late LabourRequestListState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appSearchBar(
+          context,
+          value: state.keyword,
+          hintText: 'Title'.tr,
+          controller: state.searchController,
+          onSearch: (keyword) {
+            controller.doSearch(keyword);
+          },
+          actions: [
+            //重置按钮
+            MyButton(
+              onPressed: () {
+                FocusScope.of(context).unfocus();
+                controller.resetFiltering();
+              },
+              text: "Reset".tr,
+              textColor: ColorConstants.white,
+              backgroundColor: hexToColor("#2BA9F9", opacity: 0.5),
+              radius: 17.25,
+              minWidth: 60,
+              minHeight: 35,
+            ).marginOnly(right: 15),
+
+            //筛选图标
+            MyAssetImage(
+              Assets.baseServiceTitleBarFilterIcon,
+              width: 24,
+              height: 16.5,
+            ).onTap(() {
+              FocusScope.of(context).unfocus();
+              controller.showFilterDialog();
+            }).marginOnly(right: 15),
+          ],
+        ),
+        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: Column(
+              children: [
+                // 添加按钮
+                MyButton(
+                  type: ClickType.throttle,
+                  milliseconds: 500,
+                  onPressed: () {
+                    FocusScope.of(context).unfocus();
+                    controller.gotoAddLabourPage();
+                  },
+                  text: "Create New Job Request".tr,
+                  textColor: ColorConstants.white,
+                  fontSize: 16,
+                  radius: 20,
+                  backgroundColor: hexToColor("#FFBB1B"),
+                  fontWeight: FontWeight.w500,
+                ).marginSymmetric(horizontal: 15, vertical: 15),
+
+                //底部的列表
+                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 LabourRequestItem(
+                            index: index,
+                            item: state.datas[index],
+                            onDetailAction: (){
+                              ToastEngine.show("进入详情");
+                            },
+                            onRecallAction: (){
+                              ToastEngine.show("操作Recall");
+                            },
+                            onEditAction: (){
+                              ToastEngine.show("进入编辑");
+                            },
+                            onStatusAction: (){
+                              ToastEngine.show("进入状态页面");
+                            },
+                          );
+                        },
+                        childCount: state.datas.length,
+                      ))
+                    ],
+                  ),
+                ).expanded(),
+              ],
+            ),
+          ),
+        ),
+      );
+    });
+  }
+}

+ 17 - 0
packages/cpt_job/lib/modules/labour_request_list/labour_request_list_state.dart

@@ -0,0 +1,17 @@
+import 'package:domain/entity/response/labour_request_index_entity.dart';
+import 'package:domain/entity/response/labour_request_list_entity.dart';
+import 'package:flutter/material.dart';
+
+class LabourRequestListState {
+  //筛选条件
+  final TextEditingController searchController = TextEditingController();
+  String keyword = "";
+  DateTime? selectedStartDate;
+  DateTime? selectedEndDate;
+  String? selectedStatusId;
+  String? selectedDepartmentId;
+
+  //页面的列表数据
+  List<LabourRequestListRows> datas = [];
+  LabourRequestIndexEntity? indexOptions;
+}

+ 7 - 0
packages/cpt_job/lib/modules/labour_request_workflow/labour_request_workflow_controller.dart

@@ -0,0 +1,7 @@
+import 'package:get/get.dart';
+
+import 'labour_request_workflow_state.dart';
+
+class LabourRequestWorkflowController extends GetxController {
+  final LabourRequestWorkflowState state = LabourRequestWorkflowState();
+}

+ 75 - 0
packages/cpt_job/lib/modules/labour_request_workflow/labour_request_workflow_page.dart

@@ -0,0 +1,75 @@
+
+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/my_appbar.dart';
+
+import 'labour_request_workflow_controller.dart';
+import 'labour_request_workflow_state.dart';
+
+
+class LabourRequestWorkflowPage extends BaseStatefulPage<LabourRequestWorkflowController> {
+  LabourRequestWorkflowPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance() {
+    return Get.start(RouterPath.JOB_LABOUR_REQUEST_WORKFLOW);
+  }
+
+  @override
+  LabourRequestWorkflowController createRawController() {
+    return LabourRequestWorkflowController();
+  }
+
+  @override
+  State<LabourRequestWorkflowPage> createState() => _LabourRequestWorkflowState();
+
+}
+
+class _LabourRequestWorkflowState extends BaseState<LabourRequestWorkflowPage, LabourRequestWorkflowController> {
+
+  late LabourRequestWorkflowState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return Scaffold(
+        extendBodyBehindAppBar: true,
+        appBar: MyAppBar.appBar(context, "Reset Password".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: Container(),
+          ),
+        ),
+      );
+    });
+  }
+}
+
+

+ 5 - 0
packages/cpt_job/lib/modules/labour_request_workflow/labour_request_workflow_state.dart

@@ -0,0 +1,5 @@
+class LabourRequestWorkflowState {
+  LabourRequestWorkflowState() {
+    ///Initialize variables
+  }
+}

+ 0 - 81
packages/cpt_job/lib/modules/sign_in_sign_out/sign_in_sign_out_page.dart

@@ -170,87 +170,6 @@ class _SignInSignOutPageState extends BaseState<SignInSignOutPage, SignInSignOut
     );
   }
 
-  /// 顶部的搜索栏布局
-  // Widget _buildSearchTitleBar() {
-  //   return Row(
-  //     mainAxisSize: MainAxisSize.max,
-  //     crossAxisAlignment: CrossAxisAlignment.center,
-  //     children: [
-  //       Container(
-  //         height: 35,
-  //         padding: EdgeInsets.only(left: 15, right: 11),
-  //         margin: EdgeInsets.only(left: 15, right: 10),
-  //         decoration: BoxDecoration(
-  //           color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
-  //           borderRadius: BorderRadius.circular(17.25), // 设置圆角
-  //         ),
-  //         child: Row(
-  //           mainAxisSize: MainAxisSize.max,
-  //           crossAxisAlignment: CrossAxisAlignment.center,
-  //           children: [
-  //             //输入框
-  //             IgnoreKeyboardDismiss(
-  //               child: TextField(
-  //                 cursorColor: ColorConstants.white,
-  //                 cursorWidth: 1.5,
-  //                 autofocus: false,
-  //                 maxLines: 1,
-  //                 minLines: 1,
-  //                 // 是否自动获取焦点
-  //                 focusNode: state.formData['keyword']!['focusNode'],
-  //                 // 焦点控制
-  //                 controller: state.formData['keyword']!['controller'],
-  //                 // 与输入框交互控制器
-  //                 //装饰
-  //                 decoration: InputDecoration(
-  //                   isDense: true,
-  //                   //清除垂直方向的填充
-  //                   isCollapsed: true,
-  //                   //让文字垂直居中
-  //                   border: InputBorder.none,
-  //                   hintText: state.formData['keyword']!['hintText'],
-  //                   hintStyle: TextStyle(
-  //                     color: hexToColor("#AECAE5"),
-  //                     fontSize: 15.0,
-  //                     fontWeight: FontWeight.w400,
-  //                   ),
-  //                 ),
-  //                 style: TextStyle(
-  //                   color: ColorConstants.white,
-  //                   fontSize: 15.0,
-  //                   fontWeight: FontWeight.w400,
-  //                 ),
-  //                 // 键盘动作右下角图标
-  //                 textInputAction: TextInputAction.search,
-  //                 textAlignVertical: TextAlignVertical.center,
-  //                 onSubmitted: (value) {
-  //                   controller.doSearch();
-  //                 }, //输入框完成触发
-  //               ),
-  //             ).expanded(),
-  //
-  //             //搜索图标
-  //             MyAssetImage(Assets.cptJobSearchIcon, width: 15, height: 15).marginOnly(left: 10).onTap(() {
-  //               controller.doSearch();
-  //             }),
-  //           ],
-  //         ),
-  //       ).expanded(),
-  //       MyButton(
-  //         onPressed: () {
-  //           controller.resetFiltering();
-  //         },
-  //         text: "Reset".tr,
-  //         textColor: ColorConstants.white,
-  //         backgroundColor: hexToColor("#2BA9F9", opacity: 0.5),
-  //         radius: 17.25,
-  //         minWidth: 60,
-  //         minHeight: 35,
-  //       )
-  //     ],
-  //   ).marginOnly(top: ScreenUtil.getStatusBarH(context) + 5, right: 12);
-  // }
-
   /// 时间筛选布局
   Widget _buildFilterDateWidget() {
     return Container(

+ 5 - 1
packages/cpt_job/lib/router/job_service_impl.dart

@@ -1,3 +1,4 @@
+import 'package:cpt_job/modules/labour_request_list/labour_request_list_page.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:router/componentRouter/job_service.dart';
 import 'package:shared/utils/log_utils.dart';
@@ -5,7 +6,6 @@ import 'package:shared/utils/log_utils.dart';
 import '../modules/sign_in_sign_out/sign_in_sign_out_page.dart';
 
 class JobServiceImpl extends GetxService implements JobService {
-
   @override
   void onInit() {
     super.onInit();
@@ -26,4 +26,8 @@ class JobServiceImpl extends GetxService implements JobService {
     SignInSignOutPage.startInstance();
   }
 
+  @override
+  void startLabourRequestPage() {
+    LabourRequestListPage.startInstance();
+  }
 }

+ 21 - 1
packages/cpt_job/lib/router/page_router.dart

@@ -1,5 +1,7 @@
 
-import 'package:flutter/material.dart';
+import 'package:cpt_job/modules/labour_request_add/labour_request_add_page.dart';
+import 'package:cpt_job/modules/labour_request_list/labour_request_list_page.dart';
+import 'package:cpt_job/modules/labour_request_workflow/labour_request_workflow_page.dart';
 import 'package:get/get.dart';
 import 'package:router/path/router_path.dart';
 
@@ -15,5 +17,23 @@ class JobPageRouter {
       page: () => SignInSignOutPage(),
     ),
 
+    //用工请求列表
+    GetPage(
+      name: RouterPath.JOB_LABOUR_REQUEST_LIST,
+      page: () => LabourRequestListPage(),
+    ),
+
+    //用工请求添加
+    GetPage(
+      name: RouterPath.JOB_LABOUR_REQUEST_ADD,
+      page: () => LabourRequestAddPage(),
+    ),
+
+    //用工请求状态修改工作流
+    GetPage(
+      name: RouterPath.JOB_LABOUR_REQUEST_WORKFLOW,
+      page: () => LabourRequestWorkflowPage(),
+    ),
+
   ];
 }

+ 346 - 0
packages/cpt_job/lib/widget/labour_request_filter.dart

@@ -0,0 +1,346 @@
+import 'dart:typed_data';
+import 'dart:ui';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/labour_request_index_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:shared/utils/date_time_utils.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/picker/date_picker_util.dart';
+import 'package:widgets/picker/option_pick_util.dart';
+import 'package:widgets/widget_export.dart';
+
+/**
+ * 用工请求列表的筛选
+ */
+class LabourRequestFilter extends StatefulWidget {
+  VoidCallback? onResetAction;
+  void Function(DateTime? selectedStartDate, DateTime? selectedEndDate, String? selectedStatusId, String? selectedDepartmentId)? onFilterAction;
+  LabourRequestIndexEntity optionResult;
+  DateTime? selectedStartDate;
+  DateTime? selectedEndDate;
+  String? selectedStatusId;
+  String? selectedDepartmentId;
+
+  LabourRequestFilter({
+    required this.optionResult,
+    required this.selectedStartDate,
+    required this.selectedEndDate,
+    required this.selectedStatusId,
+    required this.selectedDepartmentId,
+    this.onResetAction,
+    this.onFilterAction,
+  });
+
+  @override
+  State<LabourRequestFilter> createState() => _LabourRequestFilterState();
+}
+
+class _LabourRequestFilterState extends State<LabourRequestFilter> {
+  DateTime? selectedStartDate;
+  DateTime? selectedEndDate;
+  String? selectedStatusId;
+  String? selectedDepartmentId;
+
+  @override
+  void initState() {
+    super.initState();
+    this.selectedStartDate = widget.selectedStartDate;
+    this.selectedEndDate = widget.selectedEndDate;
+    this.selectedStatusId = widget.selectedStatusId;
+    this.selectedDepartmentId = widget.selectedDepartmentId;
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.start,
+      mainAxisAlignment: MainAxisAlignment.start,
+      children: [
+        SizedBox(
+          height: kToolbarHeight + ScreenUtil.getStatusBarH(context) + 1,
+        ),
+        Container(
+          padding: EdgeInsets.only(left: 15, right: 15, top: 17.5, bottom: 20),
+          width: double.infinity,
+          decoration: BoxDecoration(
+            color: Colors.white,
+          ),
+          child: Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              //部门
+              MyTextView(
+                "Outlet".tr,
+                fontSize: 14,
+                isFontMedium: true,
+                textColor: ColorConstants.black33,
+              ),
+
+              //选择部门
+              Container(
+                padding: EdgeInsets.only(left: 16, right: 10),
+                margin: EdgeInsets.only(top: 10),
+                height: 45,
+                decoration: BoxDecoration(
+                  color: ColorConstants.grayECECEC,
+                  borderRadius: const BorderRadius.all(Radius.circular(5)),
+                ),
+                child: Row(
+                  mainAxisSize: MainAxisSize.max,
+                  crossAxisAlignment: CrossAxisAlignment.center,
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  children: [
+                    MyTextView(
+                      selectedDepartmentId == null
+                          ? "Outlet".tr
+                          : widget.optionResult.departmentList!.firstWhere((element) => element.value.toString() == selectedDepartmentId).txt!,
+                      fontSize: 14,
+                      isFontMedium: true,
+                      textColor: ColorConstants.black33,
+                    ).expanded(),
+                    MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                  ],
+                ),
+              ).onTap(() {
+                pickerOutlet();
+              }),
+
+              //状态
+              MyTextView(
+                "Status".tr,
+                fontSize: 14,
+                isFontMedium: true,
+                marginTop: 11,
+                textColor: ColorConstants.black33,
+              ),
+
+              //选择状态
+              Container(
+                padding: EdgeInsets.only(left: 16, right: 10),
+                margin: EdgeInsets.only(top: 10),
+                height: 45,
+                decoration: BoxDecoration(
+                  color: ColorConstants.grayECECEC,
+                  borderRadius: const BorderRadius.all(Radius.circular(5)),
+                ),
+                child: Row(
+                  mainAxisSize: MainAxisSize.max,
+                  crossAxisAlignment: CrossAxisAlignment.center,
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  children: [
+                    MyTextView(
+                      selectedStatusId == null
+                          ? "Status".tr
+                          : widget.optionResult.statusList!.firstWhere((element) => element.value.toString() == selectedStatusId).txt!,
+                      fontSize: 14,
+                      isFontMedium: true,
+                      textColor: ColorConstants.black33,
+                    ).expanded(),
+                    MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                  ],
+                ),
+              ).onTap(() {
+                pickerStatus();
+              }),
+
+              //开始时间
+              MyTextView(
+                "Start Date".tr,
+                fontSize: 14,
+                isFontMedium: true,
+                marginTop: 11,
+                textColor: ColorConstants.black33,
+              ),
+
+              //选择时间
+              Container(
+                padding: EdgeInsets.only(left: 16, right: 10),
+                margin: EdgeInsets.only(top: 10),
+                height: 45,
+                decoration: BoxDecoration(
+                  color: ColorConstants.grayECECEC,
+                  borderRadius: const BorderRadius.all(Radius.circular(5)),
+                ),
+                child: Row(
+                  mainAxisSize: MainAxisSize.max,
+                  crossAxisAlignment: CrossAxisAlignment.center,
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  children: [
+                    MyTextView(
+                      selectedStartDate == null ? "Start Date".tr : DateTimeUtils.formatDate(selectedStartDate, format: "yyyy-MM-dd"),
+                      fontSize: 14,
+                      isFontMedium: true,
+                      textColor: ColorConstants.black33,
+                    ).expanded(),
+                    MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                  ],
+                ),
+              ).onTap(() {
+                pickerStartDate();
+              }),
+
+              //结束日期
+              MyTextView(
+                "End Date".tr,
+                fontSize: 14,
+                marginTop: 11,
+                isFontMedium: true,
+                textColor: ColorConstants.black33,
+              ),
+
+              //选择结束日期
+              Container(
+                padding: EdgeInsets.only(left: 16, right: 10),
+                margin: EdgeInsets.only(top: 10),
+                height: 45,
+                decoration: BoxDecoration(
+                  color: ColorConstants.grayECECEC,
+                  borderRadius: const BorderRadius.all(Radius.circular(5)),
+                ),
+                child: Row(
+                  mainAxisSize: MainAxisSize.max,
+                  crossAxisAlignment: CrossAxisAlignment.center,
+                  mainAxisAlignment: MainAxisAlignment.start,
+                  children: [
+                    MyTextView(
+                      selectedEndDate == null ? "End Date".tr : DateTimeUtils.formatDate(selectedEndDate, format: "yyyy-MM-dd"),
+                      fontSize: 14,
+                      isFontMedium: true,
+                      textColor: ColorConstants.black33,
+                    ).expanded(),
+                    MyAssetImage(Assets.baseServiceTriangleDropDownIcon, width: 11.5, height: 6.28),
+                  ],
+                ),
+              ).onTap(() {
+                pickerEndDate();
+              }),
+
+              //按钮组
+              Row(
+                children: [
+                  MyButton(
+                    onPressed: () {
+                      onCancel();
+                      widget.onResetAction?.call();
+                    },
+                    text: "Reset".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor("#FFBB1B"),
+                    radius: 17.25,
+                    minWidth: 60,
+                    minHeight: 36,
+                  ).expanded(),
+                  SizedBox(width: 15),
+                  MyButton(
+                    onPressed: () {
+                      onCancel();
+                      widget.onFilterAction?.call(selectedStartDate, selectedEndDate, selectedStatusId, selectedDepartmentId);
+                    },
+                    text: "Filter".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor("#0AC074"),
+                    radius: 17.25,
+                    minWidth: 60,
+                    minHeight: 36,
+                  ).expanded(),
+                ],
+              ).marginOnly(top: 20),
+            ],
+          ),
+        ),
+        Center(child: MyAssetImage(Assets.baseServiceDialogDeleteIcon, width: 26.5, height: 26.5).marginOnly(top: 35)).onTap(() {
+          onCancel();
+        }),
+      ],
+    );
+  }
+
+  //取消弹框
+  void onCancel() async {
+    SmartDialog.dismiss();
+  }
+
+  /// 筛选开始日期
+  void pickerStartDate() {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: selectedStartDate,
+      onDateTimeChanged: (date) {
+        setState(() {
+          selectedStartDate = date;
+        });
+      },
+      title: "Start Date".tr,
+    );
+  }
+
+  /// 筛选结束日期
+  void pickerEndDate() {
+    DatePickerUtil.showCupertinoDatePicker(
+      selectedDateTime: selectedEndDate,
+      onDateTimeChanged: (date) {
+        setState(() {
+          selectedEndDate = date;
+        });
+      },
+      title: "End Date".tr,
+    );
+  }
+
+  /// 筛选部门
+  void pickerOutlet() {
+    int selectedDepartmentIndex;
+    if (selectedDepartmentId == null){
+      selectedDepartmentIndex = 0;
+    }else{
+       selectedDepartmentIndex = widget.optionResult.departmentList!.indexWhere((department) => department.value.toString() == selectedDepartmentId);
+    }
+
+    if (selectedDepartmentIndex <0){
+      selectedDepartmentIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: widget.optionResult.departmentList!.map((e) => e.txt!).toList(growable: false),
+      initialSelectIndex: selectedDepartmentIndex,
+      onPickerChanged: (_, index) {
+        setState(() {
+          selectedDepartmentId = widget.optionResult.departmentList![index].value!.toString();
+        });
+      },
+    );
+  }
+
+  /// 筛选状态
+  void pickerStatus() {
+    int selectedStatusIndex;
+    if (selectedStatusId == null){
+      selectedStatusIndex = 0;
+    }else{
+      selectedStatusIndex = widget.optionResult.statusList!.indexWhere((department) => department.value.toString() == selectedStatusId);
+    }
+
+    if (selectedStatusIndex <0){
+      selectedStatusIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: widget.optionResult.statusList!.map((e) => e.txt!).toList(growable: false),
+      initialSelectIndex: selectedStatusIndex,
+      onPickerChanged: (_, index) {
+        setState(() {
+          selectedStatusId = widget.optionResult.statusList![index].value!.toString();
+        });
+      },
+    );
+  }
+}

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

@@ -24,6 +24,32 @@ class ApiConstants {
   //用户注册
   static const apiHotelRegister = "/index.php/api/v1/hotel/register";
 
+  // =========================== 用工请求 ↓=========================================
+
+  //筛选条件
+  static const apiLabourRequestIndex = "/index.php/api/v1/hotel/lab-req/index";
+
+  //用工列表
+  static const apiLabourRequestList = "/index.php/api/v1/hotel/lab-req/table";
+
+  //添加的选择条件
+  static const apiLabourRequestAddOption = "/index.php/api/v1/hotel/lab-req/add-view";
+
+  //添加用工请求
+  static const apiLabourRequestAddSubmit = "/index.php/api/v1/hotel/lab-req/add-submit";
+
+  //编辑的选项
+  static const apiLabourRequestEditDetail = "/index.php/api/v1/hotel/lab-req/edit-view";
+
+  //编辑的发布
+  static const apiLabourRequestEditSubmit = "/index.php/api/v1/hotel/lab-req/edit-submit";
+
+  //用工请求的审核状态工作流
+  static const apiLabourRequestStateWorkFlow = "/index.php/api/v1/hotel/lab-req/status-view";
+
+  //撤回用工请求
+  static const apiLabourRequestRecall = "/index.php/api/v1/hotel/lab-req/recall";
+
   // =========================== 签到签出 ↓=========================================
 
   // 用户签到签出列表

+ 59 - 0
packages/cs_domain/lib/entity/response/labour_request_add_option_entity.dart

@@ -0,0 +1,59 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/labour_request_add_option_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/labour_request_add_option_entity.g.dart';
+
+@JsonSerializable()
+class LabourRequestAddOptionEntity {
+	@JSONField(name: "template_list")
+	List<LabourRequestAddOptionTemplateList>? templateList = [];
+	@JSONField(name: "department_list")
+	List<LabourRequestAddOptionDepartmentList>? departmentList = [];
+
+	LabourRequestAddOptionEntity();
+
+	factory LabourRequestAddOptionEntity.fromJson(Map<String, dynamic> json) => $LabourRequestAddOptionEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestAddOptionEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class LabourRequestAddOptionTemplateList {
+	int? value = 0;
+	String? txt = '';
+	String? selected = '';
+
+	LabourRequestAddOptionTemplateList();
+
+	factory LabourRequestAddOptionTemplateList.fromJson(Map<String, dynamic> json) => $LabourRequestAddOptionTemplateListFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestAddOptionTemplateListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class LabourRequestAddOptionDepartmentList {
+	int? value = 0;
+	String? txt = '';
+	String? selected = '';
+
+	LabourRequestAddOptionDepartmentList();
+
+	factory LabourRequestAddOptionDepartmentList.fromJson(Map<String, dynamic> json) => $LabourRequestAddOptionDepartmentListFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestAddOptionDepartmentListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 67 - 0
packages/cs_domain/lib/entity/response/labour_request_edit_index_entity.dart

@@ -0,0 +1,67 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/labour_request_edit_index_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/labour_request_edit_index_entity.g.dart';
+
+@JsonSerializable()
+class LabourRequestEditIndexEntity {
+	@JSONField(name: "request_id")
+	int? requestId = 0;
+	@JSONField(name: "job_start")
+	String? jobStart = '';
+	@JSONField(name: "job_end")
+	String? jobEnd = '';
+	@JSONField(name: "need_num")
+	int? needNum = 0;
+	@JSONField(name: "template_list")
+	List<LabourRequestEditIndexTemplateList>? templateList = [];
+	@JSONField(name: "department_list")
+	List<LabourRequestEditIndexDepartmentList>? departmentList = [];
+
+	LabourRequestEditIndexEntity();
+
+	factory LabourRequestEditIndexEntity.fromJson(Map<String, dynamic> json) => $LabourRequestEditIndexEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestEditIndexEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class LabourRequestEditIndexTemplateList {
+	int? value = 0;
+	String? txt = '';
+	String? selected = '';
+
+	LabourRequestEditIndexTemplateList();
+
+	factory LabourRequestEditIndexTemplateList.fromJson(Map<String, dynamic> json) => $LabourRequestEditIndexTemplateListFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestEditIndexTemplateListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class LabourRequestEditIndexDepartmentList {
+	int? value = 0;
+	String? txt = '';
+	String? selected = '';
+
+	LabourRequestEditIndexDepartmentList();
+
+	factory LabourRequestEditIndexDepartmentList.fromJson(Map<String, dynamic> json) => $LabourRequestEditIndexDepartmentListFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestEditIndexDepartmentListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 59 - 0
packages/cs_domain/lib/entity/response/labour_request_index_entity.dart

@@ -0,0 +1,59 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/labour_request_index_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/labour_request_index_entity.g.dart';
+
+@JsonSerializable()
+class LabourRequestIndexEntity {
+	@JSONField(name: "department_list")
+	List<LabourRequestIndexDepartmentList>? departmentList = [];
+	@JSONField(name: "status_list")
+	List<LabourRequestIndexStatusList>? statusList = [];
+
+	LabourRequestIndexEntity();
+
+	factory LabourRequestIndexEntity.fromJson(Map<String, dynamic> json) => $LabourRequestIndexEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestIndexEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class LabourRequestIndexDepartmentList {
+	int? value = 0;
+	String? txt = '';
+	String? selected = '';
+
+	LabourRequestIndexDepartmentList();
+
+	factory LabourRequestIndexDepartmentList.fromJson(Map<String, dynamic> json) => $LabourRequestIndexDepartmentListFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestIndexDepartmentListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class LabourRequestIndexStatusList {
+	int? value = 0;
+	String? txt = '';
+	String? selected = '';
+
+	LabourRequestIndexStatusList();
+
+	factory LabourRequestIndexStatusList.fromJson(Map<String, dynamic> json) => $LabourRequestIndexStatusListFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestIndexStatusListToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

+ 56 - 0
packages/cs_domain/lib/entity/response/labour_request_list_entity.dart

@@ -0,0 +1,56 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/labour_request_list_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/labour_request_list_entity.g.dart';
+
+@JsonSerializable()
+class LabourRequestListEntity {
+	int? total = 0;
+	List<LabourRequestListRows>? rows = [];
+
+	LabourRequestListEntity();
+
+	factory LabourRequestListEntity.fromJson(Map<String, dynamic> json) => $LabourRequestListEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestListEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class LabourRequestListRows {
+	@JSONField(name: "request_id")
+	int requestId = 0;
+	@JSONField(name: "job_title")
+	String? jobTitle;
+	@JSONField(name: "department_name")
+	String? departmentName;
+	@JSONField(name: "job_time")
+	String? jobTime ;
+	@JSONField(name: "need_num")
+	int needNum = 0;
+	@JSONField(name: "co_status")
+	int? coStatus = 0;
+	@JSONField(name: "co_status_show")
+	String? coStatusShow;
+	@JSONField(name: "publish_status")
+	bool publishStatus = false;
+	@JSONField(name: "created_at")
+	String? createdAt;
+	@JSONField(name: "action_list")
+	List<String>? actionList = [];
+
+	LabourRequestListRows();
+
+	factory LabourRequestListRows.fromJson(Map<String, dynamic> json) => $LabourRequestListRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $LabourRequestListRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

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

@@ -8,6 +8,10 @@ import 'package:domain/entity/response/attendance_entity.dart';
 import 'package:domain/entity/response/check_success_entity.dart';
 import 'package:domain/entity/response/hotel_info_entity.dart';
 import 'package:domain/entity/response/id_name_entity.dart';
+import 'package:domain/entity/response/labour_request_add_option_entity.dart';
+import 'package:domain/entity/response/labour_request_edit_index_entity.dart';
+import 'package:domain/entity/response/labour_request_index_entity.dart';
+import 'package:domain/entity/response/labour_request_list_entity.dart';
 import 'package:domain/entity/server_time.dart';
 
 JsonConvert jsonConvert = JsonConvert();
@@ -157,6 +161,39 @@ class JsonConvert {
     if (<IdNameEntity>[] is M) {
       return data.map<IdNameEntity>((Map<String, dynamic> e) => IdNameEntity.fromJson(e)).toList() as M;
     }
+    if (<LabourRequestAddOptionEntity>[] is M) {
+      return data.map<LabourRequestAddOptionEntity>((Map<String, dynamic> e) => LabourRequestAddOptionEntity.fromJson(e)).toList() as M;
+    }
+    if (<LabourRequestAddOptionTemplateList>[] is M) {
+      return data.map<LabourRequestAddOptionTemplateList>((Map<String, dynamic> e) => LabourRequestAddOptionTemplateList.fromJson(e)).toList() as M;
+    }
+    if (<LabourRequestAddOptionDepartmentList>[] is M) {
+      return data.map<LabourRequestAddOptionDepartmentList>((Map<String, dynamic> e) => LabourRequestAddOptionDepartmentList.fromJson(e)).toList() as M;
+    }
+    if (<LabourRequestEditIndexEntity>[] is M) {
+      return data.map<LabourRequestEditIndexEntity>((Map<String, dynamic> e) => LabourRequestEditIndexEntity.fromJson(e)).toList() as M;
+    }
+    if (<LabourRequestEditIndexTemplateList>[] is M) {
+      return data.map<LabourRequestEditIndexTemplateList>((Map<String, dynamic> e) => LabourRequestEditIndexTemplateList.fromJson(e)).toList() as M;
+    }
+    if (<LabourRequestEditIndexDepartmentList>[] is M) {
+      return data.map<LabourRequestEditIndexDepartmentList>((Map<String, dynamic> e) => LabourRequestEditIndexDepartmentList.fromJson(e)).toList() as M;
+    }
+    if (<LabourRequestIndexEntity>[] is M) {
+      return data.map<LabourRequestIndexEntity>((Map<String, dynamic> e) => LabourRequestIndexEntity.fromJson(e)).toList() as M;
+    }
+    if (<LabourRequestIndexDepartmentList>[] is M) {
+      return data.map<LabourRequestIndexDepartmentList>((Map<String, dynamic> e) => LabourRequestIndexDepartmentList.fromJson(e)).toList() as M;
+    }
+    if (<LabourRequestIndexStatusList>[] is M) {
+      return data.map<LabourRequestIndexStatusList>((Map<String, dynamic> e) => LabourRequestIndexStatusList.fromJson(e)).toList() as M;
+    }
+    if (<LabourRequestListEntity>[] is M) {
+      return data.map<LabourRequestListEntity>((Map<String, dynamic> e) => LabourRequestListEntity.fromJson(e)).toList() as M;
+    }
+    if (<LabourRequestListRows>[] is M) {
+      return data.map<LabourRequestListRows>((Map<String, dynamic> e) => LabourRequestListRows.fromJson(e)).toList() as M;
+    }
     if (<ServerTime>[] is M) {
       return data.map<ServerTime>((Map<String, dynamic> e) => ServerTime.fromJson(e)).toList() as M;
     }
@@ -187,6 +224,17 @@ class JsonConvertClassCollection {
     (HotelInfoMenus).toString(): HotelInfoMenus.fromJson,
     (HotelInfoMenusChildren).toString(): HotelInfoMenusChildren.fromJson,
     (IdNameEntity).toString(): IdNameEntity.fromJson,
+    (LabourRequestAddOptionEntity).toString(): LabourRequestAddOptionEntity.fromJson,
+    (LabourRequestAddOptionTemplateList).toString(): LabourRequestAddOptionTemplateList.fromJson,
+    (LabourRequestAddOptionDepartmentList).toString(): LabourRequestAddOptionDepartmentList.fromJson,
+    (LabourRequestEditIndexEntity).toString(): LabourRequestEditIndexEntity.fromJson,
+    (LabourRequestEditIndexTemplateList).toString(): LabourRequestEditIndexTemplateList.fromJson,
+    (LabourRequestEditIndexDepartmentList).toString(): LabourRequestEditIndexDepartmentList.fromJson,
+    (LabourRequestIndexEntity).toString(): LabourRequestIndexEntity.fromJson,
+    (LabourRequestIndexDepartmentList).toString(): LabourRequestIndexDepartmentList.fromJson,
+    (LabourRequestIndexStatusList).toString(): LabourRequestIndexStatusList.fromJson,
+    (LabourRequestListEntity).toString(): LabourRequestListEntity.fromJson,
+    (LabourRequestListRows).toString(): LabourRequestListRows.fromJson,
     (ServerTime).toString(): ServerTime.fromJson,
   };
 

+ 111 - 0
packages/cs_domain/lib/generated/json/labour_request_add_option_entity.g.dart

@@ -0,0 +1,111 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/labour_request_add_option_entity.dart';
+
+LabourRequestAddOptionEntity $LabourRequestAddOptionEntityFromJson(Map<String, dynamic> json) {
+  final LabourRequestAddOptionEntity labourRequestAddOptionEntity = LabourRequestAddOptionEntity();
+  final List<LabourRequestAddOptionTemplateList>? templateList = (json['template_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<LabourRequestAddOptionTemplateList>(e) as LabourRequestAddOptionTemplateList).toList();
+  if (templateList != null) {
+    labourRequestAddOptionEntity.templateList = templateList;
+  }
+  final List<LabourRequestAddOptionDepartmentList>? departmentList = (json['department_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<LabourRequestAddOptionDepartmentList>(e) as LabourRequestAddOptionDepartmentList).toList();
+  if (departmentList != null) {
+    labourRequestAddOptionEntity.departmentList = departmentList;
+  }
+  return labourRequestAddOptionEntity;
+}
+
+Map<String, dynamic> $LabourRequestAddOptionEntityToJson(LabourRequestAddOptionEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['template_list'] = entity.templateList?.map((v) => v.toJson()).toList();
+  data['department_list'] = entity.departmentList?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension LabourRequestAddOptionEntityExtension on LabourRequestAddOptionEntity {
+  LabourRequestAddOptionEntity copyWith({
+    List<LabourRequestAddOptionTemplateList>? templateList,
+    List<LabourRequestAddOptionDepartmentList>? departmentList,
+  }) {
+    return LabourRequestAddOptionEntity()
+      ..templateList = templateList ?? this.templateList
+      ..departmentList = departmentList ?? this.departmentList;
+  }
+}
+
+LabourRequestAddOptionTemplateList $LabourRequestAddOptionTemplateListFromJson(Map<String, dynamic> json) {
+  final LabourRequestAddOptionTemplateList labourRequestAddOptionTemplateList = LabourRequestAddOptionTemplateList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    labourRequestAddOptionTemplateList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    labourRequestAddOptionTemplateList.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    labourRequestAddOptionTemplateList.selected = selected;
+  }
+  return labourRequestAddOptionTemplateList;
+}
+
+Map<String, dynamic> $LabourRequestAddOptionTemplateListToJson(LabourRequestAddOptionTemplateList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension LabourRequestAddOptionTemplateListExtension on LabourRequestAddOptionTemplateList {
+  LabourRequestAddOptionTemplateList copyWith({
+    int? value,
+    String? txt,
+    String? selected,
+  }) {
+    return LabourRequestAddOptionTemplateList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected;
+  }
+}
+
+LabourRequestAddOptionDepartmentList $LabourRequestAddOptionDepartmentListFromJson(Map<String, dynamic> json) {
+  final LabourRequestAddOptionDepartmentList labourRequestAddOptionDepartmentList = LabourRequestAddOptionDepartmentList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    labourRequestAddOptionDepartmentList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    labourRequestAddOptionDepartmentList.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    labourRequestAddOptionDepartmentList.selected = selected;
+  }
+  return labourRequestAddOptionDepartmentList;
+}
+
+Map<String, dynamic> $LabourRequestAddOptionDepartmentListToJson(LabourRequestAddOptionDepartmentList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension LabourRequestAddOptionDepartmentListExtension on LabourRequestAddOptionDepartmentList {
+  LabourRequestAddOptionDepartmentList copyWith({
+    int? value,
+    String? txt,
+    String? selected,
+  }) {
+    return LabourRequestAddOptionDepartmentList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected;
+  }
+}

+ 139 - 0
packages/cs_domain/lib/generated/json/labour_request_edit_index_entity.g.dart

@@ -0,0 +1,139 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/labour_request_edit_index_entity.dart';
+
+LabourRequestEditIndexEntity $LabourRequestEditIndexEntityFromJson(Map<String, dynamic> json) {
+  final LabourRequestEditIndexEntity labourRequestEditIndexEntity = LabourRequestEditIndexEntity();
+  final int? requestId = jsonConvert.convert<int>(json['request_id']);
+  if (requestId != null) {
+    labourRequestEditIndexEntity.requestId = requestId;
+  }
+  final String? jobStart = jsonConvert.convert<String>(json['job_start']);
+  if (jobStart != null) {
+    labourRequestEditIndexEntity.jobStart = jobStart;
+  }
+  final String? jobEnd = jsonConvert.convert<String>(json['job_end']);
+  if (jobEnd != null) {
+    labourRequestEditIndexEntity.jobEnd = jobEnd;
+  }
+  final int? needNum = jsonConvert.convert<int>(json['need_num']);
+  if (needNum != null) {
+    labourRequestEditIndexEntity.needNum = needNum;
+  }
+  final List<LabourRequestEditIndexTemplateList>? templateList = (json['template_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<LabourRequestEditIndexTemplateList>(e) as LabourRequestEditIndexTemplateList).toList();
+  if (templateList != null) {
+    labourRequestEditIndexEntity.templateList = templateList;
+  }
+  final List<LabourRequestEditIndexDepartmentList>? departmentList = (json['department_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<LabourRequestEditIndexDepartmentList>(e) as LabourRequestEditIndexDepartmentList).toList();
+  if (departmentList != null) {
+    labourRequestEditIndexEntity.departmentList = departmentList;
+  }
+  return labourRequestEditIndexEntity;
+}
+
+Map<String, dynamic> $LabourRequestEditIndexEntityToJson(LabourRequestEditIndexEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['request_id'] = entity.requestId;
+  data['job_start'] = entity.jobStart;
+  data['job_end'] = entity.jobEnd;
+  data['need_num'] = entity.needNum;
+  data['template_list'] = entity.templateList?.map((v) => v.toJson()).toList();
+  data['department_list'] = entity.departmentList?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension LabourRequestEditIndexEntityExtension on LabourRequestEditIndexEntity {
+  LabourRequestEditIndexEntity copyWith({
+    int? requestId,
+    String? jobStart,
+    String? jobEnd,
+    int? needNum,
+    List<LabourRequestEditIndexTemplateList>? templateList,
+    List<LabourRequestEditIndexDepartmentList>? departmentList,
+  }) {
+    return LabourRequestEditIndexEntity()
+      ..requestId = requestId ?? this.requestId
+      ..jobStart = jobStart ?? this.jobStart
+      ..jobEnd = jobEnd ?? this.jobEnd
+      ..needNum = needNum ?? this.needNum
+      ..templateList = templateList ?? this.templateList
+      ..departmentList = departmentList ?? this.departmentList;
+  }
+}
+
+LabourRequestEditIndexTemplateList $LabourRequestEditIndexTemplateListFromJson(Map<String, dynamic> json) {
+  final LabourRequestEditIndexTemplateList labourRequestEditIndexTemplateList = LabourRequestEditIndexTemplateList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    labourRequestEditIndexTemplateList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    labourRequestEditIndexTemplateList.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    labourRequestEditIndexTemplateList.selected = selected;
+  }
+  return labourRequestEditIndexTemplateList;
+}
+
+Map<String, dynamic> $LabourRequestEditIndexTemplateListToJson(LabourRequestEditIndexTemplateList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension LabourRequestEditIndexTemplateListExtension on LabourRequestEditIndexTemplateList {
+  LabourRequestEditIndexTemplateList copyWith({
+    int? value,
+    String? txt,
+    String? selected,
+  }) {
+    return LabourRequestEditIndexTemplateList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected;
+  }
+}
+
+LabourRequestEditIndexDepartmentList $LabourRequestEditIndexDepartmentListFromJson(Map<String, dynamic> json) {
+  final LabourRequestEditIndexDepartmentList labourRequestEditIndexDepartmentList = LabourRequestEditIndexDepartmentList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    labourRequestEditIndexDepartmentList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    labourRequestEditIndexDepartmentList.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    labourRequestEditIndexDepartmentList.selected = selected;
+  }
+  return labourRequestEditIndexDepartmentList;
+}
+
+Map<String, dynamic> $LabourRequestEditIndexDepartmentListToJson(LabourRequestEditIndexDepartmentList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension LabourRequestEditIndexDepartmentListExtension on LabourRequestEditIndexDepartmentList {
+  LabourRequestEditIndexDepartmentList copyWith({
+    int? value,
+    String? txt,
+    String? selected,
+  }) {
+    return LabourRequestEditIndexDepartmentList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected;
+  }
+}

+ 111 - 0
packages/cs_domain/lib/generated/json/labour_request_index_entity.g.dart

@@ -0,0 +1,111 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/labour_request_index_entity.dart';
+
+LabourRequestIndexEntity $LabourRequestIndexEntityFromJson(Map<String, dynamic> json) {
+  final LabourRequestIndexEntity labourRequestIndexEntity = LabourRequestIndexEntity();
+  final List<LabourRequestIndexDepartmentList>? departmentList = (json['department_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<LabourRequestIndexDepartmentList>(e) as LabourRequestIndexDepartmentList).toList();
+  if (departmentList != null) {
+    labourRequestIndexEntity.departmentList = departmentList;
+  }
+  final List<LabourRequestIndexStatusList>? statusList = (json['status_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<LabourRequestIndexStatusList>(e) as LabourRequestIndexStatusList).toList();
+  if (statusList != null) {
+    labourRequestIndexEntity.statusList = statusList;
+  }
+  return labourRequestIndexEntity;
+}
+
+Map<String, dynamic> $LabourRequestIndexEntityToJson(LabourRequestIndexEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['department_list'] = entity.departmentList?.map((v) => v.toJson()).toList();
+  data['status_list'] = entity.statusList?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension LabourRequestIndexEntityExtension on LabourRequestIndexEntity {
+  LabourRequestIndexEntity copyWith({
+    List<LabourRequestIndexDepartmentList>? departmentList,
+    List<LabourRequestIndexStatusList>? statusList,
+  }) {
+    return LabourRequestIndexEntity()
+      ..departmentList = departmentList ?? this.departmentList
+      ..statusList = statusList ?? this.statusList;
+  }
+}
+
+LabourRequestIndexDepartmentList $LabourRequestIndexDepartmentListFromJson(Map<String, dynamic> json) {
+  final LabourRequestIndexDepartmentList labourRequestIndexDepartmentList = LabourRequestIndexDepartmentList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    labourRequestIndexDepartmentList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    labourRequestIndexDepartmentList.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    labourRequestIndexDepartmentList.selected = selected;
+  }
+  return labourRequestIndexDepartmentList;
+}
+
+Map<String, dynamic> $LabourRequestIndexDepartmentListToJson(LabourRequestIndexDepartmentList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension LabourRequestIndexDepartmentListExtension on LabourRequestIndexDepartmentList {
+  LabourRequestIndexDepartmentList copyWith({
+    int? value,
+    String? txt,
+    String? selected,
+  }) {
+    return LabourRequestIndexDepartmentList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected;
+  }
+}
+
+LabourRequestIndexStatusList $LabourRequestIndexStatusListFromJson(Map<String, dynamic> json) {
+  final LabourRequestIndexStatusList labourRequestIndexStatusList = LabourRequestIndexStatusList();
+  final int? value = jsonConvert.convert<int>(json['value']);
+  if (value != null) {
+    labourRequestIndexStatusList.value = value;
+  }
+  final String? txt = jsonConvert.convert<String>(json['txt']);
+  if (txt != null) {
+    labourRequestIndexStatusList.txt = txt;
+  }
+  final String? selected = jsonConvert.convert<String>(json['selected']);
+  if (selected != null) {
+    labourRequestIndexStatusList.selected = selected;
+  }
+  return labourRequestIndexStatusList;
+}
+
+Map<String, dynamic> $LabourRequestIndexStatusListToJson(LabourRequestIndexStatusList entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['value'] = entity.value;
+  data['txt'] = entity.txt;
+  data['selected'] = entity.selected;
+  return data;
+}
+
+extension LabourRequestIndexStatusListExtension on LabourRequestIndexStatusList {
+  LabourRequestIndexStatusList copyWith({
+    int? value,
+    String? txt,
+    String? selected,
+  }) {
+    return LabourRequestIndexStatusList()
+      ..value = value ?? this.value
+      ..txt = txt ?? this.txt
+      ..selected = selected ?? this.selected;
+  }
+}

+ 122 - 0
packages/cs_domain/lib/generated/json/labour_request_list_entity.g.dart

@@ -0,0 +1,122 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/labour_request_list_entity.dart';
+
+LabourRequestListEntity $LabourRequestListEntityFromJson(Map<String, dynamic> json) {
+  final LabourRequestListEntity labourRequestListEntity = LabourRequestListEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    labourRequestListEntity.total = total;
+  }
+  final List<LabourRequestListRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<LabourRequestListRows>(e) as LabourRequestListRows).toList();
+  if (rows != null) {
+    labourRequestListEntity.rows = rows;
+  }
+  return labourRequestListEntity;
+}
+
+Map<String, dynamic> $LabourRequestListEntityToJson(LabourRequestListEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows?.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension LabourRequestListEntityExtension on LabourRequestListEntity {
+  LabourRequestListEntity copyWith({
+    int? total,
+    List<LabourRequestListRows>? rows,
+  }) {
+    return LabourRequestListEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+LabourRequestListRows $LabourRequestListRowsFromJson(Map<String, dynamic> json) {
+  final LabourRequestListRows labourRequestListRows = LabourRequestListRows();
+  final int? requestId = jsonConvert.convert<int>(json['request_id']);
+  if (requestId != null) {
+    labourRequestListRows.requestId = requestId;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    labourRequestListRows.jobTitle = jobTitle;
+  }
+  final String? departmentName = jsonConvert.convert<String>(json['department_name']);
+  if (departmentName != null) {
+    labourRequestListRows.departmentName = departmentName;
+  }
+  final String? jobTime = jsonConvert.convert<String>(json['job_time']);
+  if (jobTime != null) {
+    labourRequestListRows.jobTime = jobTime;
+  }
+  final int? needNum = jsonConvert.convert<int>(json['need_num']);
+  if (needNum != null) {
+    labourRequestListRows.needNum = needNum;
+  }
+  final int? coStatus = jsonConvert.convert<int>(json['co_status']);
+  if (coStatus != null) {
+    labourRequestListRows.coStatus = coStatus;
+  }
+  final String? coStatusShow = jsonConvert.convert<String>(json['co_status_show']);
+  if (coStatusShow != null) {
+    labourRequestListRows.coStatusShow = coStatusShow;
+  }
+  final bool? publishStatus = jsonConvert.convert<bool>(json['publish_status']);
+  if (publishStatus != null) {
+    labourRequestListRows.publishStatus = publishStatus;
+  }
+  final String? createdAt = jsonConvert.convert<String>(json['created_at']);
+  if (createdAt != null) {
+    labourRequestListRows.createdAt = createdAt;
+  }
+  final List<String>? actionList = (json['action_list'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<String>(e) as String).toList();
+  if (actionList != null) {
+    labourRequestListRows.actionList = actionList;
+  }
+  return labourRequestListRows;
+}
+
+Map<String, dynamic> $LabourRequestListRowsToJson(LabourRequestListRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['request_id'] = entity.requestId;
+  data['job_title'] = entity.jobTitle;
+  data['department_name'] = entity.departmentName;
+  data['job_time'] = entity.jobTime;
+  data['need_num'] = entity.needNum;
+  data['co_status'] = entity.coStatus;
+  data['co_status_show'] = entity.coStatusShow;
+  data['publish_status'] = entity.publishStatus;
+  data['created_at'] = entity.createdAt;
+  data['action_list'] = entity.actionList;
+  return data;
+}
+
+extension LabourRequestListRowsExtension on LabourRequestListRows {
+  LabourRequestListRows copyWith({
+    int? requestId,
+    String? jobTitle,
+    String? departmentName,
+    String? jobTime,
+    int? needNum,
+    int? coStatus,
+    String? coStatusShow,
+    bool? publishStatus,
+    String? createdAt,
+    List<String>? actionList,
+  }) {
+    return LabourRequestListRows()
+      ..requestId = requestId ?? this.requestId
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..departmentName = departmentName ?? this.departmentName
+      ..jobTime = jobTime ?? this.jobTime
+      ..needNum = needNum ?? this.needNum
+      ..coStatus = coStatus ?? this.coStatus
+      ..coStatusShow = coStatusShow ?? this.coStatusShow
+      ..publishStatus = publishStatus ?? this.publishStatus
+      ..createdAt = createdAt ?? this.createdAt
+      ..actionList = actionList ?? this.actionList;
+  }
+}

+ 1 - 0
packages/cs_domain/lib/repository/job_repository.dart

@@ -40,6 +40,7 @@ class JobRepository extends GetxService {
     final result = await httpProvider.requestNetResult(
       ApiConstants.apiSignApplied,
       params: params,
+      cancelToken: cancelToken,
     );
 
     //根据返回的结果,封装原始数据为Bean/Entity对象

+ 235 - 0
packages/cs_domain/lib/repository/labour_repository.dart

@@ -0,0 +1,235 @@
+import 'package:domain/entity/response/labour_request_add_option_entity.dart';
+import 'package:domain/entity/response/labour_request_edit_index_entity.dart';
+import 'package:domain/entity/response/labour_request_index_entity.dart';
+import 'package:domain/entity/response/labour_request_list_entity.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/dio_export.dart';
+import 'package:plugin_platform/http/http_provider.dart';
+import 'package:plugin_platform/http/http_result.dart';
+import 'package:shared/utils/util.dart';
+
+import '../constants/api_constants.dart';
+
+/// 用工请求相关
+class LabourRepository extends GetxService {
+  HttpProvider httpProvider;
+
+  LabourRepository({required this.httpProvider});
+
+  /// 获取用工请求的筛选选项
+  Future<HttpResult<LabourRequestIndexEntity>> fetchLabourRequestIndex({
+    CancelToken? cancelToken,
+  }) async {
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiLabourRequestIndex,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = LabourRequestIndexEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<LabourRequestIndexEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取用工请求的主列表
+  Future<HttpResult<LabourRequestListEntity>> fetchLabourRequestList(
+    String? keyword,
+    String? startDate,
+    String? endDate,
+    String? statusId,
+    String? departmentId, {
+    required int curPage,
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = "20";
+
+    if (!Utils.isEmpty(keyword)) {
+      params["job_title"] = keyword!;
+    }
+    if (!Utils.isEmpty(startDate)) {
+      params["job_start"] = startDate!;
+    }
+    if (!Utils.isEmpty(endDate)) {
+      params["job_end"] = endDate!;
+    }
+    if (!Utils.isEmpty(statusId)) {
+      params["co_status"] = statusId!;
+    }
+    if (!Utils.isEmpty(departmentId)) {
+      params["co_department_id"] = departmentId!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiLabourRequestList,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = LabourRequestListEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<LabourRequestListEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 添加用工的选项
+  Future<HttpResult<LabourRequestAddOptionEntity>> fetchLabourRequestAddOption({
+    CancelToken? cancelToken,
+  }) async {
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiLabourRequestAddOption,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = LabourRequestAddOptionEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<LabourRequestAddOptionEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 添加用工请求发布
+  Future<HttpResult> addLabourRequestSubmit(
+    String? templateId,
+    String? jobStart,
+    String? jobEnd,
+    String? departmentId,
+    String? needNum, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['template_id'] = templateId ?? "";
+    params['job_start'] = jobStart ?? "";
+    params['job_end'] = jobEnd ?? "";
+    params['need_num'] = needNum ?? "";
+    if (!Utils.isEmpty(departmentId)) {
+      params["co_department_id"] = departmentId!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiLabourRequestAddSubmit,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 用工的编辑详情和选项
+  Future<HttpResult<LabourRequestEditIndexEntity>> fetchLabourRequestEditDetail(
+    String? requestId, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['request_id'] = requestId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiLabourRequestEditDetail,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      final json = result.getDataJson();
+      var data = LabourRequestEditIndexEntity.fromJson(json!);
+      //重新赋值data或list
+      return result.convert<LabourRequestEditIndexEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 编辑用工请求发布
+  Future<HttpResult> editLabourRequestSubmit(
+    String? requestId,
+    String? templateId,
+    String? jobStart,
+    String? jobEnd,
+    String? departmentId,
+    String? needNum, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['request_id'] = requestId ?? "";
+    params['template_id'] = templateId ?? "";
+    params['job_start'] = jobStart ?? "";
+    params['job_end'] = jobEnd ?? "";
+    params['need_num'] = needNum ?? "";
+    if (!Utils.isEmpty(departmentId)) {
+      params["co_department_id"] = departmentId!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiLabourRequestEditSubmit,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  /// 撤回用工请求
+  Future<HttpResult> recallLabourRequest(
+    String? requestId, {
+    CancelToken? cancelToken,
+  }) async {
+    //参数
+    Map<String, String> params = {};
+    params['request_id'] = requestId ?? "";
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiLabourRequestRecall,
+      method: HttpMethod.POST,
+      params: params,
+      networkDebounce: true,
+      isShowLoadingDialog: true,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      //重新赋值data或list
+      return result.convert();
+    }
+    return result.convert();
+  }
+
+  ///  用工的审核详情工作流列表
+
+}

+ 2 - 0
packages/cs_initializer/lib/global_services_injection.dart

@@ -1,6 +1,7 @@
 import 'package:domain/constants/api_constants.dart';
 import 'package:domain/repository/auth_repository.dart';
 import 'package:domain/repository/job_repository.dart';
+import 'package:domain/repository/labour_repository.dart';
 import 'package:plugin_basic/basic_export.dart';
 import 'package:plugin_basic/dio_interceptors/interceptor_auth_dio.dart';
 import 'package:plugin_basic/dio_interceptors/interceptor_status_code_dio.dart';
@@ -34,6 +35,7 @@ class GlobalServicesInjection {
 
     //其他的数据仓库注入
     Get.lazyPut(() => JobRepository(httpProvider: Get.find()));
+    Get.lazyPut(() => LabourRepository(httpProvider: Get.find()));
 
     // 用户信息服务(用户信息相关业务类)
     Get.put(UserService(Get.find()));

+ 4 - 4
packages/cs_plugin_basic/lib/dio_interceptors/interceptor_auth_dio.dart

@@ -41,10 +41,10 @@ class AuthDioInterceptors extends Interceptor {
     }
 
     //每个接口添加自定义的设备UUID标识
-    final uuid = SPUtil.getString(AppConstant.storageDeviceUUID);
-    if (Utils.isNotEmpty(uuid)) {
-      headers['device-uuid'] = uuid!;
-    }
+    // final uuid = SPUtil.getString(AppConstant.storageDeviceUUID);
+    // if (Utils.isNotEmpty(uuid)) {
+    //   headers['device-uuid'] = uuid!;
+    // }
 
     //如果有通行令牌,都带上通行令牌
     String? token = UserService.to.token;

+ 9 - 9
packages/cs_plugin_platform/lib/engine/dialog/dialog_engine.dart

@@ -92,15 +92,15 @@ class DialogEngine {
       alignment = Alignment.center;
     }
 
-    SmartAnimationType? animType;
+    SmartAnimationType? smartAnimationType;
     if (animType == DialogAnimation.fade) {
-      animType = SmartAnimationType.fade;
-    } else if (position == DialogAnimation.scale) {
-      animType = SmartAnimationType.scale;
-    } else if (position == DialogAnimation.centerFade_otherSlide) {
-      animType = SmartAnimationType.centerFade_otherSlide;
-    } else if (position == DialogAnimation.centerScale_otherSlide) {
-      animType = SmartAnimationType.centerScale_otherSlide;
+      smartAnimationType = SmartAnimationType.fade;
+    } else if (animType == DialogAnimation.scale) {
+      smartAnimationType = SmartAnimationType.scale;
+    } else if (animType == DialogAnimation.centerFade_otherSlide) {
+      smartAnimationType = SmartAnimationType.centerFade_otherSlide;
+    } else if (animType == DialogAnimation.centerScale_otherSlide) {
+      smartAnimationType = SmartAnimationType.centerScale_otherSlide;
     }
 
     return SmartDialog.show(
@@ -110,7 +110,7 @@ class DialogEngine {
       debounce: true,
       clickMaskDismiss: clickMaskDismiss,
       backDismiss: backDismiss,
-      animationType: animType,
+      animationType: smartAnimationType,
       onDismiss: onDismiss,
       tag: tag,
       maskColor: maskColor,

BIN
packages/cs_resources/assets/base_service/dialog_delete_icon.webp


BIN
packages/cs_resources/assets/base_service/title_bar_filter_icon.webp


BIN
packages/cs_resources/assets/base_service/triangle_drop_down_icon.webp


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

@@ -11,6 +11,7 @@ class ColorConstants {
   static const Color secondaryDarkAppColor = Color(0xFF1D1D1E); //Theme的Appbar颜色
 
   static const Color gray = Color(0xFFCCCCCC);
+  static const Color grayECECEC = Color(0xFFECECEC);
   static const Color black = Color(0xFF000000);
   static const Color white = Color(0xFFFFFFFF);
   static const Color dividerA6 = Color(0x4da6a6a6);

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

@@ -8,8 +8,11 @@ class Assets {
   static const String baseLibDialogDeleteIcon = 'assets/base_lib/dialog_delete_icon.webp';
   static const String baseLibImageDefaultPlaceholder = 'assets/base_lib/image_default_placeholder.png';
   static const String baseLibWhiteBack = 'assets/base_lib/white_back.webp';
+  static const String baseServiceDialogDeleteIcon = 'assets/base_service/dialog_delete_icon.webp';
   static const String baseServicePageLoadError = 'assets/base_service/page_load_error.webp';
   static const String baseServicePageNoData = 'assets/base_service/page_no_data.webp';
+  static const String baseServiceTitleBarFilterIcon = 'assets/base_service/title_bar_filter_icon.webp';
+  static const String baseServiceTriangleDropDownIcon = 'assets/base_service/triangle_drop_down_icon.webp';
   static const String cptAuthLoginRadioChecked = 'assets/cpt_auth/login_radio_checked.webp';
   static const String cptAuthLoginRadioUncheck = 'assets/cpt_auth/login_radio_uncheck.webp';
   static const String cptAuthPasswordHideIcon = 'assets/cpt_auth/password_hide_icon.webp';

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

@@ -55,6 +55,22 @@ const Map<String, String> en_US = {
   'Logout': 'Logout',
   'Old Password': 'Old Password',
   'Settings': 'Settings',
+  'Title': 'Title',
+  'Create New Job Request': 'Create New Job Request',
+  'Outlet': 'Outlet',
+  'Status': 'Status',
+  'Filter': 'Filter',
+  'Edit': 'Edit',
+  'Recall': 'Recall',
+  'Detail': 'Detail',
+  'Outlet:': 'Outlet:',
+  'DateTime:': 'DateTime:',
+  'No. of Staff:': 'No. of Staff:',
+  'Status:': 'Status:',
+  'Publish Status:': 'Publish Status:',
+  'Created At:': 'Created At:',
+  'Published': 'Published',
+  'Unpublished': 'Unpublished',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

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

@@ -55,6 +55,22 @@ const Map<String, String> zh_CN = {
   'Logout': '登出',
   'Old Password': '旧密码',
   'Settings': '设置',
+  'Title': '标题',
+  'Create New Job Request': '创建新的用工请求',
+  'Outlet': '部门',
+  'Status': '状态',
+  'Filter': '筛选',
+  'Edit': '编辑',
+  'Recall': '撤回',
+  'Detail': '详情',
+  'Outlet:': '部门:',
+  'DateTime:': '日期与时间:',
+  'No. of Staff:': '需求人数:',
+  'Status:': '状态:',
+  'Publish Status:': '发布状态:',
+  'Created At:': '创建时间:',
+  'Published': '已发布',
+  'Unpublished': '未发布',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',

+ 2 - 0
packages/cs_router/lib/componentRouter/job_service.dart

@@ -6,4 +6,6 @@ abstract class JobService {
 
   void startSignInSignOutPage();
 
+  void startLabourRequestPage();
+
 }

+ 8 - 3
packages/cs_router/lib/path/router_path.dart

@@ -1,4 +1,3 @@
-
 class RouterPath {
   // 默认的路由
   static const SPLASH = '/';
@@ -6,7 +5,7 @@ class RouterPath {
   static const GUIDE = '/guide'; //指引页面
 
   //用户
-  static const AUTH_LOGIN = '/auth/login';  //用户登录注册
+  static const AUTH_LOGIN = '/auth/login'; //用户登录注册
   static const AUTH_SIGNUP = '/auth/signup'; //注册
   static const AUTH_RESET_PSD = '/auth/rest_psd'; //重置密码
 
@@ -14,10 +13,16 @@ class RouterPath {
   static const MAIN = '/main';
   static const SETTINGS = '/settings';
 
-
   //工作-签到签出
   static const JOB_SIGN_IN_SIGN_OUT = '/job/sign_in_sign_out';
 
+  //用工请求
+  static const JOB_LABOUR_REQUEST_LIST = '/labour/list'; //用工请求列表
+  static const JOB_LABOUR_REQUEST_ADD = '/labour/add'; //用工请求添加
+  static const JOB_LABOUR_REQUEST_Detail = '/labour/detail'; //用工请求详情
+  static const JOB_LABOUR_REQUEST_WORKFLOW = '/labour/workflow'; //用工请求修改状态的工作流
+
+  //全局其他
   static const PREVIEW_IMAGE = '/preview/image'; //预览图片
   static const GLOBAL_WEB = '/global/web'; //全局公用的Web页面
 

+ 0 - 86
packages/cs_widgets/lib/dialog/app_default_dialog.dart

@@ -133,92 +133,6 @@ class AppDefaultDialog extends StatelessWidget {
         ),
       ],
     ).constrained(width: 295);
-
-    // return Container(
-    //   width: 283,
-    //   decoration: BoxDecoration(
-    //     color: Colors.white, // 设置背景颜色
-    //     borderRadius: BorderRadius.circular(15), // 设置圆角
-    //   ),
-    //   child: Column(
-    //     children: [
-    //       MyTextView(
-    //         title,
-    //         fontSize: 19,
-    //         isFontMedium: true,
-    //         textColor: ColorConstants.black,
-    //         marginTop: 15,
-    //         marginBottom: 12,
-    //       ),
-    //
-    //       ScrollConfiguration(
-    //           behavior: NoShadowScrollBehavior(),
-    //           child: SingleChildScrollView(
-    //             child: MyTextView(
-    //               message,
-    //               fontSize: 15,
-    //               textColor: Colors.black,
-    //               isFontMedium: true,
-    //               textAlign: TextAlign.center,
-    //               paddingLeft: 30,
-    //               paddingRight: 30,
-    //               paddingBottom: 20,
-    //               marginTop: 20,
-    //               marginBottom: 25,
-    //             ),
-    //           )).marginSymmetric(vertical: 10).constrained(maxHeight: 400),
-    //
-    //       Container(
-    //         color: Color(0XFFCECECE),
-    //         height: 0.5,
-    //       ),
-    //
-    //       //Buttons
-    //       Row(
-    //         children: [
-    //           Expanded(
-    //               flex: 1,
-    //               child: InkWell(
-    //                 onTap: () {
-    //                   onCancel();
-    //                   cancelAction?.call();
-    //                 },
-    //                 child: MyTextView(
-    //                   "Cancel".tr,
-    //                   fontSize: 17.5,
-    //                   isFontMedium: true,
-    //                   textAlign: TextAlign.center,
-    //                   textColor: Color(0XFF0085C4),
-    //                   cornerRadius: 3,
-    //                   borderWidth: 1,
-    //                 ),
-    //               )),
-    //           Container(
-    //             color: Color(0XFFCECECE),
-    //             width: 0.5,
-    //           ),
-    //           Expanded(
-    //               flex: 1,
-    //               child: InkWell(
-    //                 onTap: () async {
-    //                   onCancel();
-    //                   confirmAction();
-    //                 },
-    //                 child: MyTextView(
-    //                   "Confirm".tr,
-    //                   marginLeft: 10,
-    //                   fontSize: 17.5,
-    //                   isFontMedium: true,
-    //                   textAlign: TextAlign.center,
-    //                   textColor: Color(0XFF0085C4),
-    //                   cornerRadius: 3,
-    //                 ),
-    //               )),
-    //         ],
-    //       ).expanded(),
-    //     ],
-    //   ),
-    // ).constrained(maxHeight: 295);
   }
 
   //取消弹框

+ 15 - 1
packages/cs_widgets/lib/my_text_view.dart

@@ -1,3 +1,4 @@
+import 'dart:ffi';
 import 'dart:ui';
 
 import 'package:flutter/material.dart';
@@ -37,6 +38,10 @@ class MyTextView extends StatelessWidget {
   TextAlign? textAlign;
   FontStyle? fontStyle;
   int? maxLines;
+  TextDecoration? textDecoration; //设置文本的装饰
+  Color? decorationColor; //文本的装饰颜色
+  double? decorationThickness; //装饰粗细
+  TextDecorationStyle? decorationStyle; //装饰样式
 
   //底部是Text的父容器属性
   VoidCallback? onClick;
@@ -80,6 +85,10 @@ class MyTextView extends StatelessWidget {
     this.margin,
     this.maxLines,
     this.fontSize,
+    this.textDecoration,
+    this.decorationColor,
+    this.decorationThickness,
+    this.decorationStyle,
     this.isTextEllipsis,
     this.isFontLight,
     this.isFontRegular,
@@ -162,7 +171,8 @@ class MyTextView extends StatelessWidget {
       ),
       padding: EdgeInsets.fromLTRB(paddingLeft ?? 0, paddingTop ?? 0, paddingRight ?? 0, paddingBottom ?? 0),
       child: onClick != null
-          ? _childText().onTap(  //使用扩展的方式点击
+          ? _childText().onTap(
+              //使用扩展的方式点击
               onClick!,
               type: type,
               milliseconds: milliseconds,
@@ -183,6 +193,10 @@ class MyTextView extends StatelessWidget {
         fontWeight: fontWeight,
         fontStyle: fontStyle,
         overflow: isTextEllipsis ?? false ? TextOverflow.ellipsis : TextOverflow.clip,
+        decoration: textDecoration,
+        decorationColor: decorationColor, // 可选,设置下划线的颜色
+        decorationThickness: decorationThickness, // 可选,设置下划线的粗细
+        decorationStyle: decorationStyle, // 可选,设置下划线的样式
       ),
     );
   }