diff --git a/docs/IM-数据库变更汇总.sql b/docs/IM-数据库变更汇总.sql index f4afacf..f714b9c 100644 --- a/docs/IM-数据库变更汇总.sql +++ b/docs/IM-数据库变更汇总.sql @@ -993,13 +993,13 @@ ON DUPLICATE KEY UPDATE updated_at = CURRENT_TIMESTAMP(3); INSERT INTO tinode.im_workbench_apps(code, name, route, sort_order, unread_key, enabled, permission) VALUES - ('organization', '组织架构', '/organization', 10, 'organization', 1, 'enabled'), - ('attendance', '打卡', '/attendance', 20, 'attendance', 1, 'enabled'), - ('meetings', '会议通知', '/meetings', 30, 'meetings', 1, 'enabled'), - ('meeting_notes', '会议笔记', '/meeting-notes', 35, '', 1, 'enabled'), - ('daily_reports', '日报', '/reports/daily', 40, 'daily_reports', 1, 'enabled'), - ('monthly_reports', '月报', '/reports/monthly', 50, 'monthly_reports', 1, 'enabled'), - ('executive_mailbox', '总经理信箱', '/executive-mailbox', 60, 'executive_mailbox', 1, 'enabled') + ('attendance', '打卡', '/attendance', 10, 'attendance', 1, 'enabled'), + ('monthly_reports', '月报', '/reports/monthly', 20, 'monthly_reports', 1, 'enabled'), + ('daily_reports', '日报', '/reports/daily', 30, 'daily_reports', 1, 'enabled'), + ('organization', '部门框架', '/organization', 40, 'organization', 1, 'enabled'), + ('executive_mailbox', '举报信箱', '/executive-mailbox', 50, 'executive_mailbox', 1, 'enabled'), + ('meetings', '会议通知', '/meetings', 60, 'meetings', 1, 'enabled'), + ('meeting_notes', '会议笔记', '/meeting-notes', 70, '', 1, 'enabled') ON DUPLICATE KEY UPDATE name = VALUES(name), route = VALUES(route), diff --git a/docs/sql/IM-工作台排序更新SQL.sql b/docs/sql/IM-工作台排序更新SQL.sql new file mode 100644 index 0000000..46da08c --- /dev/null +++ b/docs/sql/IM-工作台排序更新SQL.sql @@ -0,0 +1,29 @@ +-- Update workbench module order to match the mobile workbench layout. +-- Order: 打卡、月报、日报、部门框架、举报信箱、会议通知、会议笔记. + +UPDATE tinode.im_workbench_apps +SET sort_order = CASE code + WHEN 'attendance' THEN 10 + WHEN 'monthly_reports' THEN 20 + WHEN 'daily_reports' THEN 30 + WHEN 'organization' THEN 40 + WHEN 'executive_mailbox' THEN 50 + WHEN 'meetings' THEN 60 + WHEN 'meeting_notes' THEN 70 + ELSE sort_order + END, + name = CASE code + WHEN 'organization' THEN '部门框架' + WHEN 'executive_mailbox' THEN '举报信箱' + ELSE name + END, + updated_at = CURRENT_TIMESTAMP(3) +WHERE code IN ( + 'attendance', + 'monthly_reports', + 'daily_reports', + 'organization', + 'executive_mailbox', + 'meetings', + 'meeting_notes' +); diff --git a/scripts/apply_hotgo_tenant_db.go b/scripts/apply_hotgo_tenant_db.go index 565218a..846d042 100644 --- a/scripts/apply_hotgo_tenant_db.go +++ b/scripts/apply_hotgo_tenant_db.go @@ -556,11 +556,13 @@ func main() { } if _, err = db.Exec(`INSERT INTO tinode.im_workbench_apps(code,name,route,sort_order,unread_key,enabled,permission) VALUES - ('organization','组织架构','/organization',10,'organization',1,'enabled'), - ('meetings','会议通知','/meetings',20,'meetings',1,'enabled'), + ('attendance','打卡','/attendance',10,'attendance',1,'enabled'), + ('monthly_reports','月报','/reports/monthly',20,'monthly_reports',1,'enabled'), ('daily_reports','日报','/reports/daily',30,'daily_reports',1,'enabled'), - ('monthly_reports','月报','/reports/monthly',40,'monthly_reports',1,'enabled'), - ('executive_mailbox','总经理信箱','/executive-mailbox',50,'executive_mailbox',1,'enabled') + ('organization','部门框架','/organization',40,'organization',1,'enabled'), + ('executive_mailbox','举报信箱','/executive-mailbox',50,'executive_mailbox',1,'enabled'), + ('meetings','会议通知','/meetings',60,'meetings',1,'enabled'), + ('meeting_notes','会议笔记','/meeting-notes',70,'',1,'enabled') ON DUPLICATE KEY UPDATE name=VALUES(name),route=VALUES(route),sort_order=VALUES(sort_order),unread_key=VALUES(unread_key),updated_at=CURRENT_TIMESTAMP(3)`); err != nil { fatal(err) } diff --git a/server/db/mysql/adapter.go b/server/db/mysql/adapter.go index 9de4963..adb12b3 100644 --- a/server/db/mysql/adapter.go +++ b/server/db/mysql/adapter.go @@ -1262,13 +1262,13 @@ func createIMWorkbenchTables(tx *sql.Tx) error { _, err := tx.Exec( `INSERT INTO im_workbench_apps(code,name,route,sort_order,unread_key,enabled,permission) VALUES - ('organization','组织架构','/organization',10,'organization',1,'enabled'), - ('attendance','打卡','/attendance',20,'attendance',1,'enabled'), - ('meetings','会议通知','/meetings',30,'meetings',1,'enabled'), - ('meeting_notes','会议笔记','/meeting-notes',35,'',1,'enabled'), - ('daily_reports','日报','/reports/daily',40,'daily_reports',1,'enabled'), - ('monthly_reports','月报','/reports/monthly',50,'monthly_reports',1,'enabled'), - ('executive_mailbox','总经理信箱','/executive-mailbox',60,'executive_mailbox',1,'enabled') + ('attendance','打卡','/attendance',10,'attendance',1,'enabled'), + ('monthly_reports','月报','/reports/monthly',20,'monthly_reports',1,'enabled'), + ('daily_reports','日报','/reports/daily',30,'daily_reports',1,'enabled'), + ('organization','部门框架','/organization',40,'organization',1,'enabled'), + ('executive_mailbox','举报信箱','/executive-mailbox',50,'executive_mailbox',1,'enabled'), + ('meetings','会议通知','/meetings',60,'meetings',1,'enabled'), + ('meeting_notes','会议笔记','/meeting-notes',70,'',1,'enabled') ON DUPLICATE KEY UPDATE name=VALUES(name), route=VALUES(route), @@ -1628,7 +1628,7 @@ func ensureIMMeetingNotesTables(db *sqlx.DB) error { return err } _, err := db.Exec(`INSERT INTO im_workbench_apps(code,name,route,sort_order,unread_key,enabled,permission) - VALUES('meeting_notes','会议笔记','/meeting-notes',35,'',1,'enabled') + VALUES('meeting_notes','会议笔记','/meeting-notes',70,'',1,'enabled') ON DUPLICATE KEY UPDATE name=VALUES(name),route=VALUES(route),sort_order=VALUES(sort_order),unread_key=VALUES(unread_key),updated_at=CURRENT_TIMESTAMP(3)`) return err } diff --git a/server/db/mysql/tenant_adapter.go b/server/db/mysql/tenant_adapter.go index b82a5fb..ae9de50 100644 --- a/server/db/mysql/tenant_adapter.go +++ b/server/db/mysql/tenant_adapter.go @@ -6844,7 +6844,7 @@ func (a *adapter) userPrivacyByUID(ctx context.Context, uid t.Uid) (*t.UserPriva func isAllowedWorkbenchRoute(route string) bool { switch route { - case "/organization", "/attendance", "/meetings", "/reports/daily", "/reports/monthly", "/executive-mailbox": + case "/organization", "/attendance", "/meetings", "/meeting-notes", "/reports/daily", "/reports/monthly", "/executive-mailbox": return true default: return false diff --git a/server/im_http.go b/server/im_http.go index 2d89c23..e12ac91 100644 --- a/server/im_http.go +++ b/server/im_http.go @@ -8123,6 +8123,7 @@ func workbenchModulePayloads(modules []types.WorkbenchModule) []map[string]any { "name": module.Name, "icon_file_id": module.IconFileID, "route": module.Route, + "sort_order": module.SortOrder, "unread_count": module.UnreadCount, "enabled": module.Enabled, "permission": module.Permission, diff --git a/server/im_http_test.go b/server/im_http_test.go index 4887702..aa97c56 100644 --- a/server/im_http_test.go +++ b/server/im_http_test.go @@ -2552,7 +2552,7 @@ func TestServeIMWorkbench(t *testing.T) { oldWorkbench := store.Workbench oldTenants := store.Tenants store.Workbench = &testWorkbenchStore{version: 3, modules: []types.WorkbenchModule{ - {Code: "organization", Name: "组织架构", Route: "/organization", Enabled: true, Permission: "enabled"}, + {Code: "organization", Name: "部门框架", Route: "/organization", SortOrder: 40, Enabled: true, Permission: "enabled"}, {Code: "external", Name: "外部链接", Route: "https://example.com", Enabled: true, Permission: "enabled"}, }} store.Tenants = testTenantStore{tenant: &types.Tenant{ID: 7, Code: "acme", State: types.TenantStateActive}} @@ -2579,7 +2579,7 @@ func TestServeIMWorkbench(t *testing.T) { t.Fatalf("expected external route to be filtered, got %#v", items) } item := items[0].(map[string]any) - if item["code"] != "organization" || item["route"] != "/organization" { + if item["code"] != "organization" || item["route"] != "/organization" || item["sort_order"].(float64) != 40 { t.Fatalf("unexpected module: %#v", item) } enterprise := data["enterprise"].(map[string]any)