liukai пре 1 недеља
родитељ
комит
fd05c2d468

+ 74 - 89
packages/cpt_uk/lib/modules/attendance/e_attendance_list/e_attendance_list_controller.dart

@@ -1,28 +1,26 @@
 import 'dart:typed_data';
 
-import 'package:domain/entity/response/attendance_entity.dart';
-import 'package:domain/entity/response/check_success_entity.dart';
-import 'package:domain/repository/job_repository.dart';
+import 'package:domain/entity/response/u_k_attendance_entity.dart';
+import 'package:domain/entity/response/u_k_security_attendance_option_entity.dart';
+import 'package:domain/repository/uk_attendance_repository.dart';
 import 'package:get/get.dart';
-import 'package:plugin_basic/service/user_service.dart';
 import 'package:plugin_platform/engine/dialog/dialog_engine.dart';
-import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:plugin_platform/http/http_result.dart';
 import 'package:shared/utils/date_time_utils.dart';
 import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/load_state_layout.dart';
-import 'package:widgets/picker/date_picker_util.dart';
 import 'package:widgets/widget_export.dart';
 
 import '../../job/job_applied_staff_detail/applied_staff_detail_page.dart';
 import 'e_attendance_list_state.dart';
-import 'widget/attendance_sign_in_out.dart';
 import 'widget/job_list_filter.dart';
 
 class EAttendanceListController extends GetxController with DioCancelableMixin {
-  final JobRepository _jobRepository = Get.find();
+  final UKAttendanceRepository _attendanceRepository = Get.find();
   final EAttendanceListState state = EAttendanceListState();
 
+  var _curPage = 1;
   var _needShowPlaceholder = true;
 
   //页面PlaceHolder的展示
@@ -38,16 +36,24 @@ class EAttendanceListController extends GetxController with DioCancelableMixin {
   // Refresh 控制器
   final EasyRefreshController refreshController = EasyRefreshController(
     controlFinishRefresh: true,
-    controlFinishLoad: false,
+    controlFinishLoad: true,
   );
 
   // Refresh 刷新事件
   Future onRefresh() async {
+    _curPage = 1;
+    fetchAttendanceList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
     fetchAttendanceList();
   }
 
   // 重试请求
   Future retryRequest() async {
+    _curPage = 1;
     _needShowPlaceholder = true;
     fetchAttendanceList();
   }
@@ -58,77 +64,76 @@ class EAttendanceListController extends GetxController with DioCancelableMixin {
       changeLoadingState(LoadState.State_Loading);
     }
 
-    //获取到数据
-    var result = await _jobRepository.fetchAttendanceList(
-      state.keyword,
-      DateTimeUtils.formatDate(state.selectedStartDate, format: "yyyy-MM-dd"),
-      DateTimeUtils.formatDate(state.selectedEndDate, format: "yyyy-MM-dd"),
-      cancelToken: cancelToken,
-    );
+    // 并发执行两个请求
+    var futures = [
+      _attendanceRepository.fetchAttendanceList(
+        startDate: DateTimeUtils.formatDate(state.selectedStartDate, format: "yyyy-MM-dd"),
+        endDate: DateTimeUtils.formatDate(state.selectedEndDate, format: "yyyy-MM-dd"),
+        keyword: state.selectedStaffName,
+        departmentId: state.selectedDepartmentId,
+        curPage: _curPage,
+        cancelToken: cancelToken,
+      ),
+      state.indexOptions == null
+          ? _attendanceRepository.fetchAttendanceOptions(
+        cancelToken: cancelToken,
+      )
+          : Future(() => HttpResult(isSuccess: true).convert(data: state.indexOptions!)),
+    ];
+
+    //拿到结果
+    var results = await Future.wait(futures);
+    var listResult = results[0] as HttpResult<UKAttendanceEntity>;
+    var optionResult = results[1] as HttpResult<UKSecurityAttendanceOptionEntity>;
+
+    //选项数据
+    if (state.indexOptions == null && optionResult.isSuccess) {
+      state.indexOptions = optionResult.data!;
+    }
 
-    //处理数据
-    if (result.isSuccess) {
-      handleList(result.data?.rows);
-      refreshController.finishRefresh(IndicatorResult.success);
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.rows);
     } else {
-      errorMessage = result.errorMsg;
+      errorMessage = listResult.errorMsg;
       changeLoadingState(LoadState.State_Error);
-      refreshController.finishRefresh(IndicatorResult.fail);
     }
 
-    //最后赋值
+    // 最后赋值
     _needShowPlaceholder = false;
   }
 
   // 处理数据与展示的逻辑
-  void handleList(List<AttendanceList>? list) {
+  void handleList(List<UKAttendanceRows>? list) {
     if (list != null && list.isNotEmpty) {
       //有数据,判断是刷新还是加载更多的数据
-      state.datas.clear();
-      state.datas.addAll(list);
-      //更新状态
-      changeLoadingState(LoadState.State_Success);
-    } else {
-      //展示无数据的布局
-      state. datas.clear();
-      changeLoadingState(LoadState.State_Empty);
-    }
-  }
-
-  /// 签到签出
-  void requestCheckInCheckOut(bool isCheckIn, AttendanceList item, ByteData byteData) async {
-    //请求接口
-
-    var result = await _jobRepository.submitCheckInOut(
-      item.appliedId.toString(),
-      byteData,
-      isCheckIn: isCheckIn,
-      cancelToken: cancelToken,
-    );
-
-    if (result.isSuccess) {
-      CheckSuccessEntity entity = result.data!;
-      if (isCheckIn) {
-        item.checkInImg = entity.checkImg;
-        item.checkInTime = entity.checkTime;
+      if (_curPage == 1) {
+        //刷新的方式
+        state.datas.clear();
+        state.datas.addAll(list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success);
       } else {
-        item.checkOutImg = entity.checkImg;
-        item.checkOutTime = entity.checkTime;
+        //加载更多
+        state.datas.addAll(list);
+        refreshController.finishLoad();
+        update();
       }
-      //更新状态
-      update();
     } else {
-      errorMessage = result.errorMsg;
-      ToastEngine.show(errorMessage ?? "Network Load Error".tr);
+      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();
-  }
-
   @override
   void onReady() async {
     super.onReady();
@@ -141,37 +146,17 @@ class EAttendanceListController extends GetxController with DioCancelableMixin {
     state.datas.clear();
   }
 
-  /// 用户签到
-  void userSignIn(AttendanceList item) {
-    DialogEngine.show(
-      widget: AttendanceSignInOut(
-        confirmAction: (byteData) {
-          requestCheckInCheckOut(true, item, byteData);
-        },
-      ),
-    );
-  }
-
-  /// 用户签出
-  void userSignOut(AttendanceList item) {
-    DialogEngine.show(
-      widget: AttendanceSignInOut(
-        confirmAction: (byteData) {
-          requestCheckInCheckOut(false, item, byteData);
-        },
-      ),
-    );
-  }
-
-
   /// 展示标题栏的 Filter 弹窗
   void showFilterDialog() {
+    if (state.indexOptions == null) return;
+
     DialogEngine.show(
       widget: JobListFilter(
         selectedStartDate: state.selectedStartDate,
         selectedEndDate: state.selectedEndDate,
         staffName: state.selectedStaffName,
         selectedDepartmentId: state.selectedDepartmentId,
+        departmentList: state.indexOptions?.departmentList,
         onFilterAction: (startDate, endDate, staffName, departmentId) {
           Log.d("startDate:$startDate endDate:$endDate staffName:$staffName departmentId:$departmentId");
 
@@ -189,9 +174,9 @@ class EAttendanceListController extends GetxController with DioCancelableMixin {
     );
   }
 
-  //查看UK员工的详情
-  void gotoStaffDetailPage(AttendanceList data) {
-    UKAppliedStaffDetailPage.startInstance(data.staffId.toString());
+  //查看员工的详情
+  void gotoStaffDetailPage(UKAttendanceRows data) {
+    UKAppliedStaffDetailPage.startInstance(data.memberId);
   }
 
 }

+ 8 - 3
packages/cpt_uk/lib/modules/attendance/e_attendance_list/e_attendance_list_state.dart

@@ -1,4 +1,6 @@
 import 'package:domain/entity/response/attendance_entity.dart';
+import 'package:domain/entity/response/u_k_attendance_entity.dart';
+import 'package:domain/entity/response/u_k_security_attendance_option_entity.dart';
 import 'package:flutter/material.dart';
 
 
@@ -6,11 +8,14 @@ class EAttendanceListState {
 
   final TextEditingController searchController = TextEditingController();
   //页面的列表数据
-  List<AttendanceList> datas = [];
+  List<UKAttendanceRows> datas = [];
   String keyword = "";
-  DateTime? selectedStartDate = DateTime.now();
-  DateTime? selectedEndDate = DateTime.now();
+  DateTime? selectedStartDate;
+  DateTime? selectedEndDate;
   String? selectedStaffName;
   String? selectedDepartmentId;
 
+
+  UKSecurityAttendanceOptionEntity? indexOptions;
+
 }

+ 12 - 22
packages/cpt_uk/lib/modules/attendance/e_attendance_list/item_e_attendance.dart

@@ -1,14 +1,10 @@
 import 'package:cs_resources/constants/color_constants.dart';
-import 'package:cs_resources/generated/assets.dart';
-import 'package:domain/entity/response/attendance_entity.dart';
+import 'package:domain/entity/response/u_k_attendance_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:shared/utils/util.dart';
 import 'package:widgets/ext/ex_widget.dart';
-import 'package:widgets/my_button.dart';
-import 'package:widgets/my_load_image.dart';
 import 'package:widgets/my_text_view.dart';
 
 /*
@@ -16,7 +12,7 @@ import 'package:widgets/my_text_view.dart';
  */
 class EAttendanceItem extends StatelessWidget {
   final int index;
-  final AttendanceList item;
+  final UKAttendanceRows item;
   final VoidCallback? onMemberAction;
 
   EAttendanceItem({
@@ -38,7 +34,6 @@ class EAttendanceItem extends StatelessWidget {
         mainAxisSize: MainAxisSize.max,
         crossAxisAlignment: CrossAxisAlignment.start,
         children: [
-
           //考勤对应的工作日期
           Row(
             mainAxisSize: MainAxisSize.max,
@@ -60,7 +55,6 @@ class EAttendanceItem extends StatelessWidget {
                 marginLeft: 5,
                 marginRight: 5,
               ).expanded(),
-
             ],
           ),
 
@@ -92,7 +86,6 @@ class EAttendanceItem extends StatelessWidget {
                 decorationStyle: TextDecorationStyle.solid,
                 onClick: onMemberAction,
               ).expanded(),
-
             ],
           ).marginOnly(top: 12),
 
@@ -110,14 +103,13 @@ class EAttendanceItem extends StatelessWidget {
 
               //电话文本
               MyTextView(
-                "等待接口返回电话号码",
+                item.phone ?? "-",
                 isFontMedium: true,
                 textColor: Colors.white,
                 fontSize: 14,
                 marginLeft: 5,
                 marginRight: 5,
               ).expanded(),
-
             ],
           ).marginOnly(top: 12),
 
@@ -135,14 +127,13 @@ class EAttendanceItem extends StatelessWidget {
 
               //电话文本
               MyTextView(
-                "等待接口返回部门",
+                item.departmentName ?? "-",
                 isFontMedium: true,
                 textColor: Colors.white,
                 fontSize: 14,
                 marginLeft: 5,
                 marginRight: 5,
               ).expanded(),
-
             ],
           ).marginOnly(top: 12),
 
@@ -183,7 +174,7 @@ class EAttendanceItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                "等待接口返回的时间",
+                item.securityIn?.time ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: /* item.securityIn?.changed == 1 ? ColorConstants.textRedFF6262 :*/ Colors.white,
@@ -206,10 +197,10 @@ class EAttendanceItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                "等待接口返回的时间",
+                item.workIn?.time ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
-                textColor: /*item.workIn?.changed == 1 ? ColorConstants.textRedFF6262 : */Colors.white,
+                textColor: /*item.workIn?.changed == 1 ? ColorConstants.textRedFF6262 : */ Colors.white,
                 fontSize: 14,
               ).expanded(),
             ],
@@ -252,7 +243,7 @@ class EAttendanceItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                "等待接口返回的时间",
+                item.workOut?.time ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: /*item.workOut?.changed == 1 ? ColorConstants.textRedFF6262 :*/ Colors.white,
@@ -275,10 +266,10 @@ class EAttendanceItem extends StatelessWidget {
 
               //时间
               MyTextView(
-                "等待接口返回的时间",
+                item.securityOut?.time ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
-                textColor: /*item.securityOut?.changed == 1 ? ColorConstants.textRedFF6262 : */Colors.white,
+                textColor: /*item.securityOut?.changed == 1 ? ColorConstants.textRedFF6262 : */ Colors.white,
                 fontSize: 14,
               ).expanded(),
             ],
@@ -298,7 +289,7 @@ class EAttendanceItem extends StatelessWidget {
 
               //发布状态
               MyTextView(
-                "等待接口返回的时间",
+                item.appliedAt ?? "-",
                 marginLeft: 5,
                 isFontRegular: true,
                 textColor: Colors.white,
@@ -330,12 +321,11 @@ class EAttendanceItem extends StatelessWidget {
                         ? ColorConstants.textRedFF6262
                         : "Revised" == item.statusShow || "Pending" == item.statusShow || "Approve" == item.statusShow
                             ? ColorConstants.textYellowFFBB1B
-                            : ColorConstants.textBlue06D9FF,  //默认蓝色
+                            : ColorConstants.textBlue06D9FF, //默认蓝色
                 fontSize: 14,
               ).expanded(),
             ],
           ).marginOnly(top: 12),
-
         ],
       ),
     );

+ 29 - 29
packages/cpt_uk/lib/modules/attendance/e_attendance_list/widget/job_list_filter.dart

@@ -1,5 +1,6 @@
 import 'dart:ui';
 import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/index_option_entity.dart';
 import 'package:domain/entity/response/job_list_index_entity.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
@@ -29,13 +30,14 @@ class JobListFilter extends StatefulWidget {
   DateTime? selectedEndDate;
   String? staffName;
   String? selectedDepartmentId;
+  List<IndexOptionEntity>? departmentList;  //部门筛选的数据
 
   JobListFilter({
-
     required this.selectedStartDate,
     required this.selectedEndDate,
     required this.staffName,
     required this.selectedDepartmentId,
+    required this.departmentList,
     this.onFilterAction,
   });
 
@@ -149,10 +151,9 @@ class _JobListFilterState extends State<JobListFilter> {
                   mainAxisAlignment: MainAxisAlignment.start,
                   children: [
                     MyTextView(
-                      "等待接口数据的部门",
-                      // selectedDepartmentId == null || selectedDepartmentId == "0"
-                      //     ? ""
-                      //     : widget.optionResult.departmentList!.firstWhere((element) => element.value.toString() == selectedDepartmentId).txt!,
+                      selectedDepartmentId == null || selectedDepartmentId == "0"
+                          ? ""
+                          : widget.departmentList!.firstWhere((element) => element.value.toString() == selectedDepartmentId).txt!,
                       hint: "Choose Outlet".tr,
                       textHintColor: ColorConstants.textBlackHint,
                       fontSize: 14,
@@ -163,7 +164,7 @@ class _JobListFilterState extends State<JobListFilter> {
                   ],
                 ),
               ).onTap(() {
-                // pickerOutlet();
+                pickerOutlet();
               }),
 
               //开始时间
@@ -328,29 +329,28 @@ class _JobListFilterState extends State<JobListFilter> {
     );
   }
 
-/// 筛选部门
-// 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 pickerOutlet() {
+    int selectedDepartmentIndex;
+    if (selectedDepartmentId == null) {
+      selectedDepartmentIndex = 0;
+    } else {
+      selectedDepartmentIndex = widget.departmentList!.indexWhere((department) => department.value.toString() == selectedDepartmentId);
+    }
 
+    if (selectedDepartmentIndex < 0) {
+      selectedDepartmentIndex = 0;
+    }
+
+    OptionPickerUtil.showCupertinoOptionPicker(
+      items: widget.departmentList!.map((e) => e.txt!).toList(growable: false),
+      initialSelectIndex: selectedDepartmentIndex,
+      onPickerChanged: (_, index) {
+        setState(() {
+          selectedDepartmentId = widget.departmentList![index].value!.toString();
+        });
+      },
+    );
+  }
 
 }

+ 2 - 2
packages/cpt_uk/lib/modules/attendance/security_registration/security_registration_state.dart

@@ -10,8 +10,8 @@ class EAttendanceListState {
   //页面的列表数据
   List<UKSecurityAttendanceRows> datas = [];
   String keyword = "";
-  DateTime? selectedStartDate = DateTime.now();
-  DateTime? selectedEndDate = DateTime.now();
+  DateTime? selectedStartDate;
+  DateTime? selectedEndDate;
   String? selectedStaffName;
   String? selectedDepartmentId;
 

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

@@ -289,6 +289,12 @@ class ApiConstants {
   //门卫的考勤编辑
   static const apiSecurityAttendanceEditUK = "/index.php/api/v1/hotel/applied/security-submit";
 
+  //电子考勤选项
+  static const apiEAttendanceOptionUK = "/index.php/api/v1/hotel/eattendance/index";
+
+  //电子考勤列表
+  static const apiEAttendanceListUK = "/index.php/api/v1/hotel/eattendance/table";
+
   // =========================== 报表与其他 ↓=========================================
 
   // 设备列表

+ 98 - 0
packages/cs_domain/lib/entity/response/u_k_attendance_entity.dart

@@ -0,0 +1,98 @@
+import 'package:domain/generated/json/base/json_field.dart';
+import 'package:domain/generated/json/u_k_attendance_entity.g.dart';
+import 'dart:convert';
+export 'package:domain/generated/json/u_k_attendance_entity.g.dart';
+
+@JsonSerializable()
+class UKAttendanceEntity {
+	int total = 0;
+	List<UKAttendanceRows> rows = [];
+
+	UKAttendanceEntity();
+
+	factory UKAttendanceEntity.fromJson(Map<String, dynamic> json) => $UKAttendanceEntityFromJson(json);
+
+	Map<String, dynamic> toJson() => $UKAttendanceEntityToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UKAttendanceRows {
+	String? id;
+	@JSONField(name: "member_id")
+	String? memberId;
+	@JSONField(name: "staff_name")
+	String? staffName;
+	String? phone;
+	@JSONField(name: "job_title")
+	String? jobTitle;
+	@JSONField(name: "department_name")
+	String? departmentName;
+	@JSONField(name: "job_date")
+	String? jobDate;
+	@JSONField(name: "start_time")
+	String? startTime;
+	@JSONField(name: "end_time")
+	String? endTime;
+	@JSONField(name: "applied_at")
+	String? appliedAt;
+	@JSONField(name: "adjust_show")
+	String? adjustShow;
+	@JSONField(name: "total_hours")
+	String? totalHours;
+	int status = 0;
+	@JSONField(name: "status_show")
+	String? statusShow;
+	@JSONField(name: "security_in")
+	UKAttendanceInOut? securityIn;
+	@JSONField(name: "security_out")
+	UKAttendanceInOut? securityOut;
+	@JSONField(name: "work_in")
+	UKAttendanceInOut? workIn;
+	@JSONField(name: "work_out")
+	UKAttendanceInOut? workOut;
+	@JSONField(name: "s_in")
+	int? sIn;
+	@JSONField(name: "s_out")
+	int? sOut;
+	@JSONField(name: "w_in")
+	int? wIn;
+	@JSONField(name: "w_out")
+	int? wOut;
+	@JSONField(name: "revise_hours")
+	String? reviseHours;
+	String? gratuity;
+
+	UKAttendanceRows();
+
+	factory UKAttendanceRows.fromJson(Map<String, dynamic> json) => $UKAttendanceRowsFromJson(json);
+
+	Map<String, dynamic> toJson() => $UKAttendanceRowsToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}
+
+@JsonSerializable()
+class UKAttendanceInOut {
+	String? time;
+	String? image;
+	int? changed;
+
+	UKAttendanceInOut();
+
+	factory UKAttendanceInOut.fromJson(Map<String, dynamic> json) => $UKAttendanceInOutFromJson(json);
+
+	Map<String, dynamic> toJson() => $UKAttendanceInOutToJson(this);
+
+	@override
+	String toString() {
+		return jsonEncode(this);
+	}
+}

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

@@ -78,6 +78,7 @@ import 'package:domain/entity/response/staff_remark_history_entity.dart';
 import 'package:domain/entity/response/staff_report_v_n_entity.dart';
 import 'package:domain/entity/response/staff_request_report_entity.dart';
 import 'package:domain/entity/response/staff_review_history_s_g_entity.dart';
+import 'package:domain/entity/response/u_k_attendance_entity.dart';
 import 'package:domain/entity/response/u_k_security_attendance_entity.dart';
 import 'package:domain/entity/response/u_k_security_attendance_option_entity.dart';
 import 'package:domain/entity/server_time.dart';
@@ -675,6 +676,15 @@ class JsonConvert {
     if (<StaffReviewHistorySGReviews>[] is M) {
       return data.map<StaffReviewHistorySGReviews>((Map<String, dynamic> e) => StaffReviewHistorySGReviews.fromJson(e)).toList() as M;
     }
+    if (<UKAttendanceEntity>[] is M) {
+      return data.map<UKAttendanceEntity>((Map<String, dynamic> e) => UKAttendanceEntity.fromJson(e)).toList() as M;
+    }
+    if (<UKAttendanceRows>[] is M) {
+      return data.map<UKAttendanceRows>((Map<String, dynamic> e) => UKAttendanceRows.fromJson(e)).toList() as M;
+    }
+    if (<UKAttendanceInOut>[] is M) {
+      return data.map<UKAttendanceInOut>((Map<String, dynamic> e) => UKAttendanceInOut.fromJson(e)).toList() as M;
+    }
     if (<UKSecurityAttendanceEntity>[] is M) {
       return data.map<UKSecurityAttendanceEntity>((Map<String, dynamic> e) => UKSecurityAttendanceEntity.fromJson(e)).toList() as M;
     }
@@ -867,6 +877,9 @@ class JsonConvertClassCollection {
     (StaffRequestReportEntity).toString(): StaffRequestReportEntity.fromJson,
     (StaffReviewHistorySGEntity).toString(): StaffReviewHistorySGEntity.fromJson,
     (StaffReviewHistorySGReviews).toString(): StaffReviewHistorySGReviews.fromJson,
+    (UKAttendanceEntity).toString(): UKAttendanceEntity.fromJson,
+    (UKAttendanceRows).toString(): UKAttendanceRows.fromJson,
+    (UKAttendanceInOut).toString(): UKAttendanceInOut.fromJson,
     (UKSecurityAttendanceEntity).toString(): UKSecurityAttendanceEntity.fromJson,
     (UKSecurityAttendanceRows).toString(): UKSecurityAttendanceRows.fromJson,
     (UKSecurityInOut).toString(): UKSecurityInOut.fromJson,

+ 257 - 0
packages/cs_domain/lib/generated/json/u_k_attendance_entity.g.dart

@@ -0,0 +1,257 @@
+import 'package:domain/generated/json/base/json_convert_content.dart';
+import 'package:domain/entity/response/u_k_attendance_entity.dart';
+
+UKAttendanceEntity $UKAttendanceEntityFromJson(Map<String, dynamic> json) {
+  final UKAttendanceEntity uKAttendanceEntity = UKAttendanceEntity();
+  final int? total = jsonConvert.convert<int>(json['total']);
+  if (total != null) {
+    uKAttendanceEntity.total = total;
+  }
+  final List<UKAttendanceRows>? rows = (json['rows'] as List<dynamic>?)?.map(
+          (e) => jsonConvert.convert<UKAttendanceRows>(e) as UKAttendanceRows).toList();
+  if (rows != null) {
+    uKAttendanceEntity.rows = rows;
+  }
+  return uKAttendanceEntity;
+}
+
+Map<String, dynamic> $UKAttendanceEntityToJson(UKAttendanceEntity entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['total'] = entity.total;
+  data['rows'] = entity.rows.map((v) => v.toJson()).toList();
+  return data;
+}
+
+extension UKAttendanceEntityExtension on UKAttendanceEntity {
+  UKAttendanceEntity copyWith({
+    int? total,
+    List<UKAttendanceRows>? rows,
+  }) {
+    return UKAttendanceEntity()
+      ..total = total ?? this.total
+      ..rows = rows ?? this.rows;
+  }
+}
+
+UKAttendanceRows $UKAttendanceRowsFromJson(Map<String, dynamic> json) {
+  final UKAttendanceRows uKAttendanceRows = UKAttendanceRows();
+  final String? id = jsonConvert.convert<String>(json['id']);
+  if (id != null) {
+    uKAttendanceRows.id = id;
+  }
+  final String? memberId = jsonConvert.convert<String>(json['member_id']);
+  if (memberId != null) {
+    uKAttendanceRows.memberId = memberId;
+  }
+  final String? staffName = jsonConvert.convert<String>(json['staff_name']);
+  if (staffName != null) {
+    uKAttendanceRows.staffName = staffName;
+  }
+  final String? phone = jsonConvert.convert<String>(json['phone']);
+  if (phone != null) {
+    uKAttendanceRows.phone = phone;
+  }
+  final String? jobTitle = jsonConvert.convert<String>(json['job_title']);
+  if (jobTitle != null) {
+    uKAttendanceRows.jobTitle = jobTitle;
+  }
+  final String? departmentName = jsonConvert.convert<String>(json['department_name']);
+  if (departmentName != null) {
+    uKAttendanceRows.departmentName = departmentName;
+  }
+  final String? jobDate = jsonConvert.convert<String>(json['job_date']);
+  if (jobDate != null) {
+    uKAttendanceRows.jobDate = jobDate;
+  }
+  final String? startTime = jsonConvert.convert<String>(json['start_time']);
+  if (startTime != null) {
+    uKAttendanceRows.startTime = startTime;
+  }
+  final String? endTime = jsonConvert.convert<String>(json['end_time']);
+  if (endTime != null) {
+    uKAttendanceRows.endTime = endTime;
+  }
+  final String? appliedAt = jsonConvert.convert<String>(json['applied_at']);
+  if (appliedAt != null) {
+    uKAttendanceRows.appliedAt = appliedAt;
+  }
+  final String? adjustShow = jsonConvert.convert<String>(json['adjust_show']);
+  if (adjustShow != null) {
+    uKAttendanceRows.adjustShow = adjustShow;
+  }
+  final String? totalHours = jsonConvert.convert<String>(json['total_hours']);
+  if (totalHours != null) {
+    uKAttendanceRows.totalHours = totalHours;
+  }
+  final int? status = jsonConvert.convert<int>(json['status']);
+  if (status != null) {
+    uKAttendanceRows.status = status;
+  }
+  final String? statusShow = jsonConvert.convert<String>(json['status_show']);
+  if (statusShow != null) {
+    uKAttendanceRows.statusShow = statusShow;
+  }
+  final UKAttendanceInOut? securityIn = jsonConvert.convert<UKAttendanceInOut>(json['security_in']);
+  if (securityIn != null) {
+    uKAttendanceRows.securityIn = securityIn;
+  }
+  final UKAttendanceInOut? securityOut = jsonConvert.convert<UKAttendanceInOut>(json['security_out']);
+  if (securityOut != null) {
+    uKAttendanceRows.securityOut = securityOut;
+  }
+  final UKAttendanceInOut? workIn = jsonConvert.convert<UKAttendanceInOut>(json['work_in']);
+  if (workIn != null) {
+    uKAttendanceRows.workIn = workIn;
+  }
+  final UKAttendanceInOut? workOut = jsonConvert.convert<UKAttendanceInOut>(json['work_out']);
+  if (workOut != null) {
+    uKAttendanceRows.workOut = workOut;
+  }
+  final int? sIn = jsonConvert.convert<int>(json['s_in']);
+  if (sIn != null) {
+    uKAttendanceRows.sIn = sIn;
+  }
+  final int? sOut = jsonConvert.convert<int>(json['s_out']);
+  if (sOut != null) {
+    uKAttendanceRows.sOut = sOut;
+  }
+  final int? wIn = jsonConvert.convert<int>(json['w_in']);
+  if (wIn != null) {
+    uKAttendanceRows.wIn = wIn;
+  }
+  final int? wOut = jsonConvert.convert<int>(json['w_out']);
+  if (wOut != null) {
+    uKAttendanceRows.wOut = wOut;
+  }
+  final String? reviseHours = jsonConvert.convert<String>(json['revise_hours']);
+  if (reviseHours != null) {
+    uKAttendanceRows.reviseHours = reviseHours;
+  }
+  final String? gratuity = jsonConvert.convert<String>(json['gratuity']);
+  if (gratuity != null) {
+    uKAttendanceRows.gratuity = gratuity;
+  }
+  return uKAttendanceRows;
+}
+
+Map<String, dynamic> $UKAttendanceRowsToJson(UKAttendanceRows entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['id'] = entity.id;
+  data['member_id'] = entity.memberId;
+  data['staff_name'] = entity.staffName;
+  data['phone'] = entity.phone;
+  data['job_title'] = entity.jobTitle;
+  data['department_name'] = entity.departmentName;
+  data['job_date'] = entity.jobDate;
+  data['start_time'] = entity.startTime;
+  data['end_time'] = entity.endTime;
+  data['applied_at'] = entity.appliedAt;
+  data['adjust_show'] = entity.adjustShow;
+  data['total_hours'] = entity.totalHours;
+  data['status'] = entity.status;
+  data['status_show'] = entity.statusShow;
+  data['security_in'] = entity.securityIn?.toJson();
+  data['security_out'] = entity.securityOut?.toJson();
+  data['work_in'] = entity.workIn?.toJson();
+  data['work_out'] = entity.workOut?.toJson();
+  data['s_in'] = entity.sIn;
+  data['s_out'] = entity.sOut;
+  data['w_in'] = entity.wIn;
+  data['w_out'] = entity.wOut;
+  data['revise_hours'] = entity.reviseHours;
+  data['gratuity'] = entity.gratuity;
+  return data;
+}
+
+extension UKAttendanceRowsExtension on UKAttendanceRows {
+  UKAttendanceRows copyWith({
+    String? id,
+    String? memberId,
+    String? staffName,
+    String? phone,
+    String? jobTitle,
+    String? departmentName,
+    String? jobDate,
+    String? startTime,
+    String? endTime,
+    String? appliedAt,
+    String? adjustShow,
+    String? totalHours,
+    int? status,
+    String? statusShow,
+    UKAttendanceInOut? securityIn,
+    UKAttendanceInOut? securityOut,
+    UKAttendanceInOut? workIn,
+    UKAttendanceInOut? workOut,
+    int? sIn,
+    int? sOut,
+    int? wIn,
+    int? wOut,
+    String? reviseHours,
+    String? gratuity,
+  }) {
+    return UKAttendanceRows()
+      ..id = id ?? this.id
+      ..memberId = memberId ?? this.memberId
+      ..staffName = staffName ?? this.staffName
+      ..phone = phone ?? this.phone
+      ..jobTitle = jobTitle ?? this.jobTitle
+      ..departmentName = departmentName ?? this.departmentName
+      ..jobDate = jobDate ?? this.jobDate
+      ..startTime = startTime ?? this.startTime
+      ..endTime = endTime ?? this.endTime
+      ..appliedAt = appliedAt ?? this.appliedAt
+      ..adjustShow = adjustShow ?? this.adjustShow
+      ..totalHours = totalHours ?? this.totalHours
+      ..status = status ?? this.status
+      ..statusShow = statusShow ?? this.statusShow
+      ..securityIn = securityIn ?? this.securityIn
+      ..securityOut = securityOut ?? this.securityOut
+      ..workIn = workIn ?? this.workIn
+      ..workOut = workOut ?? this.workOut
+      ..sIn = sIn ?? this.sIn
+      ..sOut = sOut ?? this.sOut
+      ..wIn = wIn ?? this.wIn
+      ..wOut = wOut ?? this.wOut
+      ..reviseHours = reviseHours ?? this.reviseHours
+      ..gratuity = gratuity ?? this.gratuity;
+  }
+}
+
+UKAttendanceInOut $UKAttendanceInOutFromJson(Map<String, dynamic> json) {
+  final UKAttendanceInOut uKAttendanceInOut = UKAttendanceInOut();
+  final String? time = jsonConvert.convert<String>(json['time']);
+  if (time != null) {
+    uKAttendanceInOut.time = time;
+  }
+  final String? image = jsonConvert.convert<String>(json['image']);
+  if (image != null) {
+    uKAttendanceInOut.image = image;
+  }
+  final int? changed = jsonConvert.convert<int>(json['changed']);
+  if (changed != null) {
+    uKAttendanceInOut.changed = changed;
+  }
+  return uKAttendanceInOut;
+}
+
+Map<String, dynamic> $UKAttendanceInOutToJson(UKAttendanceInOut entity) {
+  final Map<String, dynamic> data = <String, dynamic>{};
+  data['time'] = entity.time;
+  data['image'] = entity.image;
+  data['changed'] = entity.changed;
+  return data;
+}
+
+extension UKAttendanceInOutExtension on UKAttendanceInOut {
+  UKAttendanceInOut copyWith({
+    String? time,
+    String? image,
+    int? changed,
+  }) {
+    return UKAttendanceInOut()
+      ..time = time ?? this.time
+      ..image = image ?? this.image
+      ..changed = changed ?? this.changed;
+  }
+}

+ 61 - 0
packages/cs_domain/lib/repository/uk_attendance_repository.dart

@@ -1,3 +1,4 @@
+import 'package:domain/entity/response/u_k_attendance_entity.dart';
 import 'package:domain/entity/response/u_k_security_attendance_entity.dart';
 import 'package:domain/entity/response/u_k_security_attendance_option_entity.dart';
 import 'package:get/get.dart';
@@ -105,4 +106,64 @@ class UKAttendanceRepository extends GetxService {
     }
     return result.convert();
   }
+
+  /// 获取工作地考勤筛选选项
+  Future<HttpResult<UKSecurityAttendanceOptionEntity>> fetchAttendanceOptions({
+    CancelToken? cancelToken,
+  }) async {
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiEAttendanceOptionUK,
+      cancelToken: cancelToken,
+    );
+
+    //根据返回的结果,封装原始数据为Bean/Entity对象
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = UKSecurityAttendanceOptionEntity.fromJson(json!);
+      return result.convert<UKSecurityAttendanceOptionEntity>(data: data);
+    }
+    return result.convert();
+  }
+
+  /// 获取工作地考勤列表
+  Future<HttpResult<UKAttendanceEntity>> fetchAttendanceList({
+    String? keyword,
+    String? startDate,
+    String? endDate,
+    String? departmentId,
+    int curPage = 1,
+    int pageSize = 10,
+    CancelToken? cancelToken,
+  }) async {
+    Map<String, String> params = {};
+    params["cur_page"] = curPage.toString();
+    params["page_size"] = pageSize.toString();
+
+    if (!Utils.isEmpty(keyword)) {
+      params["staff_name"] = keyword!;
+    }
+    if (!Utils.isEmpty(departmentId)) {
+      params["co_department_id"] = departmentId!;
+    }
+    if (!Utils.isEmpty(startDate)) {
+      params["start_date"] = startDate!;
+    }
+    if (!Utils.isEmpty(endDate)) {
+      params["end_date"] = endDate!;
+    }
+
+    final result = await httpProvider.requestNetResult(
+      ApiConstants.apiEAttendanceListUK,
+      params: params,
+      cancelToken: cancelToken,
+    );
+
+    if (result.isSuccess) {
+      final json = result.getDataJson();
+      var data = UKAttendanceEntity.fromJson(json!);
+      return result.convert<UKAttendanceEntity>(data: data);
+    }
+    return result.convert();
+  }
+
 }