瀏覽代碼

红包限制

renzheng 9 年之前
父節點
當前提交
01eb0ffc58

+ 2 - 2
common/src/qfw/util/encrypt_test.go

@@ -22,8 +22,8 @@ func Test_sim(t *testing.T) {
 	//s2 := "GyUlIhEDDjcfWCAyIl4xBkgsERYiLAwZLCg9VkkbLj4zMRYDPRs5ATVZOxccPAkzFxw7CCpEFj41QlRAQFdFXlRMQVZcHRIbBgsWBxYcFQwEBwoa"
 
 	//s3 := "RFYoal5bCFdXWQoQB0JuWwlXAQFZCUVfFj4JMFtT"
-	s4 := "oJULtwzXo6EFV1Ah-XeyRBimXGM8,uid,123456,wxpushlist"
-	se := SimpleEncrypt{Key: "topnet"}
+	s4 := "oJULtwzXo6EFV1Ah-XeyRBimXGM8"
+	se := SimpleEncrypt{Key: "topnet2015topnet2015"}
 	log.Println("=====", se.EncodeString(s4))
 	log.Println("=====", se.EncodeString(",1349385977,ASD"))
 	log.Println("---", se.DecodeString("GyUlIhEDDjcfWCAyIl4xBkgsERYiLAwZLCg9VkkBHQtcX1FBR1hJWldCREMHFhUBBwccBxYA"))

+ 177 - 0
core/src/qfw/active/activemanage.go

@@ -4,9 +4,11 @@
 package active
 
 import (
+	"container/list"
 	"fmt"
 	"github.com/go-xweb/xweb"
 	"gopkg.in/mgo.v2/bson"
+	"log"
 	"math/rand"
 	. "qfw/coreconfig"
 	"qfw/coreutil"
@@ -17,9 +19,183 @@ import (
 	"qfw/util/redis"
 	qrpc "qfw/util/rpc"
 	"strconv"
+	"sync"
 	"time"
 )
 
+//限制与解除数组
+var limitrule, unlimitrule [][]int
+
+//时间间隔
+var unlimitduration int
+
+//提示语
+var limitmsg, unlimitmsg string
+
+//锁
+var limitLock = new(sync.Mutex)
+
+//限制状态
+var limitStatus = false
+
+//流量池
+var tList = list.New()
+
+//全局抽奖次数
+var times int64
+
+//通知openid
+var notifyIds []string
+
+//对池的管理
+func listFun() {
+	tList.Remove(tList.Front())
+	tList.PushBack(times)
+	time.AfterFunc(1*time.Second, listFun)
+}
+
+//取值
+func CheckLimit() bool {
+	times++
+	return limitStatus
+}
+
+func getValFromList(n int) (val int, flag bool) {
+	Try(func() {
+		B := tList.Back()
+		Bn := B.Value.(int64)
+		ti := 1
+		n = n - 1
+		A := B.Prev()
+		flag = true
+		for ti < n {
+			if A != nil {
+				ti++
+				A = A.Prev()
+			} else {
+				flag = false
+				break
+			}
+		}
+		val = int(Bn - A.Value.(int64))
+	}, func(e interface{}) {
+		log.Println("ERROR", e)
+	})
+	return
+}
+
+//限制的监测
+func limitFun() {
+	limitLock.Lock()
+	//非限制状态
+	if !limitStatus {
+		for _, v := range limitrule {
+			//取的秒的区间
+			if val, flag := getValFromList(v[0]); flag && val >= v[1] {
+				//限制状态
+				limitStatus = true
+				//发送模板消息
+				str := fmt.Sprintf(limitmsg, v[0], val, v[1])
+				go func() {
+					log.Println("发送限制抽奖通知", str)
+					Try(func() {
+						for _, id := range notifyIds {
+							coreutil.SendManagerNotifyMsg(&qrpc.NotifyMsg{
+								Openid: id,
+								Title:  "抽奖进入限制状态通知",
+								Detail: "系统",
+								Result: str,
+								Remark: "",
+							})
+						}
+					}, func(e interface{}) {})
+				}()
+				break
+			}
+		}
+	}
+	limitLock.Unlock()
+	time.AfterFunc(5*time.Second, limitFun)
+}
+
+//解除限制的监测
+func unlimitFun() {
+	limitLock.Lock()
+	//非限制状态
+	if limitStatus {
+		allb := true
+		str := ""
+		for _, v := range unlimitrule {
+			//取的秒的区间
+			val, flag := getValFromList(v[0])
+			if !flag || val >= v[1] {
+				allb = false
+				break
+			} else {
+				str += " [间隔:" + strconv.Itoa(v[0]) + "," + "实际次数:" + strconv.Itoa(val) + ",限制:" + strconv.Itoa(v[1]) + "]"
+			}
+		}
+		if allb {
+			limitStatus = false
+			//发送解除通知
+			go func() {
+				log.Println("发送解除抽奖限制通知", str)
+				Try(func() {
+					for _, id := range notifyIds {
+						coreutil.SendManagerNotifyMsg(&qrpc.NotifyMsg{
+							Openid: id,
+							Title:  "抽奖进入限制状态通知",
+							Detail: "系统",
+							Result: fmt.Sprintf(unlimitmsg, str),
+							Remark: "",
+						})
+					}
+				}, func(e interface{}) {})
+			}()
+		}
+
+	}
+	limitLock.Unlock()
+	time.AfterFunc(time.Duration(unlimitduration)*time.Second, unlimitFun)
+}
+
+//初始化内容
+func init() {
+	tmpLimtRules := RedPackage.Limit["limitrules"].([]interface{})
+	limitrule = make([][]int, len(tmpLimtRules))
+	for i, k := range tmpLimtRules {
+		minR := k.([]interface{})
+		tmpInts := make([]int, len(minR))
+		limitrule[i] = tmpInts
+		for j, v := range minR {
+			tmpInts[j] = int(v.(float64))
+		}
+	}
+	tmpUnLimtRules := RedPackage.Limit["unlimitrules"].([]interface{})
+	unlimitrule = make([][]int, len(tmpUnLimtRules))
+	for i, k := range tmpUnLimtRules {
+		minR := k.([]interface{})
+		tmpInts := make([]int, len(minR))
+		unlimitrule[i] = tmpInts
+		for j, v := range minR {
+			tmpInts[j] = int(v.(float64))
+		}
+	}
+	unlimitduration = int(RedPackage.Limit["unlimitduration"].(float64))
+	limitmsg = RedPackage.Limit["limitmsg"].(string)
+	unlimitmsg = RedPackage.Limit["unlimitmsg"].(string)
+
+	notifyIds = ObjArrToStringArr(RedPackage.Limit["notifyIds"].([]interface{}))
+
+	for tList.Len() < 3600 {
+		tList.PushBack(int64(0))
+	}
+
+	go listFun()
+	go limitFun()
+	go unlimitFun()
+}
+
 type Activemanage struct {
 	*xweb.Action
 	luckdraw    xweb.Mapper `xweb:"/activity/(\\w+)/([^.]*)"`
@@ -88,6 +264,7 @@ func (a *Activemanage) Luckdraw(activecode, id string) error {
 
 //
 func (a *Activemanage) Getluckdraw() error {
+	CheckLimit()
 	flog := "F"
 	//提示语
 	msg := ""

+ 47 - 0
core/src/qfw/coreconfig/MessageConfig_test.go

@@ -1,7 +1,9 @@
 package coreconfig
 
 import (
+	"container/list"
 	"log"
+	"time"
 	//"qfw/coreconfig"
 	"qfw/util"
 	"testing"
@@ -12,3 +14,48 @@ func TestGetMessage(t *testing.T) {
 	ret := util.GetPropertie("indentify.success.result", MessageConfig)
 	log.Println(ret)
 }
+
+var tList *list.List
+var times int
+
+func listFun() {
+	times++
+	tList.Remove(tList.Front())
+	tList.PushBack(times)
+	time.AfterFunc(1*time.Second, listFun)
+}
+
+func TestList(t *testing.T) {
+	tList = list.New()
+	for tList.Len() < 3000 {
+		tList.PushBack(0)
+	}
+	go listFun()
+
+	/**
+	i := 0
+	for i < 10 {
+		i++
+		h.Remove(h.Front())
+		h.PushBack(i)
+
+		for e := h.Front(); e != nil; e = e.Next() {
+			log.Print(e.Value, "  ")
+		}
+	}
+	**/
+
+	go func() {
+		for {
+			log.Print("\n----------")
+			for e := tList.Front(); e != nil; e = e.Next() {
+				log.Print(e.Value, "  ")
+			}
+			log.Print("\n----------")
+			time.Sleep(5 * time.Second)
+		}
+	}()
+
+	b := make(chan bool, 1)
+	<-b
+}

+ 1 - 0
core/src/qfw/coreconfig/RedPackage.go

@@ -15,6 +15,7 @@ type redPackage struct {
 	Weixin        map[string]interface{}   `json:"weixin"`
 	Msg           map[string]interface{}   `json:"msg"`
 	IsReissue     bool                     `json:"isReissue"`
+	Limit         map[string]interface{}   `json:"limit"`
 }
 
 var RedPackage redPackage

+ 105 - 59
core/src/redpackage.json

@@ -1,61 +1,107 @@
 {
-	"startDate":1450022400,
-	"endDate":1452700800,
-	"getAmount":[{
-		"min":3,
-		"max":6,
-		"proportion":97.1
-	},{
-		"min":6,
-		"max":11,
-		"proportion":2
-	},{
-		"min":11,
-		"max":51,
-		"proportion":0.75
-	},{
-		"min":51,
-		"max":151,
-		"proportion":0.1
-	},{
-		"min":151,
-		"max":201,
-		"proportion":0.05
-	}],
-	"showAmount":[{
-		"min":3,
-		"max":10,
-		"count":2
-	},{
-		"min":10,
-		"max":50,
-		"count":4
-	},{
-		"min":50,
-		"max":100,
-		"count":6
-	},{
-		"min":100,
-		"max":150,
-		"count":4
-	},{
-		"min":150,
-		"max":200,
-		"count":4
-	}],
-	"promotioncode":"2001001501",
-	"weixin":{
-		"sendname":"企明星",
-		"wishing":"企明星扫码送红包活动",
-		"actname":"企明星扫码送红包活动",
-		"remark":"拆红包愉快!",
-		"successtitle":"友情提示",
-		"successremark":"因参加活动的用户较多,如果您在十分钟内未收到企明星发放的红包,请及时联系客服QQ。"
-	},
-	"msg":{
-		"title":"红包到账啦!",
-		"content":"您的企明星红包到账啦,快打开微信猛戳红包!"
-	},
-	"reissueTime":"8:10",
-	"isReissue":false
+    "startDate": 1450022400,
+    "endDate": 1452700800,
+    "getAmount": [
+        {
+            "min": 3,
+            "max": 6,
+            "proportion": 97.1
+        },
+        {
+            "min": 6,
+            "max": 11,
+            "proportion": 2
+        },
+        {
+            "min": 11,
+            "max": 51,
+            "proportion": 0.75
+        },
+        {
+            "min": 51,
+            "max": 151,
+            "proportion": 0.1
+        },
+        {
+            "min": 151,
+            "max": 201,
+            "proportion": 0.05
+        }
+    ],
+    "showAmount": [
+        {
+            "min": 3,
+            "max": 10,
+            "count": 2
+        },
+        {
+            "min": 10,
+            "max": 50,
+            "count": 4
+        },
+        {
+            "min": 50,
+            "max": 100,
+            "count": 6
+        },
+        {
+            "min": 100,
+            "max": 150,
+            "count": 4
+        },
+        {
+            "min": 150,
+            "max": 200,
+            "count": 4
+        }
+    ],
+    "promotioncode": "2001001501",
+    "weixin": {
+        "sendname": "企明星",
+        "wishing": "企明星扫码送红包活动",
+        "actname": "企明星扫码送红包活动",
+        "remark": "拆红包愉快!",
+        "successtitle": "友情提示",
+        "successremark": "因参加活动的用户较多,如果您在十分钟内未收到企明星发放的红包,请及时联系客服QQ。"
+    },
+    "msg": {
+        "title": "红包到账啦!",
+        "content": "您的企明星红包到账啦,快打开微信猛戳红包!"
+    },
+    "limit": {
+        "limitrules": [
+			[
+                10,
+                50
+            ],
+            [
+                30,
+                130
+            ],
+            [
+                60,
+                300
+            ]
+        ],
+        "limitmsg": "抽奖进入限止状态,原因:%d秒内抽奖次数为%d超过%d次。",
+        "unlimitduration": 1200,
+		"notifyIds":["oJULtwzXo6EFV1Ah-XeyRBimXGM8"],
+        "unlimitrules": [
+            [
+                3600,
+                1000
+            ],
+            [
+                2500,
+                500
+            ],
+            [
+                1200,
+                200
+            ]
+        ],
+        "unlimitmsg": "解除抽奖限止,%s。"
+    },
+    "reissueTime": "8:10",
+    "isReissue": false
 }

+ 1 - 1
core/src/timetask.json

@@ -1 +1 @@
-{"comment":{"c_rate":720,"commentrate":900},"market":{"demand":{"attr":["i_hits","i_bids","i_status"],"timepoint":"2016-01-28 12:54:36"},"service":{"attr":["i_hits","i_sales","i_comments","i_score","i_appcounts"],"timepoint":"2016-01-28 12:54:36"}},"marketisstart":true,"marketrate":300}
+{"comment":{"c_rate":720,"commentrate":900},"market":{"demand":{"attr":["i_hits","i_bids","i_status"],"timepoint":"2016-01-29 15:30:37"},"service":{"attr":["i_hits","i_sales","i_comments","i_score","i_appcounts"],"timepoint":"2016-01-29 15:30:37"}},"marketisstart":true,"marketrate":300}