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
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()
|
|
}
|
|
|