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.

107 lines
3.3 KiB

package service
import (
"errors"
"gorm.io/gorm"
"pure-admin/global"
"pure-admin/model"
"pure-admin/model/request"
"strconv"
)
func GetSysMissionRewardList(params request.SearchSysReward) (err error, list []model.SysMissionReward, total int64) {
limit := params.PageSize
offset := params.PageSize * (params.Page - 1)
db := global.MG_DB.Model(&model.SysMissionReward{})
db.Count(&total)
var res []model.SysMissionReward
err = db.Order("id desc").Offset(offset).Limit(limit).Find(&res).Error
if err != nil {
return err, nil, 0
}
return err, res, total
}
func SendSysMissionReward(uuid string, info request.IdReq) (err error) {
var (
checkReward model.SysMissionReward
checkMission model.MissionClaim
checkVideo model.MissionClaimVideo
)
err = global.MG_DB.Model(&model.SysMissionReward{}).Where("id = ?", info.ID).First(&checkReward).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
err = global.MG_DB.Model(&model.MissionClaimVideo{}).Where("id = ?", checkReward.RelationId).First(&checkVideo).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
err = global.MG_DB.Model(&model.MissionClaim{}).Where("id = ?", checkVideo.MissionClaimId).First(&checkMission).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
return err
}
var bkbWallet model.Wallet
err = global.MG_DB.Model(&model.Wallet{}).Where("platform = 'bkb' AND user_id = 'bkb'").First(&bkbWallet).Error
if err != nil {
return
}
tx := global.MG_DB.Begin()
//修改任务状态
err = global.MG_DB.Model(&model.SysMissionReward{}).Where("id = ?", info.ID).Update("status", 3).Error
if err != nil {
tx.Rollback()
err = errors.New("update mission reward status failed")
return
}
// 扣除商家锁定营销账户
err = tx.Model(&model.Wallet{}).Where("id = ?", bkbWallet.ID).UpdateColumn("fund", gorm.Expr("fund - ?", checkReward.Bonus)).Error
if err != nil {
tx.Rollback()
err = errors.New("settle seller wallet failed")
return
}
var billFund model.BillFund
billFund.UserID = "bkb"
billFund.TransactionType = 1
billFund.TransactionId = "MB" + generate() // mission-bill
billFund.Title = ""
billFund.Price = checkReward.Bonus
billFund.Balance = bkbWallet.Fund
billFund.Platform = "seller"
billFund.RelatedId = strconv.Itoa(int(checkReward.ID))
billFund.Status = 2
err = tx.Model(&model.BillFund{}).Create(&billFund).Error
if err != nil {
tx.Rollback()
return
}
// 结算至网红钱包-余额
var influenceWallet model.Wallet
err = tx.Model(&model.Wallet{}).Where("platform = 'influencer' AND user_id = ?", checkVideo.CreateBy).
Updates(map[string]interface{}{"balance": gorm.Expr("balance + ?", checkReward.Bonus), "transit_balance": gorm.Expr("transit_balance - ?", checkReward.Bonus)}).First(&influenceWallet).Error
if err != nil {
tx.Rollback()
err = errors.New("settle influencer wallet failed")
return
}
// 创建任务结算账单
var bill model.Bill
bill.UserID = checkVideo.CreateBy
bill.Type = "1"
bill.Title = "平台奖励发放-" + checkReward.Title
bill.Price = checkReward.Bonus
bill.Balance = influenceWallet.Balance
bill.Status = 2
bill.Receipt = 1
bill.Platform = "influencer"
err = tx.Model(&model.Bill{}).Create(&bill).Error
if err != nil {
tx.Rollback()
err = errors.New("create influencer mission settle bill failed")
return
}
tx.Commit()
return err
}