Browse Source

添加员工,确认工作

liukai 7 months ago
parent
commit
686af47e9b
30 changed files with 979 additions and 168 deletions
  1. 7 0
      packages/cpt_job/lib/router/job_service_impl.dart
  2. 0 0
      packages/cpt_job_sg/lib/modules/abc
  3. 158 0
      packages/cpt_job_sg/lib/modules/applied_staff/applied_staff_add.dart
  4. 173 0
      packages/cpt_job_sg/lib/modules/applied_staff/applied_staff_controller.dart
  5. 156 0
      packages/cpt_job_sg/lib/modules/applied_staff/applied_staff_page.dart
  6. 12 0
      packages/cpt_job_sg/lib/modules/applied_staff/applied_staff_state.dart
  7. 0 0
      packages/cpt_job_sg/lib/modules/job_applied/applied_staff_item.dart
  8. 313 0
      packages/cpt_job_sg/lib/modules/job_applied/applied_staff_reviews.dart
  9. 0 0
      packages/cpt_job_sg/lib/modules/job_applied/drop_down_status.dart
  10. 68 82
      packages/cpt_labour_sg/lib/modules/job_applied/job_applied_controller.dart
  11. 5 3
      packages/cpt_labour_sg/lib/modules/job_applied/job_applied_page.dart
  12. 0 0
      packages/cpt_job_sg/lib/modules/job_applied/job_applied_state.dart
  13. 0 7
      packages/cpt_job_sg/lib/modules/job_list_sg/job_list_sg_controller.dart
  14. 0 16
      packages/cpt_job_sg/lib/modules/job_list_sg/job_list_sg_page.dart
  15. 0 5
      packages/cpt_job_sg/lib/modules/job_list_sg/job_list_sg_state.dart
  16. 4 3
      packages/cpt_job_sg/lib/router/job_sg_service_impl.dart
  17. 11 3
      packages/cpt_job_sg/lib/router/page_router.dart
  18. 2 4
      packages/cpt_labour_sg/lib/modules/job_list/job_list_controller.dart
  19. 0 7
      packages/cpt_labour_sg/lib/router/page_router.dart
  20. 4 4
      packages/cs_domain/lib/entity/response/job_applied_remark_view_s_g_entity.dart
  21. 2 0
      packages/cs_domain/lib/entity/response/job_applied_staff_s_g_entity.dart
  22. 8 8
      packages/cs_domain/lib/generated/json/job_applied_remark_view_s_g_entity.g.dart
  23. 8 1
      packages/cs_domain/lib/generated/json/job_applied_staff_s_g_entity.g.dart
  24. 17 14
      packages/cs_domain/lib/repository/job_sg_repository.dart
  25. 4 0
      packages/cs_resources/lib/local/language/en_US.dart
  26. 4 0
      packages/cs_resources/lib/local/language/vi_VN.dart
  27. 4 0
      packages/cs_resources/lib/local/language/zh_CN.dart
  28. 1 0
      packages/cs_router/lib/componentRouter/job_service.dart
  29. 1 1
      packages/cs_router/lib/componentRouter/job_sg_service.dart
  30. 17 10
      packages/cs_widgets/lib/my_text_view.dart

+ 7 - 0
packages/cpt_job/lib/router/job_service_impl.dart

@@ -3,6 +3,7 @@ import 'package:plugin_basic/basic_export.dart';
 import 'package:router/componentRouter/job_service.dart';
 import 'package:shared/utils/log_utils.dart';
 
+import '../modules/applied_staff_detail/applied_staff_detail_page.dart';
 import '../modules/sign_in_sign_out/sign_in_sign_out_page.dart';
 
 class JobServiceImpl extends GetxService implements JobService {
@@ -30,4 +31,10 @@ class JobServiceImpl extends GetxService implements JobService {
   void startJobListPage() {
     JobListPage.startInstance();
   }
+
+  @override
+  void startStaffDetailPage(String? memberId) {
+    AppliedStaffDetailPage.startInstance(memberId);
+  }
+
 }

+ 0 - 0
packages/cpt_job_sg/lib/modules/abc


+ 158 - 0
packages/cpt_job_sg/lib/modules/applied_staff/applied_staff_add.dart

@@ -0,0 +1,158 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/job_applied_staff_s_g_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:plugin_basic/basic_export.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+
+/**
+ * 已申请的员工列表Item
+ */
+class AppliedStaffItem extends StatelessWidget {
+  final int index;
+  final JobAppliedStaffSGRows item;
+  final VoidCallback? onItemAction;
+
+  AppliedStaffItem({
+    required this.index,
+    required this.item,
+    this.onItemAction,
+  });
+
+  @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: [
+          //员工姓名
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Name:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //姓名
+              MyTextView(
+                item.name ?? "-",
+                isFontMedium: true,
+                textColor: ColorConstants.white,
+                fontSize: 14,
+                marginLeft: 5,
+                marginRight: 5,
+              ).expanded(),
+
+              //是否选中
+              MyAssetImage(
+                item.isSelected || item.applyState == 1 ? Assets.baseServiceItemSelectedIcon : Assets.baseServiceItemUnselectedIcon,
+                width: 20.5,
+                height: 20.5,
+              ),
+            ],
+          ),
+
+          // 性别
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Gender".tr + ":",
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+              MyTextView(
+                item.gender ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          // 身份证
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Nric".tr + ":",
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //时间
+              MyTextView(
+                item.nric ?? "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: Colors.white,
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+
+          // 头像
+          Row(
+            mainAxisSize: MainAxisSize.min,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Avatar".tr + ":",
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+                marginRight: 12,
+              ),
+              MyLoadImage(item.profilePicture, width: 100, height: 100),
+            ],
+          ).marginOnly(top: 12),
+
+          // 状态
+          Row(
+            mainAxisSize: MainAxisSize.max,
+            crossAxisAlignment: CrossAxisAlignment.center,
+            children: [
+              MyTextView(
+                "Status:".tr,
+                isFontRegular: true,
+                textColor: ColorConstants.textGrayAECAE5,
+                fontSize: 14,
+              ),
+
+              //发布状态
+              MyTextView(
+                item.status == 1 ? "Active" : "-",
+                marginLeft: 5,
+                isFontRegular: true,
+                textColor: ColorConstants.textBlue06D9FF, //默认蓝色
+                fontSize: 14,
+              ).expanded(),
+            ],
+          ).marginOnly(top: 12),
+        ],
+      ).onTap(() {
+        onItemAction?.call();
+      }),
+    );
+  }
+}

+ 173 - 0
packages/cpt_job_sg/lib/modules/applied_staff/applied_staff_controller.dart

@@ -0,0 +1,173 @@
+import 'package:domain/entity/response/job_applied_staff_s_g_entity.dart';
+import 'package:domain/repository/job_sg_repository.dart';
+import 'package:get/get.dart';
+import 'package:plugin_basic/constants/app_constant.dart';
+import 'package:plugin_platform/engine/notify/notify_engine.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:shared/utils/event_bus.dart';
+import 'package:shared/utils/util.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'applied_staff_state.dart';
+
+class AppliedStaffController extends GetxController with DioCancelableMixin {
+  final JobSGRepository _jobRepository = Get.find();
+  final AppliedStaffState state = AppliedStaffState();
+
+  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;
+    fetchAppliedStaffList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchAppliedStaffList();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchAppliedStaffList();
+  }
+
+  /// 获取服务器数据,通知消息列表
+  Future fetchAppliedStaffList() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading);
+    }
+
+    // 获取 Applied 列表
+    var listResult = await _jobRepository.searchJobAppliedStaff(
+      state.jobId,
+      state.keyword,
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
+
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.rows);
+    } else {
+      errorMessage = listResult.errorMsg;
+      changeLoadingState(LoadState.State_Error);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+  // 处理数据与展示的逻辑
+  void handleList(List<JobAppliedStaffSGRows>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        state.datas.clear();
+        state.datas.addAll(list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success);
+      } else {
+        //加载更多
+        state.datas.addAll(list);
+        refreshController.finishLoad();
+        update();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        state.datas.clear();
+        changeLoadingState(LoadState.State_Empty);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchAppliedStaffList();
+  }
+
+  @override
+  void onClose() {
+    state.datas.clear();
+    super.onClose();
+  }
+
+  /// 搜索员工
+  void doSearch(String keyword) {
+    state.keyword = keyword;
+    //赋值之后刷新
+    refreshController.callRefresh();
+  }
+
+  /// 清空筛选条件
+  void resetFiltering() {
+    state.keyword = "";
+    state.searchController.text = "";
+    //赋值之后刷新
+    refreshController.callRefresh();
+  }
+
+  /// Item选中与未选中设置
+  void doSelectedOrNot(JobAppliedStaffSGRows data) {
+    //如果此人没有在工作中,可以选中与未选中
+    if (data.applyState == 0){
+      data.isSelected = !data.isSelected;
+      update();
+    }
+
+  }
+
+  /// 提交选中的成员
+  void doSubmit() async {
+    //筛选选中的员工
+    final ids = state.datas.where((element) => element.isSelected).map((e) => e.id).toList();
+
+    if (ids.isEmpty) {
+      ToastEngine.show("Choose Staff".tr);
+      return;
+    }
+
+    var result = await _jobRepository.addStaff2AppliedJob(state.jobId, ids.join(","), cancelToken: cancelToken);
+
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+      Get.back();
+      bus.emit(AppConstant.eventAppliedListRefresh, "");
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      return;
+    }
+  }
+
+}

+ 156 - 0
packages/cpt_job_sg/lib/modules/applied_staff/applied_staff_page.dart

@@ -0,0 +1,156 @@
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:get/get.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_button.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/search_app_bar.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'applied_staff_add.dart';
+import 'applied_staff_controller.dart';
+
+import 'package:plugin_basic/base/base_state.dart';
+import 'package:plugin_basic/base/base_stateful_page.dart';
+import 'package:plugin_basic/utils/ext_get_nav.dart';
+import 'package:router/path/router_path.dart';
+import 'package:shared/utils/screen_util.dart';
+import 'package:widgets/my_appbar.dart';
+import 'applied_staff_state.dart';
+
+/**
+ * 已申请的页面,添加员工页面
+ */
+class AppliedStaffPage extends BaseStatefulPage<AppliedStaffController> {
+  AppliedStaffPage({Key? key}) : super(key: key);
+
+  //启动当前页面
+  static void startInstance(String? jobId) {
+    return Get.start(RouterPath.JOB_LIST_APPLIED_STAFF_LIST_SG, arguments: {'jobId': jobId});
+  }
+
+  @override
+  AppliedStaffController createRawController() {
+    return AppliedStaffController();
+  }
+
+  @override
+  State<AppliedStaffPage> createState() => _AppliedStaffState();
+}
+
+class _AppliedStaffState extends BaseState<AppliedStaffPage, AppliedStaffController> {
+  late AppliedStaffState state;
+
+  @override
+  void initState() {
+    super.initState();
+    state = controller.state;
+    state.jobId = Get.arguments['jobId'];
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return autoCtlGetBuilder(builder: (controller) {
+      return SafeArea(
+        bottom: true,
+        top: false,
+        child: Container(
+          width: double.infinity,
+          height: double.infinity,
+          padding: EdgeInsets.only(top: ScreenUtil.getStatusBarH(context)),
+          decoration: const BoxDecoration(
+            gradient: LinearGradient(
+              colors: [
+                Color(0xFF091D44),
+                Color(0xFF245A8A),
+                Color(0xFF7F7CEC),
+              ],
+              begin: Alignment.topCenter,
+              end: Alignment.bottomCenter,
+            ),
+          ),
+          child: Column(
+            children: [
+              MyAppBar.titleBar(
+                context,
+                "Add Staff - Choose Staff".tr,
+              ),
+
+              //搜索的条件
+              Row(
+                children: [
+                  SearchAppBar(
+                    value: state.keyword,
+                    onSearch: (keyword) {
+                      controller.doSearch(keyword);
+                    },
+                    hintText: "Name / Nric".tr,
+                    controller: state.searchController,
+                  ).expanded(),
+                  MyButton(
+                    onPressed: () {
+                      FocusScope.of(context).unfocus();
+                      controller.resetFiltering();
+                    },
+                    text: "Reset".tr,
+                    textColor: ColorConstants.white,
+                    backgroundColor: hexToColor("#2BA9F9", opacity: 0.5),
+                    radius: 20,
+                    minWidth: 60,
+                    minHeight: 35,
+                  ),
+                ],
+              ).marginOnly(top: 10, left: 15, right: 15, bottom: 5),
+
+              //底部的列表
+              EasyRefresh(
+                controller: controller.refreshController,
+                onRefresh: controller.onRefresh,
+                onLoad: controller.loadMore,
+                child: LoadStateLayout(
+                  state: controller.loadingState,
+                  errorMessage: controller.errorMessage,
+                  errorRetry: () {
+                    controller.retryRequest();
+                  },
+                  successSliverWidget: [
+                    SliverList(
+                        delegate: SliverChildBuilderDelegate(
+                      (context, index) {
+                        return AppliedStaffItem(
+                          index: index,
+                          item: state.datas[index],
+                          onItemAction: () {
+                            controller.doSelectedOrNot(state.datas[index]);
+                          },
+                        );
+                      },
+                      childCount: state.datas.length,
+                    ))
+                  ],
+                ),
+              ).expanded(),
+
+              MyTextView(
+                "Submit".tr,
+                fontSize: 17,
+                isFontMedium: true,
+                boxHeight: 48,
+                onClick: () {
+                  controller.doSubmit();
+                },
+                alignment: Alignment.center,
+                textAlign: TextAlign.center,
+                textColor: Colors.white,
+                backgroundColor: Color(0XFFFFBB1B),
+              ),
+
+            ],
+          ),
+        ),
+      );
+    });
+  }
+}

+ 12 - 0
packages/cpt_job_sg/lib/modules/applied_staff/applied_staff_state.dart

@@ -0,0 +1,12 @@
+import 'package:domain/entity/response/job_applied_staff_s_g_entity.dart';
+import 'package:flutter/material.dart';
+
+class AppliedStaffState {
+  //筛选条件
+  final TextEditingController searchController = TextEditingController();
+  String keyword = "";
+
+  String? jobId;
+
+  List<JobAppliedStaffSGRows> datas = []; //员工列表
+}

packages/cpt_labour_sg/lib/modules/job_applied/applied_staff_item.dart → packages/cpt_job_sg/lib/modules/job_applied/applied_staff_item.dart


+ 313 - 0
packages/cpt_job_sg/lib/modules/job_applied/applied_staff_reviews.dart

@@ -0,0 +1,313 @@
+import 'dart:ui';
+
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/job_applied_remark_view_s_g_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/util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/shatter/rating_widget.dart';
+import 'package:widgets/widget_export.dart';
+
+/**
+ * 员工的评价弹窗
+ */
+class AppliedStaffReviews extends StatefulWidget {
+  JobAppliedRemarkViewSGEntity appliedReviews;
+  void Function(String attitudeRate, String performanceRate, String experienceRate, String groomingRate, String content)? confirmAction;
+
+  AppliedStaffReviews({required this.appliedReviews, this.confirmAction});
+
+  @override
+  State<AppliedStaffReviews> createState() => _AppliedStaffReviewsState();
+}
+
+class _AppliedStaffReviewsState extends State<AppliedStaffReviews> {
+  late JobAppliedRemarkViewSGEntity reviews;
+  late String attitudeRate;
+  late String groomingRate;
+  late String performanceRate;
+  late String experienceRate;
+  late String content;
+  late TextEditingController _controller;
+  late FocusNode _focusNode;
+
+  @override
+  void initState() {
+    super.initState();
+    _controller = TextEditingController();
+    _focusNode = FocusNode();
+
+    reviews = widget.appliedReviews;
+    attitudeRate = reviews.attitudeRate.toString();
+    groomingRate = reviews.groomingRate.toString();
+    performanceRate = reviews.performanceRate.toString();
+    experienceRate = reviews.experienceRate.toString();
+    _controller.text = reviews.feedback ?? "";
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Column(
+      crossAxisAlignment: CrossAxisAlignment.center,
+      mainAxisAlignment: MainAxisAlignment.center,
+      children: [
+        //Title (如果使用 Container 为最外层容器则默认为 match_parent 的效果,除非我们限制宽度和最大高度最小高度)
+        Container(
+          width: double.infinity,
+          decoration: BoxDecoration(
+            color: Colors.white,
+            borderRadius: const BorderRadius.all(Radius.circular(15)),
+          ),
+          child: Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              Center(
+                child: MyTextView(
+                  "Remarks".tr,
+                  fontSize: 19,
+                  isFontMedium: true,
+                  textColor: ColorConstants.black,
+                  marginTop: 23,
+                  marginBottom: 19,
+                  marginLeft: 22,
+                  marginRight: 22,
+                ),
+              ),
+
+              MyTextView(
+                reviews.labourerName ?? "",
+                isFontRegular: true,
+                textColor: Colors.black,
+                marginLeft: 22,
+                marginRight: 22,
+                fontSize: 17,
+              ),
+
+              //态度评分
+              Row(
+                children: [
+                  MyTextView(
+                    "Attitude".tr,
+                    isFontRegular: true,
+                    textColor: ColorConstants.black66,
+                    fontSize: 15,
+                  ).expanded(),
+                  RatingWidget(
+                    nomalImage: Assets.baseServiceRatingUnselected,
+                    selectImage: Assets.baseServiceRatingSelected,
+                    size: 21,
+                    padding: 5,
+                    selectAble: Utils.isEmpty(reviews.feedback),
+                    integerOnly: true,
+                    value: reviews.attitudeRate,
+                    onRatingUpdate: (value) {
+                      attitudeRate = value;
+                    },
+                  )
+                ],
+              ).marginOnly(top: 15, left: 22, right: 22),
+
+              //表现评分
+              Row(
+                children: [
+                  MyTextView(
+                    "Performance".tr,
+                    isFontRegular: true,
+                    textColor: ColorConstants.black66,
+                    fontSize: 15,
+                  ).expanded(),
+                  RatingWidget(
+                    nomalImage: Assets.baseServiceRatingUnselected,
+                    selectImage: Assets.baseServiceRatingSelected,
+                    size: 21,
+                    padding: 5,
+                    selectAble: Utils.isEmpty(reviews.feedback),
+                    integerOnly: true,
+                    value: reviews.performanceRate,
+                    onRatingUpdate: (value) {
+                      performanceRate = value;
+                    },
+                  )
+                ],
+              ).marginOnly(top: 15, left: 22, right: 22),
+
+              //经验评分
+              Row(
+                children: [
+                  MyTextView(
+                    "Experience".tr,
+                    isFontRegular: true,
+                    textColor: ColorConstants.black66,
+                    fontSize: 15,
+                  ).expanded(),
+                  RatingWidget(
+                    nomalImage: Assets.baseServiceRatingUnselected,
+                    selectImage: Assets.baseServiceRatingSelected,
+                    size: 21,
+                    padding: 5,
+                    selectAble: Utils.isEmpty(reviews.feedback),
+                    integerOnly: true,
+                    value: reviews.experienceRate,
+                    onRatingUpdate: (value) {
+                      experienceRate = value;
+                    },
+                  )
+                ],
+              ).marginOnly(top: 15, left: 22, right: 22),
+
+              //着装评分
+              Row(
+                children: [
+                  MyTextView(
+                    "Grooming".tr,
+                    isFontRegular: true,
+                    textColor: ColorConstants.black66,
+                    fontSize: 15,
+                  ).expanded(),
+                  RatingWidget(
+                    nomalImage: Assets.baseServiceRatingUnselected,
+                    selectImage: Assets.baseServiceRatingSelected,
+                    size: 21,
+                    padding: 5,
+                    selectAble: Utils.isEmpty(reviews.feedback),
+                    integerOnly: true,
+                    value: reviews.groomingRate,
+                    onRatingUpdate: (value) {
+                      groomingRate = value;
+                    },
+                  )
+                ],
+              ).marginOnly(top: 15, left: 22, right: 22),
+
+              IgnoreKeyboardDismiss(
+                child: Container(
+                  height: 130,
+                  margin: EdgeInsets.symmetric(vertical: 19, horizontal: 22),
+                  padding: EdgeInsets.symmetric(vertical: 15, horizontal: 15),
+                  decoration: BoxDecoration(
+                    color: Color(0xFFF0F0F0),
+                    border: Border.all(
+                      color: Color(0xFFD8D8D8),
+                      width: 0.5,
+                    ),
+                  ),
+                  child: TextField(
+                    cursorColor: ColorConstants.black66,
+                    cursorWidth: 1.5,
+                    autofocus: false,
+                    enabled: Utils.isEmpty(reviews.feedback),
+                    focusNode: _focusNode,
+                    controller: _controller,
+                    // 装饰
+                    decoration: InputDecoration(
+                      isDense: true,
+                      isCollapsed: true,
+                      border: InputBorder.none,
+                      hintText: "Enter...".tr,
+                      hintStyle: TextStyle(
+                        color: ColorConstants.black66,
+                        fontSize: 15.0,
+                        fontWeight: FontWeight.w400,
+                      ),
+                    ),
+                    style: TextStyle(
+                      color: ColorConstants.black,
+                      fontSize: 15.0,
+                      fontWeight: FontWeight.w400,
+                    ),
+                    // 键盘动作右下角图标
+                    textInputAction: TextInputAction.done,
+                    onSubmitted: (value) {
+                      doCallbackAction();
+                    },
+                  ),
+                ),
+              ),
+
+              // 分割线
+              Container(
+                color: Color(0XFFCECECE),
+                height: 0.5,
+              ),
+
+              //按钮组
+              Row(
+                children: [
+                  Expanded(
+                      flex: 1,
+                      child: InkWell(
+                        onTap: () {
+                          onCancel();
+                        },
+                        child: MyTextView(
+                          "Cancel".tr,
+                          fontSize: 17.5,
+                          isFontMedium: true,
+                          textAlign: TextAlign.center,
+                          textColor: Color(0XFF0085C4),
+                          cornerRadius: 3,
+                          borderWidth: 1,
+                        ),
+                      )),
+                  Container(
+                    color: Color(0xff09141F).withOpacity(0.13),
+                    width: 0.5,
+                  ),
+                  Expanded(
+                      flex: 1,
+                      child: InkWell(
+                        onTap: () {
+                          doCallbackAction();
+                        },
+                        child: MyTextView(
+                          "Submit".tr,
+                          marginLeft: 10,
+                          fontSize: 17.5,
+                          isFontMedium: true,
+                          textAlign: TextAlign.center,
+                          textColor: Color(0XFF0085C4),
+                          cornerRadius: 3,
+                        ),
+                      )),
+                ],
+              ).constrained(height: 46),
+            ],
+          ),
+        ),
+      ],
+    ).constrained(width: 285);
+  }
+
+  //取消弹框
+  void onCancel() async {
+    SmartDialog.dismiss();
+  }
+
+  //执行回调
+  void doCallbackAction() {
+    _focusNode.unfocus();
+
+    content = _controller.text.toString();
+
+    if (attitudeRate == "0" || experienceRate == "0" || performanceRate == "0" || groomingRate == "0") {
+      ToastEngine.show("Rate First");
+      return;
+    }
+
+    if (Utils.isEmpty(content)) {
+      ToastEngine.show("Please Enter Remark".tr);
+      return;
+    }
+
+    onCancel();
+
+    widget.confirmAction?.call(attitudeRate, performanceRate, experienceRate, groomingRate, content);
+  }
+}

packages/cpt_labour_sg/lib/modules/job_applied/drop_down_status.dart → packages/cpt_job_sg/lib/modules/job_applied/drop_down_status.dart


+ 68 - 82
packages/cpt_labour_sg/lib/modules/job_applied/job_applied_controller.dart

@@ -1,5 +1,7 @@
+import 'package:cpt_job_sg/modules/applied_staff/applied_staff_page.dart';
 import 'package:domain/entity/response/job_applied_list_s_g_entity.dart';
 import 'package:domain/repository/job_sg_repository.dart';
+import 'package:domain/repository/labour_sg_repository.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/src/widgets/framework.dart';
 import 'package:get/get.dart';
@@ -9,20 +11,21 @@ import 'package:plugin_platform/engine/notify/notify_engine.dart';
 
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
-import 'package:shared/utils/date_time_utils.dart';
+import 'package:router/componentRouter/component_router_service.dart';
 import 'package:shared/utils/event_bus.dart';
-import 'package:shared/utils/log_utils.dart';
 import 'package:shared/utils/util.dart';
 import 'package:widgets/dialog/app_default_dialog.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/picker/option_pick_util.dart';
 import 'package:widgets/widget_export.dart';
 
+import 'applied_staff_reviews.dart';
 import 'drop_down_status.dart';
 import 'job_applied_state.dart';
 
 class JobAppliedController extends GetxController with DioCancelableMixin {
   final JobSGRepository _jobRepository = Get.find();
+  final LabourSGRepository _labourRepository = Get.find();
   final JobAppliedState state = JobAppliedState();
 
   var _curPage = 1;
@@ -191,7 +194,7 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
 
   /// 展示添加员工的弹窗
   void gotoAddStaffPage() {
-    ToastEngine.show("展示添加员工");
+    AppliedStaffPage.startInstance(state.jobId);
   }
 
   //调用接口添加员工
@@ -223,63 +226,53 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
     // }
   }
 
-  /// 去编辑员工信息页面
-  void gotoAppliedEditPage(JobAppliedListSGRows data) {
-    // JobAppliedEditPage.startInstance(data.appliedId.toString());
-  }
+  /// 去编辑员工信息的弹窗
+  void showAppliedEditDialog(JobAppliedListSGRows data) {}
 
   /// 展示评论的弹窗
   void showRemarkDialog(JobAppliedListSGRows data) async {
-    // //请求接口获取到已评论的数据
-    // var result = await _jobRepository.fetchAppliedStaffReviewView(data.appliedId.toString());
-    //
-    // if (result.isSuccess) {
-    //   //接口数据获取成功,展示弹窗
-    //   DialogEngine.show(
-    //     widget: AppliedStaffReviews(
-    //       appliedReviews: result.data!,
-    //       confirmAction: (attitudeRate, performanceRate, experienceRate, groomingRate, content) async {
-    //         //请求接口,提交评论
-    //         var submitResult = await _jobRepository.remarkAppliedSingleStaffSubmit(
-    //           data.appliedId.toString(),
-    //           attitudeRate,
-    //           groomingRate,
-    //           performanceRate,
-    //           experienceRate,
-    //           content,
-    //         );
-    //
-    //         if (submitResult.isSuccess) {
-    //           NotifyEngine.showSuccess("Successful".tr);
-    //         } else {
-    //           ToastEngine.show(submitResult.errorMsg ?? "Network Load Error".tr);
-    //         }
-    //       },
-    //     ),
-    //   );
-    // } else {
-    //   ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
-    //   return;
-    // }
-  }
+    //请求接口获取到已评论的数据
+    var result = await _jobRepository.fetchJobAppliedRemarkView(data.appliedId.toString());
 
-  /// 去展示员工状态的审核流程页面
-  void gotoAppliedWorkflowPage(JobAppliedListSGRows data) {
-    // AppliedWorkflowPage.startInstance(data.appliedId.toString());
+    if (result.isSuccess) {
+      //接口数据获取成功,展示弹窗
+      DialogEngine.show(
+        widget: AppliedStaffReviews(
+          appliedReviews: result.data!,
+          confirmAction: (attitudeRate, performanceRate, experienceRate, groomingRate, content) async {
+            //请求接口,提交评论
+            var submitResult = await _jobRepository.submitAppliedRemark(
+              data.appliedId.toString(),
+              attitudeRate,
+              groomingRate,
+              performanceRate,
+              experienceRate,
+              content,
+            );
+
+            if (submitResult.isSuccess) {
+              NotifyEngine.showSuccess("Successful".tr);
+            } else {
+              ToastEngine.show(submitResult.errorMsg ?? "Network Load Error".tr);
+            }
+          },
+        ),
+      );
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      return;
+    }
   }
 
   /// 去查看员工详情页面
   void gotoStaffDetailPage(JobAppliedListSGRows data) {
-    // AppliedStaffDetailPage.startInstance(data.memberId.toString());
+    ComponentRouterServices.jobService.startStaffDetailPage(data.memberId);
   }
 
   /// Item选中与未选中设置
   void doSelectedOrNot(JobAppliedListSGRows data) {
-    //只有 Approve = 3 的状态才能选中
-
     data.isSelected = !data.isSelected;
     update();
-    Log.d("选中:${data.isSelected}");
   }
 
   /// 批量修改的弹窗
@@ -325,40 +318,6 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
     // }
   }
 
-  /// 批准的操作
-  void operationApprove() async {
-    //找出已经选中的员工(只有状态为3 Approve的状态才能修改)
-    // var selectedList = state.datas.where((element) => element.isSelected && element.status == 3).toList(growable: false);
-    // if (selectedList.isNotEmpty) {
-    //   var ids = selectedList.map((e) => e.appliedId.toString()).toList(growable: false);
-    //   var separatedIds = ids.join(',');
-    //
-    //   // Are you sure 的弹窗
-    //   DialogEngine.show(
-    //     widget: AppDefaultDialog(
-    //       title: "Message".tr,
-    //       message: "Are you sure you want to setting approved?".tr,
-    //       confirmAction: () async {
-    //         //执行请求
-    //         var result = await _jobRepository.submitBatchStaffApprove(separatedIds, cancelToken: cancelToken);
-    //
-    //         if (result.isSuccess) {
-    //           NotifyEngine.showSuccess("Successful".tr);
-    //
-    //           //调用接口刷新指定的Staff的信息
-    //           fetchItemByIdAndRefreshItem(separatedIds);
-    //         } else {
-    //           ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
-    //           return;
-    //         }
-    //       },
-    //     ),
-    //   );
-    // } else {
-    //   ToastEngine.show("Please select the applied record".tr);
-    // }
-  }
-
   /// 根据ID获取Item对象,用于刷新
   void fetchItemByIdAndRefreshItem(String? appliedIds) async {
     var result = await _jobRepository.fetchItemByAppliedIds(
@@ -391,7 +350,35 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
     }
   }
 
-  void confirmJob() {}
+  /// 请求接口发送电子考勤,确定考勤
+  void confirmJob() {
+    DialogEngine.show(
+      widget: AppDefaultDialog(
+          title: "Notice".tr,
+          message: "Are you sure you want to send the e-attendance to agency?".tr,
+          confirmAction: () {
+            _requestSendEAttendance();
+          }),
+    );
+  }
+
+  //发送接口
+  void _requestSendEAttendance() async {
+    var result = await _labourRepository.confirmJobList(
+      state.jobId,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      //调用接口刷新指定的Staff的信息
+      refreshController.callRefresh();
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      return;
+    }
+  }
 
   // 顶部的筛选状态
   void pickStatus() {
@@ -459,5 +446,4 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
       return;
     }
   }
-
 }

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

@@ -199,15 +199,17 @@ class _JobAppliedState extends BaseState<JobAppliedPage, JobAppliedController> {
                           index: index,
                           item: state.datas[index],
                           onEditAction: () {
-                            controller.gotoAppliedEditPage(state.datas[index]);
+                            controller.showAppliedEditDialog(state.datas[index]);
                           },
                           onRemarkAction: () {
                             controller.showRemarkDialog(state.datas[index]);
                           },
                           onReviseAction: () {
-                            controller.gotoAppliedWorkflowPage(state.datas[index]);
+
+                          },
+                          onModifyAction: () {
+                            controller.showAppliedEditDialog(state.datas[index]);
                           },
-                          onModifyAction: () {},
                           onItemAction: () {
                             controller.doSelectedOrNot(state.datas[index]);
                           },

packages/cpt_labour_sg/lib/modules/job_applied/job_applied_state.dart → packages/cpt_job_sg/lib/modules/job_applied/job_applied_state.dart


+ 0 - 7
packages/cpt_job_sg/lib/modules/job_list_sg/job_list_sg_controller.dart

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

+ 0 - 16
packages/cpt_job_sg/lib/modules/job_list_sg/job_list_sg_page.dart

@@ -1,16 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:get/get.dart';
-
-import 'job_list_sg_controller.dart';
-
-class JobListSgPage extends StatelessWidget {
-  JobListSgPage({Key? key}) : super(key: key);
-
-  final controller = Get.put(JobListSgController());
-  final state = Get.find<JobListSgController>().state;
-
-  @override
-  Widget build(BuildContext context) {
-    return Container();
-  }
-}

+ 0 - 5
packages/cpt_job_sg/lib/modules/job_list_sg/job_list_sg_state.dart

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

+ 4 - 3
packages/cpt_job_sg/lib/router/job_sg_service_impl.dart

@@ -1,6 +1,7 @@
 import 'package:plugin_basic/basic_export.dart';
 import 'package:router/componentRouter/job_sg_service.dart';
-import 'package:shared/utils/log_utils.dart';
+
+import '../modules/job_applied/job_applied_page.dart';
 
 class JobSGServiceImpl extends GetxService implements JobSGService {
   @override
@@ -16,8 +17,8 @@ class JobSGServiceImpl extends GetxService implements JobSGService {
   }
 
   @override
-  void startJobListPage() {
-
+  void startJobAppliedPage(String? jobId) {
+    JobAppliedPage.startInstance(jobId);
   }
 
   @override

+ 11 - 3
packages/cpt_job_sg/lib/router/page_router.dart

@@ -1,16 +1,24 @@
 
-import 'package:cpt_job_sg/modules/job_list_sg/job_list_sg_page.dart';
 import 'package:get/get.dart';
 import 'package:router/path/router_path.dart';
 
+import '../modules/applied_staff/applied_staff_page.dart';
+import '../modules/job_applied/job_applied_page.dart';
+
 
 class JobPageSGRouter {
   static final routes = [
 
     // 工作列表 (新加坡)
+    // 新加坡工作列表已申请列表
+    GetPage(
+      name: RouterPath.JOB_LIST_APPLIED_SG,
+      page: () => JobAppliedPage(),
+    ),
+
     GetPage(
-      name: RouterPath.JOB_LIST_SG,
-      page: () => JobListSgPage(),
+      name: RouterPath.JOB_LIST_APPLIED_STAFF_LIST_SG,
+      page: () => AppliedStaffPage(),
     ),
 
   ];

+ 2 - 4
packages/cpt_labour_sg/lib/modules/job_list/job_list_controller.dart

@@ -1,6 +1,4 @@
 import 'package:cpt_labour_sg/modules/labour_request_add/labour_request_add_page.dart';
-import 'package:domain/entity/response/job_list_entity.dart';
-import 'package:domain/entity/response/job_list_index_entity.dart';
 import 'package:domain/entity/response/job_list_index_s_g_entity.dart';
 import 'package:domain/entity/response/job_list_s_g_entity.dart';
 import 'package:domain/repository/labour_sg_repository.dart';
@@ -10,12 +8,12 @@ import 'package:plugin_platform/engine/notify/notify_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:plugin_platform/http/http_result.dart';
+import 'package:router/componentRouter/component_router_service.dart';
 import 'package:shared/utils/date_time_utils.dart';
 import 'package:widgets/dialog/app_default_dialog.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 
-import '../job_applied/job_applied_page.dart';
 import '../job_list_edit/job_list_edit_page.dart';
 import 'job_list_filter.dart';
 import 'job_list_state.dart';
@@ -201,7 +199,7 @@ class JobListController extends GetxController with DioCancelableMixin {
 
   /// 去已申请的成员列表
   void gotoJobAppliedPage(int index) {
-    JobAppliedPage.startInstance(state.datas[index].jobId);
+    ComponentRouterServices.jobSGService.startJobAppliedPage(state.datas[index].jobId);
   }
 
   //执行取消操作

+ 0 - 7
packages/cpt_labour_sg/lib/router/page_router.dart

@@ -6,7 +6,6 @@ import 'package:flutter/material.dart';
 import 'package:get/get.dart';
 import 'package:router/path/router_path.dart';
 
-import '../modules/job_applied/job_applied_page.dart';
 import '../modules/job_list/job_list_page.dart';
 import '../modules/job_list_edit/job_list_edit_page.dart';
 import '../modules/labour_request/labour_request_page.dart';
@@ -59,11 +58,5 @@ class LabourSGPageRouter {
       page: () => JobListEditPage(),
     ),
 
-    // 新加坡工作列表已申请列表
-    GetPage(
-      name: RouterPath.JOB_LIST_APPLIED_SG,
-      page: () => JobAppliedPage(),
-    ),
-
   ];
 }

+ 4 - 4
packages/cs_domain/lib/entity/response/job_applied_remark_view_s_g_entity.dart

@@ -6,13 +6,13 @@ export 'package:domain/generated/json/job_applied_remark_view_s_g_entity.g.dart'
 @JsonSerializable()
 class JobAppliedRemarkViewSGEntity {
 	@JSONField(name: "attitude_rate")
-	int attitudeRate = 0;
+	double attitudeRate = 0;
 	@JSONField(name: "grooming_rate")
-	int groomingRate = 0;
+	double groomingRate = 0;
 	@JSONField(name: "performance_rate")
-	int performanceRate = 0;
+	double performanceRate = 0;
 	@JSONField(name: "experience_rate")
-	int experienceRate = 0;
+	double experienceRate = 0;
 	String? feedback = null;
 	@JSONField(name: "applied_id")
 	String? appliedId = null;

+ 2 - 0
packages/cs_domain/lib/entity/response/job_applied_staff_s_g_entity.dart

@@ -37,6 +37,8 @@ class JobAppliedStaffSGRows {
 	@JSONField(name: "salary_structure")
 	int salaryStructure = 0;
 
+	bool isSelected = false;
+
 	JobAppliedStaffSGRows();
 
 	factory JobAppliedStaffSGRows.fromJson(Map<String, dynamic> json) => $JobAppliedStaffSGRowsFromJson(json);

+ 8 - 8
packages/cs_domain/lib/generated/json/job_applied_remark_view_s_g_entity.g.dart

@@ -3,19 +3,19 @@ import 'package:domain/entity/response/job_applied_remark_view_s_g_entity.dart';
 
 JobAppliedRemarkViewSGEntity $JobAppliedRemarkViewSGEntityFromJson(Map<String, dynamic> json) {
   final JobAppliedRemarkViewSGEntity jobAppliedRemarkViewSGEntity = JobAppliedRemarkViewSGEntity();
-  final int? attitudeRate = jsonConvert.convert<int>(json['attitude_rate']);
+  final double? attitudeRate = jsonConvert.convert<double>(json['attitude_rate']);
   if (attitudeRate != null) {
     jobAppliedRemarkViewSGEntity.attitudeRate = attitudeRate;
   }
-  final int? groomingRate = jsonConvert.convert<int>(json['grooming_rate']);
+  final double? groomingRate = jsonConvert.convert<double>(json['grooming_rate']);
   if (groomingRate != null) {
     jobAppliedRemarkViewSGEntity.groomingRate = groomingRate;
   }
-  final int? performanceRate = jsonConvert.convert<int>(json['performance_rate']);
+  final double? performanceRate = jsonConvert.convert<double>(json['performance_rate']);
   if (performanceRate != null) {
     jobAppliedRemarkViewSGEntity.performanceRate = performanceRate;
   }
-  final int? experienceRate = jsonConvert.convert<int>(json['experience_rate']);
+  final double? experienceRate = jsonConvert.convert<double>(json['experience_rate']);
   if (experienceRate != null) {
     jobAppliedRemarkViewSGEntity.experienceRate = experienceRate;
   }
@@ -53,10 +53,10 @@ Map<String, dynamic> $JobAppliedRemarkViewSGEntityToJson(JobAppliedRemarkViewSGE
 
 extension JobAppliedRemarkViewSGEntityExtension on JobAppliedRemarkViewSGEntity {
   JobAppliedRemarkViewSGEntity copyWith({
-    int? attitudeRate,
-    int? groomingRate,
-    int? performanceRate,
-    int? experienceRate,
+    double? attitudeRate,
+    double? groomingRate,
+    double? performanceRate,
+    double? experienceRate,
     String? feedback,
     String? appliedId,
     String? labourerName,

+ 8 - 1
packages/cs_domain/lib/generated/json/job_applied_staff_s_g_entity.g.dart

@@ -75,6 +75,10 @@ JobAppliedStaffSGRows $JobAppliedStaffSGRowsFromJson(Map<String, dynamic> json)
   if (salaryStructure != null) {
     jobAppliedStaffSGRows.salaryStructure = salaryStructure;
   }
+  final bool? isSelected = jsonConvert.convert<bool>(json['isSelected']);
+  if (isSelected != null) {
+    jobAppliedStaffSGRows.isSelected = isSelected;
+  }
   return jobAppliedStaffSGRows;
 }
 
@@ -90,6 +94,7 @@ Map<String, dynamic> $JobAppliedStaffSGRowsToJson(JobAppliedStaffSGRows entity)
   data['apply_state'] = entity.applyState;
   data['hotel_staff'] = entity.hotelStaff;
   data['salary_structure'] = entity.salaryStructure;
+  data['isSelected'] = entity.isSelected;
   return data;
 }
 
@@ -105,6 +110,7 @@ extension JobAppliedStaffSGRowsExtension on JobAppliedStaffSGRows {
     int? applyState,
     int? hotelStaff,
     int? salaryStructure,
+    bool? isSelected,
   }) {
     return JobAppliedStaffSGRows()
       ..id = id ?? this.id
@@ -116,6 +122,7 @@ extension JobAppliedStaffSGRowsExtension on JobAppliedStaffSGRows {
       ..status = status ?? this.status
       ..applyState = applyState ?? this.applyState
       ..hotelStaff = hotelStaff ?? this.hotelStaff
-      ..salaryStructure = salaryStructure ?? this.salaryStructure;
+      ..salaryStructure = salaryStructure ?? this.salaryStructure
+      ..isSelected = isSelected ?? this.isSelected;
   }
 }

+ 17 - 14
packages/cs_domain/lib/repository/job_sg_repository.dart

@@ -24,6 +24,7 @@ import '../constants/api_constants.dart';
 import '../entity/response/attendance_entity.dart';
 import '../entity/response/check_success_entity.dart';
 import '../entity/response/job_applied_edit_index_s_g_entity.dart';
+import '../entity/response/job_applied_remark_view_s_g_entity.dart';
 import '../entity/response/job_applied_staff_s_g_entity.dart';
 import '../entity/response/job_list_applied_work_flow_entity.dart';
 
@@ -100,10 +101,10 @@ class JobSGRepository extends GetxService {
 
   /// 根据ID获取主列表的Item数据,用于刷新Item
   Future<HttpResult<JobAppliedListSGEntity>> fetchItemByAppliedIds(
-      String? jobId,
-      String? appliedIds, {
-        CancelToken? cancelToken,
-      }) async {
+    String? jobId,
+    String? appliedIds, {
+    CancelToken? cancelToken,
+  }) async {
     //参数
     Map<String, String> params = {};
     params["cur_page"] = "1";
@@ -145,7 +146,7 @@ class JobSGRepository extends GetxService {
     //参数
     Map<String, String> params = {};
     params["cur_page"] = curPage.toString();
-    params["page_size"] = "10";
+    params["page_size"] = "20";
     params["job_id"] = jobId ?? "";
 
     if (!Utils.isEmpty(keyword)) {
@@ -181,7 +182,7 @@ class JobSGRepository extends GetxService {
     params['staff_ids'] = staffIds ?? "";
 
     final result = await httpProvider.requestNetResult(
-      ApiConstants.apiJobListConfirmSG,
+      ApiConstants.apiJobAppliedAddStaffSubmitSG,
       method: HttpMethod.POST,
       params: params,
       networkDebounce: true,
@@ -350,7 +351,7 @@ class JobSGRepository extends GetxService {
   }
 
   /// 获取员工的评价信息
-  Future<HttpResult<JobAppliedStaffSGEntity>> fetchJobAppliedRemarkView(
+  Future<HttpResult<JobAppliedRemarkViewSGEntity>> fetchJobAppliedRemarkView(
     String? appliedId, {
     CancelToken? cancelToken,
   }) async {
@@ -361,6 +362,7 @@ class JobSGRepository extends GetxService {
     final result = await httpProvider.requestNetResult(
       ApiConstants.apiJobAppliedRemarkViewSG,
       params: params,
+      isShowLoadingDialog: true,
       cancelToken: cancelToken,
     );
 
@@ -368,9 +370,9 @@ class JobSGRepository extends GetxService {
     if (result.isSuccess) {
       //重新赋值data或list
       final json = result.getDataJson();
-      var data = JobAppliedStaffSGEntity.fromJson(json!);
+      var data = JobAppliedRemarkViewSGEntity.fromJson(json!);
       //重新赋值data或list
-      return result.convert<JobAppliedStaffSGEntity>(data: data);
+      return result.convert<JobAppliedRemarkViewSGEntity>(data: data);
     }
     return result.convert();
   }
@@ -388,17 +390,18 @@ class JobSGRepository extends GetxService {
     //参数
     Map<String, String> params = {};
     params['applied_id'] = appliedId ?? "";
-    params['attitude_rate'] = attitude_rate ?? "";
-    params['grooming_rate'] = grooming_rate ?? "";
-    params['performance_rate'] = performance_rate ?? "";
-    params['experience_rate'] = experience_rate ?? "";
+
+    params['attitude_rate'] = (double.parse(attitude_rate ?? "5.0")).toInt().toString();
+    params['grooming_rate'] = (double.parse(grooming_rate ?? "5.0")).toInt().toString();
+    params['performance_rate'] = (double.parse(performance_rate ?? "5.0")).toInt().toString();
+    params['experience_rate'] = (double.parse(experience_rate ?? "5.0")).toInt().toString();
 
     if (!Utils.isEmpty(feedback)) {
       params['feedback'] = feedback ?? "";
     }
 
     final result = await httpProvider.requestNetResult(
-      ApiConstants.apiJobAppliedChangeStatusSG,
+      ApiConstants.apiJobAppliedRemarkSubmitSG,
       method: HttpMethod.POST,
       params: params,
       networkDebounce: true,

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

@@ -202,6 +202,10 @@ const Map<String, String> en_US = {
   'Create New Job': 'Create New Job',
   'Search': 'Search',
   'Send E-Attendance': 'Send E-Attendance',
+  'Nric': 'Nric',
+  'Name / Nric': 'Name / Nric',
+  'Add Staff - Choose Staff': 'Add Staff - Choose Staff',
+  'Are you sure you want to send the e-attendance to agency?': 'Are you sure you want to send the e-attendance to agency?',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

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

@@ -202,6 +202,10 @@ const Map<String, String> vi_VN = {
   'Create New Job': 'Tạo công việc mới',
   'Search': 'Tìm kiếm',
   'Send E-Attendance': 'Gửi chấm công điện tử',
+  'Nric': 'Chứng minh thư',
+  'Name / Nric': 'Tên / Thẻ căn cước',
+  'Add Staff - Choose Staff': 'Thêm nhân viên - Chọn nhân viên',
+  'Are you sure you want to send the e-attendance to agency?': 'Bạn có chắc chắn muốn gửi E-Attendance cho một đại lý?',
 
   //插件的国际化
   "Pull to refresh": "Kéo để làm mới",

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

@@ -202,6 +202,10 @@ const Map<String, String> zh_CN = {
   'Create New Job': '创建新工作',
   'Search': '搜索',
   'Send E-Attendance': '发送电子考勤',
+  'Nric': '身份证',
+  'Name / Nric': '姓名 / 身份证',
+  'Add Staff - Choose Staff': '添加员工 - 选择员工',
+  'Are you sure you want to send the e-attendance to agency?': '您确定要将电子考勤发送给代理商吗?',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',

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

@@ -8,4 +8,5 @@ abstract class JobService {
 
   void startJobListPage();
 
+  void startStaffDetailPage(String? memberId);
 }

+ 1 - 1
packages/cs_router/lib/componentRouter/job_sg_service.dart

@@ -4,7 +4,7 @@
  */
 abstract class JobSGService {
 
-  void startJobListPage();
+  void startJobAppliedPage(String? jobId);
 
   void startReviseListPage();
 

+ 17 - 10
packages/cs_widgets/lib/my_text_view.dart

@@ -156,9 +156,23 @@ class MyTextView extends StatelessWidget {
         (marginTop ?? 0) > 0 ||
         (marginBottom ?? 0) > 0 ||
         alignment != null) {
-      return _warpWithContainer();
+      return onClick != null
+          ? _warpWithContainer().onTap(
+              //使用扩展的方式点击
+              onClick!,
+              type: type,
+              milliseconds: milliseconds,
+            )
+          : _warpWithContainer();
     } else {
-      return _childText();
+      return onClick != null
+          ? _childText().onTap(
+              //使用扩展的方式点击
+              onClick!,
+              type: type,
+              milliseconds: milliseconds,
+            )
+          : _childText();
     }
   }
 
@@ -175,14 +189,7 @@ class MyTextView extends StatelessWidget {
         borderRadius: BorderRadius.all(Radius.circular(cornerRadius ?? 0)),
       ),
       padding: EdgeInsets.fromLTRB(paddingLeft ?? 0, paddingTop ?? 0, paddingRight ?? 0, paddingBottom ?? 0),
-      child: onClick != null
-          ? _childText().onTap(
-              //使用扩展的方式点击
-              onClick!,
-              type: type,
-              milliseconds: milliseconds,
-            )
-          : _childText(),
+      child: _childText(),
     );
   }