package sys import ( "context" "hotgo/internal/consts" "hotgo/internal/model/input/sysin" "hotgo/internal/service" "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gtime" ) const imWorkbenchAppsTable = "im_workbench_apps" type sSysImWorkbench struct{} func NewSysImWorkbench() *sSysImWorkbench { return &sSysImWorkbench{} } func init() { service.RegisterSysImWorkbench(NewSysImWorkbench()) } func (s *sSysImWorkbench) List(ctx context.Context, in *sysin.ImWorkbenchAppListInp) (list []*sysin.ImWorkbenchAppModel, totalCount int, err error) { if err = in.Filter(ctx); err != nil { return } db, tenant, err := resolveImTenantDB(ctx, in.TenantId) if err != nil { return } if err = s.ensureDefaultApps(ctx, db); err != nil { return } mod := s.model(ctx, db) if in.Code != "" { mod = mod.WhereLike("code", "%"+in.Code+"%") } if in.Name != "" { mod = mod.WhereLike("name", "%"+in.Name+"%") } if in.Enabled != nil { mod = mod.Where("enabled", *in.Enabled) } mod = mod.Page(in.Page, in.PerPage).OrderAsc("sort_order").OrderAsc("id") if err = mod.ScanAndCount(&list, &totalCount, false); err != nil { err = gerror.Wrap(err, "获取IM工作台模块失败,请稍后重试!") return } for _, item := range list { item.TenantId = tenant.Id item.TenantName = tenant.Name } return } func (s *sSysImWorkbench) Edit(ctx context.Context, in *sysin.ImWorkbenchAppEditInp) (err error) { if err = in.Filter(ctx); err != nil { return } db, tenant, err := resolveImTenantDB(ctx, in.TenantId) if err != nil { return } if err = s.ensureDefaultApps(ctx, db); err != nil { return } data := g.Map{ "code": in.Code, "name": in.Name, "icon_file_id": in.IconFileId, "route": in.Route, "sort_order": in.SortOrder, "unread_key": in.UnreadKey, "enabled": in.Enabled, "permission": in.Permission, "updated_at": gtime.Now(), } action := "im_workbench_app_create" targetId := in.Id if in.Id > 0 { if _, err = db.Model(imWorkbenchAppsTable).Safe().Ctx(ctx).WherePri(in.Id).Data(data).Update(); err != nil { return gerror.Wrap(err, "更新IM工作台模块失败,请稍后重试!") } action = "im_workbench_app_update" } else { data["created_at"] = gtime.Now() if _, err = db.Model(imWorkbenchAppsTable).Safe().Ctx(ctx).Data(data).Insert(); err != nil { return gerror.Wrap(err, "新增IM工作台模块失败,请稍后重试!") } idValue, err := db.Model(imWorkbenchAppsTable).Safe().Ctx(ctx).Fields("id").Where("code", in.Code).Value() if err != nil { return gerror.Wrap(err, "获取IM工作台模块ID失败,请稍后重试!") } targetId = idValue.Int64() } _ = writeImAdminAudit(ctx, tenant.Id, action, "im_workbench_app", targetId, "success", g.Map{ "code": in.Code, "route": in.Route, "enabled": in.Enabled, "permission": in.Permission, }) return nil } func (s *sSysImWorkbench) Delete(ctx context.Context, in *sysin.ImWorkbenchAppDeleteInp) (err error) { if err = in.Filter(ctx); err != nil { return } db, tenant, err := resolveImTenantDB(ctx, in.TenantId) if err != nil { return } if err = s.ensureDefaultApps(ctx, db); err != nil { return } mod := db.Model(imWorkbenchAppsTable).Safe().Ctx(ctx) if in.Id > 0 { mod = mod.WherePri(in.Id) } else { mod = mod.Where("code", in.Code) } if _, err = mod.Data(g.Map{"enabled": consts.ImWorkbenchAppDisabled, "updated_at": gtime.Now()}).Update(); err != nil { return gerror.Wrap(err, "禁用IM工作台模块失败,请稍后重试!") } _ = writeImAdminAudit(ctx, tenant.Id, "im_workbench_app_disable", "im_workbench_app", in.Id, "success", g.Map{"code": in.Code}) return nil } func (s *sSysImWorkbench) Reorder(ctx context.Context, in *sysin.ImWorkbenchAppReorderInp) (err error) { if err = in.Filter(ctx); err != nil { return } db, tenant, err := resolveImTenantDB(ctx, in.TenantId) if err != nil { return } if err = s.ensureDefaultApps(ctx, db); err != nil { return } if err = db.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error { for _, item := range in.Items { if _, e := tx.Model(imWorkbenchAppsTable).Safe().Ctx(ctx).Where("code", item.Code). Data(g.Map{"sort_order": item.SortOrder, "updated_at": gtime.Now()}).Update(); e != nil { return e } } return nil }); err != nil { return gerror.Wrap(err, "调整IM工作台模块排序失败,请稍后重试!") } _ = writeImAdminAudit(ctx, tenant.Id, "im_workbench_app_reorder", "im_workbench_app", 0, "success", g.Map{"count": len(in.Items)}) return nil } func (s *sSysImWorkbench) model(ctx context.Context, db gdb.DB) *gdb.Model { return db.Model(imWorkbenchAppsTable).Safe().Ctx(ctx).Fields( "id", "code", "name", "icon_file_id", "route", "sort_order", "unread_key", "enabled", "permission", "created_at", "updated_at", ) } func (s *sSysImWorkbench) ensureDefaultApps(ctx context.Context, db gdb.DB) (err error) { defaults := []g.Map{ {"code": "organization", "name": "组织架构", "route": consts.ImWorkbenchRouteOrganization, "sort_order": 10, "unread_key": "organization", "enabled": consts.ImWorkbenchAppEnabled, "permission": consts.ImWorkbenchPermissionEnabled}, {"code": "meetings", "name": "会议通知", "route": consts.ImWorkbenchRouteMeetings, "sort_order": 20, "unread_key": "meetings", "enabled": consts.ImWorkbenchAppEnabled, "permission": consts.ImWorkbenchPermissionEnabled}, {"code": "daily_reports", "name": "日报", "route": consts.ImWorkbenchRouteDailyReports, "sort_order": 30, "unread_key": "daily_reports", "enabled": consts.ImWorkbenchAppEnabled, "permission": consts.ImWorkbenchPermissionEnabled}, {"code": "monthly_reports", "name": "月报", "route": consts.ImWorkbenchRouteMonthlyReports, "sort_order": 40, "unread_key": "monthly_reports", "enabled": consts.ImWorkbenchAppEnabled, "permission": consts.ImWorkbenchPermissionEnabled}, {"code": "executive_mailbox", "name": "总经理信箱", "route": consts.ImWorkbenchRouteExecutiveMailbox, "sort_order": 50, "unread_key": "executive_mailbox", "enabled": consts.ImWorkbenchAppEnabled, "permission": consts.ImWorkbenchPermissionEnabled}, } now := gtime.Now() for _, item := range defaults { var count int if count, err = db.Model(imWorkbenchAppsTable).Safe().Ctx(ctx).Where("code", item["code"]).Count(); err != nil { return gerror.Wrap(err, "检查IM工作台默认模块失败,请稍后重试!") } if count > 0 { continue } item["created_at"] = now item["updated_at"] = now if _, err = db.Model(imWorkbenchAppsTable).Safe().Ctx(ctx).Data(item).Insert(); err != nil { return gerror.Wrap(err, "初始化IM工作台默认模块失败,请稍后重试!") } } return nil }