Browse Source

活动短链接生成任务;

庄逸洲 5 years ago
parent
commit
537149c774

+ 0 - 3
controllers/短信模块临时备注 View File

1
-修改个人信息
2
-权限管理中添加管理员
3
-客户管理

+ 128 - 0
jobcron/activity_short_url_job.go View File

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
+}

+ 42 - 0
jobcron/qiniu_job.go View File

1
+package jobcron
2
+
3
+import (
4
+	"SCRM/service"
5
+	"fmt"
6
+
7
+	"github.com/astaxie/beego"
8
+	"github.com/qiniu/api.v7/auth/qbox"
9
+	"github.com/qiniu/api.v7/storage"
10
+	"github.com/robfig/cron"
11
+)
12
+
13
+var qnTokenCronJob *cron.Cron
14
+
15
+func init() {
16
+	qnTokenCronJob = cron.New()
17
+	qnTokenCronJob.AddFunc("@every 1h50m", func() {
18
+		go RequestQNToken()
19
+	})
20
+}
21
+
22
+func RequestQNToken() {
23
+	accessKey := beego.AppConfig.String("qiniu_accesskey")
24
+	secretKey := beego.AppConfig.String("qiniu_secretkey")
25
+	bucket := beego.AppConfig.String("qiniu_bucket")
26
+	putPolicy := storage.PutPolicy{
27
+		Scope:      bucket,
28
+		ReturnBody: `{"url":"$(key)","hash":"$(etag)","state":"SUCCESS"}`,
29
+	}
30
+	putPolicy.Expires = 7200
31
+	mac := qbox.NewMac(accessKey, secretKey)
32
+	upToken := putPolicy.UploadToken(mac)
33
+	fmt.Println("new qiniu token: ", upToken)
34
+
35
+	redisClient := service.RedisClient()
36
+	defer redisClient.Close()
37
+	redisClient.Set("qn_token", upToken, 0)
38
+}
39
+
40
+func BeginRerequestQNTokenCronJob() {
41
+	qnTokenCronJob.Start()
42
+}

+ 7 - 2
main.go View File

5
 	_ "SCRM/routers"
5
 	_ "SCRM/routers"
6
 	"SCRM/service"
6
 	"SCRM/service"
7
 
7
 
8
-	// "SCRM/jobcron"
9
-
10
 	"github.com/astaxie/beego"
8
 	"github.com/astaxie/beego"
11
 )
9
 )
12
 
10
 
22
 		// jobcron.RequestMpWechatAccessToken()
20
 		// jobcron.RequestMpWechatAccessToken()
23
 		// jobcron.ReqJsapiTicket()
21
 		// jobcron.ReqJsapiTicket()
24
 	}()
22
 	}()
23
+
25
 	jobcron.StartOpenWechatCron()
24
 	jobcron.StartOpenWechatCron()
26
 	jobcron.BeginSendUnsendSMSCronJob()
25
 	jobcron.BeginSendUnsendSMSCronJob()
27
 
26
 
27
+	jobcron.CreateActivityShortURLIfNeeded()
28
+	jobcron.BeginCreateActivityShortURLCronJob()
29
+
30
+	go jobcron.RequestQNToken()
31
+	jobcron.BeginRerequestQNTokenCronJob()
32
+
28
 	beego.Run()
33
 	beego.Run()
29
 }
34
 }

+ 1 - 1
service/sms_service/sms_service.go View File

65
 	if getFreeLimitErr != nil {
65
 	if getFreeLimitErr != nil {
66
 		return getFreeLimitErr
66
 		return getFreeLimitErr
67
 	}
67
 	}
68
-	if willConsumeLimit+freeLimit.UsedCount <= freeLimit.TotalCount {
68
+	if willConsumeLimit+freeLimit.UsedCount > freeLimit.TotalCount {
69
 		return SMSErrorFreeLimitInsufficient
69
 		return SMSErrorFreeLimitInsufficient
70
 	}
70
 	}
71
 
71