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