order_service.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package order
  2. import (
  3. "errors"
  4. logger "eta/eta_mini_ht_api/common/component/log"
  5. "eta/eta_mini_ht_api/common/exception"
  6. "eta/eta_mini_ht_api/common/utils/page"
  7. productService "eta/eta_mini_ht_api/domian/merchant"
  8. orderService "eta/eta_mini_ht_api/domian/order"
  9. userService "eta/eta_mini_ht_api/domian/user"
  10. "eta/eta_mini_ht_api/service/user"
  11. "fmt"
  12. "gorm.io/gorm"
  13. "sync"
  14. "time"
  15. )
  16. const (
  17. permanentlyValid = "永久有效"
  18. OnSale = "on_sale" //上架
  19. OffSale = "off_sale" //下架
  20. )
  21. type ProductOrderInfo struct {
  22. Buyer BuyerInfo `json:"buyer"`
  23. ProductInfo ProductInfo `json:"productInfo"`
  24. OrderNo string `json:"orderNo"`
  25. }
  26. type ProductInfo struct {
  27. Name string
  28. Type string
  29. Price string
  30. ValidDuration string
  31. }
  32. type BuyerInfo struct {
  33. Name string
  34. Mobile string
  35. AreaCode string
  36. }
  37. func GenerateProductOrderNo() string {
  38. return orderService.GenerateProductOrderNo()
  39. }
  40. func CreateProductOrder(templateUser user.User, productId int, orderNo string) (orderInfo ProductOrderInfo, err error) {
  41. if productId <= 0 {
  42. err = exception.New(exception.IllegalProductId)
  43. }
  44. productInfo, err := productService.GetMerchantProductById(productId)
  45. if err != nil {
  46. err = exception.NewWithException(exception.ProductInfoError, err.Error())
  47. return
  48. }
  49. if productInfo.SaleStatus == OffSale {
  50. err = exception.New(exception.ProductOffSale)
  51. return
  52. }
  53. officialUser, err := userService.GetUserByTemplateUserId(templateUser.Id)
  54. if err != nil {
  55. if errors.Is(err, gorm.ErrRecordNotFound) {
  56. err = exception.New(exception.OfficialUserNotFound)
  57. } else {
  58. err = exception.NewWithException(exception.OfficialUserFoundError, err.Error())
  59. }
  60. return
  61. }
  62. orderNo, err = orderService.CreateProductOrder(orderService.ProductOrderDTO{
  63. OrderID: orderNo,
  64. UserID: templateUser.Id,
  65. ProductID: productId,
  66. TotalAmount: productInfo.Price.String(),
  67. })
  68. if err != nil {
  69. logger.Error("创建订单失败:%v", err)
  70. if errors.Is(err, gorm.ErrDuplicatedKey) {
  71. err = exception.NewWithException(exception.SubscribeFailed, "请勿重复下单")
  72. return
  73. }
  74. err = exception.NewWithException(exception.SubscribeFailed, err.Error())
  75. return
  76. }
  77. buyer := BuyerInfo{
  78. Name: officialUser.RealName,
  79. Mobile: templateUser.Mobile,
  80. AreaCode: templateUser.AreaCode,
  81. }
  82. var duration string
  83. if !productInfo.IsPermanent {
  84. beginDate := time.Now().Format(time.DateOnly)
  85. endDate := time.Now().Add(time.Duration(productInfo.ValidDays*24) * time.Hour).Format(time.DateOnly)
  86. duration = fmt.Sprintf("%s~%s", beginDate, endDate)
  87. } else {
  88. duration = permanentlyValid
  89. }
  90. product := ProductInfo{
  91. Name: productInfo.Title,
  92. Type: productInfo.Type,
  93. Price: productInfo.Price.String(),
  94. ValidDuration: duration,
  95. }
  96. orderInfo = ProductOrderInfo{
  97. Buyer: buyer,
  98. ProductInfo: product,
  99. OrderNo: orderNo,
  100. }
  101. return
  102. }
  103. func GetTotalPageCountByUserId(userId int, orderStatus string) (total int64, latestId int64) {
  104. return orderService.GetTotalPageCountByUserId(userId, orderStatus)
  105. }
  106. func GetOrderPage(pageInfo page.PageInfo, userId int, orderStatus string) (orderList []orderService.ProductOrderDTO, err error) {
  107. orderList, err = orderService.GetOrderPage(pageInfo, userId, orderStatus)
  108. if err != nil {
  109. err = exception.NewWithException(exception.GetOrderListFailed, err.Error())
  110. }
  111. var wg sync.WaitGroup
  112. wg.Add(len(orderList))
  113. logger.Info("获取产品信息")
  114. for i := 0; i < len(orderList); i++ {
  115. go func(order *orderService.ProductOrderDTO) {
  116. defer wg.Done()
  117. product, pdErr := productService.GetMerchantProductById(order.ProductID)
  118. if pdErr != nil {
  119. logger.Error("获取产品信息失败:%v", err)
  120. }
  121. order.ProductName = product.Title
  122. }(&orderList[i])
  123. }
  124. wg.Wait()
  125. return
  126. }
  127. func GetOrderDetail(productId int, userId int) (order orderService.ProductOrderDetailDTO, err error) {
  128. order, err = orderService.GetOrderDetail(productId, userId)
  129. productInfo, err := productService.GetMerchantProductById(order.ProductID)
  130. if err != nil {
  131. return
  132. }
  133. order.ProductName = productInfo.Title
  134. order.ProductPrice = productInfo.Price.String()
  135. return
  136. }