蛋蛋星球-客户端
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 місяць тому
4 тижднів тому
1 місяць тому
1 місяць тому
4 тижднів тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 місяць тому
1 місяць тому
2 тижднів тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 тиждень тому
1 тиждень тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 місяць тому
1 місяць тому
1 тиждень тому
1 місяць тому
1 місяць тому
4 тижднів тому
3 тижднів тому
4 тижднів тому
1 місяць тому
1 місяць тому
1 місяць тому
3 тижднів тому
3 тижднів тому
1 місяць тому
1 місяць тому
1 місяць тому
1 місяць тому
1 тиждень тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924
  1. package hdl
  2. import (
  3. "applet/app/cfg"
  4. "applet/app/db"
  5. "applet/app/e"
  6. "applet/app/md"
  7. "applet/app/svc"
  8. "applet/app/utils"
  9. "applet/app/utils/cache"
  10. "code.fnuoos.com/EggPlanet/egg_models.git/src/implement"
  11. "code.fnuoos.com/EggPlanet/egg_models.git/src/model"
  12. "code.fnuoos.com/EggPlanet/egg_system_rules.git"
  13. rule2 "code.fnuoos.com/EggPlanet/egg_system_rules.git"
  14. "code.fnuoos.com/EggPlanet/egg_system_rules.git/enum"
  15. md2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/md"
  16. "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule"
  17. "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy"
  18. enum2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy/enum"
  19. md3 "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy/md"
  20. svc2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy/svc"
  21. es2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/utils/es"
  22. "code.fnuoos.com/go_rely_warehouse/zyos_go_es.git/es"
  23. "context"
  24. "encoding/json"
  25. "errors"
  26. "fmt"
  27. "github.com/gin-gonic/gin"
  28. "github.com/olivere/elastic/v7"
  29. "github.com/shopspring/decimal"
  30. "strconv"
  31. "time"
  32. )
  33. const PointsCenterCalcExchangeRedisKey = "Points_Center_Cache_Key"
  34. // PointsCenterGetBasic
  35. // @Summary 蛋蛋星球-积分中心-上部分基础信息(获取)
  36. // @Tags 积分中心
  37. // @Description 上部分基础信息(获取)
  38. // @Accept json
  39. // @Produce json
  40. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  41. // @Success 200 {object} md.PointsCenterGetBasicResp "具体数据"
  42. // @Failure 400 {object} md.Response "具体错误"
  43. // @Router /api/v1/pointsCenter/basic [GET]
  44. func PointsCenterGetBasic(c *gin.Context) {
  45. val, exists := c.Get("user")
  46. if !exists {
  47. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  48. return
  49. }
  50. user, ok := val.(*model.User)
  51. if !ok {
  52. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  53. return
  54. }
  55. settingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  56. setting, err := settingDb.EggEnergyBasicSettingGetOne()
  57. if err != nil {
  58. e.OutErr(c, e.ERR_DB_ORM, nil)
  59. return
  60. }
  61. virtualAmountDb := implement.NewUserVirtualAmountDb(db.Db)
  62. // 蛋蛋能量 (个人 + 团队)
  63. eggPersonalEnergy, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, setting.PersonEggEnergyCoinId)
  64. if err != nil {
  65. e.OutErr(c, e.ERR_DB_ORM, nil)
  66. return
  67. }
  68. eggTeamEnergy, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, setting.TeamEggEnergyCoinId)
  69. if err != nil {
  70. e.OutErr(c, e.ERR_DB_ORM, nil)
  71. return
  72. }
  73. eggEnergy := utils.StrToFloat64(eggPersonalEnergy.Amount) + utils.StrToFloat64(eggTeamEnergy.Amount)
  74. // 蛋蛋能量价值
  75. coreDataDb := implement.NewEggEnergyCoreDataDb(db.Db)
  76. coreData, err := coreDataDb.EggEnergyCoreDataGet()
  77. if err != nil {
  78. e.OutErr(c, e.ERR_DB_ORM, nil)
  79. return
  80. }
  81. eggEnergyAmount := utils.StrToFloat64(coreData.NowPrice) * eggEnergy
  82. // 活跃积分(蛋蛋积分 = 团队 + 个人)
  83. eggPersonalPoint, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, setting.PersonEggPointsCoinId)
  84. if err != nil {
  85. e.OutErr(c, e.ERR_DB_ORM, nil)
  86. return
  87. }
  88. eggTeamPoint, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, setting.TeamEggPointsCoinId)
  89. if err != nil {
  90. e.OutErr(c, e.ERR_DB_ORM, nil)
  91. return
  92. }
  93. eggPoint := utils.StrToFloat64(eggPersonalPoint.Amount) + utils.StrToFloat64(eggTeamPoint.Amount)
  94. // 蛋蛋积分价值
  95. coinDb := implement.NewVirtualCoinDb(db.Db)
  96. coin, err := coinDb.VirtualCoinGetOneByParams(map[string]interface{}{
  97. "key": "id",
  98. "value": setting.PersonEggPointsCoinId,
  99. })
  100. if err != nil {
  101. e.OutErr(c, e.ERR_DB_ORM, nil)
  102. return
  103. }
  104. var eggPointValue decimal.Decimal
  105. if coin != nil {
  106. ratio, _ := decimal.NewFromString(coin.ExchangeRatio)
  107. eggPointValue = decimal.NewFromFloat(eggPoint).Div(ratio)
  108. }
  109. eggPointValue = decimal.NewFromInt(0)
  110. // 账户余额
  111. walletDb := implement.NewUserWalletDb(db.Db)
  112. wallet, err := walletDb.GetUserVirtualWallet(user.Id)
  113. if err != nil {
  114. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  115. return
  116. }
  117. resp := md.PointsCenterGetBasicResp{
  118. Energy: utils.Float64ToStr(eggEnergy),
  119. EnergyValue: utils.Float64ToStr(eggEnergyAmount),
  120. WalletAmount: wallet.Amount,
  121. EggPoint: utils.Float64ToStr(eggPoint),
  122. EggPointValue: eggPointValue.String(),
  123. }
  124. e.OutSuc(c, resp, nil)
  125. }
  126. // InitialData
  127. // @Summary 蛋蛋星球-积分中心-初始数据(获取)
  128. // @Tags 积分中心
  129. // @Description 初始数据(获取)
  130. // @Accept json
  131. // @Produce json
  132. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  133. // @Success 200 {object} md.InitialDataResp "具体数据"
  134. // @Failure 400 {object} md.Response "具体错误"
  135. // @Router /api/v1/pointsCenter/initialData [GET]
  136. func InitialData(c *gin.Context) {
  137. settingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  138. setting, err := settingDb.EggEnergyBasicSettingGetOne()
  139. if err != nil {
  140. e.OutErr(c, e.ERR_DB_ORM, nil)
  141. return
  142. }
  143. resp := md.InitialDataResp{
  144. InitialPrice: setting.InitialPrice,
  145. TotalIssuanceAmount: setting.TotalIssuanceAmount,
  146. TotalTechnologyTeam: setting.TotalTechnologyTeam,
  147. TotalAngelInvestor: setting.TotalAngelInvestor,
  148. TotalOperateFund: setting.TotalOperateFund,
  149. TotalEcologicalDevelopment: setting.TotalEcologicalDevelopment,
  150. }
  151. e.OutSuc(c, resp, nil)
  152. }
  153. // DynamicData
  154. // @Summary 蛋蛋星球-积分中心-动态数据(获取)
  155. // @Tags 积分中心
  156. // @Description 动态数据(获取)
  157. // @Accept json
  158. // @Produce json
  159. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  160. // @Success 200 {object} md.DynamicDataResp "具体数据"
  161. // @Failure 400 {object} md.Response "具体错误"
  162. // @Router /api/v1/pointsCenter/dynamicData [GET]
  163. func DynamicData(c *gin.Context) {
  164. settingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  165. setting, err := settingDb.EggEnergyBasicSettingGetOne()
  166. if err != nil {
  167. e.OutErr(c, e.ERR_DB_ORM, nil)
  168. return
  169. }
  170. // 1.用户持有总量
  171. redisKey1 := PointsCenterCalcExchangeRedisKey + "_1"
  172. redisValue1, err := cache.GetString(redisKey1)
  173. if err != nil {
  174. if err.Error() == "redigo: nil returned" {
  175. amountDb := implement.NewUserVirtualAmountDb(db.Db)
  176. total, err := amountDb.UserVirtualAmountGetSumByCoinKind(setting.PersonEggEnergyCoinId)
  177. if err != nil {
  178. e.OutErr(c, e.ERR_DB_ORM, nil)
  179. return
  180. }
  181. //将获取到的余额值缓存至redis
  182. redisValue1 = utils.Float64ToStr(total)
  183. cache.SetEx(redisKey1, redisValue1, 60)
  184. } else {
  185. e.OutErr(c, e.ERR, err.Error())
  186. return
  187. }
  188. }
  189. // 2.星级分红
  190. redisKey2 := PointsCenterCalcExchangeRedisKey + "_2"
  191. redisValue2, err := cache.GetString(redisKey2)
  192. if err != nil {
  193. if err.Error() == "redigo: nil returned" {
  194. coreDataDb := implement.NewEggEnergyCoreDataDb(db.Db)
  195. coreData, err := coreDataDb.EggEnergyCoreDataGet()
  196. if err != nil {
  197. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  198. return
  199. }
  200. redisValue2 = coreData.StarLevelDividends
  201. cache.SetEx(redisKey2, redisValue2, 60)
  202. } else {
  203. e.OutErr(c, e.ERR, err.Error())
  204. return
  205. }
  206. }
  207. // 3.发展委员会
  208. redisKey3 := PointsCenterCalcExchangeRedisKey + "_3"
  209. redisValue3, err := cache.GetString(redisKey3)
  210. if err != nil {
  211. if err.Error() == "redigo: nil returned" {
  212. coreDataDb := implement.NewEggEnergyCoreDataDb(db.Db)
  213. coreData, err := coreDataDb.EggEnergyCoreDataGet()
  214. if err != nil {
  215. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  216. return
  217. }
  218. redisValue3 = coreData.DevelopmentCommittee
  219. cache.SetEx(redisKey3, redisValue3, 60)
  220. } else {
  221. e.OutErr(c, e.ERR, err.Error())
  222. return
  223. }
  224. }
  225. // 4.公益基金
  226. redisKey4 := PointsCenterCalcExchangeRedisKey + "_4"
  227. redisValue4, err := cache.GetString(redisKey4)
  228. if err != nil {
  229. if err.Error() == "redigo: nil returned" {
  230. coreDataDb := implement.NewEggEnergyCoreDataDb(db.Db)
  231. coreData, err := coreDataDb.EggEnergyCoreDataGet()
  232. if err != nil {
  233. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  234. return
  235. }
  236. redisValue4 = coreData.PublicWelfareAndCharity
  237. cache.SetEx(redisKey4, redisValue4, 60)
  238. } else {
  239. e.OutErr(c, e.ERR, err.Error())
  240. return
  241. }
  242. }
  243. resp := md.DynamicDataResp{
  244. UserTotalHold: redisValue1,
  245. StarLevelDividends: redisValue2,
  246. DevelopmentCommittee: redisValue3,
  247. PublicWelfareAndCharity: redisValue4,
  248. }
  249. e.OutSuc(c, resp, nil)
  250. }
  251. // PointsExchangeGetBasic
  252. // @Summary 蛋蛋星球-积分中心-积分兑换基础信息(获取)
  253. // @Tags 积分中心
  254. // @Description 积分兑换基础信息(获取)
  255. // @Accept json
  256. // @Produce json
  257. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  258. // @Success 200 {object} md.PointsExchangeGetBasicResp "具体数据"
  259. // @Failure 400 {object} md.Response "具体错误"
  260. // @Router /api/v1/pointsCenter/pointsExchangeBasic [GET]
  261. func PointsExchangeGetBasic(c *gin.Context) {
  262. val, exists := c.Get("user")
  263. if !exists {
  264. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  265. return
  266. }
  267. user, ok := val.(*model.User)
  268. if !ok {
  269. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  270. return
  271. }
  272. // 1. 获取蛋蛋能量货币类型
  273. settingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  274. setting, err := settingDb.EggEnergyBasicSettingGetOne()
  275. if err != nil {
  276. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  277. return
  278. }
  279. coinID := setting.PersonEggEnergyCoinId
  280. // 2. 获取可兑蛋蛋能量
  281. virtualAmountDb := implement.NewUserVirtualAmountDb(db.Db)
  282. eggEnergyAmount, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, coinID)
  283. if err != nil {
  284. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  285. return
  286. }
  287. // 3. 可用现金
  288. walletDb := implement.NewUserWalletDb(db.Db)
  289. wallet, err := walletDb.GetUserVirtualWallet(user.Id)
  290. if err != nil {
  291. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  292. return
  293. }
  294. resp := md.PointsExchangeGetBasicResp{
  295. AvailableEnergy: eggEnergyAmount.Amount,
  296. AvailableCash: wallet.Amount,
  297. }
  298. e.OutSuc(c, resp, nil)
  299. }
  300. // GetPriceCurve
  301. // @Summary 蛋蛋星球-积分中心-价格趋势(获取)
  302. // @Tags 积分中心
  303. // @Description 价格趋势(获取)
  304. // @Accept json
  305. // @Produce json
  306. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  307. // @Param kind query string false "1:按天 2:按小时 3:按周"
  308. // @Success 200 {object} md.GetPriceCurveResp "具体数据"
  309. // @Failure 400 {object} md.Response "具体错误"
  310. // @Router /api/v1/pointsCenter/priceCurve [GET]
  311. func GetPriceCurve(c *gin.Context) {
  312. kind := c.DefaultQuery("kind", "1")
  313. now := time.Now()
  314. priceDb := implement.NewEggEnergyPriceDb(db.Db)
  315. m, has, err := priceDb.EggEnergyPriceGetLastOne()
  316. if err != nil {
  317. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  318. return
  319. }
  320. if has == false {
  321. e.OutErr(c, e.ERR_NO_DATA, "未查询到数据")
  322. return
  323. }
  324. var yData []interface{}
  325. var xData []interface{}
  326. switch kind {
  327. case "1":
  328. var date = now.AddDate(0, 0, -6).Format("2006-01-02")
  329. 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"))
  330. results, _ := db.Db.QueryString(db.Db, sql)
  331. for _, v := range results {
  332. tmpDate := utils.String2TimeV2(v["date"])
  333. yData = append(yData, v["price"])
  334. xData = append(xData, tmpDate.Format("01-02"))
  335. }
  336. yData = append(yData, m.Price)
  337. tmpDate := utils.String2TimeV2(m.Date)
  338. xData = append(xData, tmpDate.Format("01-02"))
  339. break
  340. case "2":
  341. for i := 29; i >= 1; i-- {
  342. date := now.Add(-time.Hour * 4 * time.Duration(i)).Format("2006-01-02")
  343. hour := now.Add(-time.Hour * 4 * time.Duration(i)).Hour()
  344. var sql = "SELECT price,date,hour FROM `egg_energy_price` WHERE HOUR = %d AND DATE = \"%s\" "
  345. sql = fmt.Sprintf(sql, hour, date)
  346. results, _ := db.Db.QueryString(sql)
  347. if results != nil {
  348. //if results[0]["date"] != now.Format("2006-01-02") {
  349. // continue
  350. //}
  351. yData = append(yData, results[0]["price"])
  352. xData = append(xData, results[0]["hour"]+":00")
  353. }
  354. }
  355. yData = append(yData, m.Price)
  356. xData = append(xData, m.Hour+":00")
  357. break
  358. case "3":
  359. var nums = 6
  360. for i := nums; i >= 1; i-- {
  361. var date = now.AddDate(0, 0, -7*i).Format("2006-01-02")
  362. var sql = "SELECT price,date FROM `egg_energy_price` WHERE HOUR = 23 AND DATE = \"%s\" "
  363. sql = fmt.Sprintf(sql, date)
  364. results, _ := db.Db.QueryString(db.Db, sql)
  365. if results != nil {
  366. tmpDate := utils.String2TimeV2(results[0]["date"])
  367. yData = append(yData, results[0]["price"])
  368. xData = append(xData, tmpDate.Format("01-02"))
  369. }
  370. }
  371. yData = append(yData, m.Price)
  372. tmpDate := utils.String2TimeV2(m.Date)
  373. xData = append(xData, tmpDate.Format("01-02"))
  374. break
  375. }
  376. e.OutSuc(c, md.GetPriceCurveResp{
  377. YData: yData,
  378. XData: xData,
  379. }, nil)
  380. return
  381. }
  382. // ExchangeEnergy
  383. // @Summary 蛋蛋星球-积分中心-能量兑换
  384. // @Tags 积分中心
  385. // @Description 能量兑换
  386. // @Accept json
  387. // @Produce json
  388. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  389. // @Param req body md.ExchangeEnergyReq true "需要兑换的能量值"
  390. // @Success 200 {string} "success"
  391. // @Failure 400 {object} md.Response "具体错误"
  392. // @Router /api/v1/pointsCenter/exchangeEnergy [POST]
  393. func ExchangeEnergy(c *gin.Context) {
  394. val, exists := c.Get("user")
  395. if !exists {
  396. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  397. return
  398. }
  399. user, ok := val.(*model.User)
  400. if !ok {
  401. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  402. return
  403. }
  404. var req *md.ExchangeEnergyReq
  405. if err1 := c.ShouldBindJSON(&req); err1 != nil {
  406. e.OutErr(c, e.ERR_INVALID_ARGS, err1.Error())
  407. return
  408. }
  409. // 1. 获取蛋蛋能量货币类型
  410. settingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  411. setting, err := settingDb.EggEnergyBasicSettingGetOne()
  412. if err != nil {
  413. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  414. return
  415. }
  416. coinID := setting.PersonEggEnergyCoinId
  417. session := db.Db.NewSession()
  418. defer session.Close()
  419. // 2. 计算蛋蛋能量兑换的金额
  420. egg_system_rules.Init(cfg.RedisAddr)
  421. eggEnergyCoreData, cb, err1 := svc2.GetEggEnergyCoreData(db.Db)
  422. if err1 != nil {
  423. fmt.Println("EggEnergyAutoRecordPrices_ERR:::::", err1.Error())
  424. return
  425. }
  426. if cb != nil {
  427. defer cb() // 释放锁
  428. }
  429. // 3. 获取用户蛋蛋能量余额
  430. eggEnergyAmount, err := rule.GetUserCoinAmount(session, coinID, user.Id)
  431. if err != nil {
  432. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  433. return
  434. }
  435. // 4. 判断蛋蛋能量是否足够兑换
  436. if utils.StrToFloat64(eggEnergyAmount) < utils.StrToFloat64(req.EnergyAmount) {
  437. e.OutErr(c, e.ERR_BALANCE_NOT_ENOUGH, nil)
  438. return
  439. }
  440. // 5. 调用降价公式
  441. err, calcPriceReductionFormula := egg_energy.CalcPriceReductionFormula(req.EnergyAmount, eggEnergyCoreData, utils.IntToStr(user.Level), *setting)
  442. if err != nil {
  443. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  444. return
  445. }
  446. // 6. 更改动态数据
  447. err = egg_energy.DealAvailableEggEnergyCoin(session, int(enum2.EggEnergyExchangeAccountBalance), eggEnergyCoreData, md3.DealAvailableEggEnergyCoinReq{
  448. Amount: req.EnergyAmount,
  449. AmountFee: calcPriceReductionFormula.AmountFee,
  450. BeforePrice: calcPriceReductionFormula.BeforePrice,
  451. AfterPrice: calcPriceReductionFormula.AfterPrice,
  452. BeforePlanetTotalValue: calcPriceReductionFormula.BeforePlanetTotalValue,
  453. AfterPlanetTotalValue: calcPriceReductionFormula.AfterPlanetTotalValue,
  454. BeforeEnergyTotalNums: calcPriceReductionFormula.BeforeEnergyTotalNums,
  455. AfterEnergyTotalNums: calcPriceReductionFormula.AfterEnergyTotalNums,
  456. })
  457. if err != nil {
  458. fmt.Println("ActivityCoinAutoExchangeEggPersonEnergy:::::err111:::", err)
  459. _ = session.Rollback()
  460. return
  461. }
  462. // 7. 扣除蛋蛋能量
  463. dealUserVirtualCoinReq := md2.DealUserVirtualCoinReq{
  464. Kind: "sub",
  465. Title: enum.EggEnergyToExchangeToAmount.String(),
  466. TransferType: int(enum.EggEnergyToExchangeToAmount),
  467. CoinId: coinID,
  468. Uid: user.Id,
  469. Amount: utils.StrToFloat64(req.EnergyAmount),
  470. }
  471. err = rule.DealUserVirtualCoin(session, dealUserVirtualCoinReq)
  472. if err != nil {
  473. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  474. session.Rollback()
  475. return
  476. }
  477. // 8. 增加账户余额
  478. dealUserWalletReq := md2.DealUserWalletReq{
  479. Direction: "add",
  480. Kind: int(enum.EggEnergyExchangeAccountBalance),
  481. Title: enum.EggEnergyExchangeAccountBalance.String(),
  482. Uid: user.Id,
  483. Amount: utils.StrToFloat64(calcPriceReductionFormula.GetEggEnergyAmount),
  484. }
  485. err = rule.DealUserWallet(session, dealUserWalletReq)
  486. if err != nil {
  487. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  488. session.Rollback()
  489. return
  490. }
  491. err = session.Commit()
  492. if err != nil {
  493. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  494. return
  495. }
  496. e.OutSuc(c, "success", nil)
  497. }
  498. // GetContributionValue
  499. // @Summary 蛋蛋星球-积分中心-贡献值(获取)
  500. // @Tags 积分中心
  501. // @Description 贡献值(获取)
  502. // @Accept json
  503. // @Produce json
  504. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  505. // @Success 200 {object} md.GetContributionValueResp "具体数据"
  506. // @Failure 400 {object} md.Response "具体错误"
  507. // @Router /api/v1/pointsCenter/contributionValue [GET]
  508. func GetContributionValue(c *gin.Context) {
  509. val, exists := c.Get("user")
  510. if !exists {
  511. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  512. return
  513. }
  514. user, ok := val.(*model.User)
  515. if !ok {
  516. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  517. return
  518. }
  519. settingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  520. setting, err := settingDb.EggEnergyBasicSettingGetOne()
  521. if err != nil {
  522. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  523. return
  524. }
  525. coinID := setting.ContributionCoinId
  526. virtualAmountDb := implement.NewUserVirtualAmountDb(db.Db)
  527. virtualAmount, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, coinID)
  528. if err != nil {
  529. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  530. return
  531. }
  532. var contributionValue string
  533. if virtualAmount != nil {
  534. contributionValueDecimal, err := decimal.NewFromString(virtualAmount.Amount)
  535. if err != nil {
  536. e.OutErr(c, e.ERR_UNMARSHAL, err.Error())
  537. return
  538. }
  539. contributionValue = contributionValueDecimal.StringFixed(0)
  540. }
  541. coinDb := implement.NewVirtualCoinDb(db.Db)
  542. coin, err := coinDb.VirtualCoinGetOneByParams(map[string]interface{}{
  543. "key": "id",
  544. "value": coinID,
  545. })
  546. if err != nil {
  547. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  548. return
  549. }
  550. var ratio string
  551. if coin != nil {
  552. ratio = coin.ExchangeRatio
  553. }
  554. resp := md.GetContributionValueResp{
  555. ContributionValue: contributionValue,
  556. Ratio: ratio,
  557. }
  558. e.OutSuc(c, resp, nil)
  559. }
  560. // GetContributionValueFlow
  561. // @Summary 蛋蛋星球-积分中心-贡献值明细(获取)
  562. // @Tags 积分中心
  563. // @Description 贡献值明细(获取)
  564. // @Accept json
  565. // @Produce json
  566. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  567. // @Param limit query string true "每页大小"
  568. // @Param page query string true "页数"
  569. // @Success 200 {object} md.GetContributionValueFlowResp "具体数据"
  570. // @Failure 400 {object} md.Response "具体错误"
  571. // @Router /api/v1/pointsCenter/contributionValueFlow [GET]
  572. func GetContributionValueFlow(c *gin.Context) {
  573. page := c.DefaultQuery("page", "1")
  574. limit := c.DefaultQuery("limit", "10")
  575. val, exists := c.Get("user")
  576. if !exists {
  577. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  578. return
  579. }
  580. user, ok := val.(*model.User)
  581. if !ok {
  582. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  583. return
  584. }
  585. settingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  586. setting, err := settingDb.EggEnergyBasicSettingGetOne()
  587. if err != nil {
  588. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  589. return
  590. }
  591. coinID := setting.ContributionCoinId
  592. flowDb := implement.NewUserVirtualCoinFlowDb(db.Db)
  593. flows, total, err := flowDb.UserVirtualCoinFlowFindByCoinAndUser(utils.StrToInt(page), utils.StrToInt(limit), coinID, user.Id, "", "", 0, false, 0)
  594. if err != nil {
  595. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  596. return
  597. }
  598. list := make([]md.ContributionValueFlowNode, len(flows))
  599. for i, flow := range flows {
  600. list[i].Title = flow.Title
  601. amountDecimal, err1 := decimal.NewFromString(flow.Amount)
  602. if err1 != nil {
  603. e.OutErr(c, e.ERR_UNMARSHAL, err1.Error())
  604. return
  605. }
  606. list[i].Amount = amountDecimal.StringFixed(0)
  607. list[i].Direction = utils.IntToStr(flow.Direction)
  608. list[i].CreateAt = flow.CreateAt
  609. }
  610. resp := md.GetContributionValueFlowResp{
  611. List: list,
  612. Paginate: md.Paginate{
  613. Limit: utils.StrToInt(limit),
  614. Page: utils.StrToInt(page),
  615. Total: total,
  616. },
  617. }
  618. e.OutSuc(c, resp, nil)
  619. }
  620. func GetPointMap(c *gin.Context) {
  621. val, exists := c.Get("user")
  622. if !exists {
  623. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  624. return
  625. }
  626. user, ok := val.(*model.User)
  627. if !ok {
  628. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  629. return
  630. }
  631. now := time.Now()
  632. // 1. 获取当期有效蛋蛋分
  633. nowIndex := md2.EggEnergyUserEggScoreEsAlias + "_" + es2.GetLatestEffectiveIndexFromAlias(now)
  634. boolQuery := elastic.NewBoolQuery()
  635. boolQuery.Filter(elastic.NewTermQuery("uid", user.Id))
  636. searchResult, err := es.EsClient.Search().
  637. Index(nowIndex).
  638. Query(boolQuery).
  639. Pretty(true).
  640. Do(context.Background())
  641. if searchResult == nil {
  642. e.OutErr(c, e.ERR_DB_ORM, errors.New("failed to get current egg score"))
  643. return
  644. }
  645. var results []md.UserEggFlowReqRespList
  646. if searchResult.Hits.TotalHits.Value != 0 {
  647. // 解析结果
  648. for _, hit := range searchResult.Hits.Hits {
  649. var doc md.UserEggFlowReqRespList
  650. err = json.Unmarshal(hit.Source, &doc)
  651. if err != nil {
  652. e.OutErr(c, e.ERR_UNMARSHAL, err.Error())
  653. return
  654. }
  655. results = append(results, doc)
  656. }
  657. }
  658. // nowScore := utils.Float64ToStr(results[0].ScoreValue)
  659. // todo 计算分数权重
  660. }
  661. // GetEggPointRecord
  662. // @Summary 蛋蛋星球-积分中心-蛋蛋分明细(获取)
  663. // @Tags 积分中心
  664. // @Description 蛋蛋分明细(获取)
  665. // @Accept json
  666. // @Produce json
  667. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  668. // @Param limit query string true "每页大小"
  669. // @Param page query string true "页数"
  670. // @Success 200 {object} md.GetEggPointRecordResp "具体数据"
  671. // @Failure 400 {object} md.Response "具体错误"
  672. // @Router /api/v1/pointsCenter/record [GET]
  673. func GetEggPointRecord(c *gin.Context) {
  674. pageStr := c.DefaultQuery("page", "1")
  675. limitStr := c.DefaultQuery("limit", "5")
  676. page := utils.StrToInt(pageStr)
  677. limit := utils.StrToInt(limitStr)
  678. val, exists := c.Get("user")
  679. if !exists {
  680. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  681. return
  682. }
  683. user, ok := val.(*model.User)
  684. if !ok {
  685. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  686. return
  687. }
  688. now := time.Now()
  689. list, nowScore, indexNum, err := svc.GetEggPointRecordBase(now, user.Id, page, limit)
  690. if err != nil {
  691. resp := md.GetEggPointRecordResp{
  692. NowScore: "60",
  693. List: nil,
  694. Paginate: md.Paginate{
  695. Limit: limit,
  696. Page: page,
  697. Total: 0,
  698. },
  699. }
  700. e.OutSuc(c, resp, nil)
  701. return
  702. }
  703. resp := md.GetEggPointRecordResp{
  704. NowScore: nowScore,
  705. List: list,
  706. Paginate: md.Paginate{
  707. Limit: limit,
  708. Page: page,
  709. Total: int64(indexNum),
  710. },
  711. }
  712. e.OutSuc(c, resp, nil)
  713. }
  714. // GetEggEnergyFlow
  715. // @Summary 蛋蛋星球-积分中心-收支明细(获取)
  716. // @Tags 积分中心
  717. // @Description 收支明细(获取)
  718. // @Accept json
  719. // @Produce json
  720. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  721. // @Param limit query string true "每页大小"
  722. // @Param page query string true "页数"
  723. // @Param startAt query string false "开始时间"
  724. // @Param endAt query string false "结束时间"
  725. // @Param direction query string false "流水方向(1.收入 2.支出 0.全部)"
  726. // @Success 200 {object} md.GetEggEnergyFlowResp "具体数据"
  727. // @Failure 400 {object} md.Response "具体错误"
  728. // @Router /api/v1/pointsCenter/energyFlow [GET]
  729. func GetEggEnergyFlow(c *gin.Context) {
  730. pageStr := c.DefaultQuery("page", "1")
  731. limitStr := c.DefaultQuery("limit", "10")
  732. startAt := c.Query("startAt")
  733. endAt := c.Query("endAt")
  734. directionStr := c.Query("direction")
  735. val, exists := c.Get("user")
  736. if !exists {
  737. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  738. return
  739. }
  740. user, ok := val.(*model.User)
  741. if !ok {
  742. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  743. return
  744. }
  745. coinDb := implement.NewVirtualCoinDb(db.Db)
  746. coins, err := coinDb.VirtualCoinFindAll()
  747. if err != nil {
  748. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  749. return
  750. }
  751. if coins == nil {
  752. e.OutErr(c, e.ERR_NO_DATA, errors.New("未初始化货币"))
  753. return
  754. }
  755. coinsList := make([]map[string]interface{}, len(coins))
  756. coinsMap := map[int]string{}
  757. for i, coin := range coins {
  758. coinsList[i] = map[string]interface{}{
  759. "coinID": coin.Id,
  760. "name": coin.Name,
  761. }
  762. coinsMap[coin.Id] = coin.Name
  763. }
  764. direction := 0
  765. switch directionStr {
  766. case "1":
  767. direction = 1
  768. case "2":
  769. direction = 2
  770. }
  771. page := utils.StrToInt(pageStr)
  772. limit := utils.StrToInt(limitStr)
  773. flowDb := implement.NewUserVirtualCoinFlowDb(db.Db)
  774. flows, total, err := flowDb.UserVirtualCoinFlowFindByCoinAndUser(page, limit, 0, user.Id, startAt, endAt, direction, false, 0)
  775. if err != nil {
  776. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  777. return
  778. }
  779. list := make([]md.EggEnergyFlowNode, len(flows))
  780. for i, flow := range flows {
  781. list[i].Title = flow.Title
  782. list[i].Amount = flow.Amount
  783. list[i].Direction = flow.Direction
  784. list[i].CreateAt = flow.CreateAt
  785. list[i].Id = flow.Id
  786. list[i].BeforeAmount = flow.BeforeAmount
  787. list[i].AfterAmount = flow.AfterAmount
  788. list[i].CoinName = coinsMap[flow.CoinId]
  789. list[i].SysFee = flow.SysFee
  790. list[i].TransferType = enum.UserVirtualAmountFlowTransferType(flow.TransferType).String()
  791. }
  792. resp := md.GetEggEnergyFlowResp{
  793. List: list,
  794. Paginate: md.Paginate{
  795. Limit: limit,
  796. Page: page,
  797. Total: total,
  798. },
  799. }
  800. e.OutSuc(c, resp, nil)
  801. }
  802. // PointsCenterCalcExchange
  803. // @Summary 蛋蛋星球-积分中心-预估积分兑换
  804. // @Tags 积分中心
  805. // @Description 蛋蛋分明细(获取)
  806. // @Accept json
  807. // @Produce json
  808. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  809. // @Param amount query string true "需要兑换能量值"
  810. // @Success 200 {object} md.PointsCenterCalcExchangeResp "具体数据"
  811. // @Failure 400 {object} md.Response "具体错误"
  812. // @Router /api/v1/pointsCenter/calcExchange [GET]
  813. func PointsCenterCalcExchange(c *gin.Context) {
  814. amount := c.DefaultQuery("amount", "")
  815. user := svc.GetUser(c)
  816. engine := db.Db
  817. rule2.Init(cfg.RedisAddr)
  818. eggEnergyCoreData, cb, err1 := svc2.GetEggEnergyCoreData(engine)
  819. if err1 != nil {
  820. e.OutErr(c, e.ERR_DB_ORM, err1.Error())
  821. return
  822. }
  823. if cb != nil {
  824. defer cb() // 释放锁
  825. }
  826. eggEnergyBasicSettingDb := implement.NewEggEnergyBasicSettingDb(engine)
  827. eggEnergyBasicSetting, err1 := eggEnergyBasicSettingDb.EggEnergyBasicSettingGetOneByParams(map[string]interface{}{
  828. "key": "is_open",
  829. "value": 1,
  830. })
  831. if err1 != nil {
  832. e.OutErr(c, e.ERR_DB_ORM, err1.Error())
  833. return
  834. }
  835. if eggEnergyBasicSetting == nil {
  836. err1 = errors.New("蛋蛋能量设置未开启!")
  837. e.OutErr(c, e.ERR, err1.Error())
  838. return
  839. }
  840. //能量兑换余额
  841. err, exchangeResp := egg_energy.CalcPriceReductionFormula(amount, eggEnergyCoreData, strconv.Itoa(user.Level), *eggEnergyBasicSetting)
  842. if err != nil {
  843. e.OutErr(c, e.ERR, err.Error())
  844. return
  845. }
  846. resp := md.PointsCenterCalcExchangeResp{
  847. Value: exchangeResp.GetEggEnergyAmount,
  848. }
  849. e.OutSuc(c, resp, nil)
  850. return
  851. }