You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
4.3 KiB

4 years ago
package public
import (
"errors"
"recook/internal/model/goods"
"recook/internal/model/order"
3 years ago
"recook/internal/model/user"
4 years ago
"recook/internal/service/app/shop"
order2 "recook/internal/v2/logic/manage/order"
manage "recook/internal/v2/model/recook/order"
3 years ago
"time"
"github.com/golangkit/formatime"
"github.com/jinzhu/gorm"
4 years ago
)
/*
*/
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("订单已不可支付")
}
// 更新收益情况
3 years ago
if !orderInfo.IsSplit {
if err := shop.OrderProfit(orderInfo, tx); err != nil {
4 years ago
return err
}
3 years ago
// 更新销量
nowFormatTime := formatime.NewDateNow()
4 years ago
3 years ago
for _, v := range orderGoodsList {
err := tx.Model(&v).Update(order.GoodsDetail{PayStatus: 1}).Error
if err != nil {
return err
}
4 years ago
3 years ago
//给产品加销量
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
}
4 years ago
}
3 years ago
} else {
// 虚拟订单用户升级
var u1 user.Information
if err := tx.First(&u1, "id = ?", orderInfo.UserID).Error; err != nil {
4 years ago
return err
}
if u1.IsVip() {
// 合伙人或者真实vip店铺无需操作
3 years ago
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),
})
3 years ago
}
4 years ago
}
return nil
}