蛋蛋星球-客户端
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

hdl_add_friend.go 24 KiB

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週間前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. package hdl
  2. import (
  3. "applet/app/db"
  4. "applet/app/e"
  5. "applet/app/md"
  6. "applet/app/utils"
  7. "code.fnuoos.com/EggPlanet/egg_models.git/src/implement"
  8. "code.fnuoos.com/EggPlanet/egg_models.git/src/model"
  9. md3 "code.fnuoos.com/EggPlanet/egg_system_rules.git/md"
  10. md2 "code.fnuoos.com/EggPlanet/egg_system_rules.git/rule/egg_energy/md"
  11. "encoding/json"
  12. "fmt"
  13. "github.com/gin-gonic/gin"
  14. "github.com/shopspring/decimal"
  15. "math"
  16. "strconv"
  17. "strings"
  18. "time"
  19. )
  20. // EggEnergyDetails
  21. // @Summary 蛋蛋星球-添加好友-蛋蛋能量明细(获取)
  22. // @Tags 添加好友
  23. // @Description 蛋蛋能量明细(获取)
  24. // @Accept json
  25. // @Produce json
  26. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  27. // @Param req body md.EggEnergyDetailReq true "分页类型必填"
  28. // @Success 200 {object} md.EggEnergyDetailResp "具体数据"
  29. // @Failure 400 {object} md.Response "具体错误"
  30. // @Router /api/v1/addFriend/eggEnergyDetails [POST]
  31. func EggEnergyDetails(c *gin.Context) {
  32. val, exists := c.Get("user")
  33. if !exists {
  34. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  35. return
  36. }
  37. user, ok := val.(*model.User)
  38. if !ok {
  39. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  40. return
  41. }
  42. var req *md.EggEnergyDetailReq
  43. if err1 := c.ShouldBindJSON(&req); err1 != nil {
  44. e.OutErr(c, e.ERR_INVALID_ARGS, err1.Error())
  45. return
  46. }
  47. //1、查找 `OneCirclesPublicPlatoonBasicSetting` 基础设置
  48. energyBasicSettingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  49. eggEnergyBasicSetting, err := energyBasicSettingDb.EggEnergyBasicSettingGetOneByParams(map[string]interface{}{
  50. "key": "is_open",
  51. "value": 1,
  52. })
  53. if err != nil {
  54. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  55. return
  56. }
  57. var coinID int
  58. isAsc := false
  59. if req.Kind == "1" { // 待结
  60. coinID = eggEnergyBasicSetting.PersonEggEnergyCoinId
  61. } else { // 可用
  62. coinID = eggEnergyBasicSetting.TeamEggEnergyCoinId
  63. }
  64. if req.Asc == "1" {
  65. isAsc = true
  66. }
  67. direction := 0
  68. switch req.Direction {
  69. case "1":
  70. direction = 1
  71. case "2":
  72. direction = 2
  73. default:
  74. direction = 0
  75. }
  76. transferType := 0
  77. switch req.Type {
  78. case "1":
  79. transferType = 1
  80. case "2":
  81. transferType = 2
  82. default:
  83. transferType = 0
  84. }
  85. flowDb := implement.NewUserVirtualCoinFlowDb(db.Db)
  86. flows, total, err := flowDb.UserVirtualCoinFlowFindByCoinAndUser(req.Page, req.Limit, coinID, user.Id, "", "", direction, isAsc, transferType)
  87. if err != nil {
  88. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  89. return
  90. }
  91. var list = make([]map[string]string, 0)
  92. for _, flow := range flows {
  93. var tmp = map[string]string{
  94. "title": flow.Title,
  95. "time": flow.CreateAt,
  96. "type": utils.IntToStr(flow.Direction),
  97. "value": flow.Amount,
  98. "transfer_type": utils.IntToStr(flow.TransferType),
  99. }
  100. list = append(list, tmp)
  101. }
  102. //3、获取当前用户 蛋蛋能量(可用+结算)、 预估总价值
  103. virtualAmountDb := implement.NewUserVirtualAmountDb(db.Db)
  104. personEggEnergy, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, eggEnergyBasicSetting.PersonEggEnergyCoinId)
  105. if err != nil {
  106. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  107. return
  108. }
  109. teamEggEnergy, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, eggEnergyBasicSetting.TeamEggEnergyCoinId)
  110. if err != nil {
  111. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  112. return
  113. }
  114. coreDataDb := implement.NewEggEnergyCoreDataDb(db.Db)
  115. coreData, err := coreDataDb.EggEnergyCoreDataGet()
  116. if err != nil {
  117. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  118. return
  119. }
  120. totalEggEnergy := utils.StrToFloat64(personEggEnergy.Amount) + utils.StrToFloat64(teamEggEnergy.Amount)
  121. totalEggEnergyPrice := totalEggEnergy * utils.StrToFloat64(coreData.NowPrice)
  122. transferTypeList := md.TransferTypeList{
  123. AvailableIntegralList: md.IntegralList{
  124. IncomeList: []md.TransferTypeNode{
  125. {
  126. Value: strconv.Itoa(md3.EggPlantEggEnergySignInSettlementPersonalRewardForUserVirtualCoinFlow),
  127. Name: md3.EggPlantEggEnergySignInSettlementPersonalReward,
  128. },
  129. {
  130. Value: strconv.Itoa(md3.EggPlantBalanceExchangeForEggEnergyForUserVirtualCoinFlow),
  131. Name: md3.EggPlantBalanceExchangeForEggEnergy,
  132. },
  133. {
  134. Value: strconv.Itoa(md3.EggPlantPersonalActiveCoinExchangeEggEnergyForUserVirtualCoinFlow),
  135. Name: md3.EggPlantPersonalActiveCoinExchangeEggEnergy,
  136. },
  137. {
  138. Value: strconv.Itoa(md3.EggPlantSettlementEggEnergyExchangeEggEnergyForUserVirtualCoinFlow),
  139. Name: md3.EggPlantSettlementEggEnergyExchangeEggEnergy,
  140. },
  141. },
  142. ExpendList: []md.TransferTypeNode{
  143. {
  144. Value: strconv.Itoa(md3.EggPlantEggEnergyExchangeForBalanceForUserVirtualCoinFlow),
  145. Name: md3.EggPlantEggEnergyExchangeForBalance,
  146. },
  147. },
  148. },
  149. SettlementIntegralList: md.IntegralList{
  150. IncomeList: []md.TransferTypeNode{
  151. {
  152. Value: strconv.Itoa(md3.EggPlantEggEnergySignInSettlementTeamRewardForUserVirtualCoinFlow),
  153. Name: md3.EggPlantEggEnergySignInSettlementTeamReward,
  154. },
  155. {
  156. Value: strconv.Itoa(md3.EggPlantTeamActiveCoinExchangeEggEnergyForUserVirtualCoinFlow),
  157. Name: md3.EggPlantTeamActiveCoinExchangeEggEnergy,
  158. },
  159. {
  160. Value: strconv.Itoa(md3.EggPlantSettlementStarLevelDividendsForUserVirtualCoinFlow),
  161. Name: md3.EggPlantSettlementStarLevelDividends,
  162. },
  163. },
  164. ExpendList: []md.TransferTypeNode{
  165. {
  166. Value: strconv.Itoa(md3.EggPlantSettlementEggEnergyExchangeTobeEggEnergyForUserVirtualCoinFlow),
  167. Name: md3.EggPlantSettlementEggEnergyExchangeEggEnergy,
  168. },
  169. },
  170. },
  171. }
  172. resp := md.EggEnergyDetailResp{
  173. PersonEggEnergy: personEggEnergy.Amount,
  174. TeamEggEnergy: teamEggEnergy.Amount,
  175. TotalEggEnergy: utils.Float64ToStr(totalEggEnergy),
  176. TotalEggEnergyPrice: utils.Float64ToStr(totalEggEnergyPrice),
  177. List: list,
  178. TransferTypeList: transferTypeList,
  179. Paginate: md.Paginate{
  180. Limit: req.Limit,
  181. Page: req.Page,
  182. Total: total,
  183. },
  184. }
  185. e.OutSuc(c, resp, nil)
  186. }
  187. // EggPointDetails
  188. // @Summary 蛋蛋星球-添加好友-蛋蛋积分明细(获取)
  189. // @Tags 添加好友
  190. // @Description 蛋蛋积分明细(获取)
  191. // @Accept json
  192. // @Produce json
  193. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  194. // @Param req body md.EggPointDetailsReq true "分页类型必填"
  195. // @Success 200 {object} md.EggPointDetailsResp "具体数据"
  196. // @Failure 400 {object} md.Response "具体错误"
  197. // @Router /api/v1/addFriend/eggPointDetails [POST]
  198. func EggPointDetails(c *gin.Context) {
  199. val, exists := c.Get("user")
  200. if !exists {
  201. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  202. return
  203. }
  204. user, ok := val.(*model.User)
  205. if !ok {
  206. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  207. return
  208. }
  209. var req *md.EggPointDetailsReq
  210. if err1 := c.ShouldBindJSON(&req); err1 != nil {
  211. e.OutErr(c, e.ERR_INVALID_ARGS, err1.Error())
  212. return
  213. }
  214. //1、查找 `OneCirclesPublicPlatoonBasicSetting` 基础设置
  215. energyBasicSettingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  216. eggEnergyBasicSetting, err := energyBasicSettingDb.EggEnergyBasicSettingGetOneByParams(map[string]interface{}{
  217. "key": "is_open",
  218. "value": 1,
  219. })
  220. if err != nil {
  221. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  222. return
  223. }
  224. var coinID int
  225. isAsc := false
  226. if req.Kind == "1" { // 待结
  227. coinID = eggEnergyBasicSetting.PersonEggPointsCoinId
  228. } else { // 可用
  229. coinID = eggEnergyBasicSetting.TeamEggPointsCoinId
  230. }
  231. if req.Asc == "1" {
  232. isAsc = true
  233. }
  234. direction := 0
  235. switch req.Direction {
  236. case "1":
  237. direction = 1
  238. case "2":
  239. direction = 2
  240. default:
  241. direction = 0
  242. }
  243. transferType := 0
  244. switch req.Type {
  245. case "1":
  246. transferType = 1
  247. case "2":
  248. transferType = 2
  249. default:
  250. transferType = 0
  251. }
  252. flowDb := implement.NewUserVirtualCoinFlowDb(db.Db)
  253. flows, total, err := flowDb.UserVirtualCoinFlowFindByCoinAndUser(req.Page, req.Limit, coinID, user.Id, "", "", direction, isAsc, transferType)
  254. if err != nil {
  255. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  256. return
  257. }
  258. var list = make([]map[string]string, 0)
  259. for _, flow := range flows {
  260. var tmp = map[string]string{
  261. "title": flow.Title,
  262. "time": flow.CreateAt,
  263. "type": utils.IntToStr(flow.Direction),
  264. "value": flow.Amount,
  265. "transfer_type": utils.IntToStr(flow.TransferType),
  266. }
  267. list = append(list, tmp)
  268. }
  269. virtualAmountDb := implement.NewUserVirtualAmountDb(db.Db)
  270. var totalEggPoints float64
  271. personEggPoints, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, eggEnergyBasicSetting.PersonEggEnergyCoinId)
  272. if err != nil {
  273. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  274. return
  275. }
  276. teamEggPoints, err := virtualAmountDb.GetUserVirtualWalletBySession(user.Id, eggEnergyBasicSetting.TeamEggEnergyCoinId)
  277. if err != nil {
  278. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  279. return
  280. }
  281. totalEggPoints = utils.StrToFloat64(personEggPoints.Amount) + utils.StrToFloat64(teamEggPoints.Amount)
  282. coinDb := implement.NewVirtualCoinDb(db.Db)
  283. coin, err := coinDb.VirtualCoinGetOneByParams(map[string]interface{}{
  284. "key": "id",
  285. "value": eggEnergyBasicSetting.PersonEggPointsCoinId,
  286. })
  287. if err != nil {
  288. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  289. return
  290. }
  291. exchangeRatio, _ := decimal.NewFromString(coin.ExchangeRatio)
  292. totalEggPointsValue := decimal.NewFromFloat(totalEggPoints)
  293. totalEggPointsAmount := totalEggPointsValue.Div(exchangeRatio).String()
  294. transferTypeList := md.TransferTypeList{
  295. AvailableIntegralList: md.IntegralList{
  296. IncomeList: []md.TransferTypeNode{
  297. {
  298. Value: strconv.Itoa(md3.EggPlantWatchAdRewardPersonalActiveCoinForUserVirtualCoinFlow),
  299. Name: md3.EggPlantWatchAdRewardPersonalActiveCoin,
  300. },
  301. {
  302. Value: strconv.Itoa(md3.EggPlantConsumeOrdersGiveEggEnergyToPersonForUserVirtualCoinFlow),
  303. Name: md3.EggPlantConsumeOrdersGiveEggEnergyForPerson,
  304. },
  305. },
  306. ExpendList: []md.TransferTypeNode{
  307. {
  308. Value: strconv.Itoa(md3.EggPlantPersonalActiveCoinExchangeToBeEggEnergyForUserVirtualCoinFlow),
  309. Name: md3.EggPlantPersonalActiveCoinExchangeToBeEggEnergy,
  310. },
  311. },
  312. },
  313. SettlementIntegralList: md.IntegralList{
  314. IncomeList: []md.TransferTypeNode{
  315. {
  316. Value: strconv.Itoa(md3.EggPlantWatchAdRewardTeamActiveCoinForUserVirtualCoinFlow),
  317. Name: md3.EggPlantWatchAdRewardTeamActiveCoin,
  318. },
  319. {
  320. Value: strconv.Itoa(md3.EggPlantConsumeOrdersGiveEggEnergyToTeamForUserVirtualCoinFlow),
  321. Name: md3.EggPlantConsumeOrdersGiveEggEnergyForTeam,
  322. },
  323. },
  324. ExpendList: []md.TransferTypeNode{
  325. {
  326. Value: strconv.Itoa(md3.EggPlantTeamActiveCoinExchangeToBeEggEnergyForUserVirtualCoinFlow),
  327. Name: md3.EggPlantTeamActiveCoinExchangeToBeEggEnergy,
  328. },
  329. },
  330. },
  331. }
  332. resp := md.EggPointDetailsResp{
  333. PersonEggPoints: personEggPoints.Amount,
  334. TeamEggPoints: teamEggPoints.Amount,
  335. TotalEggPoints: utils.Float64ToStr(totalEggPoints),
  336. TotalEggPointsAmount: totalEggPointsAmount,
  337. List: list,
  338. TransferTypeList: transferTypeList,
  339. Paginate: md.Paginate{
  340. Limit: req.Limit,
  341. Page: req.Page,
  342. Total: total,
  343. },
  344. }
  345. e.OutSuc(c, resp, nil)
  346. }
  347. // BasalRate
  348. // @Summary 蛋蛋星球-添加好友-基础速率(获取)
  349. // @Tags 添加好友
  350. // @Description 基础速率(获取)
  351. // @Accept json
  352. // @Produce json
  353. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  354. // @Success 200 {object} md.BasalRateResp "具体数据"
  355. // @Failure 400 {object} md.Response "具体错误"
  356. // @Router /api/v1/addFriend/basalRate [GET]
  357. func BasalRate(c *gin.Context) {
  358. val, exists := c.Get("user")
  359. if !exists {
  360. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  361. return
  362. }
  363. user, ok := val.(*model.User)
  364. if !ok {
  365. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  366. return
  367. }
  368. energyBasicSettingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  369. eggEnergyBasicSetting, err := energyBasicSettingDb.EggEnergyBasicSettingGetOneByParams(map[string]interface{}{
  370. "key": "is_open",
  371. "value": 1,
  372. })
  373. if err != nil {
  374. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  375. return
  376. }
  377. coinID := eggEnergyBasicSetting.PersonEggEnergyCoinId
  378. coinDb := implement.NewVirtualCoinDb(db.Db)
  379. coin, err := coinDb.VirtualCoinGetOneByParams(map[string]interface{}{
  380. "key": "id",
  381. "value": coinID,
  382. })
  383. now := time.Now()
  384. nowStr := now.Format("2006-01-02 15:04:05")
  385. signInDb := implement.NewEggSignInDb(db.Db)
  386. has, eggSignIn, err := signInDb.EggSignINGetOneByTimeAndUid(nowStr, nowStr, user.Id, 0)
  387. if err != nil {
  388. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  389. return
  390. }
  391. if !has {
  392. resp := md.BasalRateResp{
  393. ConsumedTime: "",
  394. ConsumedEggEnergy: "",
  395. RemainingTime: "",
  396. RemainingEggEnergy: "",
  397. BasalRate: "",
  398. ConsumedEggPoint: "",
  399. EstimatedRevenue: "",
  400. SignCountdown: "0000:00:00",
  401. }
  402. e.OutSuc(c, resp, nil)
  403. return
  404. }
  405. ratio, err := decimal.NewFromString(coin.ExchangeRatio)
  406. if err != nil {
  407. e.OutErr(c, e.ERR_UNMARSHAL, err.Error())
  408. return
  409. }
  410. estimatePerSecondEggEnergyValue, err := decimal.NewFromString(eggSignIn.EstimatePerSecondPersonEggEnergyValue)
  411. if err != nil {
  412. e.OutErr(c, e.ERR_UNMARSHAL, err.Error())
  413. return
  414. }
  415. // 消耗时间、已获得收益
  416. consumedTimeSec := now.Unix() - utils.TimeParseStd(eggSignIn.StartTime).Unix()
  417. consumedTime := decimal.NewFromInt(consumedTimeSec).Div(decimal.NewFromInt(60 * 60))
  418. consumedEggEnergy := decimal.NewFromInt(consumedTimeSec).Mul(estimatePerSecondEggEnergyValue)
  419. consumedAmount := consumedEggEnergy.Div(ratio)
  420. // 剩余时间、待收益
  421. remainingTimeSec := utils.TimeParseStd(eggSignIn.EndTime).Unix() - now.Unix()
  422. remainingTime := decimal.NewFromInt(remainingTimeSec).Div(decimal.NewFromInt(60 * 60))
  423. remainingEggEnergy := decimal.NewFromInt(remainingTimeSec).Mul(estimatePerSecondEggEnergyValue)
  424. remainingAmount := remainingEggEnergy.Div(ratio)
  425. // 预估收益
  426. estimatedRevenue := consumedAmount.Add(remainingAmount)
  427. // 基础速率 / 每小时
  428. basalRateDecimal, err := decimal.NewFromString(eggSignIn.EstimatePerSecondPersonEggEnergyValue)
  429. if err != nil {
  430. e.OutErr(c, e.ERR_UNMARSHAL, err.Error())
  431. return
  432. }
  433. basalRate := basalRateDecimal.Mul(decimal.NewFromInt(60 * 60))
  434. // 收益倒计时
  435. duration := utils.TimeParseStd(eggSignIn.EndTime).Sub(now) // 计算时间差值
  436. hours := duration / time.Hour // 获取小时部分
  437. minutes := duration % time.Hour / time.Minute // 获取分钟部分(先除去小时后再乘以60)
  438. seconds := int64(duration/time.Second) % 60
  439. signCountdown := fmt.Sprintf("%d:%d:%d", hours, minutes, seconds) //收益倒计时
  440. resp := md.BasalRateResp{
  441. ConsumedTime: consumedTime.String(),
  442. ConsumedEggEnergy: consumedEggEnergy.String(),
  443. RemainingTime: remainingTime.String(),
  444. RemainingEggEnergy: remainingEggEnergy.String(),
  445. BasalRate: basalRate.String(),
  446. ConsumedEggPoint: eggSignIn.TotalPersonEggPoints,
  447. EstimatedRevenue: estimatedRevenue.String(),
  448. SignCountdown: signCountdown,
  449. }
  450. e.OutSuc(c, resp, nil)
  451. }
  452. // TotalRate
  453. // @Summary 蛋蛋星球-添加好友-总速率(获取)
  454. // @Tags 添加好友
  455. // @Description 总速率(获取)
  456. // @Accept json
  457. // @Produce json
  458. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  459. // @Success 200 {object} md.TotalRateResp "具体数据"
  460. // @Failure 400 {object} md.Response "具体错误"
  461. // @Router /api/v1/addFriend/totalRate [GET]
  462. func TotalRate(c *gin.Context) {
  463. val, exists := c.Get("user")
  464. if !exists {
  465. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  466. return
  467. }
  468. user, ok := val.(*model.User)
  469. if !ok {
  470. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  471. return
  472. }
  473. now := time.Now()
  474. nowStr := now.Format("2006-01-02 15:04:05")
  475. signInDb := implement.NewEggSignInDb(db.Db)
  476. exit, signIn, err := signInDb.EggSignInGetOne(nowStr, nowStr, user.Id)
  477. if err != nil {
  478. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  479. return
  480. }
  481. var signPersonEggEnergy = "0.00"
  482. var signTeamEggEnergy = "0.00"
  483. if exit && utils.TimeParseStd(signIn.EndTime).After(now) {
  484. //获取预估每秒获得蛋蛋能量数
  485. estimatePerSecondPersonEggEnergyValue, err1 := decimal.NewFromString(signIn.EstimatePerSecondPersonEggEnergyValue)
  486. if err1 != nil {
  487. e.OutErr(c, e.ERR_DB_ORM, err1.Error())
  488. return
  489. }
  490. signPersonEggEnergy = estimatePerSecondPersonEggEnergyValue.String()
  491. estimatePerSecondTeamEggEnergyValue, err2 := decimal.NewFromString(signIn.EstimatePerSecondTeamEggEnergyValue)
  492. if err2 != nil {
  493. e.OutErr(c, e.ERR_DB_ORM, err2.Error())
  494. return
  495. }
  496. signTeamEggEnergy = estimatePerSecondTeamEggEnergyValue.String()
  497. }
  498. nowBasalRate := utils.StrToFloat64(signPersonEggEnergy) * 60 * 60 //每小时基础速率
  499. nowTeamRate := utils.StrToFloat64(signTeamEggEnergy) * 60 * 60 // 每小时团队速率
  500. resp := md.TotalRateResp{
  501. NowBasalRate: utils.Float64ToStr(nowBasalRate),
  502. NowTeamRate: utils.Float64ToStr(nowTeamRate),
  503. ConsumedPersonalEggPoint: signIn.TotalPersonEggPoints,
  504. ConsumedTeamEggPoint: signIn.TotalTeamEggPoints,
  505. NowTotalRate: utils.Float64ToStr(nowTeamRate + nowBasalRate),
  506. }
  507. e.OutSuc(c, resp, nil)
  508. }
  509. // MyFans
  510. // @Summary 蛋蛋星球-添加好友-粉丝团队-我的粉丝-团队加速速率(获取)
  511. // @Tags 添加好友
  512. // @Description 团队加速速率(获取)
  513. // @Accept json
  514. // @Produce json
  515. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  516. // @Success 200 {object} md.MyFansResp "具体数据"
  517. // @Failure 400 {object} md.Response "具体错误"
  518. // @Router /api/v1/addFriend/myFans [GET]
  519. func MyFans(c *gin.Context) {
  520. val, exists := c.Get("user")
  521. if !exists {
  522. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  523. return
  524. }
  525. user, ok := val.(*model.User)
  526. if !ok {
  527. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  528. return
  529. }
  530. // 找出公排中所有关联用户
  531. userRelateDb := implement.NewUserRelateDb(db.Db)
  532. total, err := userRelateDb.UserRelatesCountByParentUid(user.Id, 0)
  533. if err != nil {
  534. e.OutErr(c, e.ERR_DB_ORM, err)
  535. return
  536. }
  537. session := db.Db.NewSession()
  538. defer session.Close()
  539. now := time.Now()
  540. assistanceDb := implement.NewEggEnergyTeamAssistanceDb(db.Db)
  541. assistance, err := assistanceDb.EggEnergyTeamAssistanceGetOneBySession(session, user.Id, now.Format("2006-01-02"))
  542. if err != nil {
  543. e.OutErr(c, e.ERR_DB_ORM, err)
  544. return
  545. }
  546. var nowTeamAssistanceNum int
  547. var nowTeamAssistanceReward string
  548. if assistance != nil {
  549. nowTeamAssistanceNum = assistance.AssistedNum
  550. nowTeamAssistanceReward = assistance.RewardScore
  551. }
  552. resp := md.MyFansResp{
  553. NowTeamUser: total,
  554. NowTeamAssistanceNum: nowTeamAssistanceNum,
  555. NowTeamAssistanceReward: nowTeamAssistanceReward,
  556. }
  557. e.OutSuc(c, resp, nil)
  558. return
  559. }
  560. // MyFansUserList
  561. // @Summary 蛋蛋星球-添加好友-粉丝团队-我的粉丝-在线好友列表(获取)
  562. // @Tags 添加好友
  563. // @Description 在线好友列表(获取)
  564. // @Accept json
  565. // @Produce json
  566. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  567. // @Success 200 {object} md.MyFansUserListResp "具体数据"
  568. // @Failure 400 {object} md.Response "具体错误"
  569. // @Router /api/v1/addFriend/myFansUserList [GET]
  570. func MyFansUserList(c *gin.Context) {
  571. page := c.DefaultQuery("page", "")
  572. limit := c.DefaultQuery("page_size", "20")
  573. now := time.Now()
  574. val, exists := c.Get("user")
  575. if !exists {
  576. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  577. return
  578. }
  579. user, ok := val.(*model.User)
  580. if !ok {
  581. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  582. return
  583. }
  584. energyBasicSettingDb := implement.NewEggEnergyBasicSettingDb(db.Db)
  585. eggEnergyBasicSetting, err := energyBasicSettingDb.EggEnergyBasicSettingGetOneByParams(map[string]interface{}{
  586. "key": "is_open",
  587. "value": 1,
  588. })
  589. if err != nil {
  590. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  591. return
  592. }
  593. var teamRewardSetting *md2.TeamRewardSettingStruct
  594. err = json.Unmarshal([]byte(eggEnergyBasicSetting.DirectPushReward), &teamRewardSetting)
  595. if err != nil {
  596. e.OutErr(c, e.ERR, err.Error())
  597. return
  598. }
  599. var oneRoundDuration = utils.StrToInt(teamRewardSetting.OneRoundDuration)
  600. startTime := now.Add(-time.Hour * time.Duration(oneRoundDuration)).Format("2006-01-02 15:04:05")
  601. relateDb := implement.NewUserRelateDb(db.Db)
  602. userRelates, err := relateDb.FindUserRelateByParentUid(user.Id, 1)
  603. if err != nil {
  604. e.OutErr(c, e.ERR, err.Error())
  605. return
  606. }
  607. var userRelatesUids []string
  608. var userSignInMap = map[int64]interface{}{}
  609. var results []map[string]string
  610. if userRelates != nil {
  611. for _, userRelate := range *userRelates {
  612. userRelatesUids = append(userRelatesUids, utils.Int64ToStr(userRelate.Uid))
  613. }
  614. signInDb := implement.NewEggSignInDb(db.Db)
  615. eggSignIns, err1 := signInDb.EggSignInFindByTimeAndParams(startTime, "", 0, map[string]interface{}{
  616. "key": "uid",
  617. "value": userRelatesUids,
  618. })
  619. if err1 != nil {
  620. e.OutErr(c, e.ERR_DB_ORM, err1.Error())
  621. return
  622. }
  623. for _, eggSignIn := range eggSignIns {
  624. userSignInMap[eggSignIn.Uid] = *eggSignIn
  625. }
  626. var sql string
  627. sql = "SELECT user.id AS uid, user.avatar AS avatar, user.nickname AS nickname, user_relate.invite_time AS invite_time " +
  628. "FROM `user_relate` " +
  629. "LEFT JOIN `user` ON user_relate.uid = user.uid " +
  630. "where user_relate.uid IN(%s)"
  631. sql += " ORDER BY user_relate.invite_time DESC LIMIT %d, %d;"
  632. sql = fmt.Sprintf(sql, strings.Join(userRelatesUids, ","), (utils.StrToInt64(page)-1)*utils.StrToInt64(limit), utils.StrToInt64(limit))
  633. results, err = db.QueryNativeString(db.Db, sql)
  634. if err != nil {
  635. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  636. return
  637. }
  638. }
  639. var data []md.OneLineUserNode
  640. for _, v := range results {
  641. isOnline := false
  642. if userSignInMap[utils.AnyToInt64(v["uid"])] != nil {
  643. isOnline = true
  644. }
  645. data = append(data, md.OneLineUserNode{
  646. IsOnline: isOnline,
  647. AvatarURL: v["avatar_url"],
  648. Nickname: v["nickname"],
  649. InviteTime: v["invite_time"],
  650. })
  651. }
  652. resp := md.MyFansUserListResp{
  653. List: data,
  654. }
  655. e.OutSuc(c, resp, nil)
  656. return
  657. }
  658. // NineDimensionalSpace
  659. // @Summary 蛋蛋星球-添加好友-粉丝团队-九维空间(获取)
  660. // @Tags 添加好友
  661. // @Description 九维空间(获取)
  662. // @Accept json
  663. // @Produce json
  664. // @param Authorization header string true "验证参数Bearer和token空格拼接"
  665. // @Success 200 {object} md.NineDimensionalSpaceResp "具体数据"
  666. // @Failure 400 {object} md.Response "具体错误"
  667. // @Router /api/v1/addFriend/nineDimensionalSpace [GET]
  668. func NineDimensionalSpace(c *gin.Context) {
  669. //1、 查找 `one_circles_public_platoon_basic_setting` 基础设置
  670. settingDb := implement.NewPublicPlatoonBasicSettingDb(db.Db)
  671. setting, err := settingDb.PublicPlatoonBasicSettingGetOneByParams(map[string]interface{}{
  672. "key": "is_open",
  673. "value": 1,
  674. })
  675. if err != nil {
  676. e.OutErr(c, e.ERR_DB_ORM, err.Error())
  677. return
  678. }
  679. if setting == nil {
  680. e.OutErr(c, e.ERR_NO_DATA, nil)
  681. return
  682. }
  683. val, exists := c.Get("user")
  684. if !exists {
  685. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  686. return
  687. }
  688. user, ok := val.(*model.User)
  689. if !ok {
  690. e.OutErr(c, e.ERR_USER_CHECK_ERR, nil)
  691. return
  692. }
  693. uid := user.Id
  694. var list []md.SpaceListNode
  695. for i := 1; i <= setting.SeveralRows; i++ {
  696. var tmpSql = fmt.Sprintf("SELECT COUNT(*)AS total FROM `public_platoon_user_relation` WHERE father_uid%d = %d", i, uid)
  697. tmpNativeString, _ := db.QueryNativeString(db.Db, tmpSql)
  698. nowUserCount := utils.StrToInt64(tmpNativeString[0]["total"])
  699. maxCount := math.Pow(float64(setting.SeveralTimes), float64(i))
  700. if nowUserCount > int64(maxCount) {
  701. nowUserCount = int64(maxCount)
  702. }
  703. list = append(list, md.SpaceListNode{
  704. Name: utils.IntToStr(i) + "维",
  705. MaxCount: utils.Float64ToStr(maxCount),
  706. NowCount: utils.Int64ToStr(nowUserCount),
  707. })
  708. }
  709. //2、统计当前用户下多少人数
  710. sql := fmt.Sprintf("SELECT COUNT(*)AS total FROM `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 OR father_uid9= %d", uid, uid, uid, uid, uid, uid, uid, uid, uid)
  711. nativeString1, _ := db.QueryNativeString(db.Db, sql)
  712. hasUserCount := utils.StrToInt64(nativeString1[0]["total"])
  713. resp := md.NineDimensionalSpaceResp{
  714. SpaceTotalNums: "29523",
  715. SpaceNums: utils.Int64ToStr(hasUserCount),
  716. SpaceList: list,
  717. ALotOfNums: "29523",
  718. }
  719. e.OutSuc(c, resp, nil)
  720. return
  721. }