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 }