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.
 
 
 
 
 
 

61 lines
2.5 KiB

package api
import (
"yunyan/comm"
"yunyan/lego/sys/log"
"yunyan/pb"
"time"
)
// GrantAdminResource 超管→后台账号 赠送资源点
// 仅超管(Admin)可调用;接收账号必须存在;接收的资源点会累加到目标账号的池中,
// 同时写入 admin_resource_log 用于流水审计。
func (this *apiComp) GrantAdminResource(session comm.IUserSession, req *pb.ApiGrantAdminResourceReq) (resp *pb.ApiGrantAdminResourceResp, errdata *pb.ErrorData) {
if req.Account == "" {
errdata = &pb.ErrorData{Code: pb.ErrorCode_ReqParameterError, Message: "account required"}
return
}
if req.Vipday <= 0 && req.Aichatintegral <= 0 && req.Tradesecond <= 0 && req.Meetsecond <= 0 {
errdata = &pb.ErrorData{Code: pb.ErrorCode_ReqParameterError, Message: "至少填写一项资源"}
return
}
target, err := this.module.model.findforaccount(req.Account)
if err != nil || target == nil {
errdata = &pb.ErrorData{Code: pb.ErrorCode_UserSessionNobeing, Message: "目标账号不存在"}
return
}
if target.Identity == pb.Identity_Admin {
errdata = &pb.ErrorData{Code: pb.ErrorCode_ReqParameterError, Message: "无需向超管赠送资源"}
return
}
// 用原子 UPDATE (col = col + ?) 直接调整余额,避免 Save 全字段覆盖时其它字段不一致,
// 也避免并发赠送/派发互相覆盖。
if _, err = this.module.model.adjustAdminBalance(req.Account, req.Vipday, req.Aichatintegral, req.Tradesecond, req.Meetsecond); err != nil {
errdata = &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()}
this.module.Error("GrantAdminResource adjust balance fail", log.Field{Key: "account", Value: req.Account}, log.Field{Key: "err", Value: err.Error()})
return
}
// 重读返回最新行
if target, err = this.module.model.findforaccount(req.Account); err != nil {
errdata = &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()}
return
}
from := session.GetMateToString(comm.SessionMeta_UserId)
flowLog := &pb.DBAdminResourceLog{
Ts: time.Now().Unix(),
FromAccount: from,
ToAccount: req.Account,
Vipday: req.Vipday,
Aichatintegral: req.Aichatintegral,
Tradesecond: req.Tradesecond,
Meetsecond: req.Meetsecond,
Remark: req.Remark,
}
if err = this.module.model.addAdminResourceLog(flowLog); err != nil {
errdata = &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()}
this.module.Error("GrantAdminResource add log fail", log.Field{Key: "err", Value: err.Error()})
return
}
resp = &pb.ApiGrantAdminResourceResp{User: target}
return
}