You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
5.4 KiB
Go
251 lines
5.4 KiB
Go
package order
|
|
|
|
import (
|
|
"cls/internal/domain/order"
|
|
"cls/internal/domain/payment"
|
|
"cls/internal/domain/purchase"
|
|
"cls/pkg/logger"
|
|
"cls/pkg/util/page"
|
|
"cls/pkg/xorm_engine"
|
|
"errors"
|
|
"xorm.io/builder"
|
|
)
|
|
|
|
// AggregateRepositoryORM 订单聚合根仓储实现
|
|
type AggregateRepositoryORM struct {
|
|
engine *xorm_engine.Engine
|
|
log logger.Logger
|
|
}
|
|
|
|
var _ order.AggregateRepository = (*AggregateRepositoryORM)(nil)
|
|
|
|
// NewAggregateRepositoryORM 创建订单聚合根仓储实现
|
|
func NewAggregateRepositoryORM(engine *xorm_engine.Engine, log logger.New) order.AggregateRepository {
|
|
return &AggregateRepositoryORM{
|
|
engine: engine,
|
|
log: log("cls:repo:order:aggregate"),
|
|
}
|
|
}
|
|
|
|
// Save 保存订单聚合根
|
|
func (r *AggregateRepositoryORM) Save(aggregate *order.OrderAggregate) error {
|
|
session := r.engine.NewSession()
|
|
defer session.Close()
|
|
|
|
if err := session.Begin(); err != nil {
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
|
|
// 保存订单
|
|
if _, err := session.Insert(aggregate.Order); err != nil {
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
|
|
// 保存支付订单
|
|
if aggregate.Payment != nil {
|
|
if _, err := session.Insert(aggregate.Payment); err != nil {
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
}
|
|
|
|
// 保存购买记录
|
|
if aggregate.Purchase != nil {
|
|
if _, err := session.Insert(aggregate.Purchase); err != nil {
|
|
session.Rollback()
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
}
|
|
|
|
if err := session.Commit(); err != nil {
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetByOrderNo 根据订单号获取订单聚合根
|
|
func (r *AggregateRepositoryORM) GetByOrderNo(orderNo string) (*order.OrderAggregate, error) {
|
|
// 获取订单
|
|
o := &order.Order{}
|
|
has, err := r.engine.Where(builder.Eq{"order_no": orderNo}).Get(o)
|
|
if err != nil {
|
|
r.log.Error(err)
|
|
return nil, err
|
|
}
|
|
if !has {
|
|
return nil, errors.New("订单不存在")
|
|
}
|
|
|
|
// 获取支付订单
|
|
p := &payment.Payment{}
|
|
has, err = r.engine.Where(builder.Eq{"order_no": orderNo}).Get(p)
|
|
if err != nil {
|
|
r.log.Error(err)
|
|
return nil, err
|
|
}
|
|
|
|
// 获取购买记录
|
|
pu := &purchase.Purchase{}
|
|
has, err = r.engine.Where(builder.Eq{"user_id": o.UserID, "content_id": o.TargetID}).Get(pu)
|
|
if err != nil {
|
|
r.log.Error(err)
|
|
return nil, err
|
|
}
|
|
|
|
aggregate := order.NewOrderAggregate(o)
|
|
if has {
|
|
aggregate.Payment = p
|
|
aggregate.Purchase = pu
|
|
}
|
|
|
|
return aggregate, nil
|
|
}
|
|
|
|
// GetByID 根据ID获取订单聚合根
|
|
func (r *AggregateRepositoryORM) GetByID(id uint64) (*order.OrderAggregate, error) {
|
|
// 获取订单
|
|
o := &order.Order{}
|
|
has, err := r.engine.ID(id).Get(o)
|
|
if err != nil {
|
|
r.log.Error(err)
|
|
return nil, err
|
|
}
|
|
if !has {
|
|
return nil, errors.New("订单不存在")
|
|
}
|
|
|
|
// 获取支付订单
|
|
p := &payment.Payment{}
|
|
has, err = r.engine.Where(builder.Eq{"order_no": o.OrderNo}).Get(p)
|
|
if err != nil {
|
|
r.log.Error(err)
|
|
return nil, err
|
|
}
|
|
|
|
// 获取购买记录
|
|
pu := &purchase.Purchase{}
|
|
has, err = r.engine.Where(builder.Eq{"user_id": o.UserID, "content_id": o.TargetID}).Get(pu)
|
|
if err != nil {
|
|
r.log.Error(err)
|
|
return nil, err
|
|
}
|
|
|
|
aggregate := order.NewOrderAggregate(o)
|
|
if has {
|
|
aggregate.Payment = p
|
|
aggregate.Purchase = pu
|
|
}
|
|
|
|
return aggregate, nil
|
|
}
|
|
|
|
// ListByUserID 获取用户订单聚合根列表
|
|
func (r *AggregateRepositoryORM) ListByUserID(userID uint64, page *page.Page) ([]*order.OrderAggregate, int64, error) {
|
|
// 获取订单总数
|
|
o := &order.Order{}
|
|
total, err := r.engine.Where(builder.Eq{"user_id": userID}).Count(o)
|
|
if err != nil {
|
|
r.log.Error(err)
|
|
return nil, 0, err
|
|
}
|
|
|
|
// 获取订单列表
|
|
var orders []*order.Order
|
|
err = r.engine.Where(builder.Eq{"user_id": userID}).
|
|
Limit(page.PageSize, (page.PageNumber-1)*page.PageSize).
|
|
Find(&orders)
|
|
if err != nil {
|
|
r.log.Error(err)
|
|
return nil, 0, err
|
|
}
|
|
|
|
// 获取支付订单和购买记录
|
|
aggregates := make([]*order.OrderAggregate, len(orders))
|
|
for i, o := range orders {
|
|
aggregate := order.NewOrderAggregate(o)
|
|
|
|
// 获取支付订单
|
|
p := &payment.Payment{}
|
|
has, err := r.engine.Where(builder.Eq{"order_no": o.OrderNo}).Get(p)
|
|
if err != nil {
|
|
r.log.Error(err)
|
|
return nil, 0, err
|
|
}
|
|
if has {
|
|
aggregate.Payment = p
|
|
}
|
|
|
|
// 获取购买记录
|
|
pu := &purchase.Purchase{}
|
|
has, err = r.engine.Where(builder.Eq{"user_id": o.UserID, "content_id": o.TargetID}).Get(pu)
|
|
if err != nil {
|
|
r.log.Error(err)
|
|
return nil, 0, err
|
|
}
|
|
if has {
|
|
aggregate.Purchase = pu
|
|
}
|
|
|
|
aggregates[i] = aggregate
|
|
}
|
|
|
|
return aggregates, total, nil
|
|
}
|
|
|
|
// Delete 删除订单聚合根
|
|
func (r *AggregateRepositoryORM) Delete(id uint64) error {
|
|
session := r.engine.NewSession()
|
|
defer session.Close()
|
|
|
|
if err := session.Begin(); err != nil {
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
|
|
// 获取订单
|
|
o := &order.Order{}
|
|
has, err := session.ID(id).Get(o)
|
|
if err != nil {
|
|
session.Rollback()
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
if !has {
|
|
session.Rollback()
|
|
return errors.New("订单不存在")
|
|
}
|
|
|
|
// 删除支付订单
|
|
if _, err := session.Where(builder.Eq{"order_no": o.OrderNo}).Delete(&payment.Payment{}); err != nil {
|
|
session.Rollback()
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
|
|
// 删除购买记录
|
|
if _, err := session.Where(builder.Eq{"user_id": o.UserID, "content_id": o.TargetID}).Delete(&purchase.Purchase{}); err != nil {
|
|
session.Rollback()
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
|
|
// 删除订单
|
|
if _, err := session.ID(id).Delete(&order.Order{}); err != nil {
|
|
session.Rollback()
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
|
|
if err := session.Commit(); err != nil {
|
|
r.log.Error(err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|