From af5f3593711107979690448cec009d05d7a083d3 Mon Sep 17 00:00:00 2001 From: tommy <3405129587@qq.com> Date: Thu, 30 Jul 2020 17:03:45 +0800 Subject: [PATCH] fix:bug --- models/customer_order.go | 3 +- models/customer_order_sub.go | 3 +- models/user_prize.go | 27 +++--- services/pay/handle.go | 206 +++++++++++++++++++++++-------------------- services/pay/order.go | 3 - 5 files changed, 128 insertions(+), 114 deletions(-) diff --git a/models/customer_order.go b/models/customer_order.go index 79d5b5a..0af8038 100644 --- a/models/customer_order.go +++ b/models/customer_order.go @@ -85,7 +85,8 @@ func (t *CustomerOrder) UpdateStatusBy(outTradeNo string, originStatus, status i func GetExpiredAtLiveCustomerOrder() ([]*CustomerOrder, error) { orders := make([]*CustomerOrder, 0) - err := core.GetXormAuto().Where("type=1 and is_delete=0 and status=0 and expire_time <= ? and out_trade_no<>''", time.Now().Unix()).Find(&orders) + err := core.GetXormAuto().Where("type=1 and is_delete=0 and "+ + "status=0 and expire_time <= ? and out_trade_no<>''", time.Now().Unix()).Find(&orders) if err != nil { return nil, err } diff --git a/models/customer_order_sub.go b/models/customer_order_sub.go index 1be46fd..6520749 100644 --- a/models/customer_order_sub.go +++ b/models/customer_order_sub.go @@ -36,8 +36,7 @@ func GetCustomerOrderSubsByOrderNos(orderNos ...string) (subs []map[string]strin err = core.GetXormAuto().Table(new(CustomerOrderSub)).Alias("s"). Select("s.order_no, s.goods_id, s.goods_num, s.good_name, s.good_price, g.goods_pic_url"). Join("left", new(CustomerGoods).Alias("g"), "g.id=s.goods_id"). - Where("s.is_delete=0").In("s.order_no", orderNos). - Desc("s.created_at").Find(&subs) + Where("s.is_delete=0").In("s.order_no", orderNos).Desc("s.created_at").Find(&subs) return } diff --git a/models/user_prize.go b/models/user_prize.go index 4b23bde..cb9c1fe 100644 --- a/models/user_prize.go +++ b/models/user_prize.go @@ -8,19 +8,20 @@ import ( const UserPrizeTableName = TableNamePrefix + "user_prize" type UserPrize struct { - Id int64 `json:"id" xorm:"not null pk autoincr INT(11)"` - UserId int64 `json:"user_id" xorm:"not null comment('用户表id') INT(11)"` - ActivityId int64 `json:"activity_id" xorm:"not null comment('互动表id') INT(11)"` - RehearsalId int64 `json:"rehearsal_id" xorm:"not null default(0) comment('彩排id') INT(11)"` - ArchId int `json:"arch_id" xorm:"not null default 0 comment('归档id') INT(11)"` - ActivityName string `json:"activity_name" xorm:"not null default('') comment('互动名字') VARCHAR(128)"` - PrizeName string `json:"prize_name" xorm:"not null default('') comment('奖品名字') VARCHAR(128)"` - PrizeImg string `json:"prize_img" xorm:"not null default('') comment('奖品图片') VARCHAR(255)"` - PrizeType int `json:"prize_type" xorm:"not null default(0) comment('订单来源1普通抽奖2订单抽奖3订单送礼4直播下单') INT(11)"` - Status int `json:"status" xorm:"not null default 0 comment('是否已经兑奖0否1是') TINYINT(1)"` - IsDelete bool `json:"is_delete" xorm:"not null default(0) comment('软删除') TINYINT(1)"` - CreatedAt time.Time `json:"created_at" xorm:"not null created comment('创建时间') DATETIME"` - UpdatedAt time.Time `json:"updated_at" xorm:"not null updated comment('更新时间') DATETIME"` + Id int64 `json:"id" xorm:"not null pk autoincr INT(11)"` + UserId int64 `json:"user_id" xorm:"not null comment('用户表id') INT(11)"` + ActivityId int64 `json:"activity_id" xorm:"not null comment('互动表id') INT(11)"` + RehearsalId int64 `json:"rehearsal_id" xorm:"not null default(0) comment('彩排id') INT(11)"` + CustomerOrderId int64 `json:"customer_order_id" xorm:"not null default 0 comment('客户订单id') INT(11)"` + ArchId int `json:"arch_id" xorm:"not null default 0 comment('归档id') INT(11)"` + ActivityName string `json:"activity_name" xorm:"not null default('') comment('互动名字') VARCHAR(128)"` + PrizeName string `json:"prize_name" xorm:"not null default('') comment('奖品名字') VARCHAR(128)"` + PrizeImg string `json:"prize_img" xorm:"not null default('') comment('奖品图片') VARCHAR(255)"` + PrizeType int `json:"prize_type" xorm:"not null default(0) comment('订单来源1普通抽奖2订单抽奖3订单送礼4直播下单') INT(11)"` + Status int `json:"status" xorm:"not null default 0 comment('是否已经兑奖0否1是') TINYINT(1)"` + IsDelete bool `json:"is_delete" xorm:"not null default(0) comment('软删除') TINYINT(1)"` + CreatedAt time.Time `json:"created_at" xorm:"not null created comment('创建时间') DATETIME"` + UpdatedAt time.Time `json:"updated_at" xorm:"not null updated comment('更新时间') DATETIME"` } func (t *UserPrize) TableName() string { diff --git a/services/pay/handle.go b/services/pay/handle.go index bc4c659..ba92301 100644 --- a/services/pay/handle.go +++ b/services/pay/handle.go @@ -3,8 +3,8 @@ package pay_service import ( "errors" "fmt" + "github.com/ouxuanserver/osmanthuswine/src/core" "github.com/xormplus/xorm" - "hudongzhuanjia/logger" "hudongzhuanjia/models" "hudongzhuanjia/services/im" "hudongzhuanjia/utils" @@ -21,102 +21,121 @@ func init() { //处理支付成功之后的回调问题 func HandleSuccess(order *models.UserOrder) error { if order.GoodType == 4 { // 直播商品 - customerOrder := new(models.CustomerOrder) - _, err := customerOrder.UpdateStatusBy(order.OutTradeNo, 0, 1) - if err != nil { - return errors.New("更新状态发送错误") - } - customerOrder.GetByOutTradeNO(order.OutTradeNo) - if customerOrder.Status != 1 { - return errors.New("商品订单状态信息出现异常") + // 可以使用事务进行控制 + activity := new(models.Activity) + exist, err := models.Get(activity, order.ActivityId) + if err != nil || !exist { + return errors.New("互动信息异常") } - subs, err := models.GetCustomerOrderSubsByOrderNos(customerOrder.OrderNo) + s := core.GetXormAuto().NewSession() + defer s.Close() + err = s.Begin() if err != nil { - logger.Error("商品子订单查询异常", err) + s.Rollback() return err } - for _, sub := range subs { - go im_service.SendGroupCustomMessage(customerOrder.BuyerId, order.ActivityId, im_service.NoticeLiveGoodBuy, - map[string]interface{}{ - "goods_pic_url": sub["goods_pic_url"], - "goods_num": sub["goods_num"], - "good_name": sub["good_name"], - "good_price": sub["good_price"], - "goods_id": sub["goods_id"], - "timestamp": time.Now().Unix(), - }) + cOrder := models.CustomerOrder{} + exist, err = s.Where("is_delete=0 and out_trade_no=?", order.OutTradeNo).Get(cOrder) + if err != nil || !exist || cOrder.Status != 0 { + s.Rollback() + return errors.New("客户订单异常") } - - activity := new(models.Activity) - exist, err := models.Get(activity, order.ActivityId) - if err != nil || !exist { - return errors.New("互动信息异常") + cOrder.Status = 1 + _, err = s.Where("out_trade_no=?", order.OutTradeNo).Cols("").Update(&cOrder) + if err != nil { + s.Rollback() + return errors.New("订单状态异常") } - gift := new(models.OrderGift) - exist, err = gift.GetByActivityId(order.ActivityId) + subs := make([]map[string]string, 0) + err = core.GetXormAuto().Table(new(models.CustomerOrderSub)).Alias("s"). + Select("s.order_no, s.goods_id, s.goods_num, s.good_name, s.good_price, g.goods_pic_url"). + Join("left", new(models.CustomerGoods).Alias("g"), "g.id=s.goods_id"). + Where("s.is_delete=0 and order_no=?", cOrder.OrderNo).Find(&subs) if err != nil { - err = fmt.Errorf("获取订单送礼错误: err-> %v, activity_id-> %v", err, activity.Id) - logger.Error(err) + s.Rollback() return err } - if !exist { - return nil + gift := models.OrderGift{} + exist, err = s.Where("is_delete=0 and order_gift_switch=? "+"and activity_id=?", + define.StatusOpen, activity.Id).Get(&gift) + if err != nil { + s.Rollback() + return err } - - prize := new(models.UserPrize) - prize.UserId = order.UserId - prize.ActivityId = order.ActivityId - prize.RehearsalId = activity.RehearsalId - prize.ActivityName = activity.Name - prize.ArchId = activity.ArchId - prize.PrizeName = gift.GiftName - prize.PrizeImg = gift.GiftPicUrl - prize.PrizeType = 4 - prize.IsDelete = false - prize.Status = 1 - if gift.Num > 0 { - count, err := new(models.CustomerOrder). - Count(activity.Id, activity.RehearsalId, customerOrder.CreatedAt, activity.ArchId) - if err != nil { - err = fmt.Errorf("订单人数统计失败: err->%v, out_trade_no->%v", err, order.OutTradeNo) - logger.Error(err) - return err - } - - if gift.Num <= int(count) { // 人数足够 - return nil + if exist { + prize := new(models.UserPrize) + prize.UserId = order.UserId + prize.ActivityId = order.ActivityId + prize.RehearsalId = activity.RehearsalId + prize.CustomerOrderId = cOrder.Id + prize.ActivityName = activity.Name + prize.ArchId = activity.ArchId + prize.PrizeName = gift.GiftName + prize.PrizeImg = gift.GiftPicUrl + prize.PrizeType = 4 + prize.IsDelete = false + prize.Status = 1 + if gift.Num <= 0 { // 不限制 + _, err = s.InsertOne(prize) + if err != nil { + s.Rollback() + return err + } + cOrder.UserPrizeId = prize.Id + _, err := s.ID(cOrder.Id).NoAutoCondition().Cols("user_prize_id").Update(&cOrder) + if err != nil { + s.Rollback() + return err + } + } else if gift.Num > 0 { + count, err := s.Where("activity_id=? and rehearsal_id=? and arch_id=? and is_delete=0", + activity.Id, activity.RehearsalId, activity.ArchId).NoAutoCondition().Count(&gift) + if err != nil { + s.Rollback() + return err + } + if gift.Num > int(count) { // 足够 + _, err = s.InsertOne(prize) + if err != nil { + s.Rollback() + return err + } + cOrder.UserPrizeId = prize.Id + _, err := s.ID(cOrder.Id).NoAutoCondition().Cols("user_prize_id").Update(&cOrder) + if err != nil { + s.Rollback() + return err + } + } } } - _, err = prize.Add() + err = s.Commit() if err != nil { - err = fmt.Errorf("奖品添加失败: err->%v, out_trade_no->%v", err, order.OutTradeNo) - logger.Error(err) + s.Rollback() return err } - - customerOrder.UserPrizeId = prize.Id - _, err = models.Update(customerOrder.Id, customerOrder, "user_prize_id") - if err != nil { - err = fmt.Errorf("奖品记录添加失败: err-> %v, out_trade_no-> %v, prize_id->%v", err, order.OutTradeNo, prize.Id) - logger.Error(err) - return err + for _, sub := range subs { + go im_service.SendGroupCustomMessage(cOrder.BuyerId, order.ActivityId, im_service.NoticeLiveGoodBuy, + map[string]interface{}{ + "goods_pic_url": sub["goods_pic_url"], + "goods_num": sub["goods_num"], + "good_name": sub["good_name"], + "good_price": sub["good_price"], + "goods_id": sub["goods_id"], + "timestamp": time.Now().Unix(), + }) } } else if order.GoodType == 3 { // 直播红包 info := new(models.LiveRedEnvelopeRule) _, err := info.UpdateStatusByOutTradeNo(order.OutTradeNo, 1) if err != nil { - err = fmt.Errorf("状态改变出现错误: err->%v, out_trade_no->%v", err, order.OutTradeNo) - logger.Error(err.Error()) return err } exist, err := info.GetByOutTradeNo(order.OutTradeNo) if err != nil || !exist || info.Status != 1 { - err = fmt.Errorf("直播红包信息异常: err-> %v, exist->%v, status->%v, out_trade_no->%v", - err, exist, info.Status, order.OutTradeNo) - logger.Error(err.Error()) - return err + return errors.New("订单状态异常") } go im_service.SendGroupCustomMessage(info.UserId, order.ActivityId, im_service.NoticeLiveRedPackStart, @@ -129,29 +148,22 @@ func HandleSuccess(order *models.UserOrder) error { history := new(models.RewardHistory) exist, err := history.GetByOutTradeNo(order.OutTradeNo) if err != nil || !exist || history.Status != -1 { - err = fmt.Errorf("打赏历史异常: err->%v, out_trade_no %v", err, order.OutTradeNo) - logger.Error(err.Error()) - return err + return errors.New("订单状态异常") } _, err = history.UpdateStatus(history.Id, 0) if err != nil { - err = fmt.Errorf("打赏状态发送变化: err->%v, out_trade_no %v", err, order.OutTradeNo) - logger.Error(err.Error()) return err } } else if order.GoodType == 1 { // 霸屏 history := new(models.BullyScreenHistory) exist, err := history.GetByOutTradeNo(order.OutTradeNo) if err != nil || !exist || history.Status != -1 { - err = fmt.Errorf("打赏历史异常: err->%v, out_trade_no %v", err, order.OutTradeNo) - logger.Error(err.Error()) - return err + return errors.New("订单状态异常") } _, err = history.UpdateStatus(history.Id, 0) if err != nil { - err = fmt.Errorf("霸屏状态发送变化: err->%v, out_trade_no %v", err, order.OutTradeNo) - logger.Error(err.Error()) + return err } } return nil @@ -162,6 +174,7 @@ func HandleGoodOrder() error { orders, err := models.GetExpiredAtLiveCustomerOrder() if err != nil { err = fmt.Errorf("获取过期订单信息错误原因: %v", err) + return err } for _, v := range orders { if v.Type != 1 || v.Status != 0 { @@ -172,20 +185,23 @@ func HandleGoodOrder() error { err = fmt.Errorf("订单查询出现错误: %v, out_trade_no: %v", err, v.OutTradeNo) return err } - if res["trade_state"] != define.CODE_TRADE_NOTPAY { - err = fmt.Errorf("订单非未支付订单: %v, out_trade_no: %v", res["trade_state"], v.OutTradeNo) - return err - } - - err = Close(v.OutTradeNo) - if err != nil { - return err - } - v.Status = 9 - v.CancelTime = time.Now() - _, err = models.Update(v.Id, v, "status", "cancel_time") - if err != nil { - return err + if res["trade_state"] == define.CODE_TRADE_SUCCESS { + v.Status = 1 + _, err = models.Update(v.Id, v, "status") + if err != nil { + return err + } + } else if res["trade_state"] == define.CODE_TRADE_NOTPAY { + err = Close(v.OutTradeNo) + if err != nil { + return err + } + v.Status = 9 + v.CancelTime = time.Now() + _, err = models.Update(v.Id, v, "status", "cancel_time") + if err != nil { + return err + } } subs, err := models.GetSubOrdersByOrderNo(v.OrderNo) diff --git a/services/pay/order.go b/services/pay/order.go index a3f20d9..e00adab 100644 --- a/services/pay/order.go +++ b/services/pay/order.go @@ -30,7 +30,6 @@ func UnifiedOrder(content, openId string, fee, goodType, userId, activityId, exp body["nonce_str"] = nonceStr body["sign_type"] = pay_core.SignType_MD5 body["openid"] = openId - //body["time_expire"] = pay_core.FormatTime(time.Unix(expireAt, 0)) resp, err := pay.UnifiedOrder(client, body) if err != nil { @@ -60,7 +59,6 @@ func UnifiedOrder(content, openId string, fee, goodType, userId, activityId, exp pac := "prepay_id=" + resp["prepay_id"] paySign := pay_core.JsapiSign(client.AppId(), timestamp, nonceStr, pac, pay_core.SignType_MD5, define.ApiKey) - //go PutOrderDelayQueue(userOrder) return map[string]interface{}{ "appid": client.AppId(), "timestamp": timestamp, @@ -99,7 +97,6 @@ func ReOrder(outTradeNo string) (map[string]interface{}, error) { "out_trade_no": outTradeNo, "user_order_id": userOrder.Id, }, nil - } // Notify