user_account.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "gadmin/config"
  8. "gadmin/internal/admin/consts"
  9. "gadmin/internal/admin/forms"
  10. "gadmin/internal/admin/gm_rpc/rpc_share"
  11. "gadmin/internal/gorm/model"
  12. "gadmin/internal/gorm/query"
  13. "gadmin/package/gmdata"
  14. "gadmin/utility"
  15. "gadmin/utility/character"
  16. "gadmin/utility/player"
  17. "gadmin/utility/serializer"
  18. "gorm.io/gorm/clause"
  19. "time"
  20. "github.com/gin-gonic/gin"
  21. "github.com/sirupsen/logrus"
  22. )
  23. // UserAccount 玩家账号服务
  24. var UserAccount = new(sUserAccount)
  25. type sUserAccount struct{}
  26. func (s *sUserAccount) MigrateComplete(ctx *gin.Context, req forms.MigrateCompleteReq) serializer.Response {
  27. DB, err := player.GetDBByUserId(req.PlayerId)
  28. if err != nil {
  29. return serializer.Err(consts.CodeParamErr, "GetDBByUserId err", err)
  30. }
  31. var (
  32. models = new(forms.MigrateCompleteData)
  33. pm = query.Use(config.GDBGroup[DB]).PlayerMaterial
  34. pmm = pm.WithContext(ctx).Where(pm.Playerid.Eq(req.PlayerId))
  35. )
  36. if err = pmm.Scan(&models.PlayerMaterial); err != nil {
  37. return serializer.Err(consts.CodeParamErr, "查询出错 PlayerMaterial", err)
  38. }
  39. logrus.Warnf("MigrateComplete models:%+v", models)
  40. return serializer.Suc(models)
  41. }
  42. func (s *sUserAccount) Get(ctx *gin.Context, req forms.UserAccountGetReq) serializer.Response {
  43. DB, err := player.GetDBByUserId(req.ID)
  44. if err != nil {
  45. return serializer.Err(consts.CodeParamErr, "GetDBByUserId err", err)
  46. }
  47. var (
  48. q = query.Use(config.GDBGroup[DB]).PlayerAttr
  49. m = q.WithContext(ctx).Where(q.Playerid.Eq(req.ID))
  50. models *model.PlayerAttr
  51. )
  52. if err = m.Scan(&models); err != nil {
  53. return serializer.Err(consts.CodeParamErr, "查询出错", err)
  54. }
  55. type Data struct {
  56. *model.UserAccount
  57. BanReason string `json:"banReason"`
  58. PayOffReason string `json:"payOffReason"`
  59. SingleBan int32 `json:"singleBan"`
  60. SingleBanReason string `json:"singleBanReason"`
  61. ChatBan int32 `json:"chatBan"`
  62. ChatBanReason string `json:"chatBanReason"`
  63. ChatBanDeadlineTime int64 `json:"chatBanDeadlineTime"`
  64. }
  65. if models != nil {
  66. acc, _ := s.GetAcc(models.AccID)
  67. var data = new(Data)
  68. data.UserAccount = acc
  69. data.SingleBan = models.Ban
  70. var (
  71. //chatQ = query.Use(config.GDBGroup[DB]).Chat
  72. //chatM = chatQ.WithContext(ctx).Where(chatQ.Playerid.Eq(req.ID))
  73. //chatModel *model.Chat
  74. //banQ = query.Use(config.DB).AdminBanUserLog
  75. //banM = banQ.WithContext(ctx).Where(banQ.PlayerID.Eq(req.ID))
  76. //banModels []*model.AdminBanUserLog
  77. )
  78. /*if err = chatM.Scan(&chatModel); err != nil {
  79. return serializer.Err(consts.CodeParamErr, "查询出错", err)
  80. }
  81. if err = banM.Scan(&banModels); err != nil {
  82. fmt.Println("123")
  83. return serializer.Err(consts.CodeParamErr, "查询出错", err)
  84. }
  85. if chatModel != nil {
  86. if chatModel.ForbidTime > time.Now().Unix() {
  87. data.ChatBan = 1
  88. data.ChatBanDeadlineTime = chatModel.ForbidTime
  89. }
  90. }
  91. for _, banModel := range banModels {
  92. switch banModel.Type {
  93. case consts.BanType:
  94. data.BanReason = banModel.Reason
  95. case consts.SingleBanType:
  96. data.SingleBanReason = banModel.Reason
  97. case consts.PaySwitchType:
  98. data.PayOffReason = banModel.Reason
  99. case consts.ChatBanType:
  100. data.ChatBanReason = banModel.Reason
  101. }
  102. }*/
  103. return serializer.Suc(data)
  104. }
  105. return serializer.Err(consts.CodeParamErr, "查询出错 models != nil", err)
  106. }
  107. func (s *sUserAccount) List(ctx *gin.Context, req forms.UserAccountListReq) serializer.Response {
  108. type Result struct {
  109. ID int64 `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
  110. Playerid int64 `gorm:"column:playerid" json:"playerid"`
  111. Level int32 `gorm:"column:level" json:"level"`
  112. Exp int64 `gorm:"column:exp" json:"exp"`
  113. Stamina int32 `gorm:"column:stamina" json:"stamina"`
  114. Lastlogintick int64 `gorm:"column:lastlogintick" json:"lastlogintick"`
  115. Lastlogouttick int64 `gorm:"column:lastlogouttick" json:"lastlogouttick"`
  116. LastChapter string `gorm:"column:lastChapter" json:"lastChapter"`
  117. LastStamTick int64 `gorm:"column:lastStamTick" json:"lastStamTick"`
  118. Location string `gorm:"column:location" json:"location"`
  119. OpenID string `gorm:"column:openId" json:"openId"`
  120. NickName string `gorm:"column:nickName" json:"nickName"`
  121. ImgURL string `gorm:"column:imgUrl" json:"imgUrl"`
  122. ServerID int32 `gorm:"column:serverId" json:"serverId"`
  123. AccID int64 `gorm:"column:accId" json:"accId"`
  124. CreateTime time.Time `gorm:"column:create_time" json:"create_time"`
  125. CreateTime2 int64 `gorm:"column:createtime" json:"createtime"`
  126. Ban int32 `json:"ban"`
  127. SingleBan int32 `json:"singleBan"`
  128. Account string `json:"account"`
  129. }
  130. if req.ServerId <= 0 {
  131. return serializer.Err(consts.CodeParamErr, "必须选择一个有效的区服", nil)
  132. }
  133. DB, err := player.GetDBByServerID(req.ServerId)
  134. if err != nil {
  135. return serializer.Err(consts.CodeParamErr, "GetDB err", err)
  136. }
  137. var (
  138. c = query.Use(config.DB).PlayerChannel
  139. q = query.Use(config.GDBGroup[DB])
  140. u = q.PlayerAttr
  141. material = q.PlayerMaterial
  142. m = u.WithContext(ctx)
  143. offset int64 = 0
  144. models forms.UserAccountListRes
  145. lists []Result
  146. joinMaterial bool
  147. )
  148. if len(req.DiamondBetween) == 2 {
  149. if !joinMaterial {
  150. m = m.LeftJoin(material, material.Playerid.EqCol(u.Playerid))
  151. joinMaterial = true
  152. }
  153. m = m.Where(material.Diamond.Between(int32(req.DiamondBetween[0]), int32(req.DiamondBetween[1])))
  154. }
  155. if len(req.CoinBetween) == 2 {
  156. if !joinMaterial {
  157. m = m.LeftJoin(material, material.Playerid.EqCol(u.Playerid))
  158. joinMaterial = true
  159. }
  160. m = m.Where(material.Coin.Between(int64(req.CoinBetween[0]), int64(req.CoinBetween[1])))
  161. }
  162. if len(req.LevelBetween) == 2 {
  163. m = m.Where(u.Level.Between(req.LevelBetween[0], req.LevelBetween[1]))
  164. }
  165. if len(req.StaminaBetween) == 2 {
  166. m = m.Where(u.Stamina.Between(req.StaminaBetween[0], req.StaminaBetween[1]))
  167. }
  168. if len(req.Createtime) == 2 {
  169. m = m.Where(u.CreateTime.Between(time.Unix(req.Createtime[0], 0), time.Unix(req.Createtime[1], 0)))
  170. }
  171. if req.ID > 0 {
  172. m = m.Where(u.Playerid.Eq(req.ID))
  173. }
  174. if req.Nickname != "" {
  175. m = m.Where(u.NickName.Like("%" + req.Nickname + "%"))
  176. }
  177. // openid
  178. if req.OpenId != "" {
  179. m = m.Where(u.OpenID.Like(req.OpenId))
  180. }
  181. if len(req.Sorter) > 0 {
  182. for i := 0; i < len(req.Sorter); i++ {
  183. if req.Sorter[i].Field == "id" {
  184. if req.Sorter[i].By == "DESC" {
  185. m = m.Order(u.ID.Desc())
  186. } else {
  187. m = m.Order(u.ID)
  188. }
  189. }
  190. if req.Sorter[i].Field == "createtime" {
  191. if req.Sorter[i].By == "DESC" {
  192. m = m.Order(u.CreateTime.Desc())
  193. } else {
  194. m = m.Order(u.CreateTime)
  195. }
  196. }
  197. }
  198. } else {
  199. m = m.Order(u.ID.Desc())
  200. }
  201. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  202. count, err := m.Count()
  203. if err != nil {
  204. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  205. }
  206. if count > 0 {
  207. switch req.ChannelId {
  208. case consts.ChannelIdNone:
  209. // 不选择渠道
  210. if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
  211. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  212. }
  213. case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  214. var playerids []int64
  215. err = c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.In(Channel.GetIdsByType(req.ChannelId)...)).Order(c.Playerid.Desc()).Limit(int(req.PerPage)).Offset(int(offset)).Pluck(c.Playerid, &playerids)
  216. if err != nil {
  217. return serializer.Err(consts.CodeParamErr, "Pluck count", err)
  218. }
  219. if err = m.Where(u.Playerid.In(playerids...)).Scan(&lists); err != nil {
  220. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  221. }
  222. default:
  223. // 指定渠道
  224. var playerids []int64
  225. err = c.WithContext(ctx).Select(c.Playerid).Where(c.ChannelID.Eq(req.ChannelId)).Order(c.Playerid.Desc()).Limit(int(req.PerPage)).Offset(int(offset)).Pluck(c.Playerid, &playerids)
  226. if err != nil {
  227. return serializer.Err(consts.CodeParamErr, "Pluck count", err)
  228. }
  229. if err = m.Where(u.Playerid.In(playerids...)).Scan(&lists); err != nil {
  230. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  231. }
  232. }
  233. }
  234. for k, v := range lists {
  235. lists[k].CreateTime2 = v.CreateTime.Unix()
  236. lists[k].SingleBan = lists[k].Ban
  237. acc, _ := s.GetAcc(lists[k].AccID)
  238. if acc != nil {
  239. lists[k].Ban = acc.Ban
  240. //lists[k].Account = acc.Account
  241. //lists[k].OpenID = acc.Openid
  242. }
  243. }
  244. models.List = lists
  245. models.Page = req.Page
  246. models.PerPage = req.PerPage
  247. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  248. return serializer.Suc(models)
  249. }
  250. /*func (s *sUserAccount) UpdateNickname(ctx *gin.Context, req forms.UpdateNicknameReq) serializer.Response {
  251. //发送到nats
  252. type sendResult struct {
  253. ErrCode int `json:"errCode"`
  254. MsgId string `json:"msgId"`
  255. }
  256. data := struct {
  257. MsgId string `json:"msgId"`
  258. PlayerID int64 `json:"userId"`
  259. NickName string `json:"name"`
  260. }{
  261. MsgId: character.GenerateMsgId(),
  262. PlayerID: req.UserId,
  263. NickName: req.Nickname,
  264. }
  265. resp := &sendResult{}
  266. serverId := model2.ExtractLineId(req.UserId)
  267. res, err := config.GmNats.GmRequest(serverId, "GmUpdateName", data)
  268. if err != nil {
  269. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  270. }
  271. if err = json.Unmarshal(res, &resp); err != nil {
  272. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  273. }
  274. rpc_share.LogChan <- rpc_share.LogMsg{
  275. MsgID: data.MsgId,
  276. Data: resp,
  277. }
  278. return serializer.Suc(req)
  279. }
  280. func (s *sUserAccount) SingleBanUser(ctx *gin.Context, req forms.UserAccountBanReq) serializer.Response {
  281. DB, err := player.GetDBByUserId(req.ID)
  282. if err != nil {
  283. return serializer.Err(consts.CodeParamErr, "GetDBByUserId 出错", err)
  284. }
  285. logrus.Warnf("SingleBanUser.GetAccIdByPlayerId DB:%v", DB)
  286. var (
  287. q = query.Use(config.GDBGroup[DB]).PlayerAttr
  288. m = q.Where(q.Playerid.Eq(req.ID))
  289. )
  290. if _, err = m.Update(q.Ban, req.Ban); err != nil {
  291. return serializer.Err(consts.CodeParamErr, "更新出错", err)
  292. }
  293. if req.ID == 0 {
  294. return serializer.Err(consts.CodeParamErr, "玩家ID不能为空", nil)
  295. }
  296. serverID, err := player.GetServerIDByUserId(req.ID)
  297. if err != nil {
  298. return serializer.Err(consts.CodeParamErr, "更新出错", err)
  299. }
  300. msgs := msg.GmSetBan{
  301. MsgId: character.GenerateMsgId(),
  302. PlayerID: req.ID,
  303. Ban: int(req.Ban),
  304. OperatorId: token.GetUID(ctx),
  305. }
  306. if req.Ban == 0 {
  307. rpc_share.MsgMap[msgs.MsgId] = fmt.Sprintf("%s,GM为服务器[%v]玩家[%d]设为解封状态", utility.FormatSecond(time.Now()), gmdata.GetServerName(int(serverID)), req.ID)
  308. } else {
  309. rpc_share.MsgMap[msgs.MsgId] = fmt.Sprintf("%s,GM为服务器[%v]玩家[%v]设为封禁状态", utility.FormatSecond(time.Now()), gmdata.GetServerName(int(serverID)), req.ID)
  310. }
  311. var resp *msg.ResponseGmSetBan
  312. res, err := config.GmNats.GmRequest(int(serverID), "GmSetBan", msgs)
  313. if err != nil {
  314. return serializer.Err(consts.CodeParamErr, "GmRequest 出错", err)
  315. }
  316. if err = json.Unmarshal(res, &resp); err != nil {
  317. return serializer.Err(consts.CodeParamErr, "Unmarshal 出错", err)
  318. }
  319. rpc_share.LogChan <- rpc_share.LogMsg{
  320. MsgID: msgs.MsgId,
  321. Data: resp,
  322. }
  323. createOrUpdateAdminBanUserLog(ctx, req.ID, consts.SingleBanType, req.Reason)
  324. strInfo := "Ban success"
  325. if req.Ban == 0 {
  326. strInfo = "Unban success"
  327. }
  328. return serializer.Suc(nil, strInfo)
  329. }*/
  330. func (s *sUserAccount) BanUser(ctx *gin.Context, req forms.UserAccountBanReq) serializer.Response {
  331. accId, err := s.GetAccIdByPlayerId(req.ID)
  332. if err != nil {
  333. logrus.Warnf("GetAcc err:%+v", err)
  334. return serializer.Err(consts.CodeParamErr, "更新出错1", err)
  335. }
  336. if accId == 0 {
  337. logrus.Warnf("GetAcc accId == 0 ")
  338. return serializer.Err(consts.CodeParamErr, "更新出错 accId == 0", nil)
  339. }
  340. for _, table := range s.GetAccTables() {
  341. tx := config.LDB.Table(table).Where("accId = ? ", accId).Update("ban", req.Ban)
  342. if tx.Error != nil {
  343. return serializer.Err(consts.CodeParamErr, "更新出错", tx.Error)
  344. }
  345. }
  346. createOrUpdateAdminBanUserLog(ctx, req.ID, consts.BanType, req.Reason)
  347. strInfo := "Ban success"
  348. if req.Ban == 0 {
  349. strInfo = "Unban success"
  350. }
  351. return serializer.Suc(nil, strInfo)
  352. }
  353. func (s *sUserAccount) BanUserChat(ctx *gin.Context, req forms.BanChatReq) serializer.Response {
  354. if req.PlayerID == 0 {
  355. return serializer.Err(consts.CodeParamErr, "参数错误", errors.New("playerid不能为空"))
  356. }
  357. playerAttr, err := player.GetAttrByUserId(req.PlayerID)
  358. if err != nil {
  359. return serializer.Err(consts.CodeDBError, "系统错误", err)
  360. }
  361. DB, err := player.GetDBByPlayerAttr(playerAttr)
  362. if err != nil {
  363. return serializer.Err(consts.CodeDBError, "系统错误", err)
  364. }
  365. message := forms.GmChatForbid{
  366. MsgId: character.GenerateMsgId(),
  367. PlayerID: req.PlayerID,
  368. ForbidTime: req.DeadlineTime,
  369. }
  370. if req.Ban == 0 {
  371. message.ForbidTime = 0
  372. rpc_share.MsgMap[message.MsgId] = fmt.Sprintf("%s,服务器[%v]的玩家[%d]解除禁止聊天", utility.FormatSecond(time.Now()), gmdata.GetServerName(DB), req.PlayerID)
  373. } else {
  374. rpc_share.MsgMap[message.MsgId] = fmt.Sprintf("%s,服务器[%v]的玩家[%d]被禁止聊天", utility.FormatSecond(time.Now()), gmdata.GetServerName(DB), req.PlayerID)
  375. }
  376. var resp forms.ResponseGmChatForbid
  377. res, err := config.GmNats.GmRequest(DB, "GmChatForbid", message)
  378. if err != nil {
  379. return serializer.Err(consts.CodeParamErr, "nats request err", err)
  380. }
  381. if err = json.Unmarshal(res, &resp); err != nil {
  382. return serializer.Err(consts.CodeParamErr, "nats response err", err)
  383. }
  384. createOrUpdateAdminBanUserLog(ctx, req.PlayerID, consts.ChatBanType, req.Reason)
  385. rpc_share.LogChan <- rpc_share.LogMsg{
  386. MsgID: message.MsgId,
  387. Data: resp,
  388. }
  389. strInfo := "Ban success"
  390. if req.Ban == 0 {
  391. strInfo = "Unban success"
  392. }
  393. return serializer.Suc(nil, strInfo)
  394. }
  395. /*func (s *sUserAccount) UpdatePaySwitch(ctx *gin.Context, req forms.GmSetPaySwitch) serializer.Response {
  396. DB, err := player.GetDBByUserId(req.PlayerID)
  397. if err != nil {
  398. return serializer.Err(consts.CodeParamErr, "GetDBByUserId 出错", err)
  399. }
  400. logrus.Warnf("UpdatePaySwitch.GetAccIdByPlayerId DB:%v", DB)
  401. var (
  402. q = query.Use(config.GDBGroup[DB]).PlayerMaterial
  403. m = q.Where(q.Playerid.Eq(req.PlayerID))
  404. )
  405. if _, err = m.Update(q.PaySwitch, req.Switch); err != nil {
  406. return serializer.Err(consts.CodeParamErr, "更新出错", err)
  407. }
  408. if req.PlayerID == 0 {
  409. return serializer.Err(consts.CodeParamErr, "玩家ID不能为空", nil)
  410. }
  411. serverID, err := player.GetServerIDByUserId(req.PlayerID)
  412. if err != nil {
  413. return serializer.Err(consts.CodeParamErr, "更新出错", err)
  414. }
  415. msgs := msg.GmSetPaySwitch{
  416. MsgId: character.GenerateMsgId(),
  417. PlayerID: req.PlayerID,
  418. Switch: req.Switch,
  419. }
  420. if req.Switch == 0 {
  421. rpc_share.MsgMap[msgs.MsgId] = fmt.Sprintf("%s,GM为服务器[%v]玩家[%d]开启支付", utility.FormatSecond(time.Now()), gmdata.GetServerName(int(serverID)), req.PlayerID)
  422. } else {
  423. rpc_share.MsgMap[msgs.MsgId] = fmt.Sprintf("%s,GM为服务器[%v]玩家[%v]关闭支付", utility.FormatSecond(time.Now()), gmdata.GetServerName(int(serverID)), req.PlayerID)
  424. }
  425. var resp *msg.ResponseGmSetPaySwitch
  426. res, err := config.GmNats.GmRequest(int(serverID), "GmSetPaySwitch", msgs)
  427. if err != nil {
  428. return serializer.Err(consts.CodeParamErr, "GmRequest 出错", err)
  429. }
  430. if err = json.Unmarshal(res, &resp); err != nil {
  431. return serializer.Err(consts.CodeParamErr, "Unmarshal 出错", err)
  432. }
  433. rpc_share.LogChan <- rpc_share.LogMsg{
  434. MsgID: msgs.MsgId,
  435. Data: resp,
  436. }
  437. createOrUpdateAdminBanUserLog(ctx, req.PlayerID, consts.PaySwitchType, req.Reason)
  438. strInfo := "switch success"
  439. if req.Switch == 0 {
  440. strInfo = "UnSwitch success"
  441. }
  442. return serializer.Suc(nil, strInfo)
  443. }*/
  444. func createOrUpdateAdminBanUserLog(ctx *gin.Context, playerID int64, typ int32, reason string) {
  445. var adminID int64
  446. if id, ok := ctx.Get("admin_id"); ok {
  447. if i, ok2 := id.(int64); ok2 {
  448. adminID = i
  449. }
  450. }
  451. // 记录禁用原因
  452. now := time.Now().Unix()
  453. q := query.Use(config.DB).AdminBanUserLog
  454. m := q.WithContext(context.Background()).Where(q.PlayerID.Eq(playerID), q.Type.Eq(typ))
  455. adminBanUserData := &model.AdminBanUserLog{
  456. AdminID: int32(adminID),
  457. IP: ctx.ClientIP(),
  458. PlayerID: playerID,
  459. Type: typ,
  460. Reason: reason,
  461. CreateAt: int32(now),
  462. UpdateAt: int32(now),
  463. }
  464. if err := m.Clauses(clause.OnConflict{
  465. Columns: []clause.Column{{Name: "player_id"}, {Name: "type"}},
  466. DoUpdates: clause.AssignmentColumns([]string{"admin_id", "ip", "reason", "update_at"}),
  467. }).Create(adminBanUserData); err != nil {
  468. logrus.Errorf("Create Or Update admin_ban_user_log err:%v", err.Error())
  469. }
  470. }
  471. func (s *sUserAccount) GetAccIdByPlayerId(playerId int64) (accId int64, err error) {
  472. DB, err := player.GetDBByUserId(playerId)
  473. if err != nil {
  474. return
  475. }
  476. logrus.Warnf("GetAccIdByPlayerId DB:%v", DB)
  477. var (
  478. q = query.Use(config.GDBGroup[DB]).PlayerAttr
  479. m = q.Select(q.AccID).Where(q.Playerid.Eq(playerId))
  480. models *model.PlayerAttr
  481. )
  482. if err = m.Scan(&models); err != nil {
  483. return
  484. }
  485. if models != nil {
  486. accId = models.AccID
  487. return
  488. }
  489. return 0, nil
  490. }
  491. // GetAcc 获取档案信息
  492. func (s *sUserAccount) GetAcc(accId int64) (models *model.UserAccount, tab string) {
  493. for _, table := range s.GetAccTables() {
  494. config.LDB.Table(table).Where("accId = ? ", accId).Scan(&models)
  495. if models != nil {
  496. return models, table
  497. }
  498. }
  499. return nil, ""
  500. }
  501. func (s *sUserAccount) GetAccTables() (tables []string) {
  502. type Table struct {
  503. Value string
  504. }
  505. var sql = "SELECT TABLE_NAME as `value` FROM information_schema.`TABLES` WHERE TABLE_SCHEMA ='graveaccount1' AND TABLE_NAME LIKE 'user_account_%'"
  506. tx := config.LDB.Raw(sql)
  507. if err := tx.Scan(&tables).Error; err != nil {
  508. logrus.Warnf("service.GetAcc err:%+v", err)
  509. return
  510. }
  511. logrus.Warnf("service.GetAccTables tables:%+v", tables)
  512. return tables
  513. }
  514. func (s *sUserAccount) Search(ctx *gin.Context, req forms.UserAccountSearchReq) serializer.Response {
  515. if req.ID == 0 && req.OpenId == "" && req.AccId == 0 {
  516. return serializer.Suc(nil)
  517. }
  518. if req.ID > 0 {
  519. accId, err := player.GetAccIDByUserId(req.ID)
  520. if err != nil {
  521. return serializer.Err(consts.CodeParamErr, err.Error(), nil)
  522. }
  523. if accId > 0 {
  524. req.AccId = accId
  525. }
  526. }
  527. if req.OpenId != "" {
  528. accId, err := player.GetAccIDByOpenId(req.OpenId)
  529. if err != nil {
  530. return serializer.Err(consts.CodeParamErr, err.Error(), nil)
  531. }
  532. if accId > 0 {
  533. req.AccId = accId
  534. }
  535. }
  536. if req.AccId <= 0 {
  537. return serializer.Suc(nil)
  538. }
  539. type Result struct {
  540. ID int64 `gorm:"column:id;primaryKey;autoIncrement:true" json:"id"`
  541. Playerid int64 `gorm:"column:playerid" json:"playerid"`
  542. Level int32 `gorm:"column:level" json:"level"`
  543. Exp int64 `gorm:"column:exp" json:"exp"`
  544. Stamina int32 `gorm:"column:stamina" json:"stamina"`
  545. Lastlogintick int64 `gorm:"column:lastlogintick" json:"lastlogintick"`
  546. Lastlogouttick int64 `gorm:"column:lastlogouttick" json:"lastlogouttick"`
  547. LastChapter string `gorm:"column:lastChapter" json:"lastChapter"`
  548. LastStamTick int64 `gorm:"column:lastStamTick" json:"lastStamTick"`
  549. Location string `gorm:"column:location" json:"location"`
  550. OpenID string `gorm:"column:openId" json:"openId"`
  551. NickName string `gorm:"column:nickName" json:"nickName"`
  552. ImgURL string `gorm:"column:imgUrl" json:"imgUrl"`
  553. ServerID int32 `gorm:"column:serverId" json:"serverId"`
  554. AccID int64 `gorm:"column:accId" json:"accId"`
  555. CreateTime time.Time `gorm:"column:create_time" json:"create_time"`
  556. CreateTime2 int64 `gorm:"column:createtime" json:"createtime"`
  557. Ban int32 `json:"ban"`
  558. SingleBan int32 `json:"singleBan"`
  559. Account string `json:"account"`
  560. ServerName string `json:"serverName"`
  561. }
  562. var (
  563. models forms.UserAccountListRes
  564. lists []*Result
  565. )
  566. for _, DB := range config.GDBGroup {
  567. var (
  568. q = query.Use(DB).PlayerAttr
  569. m = q.WithContext(ctx)
  570. )
  571. var first *Result
  572. if err := m.Where(q.AccID.Eq(req.AccId)).Scan(&first); err != nil {
  573. return serializer.Err(consts.CodeParamErr, "查询出错 First", err)
  574. }
  575. if first != nil {
  576. first.ServerName, _ = ServerOption.GetName(ctx, int32(config.GetDBId(DB)))
  577. lists = append(lists, first)
  578. }
  579. }
  580. req.Page, req.PerPage, _ = forms.CalculatePage(req.Page, req.PerPage)
  581. for k, v := range lists {
  582. lists[k].CreateTime2 = v.CreateTime.Unix()
  583. lists[k].SingleBan = lists[k].Ban
  584. acc, _ := s.GetAcc(lists[k].AccID)
  585. if acc != nil {
  586. lists[k].Ban = acc.Ban
  587. //lists[k].Account = acc.Account
  588. //lists[k].OpenID = acc.Openid
  589. }
  590. }
  591. count := int64(len(lists))
  592. models.List = lists
  593. models.Page = req.Page
  594. models.PerPage = req.PerPage
  595. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  596. return serializer.Suc(models)
  597. }