WHMS 实现企微HR主数据镜像同步

这个提交包含在:
2026-05-18 19:19:07 +08:00
父节点 3a6bfa0eaa
当前提交 27968fba49
共修改 24 个文件,包含 2123 行新增和 39 行删除
@@ -0,0 +1,86 @@
CREATE TABLE "wecom_hr_master_sync_runs" (
"id" UUID NOT NULL,
"mode" VARCHAR(16) NOT NULL,
"status" VARCHAR(24) NOT NULL DEFAULT 'running',
"token_source" JSONB,
"requested_userids" JSONB,
"limit" INTEGER,
"summary" JSONB,
"error_code" VARCHAR(80),
"error_message" TEXT,
"triggered_by" UUID,
"started_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"finished_at" TIMESTAMP(3),
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_hr_master_sync_runs_pkey" PRIMARY KEY ("id")
);
CREATE TABLE "wecom_hr_master_sync_items" (
"id" UUID NOT NULL,
"run_id" UUID NOT NULL,
"employee_id" UUID,
"external_user_id_masked" VARCHAR(80) NOT NULL,
"action" VARCHAR(32) NOT NULL,
"status" VARCHAR(24) NOT NULL,
"error_code" VARCHAR(80),
"error_message" TEXT,
"retry_count" INTEGER NOT NULL DEFAULT 0,
"field_changes" JSONB,
"source_summary" JSONB,
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "wecom_hr_master_sync_items_pkey" PRIMARY KEY ("id")
);
CREATE INDEX "idx_wecom_hr_master_sync_runs_status_created"
ON "wecom_hr_master_sync_runs"("status", "created_at");
CREATE INDEX "idx_wecom_hr_master_sync_runs_mode_created"
ON "wecom_hr_master_sync_runs"("mode", "created_at");
CREATE INDEX "idx_wecom_hr_master_sync_runs_triggered_by"
ON "wecom_hr_master_sync_runs"("triggered_by");
CREATE INDEX "idx_wecom_hr_master_sync_items_run_status"
ON "wecom_hr_master_sync_items"("run_id", "status");
CREATE INDEX "idx_wecom_hr_master_sync_items_employee_created"
ON "wecom_hr_master_sync_items"("employee_id", "created_at");
CREATE INDEX "idx_wecom_hr_master_sync_items_action_status"
ON "wecom_hr_master_sync_items"("action", "status");
ALTER TABLE "wecom_hr_master_sync_runs"
ADD CONSTRAINT "wecom_hr_master_sync_runs_triggered_by_fkey"
FOREIGN KEY ("triggered_by") REFERENCES "employees"("id") ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE "wecom_hr_master_sync_items"
ADD CONSTRAINT "wecom_hr_master_sync_items_run_id_fkey"
FOREIGN KEY ("run_id") REFERENCES "wecom_hr_master_sync_runs"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "wecom_hr_master_sync_items"
ADD CONSTRAINT "wecom_hr_master_sync_items_employee_id_fkey"
FOREIGN KEY ("employee_id") REFERENCES "employees"("id") ON DELETE SET NULL ON UPDATE CASCADE;
INSERT INTO "feature_flags" (
"id",
"flag_key",
"override_mode",
"rollout_type",
"department_ids",
"note",
"version",
"created_at",
"updated_at"
) VALUES (
'0e0a66a4-9e1d-4e23-9724-99e4a322b371'::uuid,
'wecom_hr_master_sync_v1',
'force_off',
'global',
'[]'::jsonb,
'bootstrap default: force_off',
1,
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP
) ON CONFLICT ("flag_key") DO NOTHING;
+53
查看文件
@@ -622,6 +622,8 @@ model Employee {
wecom_checkin_sync_runs WecomCheckinSyncRun[] @relation("WecomCheckinSyncRunTrigger")
wecom_directory_sync_runs WecomDirectorySyncRun[] @relation("WecomDirectorySyncRunEmployee")
triggered_wecom_directory_sync_runs WecomDirectorySyncRun[] @relation("WecomDirectorySyncRunTrigger")
wecom_hr_master_sync_items WecomHrMasterSyncItem[] @relation("WecomHrMasterSyncItemEmployee")
triggered_wecom_hr_master_sync_runs WecomHrMasterSyncRun[] @relation("WecomHrMasterSyncRunTrigger")
attendance_corrections AttendanceCorrection[]
owned_cost_centers CostCenter[] @relation("CostCenterOwner")
purchase_requests_applicant PurchaseRequest[] @relation("PurchaseRequestApplicant")
@@ -2112,6 +2114,57 @@ model WecomIdentityBinding {
@@map("wecom_identity_bindings")
}
model WecomHrMasterSyncRun {
id String @id @default(uuid()) @db.Uuid
mode String @db.VarChar(16)
status String @default("running") @db.VarChar(24)
token_source Json?
requested_userids Json?
limit Int?
summary Json?
error_code String? @db.VarChar(80)
error_message String?
triggered_by String? @db.Uuid
started_at DateTime @default(now())
finished_at DateTime?
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
trigger Employee? @relation("WecomHrMasterSyncRunTrigger", fields: [triggered_by], references: [id], onDelete: SetNull)
items WecomHrMasterSyncItem[]
@@index([status, created_at], map: "idx_wecom_hr_master_sync_runs_status_created")
@@index([mode, created_at], map: "idx_wecom_hr_master_sync_runs_mode_created")
@@index([triggered_by], map: "idx_wecom_hr_master_sync_runs_triggered_by")
@@map("wecom_hr_master_sync_runs")
}
model WecomHrMasterSyncItem {
id String @id @default(uuid()) @db.Uuid
run_id String @db.Uuid
employee_id String? @db.Uuid
external_user_id_masked String @db.VarChar(80)
action String @db.VarChar(32)
status String @db.VarChar(24)
error_code String? @db.VarChar(80)
error_message String?
retry_count Int @default(0)
field_changes Json?
source_summary Json?
created_at DateTime @default(now())
updated_at DateTime @default(now()) @updatedAt
run WecomHrMasterSyncRun @relation(fields: [run_id], references: [id], onDelete: Cascade)
employee Employee? @relation("WecomHrMasterSyncItemEmployee", fields: [employee_id], references: [id], onDelete: SetNull)
@@index([run_id, status], map: "idx_wecom_hr_master_sync_items_run_status")
@@index([employee_id, created_at], map: "idx_wecom_hr_master_sync_items_employee_created")
@@index([action, status], map: "idx_wecom_hr_master_sync_items_action_status")
@@map("wecom_hr_master_sync_items")
}
model Project {
id String @id @default(uuid()) @db.Uuid
project_no String @unique