orm_mysql.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. package model
  2. import (
  3. "rocommon/service"
  4. "rocommon/util"
  5. "roserver/serverproto"
  6. "runtime/debug"
  7. "strconv"
  8. "time"
  9. )
  10. //mysql 数据库表结构
  11. //ro_gs_online_st
  12. //role表结构
  13. type RoleTable struct {
  14. Uid uint64
  15. Serverid int32
  16. Device_id string
  17. Nick_name string
  18. Base_level int32
  19. Create_date time.Time
  20. Last_login_date time.Time
  21. Ban_date time.Time
  22. Ban_chat_date time.Time
  23. Map_level int32
  24. Max_fight_power uint32
  25. Fight_power int32
  26. Active_code string
  27. Open_id string
  28. Sub_platform string
  29. Tower_level int32
  30. Vip int32
  31. Money uint64
  32. Zeny uint64
  33. Total_recharge float32
  34. Last_recharge_time time.Time
  35. }
  36. func (RoleTable) TableName() string {
  37. return "role"
  38. }
  39. type RoleLogTable struct {
  40. Uid uint64
  41. Type int32
  42. Sub_type int32
  43. Log_date time.Time
  44. Old_val uint64
  45. New_val uint64
  46. Delta_val uint64
  47. Param int32
  48. Strparam string
  49. }
  50. func (RoleLogTable) TableName() string {
  51. return "role_log"
  52. }
  53. type ServerOnlineLog struct {
  54. Server_id int32
  55. Server_sub_id int32
  56. Log_date time.Time
  57. Online_num int32
  58. }
  59. func (ServerOnlineLog) TableName() string {
  60. return "server_online_log"
  61. }
  62. type RoleOrderList struct {
  63. Uid uint64
  64. Rmb int32
  65. Reward_list string
  66. Order_id uint64
  67. Order_date time.Time
  68. Goods_type int32
  69. Goods_id int32
  70. Sdk_order_id string
  71. }
  72. func (RoleOrderList) TableName() string {
  73. return "role_order_list"
  74. }
  75. type RoleMsgTable struct {
  76. Uid uint64
  77. Target_uid uint64
  78. Msg_type int32
  79. Content string
  80. Msg_date time.Time
  81. }
  82. func (RoleMsgTable) TableName() string {
  83. return "role_msg"
  84. }
  85. func UpdatePlayerBriefInfo2Mysql(uid uint64, briefInfo *serverproto.CommonPlayerBriefInfo, bCreate bool, activeCode, openId, subPlatform string) {
  86. MysqlUpdateMag.dataLock.Lock()
  87. if data, ok := MysqlUpdateMag.mysqlPlayerBriefInfoList[uid]; ok {
  88. if bCreate {
  89. data.bCreate = true
  90. }
  91. data.briefInfo = briefInfo
  92. if activeCode != "" {
  93. data.activeCode = activeCode
  94. }
  95. if openId != "" {
  96. data.openId = openId
  97. }
  98. if subPlatform != "" {
  99. data.subPlatform = subPlatform
  100. }
  101. } else {
  102. data = &mysqlPlayerBriefInfo{
  103. uid: uid,
  104. briefInfo: briefInfo,
  105. bCreate: bCreate,
  106. activeCode: activeCode,
  107. openId: openId,
  108. subPlatform: subPlatform,
  109. }
  110. MysqlUpdateMag.mysqlPlayerBriefInfoList[uid] = data
  111. }
  112. MysqlUpdateMag.dataLock.Unlock()
  113. }
  114. //使用说明 https://gorm.io/zh_CN/docs/query.html
  115. func doUpdatePlayerBriefInfo2MysqlORM(mysqlMag *MysqlUpdateManager, uid uint64, briefInfo *serverproto.CommonPlayerBriefInfo, bCreate bool, activeCode, openId, subPlatform string) {
  116. if service.GetMysqlORM() == nil {
  117. util.ErrorF("mysql connector invalid UpdatePlayerBriefInfo2Mysql")
  118. mysqlMag.mysqlUpdatePool.Release()
  119. return
  120. }
  121. go func() {
  122. defer func() {
  123. mysqlMag.mysqlUpdatePool.Release()
  124. //打印奔溃信息
  125. if err := recover(); err != nil {
  126. util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
  127. }
  128. }()
  129. isCreateRole := bCreate
  130. zoneId := int32(service.GetServiceConfig().Node.Zone)
  131. now := util.GetCurrentTimeNow()
  132. tmpRole := &RoleTable{
  133. Nick_name: string(briefInfo.NickName),
  134. Base_level: briefInfo.Level,
  135. Map_level: briefInfo.MapLevelId,
  136. Fight_power: briefInfo.FightPower,
  137. Max_fight_power: briefInfo.MaxFightPower,
  138. Active_code: activeCode,
  139. Open_id: openId,
  140. Tower_level: briefInfo.TowerLevel,
  141. Vip: briefInfo.VipLevel,
  142. Money: briefInfo.Rmb,
  143. Zeny: briefInfo.Zeny,
  144. Total_recharge: briefInfo.TotalRecharge,
  145. }
  146. var err error = nil
  147. if isCreateRole {
  148. tmpRole.Uid = uid
  149. tmpRole.Create_date = now
  150. tmpRole.Last_login_date = now
  151. tmpRole.Serverid = zoneId
  152. tmpRole.Sub_platform = subPlatform
  153. //创建记录并更新未给出的字段。
  154. err = service.GetMysqlORM().DbConnORM().Omit("ban_date", "ban_chat_date", "last_recharge_time").Create(tmpRole).Error
  155. } else {
  156. hasRole := &RoleTable{}
  157. service.GetMysqlORM().DbConnORM().Select("uid").Where("uid = ?", uid).Find(hasRole)
  158. //service.GetMysqlORM().DbConnORM().Where("uid = ? ", uid).First(hasRole)
  159. if hasRole.Uid <= 0 {
  160. tmpRole.Uid = uid
  161. tmpRole.Create_date = now
  162. tmpRole.Last_login_date = now
  163. tmpRole.Serverid = zoneId
  164. tmpRole.Sub_platform = subPlatform
  165. //创建记录并更新未给出的字段
  166. err = service.GetMysqlORM().DbConnORM().Omit("ban_date", "ban_chat_date", "last_recharge_time").Create(tmpRole).Error
  167. } else {
  168. //结构体模式默认值不会更新,做特殊处理
  169. if tmpRole.Money <= 0 {
  170. tmpRole.Money = 1
  171. }
  172. if tmpRole.Zeny <= 0 {
  173. tmpRole.Zeny = 1
  174. }
  175. if briefInfo.OnlineTime > 0 {
  176. tmpRole.Last_login_date = now
  177. }
  178. if briefInfo.LastRechargeTime > 0 {
  179. lastRechargeTime := util.GetTimeByUint64(briefInfo.LastRechargeTime)
  180. tmpRole.Last_recharge_time = lastRechargeTime
  181. }
  182. err = service.GetMysqlORM().DbConnORM().Model(&RoleTable{}).Where("uid = ?", uid).Updates(tmpRole).Error
  183. }
  184. }
  185. //err := service.GetMysqlORM().DbConnORM().Error
  186. if err != nil {
  187. util.ErrorF("uid=%v doUpdatePlayerBriefInfo2MysqlORM err=%v", uid, err)
  188. }
  189. //util.InfoF("doUpdatePlayerBriefInfo2Mysql end...")
  190. }()
  191. }
  192. func UpdatePlayerRes2Mysql(uid uint64, saveInfo *serverproto.RoleRes2MysqlInfo) {
  193. MysqlUpdateMag.dataLock.Lock()
  194. if data, ok := MysqlUpdateMag.mysqlResInfoList[uid]; ok {
  195. data.saveInfo = saveInfo
  196. } else {
  197. data = &mysqlResInfo{
  198. uid: uid,
  199. saveInfo: saveInfo,
  200. }
  201. MysqlUpdateMag.mysqlResInfoList[uid] = data
  202. }
  203. MysqlUpdateMag.dataLock.Unlock()
  204. }
  205. //更新资源数据到mysql
  206. func doUpdatePlayerRes2MysqlORM(mysqlMag *MysqlUpdateManager, uid uint64, saveInfo *serverproto.RoleRes2MysqlInfo) {
  207. if service.GetMysqlORM() == nil {
  208. util.ErrorF("mysql connector invalid doUpdatePlayerRes2MysqlORM")
  209. mysqlMag.mysqlUpdatePool.Release()
  210. return
  211. }
  212. go func() {
  213. defer func() {
  214. mysqlMag.mysqlUpdatePool.Release()
  215. //打印奔溃信息
  216. if err := recover(); err != nil {
  217. util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
  218. }
  219. }()
  220. var err error = nil
  221. //util.InfoF("doUpdatePlayerRes2Mysql start...")
  222. // Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更
  223. // 新时,默认情况下,GORM 只会更新非零值的字段
  224. err = service.GetMysqlORM().DbConnORM().Model(&RoleTable{}).Where("uid = ?", uid).Updates(
  225. map[string]interface{}{
  226. "money": uint64(saveInfo.Money),
  227. "total_recharge": saveInfo.TotalRecharge,
  228. "vip": saveInfo.VipLevel,
  229. }).Error
  230. //err := service.GetMysqlORM().DbConnORM().Error
  231. if err != nil {
  232. util.ErrorF("uid=%v doUpdatePlayerRes2MysqlORM err=%v", uid, err)
  233. }
  234. //util.InfoF("doUpdatePlayerRes2Mysql end...")
  235. }()
  236. }
  237. func UpdatePlayerBanInfo2Mysql(uid uint64, banTime uint64, banType int32) {
  238. //banType 1封号,2禁言
  239. MysqlUpdateMag.dataLock.Lock()
  240. if data, ok := MysqlUpdateMag.mysqlBanInfoList[uid]; ok {
  241. data.banTime = banTime
  242. } else {
  243. data = &mysqlBanInfo{
  244. uid: uid,
  245. banTime: banTime,
  246. banType: banType,
  247. }
  248. MysqlUpdateMag.mysqlBanInfoList[uid] = data
  249. }
  250. MysqlUpdateMag.dataLock.Unlock()
  251. }
  252. func DoUpdatePlayerBanInfo2MysqlORM(mysqlMag *MysqlUpdateManager, uid uint64, banTime uint64, banType int32) {
  253. if service.GetMysqlORM() == nil {
  254. util.ErrorF("mysql connector invalid UpdatePlayerBanInfo2Mysql")
  255. if mysqlMag != nil {
  256. mysqlMag.mysqlUpdatePool.Release()
  257. }
  258. return
  259. }
  260. go func() {
  261. defer func() {
  262. if mysqlMag != nil {
  263. mysqlMag.mysqlUpdatePool.Release()
  264. }
  265. //打印奔溃信息
  266. if err := recover(); err != nil {
  267. util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
  268. }
  269. }()
  270. var err error = nil
  271. updateRole := &RoleTable{}
  272. if banTime > 0 {
  273. if banType == 1 {
  274. tmpBanTime := util.GetTimeByUint64(banTime * 1000)
  275. updateRole.Ban_date = tmpBanTime
  276. } else if banType == 2 {
  277. tmpBanTime := util.GetTimeByUint64(banTime * 1000)
  278. updateRole.Ban_chat_date = tmpBanTime
  279. }
  280. err = service.GetMysqlORM().DbConnORM().Model(&RoleTable{}).Where("uid = ? ", uid).Updates(updateRole).Error
  281. } else {
  282. if banType == 1 {
  283. err = service.GetMysqlORM().DbConnORM().Model(&RoleTable{}).Where("uid = ? ", uid).Updates(
  284. map[string]interface{}{
  285. "ban_date": nil,
  286. }).Error
  287. } else if banType == 2 {
  288. err = service.GetMysqlORM().DbConnORM().Model(&RoleTable{}).Where("uid = ? ", uid).Updates(
  289. map[string]interface{}{
  290. "ban_chat_date": nil,
  291. }).Error
  292. }
  293. }
  294. //err := service.GetMysqlORM().DbConnORM().Error
  295. if err != nil {
  296. util.ErrorF("uid=%v DoUpdatePlayerBanInfo2Mysql err=%v", uid, err)
  297. }
  298. //util.InfoF("doUpdatePlayerBanInfo2Mysql start...")
  299. //util.InfoF("doUpdatePlayerBanInfo2Mysql end...")
  300. }()
  301. }
  302. func UpdatePlayerChatMsg2Mysql(uid, targetUid uint64, msgType int32, content *serverproto.ChatMessageInfo) {
  303. MysqlUpdateMag.dataLock.Lock()
  304. MysqlUpdateMag.mysqlChatInfoList = append(MysqlUpdateMag.mysqlChatInfoList, &mysqlChatInfo{
  305. uid: uid,
  306. targetUid: targetUid,
  307. msgType: msgType,
  308. content: content,
  309. })
  310. MysqlUpdateMag.dataLock.Unlock()
  311. }
  312. func doUpdatePlayerChatMsg2MysqlORM(mysqlMag *MysqlUpdateManager, chatList *[]*mysqlChatInfo) {
  313. if service.GetMysqlORM() == nil {
  314. util.ErrorF("mysql connector invalid UpdatePlayerChatMsg2Mysql")
  315. mysqlMag.mysqlUpdatePool.Release()
  316. return
  317. }
  318. go func() {
  319. defer func() {
  320. mysqlMag.mysqlUpdatePool.Release()
  321. //打印奔溃信息
  322. if err := recover(); err != nil {
  323. util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
  324. }
  325. }()
  326. for idx := 0; idx < len(*chatList); idx++ {
  327. chatInfo := (*chatList)[idx]
  328. tmpSendTime := util.GetTimeByUint64(chatInfo.content.SendTime)
  329. saveRoleMsg := &RoleMsgTable{
  330. Uid: chatInfo.uid,
  331. Msg_type: chatInfo.msgType,
  332. Content: string(chatInfo.content.Message),
  333. Msg_date: tmpSendTime,
  334. Target_uid: chatInfo.targetUid,
  335. }
  336. err := service.GetMysqlORM().DbConnORM().Create(saveRoleMsg).Error
  337. //err := service.GetMysqlORM().DbConnORM().Error
  338. if err != nil {
  339. util.ErrorF("uid=%v doUpdatePlayerChatMsg2MysqlORM err=%v", chatInfo.uid, err)
  340. }
  341. }
  342. }()
  343. }
  344. func UpdatePlayerLog2Mysql(logList []*serverproto.SSRoleLogData) {
  345. MysqlUpdateMag.dataLock.Lock()
  346. MysqlUpdateMag.mysqlLogInfoList = append(MysqlUpdateMag.mysqlLogInfoList, logList...)
  347. MysqlUpdateMag.dataLock.Unlock()
  348. }
  349. func doUpdatePlayerLog2MysqlORM(mysqlMag *MysqlUpdateManager, logList *[]*serverproto.SSRoleLogData) {
  350. if service.GetMysqlORM() == nil {
  351. util.ErrorF("mysql connector invalid UpdatePlayerLog2Mysql")
  352. mysqlMag.mysqlUpdatePool.Release()
  353. return
  354. }
  355. go func() {
  356. defer func() {
  357. mysqlMag.mysqlUpdatePool.Release()
  358. //打印奔溃信息
  359. if err := recover(); err != nil {
  360. util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
  361. }
  362. }()
  363. now := util.GetCurrentTimeNow()
  364. for idx := 0; idx < len(*logList); idx++ {
  365. logData := (*logList)[idx]
  366. var err error = nil
  367. switch (serverproto.MysqlLogType)(logData.Type) {
  368. case serverproto.MysqlLogType_LType_OnlineNum: //服务器当前在线人数
  369. saveOnlineTableData := &ServerOnlineLog{
  370. Server_id: logData.ParamList[0],
  371. Server_sub_id: logData.ParamList[1],
  372. Online_num: logData.ParamList[2],
  373. Log_date: now,
  374. }
  375. err = service.GetMysqlORM().DbConnORM().Create(saveOnlineTableData).Error
  376. case serverproto.MysqlLogType_LType_OrderList: //充值订单信息(玩家成功领取奖励)
  377. saveOrderTableData := &RoleOrderList{
  378. Uid: logData.Uid,
  379. Rmb: logData.ParamList[0],
  380. Goods_type: logData.ParamList[1],
  381. Goods_id: logData.ParamList[2],
  382. Order_id: logData.Param64List[0],
  383. Order_date: util.GetTimeByUint64(logData.Param64List[1]),
  384. }
  385. if len(logData.StrList) > 0 {
  386. saveOrderTableData.Sdk_order_id = logData.StrList[0]
  387. }
  388. rewardStr := ""
  389. for k := 0; k < len(logData.RewardList); k++ {
  390. kvVal := logData.RewardList[k]
  391. if k == 0 {
  392. rewardStr += strconv.Itoa(int(kvVal.Key)) + ":" + strconv.Itoa(int(kvVal.Value))
  393. } else {
  394. rewardStr += ";" + strconv.Itoa(int(kvVal.Key)) + ":" + strconv.Itoa(int(kvVal.Value))
  395. }
  396. }
  397. saveOrderTableData.Reward_list = rewardStr
  398. util.InfoF("uid=%v sdkorderid=%v rmb=%v", logData.Uid, saveOrderTableData.Sdk_order_id, saveOrderTableData.Rmb)
  399. err = service.GetMysqlORM().DbConnORM().Create(saveOrderTableData).Error
  400. default:
  401. saveLogTableData := &RoleLogTable{
  402. Uid: logData.Uid,
  403. Type: logData.Type,
  404. Sub_type: logData.SubType,
  405. Log_date: now,
  406. }
  407. if len(logData.ParamList) == 4 {
  408. saveLogTableData.Old_val = uint64(logData.ParamList[0])
  409. saveLogTableData.New_val = uint64(logData.ParamList[1])
  410. saveLogTableData.Delta_val = uint64(logData.ParamList[2])
  411. saveLogTableData.Param = logData.ParamList[3]
  412. } else if len(logData.ParamList) == 3 {
  413. saveLogTableData.Old_val = uint64(logData.ParamList[0])
  414. saveLogTableData.New_val = uint64(logData.ParamList[1])
  415. saveLogTableData.Delta_val = uint64(logData.ParamList[2])
  416. } else {
  417. if len(logData.ParamList) == 1 {
  418. saveLogTableData.Delta_val = uint64(logData.ParamList[0])
  419. } else {
  420. //写入设备号和IP
  421. paramStr := ""
  422. for k := 0; k < len(logData.StrList); k++ {
  423. paramStr += logData.StrList[k]
  424. if k > 0 && k < len(logData.StrList)-1 {
  425. paramStr += ";"
  426. }
  427. }
  428. saveLogTableData.Strparam = paramStr
  429. }
  430. }
  431. err = service.GetMysqlORM().DbConnORM().Create(saveLogTableData).Error
  432. }
  433. if err != nil {
  434. util.ErrorF("doUpdatePlayerLog2MysqlORM err=%v", err)
  435. }
  436. }
  437. //
  438. //err := service.GetMysqlORM().DbConnORM().Error
  439. //if err != nil {
  440. //
  441. //}
  442. //util.InfoF("doUpdatePlayerLog2Mysql start...")
  443. //util.InfoF("doUpdatePlayerLog2Mysql end...")
  444. }()
  445. }