package app import ( "context" "encoding/json" "strings" "git.5iot.com/iotlcm-public/iotlcm-app/internal/library/rabbitmq" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gtime" ) const ( appAsyncEventBalanceRechargePaid = "balance_recharge_paid" appAsyncEventRenewCompleted = "card_renew_completed" appAsyncEventChangeCompleted = "card_change_completed" appAsyncEventAllocateCompleted = "card_allocate_completed" ) type appBusinessAsyncEvent struct { EventType string `json:"eventType"` OrderSn string `json:"orderSn,omitempty"` BatchNo string `json:"batchNo,omitempty"` BatchType int `json:"batchType,omitempty"` PayProvider string `json:"payProvider,omitempty"` PayTradeNo string `json:"payTradeNo,omitempty"` TenantId string `json:"tenantId,omitempty"` UserId int64 `json:"userId,omitempty"` DeptId int64 `json:"deptId,omitempty"` Trigger string `json:"trigger,omitempty"` CreatedAt string `json:"createdAt"` } func (s *sAppCard) publishAppBusinessAsyncEvent(ctx context.Context, event appBusinessAsyncEvent) error { event.EventType = strings.TrimSpace(event.EventType) if event.EventType == "" { return nil } if event.CreatedAt == "" { event.CreatedAt = gtime.Now().Format("Y-m-d H:i:s") } if !g.Cfg().MustGet(ctx, "appBusinessAsync.enabled", false).Bool() { return nil } payload, err := json.Marshal(event) if err != nil { return gerror.Wrap(err, "序列化小程序业务异步事件失败") } provider := strings.ToLower(strings.TrimSpace(g.Cfg().MustGet(ctx, "appBusinessAsync.provider", "rabbitmq").String())) queueName := strings.TrimSpace(g.Cfg().MustGet(ctx, "appBusinessAsync.queueName", "iotlcm.app.business").String()) failOnPublish := g.Cfg().MustGet(ctx, "appBusinessAsync.failOnPublish", false).Bool() var publishErr error switch provider { case "log", "stdout": g.Log().Infof(ctx, "小程序业务异步事件: queue=%s payload=%s", queueName, string(payload)) case "rabbitmq": publishErr = rabbitmq.PublishBytes(ctx, queueName, payload) if publishErr != nil { g.Log().Warningf(ctx, "小程序业务异步事件 RabbitMQ 发布失败: queue=%s payload=%s err:%+v", queueName, string(payload), publishErr) } else { g.Log().Infof(ctx, "小程序业务异步事件 RabbitMQ 发布成功: queue=%s eventType=%s orderSn=%s batchNo=%s", queueName, event.EventType, event.OrderSn, event.BatchNo) } default: publishErr = gerror.Newf("不支持的小程序业务异步事件发布器: %s", provider) g.Log().Warningf(ctx, "%v: queue=%s payload=%s", publishErr, queueName, string(payload)) } if publishErr != nil && failOnPublish { return publishErr } return nil }