130 lines
4.1 KiB
Go
130 lines
4.1 KiB
Go
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
|
||
}
|