product.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  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.FindUserInfoByOpenId(ctx, "f1b0d3a11c24fcde14bf5724d0d1cdfc")
  173. if userErr != nil {
  174. return nil, userErr
  175. }
  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, kuaishouUserInfo.AccessToken, 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. currLastIndex := strings.LastIndex(findKuaishouProductData.KuaishouMainPhoto, "/")
  205. var currDesiredFileName string
  206. if currLastIndex != -1 {
  207. currDesiredFileName = findKuaishouProductData.KuaishouMainPhoto[currLastIndex+1:]
  208. } else {
  209. currDesiredFileName = "FileNotFound"
  210. }
  211. currProductMainPhoto = &http_model.ProductPhoto{
  212. PhotoUrl: findKuaishouProductData.KuaishouMainPhoto,
  213. Name: currDesiredFileName,
  214. PhotoUid: generateRandomString(10),
  215. Symbol: 1,
  216. }
  217. findKuaishouProductData.ProductPhotos = append(findKuaishouProductData.ProductPhotos, currProductMainPhoto)
  218. // 5.2. 轮播图
  219. for _, url := range findKuaishouProductData.KuaishouCarousePhotoList {
  220. var currProductPhoto *http_model.ProductPhoto
  221. rand.Seed(time.Now().UnixNano())
  222. lastIndex := strings.LastIndex(url, "/")
  223. var desiredFileName string
  224. if lastIndex != -1 {
  225. desiredFileName = url[lastIndex+1:]
  226. } else {
  227. desiredFileName = "FileNotFound"
  228. }
  229. currProductPhoto = &http_model.ProductPhoto{
  230. PhotoUrl: url,
  231. Name: desiredFileName,
  232. PhotoUid: generateRandomString(10),
  233. Symbol: 2,
  234. }
  235. findKuaishouProductData.ProductPhotos = append(findKuaishouProductData.ProductPhotos, currProductPhoto)
  236. }
  237. // 5.3. 详情图
  238. for _, url := range findKuaishouProductData.KuaishouDetailPhotoList {
  239. var currProductPhoto *http_model.ProductPhoto
  240. rand.Seed(time.Now().UnixNano())
  241. lastIndex := strings.LastIndex(url, "/")
  242. var desiredFileName string
  243. if lastIndex != -1 {
  244. desiredFileName = url[lastIndex+1:]
  245. } else {
  246. desiredFileName = "FileNotFound"
  247. }
  248. currProductPhoto = &http_model.ProductPhoto{
  249. PhotoUrl: url,
  250. Name: desiredFileName,
  251. PhotoUid: generateRandomString(10),
  252. Symbol: 4,
  253. }
  254. findKuaishouProductData.ProductPhotos = append(findKuaishouProductData.ProductPhotos, currProductPhoto)
  255. }
  256. return &findKuaishouProductData, err
  257. }
  258. const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  259. var seededRand *rand.Rand = rand.New(rand.NewSource(time.Now().UnixNano()))
  260. func generateRandomString(length int) string {
  261. b := make([]byte, length)
  262. for i := range b {
  263. b[i] = charset[seededRand.Intn(len(charset))]
  264. }
  265. return string(b)
  266. }
  267. /*
  268. type T struct {
  269. CreatedAt time.Time `json:"CreatedAt"`
  270. UpdatedAt time.Time `json:"UpdatedAt"`
  271. ProductUrl string `json:"ProductUrl"`
  272. SalesCount string `json:"SalesCount"`
  273. ProductId int `json:"product_id"`
  274. ProductName string `json:"ProductName"`
  275. ProductType int `json:"ProductType"`
  276. EnterpriseID string `json:"EnterpriseID"`
  277. ProductPrice int `json:"ProductPrice"`
  278. SubAccountID int `json:"SubAccountID"`
  279. ProductDetail string `json:"ProductDetail"`
  280. CommissionPrice int `json:"CommissionPrice"`
  281. ProductCategory string `json:"ProductCategory"`
  282. PublicCommission int `json:"PublicCommission"`
  283. KuaishouProductId string `json:"KuaishouProductId"`
  284. ExclusiveCommission int `json:"ExclusiveCommission"`
  285. }
  286. type T struct {
  287. Symbol int `json:"Symbol"`
  288. StoreID int `json:"StoreID"`
  289. PhotoUid string `json:"PhotoUid"`
  290. PhotoUrl string `json:"PhotoUrl"`
  291. CreatedAt time.Time `json:"CreatedAt"`
  292. ProductID int `json:"ProductID"`
  293. TeamBuyingID int `json:"TeamBuyingID"`
  294. ProductPhotoID int `json:"ProductPhotoID"`
  295. ProductPhotoType int `json:"ProductPhotoType"`
  296. }
  297. */