task_auto_plan1/include/app.hpp

237 lines
6.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef ATTENDANCE_SYSTEM_APP_HPP
#define ATTENDANCE_SYSTEM_APP_HPP
#include <string>
#include <vector>
#include <map>
#include <cstdint>
#include <ctime>
// ============================================================
// 枚举定义
// ============================================================
/// 打卡方式
enum class CheckinMethod {
FACE, // 人脸识别
GPS, // GPS定位
CARD // 工牌刷卡
};
/// 打卡状态
enum class CheckinStatus {
SUCCESS,
FAILED
};
/// 考勤状态
enum class AttendanceStatus {
NORMAL,
LATE,
EARLY,
ABSENT,
OVERTIME
};
/// 预警类型
enum class AlertType {
UNCHECKED, // 未打卡
EARLY, // 早退
LATE, // 迟到
MISSING // 连续缺勤
};
/// 报表维度
enum class ReportDimension {
MONTH,
DEPT,
PROJECT
};
/// 导出格式
enum class ExportFormat {
EXCEL,
PDF
};
/// 系统角色
enum class SystemRole {
SUPER_ADMIN,
HR_MANAGER,
DEPT_MANAGER
};
/// 数据同步类型
enum class SyncDataType {
EMPLOYEE,
SCHEDULE,
ATTENDANCE
};
/// 同步状态
enum class SyncStatus {
SUCCESS,
FAILED,
PENDING
};
// ============================================================
// 数据结构定义
// ============================================================
/// 经纬度坐标
struct GeoLocation {
double lat = 0.0;
double lng = 0.0;
};
/// 打卡记录 (Check-in Record)
struct CheckinRecord {
std::string recordId; // 打卡记录编号
std::string employeeId; // 员工编号
CheckinMethod method; // 打卡方式
int64_t timestamp; // 13位Unix时间戳(毫秒)
GeoLocation location; // 地理位置
std::vector<uint8_t> faceFeature; // 人脸特征码(加密后)
CheckinStatus status; // 打卡状态
CheckinRecord()
: method(CheckinMethod::FACE), timestamp(0), status(CheckinStatus::SUCCESS) {}
};
/// 班次定义
struct ShiftRule {
std::string shiftName; // 班次名称
int startHour = 9; // 开始小时
int startMinute = 0; // 开始分钟
int endHour = 18; // 结束小时
int endMinute = 0; // 结束分钟
int breakDuration = 60; // 休息时长(分钟)
int overtimeThreshold = 30; // 加班判定阈值(分钟)
};
/// 排班规则 (Schedule Rule)
struct ScheduleRule {
std::string deptId; // 部门编号
std::vector<ShiftRule> rules; // 班次列表
std::string version; // 规则版本号
};
/// 考勤结果 (Attendance Result)
struct AttendanceResult {
std::string employeeId; // 员工编号
std::string date; // 日期 YYYY-MM-DD
int64_t actualInTime = 0; // 实际签到时间戳
int64_t actualOutTime = 0; // 实际签退时间戳
int scheduledInHour = 9; // 应签到小时
int scheduledInMin = 0; // 应签到分钟
int scheduledOutHour = 18; // 应签退小时
int scheduledOutMin = 0; // 应签退分钟
int lateMinutes = 0; // 迟到分钟数
int earlyLeaveMinutes = 0; // 早退分钟数
bool absent = false; // 是否缺勤
float overtimeHours = 0.0f; // 加班小时数
AttendanceStatus status; // 考勤状态
AttendanceResult() : status(AttendanceStatus::NORMAL) {}
};
/// 异常预警 (Alert Notification)
struct AlertNotification {
AlertType alertType; // 预警类型
std::string employeeId; // 员工编号
int64_t time; // 预警时间戳
std::string reason; // 原因描述
std::vector<std::string> notifiedChannels; // 已通知渠道
AlertNotification() : alertType(AlertType::UNCHECKED), time(0) {}
};
/// 报表请求参数
struct ReportRequest {
ReportDimension dimension; // 报表维度
std::string startDate; // 开始日期 YYYY-MM-DD
std::string endDate; // 结束日期 YYYY-MM-DD
ExportFormat format; // 导出格式
std::string deptId; // 部门ID(仅DEPT维度)
ReportRequest()
: dimension(ReportDimension::MONTH), format(ExportFormat::EXCEL) {}
};
/// 报表响应
struct ReportResponse {
std::string reportUrl; // 报表下载链接
int64_t fileSize = 0; // 文件大小(字节)
bool success = false;
std::string message;
};
/// 系统用户
struct SystemUser {
std::string userId;
std::string username;
SystemRole role;
std::vector<std::string> permissions; // 权限集合
std::string departmentId;
};
/// 外部同步请求
struct SyncRequest {
std::string authToken;
SyncDataType dataType;
};
/// 外部同步响应
struct SyncResponse {
SyncStatus syncStatus;
std::string errorMsg;
SyncResponse() : syncStatus(SyncStatus::SUCCESS) {}
};
// ============================================================
// 核心功能函数声明
// ============================================================
/// 将 CheckinMethod 枚举转换为字符串
std::string checkinMethodToString(CheckinMethod method);
/// 将 AttendanceStatus 枚举转换为字符串
std::string attendanceStatusToString(AttendanceStatus status);
/// 将 AlertType 枚举转换为字符串
std::string alertTypeToString(AlertType type);
/// 生成唯一记录ID (基于时间戳+随机数)
std::string generateRecordId();
/// 验证JWT令牌简化模拟
bool validateToken(const std::string& token);
/// 验证打卡权限
bool checkCheckinPermission(const std::string& employeeId, CheckinMethod method);
/// 记录打卡(核心业务函数)
CheckinRecord processCheckin(const std::string& employeeId, CheckinMethod method,
int64_t timestamp, const GeoLocation& location,
const std::vector<uint8_t>& faceFeature);
/// 判定考勤结果
AttendanceResult calculateAttendance(const CheckinRecord& record,
const ShiftRule& shiftRule);
/// 检测异常并生成预警
AlertNotification detectAnomaly(const AttendanceResult& result);
/// 生成报表(模拟)
ReportResponse generateReport(const ReportRequest& request);
/// 加密人脸特征(哈希+盐值模拟)
std::vector<uint8_t> encryptFaceFeature(const std::vector<uint8_t>& feature);
/// 运行演示场景(主菜单)
void runDemo();
#endif // ATTENDANCE_SYSTEM_APP_HPP