// Package sys // @Link https://github.com/bufanyun/hotgo // @Copyright Copyright (c) 2026 HotGo // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE package sys import ( "context" "hotgo/internal/consts" "hotgo/internal/library/contexts" "hotgo/internal/library/imkafka" "hotgo/internal/model/input/sysin" "hotgo/internal/service" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/util/gconv" ) type sSysImKafkaCommand struct{} func NewSysImKafkaCommand() *sSysImKafkaCommand { return &sSysImKafkaCommand{} } func init() { service.RegisterSysImKafkaCommand(NewSysImKafkaCommand()) } func (s *sSysImKafkaCommand) List(ctx context.Context, in *sysin.ImKafkaCommandListInp) (list []*sysin.ImKafkaCommandListModel, totalCount int, err error) { if err = in.Filter(ctx); err != nil { return } mod := g.DB().Model("im_admin_commands").Safe().Ctx(ctx). Fields( "id", "command_id", "tenant_id", "tenant_code", "event_id", "event_type", "biz_type", "biz_id", "idempotency_key", "status", "reason", "message", "sent_at", "completed_at", "created_by", "created_at", "updated_at", ) if in.TenantId > 0 { mod = mod.Where("tenant_id", in.TenantId) } if in.CommandId != "" { mod = mod.WhereLike("command_id", "%"+in.CommandId+"%") } if in.EventId != "" { mod = mod.WhereLike("event_id", "%"+in.EventId+"%") } if in.EventType != "" { mod = mod.WhereLike("event_type", "%"+in.EventType+"%") } if in.BizType != "" { mod = mod.Where("biz_type", in.BizType) } if in.BizId != "" { mod = mod.WhereLike("biz_id", "%"+in.BizId+"%") } if in.Status != "" { mod = mod.Where("status", in.Status) } if len(in.CreatedAt) == 2 { mod = mod.WhereBetween("created_at", in.CreatedAt[0], in.CreatedAt[1]) } mod = mod.Page(in.Page, in.PerPage).OrderDesc("id") if err = mod.ScanAndCount(&list, &totalCount, false); err != nil { err = gerror.Wrap(err, "获取IM后台命令列表失败,请稍后重试!") } return } func (s *sSysImKafkaCommand) View(ctx context.Context, in *sysin.ImKafkaCommandViewInp) (res *sysin.ImKafkaCommandViewModel, err error) { if err = in.Filter(ctx); err != nil { return nil, err } mod := g.DB().Model("im_admin_commands").Safe().Ctx(ctx). Fields( "id", "command_id", "tenant_id", "tenant_code", "event_id", "event_type", "biz_type", "biz_id", "idempotency_key", "status", "reason", "message", "CAST(payload AS CHAR) payload", "CAST(envelope AS CHAR) envelope", "CAST(result AS CHAR) result", "sent_at", "completed_at", "created_by", "created_at", "updated_at", ) if in.Id > 0 { mod = mod.Where("id", in.Id) } else { mod = mod.Where("command_id", in.CommandId) } if err = mod.Scan(&res); err != nil { return nil, gerror.Wrap(err, "获取IM后台命令详情失败,请稍后重试!") } return } func (s *sSysImKafkaCommand) CacheInvalidate(ctx context.Context, in *sysin.ImKafkaCacheInvalidateInp) (res *sysin.ImKafkaEventModel, err error) { if err = in.Filter(ctx); err != nil { return nil, err } user := contexts.GetUser(ctx) actor := &imkafka.Actor{ Type: "admin", ID: gconv.String(contexts.GetUserId(ctx)), } if user != nil { actor.DisplayName = user.RealName } payload := map[string]any{ "tenant_code": in.TenantCode, "namespace": in.Namespace, "keys": in.Keys, "reason": in.Reason, } eventID, err := imkafka.PublishEvent(ctx, imkafka.EventInput{ Topic: consts.QueueImCacheInvalidateTopic, TenantCode: in.TenantCode, EventType: "cache.invalidate", BizType: "cache", BizID: in.Namespace, Actor: actor, Payload: payload, CreatedBy: contexts.GetUserId(ctx), }) if err != nil { return nil, err } return &sysin.ImKafkaEventModel{EventId: eventID}, nil } func (s *sSysImKafkaCommand) WorkbenchEvent(ctx context.Context, in *sysin.ImKafkaWorkbenchEventInp) (res *sysin.ImKafkaEventModel, err error) { if err = in.Filter(ctx); err != nil { return nil, err } user := contexts.GetUser(ctx) actor := &imkafka.Actor{ Type: "admin", ID: gconv.String(contexts.GetUserId(ctx)), } if user != nil { actor.DisplayName = user.RealName } payload := in.Payload payload["tenant_code"] = in.TenantCode payload["source"] = "admin" eventID, err := imkafka.PublishEvent(ctx, imkafka.EventInput{ Topic: consts.QueueImWorkbenchEventTopic, TenantCode: in.TenantCode, EventType: in.EventType, BizType: "workbench", BizID: in.BizId, Actor: actor, Payload: payload, CreatedBy: contexts.GetUserId(ctx), }) if err != nil { return nil, err } return &sysin.ImKafkaEventModel{EventId: eventID}, nil }