product.go 11 KB

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