From 61ab313f3580cb32ba839277f99c10a986f18736 Mon Sep 17 00:00:00 2001 From: richjohnrambo Date: Mon, 31 Aug 2026 13:44:47 +0800 Subject: [PATCH] fix: ensure attendance schema for tenant routing --- server/db/mysql/adapter.go | 43 +++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/server/db/mysql/adapter.go b/server/db/mysql/adapter.go index 0bce20b..a6776f7 100644 --- a/server/db/mysql/adapter.go +++ b/server/db/mysql/adapter.go @@ -278,6 +278,9 @@ func (a *adapter) Open(jsonconfig json.RawMessage) error { if err = ensureIMOrganizationVisibilityTables(a.db); err != nil { return errors.New("mysql adapter failed to ensure organization visibility schema: " + err.Error()) } + if err = ensureIMAttendanceTables(a.db); err != nil { + return errors.New("mysql adapter failed to ensure attendance schema: " + err.Error()) + } if err = ensureSnowflakePrimaryKeys(a.db); err != nil { return errors.New("mysql adapter failed to ensure snowflake primary keys: " + err.Error()) } @@ -514,6 +517,10 @@ func (a *adapter) TenantAdapterFor(tenantID t.TenantID) (dbadapter.TenantBusines db.Close() return nil, nil, err } + if err = ensureIMAttendanceTables(db); err != nil { + db.Close() + return nil, nil, err + } if err = ensureSnowflakePrimaryKeys(db); err != nil { db.Close() return nil, nil, err @@ -1236,6 +1243,32 @@ func ensureIMOrganizationVisibilityTables(exec sqlExecutor) error { } func createIMAttendanceTables(tx *sql.Tx) error { + for _, stmt := range imAttendanceTableStatements(false) { + if _, err := tx.Exec(stmt); err != nil { + return err + } + } + return seedIMAttendanceDefaults(tx) +} + +func ensureIMAttendanceTables(db *sqlx.DB) error { + tx, err := db.Begin() + if err != nil { + return err + } + defer tx.Rollback() + for _, stmt := range imAttendanceTableStatements(true) { + if _, err = tx.Exec(stmt); err != nil { + return err + } + } + if err = seedIMAttendanceDefaults(tx); err != nil { + return err + } + return tx.Commit() +} + +func imAttendanceTableStatements(ifNotExists bool) []string { statements := []string{ `CREATE TABLE im_attendance_rules( id BIGINT NOT NULL AUTO_INCREMENT, @@ -1336,11 +1369,15 @@ func createIMAttendanceTables(tx *sql.Tx) error { INDEX idx_im_attendance_appeals_user_status(user_id,status,id DESC) )`, } - for _, stmt := range statements { - if _, err := tx.Exec(stmt); err != nil { - return err + if ifNotExists { + for i, stmt := range statements { + statements[i] = strings.Replace(stmt, "CREATE TABLE ", "CREATE TABLE IF NOT EXISTS ", 1) } } + return statements +} + +func seedIMAttendanceDefaults(tx *sql.Tx) error { if _, err := tx.Exec(`INSERT INTO im_attendance_rules(rule_id,name,workday,location_required,wifi_required,allow_outside_checkin,appeal_allowed) VALUES('att_rule_default','默认考勤规则',1,0,0,1,1) ON DUPLICATE KEY UPDATE updated_at=updated_at`); err != nil {