All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m35s
96 lines
3.5 KiB
Go
96 lines
3.5 KiB
Go
package asset
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
|
|
infraAudit "github.com/break/junhong_cmp_fiber/internal/infrastructure/audit"
|
|
"github.com/break/junhong_cmp_fiber/internal/model"
|
|
assetAuditSvc "github.com/break/junhong_cmp_fiber/internal/service/asset_audit"
|
|
"github.com/break/junhong_cmp_fiber/pkg/auditcontext"
|
|
"github.com/break/junhong_cmp_fiber/pkg/auditfailure"
|
|
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
|
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func (s *Service) appendPackageAdjustmentAudit(
|
|
ctx context.Context,
|
|
tx *gorm.DB,
|
|
actionCode, summary, result string,
|
|
usage *model.PackageUsage,
|
|
assetType string,
|
|
assetID uint,
|
|
assetIdentifier string,
|
|
beforeData, afterData map[string]any,
|
|
businessErr error,
|
|
) error {
|
|
if s.auditWriter == nil || usage == nil || usage.ID == 0 {
|
|
return errors.New(errors.CodeInvalidStatus, "资产套餐统一审计接缝未配置或资源不完整")
|
|
}
|
|
usageID := strconv.FormatUint(uint64(usage.ID), 10)
|
|
assetResourceID := strconv.FormatUint(uint64(assetID), 10)
|
|
assetType = assetAuditSvc.NormalizeAssetType(assetType)
|
|
var resourceType string
|
|
switch assetType {
|
|
case constants.AssetTypeIotCard:
|
|
resourceType = constants.AuditResourceIotCard
|
|
case constants.AssetTypeDevice:
|
|
resourceType = constants.AuditResourceDevice
|
|
default:
|
|
return errors.New(errors.CodeInvalidParam, "资产类型无效")
|
|
}
|
|
errorCode, errorSummary := assetAuditSvc.BuildErrorInfo(businessErr)
|
|
return s.auditWriter.Append(ctx, tx, infraAudit.AppendInput{
|
|
ActionCode: actionCode,
|
|
Summary: summary,
|
|
Result: result,
|
|
ErrorCode: errorCode,
|
|
ErrorSummary: errorSummary,
|
|
ScopeType: constants.AuditScopePlatform,
|
|
Resources: []infraAudit.ResourceInput{
|
|
{
|
|
Type: resourceType, ID: &assetResourceID, Key: assetIdentifier, DisplayName: assetIdentifier,
|
|
Relation: constants.AuditResourceRelationReference, Role: constants.AuditResourceRolePackageUsageAsset,
|
|
IdentitySnapshot: map[string]any{"id": assetID, "asset_type": assetType, "identifier": assetIdentifier},
|
|
SubjectVisibility: constants.AuditSubjectResult, SubjectSummary: summary,
|
|
},
|
|
{
|
|
Type: constants.AuditResourcePackageUsage, ID: &usageID,
|
|
Key: "package_usage:" + usageID, DisplayName: "套餐权益#" + usageID,
|
|
Relation: constants.AuditResourceRelationPrimary, Role: constants.AuditResourceRolePackageUsageTarget,
|
|
IdentitySnapshot: map[string]any{
|
|
"id": usage.ID, "order_id": usage.OrderID, "package_id": usage.PackageID,
|
|
"iot_card_id": usage.IotCardID, "device_id": usage.DeviceID, "status": usage.Status,
|
|
},
|
|
BeforeData: beforeData, AfterData: afterData,
|
|
SubjectVisibility: constants.AuditSubjectResult, SubjectSummary: summary,
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
func (s *Service) recordPackageAdjustmentFailure(
|
|
ctx context.Context,
|
|
actionCode, summary string,
|
|
usage *model.PackageUsage,
|
|
assetType string,
|
|
assetID uint,
|
|
assetIdentifier string,
|
|
beforeData, afterData map[string]any,
|
|
businessErr error,
|
|
) {
|
|
if s == nil || s.db == nil || usage == nil {
|
|
return
|
|
}
|
|
err := s.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
|
return s.appendPackageAdjustmentAudit(ctx, tx, actionCode, summary, constants.AuditResultFailed, usage, assetType, assetID, assetIdentifier, beforeData, afterData, businessErr)
|
|
})
|
|
if err == nil {
|
|
return
|
|
}
|
|
linkage := auditcontext.From(ctx)
|
|
errorCode, _ := assetAuditSvc.BuildErrorInfo(businessErr)
|
|
auditfailure.RecordSecondaryWriteFailure(actionCode, strconv.FormatUint(uint64(usage.ID), 10), linkage.RequestID, linkage.CorrelationID, errorCode, err)
|
|
}
|