|
@@ -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"
|
|
@@ -18,9 +20,183 @@ import (
|
|
|
qrpc "qfw/util/rpc"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
+ "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+)/([^.]*)"`
|
|
@@ -94,6 +270,7 @@ func (a *Activemanage) Luckdraw(activecode, id string) error {
|
|
|
|
|
|
//
|
|
|
func (a *Activemanage) Getluckdraw() error {
|
|
|
+ CheckLimit()
|
|
|
flog := "F"
|
|
|
//提示语
|
|
|
msg := ""
|
|
@@ -211,6 +388,9 @@ func getLuckDraw() int {
|
|
|
th := time.Now().Hour()
|
|
|
thflog := (th < 23 || th > 7)
|
|
|
array := []map[string]interface{}{}
|
|
|
+ if !CheckLimit() {
|
|
|
+ flog = true
|
|
|
+ }
|
|
|
if flog == false || thflog == false {
|
|
|
array = LuckDraw.GetAmounttwo
|
|
|
} else {
|