package hdl import ( "applet/app/cfg" "applet/app/db" "applet/app/e" "applet/app/md" "applet/app/svc" "applet/app/utils" "applet/app/utils/cache" "code.fnuoos.com/EggPlanet/egg_models.git/src/implement" "code.fnuoos.com/EggPlanet/egg_models.git/src/model" "code.fnuoos.com/EggPlanet/egg_system_rules.git" rule2 "code.fnuoos.com/EggPlanet/egg_system_rules.git" "code.fnuoos.com/EggPlanet/egg_system_rules.git/enum" md2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/md" "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule" "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy" enum2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy/enum" md3 "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy/md" svc2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy/svc" es2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/utils/es" "code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es" "context" "encoding/json" "errors" "fmt" "github.com/gin-gonic/gin" "github.com/olivere/elastic/v7" "github.com/shopspring/decimal" "strconv" "time" ) const PointsCenterCalcExchangeRedisKey = "Points_Center_Cache_Key" // PointsCenterGetBasic // @Summary 蛋蛋星球-积分中心-上部分基础信息(获取) // @Tags 积分中心 // @Description 上部分基础信息(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Success 200 {object} md.PointsCenterGetBasicResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/basic [GET] func PointsCenterGetBasic(c *gin.Context) { val, exists := c.Get("user") if !exists { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } user, ok := val.(*model.User) if !ok { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } settingDb := implement.NewEggEnergyBasicSettingDb(db.Db) setting, err := settingDb.EggEnergyBasicSettingGetOne() if err != nil { e.OutErr(c, e.ERR_DB_ORM, nil) return } virtualAmountDb := implement.NewUserVirtualAmountDb(db.Db) // 蛋蛋能量 (个人 + 团队) eggPersonalEnergy, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, setting.PersonEggEnergyCoinId) if err != nil { e.OutErr(c, e.ERR_DB_ORM, nil) return } eggTeamEnergy, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, setting.TeamEggEnergyCoinId) if err != nil { e.OutErr(c, e.ERR_DB_ORM, nil) return } eggEnergy := utils.StrToFloat64(eggPersonalEnergy.Amount) + utils.StrToFloat64(eggTeamEnergy.Amount) // 蛋蛋能量价值 coreDataDb := implement.NewEggEnergyCoreDataDb(db.Db) coreData, err := coreDataDb.EggEnergyCoreDataGet() if err != nil { e.OutErr(c, e.ERR_DB_ORM, nil) return } eggEnergyAmount := utils.StrToFloat64(coreData.NowPrice) * eggEnergy // 活跃积分(蛋蛋积分 = 团队 + 个人) eggPersonalPoint, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, setting.PersonEggPointsCoinId) if err != nil { e.OutErr(c, e.ERR_DB_ORM, nil) return } eggTeamPoint, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, setting.TeamEggPointsCoinId) if err != nil { e.OutErr(c, e.ERR_DB_ORM, nil) return } eggPoint := utils.StrToFloat64(eggPersonalPoint.Amount) + utils.StrToFloat64(eggTeamPoint.Amount) // 蛋蛋积分价值 coinDb := implement.NewVirtualCoinDb(db.Db) coin, err := coinDb.VirtualCoinGetOneByParams(map[string]interface{}{ "key": "id", "value": setting.PersonEggPointsCoinId, }) if err != nil { e.OutErr(c, e.ERR_DB_ORM, nil) return } var eggPointValue decimal.Decimal if coin != nil { ratio, _ := decimal.NewFromString(coin.ExchangeRatio) eggPointValue = decimal.NewFromFloat(eggPoint).Div(ratio) } eggPointValue = decimal.NewFromInt(0) // 账户余额 walletDb := implement.NewUserWalletDb(db.Db) wallet, err := walletDb.GetUserVirtualWallet(user.Id) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } resp := md.PointsCenterGetBasicResp{ Energy: utils.Float64ToStr(eggEnergy), EnergyValue: utils.Float64ToStr(eggEnergyAmount), WalletAmount: wallet.Amount, EggPoint: utils.Float64ToStr(eggPoint), EggPointValue: eggPointValue.String(), } e.OutSuc(c, resp, nil) } // InitialData // @Summary 蛋蛋星球-积分中心-初始数据(获取) // @Tags 积分中心 // @Description 初始数据(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Success 200 {object} md.InitialDataResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/initialData [GET] func InitialData(c *gin.Context) { settingDb := implement.NewEggEnergyBasicSettingDb(db.Db) setting, err := settingDb.EggEnergyBasicSettingGetOne() if err != nil { e.OutErr(c, e.ERR_DB_ORM, nil) return } resp := md.InitialDataResp{ InitialPrice: setting.InitialPrice, TotalIssuanceAmount: setting.TotalIssuanceAmount, TotalTechnologyTeam: setting.TotalTechnologyTeam, TotalAngelInvestor: setting.TotalAngelInvestor, TotalOperateFund: setting.TotalOperateFund, TotalEcologicalDevelopment: setting.TotalEcologicalDevelopment, } e.OutSuc(c, resp, nil) } // DynamicData // @Summary 蛋蛋星球-积分中心-动态数据(获取) // @Tags 积分中心 // @Description 动态数据(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Success 200 {object} md.DynamicDataResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/dynamicData [GET] func DynamicData(c *gin.Context) { settingDb := implement.NewEggEnergyBasicSettingDb(db.Db) setting, err := settingDb.EggEnergyBasicSettingGetOne() if err != nil { e.OutErr(c, e.ERR_DB_ORM, nil) return } // 1.用户持有总量 redisKey1 := PointsCenterCalcExchangeRedisKey + "_1" redisValue1, err := cache.GetString(redisKey1) if err != nil { if err.Error() == "redigo: nil returned" { amountDb := implement.NewUserVirtualAmountDb(db.Db) total, err := amountDb.UserVirtualAmountGetSumByCoinKind(setting.PersonEggEnergyCoinId) if err != nil { e.OutErr(c, e.ERR_DB_ORM, nil) return } //将获取到的余额值缓存至redis redisValue1 = utils.Float64ToStr(total) cache.SetEx(redisKey1, redisValue1, 60) } else { e.OutErr(c, e.ERR, err.Error()) return } } // 2.星级分红 redisKey2 := PointsCenterCalcExchangeRedisKey + "_2" redisValue2, err := cache.GetString(redisKey2) if err != nil { if err.Error() == "redigo: nil returned" { coreDataDb := implement.NewEggEnergyCoreDataDb(db.Db) coreData, err := coreDataDb.EggEnergyCoreDataGet() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } redisValue2 = coreData.StarLevelDividends cache.SetEx(redisKey2, redisValue2, 60) } else { e.OutErr(c, e.ERR, err.Error()) return } } // 3.发展委员会 redisKey3 := PointsCenterCalcExchangeRedisKey + "_3" redisValue3, err := cache.GetString(redisKey3) if err != nil { if err.Error() == "redigo: nil returned" { coreDataDb := implement.NewEggEnergyCoreDataDb(db.Db) coreData, err := coreDataDb.EggEnergyCoreDataGet() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } redisValue3 = coreData.DevelopmentCommittee cache.SetEx(redisKey3, redisValue3, 60) } else { e.OutErr(c, e.ERR, err.Error()) return } } // 4.公益基金 redisKey4 := PointsCenterCalcExchangeRedisKey + "_4" redisValue4, err := cache.GetString(redisKey4) if err != nil { if err.Error() == "redigo: nil returned" { coreDataDb := implement.NewEggEnergyCoreDataDb(db.Db) coreData, err := coreDataDb.EggEnergyCoreDataGet() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } redisValue4 = coreData.PublicWelfareAndCharity cache.SetEx(redisKey4, redisValue4, 60) } else { e.OutErr(c, e.ERR, err.Error()) return } } resp := md.DynamicDataResp{ UserTotalHold: redisValue1, StarLevelDividends: redisValue2, DevelopmentCommittee: redisValue3, PublicWelfareAndCharity: redisValue4, } e.OutSuc(c, resp, nil) } // PointsExchangeGetBasic // @Summary 蛋蛋星球-积分中心-积分兑换基础信息(获取) // @Tags 积分中心 // @Description 积分兑换基础信息(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Success 200 {object} md.PointsExchangeGetBasicResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/pointsExchangeBasic [GET] func PointsExchangeGetBasic(c *gin.Context) { val, exists := c.Get("user") if !exists { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } user, ok := val.(*model.User) if !ok { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } // 1. 获取蛋蛋能量货币类型 settingDb := implement.NewEggEnergyBasicSettingDb(db.Db) setting, err := settingDb.EggEnergyBasicSettingGetOne() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } coinID := setting.PersonEggEnergyCoinId // 2. 获取可兑蛋蛋能量 virtualAmountDb := implement.NewUserVirtualAmountDb(db.Db) eggEnergyAmount, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, coinID) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } // 3. 可用现金 walletDb := implement.NewUserWalletDb(db.Db) wallet, err := walletDb.GetUserVirtualWallet(user.Id) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } resp := md.PointsExchangeGetBasicResp{ AvailableEnergy: eggEnergyAmount.Amount, AvailableCash: wallet.Amount, } e.OutSuc(c, resp, nil) } // GetPriceCurve // @Summary 蛋蛋星球-积分中心-价格趋势(获取) // @Tags 积分中心 // @Description 价格趋势(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param kind query string false "1:按天 2:按小时 3:按周" // @Success 200 {object} md.GetPriceCurveResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/priceCurve [GET] func GetPriceCurve(c *gin.Context) { kind := c.DefaultQuery("kind", "1") now := time.Now() priceDb := implement.NewEggEnergyPriceDb(db.Db) m, has, err := priceDb.EggEnergyPriceGetLastOne() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } if has == false { e.OutErr(c, e.ERR_NO_DATA, "未查询到数据") return } var yData []interface{} var xData []interface{} switch kind { case "1": var date = now.AddDate(0, 0, -6).Format("2006-01-02") var sql = fmt.Sprintf("SELECT price,date FROM `egg_energy_price` WHERE HOUR = 23 AND DATE >= \"%s\" AND DATE != \"%s\" ORDER BY DATE ASC ", date, now.Format("2006-01-02")) results, _ := db.Db.QueryString(db.Db, sql) for _, v := range results { tmpDate := utils.String2TimeV2(v["date"]) yData = append(yData, v["price"]) xData = append(xData, tmpDate.Format("01-02")) } yData = append(yData, m.Price) tmpDate := utils.String2TimeV2(m.Date) xData = append(xData, tmpDate.Format("01-02")) break case "2": for i := 29; i >= 1; i-- { date := now.Add(-time.Hour * 4 * time.Duration(i)).Format("2006-01-02") hour := now.Add(-time.Hour * 4 * time.Duration(i)).Hour() var sql = "SELECT price,date,hour FROM `egg_energy_price` WHERE HOUR = %d AND DATE = \"%s\" " sql = fmt.Sprintf(sql, hour, date) results, _ := db.Db.QueryString(sql) if results != nil { //if results[0]["date"] != now.Format("2006-01-02") { // continue //} yData = append(yData, results[0]["price"]) xData = append(xData, results[0]["hour"]+":00") } } yData = append(yData, m.Price) xData = append(xData, m.Hour+":00") break case "3": var nums = 6 for i := nums; i >= 1; i-- { var date = now.AddDate(0, 0, -7*i).Format("2006-01-02") var sql = "SELECT price,date FROM `egg_energy_price` WHERE HOUR = 23 AND DATE = \"%s\" " sql = fmt.Sprintf(sql, date) results, _ := db.Db.QueryString(db.Db, sql) if results != nil { tmpDate := utils.String2TimeV2(results[0]["date"]) yData = append(yData, results[0]["price"]) xData = append(xData, tmpDate.Format("01-02")) } } yData = append(yData, m.Price) tmpDate := utils.String2TimeV2(m.Date) xData = append(xData, tmpDate.Format("01-02")) break } e.OutSuc(c, md.GetPriceCurveResp{ YData: yData, XData: xData, }, nil) return } // ExchangeEnergy // @Summary 蛋蛋星球-积分中心-能量兑换 // @Tags 积分中心 // @Description 能量兑换 // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param req body md.ExchangeEnergyReq true "需要兑换的能量值" // @Success 200 {string} "success" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/exchangeEnergy [POST] func ExchangeEnergy(c *gin.Context) { val, exists := c.Get("user") if !exists { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } user, ok := val.(*model.User) if !ok { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } var req *md.ExchangeEnergyReq if err1 := c.ShouldBindJSON(&req); err1 != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err1.Error()) return } // 1. 获取蛋蛋能量货币类型 settingDb := implement.NewEggEnergyBasicSettingDb(db.Db) setting, err := settingDb.EggEnergyBasicSettingGetOne() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } coinID := setting.PersonEggEnergyCoinId session := db.Db.NewSession() defer session.Close() // 2. 计算蛋蛋能量兑换的金额 egg_system_rules.Init(cfg.RedisAddr) eggEnergyCoreData, cb, err1 := svc2.GetEggEnergyCoreData(db.Db) if err1 != nil { fmt.Println("EggEnergyAutoRecordPrices_ERR:::::", err1.Error()) return } if cb != nil { defer cb() // 释放锁 } // 3. 获取用户蛋蛋能量余额 eggEnergyAmount, err := rule.GetUserCoinAmount(session, coinID, user.Id) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } // 4. 判断蛋蛋能量是否足够兑换 if utils.StrToFloat64(eggEnergyAmount) < utils.StrToFloat64(req.EnergyAmount) { e.OutErr(c, e.ERR_BALANCE_NOT_ENOUGH, nil) return } // 5. 调用降价公式 err, calcPriceReductionFormula := egg_energy.CalcPriceReductionFormula(req.EnergyAmount, eggEnergyCoreData, utils.IntToStr(user.Level), *setting) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } // 6. 更改动态数据 err = egg_energy.DealAvailableEggEnergyCoin(session, int(enum2.EggEnergyExchangeAccountBalance), eggEnergyCoreData, md3.DealAvailableEggEnergyCoinReq{ Amount: req.EnergyAmount, AmountFee: calcPriceReductionFormula.AmountFee, BeforePrice: calcPriceReductionFormula.BeforePrice, AfterPrice: calcPriceReductionFormula.AfterPrice, BeforePlanetTotalValue: calcPriceReductionFormula.BeforePlanetTotalValue, AfterPlanetTotalValue: calcPriceReductionFormula.AfterPlanetTotalValue, BeforeEnergyTotalNums: calcPriceReductionFormula.BeforeEnergyTotalNums, AfterEnergyTotalNums: calcPriceReductionFormula.AfterEnergyTotalNums, }) if err != nil { fmt.Println("ActivityCoinAutoExchangeEggPersonEnergy:::::err111:::", err) _ = session.Rollback() return } // 7. 扣除蛋蛋能量 dealUserVirtualCoinReq := md2.DealUserVirtualCoinReq{ Kind: "sub", Title: enum.EggEnergyToExchangeToAmount.String(), TransferType: int(enum.EggEnergyToExchangeToAmount), CoinId: coinID, Uid: user.Id, Amount: utils.StrToFloat64(req.EnergyAmount), } err = rule.DealUserVirtualCoin(session, dealUserVirtualCoinReq) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) session.Rollback() return } // 8. 增加账户余额 dealUserWalletReq := md2.DealUserWalletReq{ Direction: "add", Kind: int(enum.EggEnergyExchangeAccountBalance), Title: enum.EggEnergyExchangeAccountBalance.String(), Uid: user.Id, Amount: utils.StrToFloat64(calcPriceReductionFormula.GetEggEnergyAmount), } err = rule.DealUserWallet(session, dealUserWalletReq) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) session.Rollback() return } err = session.Commit() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } e.OutSuc(c, "success", nil) } // GetContributionValue // @Summary 蛋蛋星球-积分中心-贡献值(获取) // @Tags 积分中心 // @Description 贡献值(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Success 200 {object} md.GetContributionValueResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/contributionValue [GET] func GetContributionValue(c *gin.Context) { val, exists := c.Get("user") if !exists { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } user, ok := val.(*model.User) if !ok { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } settingDb := implement.NewEggEnergyBasicSettingDb(db.Db) setting, err := settingDb.EggEnergyBasicSettingGetOne() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } coinID := setting.ContributionCoinId virtualAmountDb := implement.NewUserVirtualAmountDb(db.Db) virtualAmount, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, coinID) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } var contributionValue string if virtualAmount != nil { contributionValueDecimal, err := decimal.NewFromString(virtualAmount.Amount) if err != nil { e.OutErr(c, e.ERR_UNMARSHAL, err.Error()) return } contributionValue = contributionValueDecimal.StringFixed(0) } coinDb := implement.NewVirtualCoinDb(db.Db) coin, err := coinDb.VirtualCoinGetOneByParams(map[string]interface{}{ "key": "id", "value": coinID, }) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } var ratio string if coin != nil { ratio = coin.ExchangeRatio } resp := md.GetContributionValueResp{ ContributionValue: contributionValue, Ratio: ratio, } e.OutSuc(c, resp, nil) } // GetContributionValueFlow // @Summary 蛋蛋星球-积分中心-贡献值明细(获取) // @Tags 积分中心 // @Description 贡献值明细(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param limit query string true "每页大小" // @Param page query string true "页数" // @Success 200 {object} md.GetContributionValueFlowResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/contributionValueFlow [GET] func GetContributionValueFlow(c *gin.Context) { page := c.DefaultQuery("page", "1") limit := c.DefaultQuery("limit", "10") val, exists := c.Get("user") if !exists { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } user, ok := val.(*model.User) if !ok { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } settingDb := implement.NewEggEnergyBasicSettingDb(db.Db) setting, err := settingDb.EggEnergyBasicSettingGetOne() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } coinID := setting.ContributionCoinId flowDb := implement.NewUserVirtualCoinFlowDb(db.Db) flows, total, err := flowDb.UserVirtualCoinFlowFindByCoinAndUser(utils.StrToInt(page), utils.StrToInt(limit), coinID, user.Id, "", "", 0, false, 0) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } list := make([]md.ContributionValueFlowNode, len(flows)) for i, flow := range flows { list[i].Title = flow.Title amountDecimal, err1 := decimal.NewFromString(flow.Amount) if err1 != nil { e.OutErr(c, e.ERR_UNMARSHAL, err1.Error()) return } list[i].Amount = amountDecimal.StringFixed(0) list[i].Direction = utils.IntToStr(flow.Direction) list[i].CreateAt = flow.CreateAt } resp := md.GetContributionValueFlowResp{ List: list, Paginate: md.Paginate{ Limit: utils.StrToInt(limit), Page: utils.StrToInt(page), Total: total, }, } e.OutSuc(c, resp, nil) } func GetPointMap(c *gin.Context) { val, exists := c.Get("user") if !exists { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } user, ok := val.(*model.User) if !ok { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } now := time.Now() // 1. 获取当期有效蛋蛋分 nowIndex := md2.EggEnergyUserEggScoreEsAlias + "_" + es2.GetLatestEffectiveIndexFromAlias(now) boolQuery := elastic.NewBoolQuery() boolQuery.Filter(elastic.NewTermQuery("uid", user.Id)) searchResult, err := es.EsClient.Search(). Index(nowIndex). Query(boolQuery). Pretty(true). Do(context.Background()) if searchResult == nil { e.OutErr(c, e.ERR_DB_ORM, errors.New("failed to get current egg score")) return } var results []md.UserEggFlowReqRespList if searchResult.Hits.TotalHits.Value != 0 { // 解析结果 for _, hit := range searchResult.Hits.Hits { var doc md.UserEggFlowReqRespList err = json.Unmarshal(hit.Source, &doc) if err != nil { e.OutErr(c, e.ERR_UNMARSHAL, err.Error()) return } results = append(results, doc) } } // nowScore := utils.Float64ToStr(results[0].ScoreValue) // todo 计算分数权重 } // GetEggPointRecord // @Summary 蛋蛋星球-积分中心-蛋蛋分明细(获取) // @Tags 积分中心 // @Description 蛋蛋分明细(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param limit query string true "每页大小" // @Param page query string true "页数" // @Success 200 {object} md.GetEggPointRecordResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/record [GET] func GetEggPointRecord(c *gin.Context) { pageStr := c.DefaultQuery("page", "1") limitStr := c.DefaultQuery("limit", "5") page := utils.StrToInt(pageStr) limit := utils.StrToInt(limitStr) val, exists := c.Get("user") if !exists { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } user, ok := val.(*model.User) if !ok { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } now := time.Now() list, nowScore, indexNum, err := svc.GetEggPointRecordBase(now, user.Id, page, limit) if err != nil { resp := md.GetEggPointRecordResp{ NowScore: "60", List: nil, Paginate: md.Paginate{ Limit: limit, Page: page, Total: 0, }, } e.OutSuc(c, resp, nil) return } resp := md.GetEggPointRecordResp{ NowScore: nowScore, List: list, Paginate: md.Paginate{ Limit: limit, Page: page, Total: int64(indexNum), }, } e.OutSuc(c, resp, nil) } // GetEggEnergyFlow // @Summary 蛋蛋星球-积分中心-收支明细(获取) // @Tags 积分中心 // @Description 收支明细(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param limit query string true "每页大小" // @Param page query string true "页数" // @Param startAt query string false "开始时间" // @Param endAt query string false "结束时间" // @Param direction query string false "流水方向(1.收入 2.支出 0.全部)" // @Success 200 {object} md.GetEggEnergyFlowResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/energyFlow [GET] func GetEggEnergyFlow(c *gin.Context) { pageStr := c.DefaultQuery("page", "1") limitStr := c.DefaultQuery("limit", "10") startAt := c.Query("startAt") endAt := c.Query("endAt") directionStr := c.Query("direction") val, exists := c.Get("user") if !exists { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } user, ok := val.(*model.User) if !ok { e.OutErr(c, e.ERR_USER_CHECK_ERR, nil) return } coinDb := implement.NewVirtualCoinDb(db.Db) coins, err := coinDb.VirtualCoinFindAll() if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } if coins == nil { e.OutErr(c, e.ERR_NO_DATA, errors.New("未初始化货币")) return } coinsList := make([]map[string]interface{}, len(coins)) coinsMap := map[int]string{} for i, coin := range coins { coinsList[i] = map[string]interface{}{ "coinID": coin.Id, "name": coin.Name, } coinsMap[coin.Id] = coin.Name } direction := 0 switch directionStr { case "1": direction = 1 case "2": direction = 2 } page := utils.StrToInt(pageStr) limit := utils.StrToInt(limitStr) flowDb := implement.NewUserVirtualCoinFlowDb(db.Db) flows, total, err := flowDb.UserVirtualCoinFlowFindByCoinAndUser(page, limit, 0, user.Id, startAt, endAt, direction, false, 0) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err.Error()) return } list := make([]md.EggEnergyFlowNode, len(flows)) for i, flow := range flows { list[i].Title = flow.Title list[i].Amount = flow.Amount list[i].Direction = flow.Direction list[i].CreateAt = flow.CreateAt list[i].Id = flow.Id list[i].BeforeAmount = flow.BeforeAmount list[i].AfterAmount = flow.AfterAmount list[i].CoinName = coinsMap[flow.CoinId] list[i].SysFee = flow.SysFee list[i].TransferType = enum.UserVirtualAmountFlowTransferType(flow.TransferType).String() } resp := md.GetEggEnergyFlowResp{ List: list, Paginate: md.Paginate{ Limit: limit, Page: page, Total: total, }, } e.OutSuc(c, resp, nil) } // PointsCenterCalcExchange // @Summary 蛋蛋星球-积分中心-预估积分兑换 // @Tags 积分中心 // @Description 蛋蛋分明细(获取) // @Accept json // @Produce json // @param Authorization header string true "验证参数Bearer和token空格拼接" // @Param amount query string true "需要兑换能量值" // @Success 200 {object} md.PointsCenterCalcExchangeResp "具体数据" // @Failure 400 {object} md.Response "具体错误" // @Router /api/v1/pointsCenter/calcExchange [GET] func PointsCenterCalcExchange(c *gin.Context) { amount := c.DefaultQuery("amount", "") user := svc.GetUser(c) engine := db.Db rule2.Init(cfg.RedisAddr) eggEnergyCoreData, cb, err1 := svc2.GetEggEnergyCoreData(engine) if err1 != nil { e.OutErr(c, e.ERR_DB_ORM, err1.Error()) return } if cb != nil { defer cb() // 释放锁 } eggEnergyBasicSettingDb := implement.NewEggEnergyBasicSettingDb(engine) eggEnergyBasicSetting, err1 := eggEnergyBasicSettingDb.EggEnergyBasicSettingGetOneByParams(map[string]interface{}{ "key": "is_open", "value": 1, }) if err1 != nil { e.OutErr(c, e.ERR_DB_ORM, err1.Error()) return } if eggEnergyBasicSetting == nil { err1 = errors.New("蛋蛋能量设置未开启!") e.OutErr(c, e.ERR, err1.Error()) return } //能量兑换余额 err, exchangeResp := egg_energy.CalcPriceReductionFormula(amount, eggEnergyCoreData, strconv.Itoa(user.Level), *eggEnergyBasicSetting) if err != nil { e.OutErr(c, e.ERR, err.Error()) return } resp := md.PointsCenterCalcExchangeResp{ Value: exchangeResp.GetEggEnergyAmount, } e.OutSuc(c, resp, nil) return }