劲创营---任务项目
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

1776 wiersze
65 KiB

  1. package hdl
  2. import (
  3. "applet/app/cfg"
  4. commDb "applet/app/comm/db"
  5. "applet/app/comm/e"
  6. commSvc "applet/app/comm/svc"
  7. "applet/app/comm/utils"
  8. "applet/app/comm/utils/cache"
  9. "applet/app/comm/utils/logx"
  10. "applet/one_circles/db"
  11. db2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db"
  12. "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model"
  13. enum2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/enum"
  14. md2 "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md"
  15. "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule"
  16. "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles"
  17. "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles/enum"
  18. "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/rule/one_circles/md"
  19. "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/svc"
  20. zhios_order_relate_utils "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/utils"
  21. "encoding/json"
  22. "fmt"
  23. "github.com/gin-gonic/gin"
  24. "github.com/shopspring/decimal"
  25. "github.com/syyongx/php2go"
  26. "math"
  27. "strconv"
  28. "time"
  29. )
  30. func GetStyle(c *gin.Context) {
  31. Db := commSvc.MasterDb(c)
  32. greenEnergyHomepage, err := commDb.SysModFindByName(c, Db, "greenEnergyHomepage") //主页
  33. if err != nil {
  34. e.OutErr(c, e.ERR_DB_ORM, err)
  35. return
  36. }
  37. var greenEnergyHomepageStyle interface{}
  38. if greenEnergyHomepage != nil {
  39. err = json.Unmarshal([]byte(greenEnergyHomepage.Data), &greenEnergyHomepageStyle)
  40. if err != nil {
  41. e.OutErr(c, e.ERR, err)
  42. return
  43. }
  44. }
  45. greenEnergyFlowDetail, err := commDb.SysModFindByName(c, Db, "greenEnergyFlowDetail") //绿色能量明细
  46. if err != nil {
  47. e.OutErr(c, e.ERR_DB_ORM, err)
  48. return
  49. }
  50. var greenEnergyFlowDetailStyle interface{}
  51. if greenEnergyFlowDetail != nil {
  52. err = json.Unmarshal([]byte(greenEnergyFlowDetail.Data), &greenEnergyFlowDetailStyle)
  53. if err != nil {
  54. e.OutErr(c, e.ERR, err)
  55. return
  56. }
  57. }
  58. greenEnergyActivityPointFlowDetail, err := commDb.SysModFindByName(c, Db, "greenEnergyActivityPointFlowDetail") //活跃积分能量明细
  59. if err != nil {
  60. e.OutErr(c, e.ERR_DB_ORM, err)
  61. return
  62. }
  63. var greenEnergyActivityPointFlowDetailStyle interface{}
  64. if greenEnergyActivityPointFlowDetail != nil {
  65. err = json.Unmarshal([]byte(greenEnergyActivityPointFlowDetail.Data), &greenEnergyActivityPointFlowDetailStyle)
  66. if err != nil {
  67. e.OutErr(c, e.ERR, err)
  68. return
  69. }
  70. }
  71. greenEnergyPointsCenter, err := commDb.SysModFindByName(c, Db, "greenEnergyPointsCenter") //积分中心
  72. if err != nil {
  73. e.OutErr(c, e.ERR_DB_ORM, err)
  74. return
  75. }
  76. var greenEnergyPointsCenterStyle interface{}
  77. if greenEnergyPointsCenter != nil {
  78. err = json.Unmarshal([]byte(greenEnergyPointsCenter.Data), &greenEnergyPointsCenterStyle)
  79. if err != nil {
  80. e.OutErr(c, e.ERR, err)
  81. return
  82. }
  83. }
  84. greenEnergyEcologicalApplicationManual, err := commDb.SysModFindByName(c, Db, "greenEnergyEcologicalApplicationManual") //生态应用说明书
  85. if err != nil {
  86. e.OutErr(c, e.ERR_DB_ORM, err)
  87. return
  88. }
  89. var greenEnergyEcologicalApplicationManualStyle interface{}
  90. if greenEnergyPointsCenter != nil {
  91. err = json.Unmarshal([]byte(greenEnergyEcologicalApplicationManual.Data), &greenEnergyEcologicalApplicationManualStyle)
  92. if err != nil {
  93. e.OutErr(c, e.ERR, err)
  94. return
  95. }
  96. }
  97. greenEnergyBasalRate, err := commDb.SysModFindByName(c, Db, "greenEnergyBasalRate") //基础速率
  98. if err != nil {
  99. e.OutErr(c, e.ERR_DB_ORM, err)
  100. return
  101. }
  102. var greenEnergyBasalRateStyle interface{}
  103. if greenEnergyPointsCenter != nil {
  104. err = json.Unmarshal([]byte(greenEnergyBasalRate.Data), &greenEnergyBasalRateStyle)
  105. if err != nil {
  106. e.OutErr(c, e.ERR, err)
  107. return
  108. }
  109. }
  110. greenEnergyTotalRate, err := commDb.SysModFindByName(c, Db, "greenEnergyTotalRate") //总速率
  111. if err != nil {
  112. e.OutErr(c, e.ERR_DB_ORM, err)
  113. return
  114. }
  115. var greenEnergyTotalRateStyle interface{}
  116. if greenEnergyTotalRate != nil {
  117. err = json.Unmarshal([]byte(greenEnergyTotalRate.Data), &greenEnergyTotalRateStyle)
  118. if err != nil {
  119. e.OutErr(c, e.ERR, err)
  120. return
  121. }
  122. }
  123. greenEnergyMyTeam, err := commDb.SysModFindByName(c, Db, "greenEnergyMyTeam") //我的团队
  124. if err != nil {
  125. e.OutErr(c, e.ERR_DB_ORM, err)
  126. return
  127. }
  128. var greenEnergyMyTeamStyle interface{}
  129. if greenEnergyMyTeam != nil {
  130. err = json.Unmarshal([]byte(greenEnergyMyTeam.Data), &greenEnergyMyTeamStyle)
  131. if err != nil {
  132. e.OutErr(c, e.ERR, err)
  133. return
  134. }
  135. }
  136. greenEnergyHeroList, err := commDb.SysModFindByName(c, Db, "greenEnergyHeroList") //英雄榜单
  137. if err != nil {
  138. e.OutErr(c, e.ERR_DB_ORM, err)
  139. return
  140. }
  141. var greenEnergyHeroListStyle interface{}
  142. if greenEnergyHeroList != nil {
  143. err = json.Unmarshal([]byte(greenEnergyHeroList.Data), &greenEnergyHeroListStyle)
  144. if err != nil {
  145. e.OutErr(c, e.ERR, err)
  146. return
  147. }
  148. }
  149. greenEnergyWelfareActivities, err := commDb.SysModFindByName(c, Db, "greenEnergyWelfareActivities") //福利活动
  150. if err != nil {
  151. e.OutErr(c, e.ERR_DB_ORM, err)
  152. return
  153. }
  154. var greenEnergyWelfareActivitiesStyle interface{}
  155. if greenEnergyWelfareActivities != nil {
  156. err = json.Unmarshal([]byte(greenEnergyWelfareActivities.Data), &greenEnergyWelfareActivitiesStyle)
  157. if err != nil {
  158. e.OutErr(c, e.ERR, err)
  159. return
  160. }
  161. }
  162. //
  163. e.OutSuc(c, map[string]interface{}{
  164. "style": map[string]interface{}{
  165. "greenEnergyHomepageStyle": greenEnergyHomepageStyle,
  166. "greenEnergyFlowDetailStyle": greenEnergyFlowDetailStyle,
  167. "greenEnergyActivityPointFlowDetailStyle": greenEnergyActivityPointFlowDetailStyle,
  168. "greenEnergyPointsCenterStyle": greenEnergyPointsCenterStyle,
  169. "greenEnergyEcologicalApplicationManualStyle": greenEnergyEcologicalApplicationManualStyle,
  170. "greenEnergyBasalRateStyle": greenEnergyBasalRateStyle,
  171. "greenEnergyTotalRateStyle": greenEnergyTotalRateStyle,
  172. "greenEnergyMyTeamStyle": greenEnergyMyTeamStyle,
  173. "greenEnergyHeroListStyle": greenEnergyHeroListStyle,
  174. "greenEnergyWelfareActivitiesStyle": greenEnergyWelfareActivitiesStyle,
  175. },
  176. }, nil)
  177. return
  178. }
  179. func UserData(c *gin.Context) {
  180. engine := commSvc.MasterDb(c)
  181. user := commSvc.GetUser(c)
  182. //1、查找 `one_circles_green_energy_basic_setting` 基础设置
  183. oneCirclesGreenEnergyBasicSetting, err := db.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  184. "key": "is_open",
  185. "value": 1,
  186. })
  187. if err != nil {
  188. e.OutErr(c, e.ERR, err.Error())
  189. return
  190. }
  191. //2、获取虚拟币值
  192. var userWalletAmount, userWalletNums string
  193. wallet, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesGreenEnergyBasicSetting.PersonGreenEnergyCoinId)))
  194. if err2 != nil {
  195. e.OutErr(c, e.ERR, err.Error())
  196. return
  197. }
  198. if wallet == nil {
  199. userWalletAmount = "0.00000000"
  200. userWalletNums = "0.00000000"
  201. } else {
  202. userWalletNums = wallet.Amount
  203. walletAmount, _ := decimal.NewFromString(wallet.Amount)
  204. nowPrice, _ := decimal.NewFromString(oneCirclesGreenEnergyBasicSetting.NowPrice)
  205. userWalletAmount = walletAmount.Mul(nowPrice).RoundFloor(8).String()
  206. }
  207. e.OutSuc(c, map[string]interface{}{
  208. "user_green_energy_nums": userWalletNums,
  209. "user_green_energy_amount": userWalletAmount,
  210. }, nil)
  211. return
  212. }
  213. func HeroList(c *gin.Context) {
  214. kind := c.DefaultQuery("kind", "1")
  215. startDate := c.DefaultQuery("start_date", "")
  216. endDate := c.DefaultQuery("end_date", "")
  217. page := utils.StrToInt(c.DefaultQuery("page", "1"))
  218. limit := utils.StrToInt(c.DefaultQuery("limit", "10"))
  219. offset := (page - 1) * limit
  220. if offset < 0 {
  221. offset = 0
  222. }
  223. engine := commSvc.MasterDb(c)
  224. var sql string
  225. if kind == "1" {
  226. sql = "SELECT SUM(amout) AS sum_value, user_virtual_coin_flow.uid, user.nickname as username, user_profile.avatar_url FROM `user_virtual_coin_flow` " +
  227. "LEFT JOIN `user` ON user_virtual_coin_flow.uid = user.uid " +
  228. "LEFT JOIN `user_profile` ON user_virtual_coin_flow.uid = user_profile.uid where 1=1"
  229. if startDate != "" {
  230. sql += " AND user_virtual_coin_flow.create_time >= '" + startDate + "'"
  231. }
  232. if endDate != "" {
  233. sql += " AND user_virtual_coin_flow.create_time <= '" + endDate + "'"
  234. }
  235. sql += " GROUP BY user_virtual_coin_flow.uid ORDER BY sum_value DESC LIMIT %d, %d;"
  236. } else {
  237. sql = "SELECT COUNT(*) AS sum_value, user_relate.uid, user.nickname as username, user_profile.avatar_url FROM `user_relate` " +
  238. "LEFT JOIN `user` ON user_relate.uid = user.uid " +
  239. "LEFT JOIN `user_profile` ON user_relate.uid = user_profile.uid WHERE 1=1"
  240. if startDate != "" {
  241. sql += " AND user_relate.invite_time >= '" + startDate + "'"
  242. }
  243. if endDate != "" {
  244. sql += " AND user_relate.invite_time <= '" + endDate + "'"
  245. }
  246. sql += " GROUP BY user_relate.parent_uid ORDER BY sum_value DESC LIMIT %d, %d;"
  247. }
  248. sql = fmt.Sprintf(sql, offset, limit)
  249. results, err := commDb.QueryNativeString(engine, sql)
  250. if err != nil {
  251. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  252. return
  253. }
  254. var isEnd bool
  255. if len(results) < limit {
  256. isEnd = true
  257. }
  258. e.OutSuc(c, map[string]interface{}{
  259. "list": results,
  260. "is_end": isEnd,
  261. }, nil)
  262. return
  263. }
  264. func WelfareActivities(c *gin.Context) {
  265. engine := commSvc.MasterDb(c)
  266. //1、查找 `one_circles_green_energy_basic_setting` 基础设置
  267. oneCirclesGreenEnergyBasicSetting, err := db.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  268. "key": "is_open",
  269. "value": 1,
  270. })
  271. if err != nil {
  272. e.OutErr(c, e.ERR, err.Error())
  273. return
  274. }
  275. var welfareOrdersLimit *md.WelfareOrdersLimit
  276. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.WelfareOrdersLimit), &welfareOrdersLimit)
  277. if err != nil {
  278. e.OutErr(c, e.ERR, err.Error())
  279. return
  280. }
  281. //2、统计当前会员用户数
  282. var sql = "SELECT COUNT(*)total FROM user "
  283. results, err := commDb.QueryNativeString(engine, sql)
  284. if err != nil {
  285. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  286. return
  287. }
  288. nowTotal := utils.StrToInt64(results[0]["total"])
  289. //3、进行循环比较
  290. var diffMembers int64
  291. for _, v := range welfareOrdersLimit.PlatformMembers {
  292. from := v.From
  293. to := v.To
  294. if utils.StrToInt64(from) <= nowTotal && nowTotal <= utils.StrToInt64(to) {
  295. diffMembers = utils.StrToInt64(to) - nowTotal
  296. }
  297. }
  298. //4、组装抢购条件语句
  299. var welfareOrdersLimitText []string
  300. welfareOrdersLimitText = append(welfareOrdersLimitText, fmt.Sprintf("1、会员本人连续日活 %s 天;", welfareOrdersLimit.ContinuousDailyActivityNums))
  301. welfareOrdersLimitText = append(welfareOrdersLimitText, fmt.Sprintf("2、直推用户不低于 %s 名,且连续日活 %s 天;", welfareOrdersLimit.DirectPushLimit.DirectPushUserNums, welfareOrdersLimit.DirectPushLimit.ContinuousDailyActivityNums))
  302. welfareOrdersLimitText = append(welfareOrdersLimitText, fmt.Sprintf("3、单个账号,每次开启仅限购 %s 份;", welfareOrdersLimit.SingleUserLimitBuyNums))
  303. welfareOrdersLimitText = append(welfareOrdersLimitText, "4、最终解释权归平台所有;")
  304. e.OutSuc(c, map[string]interface{}{
  305. "now_members": nowTotal,
  306. "diff_members": diffMembers,
  307. "welfare_orders_limit_text": welfareOrdersLimitText,
  308. }, nil)
  309. return
  310. }
  311. func EcologicalApplicationManual(c *gin.Context) {
  312. engine := commSvc.MasterDb(c)
  313. //1、查找 `one_circles_green_energy_basic_setting` 基础设置
  314. oneCirclesGreenEnergyBasicSetting, err := db.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  315. "key": "is_open",
  316. "value": 1,
  317. })
  318. if err != nil {
  319. e.OutErr(c, e.ERR, err.Error())
  320. return
  321. }
  322. var signInRewards []*md.SignInRewardStruct
  323. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.SignInReward), &signInRewards)
  324. if err != nil {
  325. e.OutErr(c, e.ERR, err.Error())
  326. return
  327. }
  328. //2、统计全网用户数
  329. sqlStr := "SELECT COUNT(*) AS total FROM user "
  330. nativeString, _ := commDb.QueryNativeString(engine, sqlStr)
  331. userCount := zhios_order_relate_utils.StrToInt64(nativeString[0]["total"])
  332. var nextReduceMembers string
  333. for k, v := range signInRewards {
  334. if zhios_order_relate_utils.StrToInt64(v.VipMemberEndNums) >= userCount && userCount >= zhios_order_relate_utils.StrToInt64(v.VipMemberStartNums) {
  335. nextReduceMembers = utils.Int64ToStr(utils.StrToInt64(signInRewards[k+1].VipMemberStartNums) - userCount)
  336. }
  337. }
  338. //3、组装抢购条件语句
  339. var welfareOrdersLimit *md.WelfareOrdersLimit
  340. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.WelfareOrdersLimit), &welfareOrdersLimit)
  341. if err != nil {
  342. e.OutErr(c, e.ERR, err.Error())
  343. return
  344. }
  345. var welfareOrdersLimitText []string
  346. welfareOrdersLimitText = append(welfareOrdersLimitText, fmt.Sprintf("1、会员本人连续日活 %s 天;", welfareOrdersLimit.ContinuousDailyActivityNums))
  347. welfareOrdersLimitText = append(welfareOrdersLimitText, fmt.Sprintf("2、直推用户不低于 %s 名,且连续日活 %s 天;", welfareOrdersLimit.DirectPushLimit.DirectPushUserNums, welfareOrdersLimit.DirectPushLimit.ContinuousDailyActivityNums))
  348. welfareOrdersLimitText = append(welfareOrdersLimitText, fmt.Sprintf("3、单个账号,每次开启仅限购 %s 份;", welfareOrdersLimit.SingleUserLimitBuyNums))
  349. welfareOrdersLimitText = append(welfareOrdersLimitText, "4、最终解释权归平台所有;")
  350. //4、查找 `OneCirclesPublicPlatoonBasicSetting` 基础设置
  351. oneCirclesPublicPlatoonBasicSetting, err := db.OneCirclesPublicPlatoonBasicSettingGetOneByParams(engine, map[string]interface{}{
  352. "key": "is_open",
  353. "value": 1,
  354. })
  355. if err != nil {
  356. e.OutErr(c, e.ERR, err.Error())
  357. return
  358. }
  359. systemPunishReplace := oneCirclesPublicPlatoonBasicSetting.SystemPunishReplaceValue
  360. //5、会员权益
  361. var vipEquitySetting []*md.VipEquitySettingStruct
  362. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.VipEquitySetting), &vipEquitySetting)
  363. if err != nil {
  364. return
  365. }
  366. lvList := commDb.UserLevelByAllMap(engine)
  367. var vipEquitySettingText []map[string]string
  368. var upgradeConditions = []string{
  369. "免费注册", "邀请20名", "邀请30名", "邀请50名", "邀请100名", "邀请300名", "邀请500名", "邀请1000名", "邀请3000名", "邀请5000名",
  370. }
  371. for k, v := range vipEquitySetting {
  372. if lvList[utils.StrToInt(v.VipLevelId)] != nil {
  373. vipEquitySettingText = append(vipEquitySettingText, map[string]string{
  374. "name": lvList[utils.StrToInt(v.VipLevelId)].LevelName,
  375. "exchange_account_balance_fee": v.ExchangeAccountBalanceFee + "%",
  376. "dividend_ratio": v.DividendRatio + "%",
  377. "upgrade_conditions": upgradeConditions[k],
  378. })
  379. }
  380. }
  381. e.OutSuc(c, map[string]interface{}{
  382. "next_reduce_members": nextReduceMembers,
  383. "system_punish_replace": systemPunishReplace,
  384. "now_members": userCount,
  385. "welfare_orders_limit_text": welfareOrdersLimitText,
  386. "upgrade_conditions": vipEquitySettingText,
  387. }, nil)
  388. return
  389. }
  390. func BasalRate(c *gin.Context) {
  391. engine := commSvc.MasterDb(c)
  392. user := commSvc.GetUser(c)
  393. //1、查找 `one_circles_green_energy_basic_setting` 基础设置
  394. oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  395. "key": "is_open",
  396. "value": 1,
  397. })
  398. if err != nil {
  399. e.OutErr(c, e.ERR, err.Error())
  400. return
  401. }
  402. var teamRewardSetting *md.TeamRewardSettingStruct
  403. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.TeamReward), &teamRewardSetting)
  404. if err != nil {
  405. e.OutErr(c, e.ERR, err.Error())
  406. return
  407. }
  408. now := time.Now()
  409. var oneRoundDuration = zhios_order_relate_utils.StrToInt(teamRewardSetting.OneRoundDuration)
  410. startTime := now.Add(-time.Hour * time.Duration(oneRoundDuration)).Format("2006-01-02 15:04:05")
  411. var oneCirclesGreenEnergySignIn model.OneCirclesGreenEnergySignIn
  412. get, err := engine.Where("start_time >= ?", startTime).And("uid =?", user.Info.Uid).And("is_completed =?", 0).Get(&oneCirclesGreenEnergySignIn)
  413. if err != nil {
  414. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  415. return
  416. }
  417. var signRewardGreenEnergy string
  418. var signCountdown string
  419. if !get {
  420. signRewardGreenEnergy = "0.00"
  421. } else {
  422. err, signRewardGreenEnergy = one_circles.CalcNowSignInGreenEnergy(engine, oneCirclesGreenEnergyBasicSetting)
  423. if err != nil {
  424. e.OutErr(c, e.ERR, err.Error())
  425. return
  426. }
  427. endTime := utils.String2Time(oneCirclesGreenEnergySignIn.EndTime)
  428. duration := endTime.Sub(now) // 计算时间差值
  429. hours := duration / time.Hour // 获取小时部分
  430. minutes := duration % time.Hour / time.Minute // 获取分钟部分(先除去小时后再乘以60)
  431. seconds := int64(duration/time.Second) % 60
  432. signCountdown = fmt.Sprintf("%d:%d:%d", hours, minutes, seconds) //收益倒计时
  433. }
  434. nowBasalRate := utils.StrToFloat64(signRewardGreenEnergy) * 60 * 60 //每小时基础速率
  435. //2、组装距状图数据
  436. var signInRewards []*md.SignInRewardStruct
  437. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.SignInReward), &signInRewards)
  438. if err != nil {
  439. e.OutErr(c, e.ERR, err.Error())
  440. return
  441. }
  442. var barChartYData, barChartXData []string
  443. for _, v := range signInRewards {
  444. barChartYData = append(barChartYData, utils.Float64ToStrPrec8(utils.StrToFloat64(v.RewardValue)*60*60))
  445. var vipMemberStartNum, vipMemberEndNums int64
  446. vipMemberStartNum = utils.StrToInt64(v.VipMemberStartNums)
  447. vipMemberEndNums = utils.StrToInt64(v.VipMemberEndNums)
  448. var vipMemberStartNumStr, vipMemberEndNumsStr string
  449. if vipMemberStartNum >= 10000 && vipMemberStartNum < 100000 {
  450. vipMemberStartNum = vipMemberStartNum / 10000
  451. vipMemberStartNumStr = utils.Int64ToStr(vipMemberStartNum) + "万"
  452. } else if vipMemberStartNum >= 100000 && vipMemberStartNum < 1000000 {
  453. vipMemberStartNum = vipMemberStartNum / 100000
  454. vipMemberStartNumStr = utils.Int64ToStr(vipMemberStartNum) + "十万"
  455. } else if vipMemberStartNum >= 1000000 && vipMemberStartNum < 10000000 {
  456. vipMemberStartNum = vipMemberStartNum / 1000000
  457. vipMemberStartNumStr = utils.Int64ToStr(vipMemberStartNum) + "百万"
  458. } else if vipMemberStartNum >= 10000000 {
  459. vipMemberStartNum = vipMemberStartNum / 10000000
  460. vipMemberStartNumStr = utils.Int64ToStr(vipMemberStartNum) + "千万"
  461. } else {
  462. vipMemberStartNumStr = utils.Int64ToStr(vipMemberStartNum)
  463. }
  464. if vipMemberEndNums >= 10000 && vipMemberEndNums < 100000 {
  465. vipMemberEndNums = vipMemberEndNums / 10000
  466. vipMemberEndNumsStr = utils.Int64ToStr(vipMemberEndNums) + "万"
  467. } else if vipMemberEndNums >= 100000 && vipMemberEndNums < 1000000 {
  468. vipMemberEndNums = vipMemberEndNums / 100000
  469. vipMemberEndNumsStr = utils.Int64ToStr(vipMemberEndNums) + "十万"
  470. } else if vipMemberEndNums >= 1000000 && vipMemberEndNums < 10000000 {
  471. vipMemberEndNums = vipMemberEndNums / 1000000
  472. vipMemberEndNumsStr = utils.Int64ToStr(vipMemberEndNums) + "百万"
  473. } else if vipMemberEndNums >= 10000000 {
  474. vipMemberEndNums = vipMemberEndNums / 10000000
  475. vipMemberEndNumsStr = utils.Int64ToStr(vipMemberEndNums) + "千万"
  476. } else {
  477. vipMemberEndNumsStr = utils.Int64ToStr(vipMemberEndNums)
  478. }
  479. barChartXData = append(barChartXData, vipMemberStartNumStr+"~"+vipMemberEndNumsStr)
  480. }
  481. //3、统计当前平台累计用户、距离下次减产还剩多少人
  482. results, err := commDb.QueryNativeString(engine, "SELECT COUNT(*)AS total FROM user")
  483. if err != nil {
  484. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  485. return
  486. }
  487. userCount := utils.StrToInt64(results[0]["total"])
  488. var nextReduceMembers string
  489. for k, v := range signInRewards {
  490. if zhios_order_relate_utils.StrToInt64(v.VipMemberEndNums) >= userCount && userCount >= zhios_order_relate_utils.StrToInt64(v.VipMemberStartNums) {
  491. nextReduceMembers = utils.Int64ToStr(utils.StrToInt64(signInRewards[k+1].VipMemberStartNums) - userCount)
  492. }
  493. }
  494. e.OutSuc(c, map[string]interface{}{
  495. "now_basal_rate": nowBasalRate,
  496. "sign_countdown": signCountdown,
  497. "user_count": userCount,
  498. "next_reduce_members": nextReduceMembers,
  499. "bar_chart_data": map[string]interface{}{
  500. "x_data": barChartXData,
  501. "y_data": barChartYData,
  502. },
  503. }, nil)
  504. return
  505. }
  506. func TotalRate(c *gin.Context) {
  507. engine := commSvc.MasterDb(c)
  508. user := commSvc.GetUser(c)
  509. //1、查找 `one_circles_green_energy_basic_setting` 基础设置
  510. oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  511. "key": "is_open",
  512. "value": 1,
  513. })
  514. if err != nil {
  515. e.OutErr(c, e.ERR, err.Error())
  516. return
  517. }
  518. var teamRewardSetting *md.TeamRewardSettingStruct
  519. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.TeamReward), &teamRewardSetting)
  520. if err != nil {
  521. e.OutErr(c, e.ERR, err.Error())
  522. return
  523. }
  524. now := time.Now()
  525. var oneRoundDuration = zhios_order_relate_utils.StrToInt(teamRewardSetting.OneRoundDuration)
  526. startTime := now.Add(-time.Hour * time.Duration(oneRoundDuration)).Format("2006-01-02 15:04:05")
  527. var oneCirclesGreenEnergySignIn model.OneCirclesGreenEnergySignIn
  528. get, err := engine.Where("start_time >= ?", startTime).And("uid =?", user.Info.Uid).And("is_completed =?", 0).Get(&oneCirclesGreenEnergySignIn)
  529. if err != nil {
  530. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  531. return
  532. }
  533. var signRewardGreenEnergy string
  534. if !get {
  535. signRewardGreenEnergy = "0.00"
  536. } else {
  537. err, signRewardGreenEnergy = one_circles.CalcNowSignInGreenEnergy(engine, oneCirclesGreenEnergyBasicSetting)
  538. if err != nil {
  539. e.OutErr(c, e.ERR, err.Error())
  540. return
  541. }
  542. }
  543. nowBasalRate := utils.StrToFloat64(signRewardGreenEnergy) * 60 * 60 //每小时基础速率
  544. //2、统计当前平台累计用户、下次减产奖励值
  545. var signInRewards []*md.SignInRewardStruct
  546. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.SignInReward), &signInRewards)
  547. if err != nil {
  548. e.OutErr(c, e.ERR, err.Error())
  549. return
  550. }
  551. results, err := commDb.QueryNativeString(engine, "SELECT COUNT(*)AS total FROM user")
  552. if err != nil {
  553. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  554. return
  555. }
  556. userCount := utils.StrToInt64(results[0]["total"])
  557. var nextReduceValue string
  558. for k, v := range signInRewards {
  559. if zhios_order_relate_utils.StrToInt64(v.VipMemberEndNums) >= userCount && userCount >= zhios_order_relate_utils.StrToInt64(v.VipMemberStartNums) {
  560. nextReduceValue = utils.Float64ToStrPrec8(utils.StrToFloat64(signInRewards[k+1].RewardValue) * 60 * 60)
  561. }
  562. }
  563. //3、计算当前团队速率
  564. userRelates, err := db2.DbsUserRelateByParentUid(engine, user.Info.Uid, 0)
  565. if err != nil {
  566. e.OutErr(c, e.ERR, err.Error())
  567. return
  568. }
  569. var userRelatesUids []int
  570. var userRelatesMap = map[int]model.UserRelate{}
  571. if userRelates != nil {
  572. for _, userRelate := range *userRelates {
  573. userRelatesUids = append(userRelatesUids, userRelate.Uid)
  574. userRelatesMap[userRelate.Uid] = userRelate
  575. }
  576. }
  577. var oneCirclesGreenEnergySignIns []*model.OneCirclesGreenEnergySignIn
  578. err = engine.Where("start_time >= ?", startTime).In("uid", userRelatesUids).And("is_completed =?", 0).Find(&oneCirclesGreenEnergySignIns)
  579. if err != nil {
  580. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  581. return
  582. }
  583. var nowTeamRate float64 //每小时基础速率
  584. nowBasalRateValue := decimal.NewFromFloat(nowBasalRate)
  585. for _, vv := range oneCirclesGreenEnergySignIns {
  586. rewardDecrementValue := utils.StrToFloat64(teamRewardSetting.RewardDecrementValue) / 100
  587. tmpRewardBase := decimal.NewFromFloat(math.Pow(rewardDecrementValue, float64(userRelatesMap[vv.Uid].Level)))
  588. tmpReward := nowBasalRateValue.Mul(tmpRewardBase)
  589. rewardEndValue, _ := decimal.NewFromString(teamRewardSetting.RewardEndValue)
  590. if tmpReward.GreaterThanOrEqual(rewardEndValue) {
  591. tmpRewardValue, _ := tmpReward.Float64()
  592. nowTeamRate += tmpRewardValue
  593. }
  594. }
  595. e.OutSuc(c, map[string]interface{}{
  596. "now_basal_rate": nowBasalRate,
  597. "next_reduce_value": nextReduceValue,
  598. "now_team_rate": nowTeamRate,
  599. "now_team_user_online": len(oneCirclesGreenEnergySignIns),
  600. "now_team_user_online_formula": fmt.Sprintf("%d * %s * ... * %f", len(oneCirclesGreenEnergySignIns), teamRewardSetting.RewardDecrementValue, nowBasalRate),
  601. }, nil)
  602. return
  603. }
  604. func MyTeam(c *gin.Context) {
  605. engine := commSvc.MasterDb(c)
  606. user := commSvc.GetUser(c)
  607. //1、查找 `one_circles_green_energy_basic_setting` 基础设置
  608. oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  609. "key": "is_open",
  610. "value": 1,
  611. })
  612. if err != nil {
  613. e.OutErr(c, e.ERR, err.Error())
  614. return
  615. }
  616. var teamRewardSetting *md.TeamRewardSettingStruct
  617. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.TeamReward), &teamRewardSetting)
  618. if err != nil {
  619. e.OutErr(c, e.ERR, err.Error())
  620. return
  621. }
  622. now := time.Now()
  623. var oneRoundDuration = zhios_order_relate_utils.StrToInt(teamRewardSetting.OneRoundDuration)
  624. startTime := now.Add(-time.Hour * time.Duration(oneRoundDuration)).Format("2006-01-02 15:04:05")
  625. var oneCirclesGreenEnergySignIn model.OneCirclesGreenEnergySignIn
  626. get, err := engine.Where("start_time >= ?", startTime).And("uid =?", user.Info.Uid).And("is_completed =?", 0).Get(&oneCirclesGreenEnergySignIn)
  627. if err != nil {
  628. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  629. return
  630. }
  631. var signRewardGreenEnergy string
  632. if !get {
  633. signRewardGreenEnergy = "0.00"
  634. } else {
  635. err, signRewardGreenEnergy = one_circles.CalcNowSignInGreenEnergy(engine, oneCirclesGreenEnergyBasicSetting)
  636. if err != nil {
  637. e.OutErr(c, e.ERR, err.Error())
  638. return
  639. }
  640. }
  641. nowBasalRate := utils.StrToFloat64(signRewardGreenEnergy) * 60 * 60 //每小时基础速率
  642. //2、统计当前平台累计用户、下次减产奖励值
  643. var signInRewards []*md.SignInRewardStruct
  644. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.SignInReward), &signInRewards)
  645. if err != nil {
  646. e.OutErr(c, e.ERR, err.Error())
  647. return
  648. }
  649. results, err := commDb.QueryNativeString(engine, "SELECT COUNT(*)AS total FROM user")
  650. if err != nil {
  651. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  652. return
  653. }
  654. userCount := utils.StrToInt64(results[0]["total"])
  655. var nextReduceValue string
  656. for k, v := range signInRewards {
  657. if zhios_order_relate_utils.StrToInt64(v.VipMemberEndNums) >= userCount && userCount >= zhios_order_relate_utils.StrToInt64(v.VipMemberStartNums) {
  658. nextReduceValue = signInRewards[k+1].RewardValue
  659. }
  660. }
  661. //3、计算当前团队速率
  662. userRelates, err := db2.DbsUserRelateByParentUid(engine, user.Info.Uid, 0)
  663. if err != nil {
  664. e.OutErr(c, e.ERR, err.Error())
  665. return
  666. }
  667. var userRelatesUids []int
  668. var userRelatesMap = map[int]model.UserRelate{}
  669. if userRelates != nil {
  670. for _, userRelate := range *userRelates {
  671. userRelatesUids = append(userRelatesUids, userRelate.Uid)
  672. userRelatesMap[userRelate.Uid] = userRelate
  673. }
  674. }
  675. var oneCirclesGreenEnergySignIns []*model.OneCirclesGreenEnergySignIn
  676. err = engine.Where("start_time >= ?", startTime).In("uid", userRelatesUids).And("is_completed =?", 0).Find(&oneCirclesGreenEnergySignIns)
  677. if err != nil {
  678. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  679. return
  680. }
  681. var nowTeamRate float64 //每小时基础速率
  682. nowBasalRateValue := decimal.NewFromFloat(nowBasalRate)
  683. for _, vv := range oneCirclesGreenEnergySignIns {
  684. rewardDecrementValue := utils.StrToFloat64(teamRewardSetting.RewardDecrementValue) / 100
  685. tmpRewardBase := decimal.NewFromFloat(math.Pow(rewardDecrementValue, float64(userRelatesMap[vv.Uid].Level)))
  686. tmpReward := nowBasalRateValue.Mul(tmpRewardBase)
  687. rewardEndValue, _ := decimal.NewFromString(teamRewardSetting.RewardEndValue)
  688. if tmpReward.GreaterThanOrEqual(rewardEndValue) {
  689. tmpRewardValue, _ := tmpReward.Float64()
  690. nowTeamRate += tmpRewardValue
  691. }
  692. }
  693. e.OutSuc(c, map[string]interface{}{
  694. "now_basal_rate": nowBasalRate,
  695. "next_reduce_value": nextReduceValue,
  696. "now_team_rate": nowTeamRate,
  697. "now_team_user": len(*userRelates),
  698. "now_team_user_online": len(oneCirclesGreenEnergySignIns),
  699. "now_team_user_online_formula": fmt.Sprintf("%d * %s * ... * %f", len(oneCirclesGreenEnergySignIns), teamRewardSetting.RewardDecrementValue, nowBasalRate),
  700. }, nil)
  701. return
  702. }
  703. func GreenEnergyDetails(c *gin.Context) {
  704. engine := commSvc.MasterDb(c)
  705. //1、查找 `one_circles_green_energy_basic_setting` 基础设置
  706. oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  707. "key": "is_open",
  708. "value": 1,
  709. })
  710. if err != nil {
  711. e.OutErr(c, e.ERR, err.Error())
  712. return
  713. }
  714. var args map[string]string
  715. if err := c.ShouldBindJSON(&args); err != nil {
  716. e.OutErr(c, e.ERR_INVALID_ARGS)
  717. return
  718. }
  719. user := commSvc.GetUser(c)
  720. args["uid"] = utils.IntToStr(user.Info.Uid)
  721. if args["kind"] == "1" {
  722. args["coin_id"] = utils.IntToStr(oneCirclesGreenEnergyBasicSetting.TeamGreenEnergyCoinId)
  723. } else {
  724. args["coin_id"] = utils.IntToStr(oneCirclesGreenEnergyBasicSetting.PersonGreenEnergyCoinId)
  725. }
  726. flow := commDb.GetUserVirtualAmountFlow(engine, args)
  727. var list = make([]map[string]string, 0)
  728. if flow != nil {
  729. for _, v := range *flow {
  730. var tmp = map[string]string{
  731. "title": v.Title,
  732. "time": v.CreateTime.Format("2006-01-02 15:04"),
  733. "type": utils.IntToStr(v.Direction),
  734. "value": commSvc.GetPrec(c, v.Amout, "8"),
  735. "transfer_type": utils.IntToStr(v.TransferType),
  736. "price": "",
  737. //"ico": "http://teamplate.zhios.cn/%E7%AC%A6%E5%8F%B7%E5%A4%87%E4%BB%BD6%402x.png",
  738. }
  739. list = append(list, tmp)
  740. }
  741. }
  742. //3、获取当前用户 绿色能量(可用+结算)、 预估总价值
  743. var totalGreenEnergy, totalGreenEnergyPrice float64
  744. var teamRewardSetting *md.TeamRewardSettingStruct
  745. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.TeamReward), &teamRewardSetting)
  746. if err != nil {
  747. e.OutErr(c, e.ERR, err.Error())
  748. return
  749. }
  750. personGreenEnergy, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesGreenEnergyBasicSetting.PersonGreenEnergyCoinId)))
  751. if err2 != nil {
  752. e.OutErr(c, e.ERR, err.Error())
  753. return
  754. }
  755. teamGreenEnergy, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesGreenEnergyBasicSetting.TeamGreenEnergyCoinId)))
  756. if err2 != nil {
  757. e.OutErr(c, e.ERR, err.Error())
  758. return
  759. }
  760. totalGreenEnergy = utils.StrToFloat64(personGreenEnergy.Amount) + utils.StrToFloat64(teamGreenEnergy.Amount)
  761. totalGreenEnergyPrice = totalGreenEnergy * utils.StrToFloat64(oneCirclesGreenEnergyBasicSetting.NowPrice)
  762. res := map[string]interface{}{
  763. "person_green_energy": utils.StrToFloat64(personGreenEnergy.Amount),
  764. "team_green_energy": utils.StrToFloat64(teamGreenEnergy.Amount),
  765. "total_green_energy": totalGreenEnergy,
  766. "total_green_energy_price": totalGreenEnergyPrice,
  767. "list": list,
  768. "transfer_type_list": []map[string]interface{}{
  769. {
  770. "value": md2.OneCirclesGreenEnergySignInSettlementPersonalRewardForUserVirtualCoinFlow,
  771. "name": md2.OneCirclesGreenEnergySignInSettlementPersonalReward,
  772. },
  773. {
  774. "value": md2.OneCirclesGreenEnergySignInSettlementTeamRewardForUserVirtualCoinFlow,
  775. "name": md2.OneCirclesGreenEnergySignInSettlementTeamReward,
  776. },
  777. {
  778. "value": md2.OneCirclesBalanceExchangeForGreenEnergyForUserVirtualCoinFlow,
  779. "name": md2.OneCirclesBalanceExchangeForGreenEnergy,
  780. },
  781. {
  782. "value": md2.OneCirclesGreenEnergyExchangeForBalanceForUserVirtualCoinFlow,
  783. "name": md2.OneCirclesGreenEnergyExchangeForBalance,
  784. },
  785. {
  786. "value": md2.OneCirclesPersonalActiveCoinExchangeGreenEnergyForUserVirtualCoinFlow,
  787. "name": md2.OneCirclesPersonalActiveCoinExchangeGreenEnergy,
  788. },
  789. {
  790. "value": md2.OneCirclesTeamActiveCoinExchangeGreenEnergyForUserVirtualCoinFlow,
  791. "name": md2.OneCirclesTeamActiveCoinExchangeGreenEnergy,
  792. },
  793. {
  794. "value": md2.OneCirclesSettlementGreenEnergyExchangeGreenEnergyForUserVirtualCoinFlow,
  795. "name": md2.OneCirclesSettlementGreenEnergyExchangeGreenEnergy,
  796. },
  797. {
  798. "value": md2.OneCirclesWelfareOrdersExchangeGreenEnergyForUserVirtualCoinFlow,
  799. "name": md2.OneCirclesWelfareOrdersExchangeGreenEnergy,
  800. },
  801. {
  802. "value": md2.OneCirclesConsumeOrdersExchangeGreenEnergyForUserVirtualCoinFlow,
  803. "name": md2.OneCirclesConsumeOrdersExchangeGreenEnergy,
  804. },
  805. {
  806. "value": md2.OneCirclesSettlementGreenEnergyExchangeTobeGreenEnergyForUserVirtualCoinFlow,
  807. "name": md2.OneCirclesSettlementGreenEnergyExchangeTobeGreenEnergy,
  808. },
  809. },
  810. }
  811. e.OutSuc(c, res, nil)
  812. return
  813. }
  814. func NineDimensionalSpace(c *gin.Context) {
  815. engine := commSvc.MasterDb(c)
  816. //1、 查找 `one_circles_public_platoon_basic_setting` 基础设置
  817. oneCirclesPublicPlatoonBasicSetting, err := db.OneCirclesPublicPlatoonBasicSettingGetOneByParams(engine, map[string]interface{}{
  818. "key": "is_open",
  819. "value": 1,
  820. })
  821. if err != nil {
  822. e.OutErr(c, e.ERR, err.Error())
  823. return
  824. }
  825. if oneCirclesPublicPlatoonBasicSetting == nil {
  826. e.OutErr(c, e.ERR_NO_DATA, err.Error())
  827. return
  828. }
  829. uid := commSvc.GetUser(c).Info.Uid
  830. var list []map[string]interface{}
  831. for i := 1; i <= oneCirclesPublicPlatoonBasicSetting.SeveralRows; i++ {
  832. var tmpSql = fmt.Sprintf("SELECT COUNT(*)AS total FROM `one_circles_public_platoon_user_relation` WHERE father_uid%d = %d", i, uid)
  833. tmpNativeString, _ := commDb.QueryNativeString(engine, tmpSql)
  834. nowUserCount := zhios_order_relate_utils.StrToInt64(tmpNativeString[0]["total"])
  835. list = append(list, map[string]interface{}{
  836. "name": utils.IntToStr(i) + "维",
  837. "max_count": math.Pow(float64(oneCirclesPublicPlatoonBasicSetting.SeveralTimes), float64(i)),
  838. "now_count": nowUserCount,
  839. })
  840. }
  841. ////2、计算当前全网人数
  842. //sql := "SELECT COUNT(*) AS total FROM `one_circles_public_platoon_user_relation`"
  843. //nativeString, _ := commDb.QueryNativeString(engine, sql)
  844. //userCount := zhios_order_relate_utils.StrToInt64(nativeString[0]["total"])
  845. //3、统计当前用户下多少人数
  846. sql := fmt.Sprintf("SELECT COUNT(*)AS total FROM `one_circles_public_platoon_user_relation` WHERE father_uid1 = %d OR father_uid2= %d OR father_uid3= %d OR father_uid4= %d OR father_uid5= %d OR father_uid6= %d OR father_uid7= %d OR father_uid8= %d", uid, uid, uid, uid, uid, uid, uid, uid)
  847. nativeString1, _ := commDb.QueryNativeString(engine, sql)
  848. hasUserCount := zhios_order_relate_utils.StrToInt64(nativeString1[0]["total"])
  849. res := map[string]interface{}{
  850. "space_total_nums": 29523,
  851. "space_nums": hasUserCount,
  852. "space_list": list,
  853. "a_lot_of_nums": 29523,
  854. }
  855. e.OutSuc(c, res, nil)
  856. return
  857. }
  858. func ActivePointsDetails(c *gin.Context) {
  859. engine := commSvc.MasterDb(c)
  860. //1、 查找 `OneCirclesPublicPlatoonBasicSetting` 基础设置
  861. oneCirclesPublicPlatoonBasicSetting, err := db.OneCirclesPublicPlatoonBasicSettingGetOneByParams(engine, map[string]interface{}{
  862. "key": "is_open",
  863. "value": 1,
  864. })
  865. if err != nil {
  866. e.OutErr(c, e.ERR, err.Error())
  867. return
  868. }
  869. var args map[string]string
  870. if err := c.ShouldBindJSON(&args); err != nil {
  871. e.OutErr(c, e.ERR_INVALID_ARGS)
  872. return
  873. }
  874. user := commSvc.GetUser(c)
  875. args["uid"] = utils.IntToStr(user.Info.Uid)
  876. if args["kind"] == "1" {
  877. args["coin_id"] = utils.IntToStr(oneCirclesPublicPlatoonBasicSetting.PersonActivePointsCoinId)
  878. } else {
  879. args["coin_id"] = utils.IntToStr(oneCirclesPublicPlatoonBasicSetting.TeamActivePointsCoinId)
  880. }
  881. flow := commDb.GetUserVirtualAmountFlow(engine, args)
  882. var list = make([]map[string]string, 0)
  883. if flow != nil {
  884. for _, v := range *flow {
  885. var tmp = map[string]string{
  886. "title": v.Title,
  887. "time": v.CreateTime.Format("2006-01-02 15:04"),
  888. "type": utils.IntToStr(v.Direction),
  889. "value": commSvc.GetPrec(c, v.Amout, "8"),
  890. "price": "",
  891. "transfer_type": utils.IntToStr(v.TransferType),
  892. //"ico": "http://teamplate.zhios.cn/%E7%AC%A6%E5%8F%B7%E5%A4%87%E4%BB%BD6%402x.png",
  893. }
  894. list = append(list, tmp)
  895. }
  896. }
  897. var totalActivePoints float64
  898. personActivePoints, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesPublicPlatoonBasicSetting.PersonActivePointsCoinId)))
  899. if err2 != nil {
  900. e.OutErr(c, e.ERR, err.Error())
  901. return
  902. }
  903. teamActivePoints, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesPublicPlatoonBasicSetting.TeamActivePointsCoinId)))
  904. if err2 != nil {
  905. e.OutErr(c, e.ERR, err.Error())
  906. return
  907. }
  908. totalActivePoints = utils.StrToFloat64(personActivePoints.Amount) + utils.StrToFloat64(teamActivePoints.Amount)
  909. coin, _ := commDb.VirtualCoinGetOneById(engine, oneCirclesPublicPlatoonBasicSetting.PersonActivePointsCoinId)
  910. exchangeRatio, _ := decimal.NewFromString(coin.ExchangeRatio)
  911. totalActivePointsValue := decimal.NewFromFloat(totalActivePoints)
  912. totalActivePointsAmount := totalActivePointsValue.Div(exchangeRatio).String()
  913. res := map[string]interface{}{
  914. "person_active_points": utils.StrToFloat64(personActivePoints.Amount),
  915. "team_active_points": utils.StrToFloat64(teamActivePoints.Amount),
  916. "total_active_points": totalActivePoints,
  917. "total_active_points_amount": totalActivePointsAmount,
  918. "list": list,
  919. "transfer_type_list": []map[string]interface{}{
  920. {
  921. "value": md2.OneCirclesWatchAdRewardPersonalActiveCoinForUserVirtualCoinFlow,
  922. "name": md2.OneCirclesWatchAdRewardPersonalActiveCoin,
  923. },
  924. {
  925. "value": md2.OneCirclesWatchAdRewardTeamActiveCoinForUserVirtualCoinFlow,
  926. "name": md2.OneCirclesWatchAdRewardTeamActiveCoin,
  927. },
  928. {
  929. "value": md2.OneCirclesPersonalActiveCoinExchangeToBeGreenEnergyForUserVirtualCoinFlow,
  930. "name": md2.OneCirclesPersonalActiveCoinExchangeToBeGreenEnergy,
  931. },
  932. {
  933. "value": md2.OneCirclesTeamActiveCoinExchangeToBeGreenEnergyForUserVirtualCoinFlow,
  934. "name": md2.OneCirclesTeamActiveCoinExchangeToBeGreenEnergy,
  935. },
  936. },
  937. }
  938. e.OutSuc(c, res, nil)
  939. return
  940. }
  941. func MyTeamUserList(c *gin.Context) {
  942. engine := commSvc.MasterDb(c)
  943. now := time.Now()
  944. user := commSvc.GetUser(c)
  945. //1、查找 `one_circles_green_energy_basic_setting` 基础设置
  946. oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  947. "key": "is_open",
  948. "value": 1,
  949. })
  950. if err != nil {
  951. e.OutErr(c, e.ERR, err.Error())
  952. return
  953. }
  954. var teamRewardSetting *md.TeamRewardSettingStruct
  955. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.TeamReward), &teamRewardSetting)
  956. if err != nil {
  957. e.OutErr(c, e.ERR, err.Error())
  958. return
  959. }
  960. var oneRoundDuration = zhios_order_relate_utils.StrToInt(teamRewardSetting.OneRoundDuration)
  961. startTime := now.Add(-time.Hour * time.Duration(oneRoundDuration)).Format("2006-01-02 15:04:05")
  962. userRelates, err := db2.DbsUserRelateByParentUid(engine, user.Info.Uid, 1)
  963. if err != nil {
  964. e.OutErr(c, e.ERR, err.Error())
  965. return
  966. }
  967. var userRelatesUids []string
  968. var userSignInMap = map[int]interface{}{}
  969. var results []map[string]string
  970. if userRelates != nil {
  971. for _, userRelate := range *userRelates {
  972. userRelatesUids = append(userRelatesUids, utils.IntToStr(userRelate.Uid))
  973. }
  974. var oneCirclesGreenEnergySignIns []*model.OneCirclesGreenEnergySignIn
  975. err = engine.Where("start_time >= ?", startTime).In("uid", userRelatesUids).And("is_completed =?", 0).Find(&oneCirclesGreenEnergySignIns)
  976. if err != nil {
  977. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  978. return
  979. }
  980. for _, oneCirclesGreenEnergySignIn := range oneCirclesGreenEnergySignIns {
  981. userSignInMap[oneCirclesGreenEnergySignIn.Uid] = *oneCirclesGreenEnergySignIn
  982. }
  983. var sql string
  984. sql = "SELECT user_relate.*,user.*,user_profile.* FROM `user_relate` " +
  985. "LEFT JOIN `user` ON user_relate.uid = user.uid " +
  986. "LEFT JOIN `user_profile` ON user.uid = user_profile.uid " +
  987. "where 1=1 AND user_relate.uid IN(%s) GROUP BY user_relate.uid"
  988. sql += " ORDER BY user_relate.invite_time DESC;"
  989. uidStr := php2go.Implode(",", userRelatesUids)
  990. sql = fmt.Sprintf(sql, uidStr)
  991. results, err = commDb.QueryNativeString(engine, sql)
  992. if err != nil {
  993. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  994. return
  995. }
  996. }
  997. var data []interface{}
  998. for _, v := range results {
  999. isOnline := false
  1000. if userSignInMap[int(utils.AnyToInt64(v["uid"]))] != nil {
  1001. isOnline = true
  1002. }
  1003. data = append(data, map[string]interface{}{
  1004. "is_on_line": isOnline,
  1005. "avatar_url": v["avatar_url"],
  1006. "nickname": v["nickname"],
  1007. "invite_time": v["invite_time"],
  1008. })
  1009. }
  1010. e.OutSuc(c, map[string]interface{}{
  1011. "list": data,
  1012. }, nil)
  1013. return
  1014. }
  1015. func PointsCenterCalcExchange(c *gin.Context) {
  1016. engine := commSvc.MasterDb(c)
  1017. user := commSvc.GetUser(c)
  1018. kind := c.DefaultQuery("kind", "1")
  1019. amount := c.DefaultQuery("amount", "")
  1020. var value = "0.00000000"
  1021. var err error
  1022. if kind == "1" { //绿色能量兑换余额
  1023. err, value, _, _, _, _ = one_circles.CalcPriceReductionFormula(engine, amount, strconv.Itoa(user.Level.Id))
  1024. if err != nil {
  1025. e.OutErr(c, e.ERR, err.Error())
  1026. return
  1027. }
  1028. } else { //余额兑换绿色能量
  1029. err, value, _, _ = one_circles.CalcPriceIncreaseFormula(engine, amount)
  1030. if err != nil {
  1031. e.OutErr(c, e.ERR, err.Error())
  1032. return
  1033. }
  1034. }
  1035. e.OutSuc(c, map[string]interface{}{
  1036. "value": value,
  1037. }, nil)
  1038. return
  1039. }
  1040. func PointsCenterExchange(c *gin.Context) {
  1041. engine := commSvc.MasterDb(c)
  1042. user := commSvc.GetUser(c)
  1043. kind := c.DefaultQuery("kind", "1")
  1044. amount := c.DefaultQuery("amount", "")
  1045. //1、查找 `one_circles_green_energy_basic_setting` 基础设置
  1046. oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  1047. "key": "is_open",
  1048. "value": 1,
  1049. })
  1050. if err != nil {
  1051. e.OutErr(c, e.ERR, err.Error())
  1052. return
  1053. }
  1054. err = rule.InitForIntegralRelease(cfg.RedisAddr)
  1055. if err != nil {
  1056. e.OutErr(c, e.ERR, err.Error())
  1057. return
  1058. }
  1059. session := engine.NewSession()
  1060. defer func() {
  1061. session.Close()
  1062. if err := recover(); err != nil {
  1063. _ = logx.Error(err)
  1064. }
  1065. }()
  1066. session.Begin()
  1067. if kind == "1" { //绿色能量兑换余额
  1068. err1, value, _, greenEnergyFee, _, afterPriceValue := one_circles.CalcPriceReductionFormula(engine, amount, strconv.Itoa(user.Level.Id))
  1069. if err != nil {
  1070. e.OutErr(c, e.ERR, err1.Error())
  1071. return
  1072. }
  1073. //处理绿色能量各区积分流水
  1074. err1 = one_circles.DealAvailableGreenEnergyCoin(session, int(enum.GreenEnergyExchangeBalance), utils.StrToFloat64(amount), utils.StrToFloat64(greenEnergyFee), enum.GreenEnergyExchangeBalance.String(), oneCirclesGreenEnergyBasicSetting, afterPriceValue)
  1075. if err1 != nil {
  1076. session.Rollback()
  1077. e.OutErr(c, 400, err1.Error())
  1078. return
  1079. }
  1080. //增加用户余额
  1081. orderType := enum2.FinUserFlowOrderActionString(md2.GreenEnergyExchangeForBalanceForFinUserFlow)
  1082. err1 = svc.DealUserAmount(session, md2.DealUserAmount{
  1083. Kind: "add",
  1084. Mid: c.GetString("mid"),
  1085. Title: md2.GreenEnergyExchangeForBalanceTitleForFinUserFlow,
  1086. OrderType: orderType,
  1087. OrdAction: md2.GreenEnergyExchangeForBalanceForFinUserFlow,
  1088. OrdId: "",
  1089. Uid: user.Info.Uid,
  1090. Amount: utils.StrToFloat64(value),
  1091. Num: "",
  1092. })
  1093. if err1 != nil {
  1094. session.Rollback()
  1095. e.OutErr(c, 400, err1.Error())
  1096. return
  1097. }
  1098. //减少用户虚拟币余额
  1099. err = one_circles.DealUserCoin(session, md2.DealUserCoinReq{
  1100. Kind: "sub",
  1101. Mid: c.GetString("mid"),
  1102. Title: md2.OneCirclesGreenEnergyExchangeForBalance,
  1103. TransferType: md2.OneCirclesGreenEnergyExchangeForBalanceForUserVirtualCoinFlow,
  1104. OrdId: "",
  1105. CoinId: oneCirclesGreenEnergyBasicSetting.PersonGreenEnergyCoinId,
  1106. Uid: user.Info.Uid,
  1107. Amount: utils.StrToFloat64(amount),
  1108. })
  1109. if err != nil {
  1110. session.Rollback()
  1111. e.OutErr(c, 400, err.Error())
  1112. return
  1113. }
  1114. } else { //余额兑换绿色能量
  1115. err1, value, _, afterPriceValue := one_circles.CalcPriceIncreaseFormula(engine, amount)
  1116. if err1 != nil {
  1117. e.OutErr(c, e.ERR, err1.Error())
  1118. return
  1119. }
  1120. //处理绿色能量各区积分流水
  1121. err1 = one_circles.DealAvailableGreenEnergyCoin(session, int(enum.AccountBalanceExchange), utils.StrToFloat64(value), utils.StrToFloat64(amount), enum.AccountBalanceExchange.String(), oneCirclesGreenEnergyBasicSetting, afterPriceValue)
  1122. if err1 != nil {
  1123. session.Rollback()
  1124. e.OutErr(c, 400, err1.Error())
  1125. return
  1126. }
  1127. //减少用户余额
  1128. orderType := enum2.FinUserFlowOrderActionString(md2.BalanceExchangeForGreenEnergyForFinUserFlow)
  1129. fmt.Println(c.GetString("mid"))
  1130. err1 = svc.DealUserAmount(session, md2.DealUserAmount{
  1131. Kind: "sub",
  1132. Mid: c.GetString("mid"),
  1133. Title: md2.BalanceExchangeForGreenEnergyTitleForFinUserFlow,
  1134. OrderType: orderType,
  1135. OrdAction: md2.BalanceExchangeForGreenEnergyForFinUserFlow,
  1136. OrdId: "",
  1137. Uid: user.Info.Uid,
  1138. Amount: utils.StrToFloat64(amount),
  1139. Num: "",
  1140. })
  1141. if err1 != nil {
  1142. fmt.Println(err1.Error())
  1143. session.Rollback()
  1144. e.OutErr(c, 400, err1.Error())
  1145. return
  1146. }
  1147. //增加用户绿色能量
  1148. err = one_circles.DealUserCoin(session, md2.DealUserCoinReq{
  1149. Kind: "add",
  1150. Mid: c.GetString("mid"),
  1151. Title: md2.OneCirclesBalanceExchangeForGreenEnergy,
  1152. TransferType: md2.OneCirclesBalanceExchangeForGreenEnergyForUserVirtualCoinFlow,
  1153. OrdId: "",
  1154. CoinId: oneCirclesGreenEnergyBasicSetting.PersonGreenEnergyCoinId,
  1155. Uid: user.Info.Uid,
  1156. Amount: utils.StrToFloat64(value),
  1157. })
  1158. if err != nil {
  1159. session.Rollback()
  1160. e.OutErr(c, 400, err.Error())
  1161. return
  1162. }
  1163. }
  1164. session.Commit()
  1165. e.OutSuc(c, "success", nil)
  1166. return
  1167. }
  1168. func PointsCenterPriceCurve(c *gin.Context) {
  1169. engine := commSvc.MasterDb(c)
  1170. kind := c.DefaultQuery("kind", "1")
  1171. now := time.Now()
  1172. ////1、查找 `one_circles_green_energy_basic_setting` 基础设置
  1173. //oneCirclesGreenEnergyBasicSetting, err := db.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  1174. // "key": "is_open",
  1175. // "value": 1,
  1176. //})
  1177. //if err != nil {
  1178. // e.OutErr(c, e.ERR, err.Error())
  1179. // return
  1180. //}
  1181. var yData []interface{}
  1182. var xData []interface{}
  1183. switch kind {
  1184. case "1":
  1185. var date = now.AddDate(0, 0, -6).Format("2006-01-02")
  1186. var sql = fmt.Sprintf("SELECT price,date FROM `one_circles_green_energy_price` WHERE HOUR = 23 AND DATE >= \"%s\" ORDER BY DATE ASC ", date)
  1187. results, _ := commDb.QueryNativeString(engine, sql)
  1188. for _, v := range results {
  1189. tmpDate := utils.String2TimeV2(v["date"])
  1190. yData = append(yData, v["price"])
  1191. xData = append(xData, tmpDate.Format("01-02"))
  1192. }
  1193. break
  1194. case "2":
  1195. for i := 6; i >= 1; i-- {
  1196. date := now.Add(-time.Hour * 4 * time.Duration(i)).Format("2006-01-02")
  1197. hour := now.Add(-time.Hour * 4 * time.Duration(i)).Hour()
  1198. var sql = "SELECT price,date,hour FROM `one_circles_green_energy_price` WHERE HOUR = %d AND DATE = \"%s\" "
  1199. sql = fmt.Sprintf(sql, hour, date)
  1200. results, _ := commDb.QueryNativeString(engine, sql)
  1201. if results != nil {
  1202. if results[0]["date"] != now.Format("2006-01-02") {
  1203. continue
  1204. }
  1205. yData = append(yData, results[0]["price"])
  1206. xData = append(xData, results[0]["hour"]+":00")
  1207. }
  1208. }
  1209. break
  1210. case "3":
  1211. for i := 6; i >= 1; i-- {
  1212. var date = now.AddDate(0, 0, -7*i).Format("2006-01-02")
  1213. var sql = "SELECT price,date FROM `one_circles_green_energy_price` WHERE HOUR = 23 AND DATE = \"%s\" "
  1214. sql = fmt.Sprintf(sql, date)
  1215. results, _ := commDb.QueryNativeString(engine, sql)
  1216. if results != nil {
  1217. tmpDate := utils.String2TimeV2(results[0]["date"])
  1218. yData = append(yData, results[0]["price"])
  1219. xData = append(xData, tmpDate.Format("01-02"))
  1220. }
  1221. }
  1222. break
  1223. }
  1224. e.OutSuc(c, map[string]interface{}{
  1225. "yData": yData,
  1226. "xData": xData,
  1227. }, nil)
  1228. return
  1229. }
  1230. func PointsCenter(c *gin.Context) {
  1231. engine := commSvc.MasterDb(c)
  1232. user := commSvc.GetUser(c)
  1233. //1、查找 `one_circles_green_energy_basic_setting` 基础设置 && 查找 `OneCirclesPublicPlatoonBasicSetting` 基础设置
  1234. oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  1235. "key": "is_open",
  1236. "value": 1,
  1237. })
  1238. if err != nil {
  1239. e.OutErr(c, e.ERR, err.Error())
  1240. return
  1241. }
  1242. oneCirclesPublicPlatoonBasicSetting, err := db.OneCirclesPublicPlatoonBasicSettingGetOneByParams(engine, map[string]interface{}{
  1243. "key": "is_open",
  1244. "value": 1,
  1245. })
  1246. if err != nil {
  1247. e.OutErr(c, e.ERR, err.Error())
  1248. return
  1249. }
  1250. //2、计算今日涨幅
  1251. err, rises, isRises := one_circles.CalcTodayGreenEnergyPriceRises(engine, oneCirclesGreenEnergyBasicSetting)
  1252. if err != nil {
  1253. e.OutErr(c, e.ERR, err.Error())
  1254. return
  1255. }
  1256. //3、获取当前用户 绿色能量(可用+结算)、 预估总价值
  1257. var totalGreenEnergy, totalGreenEnergyPrice float64
  1258. var teamRewardSetting *md.TeamRewardSettingStruct
  1259. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.TeamReward), &teamRewardSetting)
  1260. if err != nil {
  1261. e.OutErr(c, e.ERR, err.Error())
  1262. return
  1263. }
  1264. personGreenEnergy, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesGreenEnergyBasicSetting.PersonGreenEnergyCoinId)))
  1265. if err2 != nil {
  1266. e.OutErr(c, e.ERR, err.Error())
  1267. return
  1268. }
  1269. teamGreenEnergy, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesGreenEnergyBasicSetting.TeamGreenEnergyCoinId)))
  1270. if err2 != nil {
  1271. e.OutErr(c, e.ERR, err.Error())
  1272. return
  1273. }
  1274. totalGreenEnergy = utils.StrToFloat64(personGreenEnergy.Amount) + utils.StrToFloat64(teamGreenEnergy.Amount)
  1275. totalGreenEnergyPrice = totalGreenEnergy * utils.StrToFloat64(oneCirclesGreenEnergyBasicSetting.NowPrice)
  1276. //4、活跃积分(个人+团队)、预估总价值
  1277. var totalActivePoints float64
  1278. personActivePoints, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesPublicPlatoonBasicSetting.PersonActivePointsCoinId)))
  1279. if err2 != nil {
  1280. e.OutErr(c, e.ERR, err.Error())
  1281. return
  1282. }
  1283. teamActivePoints, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesPublicPlatoonBasicSetting.TeamActivePointsCoinId)))
  1284. if err2 != nil {
  1285. e.OutErr(c, e.ERR, err.Error())
  1286. return
  1287. }
  1288. totalActivePoints = utils.StrToFloat64(personActivePoints.Amount) + utils.StrToFloat64(teamActivePoints.Amount)
  1289. coin, _ := commDb.VirtualCoinGetOneById(engine, oneCirclesPublicPlatoonBasicSetting.PersonActivePointsCoinId)
  1290. exchangeRatio, _ := decimal.NewFromString(coin.ExchangeRatio)
  1291. totalActivePointsValue := decimal.NewFromFloat(totalActivePoints)
  1292. totalActivePointsAmount := totalActivePointsValue.Div(exchangeRatio).String()
  1293. //err, totalActivePointsExchangeGreenNums, _, _ := one_circles.CalcPriceIncreaseFormula(engine, totalActivePointsAmount)
  1294. //if err != nil {
  1295. // return
  1296. //}
  1297. //5、个人可用余额、预估总价值
  1298. err, totalAmountExchangeGreenNums, _, _ := one_circles.CalcPriceIncreaseFormula(engine, user.Profile.FinValid)
  1299. if err != nil {
  1300. e.OutErr(c, e.ERR, err.Error())
  1301. return
  1302. }
  1303. //5、计算动态数据
  1304. var sql1 = fmt.Sprintf("SELECT SUM(amount) AS total FROM `user_virtual_amount` WHERE coin_id = %d", oneCirclesGreenEnergyBasicSetting.TeamGreenEnergyCoinId)
  1305. var sql2 = fmt.Sprintf("SELECT SUM(amount) AS total FROM `user_virtual_amount` WHERE coin_id = %d", oneCirclesGreenEnergyBasicSetting.PersonGreenEnergyCoinId)
  1306. var sql3 = fmt.Sprintf("SELECT SUM(amount) AS total FROM `one_circles_available_green_energy_points_flow` WHERE kind = %d", enum.SignInReward)
  1307. results1, _ := commDb.QueryNativeString(engine, sql1) //待释放总量
  1308. results2, _ := commDb.QueryNativeString(engine, sql2) //用户持有总量
  1309. results3, _ := commDb.QueryNativeString(engine, sql3) // 已赠送总量
  1310. var vipEquitySetting []*md.VipEquitySettingStruct
  1311. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.VipEquitySetting), &vipEquitySetting)
  1312. if err != nil {
  1313. e.OutErr(c, e.ERR, err.Error())
  1314. return
  1315. }
  1316. var exchangeAccountBalanceFeeValue string
  1317. for _, v := range vipEquitySetting {
  1318. if v.VipLevelId == utils.IntToStr(user.Level.Id) {
  1319. exchangeAccountBalanceFeeValue = v.ExchangeAccountBalanceFee
  1320. }
  1321. }
  1322. if exchangeAccountBalanceFeeValue == "" {
  1323. e.OutErr(c, e.ERR, "未查询到当前会员等级兑换余额手续费")
  1324. return
  1325. }
  1326. var tipsStr = "温馨提示:当前兑换余额积分手续费%s,升级可降低手续费至%s哟!"
  1327. topLevel, err := commDb.UserLevelTop(engine)
  1328. if err != nil {
  1329. e.OutErr(c, e.ERR, err.Error())
  1330. return
  1331. }
  1332. if user.Level.Id == topLevel.Id {
  1333. tipsStr = "温馨提示:当前兑换余额积分手续费%s"
  1334. tipsStr = fmt.Sprintf(tipsStr, exchangeAccountBalanceFeeValue+"%")
  1335. } else {
  1336. tipsStr = fmt.Sprintf(tipsStr, exchangeAccountBalanceFeeValue+"%", vipEquitySetting[len(vipEquitySetting)-1].ExchangeAccountBalanceFee+"%")
  1337. }
  1338. e.OutSuc(c, map[string]interface{}{
  1339. "total_green_energy": totalGreenEnergy,
  1340. "total_green_energy_price": totalGreenEnergyPrice,
  1341. "total_active_points": totalActivePoints,
  1342. "total_active_points_amount": totalActivePointsAmount,
  1343. "total_amount": user.Profile.FinValid,
  1344. "total_amount_exchange_green_nums": totalAmountExchangeGreenNums,
  1345. "green_energy_now_price": oneCirclesGreenEnergyBasicSetting.NowPrice,
  1346. "initial_price": oneCirclesGreenEnergyBasicSetting.InitialPrice,
  1347. "is_rises": isRises,
  1348. "rises": rises,
  1349. "release_data": map[string]interface{}{
  1350. "total_issuance_amount": oneCirclesGreenEnergyBasicSetting.TotalIssuanceAmount,
  1351. "initial_price": oneCirclesGreenEnergyBasicSetting.InitialPrice,
  1352. "total_technology_team": oneCirclesGreenEnergyBasicSetting.TotalTechnologyTeam,
  1353. "total_technology_team_ratio": "5%",
  1354. "total_operate_team": oneCirclesGreenEnergyBasicSetting.TotalOperateTeam,
  1355. "total_operate_team_ratio": "5%",
  1356. "total_active_giveaways": oneCirclesGreenEnergyBasicSetting.TotalActiveGiveaways,
  1357. "total_active_giveaways_ratio": "5%",
  1358. "ecological_application": oneCirclesGreenEnergyBasicSetting.EcologicalApplication,
  1359. "ecological_application_ratio": "5%",
  1360. "original_quantity_nums": oneCirclesGreenEnergyBasicSetting.OriginalQuantityNums,
  1361. "original_quantity_nums_ratio": "5%",
  1362. },
  1363. "trends_data": map[string]interface{}{
  1364. "total_to_be_released ": results1[0]["total"],
  1365. "destruction_quantity_nums": oneCirclesGreenEnergyBasicSetting.DestructionQuantityNums,
  1366. "total_gifted": results3[0]["total"],
  1367. "total_held_by_users": results2[0]["total"],
  1368. "public_welfare_and_charity": oneCirclesGreenEnergyBasicSetting.PublicWelfareAndCharity,
  1369. },
  1370. "tips": tipsStr,
  1371. }, nil)
  1372. return
  1373. }
  1374. func HomePage(c *gin.Context) {
  1375. engine := commSvc.MasterDb(c)
  1376. user := commSvc.GetUser(c)
  1377. now := time.Now()
  1378. //1、查找 `one_circles_green_energy_basic_setting` 基础设置 && 查找 `one_circles_public_platoon_basic_setting` 基础设置
  1379. oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  1380. "key": "is_open",
  1381. "value": 1,
  1382. })
  1383. if err != nil {
  1384. e.OutErr(c, e.ERR, err.Error())
  1385. return
  1386. }
  1387. oneCirclesPublicPlatoonBasicSetting, err := db.OneCirclesPublicPlatoonBasicSettingGetOneByParams(engine, map[string]interface{}{
  1388. "key": "is_open",
  1389. "value": 1,
  1390. })
  1391. if err != nil {
  1392. e.OutErr(c, e.ERR, err.Error())
  1393. return
  1394. }
  1395. //2、计算今日涨幅
  1396. err, rises, isRises := one_circles.CalcTodayGreenEnergyPriceRises(engine, oneCirclesGreenEnergyBasicSetting)
  1397. if err != nil {
  1398. e.OutErr(c, e.ERR, err.Error())
  1399. return
  1400. }
  1401. //3、获取当前用户 绿色能量(可用+结算+今日签到预估绿色能量)
  1402. var isSign bool
  1403. var signCountdown string
  1404. var signGreenEnergy string
  1405. var signRewardGreenEnergy string
  1406. var totalGreenEnergy float64
  1407. var teamRewardSetting *md.TeamRewardSettingStruct
  1408. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.TeamReward), &teamRewardSetting)
  1409. if err != nil {
  1410. e.OutErr(c, e.ERR, err.Error())
  1411. return
  1412. }
  1413. var oneRoundDuration = zhios_order_relate_utils.StrToInt(teamRewardSetting.OneRoundDuration)
  1414. startTime := now.Add(-time.Hour * time.Duration(oneRoundDuration)).Format("2006-01-02 15:04:05")
  1415. var oneCirclesGreenEnergySignIn model.OneCirclesGreenEnergySignIn
  1416. get, err := engine.Where("start_time >= ?", startTime).And("uid =?", user.Info.Uid).And("is_completed =?", 0).Get(&oneCirclesGreenEnergySignIn)
  1417. if err != nil {
  1418. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  1419. return
  1420. }
  1421. if !get {
  1422. signGreenEnergy = "0.00"
  1423. signRewardGreenEnergy = "0.00"
  1424. } else {
  1425. var signInRewards []*md.SignInRewardStruct
  1426. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.SignInReward), &signInRewards)
  1427. if err != nil {
  1428. e.OutErr(c, e.ERR, err.Error())
  1429. return
  1430. }
  1431. err, signRewardGreenEnergy = one_circles.CalcNowSignInGreenEnergy(engine, oneCirclesGreenEnergyBasicSetting)
  1432. if err != nil {
  1433. e.OutErr(c, e.ERR, err.Error())
  1434. return
  1435. }
  1436. signRewardGreenEnergyValue, err1 := decimal.NewFromString(signRewardGreenEnergy)
  1437. if err != nil {
  1438. e.OutErr(c, e.ERR, err1.Error())
  1439. return
  1440. }
  1441. diffSeconds := decimal.NewFromInt(int64(now.Sub(zhios_order_relate_utils.String2Time(oneCirclesGreenEnergySignIn.StartTime)).Seconds()))
  1442. signGreenEnergy = signRewardGreenEnergyValue.Mul(diffSeconds).String()
  1443. isSign = true
  1444. signCountdown = oneCirclesGreenEnergySignIn.EndTime
  1445. }
  1446. personGreenEnergy, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesGreenEnergyBasicSetting.PersonGreenEnergyCoinId)))
  1447. if err2 != nil {
  1448. e.OutErr(c, e.ERR, err.Error())
  1449. return
  1450. }
  1451. teamGreenEnergy, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesGreenEnergyBasicSetting.TeamGreenEnergyCoinId)))
  1452. if err2 != nil {
  1453. e.OutErr(c, e.ERR, err.Error())
  1454. return
  1455. }
  1456. signGreenEnergyValue, _ := decimal.NewFromString(signGreenEnergy)
  1457. personGreenEnergyValue, _ := decimal.NewFromString(personGreenEnergy.Amount)
  1458. teamGreenEnergyValue, _ := decimal.NewFromString(teamGreenEnergy.Amount)
  1459. totalGreenEnergy, _ = signGreenEnergyValue.Add(personGreenEnergyValue).Add(teamGreenEnergyValue).Float64()
  1460. //4、活跃积分(个人+团队)
  1461. var totalActivePoints float64
  1462. personActivePoints, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesPublicPlatoonBasicSetting.PersonActivePointsCoinId)))
  1463. if err2 != nil {
  1464. e.OutErr(c, e.ERR, err.Error())
  1465. return
  1466. }
  1467. teamActivePoints, err2 := commDb.GetUserVirtualWallet(engine, user.Info.Uid, int(utils.AnyToInt64(oneCirclesPublicPlatoonBasicSetting.TeamActivePointsCoinId)))
  1468. if err2 != nil {
  1469. e.OutErr(c, e.ERR, err.Error())
  1470. return
  1471. }
  1472. totalActivePoints = utils.StrToFloat64(personActivePoints.Amount) + utils.StrToFloat64(teamActivePoints.Amount)
  1473. //5、计算当前基础速率、团队速率
  1474. nowBasalRate := utils.StrToFloat64(signRewardGreenEnergy) * 60 * 60 //每小时基础速率
  1475. userRelates, err := db2.DbsUserRelateByParentUid(engine, user.Info.Uid, 0)
  1476. if err != nil {
  1477. e.OutErr(c, e.ERR, err.Error())
  1478. return
  1479. }
  1480. var userRelatesUids []int
  1481. var userRelatesMap = map[int]model.UserRelate{}
  1482. if userRelates != nil {
  1483. for _, userRelate := range *userRelates {
  1484. userRelatesUids = append(userRelatesUids, userRelate.Uid)
  1485. userRelatesMap[userRelate.Uid] = userRelate
  1486. }
  1487. }
  1488. var oneCirclesGreenEnergySignIns []*model.OneCirclesGreenEnergySignIn
  1489. err = engine.Where("start_time >= ?", startTime).In("uid", userRelatesUids).And("is_completed =?", 0).Find(&oneCirclesGreenEnergySignIns)
  1490. if err != nil {
  1491. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  1492. return
  1493. }
  1494. var nowTeamRate float64 //每小时基础速率
  1495. nowBasalRateValue := decimal.NewFromFloat(nowBasalRate)
  1496. for _, vv := range oneCirclesGreenEnergySignIns {
  1497. rewardDecrementValue := utils.StrToFloat64(teamRewardSetting.RewardDecrementValue) / 100
  1498. tmpRewardBase := decimal.NewFromFloat(math.Pow(rewardDecrementValue, float64(userRelatesMap[vv.Uid].Level)))
  1499. tmpReward := nowBasalRateValue.Mul(tmpRewardBase)
  1500. rewardEndValue, _ := decimal.NewFromString(teamRewardSetting.RewardEndValue)
  1501. if tmpReward.GreaterThanOrEqual(rewardEndValue) {
  1502. tmpRewardValue, _ := tmpReward.Float64()
  1503. nowTeamRate += tmpRewardValue
  1504. }
  1505. }
  1506. decimalRate := decimal.NewFromInt(100) //百分比
  1507. risesValue, _ := decimal.NewFromFloat(rises).Mul(decimalRate).Float64()
  1508. e.OutSuc(c, map[string]interface{}{
  1509. "is_sign": isSign,
  1510. "sign_end_date": signCountdown,
  1511. "total_green_energy": totalGreenEnergy,
  1512. "sign_reward_green_energy": utils.StrToFloat64(signRewardGreenEnergy),
  1513. "total_active_points": totalActivePoints,
  1514. "green_energy_now_price": oneCirclesGreenEnergyBasicSetting.NowPrice,
  1515. "initial_price": oneCirclesGreenEnergyBasicSetting.InitialPrice,
  1516. "is_rises": isRises,
  1517. "rises": risesValue,
  1518. "now_basal_rate": nowBasalRate,
  1519. "now_team_rate": nowTeamRate,
  1520. }, nil)
  1521. return
  1522. }
  1523. func HomePageRealTime(c *gin.Context) {
  1524. engine := commSvc.MasterDb(c)
  1525. results, err := commDb.QueryNativeString(engine, "SELECT COUNT(*)AS total FROM user")
  1526. if err != nil {
  1527. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  1528. return
  1529. }
  1530. userCount := results[0]["total"]
  1531. e.OutSuc(c, map[string]interface{}{
  1532. "user_count": userCount,
  1533. }, nil)
  1534. return
  1535. }
  1536. func HomePageStartSignIn(c *gin.Context) {
  1537. engine := commSvc.MasterDb(c)
  1538. user := commSvc.GetUser(c)
  1539. now := time.Now()
  1540. //1、查找 `one_circles_green_energy_basic_setting` 基础设置
  1541. oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  1542. "key": "is_open",
  1543. "value": 1,
  1544. })
  1545. if err != nil {
  1546. e.OutErr(c, e.ERR, err.Error())
  1547. return
  1548. }
  1549. var teamRewardSetting *md.TeamRewardSettingStruct
  1550. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.TeamReward), &teamRewardSetting)
  1551. if err != nil {
  1552. e.OutErr(c, e.ERR, err.Error())
  1553. return
  1554. }
  1555. //2、新增 `one_circles_green_energy_sign_in` 记录
  1556. var oneRoundDuration = zhios_order_relate_utils.StrToInt(teamRewardSetting.OneRoundDuration)
  1557. endTime := now.Add(time.Hour * time.Duration(oneRoundDuration)).Format("2006-01-02 15:04:05")
  1558. _, err = db2.OneCirclesGreenEnergySignInInsert(engine, &model.OneCirclesGreenEnergySignIn{
  1559. Uid: user.Info.Uid,
  1560. StartTime: now.Format("2006-01-02 15:04:05"),
  1561. EndTime: endTime,
  1562. IsCompleted: 0,
  1563. })
  1564. if err != nil {
  1565. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  1566. return
  1567. }
  1568. //3、新增 `one_circles_user_activity` 记录
  1569. var m model.OneCirclesUserActivity
  1570. has, err := engine.Where("uid =? and date =?", user.Info.Uid, now.Format("2006-01-02")).Get(&m)
  1571. if err != nil {
  1572. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  1573. return
  1574. }
  1575. if !has {
  1576. affected, err1 := db2.OneCirclesUserActivityInsert(engine, &model.OneCirclesUserActivity{
  1577. Uid: user.Info.Uid,
  1578. Date: now.Format("2006-01-02"),
  1579. })
  1580. if err1 != nil {
  1581. e.OutErr(c, e.ERR_DB_ORM, err1.Error())
  1582. return
  1583. }
  1584. if affected <= 0 {
  1585. e.OutErr(c, e.ERR_DB_ORM, "插入活跃记录失败")
  1586. return
  1587. }
  1588. }
  1589. e.OutSuc(c, "success", nil)
  1590. return
  1591. }
  1592. func HomePageWatchAdList(c *gin.Context) {
  1593. engine := commSvc.MasterDb(c)
  1594. user := commSvc.GetUser(c)
  1595. //1、查找 `OneCirclesPublicPlatoonBasicSetting` 基础设置
  1596. oneCirclesPublicPlatoonBasicSetting, err := db.OneCirclesPublicPlatoonBasicSettingGetOneByParams(engine, map[string]interface{}{
  1597. "key": "is_open",
  1598. "value": 1,
  1599. })
  1600. if err != nil {
  1601. e.OutErr(c, e.ERR, err.Error())
  1602. return
  1603. }
  1604. //2、计算当前还能看几个广告
  1605. oneCirclesUserWatchRecords, err1 := db2.OneCirclesUserWatchRecordsGetOneByParams(engine, map[string]interface{}{
  1606. "key": "uid",
  1607. "value": user.Info.Uid,
  1608. })
  1609. if err1 != nil {
  1610. e.OutErr(c, e.ERR, err1.Error())
  1611. return
  1612. }
  1613. var videoRewardSystem *md.VideoRewardSystemStruct
  1614. err = json.Unmarshal([]byte(oneCirclesPublicPlatoonBasicSetting.VideoRewardSystem), &videoRewardSystem)
  1615. if err != nil {
  1616. return
  1617. }
  1618. masterId := c.GetString("mid")
  1619. redisKey := fmt.Sprintf(md.UserNextWatchAdDate, masterId, user.Info.Uid)
  1620. var residueWatchAdNum int
  1621. if oneCirclesUserWatchRecords == nil {
  1622. residueWatchAdNum = utils.StrToInt(videoRewardSystem.RewardTotalNum)
  1623. } else {
  1624. now := time.Now()
  1625. nextWatchAdDate := oneCirclesUserWatchRecords.NextWatchAdDate
  1626. residueWatchAdNum = oneCirclesUserWatchRecords.ResidueWatchAdNum
  1627. if oneCirclesUserWatchRecords.NextWatchAdDate.Before(now) { //TODO::下一轮时间已在当前时间之前
  1628. nextWatchAdDate = now.Add(time.Hour * time.Duration(zhios_order_relate_utils.StrToInt(videoRewardSystem.EachRoundHour)))
  1629. residueWatchAdNum = zhios_order_relate_utils.StrToInt(videoRewardSystem.RewardTotalNum)
  1630. oneCirclesUserWatchRecords.ResidueWatchAdNum = residueWatchAdNum
  1631. oneCirclesUserWatchRecords.NextWatchAdDate = nextWatchAdDate
  1632. _, err2 := db2.OneCirclesUserWatchRecordsUpdate(engine, oneCirclesUserWatchRecords.Id, oneCirclesUserWatchRecords, "residue_watch_ad_num", "next_watch_ad_date")
  1633. if err2 != nil {
  1634. e.OutErr(c, e.ERR_DB_ORM, err2.Error())
  1635. return
  1636. }
  1637. cache.SetEx(redisKey, "", 60*60*12) //TODO::默认缓存1小时
  1638. }
  1639. }
  1640. nextWatchAdDate, _ := cache.GetString(redisKey)
  1641. oneCirclesGreenEnergyBasicSetting, err := db2.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{
  1642. "key": "is_open",
  1643. "value": 1,
  1644. })
  1645. if err != nil {
  1646. e.OutErr(c, e.ERR, err.Error())
  1647. return
  1648. }
  1649. var teamRewardSetting *md.TeamRewardSettingStruct
  1650. err = json.Unmarshal([]byte(oneCirclesGreenEnergyBasicSetting.TeamReward), &teamRewardSetting)
  1651. if err != nil {
  1652. return
  1653. }
  1654. e.OutSuc(c, map[string]interface{}{
  1655. "residue_watch_ad_num": residueWatchAdNum,
  1656. "watch_ad_reward_active_points": videoRewardSystem.RewardValue,
  1657. "next_watch_ad_date": nextWatchAdDate,
  1658. "each_round_hour": teamRewardSetting.OneRoundDuration,
  1659. }, nil)
  1660. return
  1661. }
  1662. func HomePageWatchOverAd(c *gin.Context) {
  1663. engine := commSvc.MasterDb(c)
  1664. user := commSvc.GetUser(c)
  1665. masterId := c.GetString("mid")
  1666. err := one_circles.SettlementPublicGiveActivityCoin(engine, masterId, user.Info.Uid)
  1667. if err != nil {
  1668. e.OutErr(c, e.ERR, err.Error())
  1669. return
  1670. }
  1671. e.OutSuc(c, "success", nil)
  1672. return
  1673. }