package wecom import ( "context" "strconv" "github.com/bytedance/sonic" "gorm.io/gorm" "github.com/break/junhong_cmp_fiber/internal/infrastructure/messaging/outbox" "github.com/break/junhong_cmp_fiber/internal/model" "github.com/break/junhong_cmp_fiber/pkg/constants" "github.com/break/junhong_cmp_fiber/pkg/errors" "github.com/break/junhong_cmp_fiber/pkg/queue" ) type ManualSyncConsumer struct { db *gorm.DB queue *queue.Client } func NewManualSyncConsumer(db *gorm.DB, client *queue.Client) *ManualSyncConsumer { return &ManualSyncConsumer{db: db, queue: client} } func (c *ManualSyncConsumer) Consume(ctx context.Context, envelope outbox.DeliveryEnvelope) error { if c == nil || c.db == nil || c.queue == nil { return errors.New(errors.CodeServiceUnavailable, "审批手动同步消费者未配置") } var payload struct { InstanceID uint `json:"instance_id"` ApplicationID uint `json:"application_id"` SPNo string `json:"sp_no"` } if err := sonic.Unmarshal(envelope.Payload, &payload); err != nil || payload.InstanceID == 0 || payload.ApplicationID == 0 || payload.SPNo == "" { return errors.New(errors.CodeInvalidParam, "审批手动同步事件载荷无效") } id := strconv.FormatUint(uint64(payload.InstanceID), 10) var instance model.ApprovalInstance if err := c.db.WithContext(ctx).Where("id = ?", payload.InstanceID).First(&instance).Error; err != nil { return errors.New(errors.CodeConflict, "审批手动同步实例不存在") } if envelope.EventType != constants.OutboxEventTypeApprovalManualSyncRequested || envelope.AggregateType != "approval" || envelope.AggregateID != id || envelope.ResourceType != instance.BusinessType || envelope.ResourceID != strconv.FormatUint(uint64(instance.BusinessID), 10) { return errors.New(errors.CodeInvalidParam, "审批手动同步事件身份无效") } var channelContext model.WeComApprovalContext if err := c.db.WithContext(ctx).Where("approval_instance_id = ? AND application_id = ? AND sp_no = ? AND submission_status = ?", payload.InstanceID, payload.ApplicationID, payload.SPNo, constants.WeComSubmissionStatusSubmitted).First(&channelContext).Error; err != nil { return errors.New(errors.CodeConflict, "审批手动同步上下文不一致") } return c.queue.EnqueueTask(ctx, constants.TaskTypeWeComApprovalSync, ApprovalDetailSyncTask{ApplicationID: payload.ApplicationID, SPNo: payload.SPNo, Source: constants.ApprovalSyncSourceManual}) } var _ outbox.EventConsumer = (*ManualSyncConsumer)(nil)