完善退款审批材料与恢复流程
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m35s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m35s
This commit is contained in:
53
internal/infrastructure/wecom/manual_sync_consumer.go
Normal file
53
internal/infrastructure/wecom/manual_sync_consumer.go
Normal file
@@ -0,0 +1,53 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user