local _M = {} local serverId = tonumber(skynet.getenv("servId")) function _M.rechargeRpc(agent , data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local dataSet = csvdb["shop_rechargeCsv"][id] local roleId = role:getProperty("id") if not dataSet then return end --创建订单号 local orderId = redisproxy:hincrby("autoincrement_set", "order", 1) local partnerOrderId = string.format("%d_%d_%d", serverId, roleId, orderId) local orderKey = string.format("order:%d:%d", roleId, orderId) redisproxy:del(orderKey) local order = require("models.Order").new({ key = orderKey, order = partnerOrderId, rechargeId = dataSet.id }) order:create() redisproxy:sadd(string.format("role:%d:orders", roleId), partnerOrderId) -- 暂时忽略心跳检查 role.ignoreHeartbeat = true SendPacket(actionCodes.Store_rechargeRpc, MsgPack.pack({ order = partnerOrderId })) return true end function _M.purchaseOrderResult(agent, data) local role = agent.role local roleId = role:getProperty("id") local msg = MsgPack.unpack(data) role.ignoreHeartbeat = false local partnerOrderStr = msg.order local _, _, orderId = string.match(partnerOrderStr, "(.+)_(.+)_(.+)") local orderObject = require("models.Order").new({ key = string.format("order:%d:%d", roleId, orderId) }) if not orderObject:load() then -- 订单不存在 skynet.error("cancelPurchaseRpc", string.format("order %s not exist", partnerOrderStr)) return true end if msg.status == "success" then orderObject:setProperty("transactionId", msg.platformOrder or "") return true end if orderObject:getProperty("finishTime") > 0 then return true end orderObject:setProperty("status", msg.status) redisproxy:srem(string.format("role:%d:orders", roleId), partnerOrderStr) return true end function _M.dailyBuyRpc(agent , data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local count = msg.count or 1 local dataSet = csvdb["shop_diamondCsv"][id] if not dataSet then return 1 end local dailySDC = role.dailyData:getProperty("dailySDC") if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (dailySDC[id] or 0))) then return 1 end local cost = dataSet.cost local dailySDD = role.dailyData:getProperty("dailySDD") if dailySDD[id] then -- 折扣 cost = math.ceil(cost * (1 - dataSet.disount / 100)) end if not role:costDiamond({count = cost * count, log = {desc = "dailyShop", int1 = id, int2 = count}}) then return 4 end if dataSet.limit ~= 0 then dailySDC[id] = (dailySDC[id] or 0) + count role.dailyData:updateProperty({field = "dailySDC", value = dailySDC}) end local gift = {} for itemId, count_ in pairs(dataSet.gift:toNumMap()) do gift[itemId] = count_ * count end local reward = role:award(gift, {log = {desc = "dailyShop", int1 = id, int2 = count}}) role:log("role_action", {desc = "dailyShop", int1 = id, int2 = count}) SendPacket(actionCodes.Store_dailyBuyRpc, MsgPack.pack({reward = reward})) return true end function _M.dinerBuyRpc(agent , data) local role = agent.role local msg = MsgPack.unpack(data) local id = msg.id local count = msg.count or 1 local dataSet = csvdb["shop_dinerCsv"][id] if not dataSet then return end local dinerS = role:getProperty("dinerS") if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (dinerS[id] or 0))) then return 1 end local cost = {[ItemId.DinerCoin] = dataSet.cost} if not role:checkItemEnough(cost) then return end if dataSet.limit ~= 0 then dinerS[id] = (dinerS[id] or 0) + count role:updateProperty({field = "dinerS", value = dinerS}) end role:costItems(cost, {log = {desc = "dinerShop", int1 = id, int2 = count}}) local gift = {} for _id, _count in pairs(dataSet.gift:toNumMap()) do gift[_id] = _count * count end local reward = role:award(gift, {log = {desc = "dinerShop", int1 = id, int2 = count}}) role:log("role_action", {desc = "dinerShop", int1 = id, int2 = count}) SendPacket(actionCodes.Store_dinerBuyRpc, MsgPack.pack({reward = reward})) return true end return _M