player_exchange.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. package mapPlayer
  2. import (
  3. actorRemote "f1-game/internal/actor_remote"
  4. "f1-game/internal/code"
  5. "f1-game/internal/component/redis"
  6. "f1-game/internal/constant"
  7. "f1-game/internal/data"
  8. "f1-game/internal/enum"
  9. nameLocal "f1-game/internal/name/local"
  10. nameRemote "f1-game/internal/name/remote"
  11. "f1-game/internal/pb"
  12. "f1-game/internal/types"
  13. ao "f1-game/nodes/game/player/asset/origin"
  14. mapCall "f1-game/nodes/map/internal/call"
  15. "f1-game/nodes/map/internal/db"
  16. mapFacade "f1-game/nodes/map/internal/facade"
  17. "f1-game/nodes/map/player/exchange"
  18. cstring "github.com/cherry-game/cherry/extend/string"
  19. cproto "github.com/cherry-game/cherry/net/proto"
  20. )
  21. func (p *actorPlayer) initExchange() {
  22. p.Local().Register(nameLocal.MapPlayer_ExchangeSlotUnlock, p.exchangeSlotUnlock)
  23. p.Local().Register(nameLocal.MapPlayer_ExchangeHistoryPrice, p.exchangeHistoryPrice)
  24. p.Local().Register(nameLocal.MapPlayer_ExchangeItem, p.exchangeItem)
  25. p.Local().Register(nameLocal.MapPlayer_ExchangeBuyItem, p.exchangeBuyItem)
  26. p.Local().Register(nameLocal.MapPlayer_ExchangeQuery, p.exchangeQuery)
  27. p.Local().Register(nameLocal.MapPlayer_ExchangeMyItems, p.exchangeMyItems)
  28. p.Local().Register(nameLocal.MapPlayer_ExchangeItemUpdate, p.exchangeItemUpdate)
  29. p.Local().Register(nameLocal.MapPlayer_ExchangeLog, p.exchangeLog)
  30. p.Remote().Register(nameRemote.MapPlayerExchange_ItemDeliver, p.exchangeItemDeliver)
  31. p.Remote().Register(nameRemote.MapPlayerExchange_ItemRetrieve, p.exchangeItemRetrieve)
  32. p.Remote().Register(nameRemote.MapPlayerExchange_ItemCanceled, p.exchangeBuyItemCanceled)
  33. p.Remote().Register(nameRemote.MapPlayerExchange_ItemRemove, p.exchangeBuyItemRemove)
  34. }
  35. // 交易所货柜解锁
  36. func (p *actorPlayer) exchangeSlotUnlock(session *cproto.Session, req *pb.I32) {
  37. actType := enum.ExchangeActType(req.Value)
  38. if !enum.IsExchangeActType(actType) {
  39. p.ResponseCode(session, code.IllegalArgument)
  40. return
  41. }
  42. exchangeSlotRow, found := data.ExchangeSlot.GetBySlotTypeExchangeType(actType, enum.ExchangeType_Map)
  43. if !found {
  44. p.ResponseCode(session, code.ConfigNotFound_ExchangeSlot)
  45. return
  46. }
  47. playerTable := db.GetMapPlayerTable(p.playerID)
  48. switch actType {
  49. case enum.ExchangeActType_Sell:
  50. {
  51. nowCount := playerTable.Exchange.SellingUnlockedSlots
  52. if int(nowCount) >= len(exchangeSlotRow.Cost) {
  53. p.ResponseCode(session, code.ExchangeSlotSellMaxLimit)
  54. return
  55. }
  56. unlockCost := exchangeSlotRow.Cost[nowCount]
  57. if unlockCost.ID > 0 && unlockCost.Num > 0 {
  58. // 检查解锁消耗是否足够,只判断非地图的资源
  59. assets := types.Assets{unlockCost}
  60. if _, errCode := actorRemote.GamePlayer.AssetSub(playerTable.GameNodeID, p.playerID, assets, ao.ExchangeSellUnlockCost); code.IsFail(errCode) {
  61. p.ResponseCode(session, errCode)
  62. return
  63. }
  64. }
  65. // 增加出售货柜解锁数量
  66. playerTable.Exchange.SellingUnlockedSlots++
  67. playerTable.Save2Queue()
  68. p.Debug("exchangeSlotUnlock success. actType %v, sellingUnlockedSlots [%d->%d]", actType, nowCount, playerTable.Exchange.SellingUnlockedSlots)
  69. p.Response(session, &pb.I32I32{
  70. Key: int32(actType),
  71. Value: playerTable.Exchange.SellingUnlockedSlots,
  72. })
  73. }
  74. case enum.ExchangeActType_Wish:
  75. {
  76. nowCount := playerTable.Exchange.WishingUnlockedSlots
  77. if int(nowCount) >= len(exchangeSlotRow.Cost) {
  78. p.ResponseCode(session, code.ExchangeSlotWishMaxLimit)
  79. return
  80. }
  81. unlockCost := exchangeSlotRow.Cost[nowCount]
  82. if unlockCost.ID > 0 && unlockCost.Num > 0 {
  83. // 检查解锁消耗是否足够,只判断非地图的资源
  84. assets := types.Assets{unlockCost}
  85. if _, errCode := actorRemote.GamePlayer.AssetSub(playerTable.GameNodeID, p.playerID, assets, ao.ExchangeWishUnlockCost); code.IsFail(errCode) {
  86. p.ResponseCode(session, errCode)
  87. return
  88. }
  89. }
  90. // 增加求购货柜解锁数量
  91. playerTable.Exchange.WishingUnlockedSlots++
  92. playerTable.Save2Queue()
  93. p.Debug("exchangeSlotUnlock success. actType %v, buyingUnlockedSlots [%d->%d]", actType, nowCount, playerTable.Exchange.WishingUnlockedSlots)
  94. p.Response(session, &pb.I32I32{
  95. Key: int32(actType),
  96. Value: playerTable.Exchange.WishingUnlockedSlots,
  97. })
  98. }
  99. }
  100. }
  101. // 获取物品的历史求购价格
  102. func (p *actorPlayer) exchangeHistoryPrice(session *cproto.Session, req *pb.I32) {
  103. itemID := req.Value
  104. if itemID < 1 {
  105. p.ResponseCode(session, code.IllegalArgument)
  106. return
  107. }
  108. if !data.ExchangeGoods.ContainID(itemID) {
  109. p.ResponseCode(session, code.ConfigNotFound_ExchangeGoods)
  110. return
  111. }
  112. historyPrices, errCode := mapCall.Exchange.HistoryPrice(itemID)
  113. if code.IsFail(errCode) {
  114. p.ResponseCode(session, errCode)
  115. return
  116. }
  117. p.Response(session, historyPrices)
  118. p.Debug("exchangeHistoryPrice success. itemID %d, historyPrices %v", itemID, historyPrices)
  119. }
  120. // 出售或求购资源和材料
  121. func (p *actorPlayer) exchangeItem(session *cproto.Session, req *pb.ExchangeItem) {
  122. var (
  123. actType = enum.ExchangeActType(req.ActType)
  124. assetProto = req.Asset
  125. price = req.Price
  126. )
  127. if !enum.IsExchangeActType(actType) {
  128. p.ResponseCode(session, code.IllegalArgument)
  129. return
  130. }
  131. if assetProto == nil || assetProto.Id < 1 || assetProto.Num < 1 || price < 1 {
  132. p.ResponseCode(session, code.IllegalArgument)
  133. return
  134. }
  135. exchangeGoodsRow, found := data.ExchangeGoods.GetByID(assetProto.Id)
  136. if !found {
  137. p.ResponseCode(session, code.ConfigNotFound_ExchangeGoods)
  138. return
  139. }
  140. if exchangeGoodsRow.ExchangeType != enum.ExchangeType_Map {
  141. p.ResponseCode(session, code.IllegalArgument)
  142. return
  143. }
  144. // 地图交易所只交易资源类型的商品
  145. if exchangeGoodsRow.ItemType != enum.ExchangeItemType_Resource {
  146. p.ResponseCode(session, code.IllegalArgument)
  147. return
  148. }
  149. // 不允许交易非地图资源
  150. if !enum.IsMapCurrency(assetProto.Id) {
  151. p.ResponseCode(session, code.ExchangeItemConfigError)
  152. return
  153. }
  154. // 交易最低手续费不能低于单价
  155. if exchangeGoodsRow.MinFee > exchangeGoodsRow.MinPrice {
  156. p.ResponseCode(session, code.ExchangeMinFeeConfigError)
  157. return
  158. }
  159. // 判断物品的单价是否合法
  160. if price < exchangeGoodsRow.MinPrice || price > exchangeGoodsRow.MaxPrice {
  161. p.ResponseCode(session, code.ExchangeItemPriceIllegal)
  162. return
  163. }
  164. var (
  165. mapPlayerTable = db.GetMapPlayerTable(p.playerID)
  166. playerExchangeItem = &pb.PlayerExchangeItem{
  167. PlayerID: p.playerID,
  168. GameNodeID: mapPlayerTable.GameNodeID,
  169. ItemInfo: req,
  170. }
  171. )
  172. switch actType {
  173. case enum.ExchangeActType_Sell:
  174. // 判断交易数量是否合法
  175. if assetProto.Num < int64(exchangeGoodsRow.MinCount) ||
  176. assetProto.Num > int64(exchangeGoodsRow.MaxCount) {
  177. p.ResponseCode(session, code.ExchangeItemQtyIllegal)
  178. return
  179. }
  180. if !mapPlayerTable.Exchange.IsSlotsEnough(actType) {
  181. p.ResponseCode(session, code.ExchangeSlotSellNotEnough)
  182. return
  183. }
  184. // 数量单位
  185. unitQty := exchangeGoodsRow.UnitQty
  186. // 总数量
  187. sumCount := assetProto.Num * int64(unitQty)
  188. // 出售就判断自身是否有足够的物品
  189. if !mapFacade.Storage.IsEnough(p.playerID, assetProto.Id, sumCount) {
  190. p.ResponseCode(session, code.ExchangeCountNotEnough)
  191. return
  192. }
  193. retExchangeDetail, errCode := mapCall.Exchange.ExchangeItem(playerExchangeItem)
  194. if code.IsFail(errCode) {
  195. p.ResponseCode(session, errCode)
  196. return
  197. }
  198. mapPlayerTable.Exchange.Sells.Add(retExchangeDetail.TransactionID)
  199. mapPlayerTable.Save2Queue()
  200. // 扣除物品
  201. mapFacade.Storage.AssetSubOne(p.playerID, assetProto.Id, sumCount, ao.ExchangeSellItemCost, true)
  202. p.Response(session, retExchangeDetail)
  203. p.Debug("exchangeItem success. transID [%s]", retExchangeDetail.TransactionID)
  204. case enum.ExchangeActType_Wish:
  205. if !mapPlayerTable.Exchange.IsSlotsEnough(actType) {
  206. p.ResponseCode(session, code.ExchangeSlotWishNotEnough)
  207. return
  208. }
  209. // 计算总价
  210. sumPrice := int64(price) * assetProto.Num
  211. var (
  212. asset = types.NewAsset(exchangeGoodsRow.ItemID, sumPrice)
  213. assets = types.Assets{&asset}
  214. )
  215. // 求购就判断自身是否有足够的交易道具
  216. if errCode := actorRemote.GamePlayer.AssetCheck(mapPlayerTable.GameNodeID, p.playerID, assets); code.IsFail(errCode) {
  217. p.ResponseCode(session, errCode)
  218. return
  219. }
  220. // 判断每日求购次数是否已达上限, 如果已达上限则标记为已达上限,不进行匹配
  221. if mapPlayerTable.Exchange.DailyWishCount >= data.Const.ExchangeDailyWishLimit {
  222. playerExchangeItem.IsWishLimit = true
  223. }
  224. retExchangeDetail, errCode := mapCall.Exchange.ExchangeItem(playerExchangeItem)
  225. if code.IsFail(errCode) {
  226. p.ResponseCode(session, errCode)
  227. return
  228. }
  229. mapPlayerTable.Exchange.Wishs.Add(retExchangeDetail.TransactionID)
  230. mapPlayerTable.Save2Queue()
  231. // 扣除求购消耗
  232. if _, errCode := actorRemote.GamePlayer.AssetSub(mapPlayerTable.GameNodeID, p.playerID, assets, ao.ExchangeWishItemCost); code.IsFail(errCode) {
  233. p.Warn("exchangeItem AssetSub errCode [%d], transID [%s]", errCode, retExchangeDetail.TransactionID)
  234. p.ResponseCode(session, errCode)
  235. return
  236. }
  237. p.Response(session, retExchangeDetail)
  238. p.Debug("exchangeItem success. transID [%s]", retExchangeDetail.TransactionID)
  239. }
  240. }
  241. // 购买物品
  242. func (p *actorPlayer) exchangeBuyItem(session *cproto.Session, req *pb.I32Str) {
  243. var (
  244. transID = req.Value // 交易流水号
  245. count = req.Key // 数量
  246. )
  247. if cstring.IsBlank(transID) || count < 1 {
  248. p.ResponseCode(session, code.IllegalArgument)
  249. return
  250. }
  251. mapPlayerTable := db.GetMapPlayerTable(p.playerID)
  252. // 判断是不是自己的交易流水号
  253. if mapPlayerTable.Exchange.IsOwnTransaction(transID) {
  254. p.ResponseCode(session, code.IllegalArgument)
  255. return
  256. }
  257. // 判断每日购买次数是否已达上限
  258. if mapPlayerTable.Exchange.DailyBuyCount >= data.Const.ExchangeDailyBuyLimit {
  259. p.ResponseCode(session, code.ExchangeDailyBuyCountLimit)
  260. return
  261. }
  262. buyReq := &pb.PlayerExchangeBuyItem{
  263. PlayerID: p.playerID,
  264. GameNodeID: mapPlayerTable.GameNodeID,
  265. TransID: transID,
  266. Count: int64(count),
  267. }
  268. retResult, errCode := mapCall.Exchange.BuyItem(buyReq)
  269. if code.IsFail(errCode) {
  270. p.ResponseCode(session, errCode)
  271. return
  272. }
  273. if code.IsOK(retResult.Code) {
  274. // 记录每日购买次数
  275. mapPlayerTable.Exchange.DailyBuyCount++
  276. mapPlayerTable.Save2Queue()
  277. p.Debug("exchangeBuyItem success. transID [%s], count [%d]", transID, count)
  278. }
  279. p.Response(session, retResult)
  280. }
  281. // 根据条件查询地图交易所的商品列表
  282. func (p *actorPlayer) exchangeQuery(session *cproto.Session, req *pb.ExchangeQueryFilter) {
  283. pageNum := req.PageNum // 页数
  284. if pageNum < 1 {
  285. p.ResponseCode(session, code.IllegalArgument)
  286. return
  287. }
  288. itemDetails, errCode := mapCall.Exchange.QueryItem(req)
  289. if code.IsFail(errCode) {
  290. p.ResponseCode(session, errCode)
  291. return
  292. }
  293. p.Response(session, itemDetails)
  294. p.Debug("exchangeQuery success. itemDetail len [%d]", len(itemDetails.List))
  295. }
  296. // 获取自己的商品信息
  297. func (p *actorPlayer) exchangeMyItems(session *cproto.Session, req *pb.I32) {
  298. actType := enum.ExchangeActType(req.Value)
  299. if !enum.IsExchangeActType(actType) {
  300. p.ResponseCode(session, code.IllegalArgument)
  301. return
  302. }
  303. mapPlayerTable := db.GetMapPlayerTable(p.playerID)
  304. rsp := &pb.MyExchangeItems{
  305. ActType: req.Value,
  306. UnlockedSlots: mapPlayerTable.Exchange.GetUnlockSlots(actType),
  307. }
  308. transIDList := mapPlayerTable.Exchange.GetItemsByActType(actType)
  309. if transIDList.IsEmpty() {
  310. p.Response(session, rsp)
  311. return
  312. }
  313. retItemList, errCode := mapCall.Exchange.MyItems(p.playerID, actType, transIDList)
  314. if code.IsFail(errCode) {
  315. p.ResponseCode(session, errCode)
  316. return
  317. }
  318. rsp.List = retItemList.List
  319. p.Response(session, rsp)
  320. p.Debug("exchangeMyItems success. actType [%d], itemList [%+v]", actType, transIDList)
  321. }
  322. // 手动更新商品状态,包括下架,重新下架,取回
  323. func (p *actorPlayer) exchangeItemUpdate(session *cproto.Session, req *pb.I32Str) {
  324. var (
  325. updateType = enum.ExchangeUpdateType(req.Key) // 更新类型
  326. transID = req.Value // 流水号
  327. )
  328. if !enum.IsExchangeUpdateType(updateType) {
  329. p.ResponseCode(session, code.IllegalArgument)
  330. return
  331. }
  332. if cstring.IsBlank(transID) {
  333. p.ResponseCode(session, code.IllegalArgument)
  334. return
  335. }
  336. mapPlayerTable := db.GetMapPlayerTable(p.playerID)
  337. actType := mapPlayerTable.Exchange.GetActTypeByTransID(transID)
  338. if actType == 0 {
  339. p.ResponseCode(session, code.ExchangeItemNotFound)
  340. return
  341. }
  342. // 是否已达每日求购次数上限做一个标记
  343. isWishLimit := false
  344. if updateType == enum.ExchangeUpdateType_ReList {
  345. // 判断每日求购次数是否已达上限, 如果已达上限则标记为已达上限,不进行匹配
  346. if mapPlayerTable.Exchange.DailyWishCount >= data.Const.ExchangeDailyWishLimit {
  347. isWishLimit = true
  348. }
  349. }
  350. errCode := mapCall.Exchange.ItemUpdate(p.playerID, updateType, actType, transID, isWishLimit)
  351. if code.IsFail(errCode) {
  352. p.ResponseCode(session, errCode)
  353. return
  354. }
  355. // 只有取回需要删除记录
  356. if updateType == enum.ExchangeUpdateType_Retrieve {
  357. switch actType {
  358. case enum.ExchangeActType_Wish:
  359. mapPlayerTable.Exchange.Wishs.RemoveValue(transID)
  360. case enum.ExchangeActType_Sell:
  361. mapPlayerTable.Exchange.Sells.RemoveValue(transID)
  362. }
  363. mapPlayerTable.Save2Queue()
  364. }
  365. p.ResponseCode(session, code.OK)
  366. p.Debug("exchangeItemUpdate success. updateType [%d], transID [%s]", updateType, transID)
  367. }
  368. // 获取交易日志
  369. func (p *actorPlayer) exchangeLog(session *cproto.Session, req *pb.I32I64) {
  370. var (
  371. logType = enum.ExchangeLogType(req.Key) // 交易日志类型
  372. lastLogID = req.Value // 最近的日志ID
  373. )
  374. if lastLogID < 0 {
  375. p.ResponseCode(session, code.IllegalArgument)
  376. return
  377. }
  378. if !enum.IsExchangeLogType(logType) {
  379. p.ResponseCode(session, code.IllegalArgument)
  380. return
  381. }
  382. logList := redis.Game.GetMapExchangeLogList(p.App().NodeID(), p.playerID, logType, lastLogID)
  383. if logList == nil {
  384. p.Response(session, &pb.ExchangeLogList{})
  385. return
  386. }
  387. p.Response(session, logList)
  388. p.Debug("exchangeLog success. logType [%d], lastLogID [%d], logList size [%d]", logType, lastLogID, len(logList.List))
  389. }
  390. // 发货接口
  391. func (p *actorPlayer) exchangeItemDeliver(req *pb.PlayerExchangeItemDeliver) {
  392. // 自己是买方
  393. if req.IsBuyer {
  394. exchange.Service().DeliverToBuyer(p.playerID, req)
  395. } else { // 自己是卖方
  396. exchange.Service().DeliverToSeller(p.playerID, req)
  397. }
  398. }
  399. // 取回
  400. func (p *actorPlayer) exchangeItemRetrieve(req *pb.ExchangeDetail) {
  401. var (
  402. actType = enum.ExchangeActType(req.ActType)
  403. transID = req.TransactionID
  404. mapPlayerTable = db.GetMapPlayerTable(p.playerID)
  405. asset = req.Asset
  406. exchangeGoodsRow, _ = data.ExchangeGoods.GetByID(asset.Id)
  407. )
  408. switch actType {
  409. case enum.ExchangeActType_Sell:
  410. {
  411. // 数量单位
  412. unitQty := exchangeGoodsRow.UnitQty
  413. // 总数量
  414. sumCount := asset.Num * int64(unitQty)
  415. // 返还出售资源
  416. mapFacade.Storage.AssetAddOne(p.playerID, asset.Id, sumCount, ao.ExchangeItemSellRetrieve, true)
  417. // 删除出售关联数据
  418. mapPlayerTable.Exchange.Sells.RemoveValue(transID)
  419. mapPlayerTable.Save2Queue()
  420. mailParams := []string{
  421. cstring.ToString(asset.Id),
  422. cstring.ToString(sumCount),
  423. }
  424. actorRemote.GameMail.SendMail(mapPlayerTable.GameNodeID, p.playerID, constant.MailID_MapExchangeRetrieve, nil, mailParams)
  425. p.Debug("exchangeItemRetrieve success. transID [%s], asset [%+v], sumCount [%d]", transID, asset, sumCount)
  426. }
  427. case enum.ExchangeActType_Wish:
  428. {
  429. // 交易物品ID
  430. itemID := exchangeGoodsRow.ItemID
  431. // 单价
  432. itemPrice := req.Price
  433. // 总价
  434. sumItemPrice := asset.Num * int64(itemPrice)
  435. wishAssets := types.Assets{}
  436. wishAssets.Add(itemID, int64(sumItemPrice))
  437. // 返还求购资源
  438. actorRemote.GamePlayer.AssetAddAsync(mapPlayerTable.GameNodeID, p.playerID, wishAssets, ao.ExchangeItemWishRetrieve)
  439. // 删除求购关联数据
  440. mapPlayerTable.Exchange.Wishs.RemoveValue(transID)
  441. mapPlayerTable.Save2Queue()
  442. mailParams := []string{
  443. cstring.ToString(itemID),
  444. cstring.ToString(sumItemPrice),
  445. }
  446. actorRemote.GameMail.SendMail(mapPlayerTable.GameNodeID, p.playerID, constant.MailID_MapExchangeWishCancel, nil, mailParams)
  447. p.Debug("exchangeItemRetrieve success. transID [%s], wishAssets [%+v]", transID, wishAssets)
  448. }
  449. }
  450. }
  451. // 系统通知商品下架
  452. func (p *actorPlayer) exchangeBuyItemCanceled(req *pb.ExchangeDetail) {
  453. var (
  454. actType = enum.ExchangeActType(req.ActType)
  455. mapPlayerTable = db.GetMapPlayerTable(p.playerID)
  456. asset = req.Asset
  457. exchangeGoodsRow, _ = data.ExchangeGoods.GetByID(asset.Id)
  458. )
  459. // 求购需要发邮件通知
  460. if actType == enum.ExchangeActType_Wish {
  461. // 求购总数量
  462. sumCount := asset.Num * int64(exchangeGoodsRow.UnitQty)
  463. mailParams := []string{
  464. cstring.ToString(asset.Id),
  465. cstring.ToString(sumCount),
  466. }
  467. actorRemote.GameMail.SendMail(mapPlayerTable.GameNodeID, p.playerID, constant.MailID_MapExchangeWishTimeout, nil, mailParams)
  468. }
  469. p.Debug("exchangeBuyItemCanceled success. actType [%d] transID [%s]", actType, req.TransactionID)
  470. }
  471. // 同步删除交易流水号
  472. func (p *actorPlayer) exchangeBuyItemRemove(req *pb.I32Str) {
  473. var (
  474. transID = req.Value
  475. actType = enum.ExchangeActType(req.Key)
  476. mapPlayerTable = db.GetMapPlayerTable(p.playerID)
  477. )
  478. switch actType {
  479. case enum.ExchangeActType_Sell:
  480. mapPlayerTable.Exchange.Sells.RemoveValue(transID)
  481. mapPlayerTable.Save2Queue()
  482. case enum.ExchangeActType_Wish:
  483. mapPlayerTable.Exchange.Wishs.RemoveValue(transID)
  484. mapPlayerTable.Save2Queue()
  485. }
  486. p.Debug("exchangeBuyItemRemove success. actType [%d], transID [%s]", actType, transID)
  487. }