order_service.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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: officialUser.ID,
  65. TemplateUserID: templateUser.Id,
  66. ProductID: productId,
  67. TotalAmount: productInfo.Price.String(),
  68. })
  69. if err != nil {
  70. logger.Error("创建订单失败:%v", err)
  71. if errors.Is(err, gorm.ErrDuplicatedKey) {
  72. err = exception.NewWithException(exception.SubscribeFailed, "请勿重复下单")
  73. return
  74. }
  75. err = exception.NewWithException(exception.SubscribeFailed, err.Error())
  76. return
  77. }
  78. buyer := BuyerInfo{
  79. Name: officialUser.RealName,
  80. Mobile: templateUser.Mobile,
  81. AreaCode: templateUser.AreaCode,
  82. }
  83. var duration string
  84. if !productInfo.IsPermanent {
  85. beginDate := time.Now().Format(time.DateOnly)
  86. endDate := time.Now().Add(time.Duration(productInfo.ValidDays*24) * time.Hour).Format(time.DateOnly)
  87. duration = fmt.Sprintf("%s~%s", beginDate, endDate)
  88. } else {
  89. duration = permanentlyValid
  90. }
  91. product := ProductInfo{
  92. Name: productInfo.Title,
  93. Type: productInfo.Type,
  94. Price: productInfo.Price.String(),
  95. ValidDuration: duration,
  96. }
  97. orderInfo = ProductOrderInfo{
  98. Buyer: buyer,
  99. ProductInfo: product,
  100. OrderNo: orderNo,
  101. }
  102. return
  103. }
  104. func PreViewProductOrder(templateUser user.User, productId int) (orderInfo ProductOrderInfo, err error) {
  105. if productId <= 0 {
  106. err = exception.New(exception.IllegalProductId)
  107. }
  108. productInfo, err := productService.GetMerchantProductById(productId)
  109. if err != nil {
  110. err = exception.NewWithException(exception.ProductInfoError, err.Error())
  111. return
  112. }
  113. if productInfo.SaleStatus == OffSale {
  114. err = exception.New(exception.ProductOffSale)
  115. return
  116. }
  117. officialUser, err := userService.GetUserByTemplateUserId(templateUser.Id)
  118. if err != nil {
  119. if errors.Is(err, gorm.ErrRecordNotFound) {
  120. err = exception.New(exception.OfficialUserNotFound)
  121. } else {
  122. err = exception.NewWithException(exception.OfficialUserFoundError, err.Error())
  123. }
  124. return
  125. }
  126. buyer := BuyerInfo{
  127. Name: officialUser.RealName,
  128. Mobile: templateUser.Mobile,
  129. AreaCode: templateUser.AreaCode,
  130. }
  131. var duration string
  132. if !productInfo.IsPermanent {
  133. beginDate := time.Now().Format(time.DateOnly)
  134. endDate := time.Now().Add(time.Duration(productInfo.ValidDays*24) * time.Hour).Format(time.DateOnly)
  135. duration = fmt.Sprintf("%s~%s", beginDate, endDate)
  136. } else {
  137. duration = permanentlyValid
  138. }
  139. product := ProductInfo{
  140. Name: productInfo.Title,
  141. Type: productInfo.Type,
  142. Price: productInfo.Price.String(),
  143. ValidDuration: duration,
  144. }
  145. orderInfo = ProductOrderInfo{
  146. Buyer: buyer,
  147. ProductInfo: product,
  148. }
  149. return
  150. }
  151. func GetTotalPageCountByUserId(userId int, orderStatus string) (total int64, latestId int64) {
  152. return orderService.GetTotalPageCountByUserId(userId, orderStatus)
  153. }
  154. func GetOrderPage(pageInfo page.PageInfo, userId int, orderStatus string) (orderList []orderService.ProductOrderDTO, err error) {
  155. orderList, err = orderService.GetOrderPage(pageInfo, userId, orderStatus)
  156. if err != nil {
  157. err = exception.NewWithException(exception.GetOrderListFailed, err.Error())
  158. }
  159. var wg sync.WaitGroup
  160. wg.Add(len(orderList))
  161. logger.Info("获取产品信息")
  162. for i := 0; i < len(orderList); i++ {
  163. go func(order *orderService.ProductOrderDTO) {
  164. defer wg.Done()
  165. product, pdErr := productService.GetMerchantProductById(order.ProductID)
  166. if pdErr != nil {
  167. logger.Error("获取产品信息失败:%v", err)
  168. }
  169. order.ProductName = product.Title
  170. }(&orderList[i])
  171. }
  172. wg.Wait()
  173. return
  174. }
  175. func GetOrderDetail(productId int, userId int) (order orderService.ProductOrderDetailDTO, err error) {
  176. order, err = orderService.GetOrderDetail(productId, userId)
  177. return
  178. }
  179. func GetProductOrderByUser(templateUserId int, orderNo string) (order orderService.ProductOrderDTO, err error) {
  180. return orderService.GetOrderByUser(templateUserId, orderNo)
  181. }
  182. func CloseProductOrder(templateUserId int, productOrderNo string) (err error) {
  183. return orderService.CloseProductOrder(templateUserId, productOrderNo)
  184. }