|
@@ -6,13 +6,21 @@ import (
|
|
|
"github.com/chromedp/chromedp"
|
|
|
"github.com/gogf/gf/frame/g"
|
|
|
"github.com/gogf/gf/net/ghttp"
|
|
|
+ "github.com/gogf/gf/os/gtime"
|
|
|
"github.com/lin-jim-leon/kuaishou/open/merchant"
|
|
|
+ "github.com/lin-jim-leon/kuaishou/open/user"
|
|
|
"log"
|
|
|
"time"
|
|
|
"youngmini_server/app/model/youngee_talent_model"
|
|
|
"youngmini_server/app/utils"
|
|
|
)
|
|
|
|
|
|
+const (
|
|
|
+ ClientKey = "ks651333097154138217"
|
|
|
+ ClientSecret = "dBt0rVRhTpUqcrOYGGpv0A"
|
|
|
+ SignSecret = "bf6393dce0a2b669ee348bebb837b0da"
|
|
|
+)
|
|
|
+
|
|
|
func GetQrcode(r *ghttp.Request) *TalentHttpResult {
|
|
|
//达人id获取
|
|
|
tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
|
|
@@ -59,6 +67,7 @@ func GetQrcode(r *ghttp.Request) *TalentHttpResult {
|
|
|
return &TalentHttpResult{Code: 0, Msg: "success", Data: text}
|
|
|
}
|
|
|
|
|
|
+// 检查数据库表中是否有达人对应的数据
|
|
|
func CheckAccount(r *ghttp.Request) *TalentHttpResult {
|
|
|
fmt.Println("into check")
|
|
|
//达人id获取
|
|
@@ -77,6 +86,101 @@ func CheckAccount(r *ghttp.Request) *TalentHttpResult {
|
|
|
return &TalentHttpResult{Code: 0, Msg: "success", Data: userInfo}
|
|
|
}
|
|
|
|
|
|
+// 检查数据库表中是否有达人对应的数据,有就删掉,/kuaishouath中会插入。
|
|
|
+func CheckNewAccount(r *ghttp.Request) *TalentHttpResult {
|
|
|
+ //check到了更新时间在两秒内的插入的数据。则说明已绑定。弹窗消失。
|
|
|
+ //达人id获取
|
|
|
+ tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
|
|
|
+ if err != nil {
|
|
|
+ return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
|
|
|
+ }
|
|
|
+ // 获取当前时间
|
|
|
+ currentTime := gtime.Now()
|
|
|
+ // 查询数据库中是否有符合条件的数据
|
|
|
+ userInfo := &youngee_talent_model.KuaishouUserInfo{}
|
|
|
+ err = g.DB().Model("platform_kuaishou_user_info").
|
|
|
+ Where("talent_id = ?", tid).
|
|
|
+ Scan(&userInfo)
|
|
|
+ if err != nil {
|
|
|
+ return &TalentHttpResult{Code: -2, Msg: "platform_kuaishou_user_info query failed"}
|
|
|
+ }
|
|
|
+ //找到数据,判断时间差
|
|
|
+ if userInfo != nil {
|
|
|
+ // 计算创建时间与当前时间的差值
|
|
|
+ timeDiff := currentTime.Sub(userInfo.CreateTime)
|
|
|
+ fmt.Println("***********kifasfa", timeDiff)
|
|
|
+ if timeDiff <= 3*time.Second {
|
|
|
+ return &TalentHttpResult{Code: 0, Msg: "success", Data: nil}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 如果没有符合条件的数据,返回失败
|
|
|
+ return &TalentHttpResult{Code: -20, Msg: "No valid data found", Data: nil}
|
|
|
+}
|
|
|
+func CheckTokenExp(r *ghttp.Request) *TalentHttpResult {
|
|
|
+ //达人id获取
|
|
|
+ tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
|
|
|
+ if err != nil {
|
|
|
+ return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
|
|
|
+ }
|
|
|
+ key, err1 := g.DB().Model("platform_kuaishou_user_info").Fields("access_token").Where("talent_id = ?", tid).Value()
|
|
|
+ if err1 != nil {
|
|
|
+ return &TalentHttpResult{Code: -1, Msg: "query database fail"}
|
|
|
+ }
|
|
|
+ AccessToken := key.String()
|
|
|
+ res_info, err2 := user.GetUserinfo(ClientKey, AccessToken)
|
|
|
+ if err2 != nil {
|
|
|
+ //前端接收code=-2表示token过期
|
|
|
+ return &TalentHttpResult{Code: -2, Msg: "accessToken过期", Data: nil}
|
|
|
+ }
|
|
|
+ // 查询成功,返回成功结果和数据
|
|
|
+ return &TalentHttpResult{Code: 0, Msg: "success", Data: res_info}
|
|
|
+}
|
|
|
+
|
|
|
+func AddWindow(r *ghttp.Request) *TalentHttpResult {
|
|
|
+ pId := r.GetString("product_id")
|
|
|
+ //pId := "66666"
|
|
|
+
|
|
|
+ //通过pId获取kuaishou_product_id
|
|
|
+ pIdSlice := []string{pId}
|
|
|
+ //达人id获取
|
|
|
+ tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
|
|
|
+ if err != nil {
|
|
|
+ return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
|
|
|
+ }
|
|
|
+ key, err1 := g.DB().Model("platform_kuaishou_user_info").Fields("access_token").Where("talent_id = ?", tid).Value()
|
|
|
+ if err1 != nil {
|
|
|
+ return &TalentHttpResult{Code: -2, Msg: "query database fail"}
|
|
|
+ }
|
|
|
+ AccessToken := key.String()
|
|
|
+ res_info, err2 := merchant.AddItemsToShelf(ClientKey, SignSecret, AccessToken, pIdSlice)
|
|
|
+ if err2 != nil {
|
|
|
+ //前端接收code=-3表示添加失敗,沒有開通
|
|
|
+ return &TalentHttpResult{Code: -3, Msg: "未開通、商品不存在或已下线", Data: nil}
|
|
|
+ }
|
|
|
+ // 查询成功,返回成功结果和数据
|
|
|
+ return &TalentHttpResult{Code: 0, Msg: "加入橱窗成功", Data: res_info}
|
|
|
+}
|
|
|
+func GetKuaishouFansNum(r *ghttp.Request) *TalentHttpResult {
|
|
|
+ //达人id获取
|
|
|
+ tid, err := utils.SessionTalentInfo.GetTalentIdFromSession(r)
|
|
|
+ fmt.Println("********&&&&&&&&&&,tid", tid)
|
|
|
+ if err != nil {
|
|
|
+ return &TalentHttpResult{Code: -1, Msg: "Get talent id failed"}
|
|
|
+ }
|
|
|
+ key, err1 := g.DB().Model("platform_kuaishou_user_info").Fields("access_token").Where("talent_id = ?", tid).Value()
|
|
|
+ if err1 != nil {
|
|
|
+ return &TalentHttpResult{Code: -2, Msg: "query database fail"}
|
|
|
+ }
|
|
|
+ AccessToken := key.String()
|
|
|
+ res_user, err2 := user.GetUserinfo(ClientKey, AccessToken)
|
|
|
+ if err2 != nil {
|
|
|
+ //前端接收code=-3表示添加失敗,沒有開通
|
|
|
+ return &TalentHttpResult{Code: -3, Msg: "获取快手用户信息出错", Data: nil}
|
|
|
+ }
|
|
|
+ // 查询成功,返回成功结果和数据
|
|
|
+ return &TalentHttpResult{Code: 0, Msg: "获取快手用户信息成功", Data: res_user.Data}
|
|
|
+}
|
|
|
+
|
|
|
func QuerySalesFor30Days(r *ghttp.Request) *TalentHttpResult {
|
|
|
fmt.Println("into querySalesFor30Days")
|
|
|
ClientKey := "ks651333097154138217"
|
|
@@ -94,12 +198,8 @@ func QuerySalesFor30Days(r *ghttp.Request) *TalentHttpResult {
|
|
|
// 处理错误
|
|
|
fmt.Println("Error querying access_token:", err)
|
|
|
}
|
|
|
-
|
|
|
// 输出查询到的 access_token 值
|
|
|
fmt.Println("Access Token:", AccessToken)
|
|
|
-
|
|
|
- //循环使用接口
|
|
|
- //
|
|
|
// 获取当前时间的时间戳(毫秒)
|
|
|
currentTime := time.Now().UnixNano() / int64(time.Millisecond)
|
|
|
// 30天前的时间戳(毫秒)
|
|
@@ -131,11 +231,112 @@ func QuerySalesFor30Days(r *ghttp.Request) *TalentHttpResult {
|
|
|
return &TalentHttpResult{Code: 0, Msg: "获取30天销售量成功", Data: saleNum}
|
|
|
}
|
|
|
|
|
|
+func QueryOkSaleNum(r *ghttp.Request) *TalentHttpResult {
|
|
|
+ tid, _ := utils.SessionTalentInfo.GetTalentIdFromSession(r)
|
|
|
+ // 创建一个 KuaishouUserInfo 结构体的实例
|
|
|
+ userInfo := &youngee_talent_model.KuaishouUserInfo{}
|
|
|
+
|
|
|
+ // 查询数据库中的 access_token 字段
|
|
|
+ // 使用 g.DB() 获取数据库连接,并执行查询
|
|
|
+ key, err := g.DB().Model(userInfo).Fields("access_token").Where("talent_id = ?", tid).Value()
|
|
|
+ AccessToken := key.String()
|
|
|
+ if err != nil {
|
|
|
+ // 处理错误
|
|
|
+ fmt.Println("Error querying access_token:", err)
|
|
|
+ }
|
|
|
+ if key == nil {
|
|
|
+ // 处理错误
|
|
|
+ fmt.Println("can not find talentId's bindinfo :", err)
|
|
|
+ }
|
|
|
+ //循环使用接口
|
|
|
+ //
|
|
|
+ // 获取当前时间的时间戳(毫秒)
|
|
|
+ currentTime := time.Now().UnixNano() / int64(time.Millisecond)
|
|
|
+ // 90天前的时间戳(毫秒)
|
|
|
+ beginTime90DaysAgo := currentTime - 90*24*60*60*1000
|
|
|
+ // 定义每段查询的天数
|
|
|
+ intervalDays := 7
|
|
|
+ intervalMillis := int64(intervalDays * 24 * 60 * 60 * 1000)
|
|
|
+
|
|
|
+ // 初始化 beginTime 和 endTime
|
|
|
+ beginTime := beginTime90DaysAgo
|
|
|
+ endTime := beginTime + intervalMillis
|
|
|
+ saleNum := 0 //90天总销量
|
|
|
+ // 循环查询,先处理四个7天的时间段
|
|
|
+ for i := 0; i < 12; i++ {
|
|
|
+ // 调整 endTime,确保不会超过当前时间
|
|
|
+ if endTime > currentTime {
|
|
|
+ endTime = currentTime
|
|
|
+ }
|
|
|
+ saleNum += GetSaleNumByDayInterval_Ok(ClientKey, SignSecret, AccessToken, beginTime, endTime)
|
|
|
+ // 更新时间段
|
|
|
+ beginTime = endTime
|
|
|
+ endTime = beginTime + intervalMillis
|
|
|
+ }
|
|
|
+
|
|
|
+ // 最后处理剩余的6天时间段
|
|
|
+ endTime = currentTime
|
|
|
+ saleNum += GetSaleNumByDayInterval_Ok(ClientKey, SignSecret, AccessToken, beginTime, endTime)
|
|
|
+ // 查询成功,返回成功结果和数据
|
|
|
+ return &TalentHttpResult{Code: 0, Msg: "获取30天销售量成功", Data: saleNum}
|
|
|
+}
|
|
|
+
|
|
|
+func QuerySalesFor90Days(r *ghttp.Request) *TalentHttpResult {
|
|
|
+ tid, _ := utils.SessionTalentInfo.GetTalentIdFromSession(r)
|
|
|
+ // 创建一个 KuaishouUserInfo 结构体的实例
|
|
|
+ userInfo := &youngee_talent_model.KuaishouUserInfo{}
|
|
|
+
|
|
|
+ // 查询数据库中的 access_token 字段
|
|
|
+ // 使用 g.DB() 获取数据库连接,并执行查询
|
|
|
+ key, err := g.DB().Model(userInfo).Fields("access_token").Where("talent_id = ?", tid).Value()
|
|
|
+ AccessToken := key.String()
|
|
|
+ if err != nil {
|
|
|
+ // 处理错误
|
|
|
+ fmt.Println("Error querying access_token:", err)
|
|
|
+ }
|
|
|
+ if key == nil {
|
|
|
+ // 处理错误
|
|
|
+ fmt.Println("can not find talentId's bindinfo :", err)
|
|
|
+ }
|
|
|
+ //循环使用接口
|
|
|
+ //
|
|
|
+ // 获取当前时间的时间戳(毫秒)
|
|
|
+ currentTime := time.Now().UnixNano() / int64(time.Millisecond)
|
|
|
+ // 30天前的时间戳(毫秒)
|
|
|
+ beginTime90DaysAgo := currentTime - 90*24*60*60*1000
|
|
|
+ // 定义每段查询的天数
|
|
|
+ intervalDays := 7
|
|
|
+ intervalMillis := int64(intervalDays * 24 * 60 * 60 * 1000)
|
|
|
+
|
|
|
+ // 初始化 beginTime 和 endTime
|
|
|
+ beginTime := beginTime90DaysAgo
|
|
|
+ endTime := beginTime + intervalMillis
|
|
|
+ saleNum := 0 //90天总销量
|
|
|
+ // 循环查询,先处理四个7天的时间段
|
|
|
+ for i := 0; i < 12; i++ {
|
|
|
+ // 调整 endTime,确保不会超过当前时间
|
|
|
+ if endTime > currentTime {
|
|
|
+ endTime = currentTime
|
|
|
+ }
|
|
|
+ saleNum += GetSaleNumByDayInterval(ClientKey, SignSecret, AccessToken, beginTime, endTime)
|
|
|
+ // 更新时间段
|
|
|
+ beginTime = endTime
|
|
|
+ endTime = beginTime + intervalMillis
|
|
|
+ }
|
|
|
+
|
|
|
+ // 最后处理剩余的6天时间段
|
|
|
+ endTime = currentTime
|
|
|
+ saleNum += GetSaleNumByDayInterval(ClientKey, SignSecret, AccessToken, beginTime, endTime)
|
|
|
+ // 查询成功,返回成功结果和数据
|
|
|
+ return &TalentHttpResult{Code: 0, Msg: "获取30天销售量成功", Data: saleNum}
|
|
|
+}
|
|
|
+
|
|
|
func GetSaleNumByDayInterval(ClientKey string, SignSecret string, AccessToken string, beginTime int64, endTime int64) int {
|
|
|
pageSize := 100
|
|
|
totalSaleNum := 0
|
|
|
|
|
|
// 定义要查询的订单状态
|
|
|
+ // [30:已付款] [50:已收货] [60:已结算] [80:已失效]
|
|
|
statuses := []int{30, 50, 60}
|
|
|
|
|
|
// 遍历所有订单状态并调用 Corderlist 函数
|
|
@@ -187,3 +388,61 @@ func GetSaleNumByDayInterval(ClientKey string, SignSecret string, AccessToken st
|
|
|
}
|
|
|
return totalSaleNum
|
|
|
}
|
|
|
+
|
|
|
+func GetSaleNumByDayInterval_Ok(ClientKey string, SignSecret string, AccessToken string, beginTime int64, endTime int64) int {
|
|
|
+ pageSize := 100
|
|
|
+ totalSaleNum := 0
|
|
|
+
|
|
|
+ // 定义要查询的订单状态
|
|
|
+ // [30:已付款] [50:已收货] [60:已结算] [80:已失效]
|
|
|
+ statuses := []int{60}
|
|
|
+
|
|
|
+ // 遍历所有订单状态并调用 Corderlist 函数
|
|
|
+ for _, status := range statuses {
|
|
|
+ // 初始化 pcursor
|
|
|
+ pcursor := ""
|
|
|
+
|
|
|
+ for {
|
|
|
+ // 调用 Corderlist 函数获取订单列表
|
|
|
+ response, err := merchant.Corderlist(ClientKey, SignSecret, AccessToken, status, pageSize, beginTime, endTime, pcursor)
|
|
|
+ fmt.Println("response********", response)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("Error calling Corderlist: %v\n", err)
|
|
|
+ break
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查响应代码
|
|
|
+ if response.Code != "1" {
|
|
|
+ fmt.Printf("Corderlist response error: %s\n", response.Msg)
|
|
|
+ break
|
|
|
+ }
|
|
|
+
|
|
|
+ // 累加订单中商品的数量
|
|
|
+ for _, order := range response.Data.OrderViews {
|
|
|
+ for _, product := range order.CPSOrderProductViews {
|
|
|
+ totalSaleNum += product.Num
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查分页指针 pcursor
|
|
|
+ //100个订单以内的情况
|
|
|
+ if response.Data.Cursor == "nomore" {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ //大于等于100个订单
|
|
|
+ // 更新 pcursor 以获取下一页数据
|
|
|
+ pcursor = response.Data.Cursor
|
|
|
+
|
|
|
+ // 处理分页后的数据
|
|
|
+ // 如果 pcursor 不是 "nomore",我们需要累加最后一条订单的数量
|
|
|
+ if len(response.Data.OrderViews) > 0 {
|
|
|
+ lastOrder := response.Data.OrderViews[len(response.Data.OrderViews)-1]
|
|
|
+ if len(lastOrder.CPSOrderProductViews) > 0 {
|
|
|
+ lastProduct := lastOrder.CPSOrderProductViews[len(lastOrder.CPSOrderProductViews)-1]
|
|
|
+ totalSaleNum += lastProduct.Num
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return totalSaleNum
|
|
|
+}
|