Просмотр исходного кода

Merge branch 'develop' of http://192.168.3.17/gitlab/zhanghongbo/qfw into develop

zhanghongbo 9 лет назад
Родитель
Сommit
5e1f8abce3

+ 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"))

+ 33 - 0
core/src/luckdraw.json

@@ -34,6 +34,39 @@
 		"max":350,
 		"proportion":15
 	}],
+	"getAmounttwo":[{
+		"min":0,
+		"max":35,
+		"proportion":0
+	},{
+		"min":50,
+		"max":80,
+		"proportion":24.71
+	},{
+		"min":95,
+		"max":120,
+		"proportion":0.5
+	},{
+		"min":140,
+		"max":175,
+		"proportion":50
+	},{
+		"min":190,
+		"max":220,
+		"proportion":0
+	},{
+		"min":235,
+		"max":270,
+		"proportion":24.71
+	},{
+		"min":280,
+		"max":310,
+		"proportion":0.08
+	},{
+		"min":325,
+		"max":350,
+		"proportion":0
+	}],
 	"promotioncode":"2001001501",
 	"weixin":{
 		"sendname":"企明星",

+ 217 - 19
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,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 {

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

@@ -7,6 +7,7 @@ import (
 //系统配置
 type luckDraw struct {
 	GetAmount     []map[string]interface{} `json:"getAmount"`
+	GetAmounttwo  []map[string]interface{} `json:"getAmounttwo"`
 	StartDate     int64                    `json:"startDate"`
 	EndDate       int64                    `json:"endDate"`
 	Promotioncode string                   `json:"promotioncode"`

+ 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,
+                100
+            ],
+            [
+                60,
+                180
+            ]
+        ],
+        "limitmsg": "抽奖进入限止状态,原因:%d秒内抽奖次数为%d超过%d次。",
+        "unlimitduration": 1800,
+		"notifyIds":["oJULtwzXo6EFV1Ah-XeyRBimXGM8"],
+        "unlimitrules": [
+            [
+                3600,
+                800
+            ],
+            [
+                2500,
+                500
+            ],
+            [
+                600,
+                100
+            ]
+        ],
+        "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 16:14:37"},"service":{"attr":["i_hits","i_sales","i_comments","i_score","i_appcounts"],"timepoint":"2016-01-29 16:14:37"}},"marketisstart":true,"marketrate":300}