ATTV1 实现考勤统一入口与企微同步

这个提交包含在:
2026-05-17 16:56:24 +08:00
父节点 d50b7db143
当前提交 916cc3b7f7
共修改 51 个文件,包含 3323 行新增和 1762 行删除
+97
查看文件
@@ -344,6 +344,19 @@ enum EmployeePresenceSource {
admin_override
}
enum AttendanceCorrectionKind {
missed_punch
out
overtime
}
enum AttendanceCorrectionStatus {
reviewing
approved
rejected
cancelled
}
enum EmployeeContractType {
labor
nda
@@ -534,6 +547,7 @@ model Department {
leave_requests LeaveRequest[]
purchase_requests PurchaseRequest[]
travel_requests TravelRequest[]
attendance_corrections AttendanceCorrection[]
workflow_instances WorkflowInstance[]
budget_pools BudgetPool[]
travel_orders TravelOrder[]
@@ -604,6 +618,9 @@ model Employee {
payment_batch_receipts_uploaded PaymentBatchReceiptAttachment[] @relation("PaymentBatchReceiptAttachmentUploader")
leave_requests LeaveRequest[]
leave_ledgers LeaveLedger[]
wecom_checkin_records WecomCheckinRecord[]
wecom_checkin_sync_runs WecomCheckinSyncRun[] @relation("WecomCheckinSyncRunTrigger")
attendance_corrections AttendanceCorrection[]
owned_cost_centers CostCenter[] @relation("CostCenterOwner")
purchase_requests_applicant PurchaseRequest[] @relation("PurchaseRequestApplicant")
travel_requests_applicant TravelRequest[] @relation("TravelRequestApplicant")
@@ -1926,6 +1943,83 @@ model AttendancePolicy {
@@map("attendance_policies")
}
model WecomCheckinSyncRun {
id String @id @default(uuid()) @db.Uuid
start_date DateTime @db.Date
end_date DateTime @db.Date
status String @default("running") @db.VarChar(24)
employee_count Int @default(0)
record_count Int @default(0)
error_code String? @db.VarChar(80)
error_message String?
triggered_by String? @db.Uuid
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
trigger Employee? @relation("WecomCheckinSyncRunTrigger", fields: [triggered_by], references: [id], onDelete: SetNull)
records WecomCheckinRecord[]
@@index([status, created_at], map: "idx_wecom_checkin_sync_runs_status_created")
@@index([start_date, end_date], map: "idx_wecom_checkin_sync_runs_range")
@@index([triggered_by], map: "idx_wecom_checkin_sync_runs_triggered_by")
@@map("wecom_checkin_sync_runs")
}
model WecomCheckinRecord {
id String @id @default(uuid()) @db.Uuid
sync_run_id String @db.Uuid
employee_id String @db.Uuid
external_user_id String @db.VarChar(128)
checkin_time DateTime
checkin_date DateTime @db.Date
checkin_type String @db.VarChar(40)
exception_type String? @db.VarChar(80)
source_type String? @db.VarChar(40)
result String? @db.VarChar(80)
raw_hash String @db.VarChar(64)
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
sync_run WecomCheckinSyncRun @relation(fields: [sync_run_id], references: [id], onDelete: Cascade)
employee Employee @relation(fields: [employee_id], references: [id], onDelete: Cascade)
@@unique([external_user_id, checkin_time, checkin_type], map: "wecom_checkin_records_user_time_type_ux")
@@index([employee_id, checkin_date], map: "idx_wecom_checkin_records_employee_date")
@@index([sync_run_id], map: "idx_wecom_checkin_records_sync_run")
@@map("wecom_checkin_records")
}
model AttendanceCorrection {
id String @id @default(uuid()) @db.Uuid
owner_id String @db.Uuid
department_id String? @db.Uuid
kind AttendanceCorrectionKind
status AttendanceCorrectionStatus @default(reviewing)
work_date DateTime @db.Date
start_at DateTime?
end_at DateTime?
missed_punch_at DateTime?
reason String
location_summary String?
compensation_policy String?
created_at DateTime @default(now())
created_by String? @db.Uuid
updated_at DateTime @default(now()) @updatedAt
updated_by String? @db.Uuid
owner Employee @relation(fields: [owner_id], references: [id], onDelete: Cascade)
department Department? @relation(fields: [department_id], references: [id], onDelete: SetNull)
workflow_instances WorkflowInstance[]
@@index([owner_id, work_date], map: "idx_attendance_corrections_owner_date")
@@index([department_id, status], map: "idx_attendance_corrections_department_status")
@@index([status, updated_at], map: "idx_attendance_corrections_status_updated")
@@map("attendance_corrections")
}
model WeeklyReport {
id String @id @default(uuid()) @db.Uuid
employee_id String @db.Uuid
@@ -2868,6 +2962,7 @@ model WorkflowInstance {
leave_request_id String? @db.Uuid
purchase_request_id String? @db.Uuid
travel_request_id String? @db.Uuid
attendance_correction_id String? @db.Uuid
submitter_id String @db.Uuid
current_status WorkflowInstanceStatus @default(pending)
current_step_id String
@@ -2885,6 +2980,7 @@ model WorkflowInstance {
leave_request LeaveRequest? @relation(fields: [leave_request_id], references: [id], onDelete: Cascade)
purchase_request PurchaseRequest? @relation(fields: [purchase_request_id], references: [id], onDelete: Cascade)
travel_request TravelRequest? @relation(fields: [travel_request_id], references: [id], onDelete: Cascade)
attendance_correction AttendanceCorrection? @relation(fields: [attendance_correction_id], references: [id], onDelete: Cascade)
submitter Employee @relation("WorkflowInstanceSubmitter", fields: [submitter_id], references: [id], onDelete: Restrict)
department Department? @relation(fields: [context_department_id], references: [id], onDelete: SetNull)
@@ -2900,6 +2996,7 @@ model WorkflowInstance {
@@index([leave_request_id])
@@index([purchase_request_id])
@@index([travel_request_id])
@@index([attendance_correction_id])
@@index([current_status])
@@index([submitter_id])
@@index([context_department_id])