first commit

This commit is contained in:
2026-09-11 01:47:20 +08:00
commit 303207d3cc
74 changed files with 8348 additions and 0 deletions
+85
View File
@@ -0,0 +1,85 @@
package mysqldao
import (
"context"
"git.lzcwy.cn/zhengchiliu/zt-closet-manage-backend/global"
"git.lzcwy.cn/zhengchiliu/zt-closet-manage-backend/internal/mysqlmodel"
"gorm.io/gorm"
)
// RefundDao 退款单数据访问
type RefundDao struct {
db *gorm.DB
}
// NewRefundDao 创建退款 DAO
func NewRefundDao() *RefundDao {
return &RefundDao{db: global.MysqlEngine}
}
// RefundListParams 退款单分页列表筛选参数。
type RefundListParams struct {
Status int8 // 退款状态(WithStatus 为 true 时生效)
WithStatus bool // 是否按状态筛选(退款状态 0=待处理 是合法值,需显式区分「不过滤」)
OrderNo string // 订单号(精确)
Page int
Size int
}
// RefundList 分页查询退款单
func (d *RefundDao) RefundList(ctx context.Context, p RefundListParams) ([]mysqlmodel.RefundFlowLog, int64, error) {
ctx, span := global.Tracer.Start(ctx, "mysqldao.RefundList")
defer span.End()
var list []mysqlmodel.RefundFlowLog
var total int64
q := d.db.WithContext(ctx).Model(&mysqlmodel.RefundFlowLog{})
if p.WithStatus {
q = q.Where("status = ?", p.Status)
}
if p.OrderNo != "" {
q = q.Where("order_no = ?", p.OrderNo)
}
if err := q.Count(&total).Error; err != nil {
span.RecordError(err)
return nil, 0, err
}
if err := q.Offset((p.Page - 1) * p.Size).Limit(p.Size).Order("id DESC").Find(&list).Error; err != nil {
span.RecordError(err)
return nil, 0, err
}
return list, total, nil
}
// RefundGetByRefundNo 按退款单号查询
func (d *RefundDao) RefundGetByRefundNo(ctx context.Context, refundNo string) (*mysqlmodel.RefundFlowLog, error) {
ctx, span := global.Tracer.Start(ctx, "mysqldao.RefundGetByRefundNo")
defer span.End()
var refund mysqlmodel.RefundFlowLog
if err := d.db.WithContext(ctx).Where("refund_no = ?", refundNo).First(&refund).Error; err != nil {
span.RecordError(err)
return nil, err
}
return &refund, nil
}
// RefundTransition 条件更新退款状态(仅 from 状态可流转到 to,行锁防并发重复审核)。
func (d *RefundDao) RefundTransition(ctx context.Context, refundNo string, from, to int8, failReason string) (bool, error) {
ctx, span := global.Tracer.Start(ctx, "mysqldao.RefundTransition")
defer span.End()
updates := map[string]any{"status": to}
if failReason != "" {
updates["fail_reason"] = failReason
}
res := d.db.WithContext(ctx).Model(&mysqlmodel.RefundFlowLog{}).
Where("refund_no = ? AND status = ?", refundNo, from).
Updates(updates)
if res.Error != nil {
span.RecordError(res.Error)
return false, res.Error
}
return res.RowsAffected > 0, nil
}