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.
113 lines
4.1 KiB
113 lines
4.1 KiB
package api
|
|
|
|
import (
|
|
"yunyan/comm"
|
|
"yunyan/lego/sys/log"
|
|
"yunyan/pb"
|
|
"time"
|
|
)
|
|
|
|
// 派发资源
|
|
// 规则:
|
|
// - 超管(Admin)不受池余额限制,可无限派发;
|
|
// - 其他后台账号(Manager/Agent/Operator)需先由超管赠送资源点至账号池,
|
|
// 派发时按本次额度从池中扣减;不足则拒绝。
|
|
func (this *apiComp) DispatchResource(session comm.IUserSession, req *pb.ApiDispatchResourceReq) (resp *pb.ApiDispatchResourceResp, errdata *pb.ErrorData) {
|
|
var (
|
|
user *pb.DBUser
|
|
userlog *pb.DBUserUseLog
|
|
err error
|
|
)
|
|
if user, err = this.module.model.finduser(req.Uid); err != nil {
|
|
errdata = &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()}
|
|
this.module.Error("DispatchResource find user fail", log.Field{Key: "uid", Value: req.Uid}, log.Field{Key: "err", Value: err.Error()})
|
|
return
|
|
}
|
|
|
|
addVipDay := int64(req.Vipday)
|
|
addAichat := req.Aichatintegral
|
|
addTradeSec := int64(req.Transtime) * 60
|
|
addMeetSec := int64(req.Meettime) * 60
|
|
if addVipDay <= 0 && addAichat <= 0 && addTradeSec <= 0 && addMeetSec <= 0 {
|
|
errdata = &pb.ErrorData{Code: pb.ErrorCode_ReqParameterError, Message: "至少填写一项资源"}
|
|
return
|
|
}
|
|
|
|
// 当前操作账号 & 身份
|
|
operator := session.GetMateToString(comm.SessionMeta_UserId)
|
|
identity := pb.Identity(session.GetMateToInt32("identity"))
|
|
|
|
// 非超管:需从池扣减
|
|
var operatorUser *pb.DBAdminUser
|
|
if identity != pb.Identity_Admin {
|
|
if operator == "" {
|
|
errdata = &pb.ErrorData{Code: pb.ErrorCode_NoLogin, Message: "登录信息异常"}
|
|
return
|
|
}
|
|
if operatorUser, err = this.module.model.findforaccount(operator); err != nil || operatorUser == nil {
|
|
errdata = &pb.ErrorData{Code: pb.ErrorCode_UserSessionNobeing, Message: "操作账号不存在"}
|
|
return
|
|
}
|
|
if addVipDay > operatorUser.VipdayBalance ||
|
|
addAichat > operatorUser.AichatintegralBalance ||
|
|
addTradeSec > operatorUser.TradesecondBalance ||
|
|
addMeetSec > operatorUser.MeetsecondBalance {
|
|
errdata = &pb.ErrorData{Code: pb.ErrorCode_ResourceNotEnough, Message: "资源点余额不足"}
|
|
return
|
|
}
|
|
}
|
|
|
|
userlog = &pb.DBUserUseLog{
|
|
Uid: req.Uid,
|
|
Logtype: pb.UserLogType_AdminGive,
|
|
Ts: time.Now().Unix(),
|
|
Extra: operator,
|
|
}
|
|
if addVipDay > 0 {
|
|
addSeconds := addVipDay * 24 * 60 * 60
|
|
if user.Vipexptime == 0 || user.Vipexptime < time.Now().Unix() {
|
|
user.Vipexptime = time.Now().Unix() + addSeconds
|
|
} else {
|
|
user.Vipexptime = user.Vipexptime + addSeconds
|
|
}
|
|
userlog.Addvipday = addVipDay
|
|
}
|
|
if addAichat > 0 {
|
|
user.Aichatintegral += addAichat
|
|
user.Aichattotalintegral += addAichat
|
|
userlog.Addagentintegral = addAichat
|
|
}
|
|
if addTradeSec > 0 {
|
|
user.Tradeintegral += addTradeSec
|
|
user.Tradetotalintegral += addTradeSec
|
|
userlog.Addtradesecond = addTradeSec
|
|
}
|
|
if addMeetSec > 0 {
|
|
user.Meetintegral += addMeetSec
|
|
user.Meettotalintegral += addMeetSec
|
|
userlog.Addmeetsecond = addMeetSec
|
|
}
|
|
if err = this.module.model.updateuser(user); err != nil {
|
|
errdata = &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()}
|
|
this.module.Error("DispatchResource update user fail", log.Field{Key: "uid", Value: req.Uid}, log.Field{Key: "err", Value: err.Error()})
|
|
return
|
|
}
|
|
if err = this.module.model.addIntegralLog(userlog); err != nil {
|
|
errdata = &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()}
|
|
this.module.Error("DispatchResource add log fail", log.Field{Key: "uid", Value: req.Uid}, log.Field{Key: "err", Value: err.Error()})
|
|
return
|
|
}
|
|
|
|
// 非超管:原子 UPDATE 扣减池余额(col = col - ?)。避免 Save 全字段覆盖时其它字段不一致,
|
|
// 也避免与并发派发/赠送相互覆盖。
|
|
if operatorUser != nil {
|
|
if _, err = this.module.model.adjustAdminBalance(operator, -addVipDay, -addAichat, -addTradeSec, -addMeetSec); err != nil {
|
|
errdata = &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()}
|
|
this.module.Error("DispatchResource deduct pool fail", log.Field{Key: "operator", Value: operator}, log.Field{Key: "err", Value: err.Error()})
|
|
return
|
|
}
|
|
}
|
|
|
|
resp = &pb.ApiDispatchResourceResp{User: user}
|
|
return
|
|
}
|
|
|