topfans/backend/gateway/repository/laser_card_repository.go
2026-06-03 22:19:22 +08:00

130 lines
4.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package repository
import (
"fmt"
"time"
"github.com/topfans/backend/pkg/models"
"gorm.io/gorm"
)
// LaserCardRepository 镭射卡数据访问层Gateway 侧)
type LaserCardRepository struct {
db *gorm.DB
}
// NewLaserCardRepository 创建镭射卡 Repository
func NewLaserCardRepository(db *gorm.DB) *LaserCardRepository {
return &LaserCardRepository{db: db}
}
// FindTemplateByCode 根据 preset_id 查找模板version=1 且未删除)
func (r *LaserCardRepository) FindTemplateByCode(code string) (*models.LaserCardTemplate, error) {
var t models.LaserCardTemplate
err := r.db.Where("template_code = ? AND version = 1 AND deleted_at IS NULL", code).First(&t).Error
if err != nil {
return nil, fmt.Errorf("template %s not found: %w", code, err)
}
return &t, nil
}
// CreateInstance 创建镭射卡业务实例status=rendered
func (r *LaserCardRepository) CreateInstance(inst *models.LaserCardInstance) error {
return r.db.Create(inst).Error
}
// UpdateMaterialsSnapshot 更新素材快照
func (r *LaserCardRepository) UpdateMaterialsSnapshot(instanceID int64, snapshot models.MaterialsSnapshot) error {
return r.db.Model(&models.LaserCardInstance{}).
Where("id = ? AND deleted_at IS NULL", instanceID).
Update("materials_snapshot", snapshot).Error
}
// UpdateStatus 更新实例状态
func (r *LaserCardRepository) UpdateStatus(instanceID int64, status string) error {
return r.db.Model(&models.LaserCardInstance{}).
Where("id = ? AND deleted_at IS NULL", instanceID).
Update("status", status).Error
}
// SetMintResult 铸造成功后回填 asset_id, mint_order_id, composite_material_id状态→minted
func (r *LaserCardRepository) SetMintResult(instanceID int64, assetID int64, mintOrderID string, compositeMaterialID *int64) error {
updates := map[string]interface{}{
"status": models.LaserCardInstanceStatusMinted,
"asset_id": assetID,
"mint_order_id": mintOrderID,
}
if compositeMaterialID != nil {
updates["composite_material_id"] = *compositeMaterialID
}
return r.db.Model(&models.LaserCardInstance{}).
Where("id = ? AND deleted_at IS NULL", instanceID).
Updates(updates).Error
}
// StartMinting 标记实例为铸造中
func (r *LaserCardRepository) StartMinting(instanceID int64, mintOrderID string) error {
return r.db.Model(&models.LaserCardInstance{}).
Where("id = ? AND deleted_at IS NULL", instanceID).
Updates(map[string]interface{}{
"status": models.LaserCardInstanceStatusMinting,
"mint_order_id": mintOrderID,
}).Error
}
// FindByID 按 ID 查实例
func (r *LaserCardRepository) FindByID(id int64) (*models.LaserCardInstance, error) {
var i models.LaserCardInstance
err := r.db.Where("id = ? AND deleted_at IS NULL", id).First(&i).Error
if err != nil {
return nil, err
}
return &i, nil
}
// FindByCompositeOssKey 通过合成图 OSS key 反查实例
func (r *LaserCardRepository) FindByCompositeOssKey(ossKey string) (*models.LaserCardInstance, error) {
var i models.LaserCardInstance
err := r.db.Where("composite_oss_key = ? AND deleted_at IS NULL", ossKey).First(&i).Error
if err != nil {
return nil, err
}
return &i, nil
}
// FindByInstanceNo 按单号查实例
func (r *LaserCardRepository) FindByInstanceNo(no string) (*models.LaserCardInstance, error) {
var i models.LaserCardInstance
err := r.db.Where("instance_no = ? AND deleted_at IS NULL", no).First(&i).Error
if err != nil {
return nil, err
}
return &i, nil
}
// CreateOperationLog 写入操作日志
func (r *LaserCardRepository) CreateOperationLog(log *models.LaserCardOperationLog) error {
return r.db.Create(log).Error
}
// CreateOperationLogSimple 快速写入操作日志
func (r *LaserCardRepository) CreateOperationLogSimple(instanceID int64, instanceNo string, userID int64, action string, statusBefore, statusAfter string) error {
now := time.Now().UnixMilli()
return r.db.Create(&models.LaserCardOperationLog{
InstanceID: instanceID,
InstanceNo: instanceNo,
OperatorUserID: userID,
Action: action,
StatusBefore: strPtr(statusBefore),
StatusAfter: strPtr(statusAfter),
CreatedAt: now,
}).Error
}
func strPtr(s string) *string {
if s == "" {
return nil
}
return &s
}