package public import ( "errors" "recook/internal/model/goods" "recook/internal/model/order" "recook/internal/model/user" "recook/internal/service/app/shop" order2 "recook/internal/v2/logic/manage/order" manage "recook/internal/v2/model/recook/order" "time" "github.com/golangkit/formatime" "github.com/jinzhu/gorm" ) /* 支付成功后 标记订单支付完成 标记支付记录支付时间 购买排名榜单更新 自己的提成跟上级或者分享人的提成 计算好 */ func PaySuccessCallback(tx *gorm.DB, orderInfo order.Information, completeTime formatime.Second) error { var orderGoodsList []order.GoodsDetail if err := tx.Select("id, goods_id, sku_id, quantity, promotion_sku_id").Find(&orderGoodsList, "order_id = ?", orderInfo.ID).Error; err != nil { return err } // 写 if tx.Model(&orderInfo).Where("status = ?", 0).Updates(order.Information{ Status: 1, PayTime: completeTime, }).RowsAffected != 1 { return errors.New("订单已不可支付") } // 更新收益情况 if !orderInfo.IsSplit { if err := shop.OrderProfit(orderInfo, tx); err != nil { return err } // 更新销量 nowFormatTime := formatime.NewDateNow() for _, v := range orderGoodsList { err := tx.Model(&v).Update(order.GoodsDetail{PayStatus: 1}).Error if err != nil { return err } //给产品加销量 var goodsInfo goods.Information tx.First(&goodsInfo, "id=?", v.GoodsID) tx.Model(&goodsInfo).Updates(goods.Information{ SalesVolume: goodsInfo.SalesVolume + v.Quantity, }) //下面是给分类加销量的 var g goods.Information tx.Select("first_category_id, second_category_id").First(&g, v.GoodsID) rankings := goods.HotSellRankings{ GoodsId: v.GoodsID, FirstCategoryID: g.FirstCategoryID, SecondCategoryID: g.SecondCategoryID, Date: nowFormatTime, } tx.FirstOrCreate(&rankings, "date = ? AND goods_id = ?", nowFormatTime.Time.Format("2006-01-02"), v.GoodsID) tx.Model(&rankings).Updates(goods.HotSellRankings{ Sales: rankings.Sales + v.Quantity, }) // 订单支付成功日志 content := "-" if orderInfo.TradeNo != "" { content = "交易流水号:" + orderInfo.TradeNo } if err := order2.OrderLogic.Logs(v.ID, manage.RecookOrderGoodsDetailLogsTypePaySuc, "用户", content, tx); err != nil { return err } } } else { // 虚拟订单用户升级 var u1 user.Information if err := tx.First(&u1, "id = ?", orderInfo.UserID).Error; err != nil { return err } if u1.IsVip() { // 合伙人或者真实vip店铺无需操作 return nil } else { var sku goods.Sku if err := tx.First(&sku, "id = ?", orderGoodsList[0].SkuID).Error; err != nil { return err } patch := make(map[string]interface{}) patch["level"] = 2 patch["parent_id"] = 0 patch["is_offline"] = true now1 := time.Now() now := time.Date(now1.Year(), now1.Month(), now1.Day(), 0, 0, 0, 00, time.Local) end := now if u1.VipUpgradeEnd.Valid && time.Now().Before(u1.VipUpgradeEnd.Time) { // 续约 now = u1.VipUpgradeStart.Time end = u1.VipUpgradeEnd.Time } else { // 没有升级过 || 升级过已经过了上一次的时间重新计算 patch["old_level"] = u1.Level patch["old_parent_id"] = u1.ParentID patch["old_root_id"] = u1.RootID } switch sku.EffectDayType { case 1: // 日 end = end.AddDate(0, 0, sku.EffectTime) case 2: // 月 end = end.AddDate(0, sku.EffectTime, 0) } patch["vip_upgrade_start"] = formatime.NewSecondFrom(now) patch["vip_upgrade_end"] = formatime.NewSecondFrom(end) if err := tx.Table((&user.Information{}).TableName()).Where("id = ?", u1.ID).Updates(patch).Error; err != nil { return err } kind := user.Month if sku.EffectDayType == 1 { // 七天体验 kind = user.SevenDay } switch sku.EffectTime { case 1: kind = user.Month case 3: kind = user.Third case 12: kind = user.Year } tx.Create(&user.VipHistory{ UserID: int(orderInfo.UserID), Name: kind.Str(), Start: &now, End: &end, Amount: orderInfo.ActualTotalAmount, Level: u1.Level, NickName: u1.Nickname, Mobile: u1.Mobile, Kind: kind, ShareID: int(orderInfo.SharerID), OrderID: uint64(orderInfo.ID), }) } } return nil }