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.

89 lines
1.9 KiB
Go

package order
import (
dto "cls/internal/application/payment"
"cls/internal/domain/order"
"cls/internal/domain/payment"
"cls/pkg/logger"
"fmt"
"time"
)
// OrderService 订单应用服务
type OrderService struct {
repo order.AggregateRepository
log logger.Logger
}
// NewOrderService 创建订单应用服务
func NewOrderService(repo order.AggregateRepository, log logger.New) *OrderService {
return &OrderService{
repo: repo,
log: log("cls:service:order"),
}
}
// CreateOrder 创建订单
func (s *OrderService) CreateOrder(req *CreateOrderRequest) (*OrderResponse, error) {
// 创建订单
o := &order.Order{
OrderNo: generateOrderNo(),
UserID: req.UserID,
TargetID: req.TargetID,
Type: req.Type,
Amount: req.Amount,
Duration: req.Duration,
Status: order.OrderStatusPending,
Description: req.Description,
}
// 创建聚合根
aggregate := order.NewOrderAggregate(o)
// 保存聚合根
if err := s.repo.Save(aggregate); err != nil {
s.log.Error(err)
return nil, err
}
return nil, nil
}
// CreatePayment 创建支付订单
func (s *OrderService) CreatePayment(orderNo string, paymentType payment.PaymentType) (*dto.PaymentResponse, error) {
// 获取订单聚合根
aggregate, err := s.repo.GetByOrderNo(orderNo)
if err != nil {
s.log.Error(err)
return nil, err
}
// 创建支付订单
if err := aggregate.CreatePayment(paymentType); err != nil {
return nil, err
}
// 保存聚合根
if err := s.repo.Save(aggregate); err != nil {
s.log.Error(err)
return nil, err
}
return dto.FromEntity(aggregate.Payment), nil
}
// DeleteOrder 删除订单
func (s *OrderService) DeleteOrder(id uint64) error {
if err := s.repo.Delete(id); err != nil {
s.log.Error(err)
return err
}
return nil
}
// generateOrderNo 生成订单号
func generateOrderNo() string {
return fmt.Sprintf("%d%d", time.Now().UnixNano()/1e6, time.Now().Unix()%1000)
}