activemanage.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /*
  2. *抽奖模块
  3. */
  4. package active
  5. import (
  6. "fmt"
  7. "github.com/go-xweb/xweb"
  8. "gopkg.in/mgo.v2/bson"
  9. "math/rand"
  10. . "qfw/coreconfig"
  11. "qfw/coreutil"
  12. mob "qfw/mobile"
  13. . "qfw/util"
  14. "qfw/util/credit"
  15. . "qfw/util/mongodb"
  16. "qfw/util/redis"
  17. qrpc "qfw/util/rpc"
  18. "strconv"
  19. "time"
  20. )
  21. type Activemanage struct {
  22. *xweb.Action
  23. luckdraw xweb.Mapper `xweb:"/activity/(\\w+)/([^.]*)"`
  24. getluckdraw xweb.Mapper `xweb:"/activity/luckdraw"`
  25. addredis xweb.Mapper `xweb:"/activity/addredis"`
  26. }
  27. //分享成功后建立redis判断值
  28. func (a *Activemanage) Addredis() error {
  29. //
  30. openid := a.Session().Get("openid").(string)
  31. n := time.Now()
  32. tmp := n.Unix()
  33. n2 := n.AddDate(0, 0, 1)
  34. yxq := time.Date(n2.Year(), n2.Month(), n2.Day(), 23, 59, 59, 0, time.Local).Unix() - tmp
  35. yxqs := fmt.Sprintf("%d", yxq)
  36. yxqt, _ := strconv.Atoi(yxqs)
  37. key := fmt.Sprintf("cj_%s_%s", openid, n2.Format("2006_01_02"))
  38. redis.Put("other", key, "cj", yxqt)
  39. return nil
  40. }
  41. //进入抽奖页面
  42. func (a *Activemanage) Luckdraw(activecode, id string) error {
  43. //userInfo := a.GetSession("userInfo").(*map[string]interface{})
  44. //se := SimpleEncrypt{Key: "topnet2015topnet2015"}
  45. openid := se.DecodeString(id)
  46. a.T["shareid"] = coreutil.FindMyShareId(activecode, openid)
  47. //
  48. if activecode == "topcj" {
  49. f := FindOne("user", "{'s_m_openid':'"+openid+"'}")
  50. username := (*f)["s_bindweixin"]
  51. userid := (*f)["_id"]
  52. if *f == nil {
  53. a.T["flog"] = "B"
  54. a.T["msg"] = "您的微信号无效!!"
  55. return a.Render("/active/luckdraw.html", &a.T)
  56. }
  57. a.T["signature"] = mob.GetSignature(a.Url())
  58. u := FindOne("winningrecord", "{'s_openid':'"+openid+"'}")
  59. if *u != nil {
  60. if ret := redis.Get("other", "cj_"+openid+"_"+time.Now().Format("2006_01_02")); ret == nil {
  61. //a.T = *u
  62. a.T["flog"] = "A"
  63. Tm := time.Now().AddDate(0, 0, 1)
  64. if ret := redis.Get("other", "cj_"+openid+"_"+Tm.Format("2006_01_02")); ret == nil {
  65. a.T["msg"] = "小主,快分享朋友圈或好友即获得明天的抽奖资格吧!千万不要再忘记了,大奖可能就在明天~"
  66. } else {
  67. a.T["msg"] = "小主莫贪心,每人每天只有一次抽奖机会呦!分享后明天再来吧!<br/><br/>  小主翻个牌子,动动小手分享活动,么么哒……(分享点击页面右上方···分享到朋友圈)"
  68. }
  69. return a.Render("/active/luckdraw.html", &a.T)
  70. }
  71. }
  72. a.SetSession("username", username)
  73. a.SetSession("userid", userid)
  74. a.SetSession("openid", openid)
  75. a.SetSession("s_actcode", activecode)
  76. return a.Render("/active/luckdraw.html", &a.T)
  77. } else {
  78. return nil
  79. }
  80. }
  81. //
  82. func (a *Activemanage) Getluckdraw() error {
  83. flog := "F"
  84. //提示语
  85. msg := ""
  86. id := ""
  87. today := time.Now()
  88. openid := a.GetSession("openid").(string)
  89. s_actcode := a.GetSession("s_actcode").(string)
  90. if openid == "" {
  91. msg = "  小主你太长时间没点击开始抽奖了,重新进来吧!"
  92. return a.Write(`{"flog":"` + flog + `","msg":"` + msg + `"}`)
  93. } else {
  94. u := FindOne("winningrecord", "{'s_openid':'"+openid+"'}")
  95. if *u != nil {
  96. if ret := redis.Get("other", "cj_"+openid+"_"+time.Now().Format("2006_01_02")); ret == nil {
  97. //a.T = *u
  98. a.T["flog"] = "A"
  99. a.T["msg"] = "小主莫贪心,每天只有一次抽奖机会呦!分享至朋友圈或好友即可以获得明天抽奖资格呦!乖,快去分享吧!大奖可能就在明天~~"
  100. return a.Write(`{"flog":"` + flog + `","msg":"` + msg + `"}`)
  101. }
  102. redis.Del("other", "cj_"+openid+"_"+time.Now().Format("2006_01_02"))
  103. }
  104. }
  105. data := make(map[string]interface{})
  106. data["s_openid"] = openid
  107. data["s_actcode"] = s_actcode
  108. i := getLuckDraw()
  109. s_prize := getPrize(i)
  110. data["s_prize"] = s_prize
  111. data["l_timestamp"] = time.Now().Unix()
  112. nowdate := time.Now().Unix()
  113. enddate := LuckDraw.EndDate
  114. if nowdate < enddate {
  115. id = Save("winningrecord", data)
  116. }
  117. if len(id) > 0 {
  118. flog = "T"
  119. }
  120. //红包
  121. if (i > 185 && i < 220) || (i > 320 && i < 355) {
  122. var amount int //红包金额以“元”为单位,微信红包以“分”为单位
  123. if i > 185 && i < 220 {
  124. amount = 500 //红包金额以“元”为单位,微信红包以“分”为单位
  125. } else if i > 320 && i < 355 {
  126. amount = 100 //红包金额以“元”为单位,微信红包以“分”为单位
  127. }
  128. bm := qrpc.BonusMsg{Mchbillno: fmt.Sprint(today.Unix()),
  129. Sendname: LuckDraw.Weixin["sendname"].(string),
  130. Reopenid: openid,
  131. Totalamount: amount,
  132. Totalnum: 1,
  133. Wishing: "企明星新年大抽奖",
  134. Actname: "企明星新年大抽奖",
  135. Remark: "欢迎参加企明星新年大抽奖活动!",
  136. }
  137. if coreutil.PayBonus(&bm) {
  138. redpackage := make(bson.M)
  139. redpackage["s_userid"] = a.GetSession("userid")
  140. redpackage["s_username"] = a.GetSession("username")
  141. redpackage["s_openid"] = openid
  142. redpackage["i_amount"] = amount
  143. redpackage["s_billno"] = bm.Mchbillno
  144. redpackage["s_name"] = bm.Actname
  145. redpackage["l_createdate"] = today.Unix()
  146. redpackage["i_year"] = today.Year()
  147. redpackage["i_month"] = today.Month()
  148. redpackage["i_day"] = today.Day()
  149. redpackage["s_actcode"] = s_actcode
  150. Save("redpackage", redpackage)
  151. }
  152. msg = "  小主是真真的好运气," + s_prize + "落入您囊中。红包将由系统自动发放到您的微信,请注意查收。<br/><br/>分享至朋友圈或好友即可以获得明天抽奖资格呦!乖,快去分享吧!大奖可能就在明天~~"
  153. } else if (i > 275 && i < 310) || (i > 95 && i < 130) {
  154. //时间判断,提醒不同
  155. //now := time.Now()
  156. //不在工作时间
  157. //if now.Weekday() == 6 || now.Weekday() == 0 || (now.Hour() > 18 || now.Hour() < 9) {
  158. //
  159. // msg = "  小主是真真的好运气," + s_prize + "落入您囊中!<br/>  请在微信留下您的联系方式(手机号或qq号),企明星客服会在下一个工作日9:00-17:00给小主回复哦!<br/>  小主翻个牌子,动动小手分享活动,么么哒……(分享点击页面右上方···分享到朋友圈)"
  160. //} else { //在工作时间
  161. msg = "  小主是真真的好运气," + s_prize + "落入您囊中。请将您的联系方式和邮寄地址留言给企明星。我们会在活动截止后尽快为您发出。<br/><br/>分享至朋友圈或好友即可以获得明天抽奖资格呦!乖,快去分享吧!大奖可能就在明天~~"
  162. //}
  163. } else if i > 140 && i < 175 {
  164. obid := BsonIdToSId(a.GetSession("userid"))
  165. b := credit.UpuserCreditSession(obid, "b6", "B", nil, a.Action)
  166. if b == true {
  167. msg = "  小主是真真的好运气,200积分落入您囊中。积分将由系统自动发放到您的企明星账户,请登录www.qmx.top查看。<br/><br/>分享至朋友圈或好友即可以获得明天抽奖资格呦!乖,快去分享吧!大奖可能就在明天~~"
  168. } else {
  169. msg = "  抽奖出错!小主不要桑心,联系企明星管理员,200积分还是您的!"
  170. }
  171. } else { //不中奖
  172. msg = "  小主不要桑心,这次没有中奖哦,明天记得要来拼运气啊!<br/><br/>分享至朋友圈或好友即可以获得明天抽奖资格呦!乖,快去分享吧!大奖可能就在明天~~"
  173. }
  174. return a.Write(`{"flog":"` + flog + `","msg":"` + msg + `","rotate":` + strconv.Itoa(int(i)) + `}`)
  175. }
  176. //
  177. func getLuckDraw() int {
  178. array := LuckDraw.GetAmount
  179. weightValue := getWeightRandom(array)
  180. min := IntAll(array[weightValue]["min"])
  181. max := IntAll(array[weightValue]["max"])
  182. if max == 0 || (min == 0 && max == 0) {
  183. return 1
  184. }
  185. if min == max {
  186. return min
  187. } else {
  188. amount := min + rand.New(rand.NewSource(time.Now().UnixNano())).Intn(max-min)
  189. if amount <= 0 {
  190. return 1
  191. } else if amount > 275 && amount < 310 {
  192. count := Count("winningrecord", "{'s_prize':'《牛奶可乐经济学》'}")
  193. if count > 6 {
  194. amount = 240
  195. }
  196. } else if amount > 95 && amount < 130 {
  197. count := Count("winningrecord", "{'s_prize':'限量版U盘'}")
  198. if count > 100 {
  199. amount = 260
  200. }
  201. } else if amount > 185 && amount < 220 {
  202. count := Count("winningrecord", "{'s_prize':'五元现金红包'}")
  203. if count > 200 {
  204. amount = 60
  205. }
  206. } else if amount > 320 && amount < 355 {
  207. count := Count("winningrecord", "{'s_prize':'一元现金红包'}")
  208. if count > 1500 {
  209. amount = 80
  210. }
  211. }
  212. return amount
  213. }
  214. return 0
  215. }
  216. //
  217. func getWeightRandom(array []map[string]interface{}) int {
  218. var weightSum, stepWeightSum float64
  219. for _, v := range array {
  220. weightSum += v["proportion"].(float64)
  221. }
  222. randVal := rand.New(rand.NewSource(time.Now().UnixNano())).Float64()
  223. for i := 0; i < len(array); i++ {
  224. stepWeightSum += array[i]["proportion"].(float64)
  225. if randVal <= stepWeightSum/weightSum {
  226. return i
  227. }
  228. }
  229. return 0
  230. }
  231. //
  232. func getPrize(i int) string {
  233. var prize = ""
  234. if i > 0 {
  235. if 0 <= i && i < 45 {
  236. prize = "iPad mini"
  237. } else if 91 <= i && i < 136 {
  238. prize = "限量版U盘"
  239. } else if 140 <= i && i < 175 {
  240. prize = "200积分"
  241. } else if 181 <= i && i < 226 {
  242. prize = "五元现金红包"
  243. } else if 271 <= i && i < 316 {
  244. prize = "《牛奶可乐经济学》"
  245. } else if 320 <= i && i < 355 {
  246. prize = "一元现金红包"
  247. } else {
  248. prize = "谢谢参与"
  249. }
  250. } else {
  251. prize = "抽奖异常,联系管理员!"
  252. }
  253. return prize
  254. }