diff --git a/controllers/client/live.go b/controllers/client/live.go index c661c1a..11c38a3 100644 --- a/controllers/client/live.go +++ b/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) } diff --git a/controllers/client/shake_red_envelope.go b/controllers/client/shake_red_envelope.go index ee1c25c..d4481e1 100644 --- a/controllers/client/shake_red_envelope.go +++ b/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) diff --git a/controllers/pc/shake_red_envelope.go b/controllers/pc/shake_red_envelope.go index a24d2e2..bb4915b 100644 --- a/controllers/pc/shake_red_envelope.go +++ b/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, diff --git a/models/shake_red_envelope_record.go b/models/shake_red_envelope_record.go index 6ea9efb..0e88955 100644 --- a/models/shake_red_envelope_record.go +++ b/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) -} diff --git a/services/red_envelope/red_envelop.go b/services/red_envelope/red_envelop.go index 19ec7e4..53096d7 100644 --- a/services/red_envelope/red_envelop.go +++ b/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