|
@@ -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,184 @@ import (
|
|
|
"qfw/util/redis"
|
|
|
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+)/([^.]*)"`
|
|
@@ -53,7 +230,13 @@ func (a *Activemanage) Luckdraw(activecode, id string) error {
|
|
|
if activecode == "topcj" {
|
|
|
f := FindOne("user", "{'s_m_openid':'"+openid+"'}")
|
|
|
username := (*f)["s_bindweixin"]
|
|
|
- userid := (*f)["_id"]
|
|
|
+ //看user里是否有黑名单字段
|
|
|
+ if (*f)["s_black"] != nil {
|
|
|
+ a.SetSession("black", "T")
|
|
|
+ } else {
|
|
|
+ a.SetSession("black", "F")
|
|
|
+ }
|
|
|
+ userid := strings.Split(fmt.Sprintf("%s", (*f)["_id"]), `"`)[1]
|
|
|
if *f == nil {
|
|
|
a.T["flog"] = "B"
|
|
|
a.T["msg"] = "您的微信号无效!!"
|
|
@@ -88,6 +271,7 @@ func (a *Activemanage) Luckdraw(activecode, id string) error {
|
|
|
|
|
|
//
|
|
|
func (a *Activemanage) Getluckdraw() error {
|
|
|
+ CheckLimit()
|
|
|
flog := "F"
|
|
|
//提示语
|
|
|
msg := ""
|
|
@@ -113,10 +297,17 @@ func (a *Activemanage) Getluckdraw() error {
|
|
|
data := make(map[string]interface{})
|
|
|
data["s_openid"] = openid
|
|
|
data["s_actcode"] = s_actcode
|
|
|
- i := getLuckDraw()
|
|
|
-
|
|
|
+ black := a.GetSession("black")
|
|
|
+ var i int
|
|
|
+ if black == "T" {
|
|
|
+ //黑名单指针范围
|
|
|
+ i = int(rand.Float64()*30 + 50)
|
|
|
+ } else {
|
|
|
+ i = getLuckDraw()
|
|
|
+ }
|
|
|
s_prize := getPrize(i)
|
|
|
data["s_prize"] = s_prize
|
|
|
+ data["i_degree"] = i
|
|
|
data["l_timestamp"] = time.Now().Unix()
|
|
|
nowdate := time.Now().Unix()
|
|
|
enddate := LuckDraw.EndDate
|
|
@@ -127,12 +318,12 @@ func (a *Activemanage) Getluckdraw() error {
|
|
|
flog = "T"
|
|
|
}
|
|
|
//红包
|
|
|
- if (i > 185 && i < 220) || (i > 320 && i < 355) {
|
|
|
+ if (i > 184 && i < 221) || (i > 319 && i < 356) {
|
|
|
var amount int //红包金额以“元”为单位,微信红包以“分”为单位
|
|
|
- if i > 185 && i < 220 {
|
|
|
+ if i > 184 && i < 221 {
|
|
|
amount = 500 //红包金额以“元”为单位,微信红包以“分”为单位
|
|
|
|
|
|
- } else if i > 320 && i < 355 {
|
|
|
+ } else if i > 319 && i < 356 {
|
|
|
amount = 100 //红包金额以“元”为单位,微信红包以“分”为单位
|
|
|
}
|
|
|
bm := qrpc.BonusMsg{Mchbillno: fmt.Sprint(today.Unix()),
|
|
@@ -168,7 +359,7 @@ func (a *Activemanage) Getluckdraw() error {
|
|
|
|
|
|
}
|
|
|
msg = " 小主是真真的好运气," + s_prize + "落入您囊中。红包将由系统自动发放到您的微信,请注意查收。<br/><br/> 分享至朋友圈或好友即可以获得明天抽奖资格呦!乖,快去分享吧!大奖可能就在明天~~"
|
|
|
- } else if (i > 275 && i < 310) || (i > 95 && i < 130) {
|
|
|
+ } else if (i > 274 && i < 311) || (i > 94 && i < 131) {
|
|
|
//时间判断,提醒不同
|
|
|
//now := time.Now()
|
|
|
//不在工作时间
|
|
@@ -178,8 +369,8 @@ func (a *Activemanage) Getluckdraw() error {
|
|
|
//} else { //在工作时间
|
|
|
msg = " 小主是真真的好运气," + s_prize + "落入您囊中。请将您的联系方式和邮寄地址留言给企明星。我们会在活动截止后尽快为您发出。<br/><br/> 分享至朋友圈或好友即可以获得明天抽奖资格呦!乖,快去分享吧!大奖可能就在明天~~"
|
|
|
//}
|
|
|
- } else if i > 140 && i < 175 {
|
|
|
- obid := BsonIdToSId(a.GetSession("userId"))
|
|
|
+ } else if i > 139 && i < 176 {
|
|
|
+ obid := a.GetSession("userId").(string)
|
|
|
b := credit.UpuserCreditSession(obid, "b6", "B", nil, a.Action)
|
|
|
if b == true {
|
|
|
msg = " 小主是真真的好运气,200积分落入您囊中。积分将由系统自动发放到您的企明星账户,请登录www.qmx.top查看。<br/><br/> 分享至朋友圈或好友即可以获得明天抽奖资格呦!乖,快去分享吧!大奖可能就在明天~~"
|
|
@@ -195,7 +386,14 @@ func (a *Activemanage) Getluckdraw() error {
|
|
|
|
|
|
//
|
|
|
func getLuckDraw() int {
|
|
|
- array := LuckDraw.GetAmount
|
|
|
+ th := time.Now().Hour()
|
|
|
+ thflog := (th < 23 && th > 7) //限时 23到第二天7点 第二套方案
|
|
|
+ array := []map[string]interface{}{}
|
|
|
+ if CheckLimit() || !thflog {
|
|
|
+ array = LuckDraw.GetAmounttwo //第二套方案
|
|
|
+ } else {
|
|
|
+ array = LuckDraw.GetAmount //第一套方案
|
|
|
+ }
|
|
|
weightValue := getWeightRandom(array)
|
|
|
min := IntAll(array[weightValue]["min"])
|
|
|
max := IntAll(array[weightValue]["max"])
|
|
@@ -208,22 +406,22 @@ func getLuckDraw() int {
|
|
|
amount := min + rand.New(rand.NewSource(time.Now().UnixNano())).Intn(max-min)
|
|
|
if amount <= 0 {
|
|
|
return 1
|
|
|
- } else if amount > 275 && amount < 310 {
|
|
|
+ } else if amount > 274 && amount < 311 {
|
|
|
count := Count("winningrecord", "{'s_prize':'《牛奶可乐经济学》'}")
|
|
|
if count > 6 {
|
|
|
amount = 245
|
|
|
}
|
|
|
- } else if amount > 95 && amount < 130 {
|
|
|
+ } else if amount > 94 && amount < 131 {
|
|
|
count := Count("winningrecord", "{'s_prize':'限量版U盘'}")
|
|
|
if count > 100 {
|
|
|
amount = 255
|
|
|
}
|
|
|
- } else if amount > 185 && amount < 220 {
|
|
|
+ } else if amount > 184 && amount < 221 {
|
|
|
count := Count("winningrecord", "{'s_prize':'五元现金红包'}")
|
|
|
if count > 200 {
|
|
|
amount = 65
|
|
|
}
|
|
|
- } else if amount > 320 && amount < 355 {
|
|
|
+ } else if amount > 319 && amount < 356 {
|
|
|
count := Count("winningrecord", "{'s_prize':'一元现金红包'}")
|
|
|
if count > 2500 {
|
|
|
amount = 75
|
|
@@ -256,19 +454,19 @@ func getPrize(i int) string {
|
|
|
if i > 0 {
|
|
|
if 0 <= i && i < 45 {
|
|
|
prize = "iPad mini"
|
|
|
- } else if 91 <= i && i < 136 {
|
|
|
+ } else if 95 <= i && i < 121 {
|
|
|
prize = "限量版U盘"
|
|
|
|
|
|
- } else if 140 <= i && i < 175 {
|
|
|
+ } else if 140 <= i && i < 176 {
|
|
|
prize = "200积分"
|
|
|
|
|
|
- } else if 181 <= i && i < 226 {
|
|
|
+ } else if 190 <= i && i < 221 {
|
|
|
prize = "五元现金红包"
|
|
|
|
|
|
- } else if 271 <= i && i < 316 {
|
|
|
+ } else if 280 <= i && i < 311 {
|
|
|
prize = "《牛奶可乐经济学》"
|
|
|
|
|
|
- } else if 320 <= i && i < 355 {
|
|
|
+ } else if 325 <= i && i < 351 {
|
|
|
prize = "一元现金红包"
|
|
|
|
|
|
} else {
|