order.go 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492
  1. package service
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "gadmin/config"
  7. "gadmin/internal/admin/consts"
  8. "gadmin/internal/admin/data"
  9. "gadmin/internal/admin/forms"
  10. "gadmin/internal/gorm/model"
  11. "gadmin/internal/gorm/query"
  12. "gadmin/package/gmdata"
  13. "gadmin/utility"
  14. "gadmin/utility/player"
  15. "gadmin/utility/serializer"
  16. "github.com/gin-gonic/gin"
  17. "github.com/jinzhu/now"
  18. "github.com/sirupsen/logrus"
  19. "github.com/xuri/excelize/v2"
  20. "math"
  21. "sync"
  22. "time"
  23. )
  24. var Order = new(sOrder)
  25. type sOrder struct{}
  26. func (s *sOrder) List(ctx *gin.Context, req forms.OrderListReq) serializer.Response {
  27. type OrderLstModel struct {
  28. model.Order
  29. NickName string `json:"nickName"`
  30. PayAtFormat string `json:"pay_at"` // 支付时间
  31. CreatedAtFormat string `json:"created_at"` // 创建时间
  32. }
  33. var (
  34. c = query.Use(config.DB).PlayerChannel
  35. o = query.Use(config.DB).Order
  36. m = o.WithContext(ctx)
  37. m2 = o.WithContext(ctx).Where(o.Status.Eq(consts.OrderStatusSuccess))
  38. offset int64 = 0
  39. models forms.OrderListRes
  40. lists []OrderLstModel
  41. )
  42. if len(req.Time) == 2 {
  43. m = m.Where(o.CreatedAt.Between(req.Time[0], req.Time[1]))
  44. m2 = m2.Where(o.CreatedAt.Between(req.Time[0], req.Time[1]))
  45. }
  46. if req.Platform > 0 {
  47. m = m.Where(o.Platform.Eq(req.Platform))
  48. m2 = m2.Where(o.Platform.Eq(req.Platform))
  49. }
  50. if req.PlayerID > 0 {
  51. m = m.Where(o.PlayerID.Eq(int64(req.PlayerID)))
  52. m2 = m2.Where(o.PlayerID.Eq(int64(req.PlayerID)))
  53. }
  54. if req.GoodsID > 0 {
  55. m = m.Where(o.GoodsID.Eq(req.GoodsID))
  56. m2 = m2.Where(o.GoodsID.Eq(req.GoodsID))
  57. }
  58. if req.Status > 0 {
  59. m = m.Where(o.Status.Eq(req.Status))
  60. m2 = m2.Where(o.Status.Eq(req.Status))
  61. }
  62. if req.ServerId > 0 {
  63. m = m.Where(o.ServerID.Eq(req.ServerId))
  64. m2 = m2.Where(o.ServerID.Eq(req.ServerId))
  65. }
  66. if req.Flag > -1 {
  67. m = m.Where(o.Flag.Eq(req.Flag))
  68. m2 = m2.Where(o.Flag.Eq(req.Flag))
  69. }
  70. if req.OrderSn != "" {
  71. m = m.Where(o.OrderSn.Like("%" + req.OrderSn + "%"))
  72. m2 = m2.Where(o.OrderSn.Like("%" + req.OrderSn + "%"))
  73. }
  74. if req.OutTradeNo != "" {
  75. m = m.Where(o.OutTradeNo.Like("%" + req.OutTradeNo + "%"))
  76. m2 = m2.Where(o.OutTradeNo.Like("%" + req.OutTradeNo + "%"))
  77. }
  78. switch req.ChannelId {
  79. case consts.ChannelIdNone:
  80. // 不选择渠道
  81. case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  82. // 所有的广告渠道
  83. m = m.Where(o.Columns(o.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))))
  84. m2 = m2.Where(o.Columns(o.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))))
  85. default:
  86. // 指定渠道
  87. m = m.Where(o.Columns(o.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId))))
  88. m2 = m2.Where(o.Columns(o.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId))))
  89. }
  90. m = m.Order(o.CreatedAt.Desc())
  91. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  92. count, err := m.Count()
  93. if err != nil {
  94. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  95. }
  96. // 导出
  97. if req.IsExport == 1 {
  98. if err = m.Scan(&lists); err != nil {
  99. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  100. }
  101. f := excelize.NewFile()
  102. sheetNum := 500
  103. pageCount := int(math.Ceil(float64(len(lists)) / float64(sheetNum)))
  104. wg := sync.WaitGroup{}
  105. wg.Add(pageCount)
  106. for i := 1; i <= pageCount; i++ {
  107. sheetName := fmt.Sprintf("Sheet%d", i)
  108. subList := make([]OrderLstModel, 0)
  109. if i == pageCount {
  110. subList = lists[(i-1)*sheetNum:]
  111. } else {
  112. subList = lists[(i-1)*sheetNum : i*sheetNum]
  113. }
  114. f.NewSheet(sheetName)
  115. f.SetColWidth(sheetName, "A", "A", 15)
  116. f.SetColWidth(sheetName, "B", "B", 15)
  117. f.SetColWidth(sheetName, "C", "C", 15)
  118. f.SetColWidth(sheetName, "D", "D", 25)
  119. f.SetColWidth(sheetName, "E", "E", 25)
  120. f.SetColWidth(sheetName, "F", "F", 30)
  121. f.SetColWidth(sheetName, "G", "G", 30)
  122. f.SetColWidth(sheetName, "H", "H", 15)
  123. f.SetColWidth(sheetName, "I", "I", 15)
  124. f.SetColWidth(sheetName, "J", "J", 25)
  125. f.SetColWidth(sheetName, "K", "K", 25)
  126. // 创建一个工作表
  127. f.SetCellValue(sheetName, "A1", "序号")
  128. f.SetCellValue(sheetName, "B1", "下单渠道")
  129. f.SetCellValue(sheetName, "C1", "玩家ID")
  130. f.SetCellValue(sheetName, "D1", "玩家昵称")
  131. f.SetCellValue(sheetName, "E1", "购买商品")
  132. f.SetCellValue(sheetName, "F1", "订单号")
  133. f.SetCellValue(sheetName, "G1", "外部订单号")
  134. f.SetCellValue(sheetName, "H1", "支付金额(元)")
  135. f.SetCellValue(sheetName, "I1", "支付状态")
  136. f.SetCellValue(sheetName, "J1", "支付时间")
  137. f.SetCellValue(sheetName, "K1", "创建时间")
  138. go func(subList []OrderLstModel) {
  139. defer wg.Done()
  140. for i, v := range subList {
  141. f.SetCellValue(sheetName, fmt.Sprintf("A%d", i+2), v.ID)
  142. if v.Platform == consts.OrderPlatformAndroid {
  143. f.SetCellValue(sheetName, fmt.Sprintf("B%d", i+2), "安卓")
  144. } else {
  145. f.SetCellValue(sheetName, fmt.Sprintf("B%d", i+2), "苹果")
  146. }
  147. f.SetCellValue(sheetName, fmt.Sprintf("C%d", i+2), v.PlayerID)
  148. user := data.GetUserToSyncMap(v.PlayerID)
  149. nickName := ""
  150. if user != nil {
  151. nickName = user.NickName
  152. }
  153. f.SetCellValue(sheetName, fmt.Sprintf("D%d", i+2), nickName)
  154. f.SetCellValue(sheetName, fmt.Sprintf("E%d", i+2), gmdata.GetGoodLabel(v.GoodsID))
  155. f.SetCellValue(sheetName, fmt.Sprintf("F%d", i+2), v.OrderSn)
  156. f.SetCellValue(sheetName, fmt.Sprintf("G%d", i+2), v.OutTradeNo)
  157. f.SetCellValue(sheetName, fmt.Sprintf("H%d", i+2), utility.Round(v.Money))
  158. f.SetCellValue(sheetName, fmt.Sprintf("I%d", i+2), consts.GetOrderStatusTag(v.Status))
  159. payAtFormat, createdAtFormat := "", ""
  160. if v.PayAt.Unix() > consts.FormsMinInvalidTimestamp {
  161. payAtFormat = utility.FormatSecond(v.PayAt)
  162. }
  163. if v.CreatedAt.Unix() > consts.FormsMinInvalidTimestamp {
  164. createdAtFormat = utility.FormatSecond(v.CreatedAt)
  165. }
  166. f.SetCellValue(sheetName, fmt.Sprintf("J%d", i+2), payAtFormat)
  167. f.SetCellValue(sheetName, fmt.Sprintf("K%d", i+2), createdAtFormat)
  168. }
  169. }(subList)
  170. }
  171. wg.Wait()
  172. // 设置工作簿的默认工作表
  173. f.SetActiveSheet(0)
  174. ctx.Header("Content-Type", "application/vnd.ms-excel")
  175. ctx.Header("Content-Disposition", fmt.Sprintf("attachment;filename=订单记录导出%s.xlsx", time.Now().Format("20060102150405")))
  176. f.WriteTo(ctx.Writer)
  177. return serializer.Response{}
  178. }
  179. if count > 0 {
  180. // 列表展示
  181. if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
  182. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  183. }
  184. for k, _ := range lists {
  185. user := data.GetUser(int64(lists[k].PlayerID))
  186. if user != nil {
  187. lists[k].NickName = user.NickName
  188. }
  189. if lists[k].PayAt.Unix() > consts.FormsMinInvalidTimestamp {
  190. lists[k].PayAtFormat = utility.FormatSecond(lists[k].PayAt)
  191. }
  192. if lists[k].CreatedAt.Unix() > consts.FormsMinInvalidTimestamp {
  193. lists[k].CreatedAtFormat = utility.FormatSecond(lists[k].CreatedAt)
  194. }
  195. }
  196. // 在存在成功订单时,查询统计
  197. if req.Status <= consts.OrderStatusNo || req.Status == consts.OrderStatusSuccess {
  198. // 交易金额
  199. transactionMoney, err := m2.Select(o.Money.Sum().As("money")).First()
  200. if err != nil {
  201. return serializer.Err(consts.CodeParamErr, "查询出错 Money Sum", err)
  202. }
  203. models.TransactionMoney = transactionMoney.Money
  204. // 已支付订单数量
  205. if models.SuccessfulOrder, err = m2.Count(); err != nil {
  206. return serializer.Err(consts.CodeParamErr, "查询出错 order Count", err)
  207. }
  208. }
  209. }
  210. models.List = lists
  211. models.Page = req.Page
  212. models.PerPage = req.PerPage
  213. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  214. return serializer.Suc(models)
  215. }
  216. // SevenStatisticsList 七日付费统计
  217. func (s *sOrder) SevenStatisticsList(ctx *gin.Context, req forms.OrderSevenStatisticsListReq) serializer.Response {
  218. type Result struct {
  219. Date string `json:"date"`
  220. C1 int64 `json:"c1"`
  221. M1 float64 `json:"m1"`
  222. C2 int64 `json:"c2"`
  223. M2 float64 `json:"m2"`
  224. C3 int64 `json:"c3"`
  225. M3 float64 `json:"m3"`
  226. C4 int64 `json:"c4"`
  227. M4 float64 `json:"m4"`
  228. C5 int64 `json:"c5"`
  229. M5 float64 `json:"m5"`
  230. C6 int64 `json:"c6"`
  231. M6 float64 `json:"m6"`
  232. C7 int64 `json:"c7"`
  233. M7 float64 `json:"m7"`
  234. U7 int64 `json:"u7"`
  235. C30 int64 `json:"c30"`
  236. M30 float64 `json:"m30"`
  237. }
  238. var (
  239. q = query.Use(config.DB).Order
  240. m = q.WithContext(ctx).Where(q.Status.Eq(consts.OrderStatusSuccess))
  241. offset int64 = 0
  242. models forms.UserAccountListRes
  243. lists []Result
  244. )
  245. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  246. if len(req.Time) == 2 {
  247. m = m.Where(q.CreatedAt.Between(req.Time[0], req.Time[1]))
  248. }
  249. if req.ServerId > 0 {
  250. m = m.Where(q.ServerID.Eq(req.ServerId))
  251. }
  252. if req.Flag > -1 {
  253. m = m.Where(q.Flag.Eq(req.Flag))
  254. }
  255. switch req.ChannelId {
  256. case consts.ChannelIdNone:
  257. // 不选择渠道
  258. case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  259. // 所有的广告渠道
  260. m = m.Where(q.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))
  261. default:
  262. // 指定渠道
  263. m = m.Where(q.ChannelID.Eq(req.ChannelId))
  264. }
  265. m = m.Select(q.Date).Order(q.Date.Desc()).Group(q.Date)
  266. count, err := m.Count()
  267. if err != nil {
  268. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  269. }
  270. if count > 0 {
  271. if req.IsExport == 1 {
  272. if err = m.Scan(&lists); err != nil {
  273. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  274. }
  275. } else {
  276. if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
  277. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  278. }
  279. }
  280. }
  281. stat := func(date time.Time, old time.Time) (count int64, total float64, err error) {
  282. o1 := now.With(old)
  283. b1, e1 := o1.BeginningOfDay().Unix(), o1.EndOfDay().Unix() // 当日起始时间戳
  284. qw := q.WithContext(ctx).Where(q.UserCreatedAt.Gte(int32(b1)), q.UserCreatedAt.Lte(int32(e1)))
  285. switch req.ChannelId {
  286. case consts.ChannelIdNone:
  287. // 不选择渠道
  288. case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  289. // 所有的广告渠道
  290. qw = qw.Where(q.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))
  291. default:
  292. // 指定渠道
  293. qw = qw.Where(q.ChannelID.Eq(req.ChannelId))
  294. }
  295. if req.Platform > 0 {
  296. qw = qw.Where(q.Platform.Eq(req.Platform))
  297. }
  298. if req.ServerId > 0 {
  299. qw = qw.Where(q.ServerID.Eq(req.ServerId))
  300. }
  301. if req.Flag > -1 {
  302. qw = qw.Where(q.Flag.Eq(req.Flag))
  303. }
  304. var counter forms.CounterF
  305. err = qw.Select(q.Money.Sum().As("total")).
  306. Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(date.Format("2006-01-02"))).Scan(&counter)
  307. if err != nil {
  308. return
  309. }
  310. total = counter.Total
  311. count, err = qw.Distinct(q.PlayerID).Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(date.Format("2006-01-02"))).Count()
  312. if err != nil {
  313. return
  314. }
  315. return
  316. }
  317. stat2 := func(date time.Time, old time.Time) (count int64, total float64, err error) {
  318. o1 := now.With(old)
  319. b1, e1 := o1.BeginningOfDay().Unix(), o1.EndOfDay().Unix() // 当日起始时间戳
  320. qw := q.WithContext(ctx).Where(q.UserCreatedAt.Gte(int32(b1)), q.UserCreatedAt.Lte(int32(e1)))
  321. switch req.ChannelId {
  322. case consts.ChannelIdNone:
  323. // 不选择渠道
  324. case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  325. // 所有的广告渠道
  326. qw = qw.Where(q.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))
  327. default:
  328. // 指定渠道
  329. qw = qw.Where(q.ChannelID.Eq(req.ChannelId))
  330. }
  331. if req.Platform > 0 {
  332. qw = qw.Where(q.Platform.Eq(req.Platform))
  333. }
  334. if req.ServerId > 0 {
  335. qw = qw.Where(q.ServerID.Eq(req.ServerId))
  336. }
  337. if req.Flag > -1 {
  338. qw = qw.Where(q.Flag.Eq(req.Flag))
  339. }
  340. var counter forms.CounterF
  341. err = qw.Select(q.Money.Sum().As("total")).
  342. Where(q.Status.Eq(consts.OrderStateSuccess),
  343. q.Date.Between(
  344. old.Format("2006-01-02"),
  345. date.Format("2006-01-02"),
  346. ),
  347. ).
  348. Scan(&counter)
  349. if err != nil {
  350. return
  351. }
  352. total = counter.Total
  353. count, err = qw.Distinct(q.PlayerID).Where(q.Status.Eq(consts.OrderStateSuccess),
  354. q.Date.Between(
  355. old.Format("2006-01-02"),
  356. date.Format("2006-01-02"),
  357. ),
  358. ).Count()
  359. if err != nil {
  360. return
  361. }
  362. return
  363. }
  364. if len(lists) > 0 {
  365. for k, _ := range lists {
  366. date, _ := now.ParseInLocation(time.Local, lists[k].Date)
  367. lists[k].Date = date.Format("2006-01-02")
  368. c1, m1, err := stat(date.AddDate(0, 0, 0), date)
  369. if err != nil {
  370. return serializer.Err(consts.CodeParamErr, "查询出错 stat1", err)
  371. }
  372. c2, m2, err := stat(date.AddDate(0, 0, 1), date)
  373. if err != nil {
  374. return serializer.Err(consts.CodeParamErr, "查询出错 stat2", err)
  375. }
  376. c3, m3, err := stat(date.AddDate(0, 0, 2), date)
  377. if err != nil {
  378. return serializer.Err(consts.CodeParamErr, "查询出错 stat3", err)
  379. }
  380. c4, m4, err := stat(date.AddDate(0, 0, 3), date)
  381. if err != nil {
  382. return serializer.Err(consts.CodeParamErr, "查询出错 stat4", err)
  383. }
  384. c5, m5, err := stat(date.AddDate(0, 0, 4), date)
  385. if err != nil {
  386. return serializer.Err(consts.CodeParamErr, "查询出错 stat5", err)
  387. }
  388. c6, m6, err := stat(date.AddDate(0, 0, 5), date)
  389. if err != nil {
  390. return serializer.Err(consts.CodeParamErr, "查询出错 stat6", err)
  391. }
  392. c7, m7, err := stat(date.AddDate(0, 0, 6), date)
  393. if err != nil {
  394. return serializer.Err(consts.CodeParamErr, "查询出错 stat7", err)
  395. }
  396. c30, m30, err := stat2(date.AddDate(0, 0, 29), date)
  397. if err != nil {
  398. return serializer.Err(consts.CodeParamErr, "查询出错 stat30", err)
  399. }
  400. lists[k].C1 = c1
  401. lists[k].M1 = m1
  402. lists[k].C2 = c2
  403. lists[k].M2 = m2
  404. lists[k].C3 = c3
  405. lists[k].M3 = m3
  406. lists[k].C4 = c4
  407. lists[k].M4 = m4
  408. lists[k].C5 = c5
  409. lists[k].M5 = m5
  410. lists[k].C6 = c6
  411. lists[k].M6 = m6
  412. lists[k].C7 = c7
  413. lists[k].M7 = m7
  414. lists[k].C30 = c30
  415. lists[k].M30 = m30
  416. // 7日唯一人数
  417. d1 := now.With(date)
  418. b1, e1 := d1.BeginningOfDay().Unix(), d1.EndOfDay().Unix() // 当日起始时间戳
  419. qw := q.WithContext(ctx).Where(q.UserCreatedAt.Gte(int32(b1)), q.UserCreatedAt.Lte(int32(e1)))
  420. switch req.ChannelId {
  421. case consts.ChannelIdNone:
  422. // 不选择渠道
  423. case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  424. // 所有的广告渠道
  425. qw = qw.Where(q.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))
  426. default:
  427. // 指定渠道
  428. qw = qw.Where(q.ChannelID.Eq(req.ChannelId))
  429. }
  430. if req.Platform > 0 {
  431. qw = qw.Where(q.Platform.Eq(req.Platform))
  432. }
  433. if req.ServerId > 0 {
  434. qw = qw.Where(q.ServerID.Eq(req.ServerId))
  435. }
  436. if req.Flag > -1 {
  437. qw = qw.Where(q.Flag.Eq(req.Flag))
  438. }
  439. u7, err := qw.Distinct(q.PlayerID).Where(
  440. q.Status.Eq(consts.OrderStateSuccess),
  441. q.Date.Between(date.Format("2006-01-02"), date.AddDate(0, 0, 6).Format("2006-01-02"))).
  442. Count()
  443. if err != nil {
  444. return serializer.Err(consts.CodeParamErr, "查询出错 Count", err)
  445. }
  446. lists[k].U7 = u7
  447. }
  448. }
  449. // 导出
  450. if req.IsExport == 1 {
  451. f := excelize.NewFile()
  452. f.SetColWidth("Sheet1", "A", "A", 15)
  453. f.SetColWidth("Sheet1", "B", "B", 20)
  454. f.SetColWidth("Sheet1", "C", "C", 20)
  455. f.SetColWidth("Sheet1", "D", "D", 20)
  456. f.SetColWidth("Sheet1", "E", "E", 20)
  457. f.SetColWidth("Sheet1", "F", "F", 20)
  458. f.SetColWidth("Sheet1", "G", "G", 20)
  459. f.SetColWidth("Sheet1", "H", "H", 20)
  460. f.SetColWidth("Sheet1", "I", "I", 20)
  461. f.SetColWidth("Sheet1", "J", "J", 20)
  462. f.SetColWidth("Sheet1", "K", "K", 20)
  463. f.SetColWidth("Sheet1", "L", "L", 20)
  464. f.SetColWidth("Sheet1", "M", "M", 20)
  465. f.SetColWidth("Sheet1", "N", "N", 20)
  466. f.SetColWidth("Sheet1", "O", "O", 20)
  467. f.SetColWidth("Sheet1", "P", "P", 15)
  468. f.SetColWidth("Sheet1", "Q", "Q", 15)
  469. f.SetColWidth("Sheet1", "R", "R", 15)
  470. // 创建一个工作表
  471. f.SetCellValue("Sheet1", "A1", "日期")
  472. f.SetCellValue("Sheet1", "B1", "当天注册付费人数")
  473. f.SetCellValue("Sheet1", "C1", "当天付费金额(元)")
  474. f.SetCellValue("Sheet1", "D1", "第2日注册付费人数")
  475. f.SetCellValue("Sheet1", "E1", "第2日付费金额(元)")
  476. f.SetCellValue("Sheet1", "F1", "第3日注册付费人数")
  477. f.SetCellValue("Sheet1", "G1", "第3日付费金额(元)")
  478. f.SetCellValue("Sheet1", "H1", "第4日注册付费人数")
  479. f.SetCellValue("Sheet1", "I1", "第4日付费金额(元)")
  480. f.SetCellValue("Sheet1", "J1", "第5日注册付费人数")
  481. f.SetCellValue("Sheet1", "K1", "第5日付费金额(元)")
  482. f.SetCellValue("Sheet1", "L1", "第6日注册付费人数")
  483. f.SetCellValue("Sheet1", "M1", "第6日付费金额(元)")
  484. f.SetCellValue("Sheet1", "N1", "第7日注册付费人数")
  485. f.SetCellValue("Sheet1", "O1", "第7日付费金额(元)")
  486. f.SetCellValue("Sheet1", "P1", "7日内人数")
  487. f.SetCellValue("Sheet1", "Q1", "30日内人数")
  488. f.SetCellValue("Sheet1", "R1", "30日内金额(元)")
  489. for i, v := range lists {
  490. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", i+2), v.Date)
  491. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), v.C1)
  492. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), v.M1)
  493. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", i+2), v.C2)
  494. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", i+2), v.M2)
  495. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", i+2), v.C3)
  496. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", i+2), v.M3)
  497. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", i+2), v.C4)
  498. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", i+2), v.M4)
  499. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", i+2), v.C5)
  500. f.SetCellValue("Sheet1", fmt.Sprintf("K%d", i+2), v.M5)
  501. f.SetCellValue("Sheet1", fmt.Sprintf("L%d", i+2), v.C6)
  502. f.SetCellValue("Sheet1", fmt.Sprintf("M%d", i+2), v.M6)
  503. f.SetCellValue("Sheet1", fmt.Sprintf("N%d", i+2), v.C7)
  504. f.SetCellValue("Sheet1", fmt.Sprintf("O%d", i+2), v.M7)
  505. f.SetCellValue("Sheet1", fmt.Sprintf("P%d", i+2), v.U7)
  506. f.SetCellValue("Sheet1", fmt.Sprintf("Q%d", i+2), v.C30)
  507. f.SetCellValue("Sheet1", fmt.Sprintf("R%d", i+2), v.M30)
  508. }
  509. // 设置工作簿的默认工作表
  510. f.SetActiveSheet(1)
  511. ctx.Header("Content-Type", "application/vnd.ms-excel")
  512. ctx.Header("Content-Disposition", fmt.Sprintf("attachment;filename=新注册玩家付费统计导出%s.xlsx", time.Now().Format("20060102150405")))
  513. f.WriteTo(ctx.Writer)
  514. return serializer.Response{}
  515. }
  516. models.List = lists
  517. models.Page = req.Page
  518. models.PerPage = req.PerPage
  519. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  520. return serializer.Suc(models)
  521. }
  522. func (s *sOrder) DailyStatisticsList(ctx *gin.Context, req forms.OrderDailyStatisticsListReq) serializer.Response {
  523. type Result struct {
  524. Date string `json:"date"`
  525. TotalRecharge float64 `json:"totalRecharge"`
  526. IosRecharge float64 `json:"iosRecharge"`
  527. AndroidRecharge float64 `json:"androidRecharge"`
  528. Players int `json:"players"`
  529. ARPU string `json:"arpu"`
  530. NewPlayers int64 `json:"newPlayers"`
  531. NewTotalRecharge float64 `json:"newTotalRecharge"`
  532. NewARPU string `json:"newArpu"`
  533. }
  534. var (
  535. c = query.Use(config.DB).PlayerChannel
  536. q = query.Use(config.DB).Order
  537. m = q.WithContext(ctx).Where(q.Status.Eq(consts.OrderStatusSuccess))
  538. offset int64 = 0
  539. models forms.UserAccountListRes
  540. lists []Result
  541. )
  542. statNew := func(date time.Time, old time.Time) (count int64, total float64, err error) {
  543. o1 := now.With(old)
  544. b1, e1 := o1.BeginningOfDay().Unix(), o1.EndOfDay().Unix() // 当日起始时间戳
  545. qw := q.WithContext(ctx).Where(q.UserCreatedAt.Gte(int32(b1)), q.UserCreatedAt.Lte(int32(e1)))
  546. switch req.ChannelId {
  547. case consts.ChannelIdNone:
  548. // 不选择渠道
  549. case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  550. // 所有的广告渠道
  551. qw = qw.Where(q.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))
  552. default:
  553. // 指定渠道
  554. qw = qw.Where(q.ChannelID.Eq(req.ChannelId))
  555. }
  556. if req.ServerId > 0 {
  557. qw = qw.Where(q.ServerID.Eq(req.ServerId))
  558. }
  559. if req.Flag > -1 {
  560. qw = qw.Where(q.Flag.Eq(req.Flag))
  561. }
  562. var counter forms.CounterF
  563. err = qw.Select(q.Money.Sum().As("total")).
  564. Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(date.Format("2006-01-02"))).Scan(&counter)
  565. if err != nil {
  566. return
  567. }
  568. total = counter.Total
  569. count, err = qw.Distinct(q.PlayerID).Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(date.Format("2006-01-02"))).Group(q.PlayerID).Count()
  570. if err != nil {
  571. return
  572. }
  573. return
  574. }
  575. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  576. if len(req.Time) == 2 {
  577. m = m.Where(q.CreatedAt.Between(req.Time[0], req.Time[1]))
  578. }
  579. if req.ServerId > 0 {
  580. m = m.Where(q.ServerID.Eq(req.ServerId))
  581. }
  582. if req.Flag > -1 {
  583. m = m.Where(q.Flag.Eq(req.Flag))
  584. }
  585. switch req.ChannelId {
  586. case consts.ChannelIdNone:
  587. // 不选择渠道
  588. case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  589. // 所有的广告渠道
  590. m = m.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))))
  591. default:
  592. // 指定渠道
  593. m = m.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId))))
  594. }
  595. m = m.Select(q.Date).Order(q.Date.Desc()).Group(q.Date)
  596. count, err := m.Count()
  597. if err != nil {
  598. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  599. }
  600. if count > 0 {
  601. if req.IsExport == 1 {
  602. if err = m.Scan(&lists); err != nil {
  603. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  604. }
  605. } else {
  606. if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
  607. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  608. }
  609. }
  610. }
  611. if len(lists) > 0 {
  612. for k, _ := range lists {
  613. date, _ := now.ParseInLocation(time.Local, lists[k].Date)
  614. lists[k].Date = date.Format("2006-01-02")
  615. qw := q.WithContext(ctx)
  616. qw2 := q.WithContext(ctx)
  617. switch req.ChannelId {
  618. case consts.ChannelIdNone:
  619. // 不选择渠道
  620. case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  621. // 所有的广告渠道
  622. qw = qw.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))))
  623. qw2 = qw2.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...))))
  624. default:
  625. // 指定渠道
  626. qw = qw.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId))))
  627. qw2 = qw2.Where(q.Columns(q.PlayerID).In(c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId))))
  628. }
  629. if req.ServerId > 0 {
  630. qw = qw.Where(q.ServerID.Eq(req.ServerId))
  631. qw2 = qw2.Where(q.ServerID.Eq(req.ServerId))
  632. }
  633. if req.Flag > -1 {
  634. qw = qw.Where(q.Flag.Eq(req.Flag))
  635. qw2 = qw2.Where(q.Flag.Eq(req.Flag))
  636. }
  637. var counter forms.CounterF
  638. if err = qw.Select(q.Money.Sum().As("total")).Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(lists[k].Date)).Scan(&counter); err != nil {
  639. return serializer.Err(consts.CodeParamErr, "查询出错 Money Sum", err)
  640. }
  641. lists[k].TotalRecharge = counter.Total
  642. playerCount, err := qw.Distinct(q.PlayerID).Where(q.Status.Eq(consts.OrderStateSuccess), q.Date.Eq(lists[k].Date)).Count()
  643. if err != nil {
  644. return serializer.Response{}
  645. }
  646. lists[k].Players = int(playerCount)
  647. if playerCount == 0 {
  648. playerCount = 1
  649. }
  650. var iosCounter forms.CounterF
  651. if err = qw2.Select(q.Money.Sum().As("total")).Where(q.Status.Eq(consts.OrderStateSuccess), q.Platform.Eq(consts.OrderPlatformIos), q.Date.Eq(lists[k].Date)).Scan(&iosCounter); err != nil {
  652. return serializer.Err(consts.CodeParamErr, "查询出错 OrderPlatformIos Sum", err)
  653. }
  654. lists[k].IosRecharge = iosCounter.Total
  655. lists[k].AndroidRecharge = counter.Total - iosCounter.Total
  656. lists[k].ARPU = utility.Round(lists[k].TotalRecharge / float64(playerCount))
  657. // 统计新增
  658. lists[k].NewPlayers, lists[k].NewTotalRecharge, err = statNew(date, date)
  659. if err != nil {
  660. return serializer.Err(consts.CodeParamErr, "查询出错 statNew ", err)
  661. }
  662. if lists[k].NewTotalRecharge > 0 && lists[k].NewPlayers > 0 {
  663. lists[k].NewARPU = utility.Round(lists[k].NewTotalRecharge / float64(lists[k].NewPlayers))
  664. }
  665. }
  666. }
  667. // 导出
  668. if req.IsExport == 1 {
  669. //if err = m.Scan(&lists); err != nil {
  670. // return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  671. //}
  672. f := excelize.NewFile()
  673. f.SetColWidth("Sheet1", "A", "A", 15)
  674. f.SetColWidth("Sheet1", "B", "B", 20)
  675. f.SetColWidth("Sheet1", "C", "C", 20)
  676. f.SetColWidth("Sheet1", "D", "D", 20)
  677. f.SetColWidth("Sheet1", "E", "E", 20)
  678. f.SetColWidth("Sheet1", "F", "F", 20)
  679. f.SetColWidth("Sheet1", "G", "G", 20)
  680. f.SetColWidth("Sheet1", "H", "H", 20)
  681. f.SetColWidth("Sheet1", "I", "I", 20)
  682. // 创建一个工作表
  683. f.SetCellValue("Sheet1", "A1", "日期")
  684. f.SetCellValue("Sheet1", "B1", "总充值")
  685. f.SetCellValue("Sheet1", "C1", "安卓充值")
  686. f.SetCellValue("Sheet1", "D1", "苹果充值")
  687. f.SetCellValue("Sheet1", "E1", "付费人数")
  688. f.SetCellValue("Sheet1", "F1", "ARPU")
  689. f.SetCellValue("Sheet1", "G1", "日新增充值")
  690. f.SetCellValue("Sheet1", "H1", "日新增人数")
  691. f.SetCellValue("Sheet1", "I1", "日新增ARPU")
  692. for i, v := range lists {
  693. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", i+2), v.Date)
  694. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), v.TotalRecharge)
  695. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), v.AndroidRecharge)
  696. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", i+2), v.IosRecharge)
  697. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", i+2), v.Players)
  698. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", i+2), v.ARPU)
  699. f.SetCellValue("Sheet1", fmt.Sprintf("G%d", i+2), v.NewTotalRecharge)
  700. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", i+2), v.NewPlayers)
  701. f.SetCellValue("Sheet1", fmt.Sprintf("I%d", i+2), v.NewARPU)
  702. }
  703. // 设置工作簿的默认工作表
  704. f.SetActiveSheet(1)
  705. ctx.Header("Content-Type", "application/vnd.ms-excel")
  706. ctx.Header("Content-Disposition", fmt.Sprintf("attachment;filename=每日订单统计导出%s.xlsx", time.Now().Format("20060102150405")))
  707. f.WriteTo(ctx.Writer)
  708. return serializer.Response{}
  709. }
  710. models.List = lists
  711. models.Page = req.Page
  712. models.PerPage = req.PerPage
  713. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  714. return serializer.Suc(models)
  715. }
  716. func (s *sOrder) RechargeRankingIOS(ctx *gin.Context, req forms.RechargeRankingReq) serializer.Response {
  717. var (
  718. sql = "SELECT `playerid`,sum(total) as t FROM `wxpay_iosorder` WHERE `state` = 1 and total > 0 GROUP BY `playerid` ORDER BY t DESC LIMIT 100"
  719. models forms.ListRes
  720. )
  721. type Result struct {
  722. ID int64 `json:"id"`
  723. Playerid int64 `json:"playerid"`
  724. T int64 `json:"total"`
  725. NickName string `json:"nickName"`
  726. }
  727. var result []Result
  728. if len(req.Time) == 2 {
  729. sql = fmt.Sprintf("SELECT `playerid`,sum(total) as t "+
  730. "FROM `wxpay_iosorder` "+
  731. "WHERE `state` = 1 and total > 0 and `create_time` BETWEEN '%v' AND '%v' GROUP BY `playerid` ORDER BY t DESC LIMIT 100", req.Time[0], req.Time[1])
  732. }
  733. config.GDB1.Raw(sql).Scan(&result)
  734. for i := 0; i < len(result); i++ {
  735. result[i].ID = int64(i + 1)
  736. result[i].T = result[i].T / 100
  737. user := data.GetUser(result[i].Playerid)
  738. if user != nil {
  739. result[i].NickName = user.NickName
  740. }
  741. }
  742. // 计算分页
  743. req.Page, req.PerPage, _ = forms.CalculatePage(req.Page, req.PerPage)
  744. models.List = result
  745. models.Page = req.Page
  746. models.PerPage = req.PerPage
  747. models.PageCount = 1 //(int64(len(result)) + req.PerPage - 1) / req.PerPage
  748. return serializer.Suc(models)
  749. }
  750. func (s *sOrder) RechargeRankingAndroid(ctx *gin.Context, req forms.RechargeRankingReq) serializer.Response {
  751. var (
  752. sql = " SELECT `wxpay_order`.`playerid`,sum((`virtualpayorder`.`balance`-`virtualpayorder`.`payedBalance`)) as t FROM `wxpay_order` LEFT JOIN `virtualpayorder` AS `virtualpayorder` ON `wxpay_order`.`orderId` = `virtualpayorder`.`billNo` WHERE `wxpay_order`.`state` = 1 and (`virtualpayorder`.`balance`-`virtualpayorder`.`payedBalance`) > 0 GROUP BY `wxpay_order`.`playerid` ORDER BY t DESC LIMIT 100"
  753. models forms.ListRes
  754. )
  755. type Result struct {
  756. ID int64 `json:"id"`
  757. Playerid int64 `json:"playerid"`
  758. T int64 `json:"total"`
  759. NickName string `json:"nickName"`
  760. }
  761. var result []Result
  762. if len(req.Time) == 2 {
  763. sql = fmt.Sprintf("SELECT `wxpay_order`.`playerid`,sum((`virtualpayorder`.`balance`-`virtualpayorder`.`payedBalance`)) as t "+
  764. "FROM `wxpay_order` LEFT JOIN `virtualpayorder` AS `virtualpayorder` ON `wxpay_order`.`orderId` = `virtualpayorder`.`billNo` "+
  765. "WHERE `wxpay_order`.`state` = 1 and (`virtualpayorder`.`balance`-`virtualpayorder`.`payedBalance`) > 0 "+
  766. "and `wxpay_order`.`create_time` BETWEEN '%v' AND '%v' "+
  767. "GROUP BY `wxpay_order`.`playerid` ORDER BY t DESC LIMIT 100", req.Time[0], req.Time[1])
  768. }
  769. config.GDB1.Raw(sql).Scan(&result)
  770. for i := 0; i < len(result); i++ {
  771. result[i].ID = int64(i + 1)
  772. result[i].T = result[i].T / 100
  773. user := data.GetUser(result[i].Playerid)
  774. if user != nil {
  775. result[i].NickName = user.NickName
  776. }
  777. }
  778. req.Page, req.PerPage, _ = forms.CalculatePage(req.Page, req.PerPage)
  779. models.List = result
  780. models.Page = req.Page
  781. models.PerPage = req.PerPage
  782. models.PageCount = 1
  783. return serializer.Suc(models)
  784. }
  785. func (s *sOrder) RechargeRanking(ctx *gin.Context, req forms.RechargeRankingReq) serializer.Response {
  786. type RankingModels struct {
  787. Ranking int32 `json:"ranking"`
  788. Total float64 `json:"total"`
  789. PlayerID int64 `json:"player_id"`
  790. NickName string `json:"nickName"`
  791. Platform int32 `json:"platform"`
  792. LastLogin string `json:"lastLogin"`
  793. LastLoginValue int64 `json:"lastLoginValue"`
  794. LastLoginTag string `json:"lastLoginTag"`
  795. LastRecharge string `json:"lastRecharge"`
  796. LastRechargeValue int64 `json:"lastRechargeValue"`
  797. LastRechargeTag string `json:"lastRechargeTag"`
  798. Diamond int32 `json:"diamond"`
  799. Level int32 `json:"level"`
  800. MaxPass string `json:"maxPass"`
  801. MaxPassValue int32 `json:"maxPassValue"`
  802. }
  803. var (
  804. models forms.ListRes
  805. offset int64 = 0
  806. list []RankingModels
  807. count int64 = 0
  808. err error
  809. )
  810. formatTime := func(t int64) (string, string) {
  811. n := time.Now().Unix()
  812. var ys int64 = 31536000
  813. var ds int64 = 86400
  814. var hs int64 = 3600
  815. var ms int64 = 60
  816. var ss int64 = 1
  817. var rs string
  818. var tag = "success"
  819. d := n - t
  820. switch {
  821. case d > ys:
  822. tag = "error"
  823. rs = fmt.Sprintf("%d年前", int(d/ys))
  824. case d > ds:
  825. if int(d/ds) > 6 {
  826. tag = "warning"
  827. } else {
  828. tag = "info"
  829. }
  830. rs = fmt.Sprintf("%d天前", int(d/ds))
  831. case d > hs:
  832. rs = fmt.Sprintf("%d小时前", int(d/hs))
  833. case d > ms:
  834. rs = fmt.Sprintf("%d分钟前", int(d/ms))
  835. case d > ss:
  836. rs = fmt.Sprintf("%d秒前", int(d/ss))
  837. default:
  838. rs = "刚刚"
  839. }
  840. return rs, tag
  841. }
  842. getPlayerMaterial := func(playerId int64) (diamond int32, maxPassName string, maxPassValue int32, err error) {
  843. type Pass struct {
  844. Id int `json:"id"`
  845. Count int `json:"count"`
  846. Difficulty int `json:"difficulty"`
  847. Pass bool `json:"pass"`
  848. IsActivity bool `json:"isActivity"`
  849. }
  850. DB, err := player.GetDBByUserId(int64(playerId))
  851. if err != nil {
  852. return 0, "", 0, err
  853. }
  854. var (
  855. models1 *model.PlayerMaterial
  856. q = query.Use(config.GDBGroup[DB]).PlayerMaterial
  857. m = q.WithContext(ctx).Select(q.Diamond, q.PassRoom).Where(q.Playerid.Eq(int64(playerId)))
  858. pass []*Pass
  859. maxPass int
  860. )
  861. if err = m.Scan(&models1); err != nil {
  862. return
  863. }
  864. if models1 == nil {
  865. return 0, "", 0, nil
  866. }
  867. if err = json.Unmarshal([]byte(models1.PassRoom), &pass); err != nil {
  868. return 0, "", 0, err
  869. }
  870. if len(pass) > 0 {
  871. for _, p := range pass {
  872. if p.Id < 100 && p.Id > maxPass {
  873. maxPass = p.Id
  874. }
  875. }
  876. }
  877. ca := gmdata.GetChapterById(int32(maxPass))
  878. if ca != nil {
  879. maxPassName = ca.Name
  880. maxPassValue = int32(ca.ID)
  881. }
  882. return models1.Diamond, maxPassName, maxPassValue, nil
  883. }
  884. getLoginTime := func(playerId int64) (l int32, s, t string, v int64, err error) {
  885. DB, err := player.GetDBByUserId(int64(playerId))
  886. if err != nil {
  887. return
  888. }
  889. var (
  890. models1 *model.PlayerAttr
  891. q = query.Use(config.GDBGroup[DB]).PlayerAttr
  892. m = q.WithContext(ctx).Select(q.Lastlogintick, q.Level).Where(q.Playerid.Eq(int64(playerId)))
  893. )
  894. if err = m.Scan(&models1); err != nil {
  895. return
  896. }
  897. if models1 == nil {
  898. return 0, "", "default", 0, nil
  899. }
  900. s, t = formatTime(models1.Lastlogintick)
  901. l = models1.Level
  902. v = models1.Lastlogintick
  903. return
  904. }
  905. getRechargeTime := func(playerId int64) (s, t string, v int64, err error) {
  906. var (
  907. models1 *model.Order
  908. q = query.Use(config.DB).Order
  909. m = q.WithContext(ctx).Select(q.CreatedAt).Where(q.PlayerID.Eq(playerId))
  910. )
  911. if err = m.Order(q.CreatedAt.Desc()).Scan(&models1); err != nil {
  912. return
  913. }
  914. if models1 == nil {
  915. return "", "default", 0, nil
  916. }
  917. s, t = formatTime(models1.CreatedAt.Unix())
  918. v = models1.CreatedAt.Unix()
  919. return
  920. }
  921. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  922. mod := config.DB.Model(&model.Order{}).
  923. Select("SUM(`money`) AS `total`,`player_id`,`platform`").
  924. Where("money > ? and status = ? ", 0, consts.OrderStatusSuccess).
  925. Group("player_id")
  926. if len(req.Time) == 2 {
  927. mod = mod.Where("created_at BETWEEN ? AND ?", req.Time[0], req.Time[1])
  928. }
  929. if req.Platform > 0 {
  930. mod = mod.Where("platform = ?", req.Platform)
  931. }
  932. if req.ServerId > 0 {
  933. mod = mod.Where("server_id = ?", req.ServerId)
  934. }
  935. mod.Count(&count)
  936. if count > 0 {
  937. mod.Limit(int(req.PerPage)).Offset(int(offset)).Order("total desc").Find(&list)
  938. }
  939. if len(list) > 0 {
  940. for k, _ := range list {
  941. list[k].Ranking = int32(offset + int64(k) + 1)
  942. user := data.GetUser(int64(list[k].PlayerID))
  943. if user != nil {
  944. list[k].NickName = user.NickName
  945. }
  946. list[k].Diamond, list[k].MaxPass, list[k].MaxPassValue, err = getPlayerMaterial(list[k].PlayerID)
  947. if err != nil {
  948. logrus.Warnf("查询出错 getPlayerMaterial:%+v", err)
  949. }
  950. list[k].Level, list[k].LastLogin, list[k].LastLoginTag, list[k].LastLoginValue, err = getLoginTime(list[k].PlayerID)
  951. if err != nil {
  952. logrus.Warnf("查询出错 getLoginTime:%+v", err)
  953. }
  954. list[k].LastRecharge, list[k].LastRechargeTag, list[k].LastRechargeValue, err = getRechargeTime(int64(list[k].PlayerID))
  955. if err != nil {
  956. logrus.Warnf("查询出错 getRechargeTime:%+v", err)
  957. }
  958. }
  959. }
  960. models.List = list
  961. models.Page = req.Page
  962. models.PerPage = req.PerPage
  963. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  964. return serializer.Suc(models)
  965. }
  966. func (s *sOrder) UserStatistics(ctx *gin.Context, req forms.OrderUserStatisticsReq) serializer.Response {
  967. type Counter struct {
  968. Total float64 `json:"total"`
  969. }
  970. type Counter2 struct {
  971. Total int64 `json:"total"`
  972. }
  973. DB, err := player.GetDBByUserId(req.Playerid)
  974. if err != nil {
  975. return serializer.Err(consts.CodeParamErr, "GetDBByUserId err", err)
  976. }
  977. var (
  978. androidQuery = query.Use(config.GDBGroup[DB]).WxpayOrder
  979. iosQuery = query.Use(config.GDBGroup[DB]).PayOrderIos
  980. orderQuery = query.Use(config.DB).Order
  981. changedQuery = query.Use(config.DB).ChangedLog
  982. models forms.OrderUserStatisticsRes
  983. rechargeAmountCounter Counter
  984. )
  985. models.Playerid = req.Playerid
  986. models.OrderPlatform = consts.OrderPlatformAndroid
  987. err = orderQuery.WithContext(ctx).Select(orderQuery.Money.Sum().As("total")).Where(orderQuery.PlayerID.Eq(req.Playerid), orderQuery.Status.Eq(consts.OrderStateSuccess)).Scan(&rechargeAmountCounter)
  988. if err != nil {
  989. return serializer.Err(
  990. consts.CodeParamErr,
  991. "查询出错 RechargeAmount count",
  992. err,
  993. )
  994. }
  995. models.RechargeAmount = rechargeAmountCounter.Total
  996. models.RechargeCount, err = androidQuery.WithContext(ctx).Where(androidQuery.Playerid.Eq(req.Playerid), androidQuery.State.Eq(consts.OrderStateSuccess)).Count()
  997. if err != nil {
  998. return serializer.Err(
  999. consts.CodeParamErr,
  1000. "查询出错 androidQuery count",
  1001. err,
  1002. )
  1003. }
  1004. if models.RechargeCount == 0 {
  1005. models.RechargeCount, err = iosQuery.WithContext(ctx).Where(iosQuery.PlayerID.Eq(req.Playerid), iosQuery.State.Eq(consts.OrderStateSuccess), iosQuery.TradeState.Eq("SUCESS")).Count()
  1006. if err != nil {
  1007. return serializer.Err(
  1008. consts.CodeParamErr,
  1009. "查询出错 iosQuery count",
  1010. err,
  1011. )
  1012. }
  1013. if models.RechargeCount > 0 {
  1014. models.OrderPlatform = consts.OrderPlatformIos
  1015. }
  1016. }
  1017. if models.RechargeCount > 0 {
  1018. if models.OrderPlatform == consts.OrderPlatformAndroid {
  1019. models.RechargeDiamondCount, err = androidQuery.WithContext(ctx).
  1020. Where(androidQuery.Playerid.Eq(req.Playerid), androidQuery.State.Eq(consts.OrderStateSuccess), androidQuery.GoodsID.In(config.DiamondGoodIds...)).
  1021. Count()
  1022. if err != nil {
  1023. return serializer.Err(
  1024. consts.CodeParamErr,
  1025. "查询出错 androidQuery RechargeDiamondCount count",
  1026. err,
  1027. )
  1028. }
  1029. first, err := androidQuery.WithContext(ctx).
  1030. Select(androidQuery.CreateTime).
  1031. Where(androidQuery.Playerid.Eq(req.Playerid), androidQuery.State.Eq(consts.OrderStateSuccess)).
  1032. First()
  1033. if err != nil {
  1034. return serializer.Err(
  1035. consts.CodeParamErr,
  1036. "查询出错 androidQuery First count",
  1037. err,
  1038. )
  1039. }
  1040. models.FirstChargeAt = first.CreateTime.Unix()
  1041. last, err := androidQuery.WithContext(ctx).
  1042. Select(androidQuery.CreateTime).
  1043. Where(androidQuery.Playerid.Eq(req.Playerid), androidQuery.State.Eq(consts.OrderStateSuccess)).
  1044. Last()
  1045. if err != nil {
  1046. return serializer.Err(
  1047. consts.CodeParamErr,
  1048. "查询出错 androidQuery last count",
  1049. err,
  1050. )
  1051. }
  1052. models.LastChargeAt = last.CreateTime.Unix()
  1053. } else {
  1054. models.RechargeDiamondCount, err = iosQuery.WithContext(ctx).
  1055. Where(iosQuery.PlayerID.Eq(req.Playerid), iosQuery.TradeState.Eq("SUCESS"), iosQuery.State.Eq(consts.OrderStateSuccess), iosQuery.GoodsID.In(config.DiamondGoodIds...)).
  1056. Count()
  1057. if err != nil {
  1058. return serializer.Err(
  1059. consts.CodeParamErr,
  1060. "查询出错 iosQuery RechargeDiamondCount count",
  1061. err,
  1062. )
  1063. }
  1064. first, err := iosQuery.WithContext(ctx).
  1065. Select(iosQuery.CreateTime).
  1066. Where(iosQuery.PlayerID.Eq(req.Playerid), iosQuery.State.Eq(consts.OrderStateSuccess)).
  1067. First()
  1068. if err != nil {
  1069. return serializer.Err(
  1070. consts.CodeParamErr,
  1071. "查询出错 iosQuery First count",
  1072. err,
  1073. )
  1074. }
  1075. models.FirstChargeAt = first.CreateTime.Unix()
  1076. last, err := iosQuery.WithContext(ctx).
  1077. Select(iosQuery.CreateTime).
  1078. Where(iosQuery.PlayerID.Eq(req.Playerid), iosQuery.State.Eq(consts.OrderStateSuccess), iosQuery.TradeState.Eq("SUCESS")).
  1079. Last()
  1080. if err != nil {
  1081. return serializer.Err(
  1082. consts.CodeParamErr,
  1083. "查询出错 iosQuery last count",
  1084. err,
  1085. )
  1086. }
  1087. models.LastChargeAt = last.CreateTime.Unix()
  1088. }
  1089. }
  1090. // 消费金币
  1091. var consumptionCoinCountCounter Counter2
  1092. err = changedQuery.WithContext(ctx).
  1093. Select(changedQuery.Coin.Sum().As("total")).
  1094. Where(changedQuery.UserID.Eq(req.Playerid), changedQuery.Coin.Lt(0)).
  1095. Scan(&consumptionCoinCountCounter)
  1096. if err != nil {
  1097. return serializer.Err(
  1098. consts.CodeParamErr,
  1099. "查询出错 ConsumptionCoinCount count",
  1100. err,
  1101. )
  1102. }
  1103. models.ConsumptionCoinCount = consumptionCoinCountCounter.Total * -1
  1104. // 消费钻石
  1105. var ConsumptionDiamondCountCounter Counter2
  1106. err = changedQuery.WithContext(ctx).
  1107. Select(changedQuery.Diamond.Sum().As("total")).
  1108. Where(changedQuery.UserID.Eq(req.Playerid), changedQuery.Diamond.Lt(0)).
  1109. Scan(&ConsumptionDiamondCountCounter)
  1110. if err != nil {
  1111. return serializer.Err(
  1112. consts.CodeParamErr,
  1113. "查询出错 ConsumptionDiamondCount count",
  1114. err,
  1115. )
  1116. }
  1117. models.ConsumptionDiamondCount = ConsumptionDiamondCountCounter.Total * -1
  1118. return serializer.Suc(models)
  1119. }
  1120. func (s *sOrder) AbnormalList(ctx *gin.Context, req forms.AbnormalOrderListReq) serializer.Response {
  1121. type AbnormalOrderListModel struct {
  1122. model.WxpayOrder
  1123. NickName string `json:"nickName"`
  1124. GoodsName string `json:"goodsName"`
  1125. Money int64 `json:"money"`
  1126. ServerId int `json:"serverId"`
  1127. }
  1128. var (
  1129. offset int64 = 0
  1130. models forms.ListRes
  1131. result []AbnormalOrderListModel
  1132. )
  1133. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  1134. //result
  1135. models.List = result
  1136. models.Page = req.Page
  1137. models.PerPage = req.PerPage
  1138. o := query.Use(config.GDBGroup[int(req.ServerId)]).WxpayOrder
  1139. m := o.WithContext(ctx)
  1140. if len(req.Time) == 2 {
  1141. m = m.Where(o.CreateTime.Between(req.Time[0], req.Time[1]))
  1142. } else {
  1143. nowTime := time.Now()
  1144. threeDaysAgo := time.Date(nowTime.Year(), nowTime.Month(), nowTime.Day()-3, 0, 0, 0, 0, time.Local)
  1145. m = m.Where(o.CreateTime.Between(threeDaysAgo, time.Now()))
  1146. }
  1147. if req.PlayerID > 0 {
  1148. m = m.Where(o.Playerid.Eq(req.PlayerID))
  1149. }
  1150. if req.GoodsID > 0 {
  1151. m = m.Where(o.GoodsID.Eq(req.GoodsID))
  1152. }
  1153. if req.OrderID != "" {
  1154. m = m.Where(o.OrderID.Like("%" + req.OrderID + "%"))
  1155. }
  1156. //只获取异常订单
  1157. m = m.Where(o.State.Neq(1)).Where(o.State.Neq(3)).Order(o.CreateTime.Desc())
  1158. count, err := m.Count()
  1159. if err != nil {
  1160. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  1161. }
  1162. if count == 0 {
  1163. return serializer.Suc(models)
  1164. }
  1165. if req.IsExport != 1 {
  1166. m = m.Limit(int(req.PerPage)).Offset(int(offset))
  1167. }
  1168. // 列表展示
  1169. if err = m.Scan(&result); err != nil {
  1170. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  1171. }
  1172. playerIds := make([]int64, len(result))
  1173. for i, item := range result {
  1174. playerIds[i] = item.Playerid
  1175. }
  1176. users := data.GetUsers(playerIds, int(req.ServerId))
  1177. uMap := make(map[int64]*model.PlayerAttr, len(users))
  1178. for _, user := range users {
  1179. uMap[user.ID] = user
  1180. }
  1181. //读取shop.json获取商品信息
  1182. shopGoods := gmdata.GetShopGoods()
  1183. for i, item := range result {
  1184. if _, ok := shopGoods[int64(item.GoodsID)]; ok {
  1185. result[i].Money = shopGoods[int64(item.GoodsID)].Cost[0].Count
  1186. result[i].GoodsName = shopGoods[int64(item.GoodsID)].Name
  1187. } else {
  1188. result[i].Money = 0
  1189. result[i].GoodsName = string(item.GoodsID)
  1190. }
  1191. if user, ok := uMap[item.Playerid]; ok {
  1192. result[i].NickName = user.NickName
  1193. }
  1194. result[i].ServerId = int(req.ServerId)
  1195. }
  1196. // 导出
  1197. if req.IsExport == 1 && len(result) != 0 {
  1198. f := excelize.NewFile()
  1199. f.SetColWidth("Sheet1", "A", "A", 15)
  1200. f.SetColWidth("Sheet1", "B", "B", 15)
  1201. f.SetColWidth("Sheet1", "C", "C", 15)
  1202. f.SetColWidth("Sheet1", "D", "D", 25)
  1203. f.SetColWidth("Sheet1", "E", "E", 25)
  1204. f.SetColWidth("Sheet1", "F", "F", 30)
  1205. f.SetColWidth("Sheet1", "G", "G", 30)
  1206. f.SetColWidth("Sheet1", "H", "H", 15)
  1207. f.SetColWidth("Sheet1", "J", "J", 15)
  1208. f.SetColWidth("Sheet1", "K", "K", 25)
  1209. f.SetColWidth("Sheet1", "L", "L", 25)
  1210. // 创建一个工作表
  1211. f.SetCellValue("Sheet1", "A1", "序号")
  1212. f.SetCellValue("Sheet1", "B1", "下单渠道")
  1213. f.SetCellValue("Sheet1", "C1", "玩家ID")
  1214. f.SetCellValue("Sheet1", "D1", "玩家昵称")
  1215. f.SetCellValue("Sheet1", "E1", "购买商品")
  1216. f.SetCellValue("Sheet1", "F1", "订单号")
  1217. f.SetCellValue("Sheet1", "G1", "外部订单号")
  1218. f.SetCellValue("Sheet1", "H1", "支付金额(元)")
  1219. f.SetCellValue("Sheet1", "J1", "支付状态")
  1220. f.SetCellValue("Sheet1", "K1", "支付时间")
  1221. f.SetCellValue("Sheet1", "L1", "创建时间")
  1222. for i, v := range result {
  1223. f.SetCellValue("Sheet1", fmt.Sprintf("A%d", i+2), v.ID)
  1224. if v.Platform == consts.OrderPlatformAndroid {
  1225. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), "安卓")
  1226. } else {
  1227. f.SetCellValue("Sheet1", fmt.Sprintf("B%d", i+2), "苹果")
  1228. }
  1229. f.SetCellValue("Sheet1", fmt.Sprintf("C%d", i+2), v.Playerid)
  1230. f.SetCellValue("Sheet1", fmt.Sprintf("D%d", i+2), v.NickName)
  1231. f.SetCellValue("Sheet1", fmt.Sprintf("E%d", i+2), gmdata.GetGoodLabel(v.GoodsID))
  1232. f.SetCellValue("Sheet1", fmt.Sprintf("F%d", i+2), v.OrderID)
  1233. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", i+2), v.GoodsName) //商品名
  1234. f.SetCellValue("Sheet1", fmt.Sprintf("H%d", i+2), utility.Round(float64(v.Money))) //商品价格
  1235. f.SetCellValue("Sheet1", fmt.Sprintf("J%d", i+2), consts.GetOrderStatusTag(v.State))
  1236. f.SetCellValue("Sheet1", fmt.Sprintf("L%d", i+2), v.CreateTime.Format("2006-01-02 15:04:05"))
  1237. }
  1238. // 设置工作簿的默认工作表
  1239. f.SetActiveSheet(1)
  1240. ctx.Header("Content-Type", "application/vnd.ms-excel")
  1241. ctx.Header("Content-Disposition", fmt.Sprintf("attachment;filename=订单记录导出%s.xlsx", time.Now().Format("20060102150405")))
  1242. f.WriteTo(ctx.Writer)
  1243. return serializer.Response{}
  1244. }
  1245. models.List = result
  1246. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  1247. return serializer.Suc(models)
  1248. }
  1249. func (s *sOrder) AbnormalReissue(ctx *gin.Context, req forms.AbnormalOrderReissueReq) serializer.Response {
  1250. var (
  1251. o = query.Use(config.GDBGroup[req.ServerId]).WxpayOrder
  1252. m = o.WithContext(ctx)
  1253. )
  1254. //查询订单
  1255. order, err := m.Where(o.OrderID.Eq(req.OrderId)).First()
  1256. if err != nil {
  1257. return serializer.Err(consts.CodeParamErr, "查询出错 order", err)
  1258. }
  1259. //是否已经补发
  1260. if order.State == 1 {
  1261. return serializer.Suc(nil)
  1262. }
  1263. // 更新
  1264. if _, err = m.Where(o.OrderID.Eq(order.OrderID)).Update(o.State, 8); err != nil {
  1265. return serializer.Err(consts.CodeNoRightErr, "更新出错 order", err)
  1266. }
  1267. //redis新增mdsWaitPayment:玩家id
  1268. rdsClient := config.RedisGroup[req.ServerId]
  1269. if rdsClient == nil {
  1270. return serializer.Err(consts.CodeParamErr, "redis不存在", errors.New("redis不存在"))
  1271. }
  1272. rdsClient.HSet(fmt.Sprintf("mdsWaitPayment:%d", order.Playerid), order.OrderID, order.CreateTime.Unix())
  1273. return serializer.Suc(nil)
  1274. }