|
- package hdl
-
- import (
- "applet/app/cfg"
- "applet/app/db"
- "applet/app/e"
- "applet/app/md"
- "applet/app/utils"
- "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"
- "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"
- md3 "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy/md"
- "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy/svc"
- "fmt"
- "github.com/gin-gonic/gin"
- "github.com/shopspring/decimal"
- "time"
- )
-
- // 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/getBasic [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
- }
-
- // 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.PointsCenterGetBasicResp{
- 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, -30).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(sql)
- for _, v := range results {
- tmpDate := utils.TimeParseStd(v["date"])
- yData = append(yData, v["price"])
- xData = append(xData, tmpDate.Format("01-02"))
- }
- yData = append(yData, m.Price)
- tmpDate := utils.TimeParseStd(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 = 29
- 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(sql)
- if results != nil {
- tmpDate := utils.TimeParseStd(results[0]["date"])
- yData = append(yData, results[0]["price"])
- xData = append(xData, tmpDate.Format("01-02"))
- }
- }
- yData = append(yData, m.Price)
- tmpDate := utils.TimeParseStd(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 := svc.GetEggEnergyCoreData(db.Db)
- if err1 != nil {
- fmt.Println("EggEnergyAutoRecordPrices_ERR:::::", err1.Error())
- return
- }
- if cb != nil {
- defer cb() // 释放锁
- }
- energyAmount, err := decimal.NewFromString(req.EnergyAmount)
- if err != nil {
- e.OutErr(c, e.ERR_UNMARSHAL, err.Error())
- return
- }
- nowPrice, err := decimal.NewFromString(eggEnergyCoreData.NowPrice)
- if err != nil {
- e.OutErr(c, e.ERR_UNMARSHAL, err.Error())
- return
- }
- amount, ok := energyAmount.Div(nowPrice).Float64()
- if !ok {
- e.OutErr(c, e.ERR_UNMARSHAL, nil)
- return
- }
-
- // 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)
- }
-
- // 5. 调用降价公式
- err, calcPriceReductionFormula := egg_energy.CalcPriceReductionFormula(req.EnergyAmount, eggEnergyCoreData)
- if err != nil {
- e.OutErr(c, e.ERR_DB_ORM, err.Error())
- return
- }
-
- // 6. 更改动态数据
- err = egg_energy.DealAvailableEggEnergyCoin(session, int(enum.EggEnergyExchangeAccountBalance), eggEnergyCoreData, md3.DealAvailableEggEnergyCoinReq{
- Amount: calcPriceReductionFormula.GetEggEnergyAmount,
- 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: amount,
- }
- 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 {
- contributionValue = virtualAmount.Amount
- }
-
- 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 int true "每页大小"
- // @Param page query int 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
- list[i].Amount = flow.Amount
- 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)
- }
|