product.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/lin-jim-leon/kuaishou"
  6. "math/rand"
  7. "strconv"
  8. "time"
  9. "youngee_b_api/consts"
  10. "youngee_b_api/db"
  11. "youngee_b_api/model/gorm_model"
  12. "youngee_b_api/model/http_model"
  13. )
  14. var Product *product
  15. type product struct {
  16. }
  17. func (*product) Create(ctx context.Context, newProduct http_model.CreateProductRequest, enterpriseID string) (*http_model.CreateProductData, error) {
  18. product := gorm_model.YounggeeProduct{
  19. ProductName: newProduct.ProductName,
  20. ProductType: newProduct.ProductType,
  21. ShopAddress: newProduct.ShopAddress,
  22. ProductPrice: newProduct.ProductPrice,
  23. ProductDetail: newProduct.ProductDetail,
  24. ProductUrl: newProduct.ProductUrl,
  25. EnterpriseID: enterpriseID,
  26. BrandName: newProduct.BrandName,
  27. }
  28. productID, err := db.CreateProduct(ctx, product)
  29. if err != nil {
  30. return nil, err
  31. }
  32. if newProduct.ProductPhotos != nil {
  33. productPhotos := []gorm_model.YounggeeProductPhoto{}
  34. for _, photo := range newProduct.ProductPhotos {
  35. productPhoto := gorm_model.YounggeeProductPhoto{
  36. PhotoUrl: photo.PhotoUrl,
  37. PhotoUid: photo.PhotoUid,
  38. Symbol: photo.Symbol,
  39. ProductID: *productID,
  40. }
  41. productPhotos = append(productPhotos, productPhoto)
  42. }
  43. err = db.CreateProductPhoto(ctx, productPhotos)
  44. if err != nil {
  45. return nil, err
  46. }
  47. }
  48. res := &http_model.CreateProductData{
  49. ProductID: *productID,
  50. }
  51. return res, nil
  52. }
  53. func (*product) Update(ctx context.Context, newProduct http_model.CreateProductRequest, enterpriseID string) (*http_model.CreateProductData, error) {
  54. fmt.Println("newProduct.ProductUrl", newProduct.ProductUrl)
  55. product := gorm_model.YounggeeProduct{
  56. ProductID: newProduct.ProductId,
  57. ProductName: newProduct.ProductName,
  58. ProductType: newProduct.ProductType,
  59. ShopAddress: newProduct.ShopAddress,
  60. ProductPrice: newProduct.ProductPrice,
  61. ProductDetail: newProduct.ProductDetail,
  62. ProductUrl: newProduct.ProductUrl,
  63. EnterpriseID: enterpriseID,
  64. BrandName: newProduct.BrandName,
  65. }
  66. productID, err := db.UpdateProduct(ctx, product)
  67. if err != nil {
  68. return nil, err
  69. }
  70. // 删除该商品之前的所有图片
  71. err = db.DeleteProductPhotoByProductID(ctx, *productID)
  72. if err != nil {
  73. return nil, err
  74. }
  75. if newProduct.ProductPhotos != nil {
  76. // 新增图片
  77. var productPhotos []gorm_model.YounggeeProductPhoto
  78. for _, photo := range newProduct.ProductPhotos {
  79. productPhoto := gorm_model.YounggeeProductPhoto{
  80. PhotoUrl: photo.PhotoUrl,
  81. PhotoUid: photo.PhotoUid,
  82. Symbol: photo.Symbol,
  83. ProductID: *productID,
  84. }
  85. productPhotos = append(productPhotos, productPhoto)
  86. }
  87. err = db.CreateProductPhoto(ctx, productPhotos)
  88. if err != nil {
  89. return nil, err
  90. }
  91. }
  92. res := &http_model.CreateProductData{
  93. ProductID: *productID,
  94. }
  95. return res, nil
  96. }
  97. func (*product) FindAll(ctx context.Context, enterpriseID string) (*http_model.FindAllProductData, error) {
  98. products, err := db.GetProductByEnterpriseID(ctx, enterpriseID)
  99. if err != nil {
  100. // 数据库查询error
  101. return nil, err
  102. }
  103. findAllProductData := http_model.FindAllProductData{}
  104. for _, product := range products {
  105. productData := http_model.ProductInfo{
  106. ProductID: product.ProductID,
  107. BrandName: product.BrandName,
  108. ProductName: product.ProductName,
  109. ProductType: consts.GetProjectTypes(product.ProductType),
  110. }
  111. findAllProductData.ProductInfos = append(findAllProductData.ProductInfos, productData)
  112. }
  113. return &findAllProductData, nil
  114. }
  115. func (*product) FindByID(ctx context.Context, productID int64) (*http_model.FindProductData, error) {
  116. product, err := db.GetProductByID(ctx, productID)
  117. if err != nil {
  118. return nil, err
  119. }
  120. if product == nil {
  121. return nil, nil
  122. }
  123. productPhotos, err := db.GetProductPhotoByProductID(ctx, productID)
  124. if err != nil {
  125. return nil, err
  126. }
  127. findProductData := http_model.FindProductData{
  128. ProductID: product.ProductID,
  129. ProductName: product.ProductName,
  130. ProductType: product.ProductType,
  131. ShopAddress: product.ShopAddress,
  132. ProductPrice: product.ProductPrice,
  133. ProductDetail: product.ProductDetail,
  134. ProductUrl: product.ProductUrl,
  135. EnterpriseID: product.EnterpriseID,
  136. BrandName: product.BrandName,
  137. }
  138. for _, photo := range productPhotos {
  139. productPhoto := http_model.ProductPhoto{
  140. PhotoUrl: photo.PhotoUrl,
  141. PhotoUid: photo.PhotoUid,
  142. Symbol: photo.Symbol,
  143. }
  144. findProductData.ProductPhotos = append(findProductData.ProductPhotos, productPhoto)
  145. }
  146. return &findProductData, nil
  147. }
  148. func (*product) FindByName(ctx context.Context, brandName string, productName string) (*int64, error) {
  149. productID, err := db.GetProductIDByName(ctx, brandName, productName)
  150. if err != nil {
  151. return nil, err
  152. }
  153. return productID, nil
  154. }
  155. func (*product) GetAllProduct(ctx context.Context, req *http_model.GetAllProductRequest, enterpriseID string) (*http_model.ProjectBriefInfoPreview, error) {
  156. ProjectBriefInfo, total, err := db.GetAllProduct(ctx, req, enterpriseID)
  157. if err != nil {
  158. return nil, err
  159. }
  160. ProjectBriefInfoPreview := new(http_model.ProjectBriefInfoPreview)
  161. ProjectBriefInfoPreview.ProjectBriefInfo = ProjectBriefInfo
  162. ProjectBriefInfoPreview.Total = strconv.FormatInt(total, 10)
  163. return ProjectBriefInfoPreview, nil
  164. }
  165. // QueryKuaishouProduct 通过快手商品ID从SDK拉取快手商品信息
  166. func (*product) QueryKuaishouProduct(ctx context.Context, newKuaishouProduct http_model.FindKuaishouProductRequest) (*http_model.FindKuaishouProductData, error) {
  167. appKey := "ks651333097154138217"
  168. signSecret := "bf6393dce0a2b669ee348bebb837b0da"
  169. //var SignSecret string = "dBt0rVRhTpUqcrOYGGpv0A"
  170. // 1. 拿到快手的AccessToken
  171. kuaishouUserInfo, userErr := db.FindUserInfoByTalentId(ctx, "214300313")
  172. if userErr != nil {
  173. return nil, userErr
  174. }
  175. fmt.Println(kuaishouUserInfo.Gender)
  176. // 2. 可能需要刷新Token
  177. //newAccessToken, Tokenerr := kuaishou.RefreshAccessToken(kuaishouUserInfo.RefreshToken, appKey, SignSecret)
  178. //if Tokenerr != nil {
  179. // return nil, Tokenerr
  180. //}
  181. //fmt.Println(newAccessToken.AccessToken)
  182. // 3. 查找对应的快手商品
  183. kuaishouProduct, err := kuaishou.Queryselectiondetail(appKey, signSecret, "ChFvYXV0aC5hY2Nlc3NUb2tlbhJgVUcKpMMPhw6IsRe6j49Z_u5HNB4X4mEcFrPKQ6S4adSCGiJ_fnoNzQOfv5hv2iCI3jEU380e44aG0fH5cqVrghZWQxs-LlatHGWltM2einjuMdOLU-hw_-7gAgg46DHaGhJwAv7lQ4RI-YbDWturzqUxgFYiIH7EzXN1tK4s3OnxyrD227gtYmLoDs0jsnXzYvhocbBeKAUwAQ", newKuaishouProduct.ItemList)
  184. if err != nil {
  185. fmt.Println("快手错误信息: ", err)
  186. return nil, err
  187. }
  188. // 4. 组织返回数据
  189. findKuaishouProductData := http_model.FindKuaishouProductData{
  190. ProductName: kuaishouProduct.ItemList[0].ItemTitle,
  191. ProductPrice: float64(kuaishouProduct.ItemList[0].ItemPrice) * 0.01,
  192. ExclusiveCommission: float64(kuaishouProduct.ItemList[0].CommissionRate) * 0.1,
  193. CommissionPrice: float64(kuaishouProduct.ItemList[0].ProfitAmount) * 0.01,
  194. KuaishouMainPhoto: kuaishouProduct.ItemList[0].ItemImgURL,
  195. KuaishouCarousePhotoList: kuaishouProduct.ItemList[0].ItemGalleryURLs,
  196. KuaishouDetailPhotoList: kuaishouProduct.ItemList[0].ItemDescURLs,
  197. MerchantSoldCountThirtyDays: kuaishouProduct.ItemList[0].MerchantSoldCountThirtyDays,
  198. KuaishouProductId: kuaishouProduct.ItemList[0].ItemID,
  199. }
  200. // 5. 图片数据结构化
  201. // 5.1. 主图
  202. var currProductMainPhoto *http_model.ProductPhoto
  203. rand.Seed(time.Now().UnixNano())
  204. currProductMainPhoto = &http_model.ProductPhoto{
  205. PhotoUrl: findKuaishouProductData.KuaishouMainPhoto,
  206. PhotoUid: generateRandomString(10),
  207. Symbol: 1,
  208. }
  209. findKuaishouProductData.ProductPhotos = append(findKuaishouProductData.ProductPhotos, currProductMainPhoto)
  210. // 5.2. 轮播图
  211. for _, url := range findKuaishouProductData.KuaishouCarousePhotoList {
  212. var currProductPhoto *http_model.ProductPhoto
  213. rand.Seed(time.Now().UnixNano())
  214. currProductPhoto = &http_model.ProductPhoto{
  215. PhotoUrl: url,
  216. PhotoUid: generateRandomString(10),
  217. Symbol: 2,
  218. }
  219. findKuaishouProductData.ProductPhotos = append(findKuaishouProductData.ProductPhotos, currProductPhoto)
  220. }
  221. // 5.3. 详情图
  222. for _, url := range findKuaishouProductData.KuaishouDetailPhotoList {
  223. var currProductPhoto *http_model.ProductPhoto
  224. rand.Seed(time.Now().UnixNano())
  225. currProductPhoto = &http_model.ProductPhoto{
  226. PhotoUrl: url,
  227. PhotoUid: generateRandomString(10),
  228. Symbol: 4,
  229. }
  230. findKuaishouProductData.ProductPhotos = append(findKuaishouProductData.ProductPhotos, currProductPhoto)
  231. }
  232. return &findKuaishouProductData, err
  233. }
  234. const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  235. var seededRand *rand.Rand = rand.New(rand.NewSource(time.Now().UnixNano()))
  236. func generateRandomString(length int) string {
  237. b := make([]byte, length)
  238. for i := range b {
  239. b[i] = charset[seededRand.Intn(len(charset))]
  240. }
  241. return string(b)
  242. }
  243. /*
  244. type T struct {
  245. CreatedAt time.Time `json:"CreatedAt"`
  246. UpdatedAt time.Time `json:"UpdatedAt"`
  247. ProductUrl string `json:"ProductUrl"`
  248. SalesCount string `json:"SalesCount"`
  249. ProductId int `json:"product_id"`
  250. ProductName string `json:"ProductName"`
  251. ProductType int `json:"ProductType"`
  252. EnterpriseID string `json:"EnterpriseID"`
  253. ProductPrice int `json:"ProductPrice"`
  254. SubAccountID int `json:"SubAccountID"`
  255. ProductDetail string `json:"ProductDetail"`
  256. CommissionPrice int `json:"CommissionPrice"`
  257. ProductCategory string `json:"ProductCategory"`
  258. PublicCommission int `json:"PublicCommission"`
  259. KuaishouProductId string `json:"KuaishouProductId"`
  260. ExclusiveCommission int `json:"ExclusiveCommission"`
  261. }
  262. type T struct {
  263. Symbol int `json:"Symbol"`
  264. StoreID int `json:"StoreID"`
  265. PhotoUid string `json:"PhotoUid"`
  266. PhotoUrl string `json:"PhotoUrl"`
  267. CreatedAt time.Time `json:"CreatedAt"`
  268. ProductID int `json:"ProductID"`
  269. TeamBuyingID int `json:"TeamBuyingID"`
  270. ProductPhotoID int `json:"ProductPhotoID"`
  271. ProductPhotoType int `json:"ProductPhotoType"`
  272. }
  273. */