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.
 
 
 
 
 
 

93 lines
3.0 KiB

package user
import (
"time"
"yunyan/comm"
"yunyan/lego/sys/log"
"yunyan/lego/sys/mysql"
"yunyan/pb"
)
// @Summary 获取会员与算力状态
// @Description 客户端「用量」页一次拿齐:VIP(自购 / 设备赋予合并后)、算力(设备剩余 + 账户余额 + 累计/本月消耗)、换算系数。客户端不做任何换算。
// @Tags User
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param user body pb.UserGetComputeReq true "无参数"
// @Success 200 {object} comm.HttpResult{data=pb.UserGetComputeResp} "成功返回"
// @Router /api/home/user_getcompute [post]
func (this *apiComp) GetCompute(session comm.IUserSession, req *pb.UserGetComputeReq) (resp *pb.UserGetComputeResp, errdata *pb.ErrorData) {
uid := session.GetUserId()
user, err := this.module.model.findforid(uid)
if err != nil {
errdata = &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()}
return
}
vip, devices, err := comm.ResolveUserVip(uid, user)
if err != nil {
errdata = &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()}
return
}
// 设备名从绑定记录上取(device_mac 行上没有名字)
names := map[string]string{}
if uds, e := this.module.model.getDevices(uid); e == nil {
for _, ud := range uds {
names[ud.Devicemac] = ud.Devicename
}
}
vipInfo := &pb.UserComputeVipInfo{
Level: vip.Level,
Exptime: vip.ExpTime,
Selfexptime: vip.SelfExpTime,
Devices: make([]*pb.UserDeviceVipInfo, 0, len(devices)),
}
var deviceLeft int64
for _, d := range devices {
deviceLeft += comm.DeviceComputeLeft(d)
vipInfo.Devices = append(vipInfo.Devices, &pb.UserDeviceVipInfo{
Devicemac: d.Devicemac,
Devicename: names[d.Devicemac],
Level: comm.DeviceVipLevel(d),
Exptime: comm.DeviceVipExpire(d),
Computegrant: d.Computegrant,
Computeused: d.Computeused,
})
}
stats, err := this.module.model.getStatistics(uid)
if err != nil && err != mysql.ErrNoDocuments {
errdata = &pb.ErrorData{Code: pb.ErrorCode_DBError, Message: err.Error()}
return
}
monthUsed, merr := this.module.model.sumComputeUsedSince(uid, monthStart(time.Now()))
if merr != nil {
// 本月消耗只是展示项,算不出来不该让整个接口失败
this.module.Warn("GetCompute: 本月消耗汇总失败", log.Field{Key: "uid", Value: uid}, log.Field{Key: "err", Value: merr.Error()})
}
rates := comm.LoadComputeRates()
ops := comm.LoadOpsParams()
resp = &pb.UserGetComputeResp{
Vip: vipInfo,
Compute: &pb.UserComputeInfo{
Deviceleft: deviceLeft,
Userbalance: user.Computebalance,
Totalused: stats.Computetotal,
Monthused: monthUsed,
},
Rates: &pb.UserComputeRates{
Translate: rates.Translate,
Meeting: rates.Meeting,
Aichat: rates.AIChat,
Gate: rates.Gate,
Vipwarndays: ops.VipWarnDays,
Computewarn: ops.ComputeWarn,
},
}
return
}
// monthStart 本地时区当月 1 日 0 点。
func monthStart(t time.Time) int64 {
y, m, _ := t.Date()
return time.Date(y, m, 1, 0, 0, 0, 0, t.Location()).Unix()
}