Browse Source

红包接口

master
黄梓健 5 years ago
parent
commit
6ca483cd06
  1. 51
      controllers/client/live.go
  2. 40
      controllers/client/shake_red_envelope.go
  3. 2
      controllers/pc/shake_red_envelope.go
  4. 24
      models/shake_red_envelope_record.go
  5. 9
      services/red_envelope/red_envelop.go

51
controllers/client/live.go

@ -154,9 +154,8 @@ func (t *LiveCtl) SendLiveRedPack() {
record.ActivityId = activityId
record.RehearsalId = activity.RehearsalId
record.AreaId = area.Id
record.AreaName = area.Name
record.RedEnvelopeType = 1
record.LiveRedEnvelopeRuleId = rule.Id
record.ShakeRedEnvelopeType = 1
record.ShakeRedEnvelopeRuleId = rule.Id
record.Name = user.Nickname + "发红包"
record.UserId = 0
record.IsDraw = -1 // 未被提现
@ -181,49 +180,31 @@ func (t *LiveCtl) GetLiveRedPack() {
exist, err := models.GetById(rule, ruleId)
t.CheckErr(err)
t.Assert(exist, code.MSG_SHAKERB_RULE_NOT_EXIST, "红包规则不存在")
if rule.Status != 1 {
t.ERROR("红包规则尚未生效", code.MSG_SHAKERB_RULE_NOT_EXIST)
return
}
t.Assert(rule.Status == 1, code.MSG_SHAKERB_RULE_NOT_EXIST, "红包规则尚未生效")
user := models.User{}
exist, err = models.GetById(&user, userId)
t.CheckErr(err)
t.Assert(exist, code.MSG_USER_NOT_EXIST, "不存在用户")
redPack := new(models.ShakeRedEnvelopeRecord)
exist, err = redPack.GetLiveRedPackRecord(ruleId, rule.RehearsalId)
record := new(models.ShakeRedEnvelopeRecord)
exist, err = record.GetByRuleId(ruleId, rule.RehearsalId, 1)
t.CheckErr(err)
if !exist {
// 通知其他的人
t.ERROR("红包被领完了", code.MSG_SHAKERB_RECORD_NOT_HIT)
return
}
t.Assert(exist, code.MSG_SHAKERB_RECORD_NOT_HIT, "红包领完了")
// 乐观锁 ==> 防止并发
redPack.UserId = user.Id
redPack.IsDraw = 0
row, err := redPack.UpdateById(redPack.Id, "version, user_id, is_draw")
record.UserId = user.Id
record.IsDraw = 0
row, err := record.UpdateById(record.Id, "version, user_id, is_draw")
t.CheckErr(err)
if row != 1 {
t.ERROR("红包被领完了", code.MSG_SHAKERB_RECORD_NOT_HIT)
return
}
t.Assert(row == 1, code.MSG_SHAKERB_RECORD_NOT_HIT, "红包被领完了")
addr := strings.Split(t.Request.OriginRequest.RemoteAddr, ":")
result, err := pay_service.SendRedPack("欧轩互动", user.Openid, rule.Prompt, addr[0], "直播抢红包活动",
"抢的多,赚得多", int(redPack.Amount*100), 1, 2)
if err != nil {
redPack.UserId = 0
redPack.IsDraw = -1
redPack.Version += 1
redPack.UpdateById(redPack.Id, "version, user_id, is_draw")
t.ERROR("红包已被领完", code.MSG_SHAKERB_RECORD_NOT_HIT)
return
}
redPack.MchBillno = result.MchBillno
redPack.Version += 1
redPack.UpdateById(redPack.Id, "version, mch_billno")
t.JSON(redPack)
"抢的多,赚得多", int(record.Amount*100), 1, 2)
t.CheckErr(err)
record.MchBillno = result.MchBillno
record.Version += 1
record.UpdateById(record.Id, "version, mch_billno")
t.JSON(record)
}

40
controllers/client/shake_red_envelope.go

@ -7,10 +7,10 @@ import (
activity_service "hudongzhuanjia/services/activity"
pay_service "hudongzhuanjia/services/pay"
ws_send_service "hudongzhuanjia/services/ws_send"
"hudongzhuanjia/utils"
"hudongzhuanjia/utils/code"
"hudongzhuanjia/utils/define"
"math/rand"
"strings"
"time"
)
@ -29,7 +29,6 @@ func (t *ShakeRedEnvelopeCtl) Status() {
})
}
// todo:调用支付接口
func (t *ShakeRedEnvelopeCtl) Shake() {
customerId := t.MustGetInt64("customer_id")
ruleId := t.MustGetInt64("shake_red_envelope_rule_id")
@ -43,11 +42,6 @@ func (t *ShakeRedEnvelopeCtl) Shake() {
t.Assert(exist, code.MSG_SHAKERB_RULE_NOT_EXIST, "摇红包规则不存在")
t.CheckRunning(rule.ShakeRedEnvelopeStatus)
area := new(models.AreaStore)
exist, err = models.GetById(area, areaId)
t.CheckErr(err)
t.Assert(exist, code.MSG_SHAKERB_NOT_EXIST, "地区不存在")
// 查询摇红包活动主id, is_pay=1给钱了,给摇
envelope := new(models.ShakeRedEnvelopeActivity)
exist, err = envelope.GetPayedById(rule.ShakeRedEnvelopeActivityId)
@ -66,7 +60,7 @@ func (t *ShakeRedEnvelopeCtl) Shake() {
record := new(models.ShakeRedEnvelopeRecord) /// 之后使用, 存入乐观锁
if moduleService.BesideRepeat == define.MODULE_BESIDE_REPEAT { // 剔除摇过红包的用户
exist, err = record.ExistRecord(activity.RehearsalId, activity.Id, rule.Id, envelope.Id, userId)
exist, err = record.ExistRecord(activity.RehearsalId, rule.Id, userId)
t.CheckErr(err)
t.Assert(!exist, code.MSG_SHAKERB_RECORD_NOT_HIT, "您已经摇过红包了,请等待下一轮.") // 不存在继续往下走
}
@ -76,7 +70,7 @@ func (t *ShakeRedEnvelopeCtl) Shake() {
t.Assert(r.Float64()*100 <= rule.Probability, code.MSG_SHAKERB_RECORD_NOT_HIT, "您与红包擦肩而过") // 必须在红包概率以内才能获取
// 增加session 或者乐观锁
exist, err = record.GetByRuleId(ruleId, activity.RehearsalId)
exist, err = record.GetByRuleId(ruleId, activity.RehearsalId, 0)
t.CheckErr(err)
t.Assert(exist, code.MSG_SHAKERB_RECORD_NOT_HIT, "红包已经派发完毕")
@ -86,22 +80,26 @@ func (t *ShakeRedEnvelopeCtl) Shake() {
t.CheckErr(err)
t.Assert(exist, code.MSG_USER_NOT_EXIST, "用户不存在")
// 记录红包 ---> 非彩排才能
if activity.RehearsalId == 0 {
record.TransferType = 1 // 微信转账
record.PartnerTradeNo = utils.RandomStr(32)
// 加入延迟队列
pay_service.PutTransferDelayQueue("欧轩互动-红包活动", record.PartnerTradeNo, user.Openid, int(record.Amount*100), 5, 5*60)
}
record.IsDraw = 1
record.UserId = user.Id
record.AreaName = area.Name
record.Name = activity.Name
row, err := record.UpdateAllColsById(record.Id)
record.UserId = userId
record.AreaId = areaId
row, err := record.UpdateById(record.Id, "version,is_draw, user_id, area_id")
t.CheckErr(err)
t.Assert(row == 1, code.MSG_SHAKERB_RECORD_NOT_HIT, "您与红包擦肩而过") // 那么 row == 1 为已经成功抢到
// 记录红包 ---> 非彩排才能
if activity.RehearsalId == 0 {
addr := strings.Split(t.Request.OriginRequest.RemoteAddr, ":")
result, err := pay_service.SendRedPack("欧轩互动", user.Openid, "红包只会越抢越多", addr[0],
"直播抢红包活动", "抢的多,赚得多", int(record.Amount*100), 1, 2)
if err != nil {
t.ERROR("红包被领完了", code.MSG_SHAKERB_RECORD_NOT_HIT)
}
record.MchBillno = result.MchBillno
record.Version += 1
record.UpdateById(record.Id, "version, mch_billno")
}
// 通知大屏
total, err := new(models.ShakeRedEnvelopeRecord).Total(activity.Id, activity.RehearsalId, envelope.Id, rule.Id)
remaining, err := new(models.ShakeRedEnvelopeRecord).Count(activity.Id, activity.RehearsalId, envelope.Id, rule.Id, -1)

2
controllers/pc/shake_red_envelope.go

@ -83,7 +83,7 @@ func (t *ShakeRedEnvelopeCtl) Start() {
_, err = rule.UpdateStatus(ruleId, define.StatusRunning)
t.CheckErr(err)
err = red_envelope_service.GenRedEnvelope(activity.Id, activity.RehearsalId, rule)
err = red_envelope_service.GenRedEnvelope(activity.Id, activity.Name, activity.RehearsalId, rule)
t.CheckErr(err)
go im_service.SendGroupCustomMessage("admin", envelope.ActivityId, im_service.NoticeShakeRedPackStart,

24
models/shake_red_envelope_record.go

@ -16,12 +16,10 @@ type ShakeRedEnvelopeRecord struct {
ActivityId int64 `json:"activity_id" xorm:"not null default 0 comment('主活动id') INT(11)"`
RehearsalId int64 `json:"rehearsal_id" xorm:"not null default(0) comment('彩排id/0正式') INT(11)"`
RedEnvelopeType int `json:"red_envelope_type" xorm:"not null default 0 comment('红包类型[0摇红包1直播红包]')"`
LiveRedEnvelopeRuleId int64 `json:"live_red_envelope_rule_id,omitempty" xorm:"not null default 0 comment('直播红包id') INT(11)"`
ShakeRedEnvelopeActivityId int64 `json:"shake_red_envelope_activity_id,omitempty" xorm:"not null default 0 comment('摇红包活动id') INT(11)"`
ShakeRedEnvelopeType int `json:"red_envelope_type" xorm:"not null default 0 comment('红包类型[0摇红包1直播红包]')"`
ShakeRedEnvelopeRuleId int64 `json:"shake_red_envelope_rule_id,omitempty" xorm:"not null default 0 comment('摇红包规则id') INT(11)"`
ShakeRedEnvelopeActivityId int64 `json:"shake_red_envelope_activity_id,omitempty" xorm:"not null default 0 comment('摇红包活动id') INT(11)"`
AreaId int64 `json:"area_id" xorm:"not null default 0 comment('地区id') INT(11)"`
AreaName string `json:"area_name" xorm:"not null default '' comment('地区名字') VARCHAR(18)"`
Name string `json:"name" xorm:"not null default '' comment('红包名字') VARCHAR(255)"`
UserId int64 `json:"user_id" xorm:"not null default 0 comment('用户id') INT(11)"`
Amount float64 `json:"amount" xorm:"not null default 0.00 comment('金额') DECIMAL(18)"`
@ -37,10 +35,9 @@ func (t *ShakeRedEnvelopeRecord) TableName() string {
return ShakeRedEnvelopeRecordTableName
}
func (t *ShakeRedEnvelopeRecord) ExistRecord(reid, aid, srid, said, uid int64) (bool, error) {
return core.GetXormAuto().Where("is_delete=0 and rehearsal_id=? and activity_id=? and "+
"shake_red_envelope_rule_id=? and shake_red_envelope_activity_id=? and user_id=?",
reid, aid, srid, said, uid).Exist(t)
func (t *ShakeRedEnvelopeRecord) ExistRecord(reid, srid, uid int64) (bool, error) {
return core.GetXormAuto().Where("is_delete=0 and rehearsal_id=? and "+
"shake_red_envelope_rule_id=? and user_id=?", reid, srid, uid).Exist(t)
}
func (t *ShakeRedEnvelopeRecord) Add() (int64, error) {
@ -64,9 +61,9 @@ func (t *ShakeRedEnvelopeRecord) Count(aid, rid, said, srid int64, status int64)
"shake_red_envelope_activity_id=? and shake_red_envelope_rule_id=?", status, aid, rid, said, srid).Count(t)
}
func (t *ShakeRedEnvelopeRecord) GetByRuleId(ruleId, rehearsalId int64) (bool, error) {
return core.GetXormAuto().Where("is_delete=0 and is_draw=-1 and shake_red_envelope_rule_id=? and rehearsal_id=?",
ruleId, rehearsalId).Get(t)
func (t *ShakeRedEnvelopeRecord) GetByRuleId(ruleId, rehearsalId, _type interface{}) (bool, error) {
return core.GetXormAuto().Where("is_delete=0 and is_draw=-1 and red_envelope_type = ? "+
"shake_red_envelope_rule_id=? and rehearsal_id=?", _type, ruleId, rehearsalId).Get(t)
}
func (t *ShakeRedEnvelopeRecord) UpdateById(id int64, field ...string) (int64, error) {
@ -82,8 +79,3 @@ func GetRedEnvelopesByUserId(userId int64) ([]*ShakeRedEnvelopeRecord, error) {
}
return records, err
}
func (t *ShakeRedEnvelopeRecord) GetLiveRedPackRecord(id, rehearsalId interface{}) (bool, error) {
return core.GetXormAuto().Where("is_delete=0 and red_envelope_type = 1 and user_id = 0 "+
"and is_draw=0 and live_red_envelope_rule_id=? and rehearsal_id=?", id, rehearsalId).Get(t)
}

9
services/red_envelope/red_envelop.go

@ -45,8 +45,8 @@ func GetCurrentRB(aid, uid, rid int64) (map[string]interface{}, error) {
}
const (
MinRedPackAmount = 30 // 分钱
MaxRedPackAmount = 49900 // 4990
MinRedPackAmount = 1 // 分钱
MaxRedPackAmount = 20000 // 4990
)
func GenRedPack(amount, num int) []int {
@ -79,7 +79,7 @@ func GenRedPack(amount, num int) []int {
}
// 提前生成红包
func GenRedEnvelope(aid, rid int64, rule *models.ShakeRedEnvelopeRule) error {
func GenRedEnvelope(aid int64, name string, rid int64, rule *models.ShakeRedEnvelopeRule) error {
// 判断红包是否存在
// 根据算法提前生成红包
@ -109,6 +109,7 @@ func GenRedEnvelope(aid, rid int64, rule *models.ShakeRedEnvelopeRule) error {
}
record := new(models.ShakeRedEnvelopeRecord)
record.ActivityId = aid
record.Name = name
record.RehearsalId = rid
record.ShakeRedEnvelopeActivityId = rule.ShakeRedEnvelopeActivityId
record.ShakeRedEnvelopeRuleId = rule.Id
@ -127,6 +128,7 @@ func GenRedEnvelope(aid, rid int64, rule *models.ShakeRedEnvelopeRule) error {
for i := 0; i < rule.RedEnvelopeNum; i++ {
record := new(models.ShakeRedEnvelopeRecord)
record.ActivityId = aid
record.Name = name
record.RehearsalId = rid
record.ShakeRedEnvelopeActivityId = rule.ShakeRedEnvelopeActivityId
record.ShakeRedEnvelopeRuleId = rule.Id
@ -150,6 +152,7 @@ func GenRedEnvelope(aid, rid int64, rule *models.ShakeRedEnvelopeRule) error {
for i := 0; i < int(ladder.RedEnvelopeNum); i++ {
record := new(models.ShakeRedEnvelopeRecord)
record.ActivityId = aid
record.Name = name
record.RehearsalId = rid
record.ShakeRedEnvelopeActivityId = rule.ShakeRedEnvelopeActivityId
record.ShakeRedEnvelopeRuleId = rule.Id

Loading…
Cancel
Save