|
@@ -0,0 +1,128 @@
|
|
1
|
+package jobcron
|
|
2
|
+
|
|
3
|
+import (
|
|
4
|
+ "SCRM/service"
|
|
5
|
+ "SCRM/utils"
|
|
6
|
+ "encoding/json"
|
|
7
|
+ "fmt"
|
|
8
|
+ "io/ioutil"
|
|
9
|
+ "net/http"
|
|
10
|
+ "net/url"
|
|
11
|
+ "strings"
|
|
12
|
+ "time"
|
|
13
|
+
|
|
14
|
+ "github.com/astaxie/beego"
|
|
15
|
+ "github.com/robfig/cron"
|
|
16
|
+)
|
|
17
|
+
|
|
18
|
+// cron表达式 https://www.cnblogs.com/zuxingyu/p/6023919.html
|
|
19
|
+var activityShortUrlCronJob *cron.Cron
|
|
20
|
+
|
|
21
|
+func init() {
|
|
22
|
+ activityShortUrlCronJob = cron.New()
|
|
23
|
+ spec := "0 0 0 * * ?" // 每天晚上12点整检查活动短链接库存充不充足
|
|
24
|
+ activityShortUrlCronJob.AddFunc(spec, func() {
|
|
25
|
+ CreateActivityShortURLIfNeeded()
|
|
26
|
+ })
|
|
27
|
+}
|
|
28
|
+
|
|
29
|
+type CreateShortURLServiceMaxId struct {
|
|
30
|
+ Value int
|
|
31
|
+}
|
|
32
|
+
|
|
33
|
+func CreateActivityShortURLIfNeeded() {
|
|
34
|
+ var maxActivityId CreateShortURLServiceMaxId
|
|
35
|
+ service.PatientReadDB().Raw("SELECT MAX(id) AS value FROM sgj_patient_activity").Scan(&maxActivityId)
|
|
36
|
+ utils.TraceLog("当前最大的活动 ID 为:%v", maxActivityId)
|
|
37
|
+ var maxShortURLId CreateShortURLServiceMaxId
|
|
38
|
+ service.PatientReadDB().Raw("SELECT MAX(id) AS value FROM sgj_patient_activity_wx_share").Scan(&maxShortURLId)
|
|
39
|
+ utils.TraceLog("当前最大的活动短链接 ID 为:%v", maxShortURLId)
|
|
40
|
+
|
|
41
|
+ if maxShortURLId.Value-maxActivityId.Value <= 300 {
|
|
42
|
+ utils.TraceLog("即将生成更多活动短链接")
|
|
43
|
+ go CreateMoreActivityShortURL(maxShortURLId.Value)
|
|
44
|
+ } else {
|
|
45
|
+ utils.TraceLog("活动短链接充足,无需生成")
|
|
46
|
+ }
|
|
47
|
+}
|
|
48
|
+
|
|
49
|
+// 新浪短链接服务示例 https://www.cnblogs.com/azure/archive/2012/08/29/WeiboAPI.html
|
|
50
|
+func CreateMoreActivityShortURL(lastShortURLID int) {
|
|
51
|
+ var maxUrlCountPerRequest int = 20
|
|
52
|
+ createCount, _ := beego.AppConfig.Int("create_short_url_count_every_time")
|
|
53
|
+ pageCount := createCount / maxUrlCountPerRequest
|
|
54
|
+ tx := service.PatientWriteDB().Begin()
|
|
55
|
+ for i := 0; i < pageCount; i++ {
|
|
56
|
+ longURLParams := make([]string, 0, maxUrlCountPerRequest)
|
|
57
|
+ for longURLIndex := 1; longURLIndex < maxUrlCountPerRequest+1; longURLIndex++ {
|
|
58
|
+ id := lastShortURLID + i*maxUrlCountPerRequest + longURLIndex
|
|
59
|
+ param := fmt.Sprintf("url_long=%v", fmt.Sprintf("%v/weixin/activity/%v", beego.AppConfig.String("weixinwebdomain"), id))
|
|
60
|
+ longURLParams = append(longURLParams, param)
|
|
61
|
+ }
|
|
62
|
+
|
|
63
|
+ urlStr := fmt.Sprintf("http://api.weibo.com/2/short_url/shorten.json?source=2849184197&%v", strings.Join(longURLParams, "&"))
|
|
64
|
+ u, _ := url.Parse(urlStr)
|
|
65
|
+ u.RawQuery = u.Query().Encode()
|
|
66
|
+ // fmt.Println(u.String())
|
|
67
|
+
|
|
68
|
+ resp, requestErr := http.Get(u.String())
|
|
69
|
+ if requestErr != nil {
|
|
70
|
+ utils.ErrorLog("http.Get error: %v", requestErr)
|
|
71
|
+ continue
|
|
72
|
+ }
|
|
73
|
+ result, readErr := ioutil.ReadAll(resp.Body)
|
|
74
|
+ resp.Body.Close()
|
|
75
|
+ if readErr != nil {
|
|
76
|
+ utils.ErrorLog("ioutil.ReadAll error: %v", readErr)
|
|
77
|
+ continue
|
|
78
|
+ }
|
|
79
|
+ // fmt.Println(string(result))
|
|
80
|
+ var respJSON map[string]interface{}
|
|
81
|
+ if err := json.Unmarshal([]byte(string(result)), &respJSON); err != nil {
|
|
82
|
+ utils.ErrorLog("json.Unmarshal error: %v\n", err)
|
|
83
|
+ continue
|
|
84
|
+ }
|
|
85
|
+ // fmt.Printf("resp: %v\n", respJSON)
|
|
86
|
+ if respJSON["error"] != nil {
|
|
87
|
+ utils.ErrorLog("request error: %v\n", respJSON)
|
|
88
|
+ continue
|
|
89
|
+ }
|
|
90
|
+
|
|
91
|
+ urlJSONs := respJSON["urls"].([]interface{})
|
|
92
|
+ now := time.Now().Unix()
|
|
93
|
+ valueStrs := make([]string, 0, len(urlJSONs))
|
|
94
|
+ values := make([]interface{}, 0, len(urlJSONs)*9)
|
|
95
|
+
|
|
96
|
+ for index, url := range urlJSONs {
|
|
97
|
+ urlJSON := url.(map[string]interface{})
|
|
98
|
+ shortURL := urlJSON["url_short"].(string)
|
|
99
|
+ id := lastShortURLID + i*maxUrlCountPerRequest + (index + 1)
|
|
100
|
+ // CreateActivityWxShareWithShortURL(id, shortURL)
|
|
101
|
+
|
|
102
|
+ // (`id`,`activity_id`,`title`,`subtitle`,`image`,`status`,`ctime`,`mtime`,`short_url`)
|
|
103
|
+ valueStrs = append(valueStrs, "(?, ?, ?, ?, ?, ?, ?, ?, ?)")
|
|
104
|
+ values = append(values, id)
|
|
105
|
+ values = append(values, id)
|
|
106
|
+ values = append(values, "")
|
|
107
|
+ values = append(values, "")
|
|
108
|
+ values = append(values, "")
|
|
109
|
+ values = append(values, 1)
|
|
110
|
+ values = append(values, now)
|
|
111
|
+ values = append(values, now)
|
|
112
|
+ values = append(values, shortURL)
|
|
113
|
+ }
|
|
114
|
+
|
|
115
|
+ sql := fmt.Sprintf("INSERT INTO sgj_patient_activity_wx_share (id, activity_id, title, subtitle, image, status, ctime, mtime, short_url) VALUES %v;", strings.Join(valueStrs, ", "))
|
|
116
|
+ if err := tx.Exec(sql, values...).Error; err != nil {
|
|
117
|
+ utils.ErrorLog("插入活动短链接失败: %v", err)
|
|
118
|
+ tx.Rollback()
|
|
119
|
+ break
|
|
120
|
+ }
|
|
121
|
+ }
|
|
122
|
+ tx.Commit()
|
|
123
|
+ utils.TraceLog("完成生成更多活动短链接")
|
|
124
|
+}
|
|
125
|
+
|
|
126
|
+func BeginCreateActivityShortURLCronJob() {
|
|
127
|
+ activityShortUrlCronJob.Start()
|
|
128
|
+}
|