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.

227 lines
6.2 KiB

package public
import (
"errors"
"fmt"
"git.oa00.com/go/mysql"
"log"
"recook/internal/model/goods"
"recook/internal/model/order"
"recook/internal/model/user"
"recook/internal/service/app/shop"
jpush2 "recook/internal/v2/lib/jpush"
"recook/internal/v2/lib/supply"
order2 "recook/internal/v2/logic/manage/order"
"recook/internal/v2/model/jpush"
"recook/internal/v2/model/jyy"
goods2 "recook/internal/v2/model/recook/goods"
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
}
// 推送支付
switch orderInfo.ThirdPartyType {
case goods2.RecookGoodsInfoThirdPartyTypeSupply:
bill, err := supply.Api.Order.LadingBill(orderInfo.ThirdPartyOrderSn)
log.Println("供应链支付", bill, 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 {
// 虚拟订单用户升级
if orderInfo.SharerID != 0 && orderInfo.SharerID != orderInfo.UserID {
profit := order.CreateProfit(
orderInfo.SharerID,
order.Card,
orderInfo.ActualTotalAmount,
orderInfo.ID, 2)
if err := tx.Create(&profit).Error; err != nil {
return err
}
if row := tx.Model(&user.Wallet{}).Where("user_id = ?", orderInfo.SharerID).UpdateColumns(map[string]interface{}{
"balance": gorm.Expr("balance + ?", profit.Income),
"version": gorm.Expr("version + 1"),
}).RowsAffected; row == 0 {
e := fmt.Errorf("网络异常")
return e
}
r1 := user.WalletBalanceList{
UserID: orderInfo.SharerID,
IncomeType: uint(10 + order.Card),
Amount: profit.Income,
Title: orderInfo.Title,
Comment: order.Card.GetStr(),
OrderID: orderInfo.ID,
OrderTime: orderInfo.CreatedAt,
CreatedAt: formatime.NewSecondNow(),
ProfitID: uint(profit.ID),
}
if e := tx.Create(&r1).Error; e != nil {
return e
}
// 添加收益记录
message := fmt.Sprintf("您的%s已到账", order.Card.GetStr())
if e := tx.Create(&jyy.AppUserMessage{
UserID: int(orderInfo.SharerID),
Message: message,
Kind: jyy.Profit,
IsRead: false,
SubID: uint64(profit.ID),
}).Error; e != nil {
return e
}
var ju jpush.JPush
mysql.Db.First(&ju, "user_id = ?", orderInfo.SharerID)
if ju.RegistrationId != "" {
client := jpush2.GetClient()
client.PushMsgWithRegister(ju.RegistrationId, "收益到账", message)
}
}
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
now := time.Now()
end := now
level := u1.Level
if u1.VipUpgradeEnd.Valid && time.Now().Before(u1.VipUpgradeEnd.Time) {
// 续约
level = u1.OldLevel
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: level,
Nickname: u1.Nickname,
Mobile: u1.Mobile,
Kind: kind,
ShareID: int(orderInfo.SharerID),
OrderID: uint64(orderInfo.ID),
})
}
}
return nil
}