Просмотр исходного кода

跨服商业活动排行榜、任务 和事件触发

SCFC 1 год назад
Родитель
Сommit
bee60401e6
38 измененных файлов с 3679 добавлено и 1102 удалено
  1. 20 1
      script/common/CommonDB.lua
  2. 21 5
      script/common/CommonDefine.lua
  3. 628 628
      script/common/CommonRankDB.lua
  4. 1 0
      script/common/DB.lua
  5. 65 18
      script/common/InnerHandler.lua
  6. 85 22
      script/common/InnerProto.lua
  7. 12 4
      script/common/InnerProtoID.lua
  8. 1 0
      script/common/Log.lua
  9. 1 0
      script/common/LogDefine.lua
  10. 2 0
      script/core/ObjHuman.lua
  11. 108 108
      script/module/WeekendLoopActivity/WeekendLoopActRank.lua
  12. 4 0
      script/module/battle/BattleLogic.lua
  13. 4 0
      script/module/chat/ChatLogic.lua
  14. 4 0
      script/module/drawCard/DrawCardLogic.lua
  15. 3 1
      script/module/friend/FriendLogic.lua
  16. 8 0
      script/module/hero/HeroLogic.lua
  17. 3 0
      script/module/jjc/JjcLogic.lua
  18. 4 0
      script/module/middle/MiddleCommonLogic.lua
  19. 720 0
      script/module/middle/MiddleCommonRank.lua
  20. 1 2
      script/module/middle/MiddleConnect.lua
  21. 1 1
      script/module/role/RoleLogic.lua
  22. 18 8
      script/module/serverCommerce/Handler.lua
  23. 3 2
      script/module/serverCommerce/Proto.lua
  24. 211 0
      script/module/serverCommerce/ServerCommerceActCharge.lua
  25. 15 3
      script/module/serverCommerce/ServerCommerceActDefine.lua
  26. 424 56
      script/module/serverCommerce/ServerCommerceActRank.lua
  27. 233 0
      script/module/serverCommerce/ServerCommerceActShop.lua
  28. 478 0
      script/module/serverCommerce/ServerCommerceActTask.lua
  29. 334 171
      script/module/serverCommerce/ServerCommerceManager.lua
  30. 110 3
      script/module/serverCommerce/ServerCommerceMiddle.lua
  31. 4 1
      script/module/shop/ShopLogic.lua
  32. 5 0
      script/module/treasurechest/TreasureChestLogic.lua
  33. 18 10
      script/module/trigger/TriggerDefine.lua
  34. 116 57
      script/module/trigger/TriggerLogic.lua
  35. 4 0
      script/module/union/UnionTecLogic.lua
  36. 4 1
      script/module/xianzhi/XianzhiLogic.lua
  37. 2 0
      script/module/yunying/YunYingLogic.lua
  38. 4 0
      script/module/zhuanpan/ZhuanpanLogic.lua

+ 20 - 1
script/common/CommonDB.lua

@@ -438,4 +438,23 @@ function SetCommerceActInfo(tData)
 	db.commerceActInfo = tData
 	
 	updateValue(KEY_COMMERCEACT_INFO, db.commerceActInfo)
-end
+end
+
+function GetCommerceActInfo_Point()
+	return db.commerceActInfo.nPoint or 0
+end
+
+function SetCommerceActInfo_Point(nValue)
+	db.commerceActInfo.nPoint = nValue
+	updateValue(KEY_COMMERCEACT_INFO, db.commerceActInfo)
+end
+
+-- 是否发送邮件
+function GetCommerceActInfo_SendServerMail()
+	return db.commerceActInfo.bSendServerMail
+end
+
+function SetCommerceActInfo_SendServerMail(bValue)
+	db.commerceActInfo.bSendServerMail = bValue
+	updateValue(KEY_COMMERCEACT_INFO, db.commerceActInfo)
+end

+ 21 - 5
script/common/CommonDefine.lua

@@ -31,14 +31,30 @@ DISCONNECT_MSG[DISCONNECT_FCM_CHILD] = ""
 DISCONNECT_MSG[DISCONNECT_FCM_HEALTH] = ""
 
 
------------------- 通用排行榜类型定义开始 ---------------------------
-COMMONRANK_TYPE_MIN = 1             -- 最小类型
-COMMONRANK_TYPE_WEEKRANK = 1        -- 周活动排行榜类型
+------------------ 通用排行榜大类型定义开始 ---------------------------
+COMMONRANK_TYPE_MIN = 1                                     -- 最小类型
+COMMONRANK_TYPE_WEEKRANK = 1                                -- 周活动排行榜类型
+COMMONRANK_TYPE_SERVERCOMMERCE = 2                          -- 跨服商业活动排行榜
+COMMONRANK_TYPE_MAX = COMMONRANK_TYPE_SERVERCOMMERCE        -- 最大类型
+------------------ 通用排行榜大类型定义结束 ---------------------------
 
-COMMONRANK_TYPE_MAX = COMMONRANK_TYPE_WEEKRANK            -- 最大类型
------------------- 通用排行榜类型定义结束 ---------------------------
+------------------ 通用排行榜小类型定义开始 ---------------------------
+COMMONRANK_SUB_TYPE_MIN = 1
+COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER   = 1             -- 跨服商业活动排行榜 - 服务器排行
+COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN    = 2             -- 跨服商业活动排行榜 - 个人排行
+COMMONRANK_SUB_TYPE_MAX = 2
+------------------ 通用排行榜小类型定义结束 ---------------------------
 
+------------------ 通用排行榜发送数据长度开始 ---------------------------
+COMMONRANK_SENDPRIZE_LEN = 21                               -- 上榜发送奖励排名数
+COMMONRANK_SAVE_DB_LEN = 50                                 -- 存库玩家长度
+COMMONRANK_ONE_SEND_LEN = 10                                -- 排行榜一次同步数据长度
+------------------ 通用排行榜发送数据长度结束 ---------------------------
 
+------------------ 通用排行榜value值操作定义开始 ---------------------------
+COMMONRANK_VALUE_ADD        = 1                 -- 增加
+COMMONRANK_VALUE_REPLACE    = 2                 -- 替换
+------------------ 通用排行榜value值操作定义结束 ---------------------------
 
 ------------------ 通用奖励领取状态定义开始 ---------------------------
 COMMON_PRIZE_STATE_NOGET        =   0       -- 不可领取

+ 628 - 628
script/common/CommonRankDB.lua

@@ -1,628 +1,628 @@
---------------------------------
--- 文件名       :  CommonRankDB.lua
--- 文件说明     :  通用排行榜DB数据
--- 创建时间     :   2024/12/09
--- 创建人       :   FC
---------------------------------
-
-local Msg = require("core.Msg")
-local Timer = require("core.Timer")
-local DB = require("common.DB")
-local CommonDB = require("common.CommonDB")
-local CommonDefine = require("common.CommonDefine")
-local Log = require("common.Log")
-local LuaMongo = _G.lua_mongo
-local Util = require("common.Util")
-local Grid = require("bag.Grid")
-local OpenAct = require("present.OpenAct")
-local RoleDBLogic = require("role.RoleDBLogic")
-local YunYingLogic = require("yunying.YunYingLogic")
-local MailManager = require("mail.MailManager")
-local MailExcel = require("excel.mail")
-local OpenActExcel = require("excel.openAct")
-local WeekLoopActCof = require("excel.WeekLoopAct")
-local WeekLoopActDef = require("WeekendLoopActivity.WeekendLoopActDefine")
-
---[[
-	开服活动排行DB操作,封装了一些公共处理方法
-    db字段只是缓存排名好的数据(只是内存数据)
-    Coomondb = {
-        [rankType] = {                  -- 排名类型
-            rankType = xxx,             -- 排名类型
-            uuid2rank = {               -- 根据UUID获取名次   
-                [uuid] = rank,          -- 玩家uuid = 排行名次
-                ...
-            },        
-            sendUuid2rank = {           -- 根据UUID获取发送名次
-                [uuid] = rank,          -- 玩家uuid = 真实发送的排行名次
-                ...
-            },
-            rank2data = {               -- 根据名次获取DATA
-                [rank] = {              -- 排行名次 = 玩家排名数据
-                   uuid = xxx,          -- 玩家uuid
-                   rankType = xxx,      -- 排名类型
-                   value = xxx,         -- 排名值
-                   time = xxx,          -- 排名值更新时间
-                   _id = xxx,           -- db记录中的uuid
-                },      
-                ...
-            },
-            sendRank2data = {           -- 根据名次获取发送DATA
-                [rank] = {              -- 排行名次 = 真实发送玩家排名数据
-                   uuid = xxx,          -- 玩家uuid
-                   rankType = xxx,      -- 排名类型
-                   value = xxx,         -- 排名值
-                   time = xxx,          -- 排名值更新时间
-                   _id = xxx,           -- db记录中的uuid
-                },      
-                ...
-            }
-        },
-        ...
-    }
-
-	DB:
-        db_common_rank = {     -- 开服排行类活动
-            [uuid] = {
-                uuid = xxx,             -- 玩家uuid
-                rankType= xxx,          -- 排名类型
-                value = xxx,            -- 排行值
-                time = xxx,             -- 排行值更新时间
-            }
-        }
-	local:
-        CommonDB_GetConfig()              -- 得到指定排名类型的活动配置
-        getMinRankValue()				-- 得到排行榜中最低上榜条件数
-        getMaxRank()				    -- 得到活动最多排名名次
-        getRankNeedValue()			    -- 得到排行榜中名次对应需要达到的条件数
-        getRankInfo()					-- 得到指定排行榜指定名次的配置信息
-        getRewardInfoByRank()           -- 获取奖励信息
-        getBoard()                      -- 获取指定排名类型DB数据
-        getRank()                       -- 获取指定排名类型、指定用户的排名
-        getSendRank()                   -- 获取指定排名类型、指定用户的发送排名
-        cmpRank()                       -- 排名算法
-        updateRank()                    -- 更新排名
-        updateData()                    -- 更新数据
-        loadBoard()                     -- 加载排行榜
-        resertBoard()                   -- 重置排行数据
-        initBoard()                     -- 初始排行榜
-        getDBData()                     -- 根据类型+uuid从db中取data
-        updateDBData()                  -- 更新DB数据
-        billboardSet()                  -- 设置排名数据
-        getMailID()                     -- 获取发送奖励的邮件ID
-        getRewardInfoByInfo()			-- 得到指定排行榜指定配置信息的奖励信息
-        rewardSend()					-- 奖励发送
-        wrapOpenServerRankRewardList    -- 包装档位奖励详情数据
-	public:
-		initAfterStart()			    -- 启动就初始化	
-		getMaxSendRank()				-- 得到最大发送排行名次数据
-		wrapOpenServerRankList()		-- 包装档位名次数据
-		wrapOwnerData()					-- 包装自己名次数据
-        rewardQuery()                   -- 发送奖励详情
-		onValueAdd()					-- 排行值增加回调
-        onValueSet()                    -- 排行值设置回调
-		onRewardSend()					-- 奖励发送回调
---]]
-
-
-WeekAct_RankName = "WeekAct_ChargeRank"
-
-MAX_SEND_RANK = 10						-- 最大发送排名数
-MAX_SEND_WEEKACTRANK = 21               -- 周活动排行榜发送排名数
-
-Coomondb = Coomondb or {}                  			-- [rankType] = board
-CoomonQueryForData = {rankType = 1, uuid = 1} -- 通过排名类型和玩家uuid查找DB数据
-CoomonQueryByUuid = {_id = 1}                 -- 通过DB的uuid更新DB数据
-CoomonQueryByRankType = {rankType = 1}        -- 通过排名类型查找DB数据
-
-
-local function CommonDB_GetConfig(rankType)
-    if CommonDefine.COMMONRANK_TYPE_WEEKRANK == rankType  then
-        return WeekLoopActCof.Rank
-    end
-
-    return nil
-end
-
--- 得到排行榜中最低上榜条件数
-local MIN_RANK_VALUES
-local function getMinRankValue(rankType)
-	MIN_RANK_VALUES = MIN_RANK_VALUES or {}
-	if MIN_RANK_VALUES[rankType] then return MIN_RANK_VALUES[rankType] end
-
-    local tWeekRankConfig = CommonDB_GetConfig(rankType)
-    if not tWeekRankConfig then return end
-
-    -- 这里后续有排行榜类型,保持命名一致
-    local minRankValue
-    for _,info in ipairs(tWeekRankConfig) do
-        if not minRankValue or minRankValue > info.nMoney then 
-            minRankValue = info.nMoney
-        end
-    end
-
-	MIN_RANK_VALUES[rankType] = minRankValue
-	return MIN_RANK_VALUES[rankType]
-end
-
---local MAX_RANKS
-local function getMaxRank(rankType)
-    return 200
-end
-
- -- 得到排行榜中名次对应需要达到的条件数
-local RANK_NEED_VALUES
-local function getRankNeedValue(rankType, rank)
-	RANK_NEED_VALUES = RANK_NEED_VALUES or {}
-
-	local minRankValue = getMinRankValue(rankType)
-	if RANK_NEED_VALUES[rankType] then 
-		local nValue = nil
-        for _, tData in ipairs(RANK_NEED_VALUES[rankType]) do
-            if tData.nMinRank <= rank and tData.nMaxRank >= rank then
-                nValue = tData.nValue
-                break
-            end
-        end
-
-        return nValue or minRankValue
-	end
-
-    local tWeekRankConfig = CommonDB_GetConfig(rankType)
-    if not tWeekRankConfig then return end
-
-	RANK_NEED_VALUES[rankType] = {}
-
-    local nValue = nil
-    for _, info in pairs(tWeekRankConfig) do
-        local nMinRank = info.ranks[1]
-        local nMaxRank = info.ranks[2]
-        table.insert(RANK_NEED_VALUES[rankType], {nMinRank = nMinRank, nMaxRank = nMaxRank, nValue = info.nMoney})
-
-        if nMinRank <= rank and nMaxRank >= rank then
-            nValue = info.nMoney
-        end
-    end
- 
-	return nValue or minRankValue
-end
-
--- 得到指定排行榜指定名次的配置信息
-local function getRankInfo(rankType, rank)
-    local tWeekRankConfig = CommonDB_GetConfig(rankType)
-    if not tWeekRankConfig then return end
-
-    local rankInfo
-    for _,info in pairs(tWeekRankConfig) do
-		if rank >= info.ranks[1] and rank <= info.ranks[2] then
-			rankInfo = info
-			break
-		end
-    end
- 
-	return rankInfo
-end
-
--- 获取奖励信息
-local function getRewardInfoByRank(rankType, rank)
-    local tWeekRankConfig = CommonDB_GetConfig(rankType)
-    if not tWeekRankConfig then return end
-
-	local rewardInfo
-    for _,info in pairs(tWeekRankConfig) do
-        if rank >= info.ranks[1] and rank <= info.ranks[2] then
-            rewardInfo = info.prize
-            break
-        end
-    end
-
-	return rewardInfo
-end
-
--- 获取指定排名类型DB数据
-local function getBoard(rankType)
-    return Coomondb[rankType]
-end
-
--- -- 获取指定排名类型、指定用户的排名
-local function getRank(rankType, uuid)
-    local board = getBoard(rankType)
-    if not board then return end
-
-    return board.uuid2rank[uuid]
-end
-
--- 获取指定排名类型、指定用户的发送排名
-local function getSendRank(rankType, uuid)
-    local board = getBoard(rankType)
-    if not board then return end
-
-    return board.sendUuid2rank[uuid]
-end
-
--- 排名算法
-local function cmpRank(rankType, data1, data2)
-    if data1.value ~= data2.value then
-        return data1.value > data2.value
-    end
-
-    return data1.time < data2.time
-end
-
--- 更新排名
-local function updateRank(board)
-    if not board then return end
-
-    -- 清空普通排名和发送排名玩家数据
-    for uuid in pairs(board.uuid2rank) do
-        board.uuid2rank[uuid] = nil
-        board.sendUuid2rank[uuid] = nil
-    end
-
-    -- 设置普通排名
-    for rank, data in ipairs(board.rank2data) do
-		board.uuid2rank[data.uuid] = rank
-	end
-
-    -- 清空发送排名
-    for rank in ipairs(board.sendRank2data) do
-        board.sendRank2data[rank] = nil
-    end
-
-    local minRankValue = getMinRankValue(board.rankType)                -- 排名最小需要的排名值
-    local aleadyRankCnt = 0                                             -- 已经排好的玩家数
-    local maxRank = getMaxRank(board.rankType)                          -- 最多排名玩家数量
-    for rank = 1, maxRank do
-        local rankNeedValue = getRankNeedValue(board.rankType, rank)    -- 取当前排名需要的排名值
-
-        local rank2data = board.rank2data[aleadyRankCnt + 1]            -- 当前排的玩家
-        if rank2data then                                               -- 还有玩家需要排
-            if rank2data.value >= rankNeedValue then                    -- 达到排名值,可以排名
-    		    board.sendUuid2rank[rank2data.uuid] = rank              -- 设置玩家发送排名
-    		    board.sendRank2data[rank] = rank2data                   -- 设置发送排名数据
-    		    aleadyRankCnt = aleadyRankCnt + 1                       -- 排名玩家数量+1
-            elseif rankNeedValue <= minRankValue then                   -- 未达到排名值 且 当前排名值 小于等于 最小需要的排名值了,则后面的玩家都不需要排了
-                    break
-             else                                                       -- 未到达最低排名值,当前名次未有玩家达到
-                board.sendRank2data[rank] = -1
-            end
-        else                                                            -- 没玩家排了直接停止
-            break
-        end
-    end
-end
-
--- 更新数据
-local function updateData(rankType, data)
-    local board = getBoard(rankType)
-    if not board then return end
-
-    local uuid = data.uuid
-    local oldRank = getRank(rankType, uuid) or (#board.rank2data + 1)
-    board.rank2data[oldRank] = data
-
-    -- 向后比较(data.value 减少时),往排名低方向->
-    for i = oldRank + 1, #board.rank2data do
-        local data1 = board.rank2data[i - 1]
-        local data2 = board.rank2data[i]
-        if cmpRank(rankType, data1, data2) then
-            break
-        end
-        board.rank2data[i - 1] = data2
-        board.rank2data[i] = data1
-    end
-
-    -- 向前比较(data.value 增加时),往排名高方向<-
-    for i = oldRank - 1, 1, -1 do
-        local data1 = board.rank2data[i]
-        local data2 = board.rank2data[i + 1]
-        if cmpRank(rankType, data1, data2) then
-            break
-        end
-        board.rank2data[i] = data2
-        board.rank2data[i + 1] = data1
-    end  
-
-    local maxRank = getMaxRank(rankType)
-    board.rank2data[maxRank + 1] = nil  
-    return true
-end
-
--- 加载排行榜
-local function loadBoard()
-    local cnt = 0
-    LuaMongo.find(DB.db_common_rank, nil)
-    while true do
-        local data = {}
-        if not LuaMongo.next(data) then
-            break
-        end
-
-        cnt = cnt + 1
-        if cnt % 1000 == 0 then
-            _G.collectgarbage("step", 100000)
-        end
-        updateData(data.rankType, data)
-    end
-
-    for _, board in pairs(Coomondb) do
-        updateRank(board)
-    end
-end
-
--- 重置排行数据
-local function resertBoard(board)
-    board.uuid2rank = {}        -- 根据UUID获取名次   
-    board.sendUuid2rank = {}    -- 根据UUID获取发送名次   
-    board.rank2data = {}        -- 根据名次获取DATA
-    board.sendRank2data = {}    -- 根据名次获取发送DATA
-end
-
--- 初始排行榜
-local function initBoard(rankType)
-    local board = {}
-    resertBoard(board)
-    board.rankType = rankType
-    Coomondb[rankType] = board
-end
-
--- 根据类型+uuid从db中取data
-local function getDBData(rankType, uuid)
-    CoomonQueryForData.rankType = rankType
-    CoomonQueryForData.uuid = uuid
-
-    local data = {}
-    LuaMongo.find(DB.db_common_rank, CoomonQueryForData)
-    return LuaMongo.next(data) and data
-end
-
--- 更新DB数据
-local function updateDBData(data)
-    local oldData = getDBData(data.rankType, data.uuid)
-    if oldData then
-        CoomonQueryByUuid._id = oldData._id
-        LuaMongo.update(DB.db_common_rank, CoomonQueryByUuid, data)
-    else
-        LuaMongo.insert(DB.db_common_rank, data)
-    end
-end
-
--- 设置排名数据
-local function billboardSet(data)
-    local board = getBoard(data.rankType)
-    if not board then return end
-
-    updateData(data.rankType, data)
-    updateRank(board)
-    updateDBData(data)
-end
-
--- 获取发送奖励的邮件ID
-local function getMailID(rankType, rankInfo)
-    if CommonDefine.COMMONRANK_TYPE_WEEKRANK == rankType then
-        return WeekLoopActDef.WEEKACT_RANK_MAILID
-    end
-
-	return WeekLoopActDef.WEEKACT_RANK_MAILID
-end
-
--- 得到指定排行榜指定配置信息的奖励信息
-local function getRewardInfoByInfo(rankType, rankInfo)
-    if CommonDefine.COMMONRANK_TYPE_WEEKRANK == rankType then
-        return rankInfo.prize
-    end
-
-	return rankInfo.prize
-end
-
--- 奖励发送
-MAIL_SEND_CACHE = MAIL_SEND_CACHE or nil
-local function rewardSend(rankType)
-	local board = getBoard(rankType)
-    if not board then return end
-
-    MAIL_SEND_CACHE = MAIL_SEND_CACHE or {}
-    MAIL_SEND_CACHE[rankType] = {}  
-
-    local mailID = getMailID()
-
-    for rank, rankData in ipairs(board.sendRank2data) do
-        if rankData and rankData ~= -1 then
-            local rankInfo = getRankInfo(rankType, rank)
-            if rankInfo then
-                MAIL_SEND_CACHE[rankType][rank] = rankData.uuid
-                --mailID = getMailID(rankType, rankInfo)
-            --[[
-	        local mailID = getMailID(rankType, rankInfo)
-		    local rewardInfo = getRewardInfoByInfo(rankType, rankInfo)
-			        
-		    local mailConfig = MailExcel.mail[mailID]
-		    local title = mailConfig.title
-		    local senderName = mailConfig.senderName
-		    local content = mailConfig.content		
-			        			
-		    MailManager.add(MailManager.SYSTEM, rankData.uuid, 
-						title, Util.format(content, rank), rewardInfo, senderName)   --]]
-            end                      	
-        end
-    end
-
-    Timer.addLater(10, CommonDB_SendPrize, mailID, rankType)
-
-    -- 把内存中的数据重置,并移除DB中数据
-    resertBoard(board)
-    CoomonQueryByRankType.rankType = rankType
-    LuaMongo.remove(DB.db_common_rank, CoomonQueryByRankType)
-end
-
--- 包装档位奖励详情数据
-local function wrapOpenServerRankRewardList(rankType, net, info)
-    net.minRank = info.ranks[1]
-    net.maxRank = info.ranks[2]
-
-    local rewardInfo = info.prize
-
- 	local len = 0
-	for index,itemInfo in ipairs(rewardInfo) do
-		len = len + 1
-		Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
-	end
-
-	net.items[0] = len
-end
-
--- 启动就初始化
-function initAfterStart()
-    if _G.is_middle == true then return end
-
-    for nType = CommonDefine.COMMONRANK_TYPE_MIN, CommonDefine.COMMONRANK_TYPE_MAX do
-        initBoard(nType)
-        print("[initAfterStart] 初始化排行榜 nType = "..nType)
-    end
-
-    loadBoard()
-end
- 
--- 得到最大发送排行名次数据
-function getMaxSendRank(rankType)
-    if CommonDefine.COMMONRANK_TYPE_WEEKRANK == rankType then
-        return MAX_SEND_WEEKACTRANK
-    end
-
-    return MAX_SEND_RANK
-end
-
--- 包装档位名次数据
-function wrapOpenServerRankList(rankType, net, rank)
-	local board = getBoard(rankType)
-	local sendRankData = board.sendRank2data[rank]
-
-	net.rank = rank
-	net.rankNeedValue = getRankNeedValue(rankType, rank)
-	if sendRankData and sendRankData ~= -1 then
-		local userDB = RoleDBLogic.getDb(sendRankData.uuid)
-		net.uid = sendRankData.uuid
-		net.name = userDB.name
-		net.head = userDB.head
-		net.rankValue = sendRankData.value
-		net.headFrame = userDB.headFrame
-	else
-		net.uid = "-1"
-		net.name = ""
-		net.head = -1
-		net.rankValue = 0
-		net.headFrame = -1
-	end
- 	
- 	local rewardInfo = getRewardInfoByRank(rankType, rank)
- 	local len = 0
- 	if rewardInfo then
-		for index,itemInfo in ipairs(rewardInfo) do
-			len = len + 1
-			Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
-		end
- 	end
-	net.items[0] = len
-end
-
--- 包装自己名次数据
-function wrapOwnerData(rankType, net, uuid)
-	local maxRank = getMaxRank(rankType)
-	local sendRank = getSendRank(rankType, uuid)
-	local board = getBoard(rankType)
-	local rankData
-    if sendRank then
-        rankData = board.sendRank2data[sendRank]
-    else
-        local rank = getRank(rankType, uuid)
-        rankData = rank and board.rank2data[rank]
-    end
-
-	net.rank = sendRank or -1
-	net.rankValue = rankData and rankData.value or 0
-
- 	local len = 0
- 	if sendRank then
- 		local rewardInfo = getRewardInfoByRank(rankType, sendRank)
-		for index,itemInfo in ipairs(rewardInfo) do
-			len = len + 1
-			Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
-		end
- 	end
-	net.items[0] = len
-end
-
--- 发送奖励详情
-function rewardQuery(human, rankType)
-    local tWeekRankConfig = CommonDB_GetConfig(rankType)
- 
-	local msgRet = Msg.gc.GC_OPEN_SERVER_RANK_REWARD_QUERY
-	msgRet.type = rankType
-
-    local len = 0
-    for _,info in ipairs(tWeekRankConfig) do
-        len = len + 1
-        wrapOpenServerRankRewardList(rankType, msgRet.list[len], info)
-    end
-    msgRet.list[0] = len
-
-    Msg.send(msgRet, human.fd)
-end
-
--- 排行值增加回调
-function onValueAdd(human, rankType, value)
- 	local dbData = getDBData(rankType, human.db._id) or {}
-    local tValue = (dbData.value or 0) + value
-    onValueSet(human, rankType, tValue)
-end
-
--- 排行值设置回调
-function onValueSet(human, rankType, tValue)
- 	local dbData = getDBData(rankType, human.db._id) or {}
-	dbData.value = tValue
-	dbData.time = os.time()
-	dbData.rankType = rankType
-	dbData.uuid = human.db._id
-	billboardSet(dbData)
-end
-
--- 奖励发送回调
-function onRewardSend(nRankType)
-    local openDay = CommonDB.getServerOpenDay()
-    if not openDay then return end
-
-    rewardSend(nRankType)
-end
-
--- 定时器 邮件分开发,预防崩溃
-function CommonDB_SendPrize(mailID, rankType)
-    if mailID and MAIL_SEND_CACHE and MAIL_SEND_CACHE[rankType] then
-        local mailConfig = MailExcel.mail[mailID]   
-	    local title = mailConfig.title
-	    local senderName = mailConfig.senderName
-	    local content = mailConfig.content	    
-        local mailSends = MAIL_SEND_CACHE[rankType] 
-
-        for rank,uuid in pairs(mailSends) do
-            local rankInfo = getRankInfo(rankType, rank)
-            if rankInfo then
-                local rewardInfo = getRewardInfoByInfo(rankType, rankInfo)
-			    if rewardInfo then	
-		            MailManager.add(MailManager.SYSTEM, uuid, 
-						        title, Util.format(content, rank), rewardInfo, senderName)           
-                end        
-            end
-        end
-
-        MAIL_SEND_CACHE[rankType] = nil
-    end
-
-    --[[
-    -- 发完奖励后,把内存中的数据重置,并移除DB中数据
-    local board = getBoard(rankType)
-    if board then 
-        resertBoard(board)
-        CoomonQueryByRankType.rankType = rankType
-        LuaMongo.remove(DB.db_common_rank, CoomonQueryByRankType)  
-    end--]]
-end
+--------------------------------
+-- 文件名       :  CommonRankDB.lua
+-- 文件说明     :  通用排行榜DB数据
+-- 创建时间     :   2024/12/09
+-- 创建人       :   FC
+--------------------------------
+
+local Msg = require("core.Msg")
+local Timer = require("core.Timer")
+local DB = require("common.DB")
+local CommonDB = require("common.CommonDB")
+local CommonDefine = require("common.CommonDefine")
+local Log = require("common.Log")
+local LuaMongo = _G.lua_mongo
+local Util = require("common.Util")
+local Grid = require("bag.Grid")
+local OpenAct = require("present.OpenAct")
+local RoleDBLogic = require("role.RoleDBLogic")
+local YunYingLogic = require("yunying.YunYingLogic")
+local MailManager = require("mail.MailManager")
+local MailExcel = require("excel.mail")
+local OpenActExcel = require("excel.openAct")
+local WeekLoopActCof = require("excel.WeekLoopAct")
+local WeekLoopActDef = require("WeekendLoopActivity.WeekendLoopActDefine")
+
+--[[
+	开服活动排行DB操作,封装了一些公共处理方法
+    db字段只是缓存排名好的数据(只是内存数据)
+    Coomondb = {
+        [rankType] = {                  -- 排名类型
+            rankType = xxx,             -- 排名类型
+            uuid2rank = {               -- 根据UUID获取名次   
+                [uuid] = rank,          -- 玩家uuid = 排行名次
+                ...
+            },        
+            sendUuid2rank = {           -- 根据UUID获取发送名次
+                [uuid] = rank,          -- 玩家uuid = 真实发送的排行名次
+                ...
+            },
+            rank2data = {               -- 根据名次获取DATA
+                [rank] = {              -- 排行名次 = 玩家排名数据
+                   uuid = xxx,          -- 玩家uuid
+                   rankType = xxx,      -- 排名类型
+                   value = xxx,         -- 排名值
+                   time = xxx,          -- 排名值更新时间
+                   _id = xxx,           -- db记录中的uuid
+                },      
+                ...
+            },
+            sendRank2data = {           -- 根据名次获取发送DATA
+                [rank] = {              -- 排行名次 = 真实发送玩家排名数据
+                   uuid = xxx,          -- 玩家uuid
+                   rankType = xxx,      -- 排名类型
+                   value = xxx,         -- 排名值
+                   time = xxx,          -- 排名值更新时间
+                   _id = xxx,           -- db记录中的uuid
+                },      
+                ...
+            }
+        },
+        ...
+    }
+
+	DB:
+        db_common_rank = {     -- 开服排行类活动
+            [uuid] = {
+                uuid = xxx,             -- 玩家uuid
+                rankType= xxx,          -- 排名类型
+                value = xxx,            -- 排行值
+                time = xxx,             -- 排行值更新时间
+            }
+        }
+	local:
+        CommonDB_GetConfig()              -- 得到指定排名类型的活动配置
+        getMinRankValue()				-- 得到排行榜中最低上榜条件数
+        getMaxRank()				    -- 得到活动最多排名名次
+        getRankNeedValue()			    -- 得到排行榜中名次对应需要达到的条件数
+        getRankInfo()					-- 得到指定排行榜指定名次的配置信息
+        getRewardInfoByRank()           -- 获取奖励信息
+        getBoard()                      -- 获取指定排名类型DB数据
+        getRank()                       -- 获取指定排名类型、指定用户的排名
+        getSendRank()                   -- 获取指定排名类型、指定用户的发送排名
+        cmpRank()                       -- 排名算法
+        updateRank()                    -- 更新排名
+        updateData()                    -- 更新数据
+        loadBoard()                     -- 加载排行榜
+        resertBoard()                   -- 重置排行数据
+        initBoard()                     -- 初始排行榜
+        getDBData()                     -- 根据类型+uuid从db中取data
+        updateDBData()                  -- 更新DB数据
+        billboardSet()                  -- 设置排名数据
+        getMailID()                     -- 获取发送奖励的邮件ID
+        getRewardInfoByInfo()			-- 得到指定排行榜指定配置信息的奖励信息
+        rewardSend()					-- 奖励发送
+        wrapOpenServerRankRewardList    -- 包装档位奖励详情数据
+	public:
+		initAfterStart()			    -- 启动就初始化	
+		getMaxSendRank()				-- 得到最大发送排行名次数据
+		wrapOpenServerRankList()		-- 包装档位名次数据
+		wrapOwnerData()					-- 包装自己名次数据
+        rewardQuery()                   -- 发送奖励详情
+		onValueAdd()					-- 排行值增加回调
+        onValueSet()                    -- 排行值设置回调
+		onRewardSend()					-- 奖励发送回调
+--]]
+
+
+WeekAct_RankName = "WeekAct_ChargeRank"
+
+MAX_SEND_RANK = 10						-- 最大发送排名数
+MAX_SEND_WEEKACTRANK = 21               -- 周活动排行榜发送排名数
+
+Coomondb = Coomondb or {}                  			-- [rankType] = board
+CoomonQueryForData = {rankType = 1, uuid = 1} -- 通过排名类型和玩家uuid查找DB数据
+CoomonQueryByUuid = {_id = 1}                 -- 通过DB的uuid更新DB数据
+CoomonQueryByRankType = {rankType = 1}        -- 通过排名类型查找DB数据
+
+
+local function CommonDB_GetConfig(rankType)
+    if CommonDefine.COMMONRANK_TYPE_WEEKRANK == rankType  then
+        return WeekLoopActCof.Rank
+    end
+
+    return nil
+end
+
+-- 得到排行榜中最低上榜条件数
+local MIN_RANK_VALUES
+local function getMinRankValue(rankType)
+	MIN_RANK_VALUES = MIN_RANK_VALUES or {}
+	if MIN_RANK_VALUES[rankType] then return MIN_RANK_VALUES[rankType] end
+
+    local tWeekRankConfig = CommonDB_GetConfig(rankType)
+    if not tWeekRankConfig then return end
+
+    -- 这里后续有排行榜类型,保持命名一致
+    local minRankValue
+    for _,info in ipairs(tWeekRankConfig) do
+        if not minRankValue or minRankValue > info.nMoney then 
+            minRankValue = info.nMoney
+        end
+    end
+
+	MIN_RANK_VALUES[rankType] = minRankValue
+	return MIN_RANK_VALUES[rankType]
+end
+
+--local MAX_RANKS
+local function getMaxRank(rankType)
+    return 200
+end
+
+ -- 得到排行榜中名次对应需要达到的条件数
+local RANK_NEED_VALUES
+local function getRankNeedValue(rankType, rank)
+	RANK_NEED_VALUES = RANK_NEED_VALUES or {}
+
+	local minRankValue = getMinRankValue(rankType)
+	if RANK_NEED_VALUES[rankType] then 
+		local nValue = nil
+        for _, tData in ipairs(RANK_NEED_VALUES[rankType]) do
+            if tData.nMinRank <= rank and tData.nMaxRank >= rank then
+                nValue = tData.nValue
+                break
+            end
+        end
+
+        return nValue or minRankValue
+	end
+
+    local tWeekRankConfig = CommonDB_GetConfig(rankType)
+    if not tWeekRankConfig then return end
+
+	RANK_NEED_VALUES[rankType] = {}
+
+    local nValue = nil
+    for _, info in pairs(tWeekRankConfig) do
+        local nMinRank = info.ranks[1]
+        local nMaxRank = info.ranks[2]
+        table.insert(RANK_NEED_VALUES[rankType], {nMinRank = nMinRank, nMaxRank = nMaxRank, nValue = info.nMoney})
+
+        if nMinRank <= rank and nMaxRank >= rank then
+            nValue = info.nMoney
+        end
+    end
+ 
+	return nValue or minRankValue
+end
+
+-- 得到指定排行榜指定名次的配置信息
+local function getRankInfo(rankType, rank)
+    local tWeekRankConfig = CommonDB_GetConfig(rankType)
+    if not tWeekRankConfig then return end
+
+    local rankInfo
+    for _,info in pairs(tWeekRankConfig) do
+		if rank >= info.ranks[1] and rank <= info.ranks[2] then
+			rankInfo = info
+			break
+		end
+    end
+ 
+	return rankInfo
+end
+
+-- 获取奖励信息
+local function getRewardInfoByRank(rankType, rank)
+    local tWeekRankConfig = CommonDB_GetConfig(rankType)
+    if not tWeekRankConfig then return end
+
+	local rewardInfo
+    for _,info in pairs(tWeekRankConfig) do
+        if rank >= info.ranks[1] and rank <= info.ranks[2] then
+            rewardInfo = info.prize
+            break
+        end
+    end
+
+	return rewardInfo
+end
+
+-- 获取指定排名类型DB数据
+local function getBoard(rankType)
+    return Coomondb[rankType]
+end
+
+-- -- 获取指定排名类型、指定用户的排名
+local function getRank(rankType, uuid)
+    local board = getBoard(rankType)
+    if not board then return end
+
+    return board.uuid2rank[uuid]
+end
+
+-- 获取指定排名类型、指定用户的发送排名
+local function getSendRank(rankType, uuid)
+    local board = getBoard(rankType)
+    if not board then return end
+
+    return board.sendUuid2rank[uuid]
+end
+
+-- 排名算法
+local function cmpRank(rankType, data1, data2)
+    if data1.value ~= data2.value then
+        return data1.value > data2.value
+    end
+
+    return data1.time < data2.time
+end
+
+-- 更新排名
+local function updateRank(board)
+    if not board then return end
+
+    -- 清空普通排名和发送排名玩家数据
+    for uuid in pairs(board.uuid2rank) do
+        board.uuid2rank[uuid] = nil
+        board.sendUuid2rank[uuid] = nil
+    end
+
+    -- 设置普通排名
+    for rank, data in ipairs(board.rank2data) do
+		board.uuid2rank[data.uuid] = rank
+	end
+
+    -- 清空发送排名
+    for rank in ipairs(board.sendRank2data) do
+        board.sendRank2data[rank] = nil
+    end
+
+    local minRankValue = getMinRankValue(board.rankType)                -- 排名最小需要的排名值
+    local aleadyRankCnt = 0                                             -- 已经排好的玩家数
+    local maxRank = getMaxRank(board.rankType)                          -- 最多排名玩家数量
+    for rank = 1, maxRank do
+        local rankNeedValue = getRankNeedValue(board.rankType, rank)    -- 取当前排名需要的排名值
+
+        local rank2data = board.rank2data[aleadyRankCnt + 1]            -- 当前排的玩家
+        if rank2data then                                               -- 还有玩家需要排
+            if rank2data.value >= rankNeedValue then                    -- 达到排名值,可以排名
+    		    board.sendUuid2rank[rank2data.uuid] = rank              -- 设置玩家发送排名
+    		    board.sendRank2data[rank] = rank2data                   -- 设置发送排名数据
+    		    aleadyRankCnt = aleadyRankCnt + 1                       -- 排名玩家数量+1
+            elseif rankNeedValue <= minRankValue then                   -- 未达到排名值 且 当前排名值 小于等于 最小需要的排名值了,则后面的玩家都不需要排了
+                    break
+             else                                                       -- 未到达最低排名值,当前名次未有玩家达到
+                board.sendRank2data[rank] = -1
+            end
+        else                                                            -- 没玩家排了直接停止
+            break
+        end
+    end
+end
+
+-- 更新数据
+local function updateData(rankType, data)
+    local board = getBoard(rankType)
+    if not board then return end
+
+    local uuid = data.uuid
+    local oldRank = getRank(rankType, uuid) or (#board.rank2data + 1)
+    board.rank2data[oldRank] = data
+
+    -- 向后比较(data.value 减少时),往排名低方向->
+    for i = oldRank + 1, #board.rank2data do
+        local data1 = board.rank2data[i - 1]
+        local data2 = board.rank2data[i]
+        if cmpRank(rankType, data1, data2) then
+            break
+        end
+        board.rank2data[i - 1] = data2
+        board.rank2data[i] = data1
+    end
+
+    -- 向前比较(data.value 增加时),往排名高方向<-
+    for i = oldRank - 1, 1, -1 do
+        local data1 = board.rank2data[i]
+        local data2 = board.rank2data[i + 1]
+        if cmpRank(rankType, data1, data2) then
+            break
+        end
+        board.rank2data[i] = data2
+        board.rank2data[i + 1] = data1
+    end  
+
+    local maxRank = getMaxRank(rankType)
+    board.rank2data[maxRank + 1] = nil  
+    return true
+end
+
+-- 加载排行榜
+local function loadBoard()
+    local cnt = 0
+    LuaMongo.find(DB.db_common_rank, nil)
+    while true do
+        local data = {}
+        if not LuaMongo.next(data) then
+            break
+        end
+
+        cnt = cnt + 1
+        if cnt % 1000 == 0 then
+            _G.collectgarbage("step", 100000)
+        end
+        updateData(data.rankType, data)
+    end
+
+    for _, board in pairs(Coomondb) do
+        updateRank(board)
+    end
+end
+
+-- 重置排行数据
+local function resertBoard(board)
+    board.uuid2rank = {}        -- 根据UUID获取名次   
+    board.sendUuid2rank = {}    -- 根据UUID获取发送名次   
+    board.rank2data = {}        -- 根据名次获取DATA
+    board.sendRank2data = {}    -- 根据名次获取发送DATA
+end
+
+-- 初始排行榜
+local function initBoard(rankType)
+    local board = {}
+    resertBoard(board)
+    board.rankType = rankType
+    Coomondb[rankType] = board
+end
+
+-- 根据类型+uuid从db中取data
+local function getDBData(rankType, uuid)
+    CoomonQueryForData.rankType = rankType
+    CoomonQueryForData.uuid = uuid
+
+    local data = {}
+    LuaMongo.find(DB.db_common_rank, CoomonQueryForData)
+    return LuaMongo.next(data) and data
+end
+
+-- 更新DB数据
+local function updateDBData(data)
+    local oldData = getDBData(data.rankType, data.uuid)
+    if oldData then
+        CoomonQueryByUuid._id = oldData._id
+        LuaMongo.update(DB.db_common_rank, CoomonQueryByUuid, data)
+    else
+        LuaMongo.insert(DB.db_common_rank, data)
+    end
+end
+
+-- 设置排名数据
+local function billboardSet(data)
+    local board = getBoard(data.rankType)
+    if not board then return end
+
+    updateData(data.rankType, data)
+    updateRank(board)
+    updateDBData(data)
+end
+
+-- 获取发送奖励的邮件ID
+local function getMailID(rankType, rankInfo)
+    if CommonDefine.COMMONRANK_TYPE_WEEKRANK == rankType then
+        return WeekLoopActDef.WEEKACT_RANK_MAILID
+    end
+
+	return WeekLoopActDef.WEEKACT_RANK_MAILID
+end
+
+-- 得到指定排行榜指定配置信息的奖励信息
+local function getRewardInfoByInfo(rankType, rankInfo)
+    if CommonDefine.COMMONRANK_TYPE_WEEKRANK == rankType then
+        return rankInfo.prize
+    end
+
+	return rankInfo.prize
+end
+
+-- 奖励发送
+MAIL_SEND_CACHE = MAIL_SEND_CACHE or nil
+local function rewardSend(rankType)
+	local board = getBoard(rankType)
+    if not board then return end
+
+    MAIL_SEND_CACHE = MAIL_SEND_CACHE or {}
+    MAIL_SEND_CACHE[rankType] = {}  
+
+    local mailID = getMailID()
+
+    for rank, rankData in ipairs(board.sendRank2data) do
+        if rankData and rankData ~= -1 then
+            local rankInfo = getRankInfo(rankType, rank)
+            if rankInfo then
+                MAIL_SEND_CACHE[rankType][rank] = rankData.uuid
+                --mailID = getMailID(rankType, rankInfo)
+            --[[
+	        local mailID = getMailID(rankType, rankInfo)
+		    local rewardInfo = getRewardInfoByInfo(rankType, rankInfo)
+			        
+		    local mailConfig = MailExcel.mail[mailID]
+		    local title = mailConfig.title
+		    local senderName = mailConfig.senderName
+		    local content = mailConfig.content		
+			        			
+		    MailManager.add(MailManager.SYSTEM, rankData.uuid, 
+						title, Util.format(content, rank), rewardInfo, senderName)   --]]
+            end                      	
+        end
+    end
+
+    Timer.addLater(10, CommonDB_SendPrize, mailID, rankType)
+
+    -- 把内存中的数据重置,并移除DB中数据
+    resertBoard(board)
+    CoomonQueryByRankType.rankType = rankType
+    LuaMongo.remove(DB.db_common_rank, CoomonQueryByRankType)
+end
+
+-- 包装档位奖励详情数据
+local function wrapOpenServerRankRewardList(rankType, net, info)
+    net.minRank = info.ranks[1]
+    net.maxRank = info.ranks[2]
+
+    local rewardInfo = info.prize
+
+ 	local len = 0
+	for index,itemInfo in ipairs(rewardInfo) do
+		len = len + 1
+		Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
+	end
+
+	net.items[0] = len
+end
+
+-- 启动就初始化
+function initAfterStart()
+    if _G.is_middle == true then return end
+
+    for nType = CommonDefine.COMMONRANK_TYPE_MIN, CommonDefine.COMMONRANK_TYPE_MAX do
+        initBoard(nType)
+        print("[initAfterStart] 初始化排行榜 nType = "..nType)
+    end
+
+    loadBoard()
+end
+ 
+-- 得到最大发送排行名次数据
+function getMaxSendRank(rankType)
+    if CommonDefine.COMMONRANK_TYPE_WEEKRANK == rankType then
+        return MAX_SEND_WEEKACTRANK
+    end
+
+    return MAX_SEND_RANK
+end
+
+-- 包装档位名次数据
+function wrapOpenServerRankList(rankType, net, rank)
+	local board = getBoard(rankType)
+	local sendRankData = board.sendRank2data[rank]
+
+	net.rank = rank
+	net.rankNeedValue = getRankNeedValue(rankType, rank)
+	if sendRankData and sendRankData ~= -1 then
+		local userDB = RoleDBLogic.getDb(sendRankData.uuid)
+		net.uid = sendRankData.uuid
+		net.name = userDB.name
+		net.head = userDB.head
+		net.rankValue = sendRankData.value
+		net.headFrame = userDB.headFrame
+	else
+		net.uid = "-1"
+		net.name = ""
+		net.head = -1
+		net.rankValue = 0
+		net.headFrame = -1
+	end
+ 	
+ 	local rewardInfo = getRewardInfoByRank(rankType, rank)
+ 	local len = 0
+ 	if rewardInfo then
+		for index,itemInfo in ipairs(rewardInfo) do
+			len = len + 1
+			Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
+		end
+ 	end
+	net.items[0] = len
+end
+
+-- 包装自己名次数据
+function wrapOwnerData(rankType, net, uuid)
+	local maxRank = getMaxRank(rankType)
+	local sendRank = getSendRank(rankType, uuid)
+	local board = getBoard(rankType)
+	local rankData
+    if sendRank then
+        rankData = board.sendRank2data[sendRank]
+    else
+        local rank = getRank(rankType, uuid)
+        rankData = rank and board.rank2data[rank]
+    end
+
+	net.rank = sendRank or -1
+	net.rankValue = rankData and rankData.value or 0
+
+ 	local len = 0
+ 	if sendRank then
+ 		local rewardInfo = getRewardInfoByRank(rankType, sendRank)
+		for index,itemInfo in ipairs(rewardInfo) do
+			len = len + 1
+			Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
+		end
+ 	end
+	net.items[0] = len
+end
+
+-- 发送奖励详情
+function rewardQuery(human, rankType)
+    local tWeekRankConfig = CommonDB_GetConfig(rankType)
+ 
+	local msgRet = Msg.gc.GC_OPEN_SERVER_RANK_REWARD_QUERY
+	msgRet.type = rankType
+
+    local len = 0
+    for _,info in ipairs(tWeekRankConfig) do
+        len = len + 1
+        wrapOpenServerRankRewardList(rankType, msgRet.list[len], info)
+    end
+    msgRet.list[0] = len
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 排行值增加回调
+function onValueAdd(human, rankType, value)
+ 	local dbData = getDBData(rankType, human.db._id) or {}
+    local tValue = (dbData.value or 0) + value
+    onValueSet(human, rankType, tValue)
+end
+
+-- 排行值设置回调
+function onValueSet(human, rankType, tValue)
+ 	local dbData = getDBData(rankType, human.db._id) or {}
+	dbData.value = tValue
+	dbData.time = os.time()
+	dbData.rankType = rankType
+	dbData.uuid = human.db._id
+	billboardSet(dbData)
+end
+
+-- 奖励发送回调
+function onRewardSend(nRankType)
+    local openDay = CommonDB.getServerOpenDay()
+    if not openDay then return end
+
+    rewardSend(nRankType)
+end
+
+-- 定时器 邮件分开发,预防崩溃
+function CommonDB_SendPrize(mailID, rankType)
+    if mailID and MAIL_SEND_CACHE and MAIL_SEND_CACHE[rankType] then
+        local mailConfig = MailExcel.mail[mailID]   
+	    local title = mailConfig.title
+	    local senderName = mailConfig.senderName
+	    local content = mailConfig.content	    
+        local mailSends = MAIL_SEND_CACHE[rankType] 
+
+        for rank,uuid in pairs(mailSends) do
+            local rankInfo = getRankInfo(rankType, rank)
+            if rankInfo then
+                local rewardInfo = getRewardInfoByInfo(rankType, rankInfo)
+			    if rewardInfo then	
+		            MailManager.add(MailManager.SYSTEM, uuid, 
+						        title, Util.format(content, rank), rewardInfo, senderName)           
+                end        
+            end
+        end
+
+        MAIL_SEND_CACHE[rankType] = nil
+    end
+
+    --[[
+    -- 发完奖励后,把内存中的数据重置,并移除DB中数据
+    local board = getBoard(rankType)
+    if board then 
+        resertBoard(board)
+        CoomonQueryByRankType.rankType = rankType
+        LuaMongo.remove(DB.db_common_rank, CoomonQueryByRankType)  
+    end--]]
+end

+ 1 - 0
script/common/DB.lua

@@ -33,6 +33,7 @@ db_war_report =			    Config.DB_NAME .. ".war_report"   	    -- 战报[跨服记
 db_openServer_billboard =   Config.DB_NAME .. ".openServer_billboard"-- 开服排行类活动
 db_lost_temple          =   Config.DB_NAME .. ".lost_temple"         -- 神庙
 db_common_rank			= 	Config.DB_NAME .. ".common_rank"         -- 通用排行榜
+db_middle_rank			=	Config.DB_NAME .. ".middle_rank"		 -- 中心服排行榜数据
 -- 加db第一步 请先确认是否要建对应字段的索引 第二步请确认合服逻辑是否要修改 
 
 function init()

+ 65 - 18
script/common/InnerHandler.lua

@@ -20,6 +20,7 @@ local ChatLogic = require("chat.ChatLogic")
 local HeroMiddleLogic = require("hero.HeroMiddleLogic")
 local MiddleCommonLogic = require("middle.MiddleCommonLogic")
 local CommerceMiddle = require("serverCommerce.ServerCommerceMiddle")
+local MiddleCommonRank = require("middle.MiddleCommonRank")
 
 function LW_HELLO(fd, msg)
 	if _G.is_middle ~= true then return end
@@ -176,23 +177,69 @@ end
 
 -------------------- 跨服商业活动开始 ---------------------------
 -- 回复开服天数
--- function LW_COMMERCE_SENDOPENDAY(fd, msg)
---     if _G.is_middle ~= true then return end
---     CommerceMiddle.CommerceMiddle_SendOpenDay(fd, msg)
--- end
-
--- -- 请求开服天数
--- function WL_COMMERCE_QUERYOPENDAY(fd, msg)
---     CommerceMiddle.CommerceMiddle_QueryOpenDay(fd, msg)
--- end
-
--- function LW_COMMERCE_ACTOPEN(fd, msg)
---     if _G.is_middle ~= true then return end
---     CommerceMiddle.CommerceMiddle_QueryOpenAct(fd, msg)
--- end
-
--- function WL_COMMERCE_ACTOPEN(fd, msg)
---     CommerceMiddle.CommerceMiddle_SendOpenAct(fd, msg)
--- end
+function LW_COMMERCE_SENDOPENDAY(fd, msg)
+    if _G.is_middle ~= true then return end
+    print("[LW_COMMERCE_SENDOPENDAY] 回复开服天数")
+    CommerceMiddle.CommerceMiddle_SendOpenDay(fd, msg)
+end
+
+-- 请求开服天数
+function WL_COMMERCE_QUERYOPENDAY(fd, msg)
+    print("[WL_COMMERCE_QUERYOPENDAY] 请求开服天数")
+    CommerceMiddle.CommerceMiddle_QueryOpenDay(fd, msg)
+end
+
+-- 请求是否开启活动
+function LW_COMMERCE_ACTOPEN(fd, msg)
+    if _G.is_middle ~= true then return end
+    print("[LW_COMMERCE_ACTOPEN] 请求是否开启活动")
+    CommerceMiddle.CommerceMiddle_QueryOpenAct(fd, msg)
+end
+
+function WL_COMMERCE_ACTOPEN(fd, msg)
+    print("[WL_COMMERCE_ACTOPEN] 回复是否开启活动")
+    CommerceMiddle.CommerceMiddle_SendOpenAct(fd, msg)
+end
+
+-- 更新排行榜数据
+function LW_COMMERCE_RANK_POINT_CHANGE(fd, msg)
+    if _G.is_middle ~= true then return end
+    MiddleCommonRank.MiddleCommonRank_ReceiveRankData(msg)
+end
+
+-- 请求排行榜数据
+function LW_COMMERCE_QUERY_RANK_INFO(fd, msg)
+    if _G.is_middle ~= true then return end
+    MiddleCommonRank.MiddleCommonRank_QueryRankInfo(msg)
+end
+
+-- 请求排行榜数据回包
+function WL_COMMERCE_QUERY_RANK_INFO(fd, msg)
+    CommerceMiddle.CommerveMiddle_GetRankInfo(msg)
+end
+
+-- 请求服务器排名
+function LW_COMMERCE_QUERY_SERVER_RANK(fd, msg)
+    if _G.is_middle ~= true then return end
+    MiddleCommonRank.MiddleCommonRank_QueryServerRank(msg)
+end
+
+function WL_COMMERCE_GET_SERVERRANK_PRIZE(fd, msg)
+    CommerceMiddle.CommerceMiddle_GetServerRank(msg)
+end
+
+function LW_COMMERCE_TELL_SERVER_MAILOK(fd, msg)
+    if _G.is_middle ~= true then return end
+    MiddleCommonRank.MiddleCommonRank_ServerMailOk(msg)
+end
+
+function WL_COMMERCE_SEND_HUMAN_PRIZE(fd, msg)
+    CommerceMiddle.CommerceMiddle_GetHumanRank(msg)
+end
+
+function LW_COMMERCE_CLEAR_RANK(fd, msg)
+    if _G.is_middle ~= true then return end
+    MiddleCommonRank.MiddleCommonRank_ClearRank(msg)
+end
 
 -------------------- 跨服商业活动结束 ---------------------------

+ 85 - 22
script/common/InnerProto.lua

@@ -191,28 +191,91 @@ WL_COMBAT_GETINFO_SEND =
 -------------------- 请求跨服切磋结束 ---------------------------
 
 -------------------- 跨服商业活动开始 ---------------------------
--- -- 请求开服天数
--- WL_COMMERCE_GETOPENDAY = {
--- }
-
--- -- 回复开服天数
--- LW_COMMERCE_SENDOPENDAY = {
---   {"nOpenDay",            "int"},
---   {"nSrcServerID",        "int"},
--- }
-
--- -- 请求是否开启活动
--- LW_COMMERCE_ACTOPEN = 
--- {
---   {"nSrcServerID",        "int"},     -- 源服务器ID
---   {"nOperate",            "int"},     -- 来源
--- }
-
--- WL_COMMERCE_ACTOPEN = 
--- {
---   {"nOpen",               "int"},     -- 1 开 0 未开
---   {"nOperate",            "int"},     -- 来源
--- }
+-- 请求开服天数
+WL_COMMERCE_QUERYOPENDAY = {}
+
+-- 回复开服天数
+LW_COMMERCE_SENDOPENDAY = {
+  {"nOpenDay",            "int"},
+  {"nSrcServerID",        "int"},
+}
+
+-- 请求是否开启活动
+LW_COMMERCE_ACTOPEN = 
+{
+  {"nSrcServerID",        "int"},     -- 源服务器ID
+  {"nOperate",            "int"},     -- 来源
+}
+
+WL_COMMERCE_ACTOPEN = 
+{
+  {"nOpen",               "int"},     -- 1 开 0 未开
+  {"nOperate",            "int"},     -- 来源
+}
+
+-- 排行榜数据改变发送到中心服进行排行
+LW_COMMERCE_RANK_POINT_CHANGE = 
+{
+  {"uuid",              "string"},       -- 玩家uid
+  {"name",              "int"},       -- 玩家姓名
+  {"head",              "int"},       -- 玩家头像ID
+  {"headFrame",         "int"},       -- 玩家头像框
+  {"nSrcServerID",      "int"},       -- 服务器ID
+  {"nValue",            "int"},       -- 排行key
+  {"nRankType",         "int"},       -- 排行类型
+  {"nRankSubType",      "int"},       -- 排行榜小类型
+  {"nOperate",          "int"},       -- 操作类型(1 累加nValue, 2 直接替换 )
+}
+
+-- 请求排行榜数据
+LW_COMMERCE_QUERY_RANK_INFO = 
+{
+  {"nRankType",         "int"},       -- 排行类型
+  {"nRankSubType",      "int"},       -- 排行榜小类型
+  {"nSrcServerID",      "int"},       -- 服务器ID
+}
+
+-- 回复排行榜数据
+WL_COMMERCE_QUERY_RANK_INFO = {
+  {"nRankType",         "int"},       -- 排行类型
+  {"nRankSubType",      "int"},       -- 排行榜小类型
+  {"nServerKey",        "int"},       -- 服务器ID
+  {"nBegin",            "int"},       -- 首次发送
+  {"nEnd",              "int"},       -- 是否发送完成
+  {"tRankData",         "table"},     -- 排行榜数据
+}
+
+-- 获取服务器排行榜服务器排名
+LW_COMMERCE_QUERY_SERVER_RANK = 
+{
+  {"nSrcServerID",      "int"},       -- 服务器ID
+  {"nServerUuid",       "int"},       -- 服务器唯一区分ID
+  {"nOperate",          "int"},       -- 操作类型
+}
+
+-- 获取服务器排行榜服务器排名 回包
+WL_COMMERCE_GET_SERVERRANK_PRIZE = 
+{
+  {"nRank",               "int"},     -- 排名
+  {"nOperate",          "int"},       -- 操作类型
+}
+
+-- 通知中心服全服邮件发送完成
+LW_COMMERCE_TELL_SERVER_MAILOK = 
+{
+  {"nSrcServerID",      "int"},       -- 服务器ID
+}
+
+WL_COMMERCE_SEND_HUMAN_PRIZE = 
+{
+  {"nRank",             "int"},
+  {"uuid",              "string"},
+}
+
+LW_COMMERCE_CLEAR_RANK = 
+{
+  {"nSrcServerID",      "int"},       -- 服务器ID
+}
 
 -------------------- 跨服商业活动结束 ---------------------------
 

+ 12 - 4
script/common/InnerProtoID.lua

@@ -23,7 +23,15 @@ _ENV[22] = 'LW_COMBAT_GETINFO'
 _ENV[23] = 'WL_COMBAT_GETINFO'
 _ENV[24] = 'LW_COMBAT_GETINFO_SEND'
 _ENV[25] = 'WL_COMBAT_GETINFO_SEND'
--- _ENV[26] = 'WL_COMMERCE_QUERYOPENDAY'
--- _ENV[27] = "LW_COMMERCE_SENDOPENDAY"
--- _ENV[28] = 'LW_COMMERCE_ACTOPEN'
--- _ENV[29] = 'WL_COMMERCE_ACTOPEN'
+_ENV[26] = 'WL_COMMERCE_QUERYOPENDAY'
+_ENV[27] = "LW_COMMERCE_SENDOPENDAY"
+_ENV[28] = 'LW_COMMERCE_ACTOPEN'
+_ENV[29] = 'WL_COMMERCE_ACTOPEN'
+_ENV[30] = 'LW_COMMERCE_RANK_POINT_CHANGE'
+_ENV[31] = 'LW_COMMERCE_QUERY_RANK_INFO'
+_ENV[32] = 'WL_COMMERCE_QUERY_RANK_INFO'
+_ENV[33] = 'LW_COMMERCE_QUERY_SERVER_RANK'
+_ENV[34] = 'WL_COMMERCE_GET_SERVERRANK_PRIZE'
+_ENV[35] = 'LW_COMMERCE_TELL_SERVER_MAILOK'
+_ENV[36] = 'WL_COMMERCE_SEND_HUMAN_PRIZE'
+_ENV[37] = 'LW_COMMERCE_CLEAR_RANK'

+ 1 - 0
script/common/Log.lua

@@ -71,6 +71,7 @@ function init()
     --[[埋点]] LOGID_OSS_MAIDIAN = lua_log.reg("log/oss_maidian","",300)
     --[[通用日志]] LOGID_OSS_COMMON = lua_log.reg("log/oss_common","",300)
     --[[合服日志]] LOGID_OSS_MERGE = lua_log.reg("log/oss_merge","",300)
+    --[[通用活动日志]] LOGID_OSS_COMMON_ACT = lua_log.reg("log/oss_actcommon","",300)   -- 用于各种活动开启,结束等日志
 end
 init()
 

+ 1 - 0
script/common/LogDefine.lua

@@ -247,6 +247,7 @@ DEFINE = {
 	week_loop_act			= 251,			 -- 周活动
 	voucher_use 			= 252,			 -- 代金券使用
 	treasurechest 			= 253,			 -- 宝箱打开添加
+	servercommerce 			= 254,			 -- 跨服商业活动
 	abs_totalReach          = 500,           -- 周期性活动累计
     abs_singleReach         = 501,           -- 周期性活动单次
     draw_ad_reward         = 601,           -- 观看广告送召唤券

+ 2 - 0
script/core/ObjHuman.lua

@@ -92,6 +92,7 @@ local MaiDianDefine = require("MaiDian.MaiDianDefine")
 local MainDianLogic = require("MaiDian.MaiDianLogic")
 local OnlineAwardLogic = require("present.OnlineAwardLogic")
 local RoleHeadLogic = require("role.RoleHeadLogic")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 local Json = require("common.Json")
 
@@ -221,6 +222,7 @@ function onLogout(human)
     OnlineRewardLogic.onLogout(human, time)
 
     YunYingLogic.onCallBack(human, "onLogout")
+	TriggerLogic.onLogout(human)
 end
 
 

+ 108 - 108
script/module/WeekendLoopActivity/WeekendLoopActRank.lua

@@ -1,108 +1,108 @@
---------------------------------
--- 文件名       :  WeekendLoopActRank.lua
--- 文件说明     :  周末冲刺-排行榜
--- 创建时间     :   2024/12/09
--- 创建人       :   FC
---------------------------------
-
-local Msg = require("core.Msg")
-local Util = require("common.Util")
-local Lang = require("common.Lang")
-local CommonRankDB = require("common.CommonRankDB")
-local OpenServerRankDB = require("present.OpenServerRankDB")
-local Broadcast = require("broadcast.Broadcast")
-local OpenAct = require("present.OpenAct")
-local YunYingLogic = require("yunying.YunYingLogic")
-local DrawCardLogic = require("drawCard.DrawCardLogic")
-local CommonDefine = require("common.CommonDefine")
-
---[[
-    local:
-
-	public:
-    	query()					            -- 发送活动信息
-        onCharge()			                -- 充值回调
-        WeekActRank_ResetData(human)        -- 重置玩家身上的充值
-        WeekActRank_ResetDBData()           -- 重置排行榜数据
---]]
-
------------------------------------------ 内部处理开始 -------------------------------------
--- 重置
-function WeekActRank_ResetCharge(human)
-    -- if not human then
-    --     return
-    -- end
-
-    -- human.db.nWeekCharge = 0
-end
-
--- 获取充值额度
-function WeekActRank_GetCharge(human)
-    -- if not human then
-    --     return 0
-    -- end
-
-    -- if not human.db.nWeekCharge then
-    --     WeekActRank_ResetCharge(human)
-    -- end
-
-    -- return human.db.nWeekCharge
-end
-
--- 设置充值额度
-function WeekActRank_GetCharge(human, nVal)
-    -- if not human or 0 >= nVal then
-    --     return
-    -- end
-
-    -- if not human.db.nWeekCharge then
-    --     WeekActRank_ResetCharge(human)
-    -- end
-
-    -- human.db.nWeekCharge = human.db.nWeekCharge + nVal
-end
-
-
------------------------------------------ 外部调用 -------------------------------------
-function WeekActRank_ResetData(human)
-    if not human then
-        return
-    end
-    
-    --WeekActRank_ResetCharge(human)
-end
-
-function WeekActRank_ResetDBData()
-    -- CommonRankDB.ResetData() 
-end
-
--- 活动结束
-function WeekActRank_End()
-    CommonRankDB.onRewardSend(CommonDefine.COMMONRANK_TYPE_WEEKRANK)
-end
-
--- 充值回调
-function onCharge(human, price, funcID, buyID)
-    CommonRankDB.onValueAdd(human, CommonDefine.COMMONRANK_TYPE_WEEKRANK, price)
-end
-
------------------------------------------ 外部调用 -------------------------------------
-
--- 客户端请求
-function WeekActRank_Query(human)
-    local nRankType = CommonDefine.COMMONRANK_TYPE_WEEKRANK
-	local maxSendRank = CommonRankDB.getMaxSendRank(nRankType)
-
-	local msgRet = Msg.gc.GC_WEEKLOOP_ACT_RANK_QUERY
-	
-	CommonRankDB.wrapOwnerData(nRankType, msgRet.ownerData, human.db._id)
-	
-    for rank = 1,maxSendRank do
-		CommonRankDB.wrapOpenServerRankList(nRankType, msgRet.list[rank], rank)
-	end
-    
-	msgRet.list[0] = maxSendRank
-
-	Msg.send(msgRet, human.fd)
-end
-
+--------------------------------
+-- 文件名       :  WeekendLoopActRank.lua
+-- 文件说明     :  周末冲刺-排行榜
+-- 创建时间     :   2024/12/09
+-- 创建人       :   FC
+--------------------------------
+
+local Msg = require("core.Msg")
+local Util = require("common.Util")
+local Lang = require("common.Lang")
+local CommonRankDB = require("common.CommonRankDB")
+local OpenServerRankDB = require("present.OpenServerRankDB")
+local Broadcast = require("broadcast.Broadcast")
+local OpenAct = require("present.OpenAct")
+local YunYingLogic = require("yunying.YunYingLogic")
+local DrawCardLogic = require("drawCard.DrawCardLogic")
+local CommonDefine = require("common.CommonDefine")
+
+--[[
+    local:
+
+	public:
+    	query()					            -- 发送活动信息
+        onCharge()			                -- 充值回调
+        WeekActRank_ResetData(human)        -- 重置玩家身上的充值
+        WeekActRank_ResetDBData()           -- 重置排行榜数据
+--]]
+
+----------------------------------------- 内部处理开始 -------------------------------------
+-- 重置
+function WeekActRank_ResetCharge(human)
+    -- if not human then
+    --     return
+    -- end
+
+    -- human.db.nWeekCharge = 0
+end
+
+-- 获取充值额度
+function WeekActRank_GetCharge(human)
+    -- if not human then
+    --     return 0
+    -- end
+
+    -- if not human.db.nWeekCharge then
+    --     WeekActRank_ResetCharge(human)
+    -- end
+
+    -- return human.db.nWeekCharge
+end
+
+-- 设置充值额度
+function WeekActRank_GetCharge(human, nVal)
+    -- if not human or 0 >= nVal then
+    --     return
+    -- end
+
+    -- if not human.db.nWeekCharge then
+    --     WeekActRank_ResetCharge(human)
+    -- end
+
+    -- human.db.nWeekCharge = human.db.nWeekCharge + nVal
+end
+
+
+----------------------------------------- 外部调用 -------------------------------------
+function WeekActRank_ResetData(human)
+    if not human then
+        return
+    end
+    
+    --WeekActRank_ResetCharge(human)
+end
+
+function WeekActRank_ResetDBData()
+    -- CommonRankDB.ResetData() 
+end
+
+-- 活动结束
+function WeekActRank_End()
+    CommonRankDB.onRewardSend(CommonDefine.COMMONRANK_TYPE_WEEKRANK)
+end
+
+-- 充值回调
+function onCharge(human, price, funcID, buyID)
+    CommonRankDB.onValueAdd(human, CommonDefine.COMMONRANK_TYPE_WEEKRANK, price)
+end
+
+----------------------------------------- 外部调用 -------------------------------------
+
+-- 客户端请求
+function WeekActRank_Query(human)
+    local nRankType = CommonDefine.COMMONRANK_TYPE_WEEKRANK
+	local maxSendRank = CommonRankDB.getMaxSendRank(nRankType)
+
+	local msgRet = Msg.gc.GC_WEEKLOOP_ACT_RANK_QUERY
+	
+	CommonRankDB.wrapOwnerData(nRankType, msgRet.ownerData, human.db._id)
+	
+    for rank = 1,maxSendRank do
+		CommonRankDB.wrapOpenServerRankList(nRankType, msgRet.list[rank], rank)
+	end
+    
+	msgRet.list[0] = maxSendRank
+
+	Msg.send(msgRet, human.fd)
+end
+

+ 4 - 0
script/module/battle/BattleLogic.lua

@@ -66,6 +66,8 @@ local EliteDefine = require("battle.EliteDefine")
 local MaiDianDefine = require("MaiDian.MaiDianDefine")
 local MainDianLogic = require("MaiDian.MaiDianLogic")
 local TalismanLogic = require("talisman.TalismanLogic")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 BATTLE_HANG_EXP_OUT_PERIOD = 60 -- 经验产出时间间隔
 BATTLE_HANG_ITEM_OUT_PERIOD = 300 -- 战利品道具产出时间间隔
@@ -3027,6 +3029,8 @@ function mopupFight(human)
     HeroLogLogic.finishTaskCB(human, HeroLogLogic.HERO_LOG_TYPE_3, 1)
     RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2001)
     YunYingLogic.onCallBack(human, "onMopup", 1)
+
+    TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_SWEEP, human.db._id, 1)
 end
 
 function updateDaily(human)

+ 4 - 0
script/module/chat/ChatLogic.lua

@@ -21,6 +21,8 @@ local ObjHuman = require("core.ObjHuman")
 local InnerMsg = require("core.InnerMsg")
 local CommonDB = require("common.CommonDB")
 local YunYingLogic = require("yunying.YunYingLogic")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 local CHAT_SENDDOWN_RESON_LV = 1
 local CHAT_SENDDOWN_RESON_DAY = 2
@@ -254,6 +256,8 @@ function chat(human, recvMsg, isJson)
 	
     YunYingLogic.onCallBack(human, "ChatTimes", 1)
 
+    TriggerLogic.PublishEvent(TriggerDefine.CHAT_TIMES, human.db._id, 1)
+
     -- 上报消息到后台
 	ChatHandler.chatReport(human,recvMsg.msg)
     return true

+ 4 - 0
script/module/drawCard/DrawCardLogic.lua

@@ -55,6 +55,8 @@ Json = Json or require("common.Json")
 local TalismanLogic = require("talisman.TalismanLogic")
 local MainDianLogic = require("MaiDian.MaiDianLogic")
 local MaiDianDefine = require("MaiDian.MaiDianDefine")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 DRAWCARD_ID0 = 0	-- 积分召唤
 DRAWCARD_ID1 = 1	-- 基础召唤
@@ -715,6 +717,8 @@ local function draw(human, id, op, actConfig, skip,isAct)
         ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_2,heroCnt)
         MengxinLogic.onCallBack(human,MengxinLogic.MX_TASK_TYPE_12,heroCnt)
         YunYingLogic.onCallBack(human, "onDrawCard", heroCnt,nil, id)
+
+        TriggerLogic.PublishEvent(TriggerDefine.DRAWCALL_SERNIOR_CNT, human.db._id, heroCnt)
     end
 
     sendDrawOp(human, id, op, heroList, fenjielist, heroNewList,heroIndexList,isAct)

+ 3 - 1
script/module/friend/FriendLogic.lua

@@ -30,7 +30,8 @@ local ChatRecord = require("chat.ChatRecord")
 local CombatVideo = require("combat.CombatVideo")
 local Log = require("common.Log")
 local YunYingLogic = require("yunying.YunYingLogic")
-
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 local fields = { name = 1, lv = 1, lastLogoutTime = 1, head = 1, headFrame = 1, chenghao = 1, zhandouli = 1}
 local tempHuman = { }
@@ -458,6 +459,7 @@ function fight(human, args)
 	CombatLogic.combatBegin(human, 1001, args, CombatDefine.COMBAT_TYPE14, targetUuid)
 
 	YunYingLogic.onCallBack(human, "friendCombat", 1)
+    TriggerLogic.PublishEvent(TriggerDefine.FRIEND_COMBAT, human.db._id, 1)
 end
 
 

+ 8 - 0
script/module/hero/HeroLogic.lua

@@ -68,6 +68,8 @@ local GiftLogic = require("topup.GiftLogic")
 local HeroMiddleLogic = require("hero.HeroMiddleLogic")
 local CommonDefine = require("common.CommonDefine")
 local HeroExclusiveWeapon = require("hero.HeroExclusiveWeapon")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 HERO_MAX_STAR    =        15    -- 目前英雄最大星级
 
@@ -455,6 +457,9 @@ function addHero(human, id, star, cnt, logType, noSend)
 		heroIndex = addHeroByGrid(human, heroGrid, logType, noSend)
         uuid = heroGrid.uuid
 	end
+
+	TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_GETHERO, human.db._id, cnt, star)
+
 	return heroIndex, uuid
 end
 
@@ -509,6 +514,9 @@ function addHeroByGrid(human, heroGrid, logType, noSend)
 
 	writeLogHeroAdd(human, logType, heroGrid)
 	checkChangeMaxZDL(human, heroGrid)
+
+	TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_GETHERO, human.db._id, 1, heroGrid.star)
+
 	return emptyIndex
 end
 

+ 3 - 0
script/module/jjc/JjcLogic.lua

@@ -80,6 +80,8 @@ local MengxinLogic = require("present.MengxinLogic")
 local YunYingLogic = require("yunying.YunYingLogic")
 local Timer = require("core.Timer")
 local WarOrder = require("shop.WarOrder")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 local ARENA_ORDER_TYPE = 4
 
@@ -999,6 +1001,7 @@ function fight(human, args, combatType)
     MengxinLogic.onCallBack(human,MengxinLogic.MX_TASK_TYPE_3,1)
     HeroLogLogic.finishTaskCB(human,HeroLogLogic.HERO_LOG_TYPE_2,1)
     YunYingLogic.onCallBack(human, "onJjcFight",1)
+	TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_CHAMPIONSNUM, human.db._id, 1)
 end
 
 -- 挑战结束

+ 4 - 0
script/module/middle/MiddleCommonLogic.lua

@@ -19,6 +19,8 @@ local CombatLogic = require("combat.CombatLogic")
 local CombatPosLogic = require("combat.CombatPosLogic")
 local MiddleDefine = require("middle.MiddleDefine")
 local YunYingLogic = require("yunying.YunYingLogic")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 local MIDDLE_FRIEND_FIGHT_MAP = 1001
 
@@ -256,6 +258,7 @@ function MiddleCommonLogic_CombatBegin_SendWL(fd, msg)
     }
 
     YunYingLogic.onCallBack(human, "friendCombat", 1)
+    TriggerLogic.PublishEvent(TriggerDefine.FRIEND_COMBAT, human.db._id, 1)
 
     print("[MiddleCommonLogic_CombatBegin_SendWL] 开始进行战斗")
 
@@ -266,3 +269,4 @@ function MiddleCommonLogic_CombatBegin_SendWL(fd, msg)
     print("[MiddleCommonLogic_CombatBegin_SendWL] 战斗结束清理数据")
 end
 ---------------------------- 战斗相关结束 --------------------------------
+

+ 720 - 0
script/module/middle/MiddleCommonRank.lua

@@ -0,0 +1,720 @@
+--------------------------------
+-- 文件名       :  MiddleCommonRank.lua
+-- 文件说明     :  跨服相关-跨服排行榜
+-- 创建时间     :   2025/04/02
+-- 创建人       :   FC
+--------------------------------
+
+local Msg = require("core.Msg")
+local Timer = require("core.Timer")
+local DB = require("common.DB")
+local CommonDB = require("common.CommonDB")
+local CommonDefine = require("common.CommonDefine")
+local Log = require("common.Log")
+local LuaMongo = _G.lua_mongo
+local Util = require("common.Util")
+local Grid = require("bag.Grid")
+local MiddleConnect = require("middle.MiddleConnect")
+local InnerMsg = require("core.InnerMsg")
+local MiddleManager = require("middle.MiddleManager")
+local ServerCommerceRankConf = require("excel.ServerCommerce").CommerceRank
+
+-- 缓存的排行榜数据
+local MIDDLE_COMMON_RANK = {
+--[[
+    [nRankType] = 
+    {
+        [nRankSubType] = 
+        {
+            [nServerKey] = {
+                nRankType = xx,
+                nRankSubType = xx,
+                nServerKey = xx,
+                -- 根据UUID获取名次   
+                uuid2rank = {               
+                    [uuid] = rank,          -- 玩家uuid = 排行名次
+                },
+
+                -- 根据UUID获取发送名次
+                sendUuid2rank = {           
+                    [uuid] = rank,          -- 玩家uuid = 真实发送的排行名次
+                },
+
+                -- 根据名次获取DATA (DB存储的数据相同)
+                rank2data = {   
+                     [nRank] = {
+                        uuid,           -- 玩家UID
+                        name,           -- 玩家name
+                        head,           -- 玩家头像
+                        headFrame,      -- 玩家头像框
+                        nSrcServerID,   -- 玩家所属服务器
+                        nValue,         -- 玩家排行值
+                        nTime,          -- 更新时间
+                    }            
+                }
+            }
+        }
+    }
+]]
+
+}
+
+-- 缓存战区已经处理完的全服邮件服务器
+local MIDDLE_SENDSERVER_MAIL = 
+{
+
+}
+
+-- 上榜的最小条件
+local MIDDLE_COMMON_MIN_RANK = nil
+
+-- 对应排名需要上榜条件
+local MIDDLE_RANK_NEED_VALUES = nil
+
+-- 通过 排行榜类型,排行榜子类型,所属战区服务器key(WarZone中的nMinServerID),uuid查找DB数据
+MiddleRankQueryForData = {nRankType = 1, nRankSubType = 1, nServerKey = 1 ,uuid = 1}
+
+-- 通过排行榜类型,排行榜子类型,所属战区服务器key(WarZone中的nMinServerID),DB的uuid更新DB数据
+MiddleRankQueryByUuid = {nRankType = 1, nRankSubType = 1, nServerKey = 1, _id = 1}             
+
+-- 通过排行榜类型,排行榜子类型,所属战区服务器key(WarZone中的nMinServerID)
+MiddleRankQueryByRankType = {nRankType = 1, nRankSubType = 1, nServerKey = 1}  
+
+-- 获取配置
+local function MiddleCommonRank_GetConfByType(nRankType)
+    if CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE == nRankType then
+        return ServerCommerceRankConf
+    end
+
+    return nil
+end
+
+local function MiddleCommonRank_GetMinValue(nRankType, nRankSubType)
+    local tRankConf = MiddleCommonRank_GetConfByType(nRankType)
+    if not tRankConf then
+        return nil
+    end
+
+    local nMinRankValue
+    if CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE == nRankType then
+        for _, v in pairs(tRankConf) do
+            if v.nRankType == nRankSubType then
+                if not nMinRankValue or v.nPoint < nMinRankValue then
+                    nMinRankValue = v.nPoint
+                end
+            end
+        end
+    end
+
+    return nMinRankValue
+end
+
+-- 获取最小上榜条件
+local function MiddleCommonRank_GetMinRankValue(nRankType, nRankSubType)
+    if MIDDLE_COMMON_MIN_RANK and MIDDLE_COMMON_MIN_RANK[nRankType] then
+        return MIDDLE_COMMON_MIN_RANK[nRankType][nRankSubType]
+    end
+
+    local nMinValue = MiddleCommonRank_GetMinValue(nRankType, nRankSubType)
+    if nil == nMinValue then
+        return nil
+    end
+
+    if not MIDDLE_COMMON_MIN_RANK then
+        MIDDLE_COMMON_MIN_RANK = {}
+    end
+
+    if not MIDDLE_COMMON_MIN_RANK[nRankType] then
+        MIDDLE_COMMON_MIN_RANK[nRankType] = {}
+    end
+
+    MIDDLE_COMMON_MIN_RANK[nRankType][nRankSubType] = nMinValue
+
+    return nMinValue
+end
+
+-- 获取最大排行榜长度
+local function MiddleCommonRank_GetMaxRankLen()
+    return CommonDefine.COMMONRANK_SAVE_DB_LEN
+end
+
+-- 获取对应名次上榜所需要求值
+local function MiddleCommonRank_GetRankNeedValue(nRankType, nRankSubType, nRank)
+	MIDDLE_RANK_NEED_VALUES = MIDDLE_RANK_NEED_VALUES or {}
+
+	local minRankValue = MiddleCommonRank_GetMinRankValue(nRankType, nRankSubType)
+    if nil == minRankValue then
+       print("[MiddleCommonRank_GetRankNeedValue] 获取最小上排行榜值失败") 
+       return
+    end
+
+	if MIDDLE_RANK_NEED_VALUES[nRankType] and MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType] then 
+		local nValue = nil
+        for _, tData in ipairs(MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType]) do
+            if tData.nMinRank <= rank and tData.nMaxRank >= rank then
+                nValue = tData.nValue
+                break
+            end
+        end
+
+        return nValue or minRankValue
+	end
+
+    local tRankConfig = MiddleCommonRank_GetConfByType(nRankType)
+    if not tRankConfig then
+        return
+    end
+
+    if not MIDDLE_RANK_NEED_VALUES[nRankType] then
+        MIDDLE_RANK_NEED_VALUES[nRankType] = {}
+    end
+
+    if not MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType] then
+        MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType] = {}
+    end
+
+    local nValue = nil
+    for _, v in pairs(tRankConfig) do
+        if v.nRankType == nRankSubType then
+            local nMinRank = v.nOrder[1]
+            local nMaxRank = v.nOrder[2]
+            table.insert(MIDDLE_RANK_NEED_VALUES[nRankType][nRankSubType], {nMinRank = nMinRank, nMaxRank = nMaxRank, nValue = v.nPoint})
+    
+            if nMinRank <= rank and nMaxRank >= rank then
+                nValue = v.nPoint
+            end
+        end
+    end
+ 
+	return nValue or minRankValue
+end
+
+-- 获取指定排名类型缓存数据
+local function MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
+    if not MIDDLE_COMMON_RANK or not MIDDLE_COMMON_RANK[nRankType] or 
+        not MIDDLE_COMMON_RANK[nRankType][nRankSubType] or not MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] then
+        return nil
+    end
+
+
+    return MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey]
+end
+
+-- -- 获取指定排名类型、指定用户的排名
+local function MiddleCommonRank_GetRankDataByUid(nRankType, nRankSubType, nServerKey, uuid)
+    local tRankCacheData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
+    if not tRankCacheData then
+        return
+    end
+
+    return tRankCacheData.uuid2rank[uuid]
+end
+
+-- 获取指定排名类型、指定用户的发送排名
+local function MiddleCommonRank_GetSendRank(nRankType, nRankSubType, nServerKey, uuid)
+    local tRankCacheData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
+    if not tRankCacheData then
+        return
+    end
+
+    return board.sendUuid2rank[uuid]
+end
+
+-- 排序
+local function MiddleCommonRank_CmpRank(data1, data2)
+    if data1.nValue ~= data2.nValue then
+        return data1.nValue > data2.nValue
+    end
+
+    return data1.nTime < data2.nTime
+end
+
+-- 更新排名
+local function MiddleCommonRank_UpdateRank(tRankData)
+    if not tRankData then
+        return
+    end
+
+    -- 清空普通排名和发送排名玩家数据
+    for uuid in pairs(tRankData.uuid2rank) do
+        tRankData.uuid2rank[uuid] = nil
+        tRankData.sendUuid2rank[uuid] = nil
+    end
+
+    -- 设置普通排名
+    for rank, data in ipairs(tRankData.rank2data) do
+		board.uuid2rank[data.uuid] = rank
+	end
+
+    -- 清空发送排名
+    for rank in ipairs(tRankData.sendRank2data) do
+        board.sendRank2data[rank] = nil
+    end
+
+    local minRankValue = MiddleCommonRank_GetMinRankValue(tRankData.nRankType, tRankData.nRankSubType)                -- 排名最小需要的排名值
+    local aleadyRankCnt = 0                                             -- 已经排好的玩家数
+    local maxRank = MiddleCommonRank_GetMaxRankLen(tRankData.nRankType)  -- 最多排名玩家数量
+    for rank = 1, maxRank do
+        -- 取当前排名需要的排名值
+        local rankNeedValue = MiddleCommonRank_GetRankNeedValue(tRankData.nRankType, tRankData.nRankSubType, rank)
+
+        local rank2data = tRankData.rank2data[aleadyRankCnt + 1]        -- 当前排的玩家
+        if rank2data then                                               -- 还有玩家需要排
+            if rank2data.value >= rankNeedValue then                    -- 达到排名值,可以排名
+    		    board.sendUuid2rank[rank2data.uuid] = rank              -- 设置玩家发送排名
+    		    board.sendRank2data[rank] = rank2data                   -- 设置发送排名数据
+    		    aleadyRankCnt = aleadyRankCnt + 1                       -- 排名玩家数量+1
+            elseif rankNeedValue <= minRankValue then                   -- 未达到排名值 且 当前排名值 小于等于 最小需要的排名值了,则后面的玩家都不需要排了
+                    break
+            else                                                       -- 未到达最低排名值,当前名次未有玩家达到
+                board.sendRank2data[rank] = -1
+            end
+        else                                                            -- 没玩家排了直接停止
+            break
+        end
+    end
+end
+
+-- 更新数据
+local function MiddleCommonRank_UpdateData(nRankType, nRankSubType, nServerKey, data)
+    local tRankData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
+    if not tRankData then
+        return
+    end
+
+    local uuid = data.uuid
+    local oldRank = MiddleCommonRank_GetRankDataByUid(nRankType, nRankSubType, nServerKey, uuid) or (#tRankData.rank2data + 1)
+    board.rank2data[oldRank] = data
+
+    -- 向后比较(data.value 减少时),往排名低方向->
+    for i = oldRank + 1, #tRankData.rank2data do
+        local data1 = tRankData.rank2data[i - 1]
+        local data2 = tRankData.rank2data[i]
+        if MiddleCommonRank_CmpRank(data1, data2) then
+            break
+        end
+        board.rank2data[i - 1] = data2
+        board.rank2data[i] = data1
+    end
+
+    -- 向前比较(data.value 增加时),往排名高方向<-
+    for i = oldRank - 1, 1, -1 do
+        local data1 = tRankData.rank2data[i]
+        local data2 = tRankData.rank2data[i + 1]
+        if MiddleCommonRank_CmpRank(data1, data2) then
+            break
+        end
+        tRankData.rank2data[i] = data2
+        tRankData.rank2data[i + 1] = data1
+    end  
+
+    local maxRank = MiddleCommonRank_GetMaxRankLen()
+    tRankData.rank2data[maxRank + 1] = nil
+    return true
+end
+
+-- 起服将数据插入排行榜
+local function MiddleCommonRank_InsertCacheData(data)
+    local tRankData = MiddleCommonRank_GetRankDataByType(data.nRankType, data.nRankSubType, data.nServerKey)
+    if not tRankData then
+        print("[MiddleCommonRank_InsertCacheData] 不存在对应的排行榜数据")
+        return
+    end
+
+    table.insert(tRankData.rank2data, data)
+end
+
+-- 对整个排行榜进行排序
+local function MiddleCommonRank_SortAllRank(nRankType, nRankSubType, nServerKey)
+    local tRankData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
+    if not tRankData then
+        print("[MiddleCommonRank_SortAllRank] 不存在对应的排行榜数据")
+        return false
+    end
+
+    table.sort(tRankData.rank2data, MiddleCommonRank_CmpRank)
+
+    local maxRank = MiddleCommonRank_GetMaxRankLen(nRankType)
+    local nNowLen = #tRankData.rank2data
+
+    -- 大于了排行榜最大缓存数据
+    if maxRank < nNowLen then
+        for i = maxRank + 1, nNowLen, 1 do
+            tRankData.rank2data[i] = nil
+        end
+    end
+
+    return true
+end
+
+-- 重置排行数据
+local function MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
+    if not MIDDLE_COMMON_RANK[nRankType] then
+        MIDDLE_COMMON_RANK[nRankType] = {}
+    end
+
+    if not MIDDLE_COMMON_RANK[nRankType][nRankSubType] then
+        MIDDLE_COMMON_RANK[nRankType][nRankSubType] = {}
+    end
+
+    if not MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] then
+        MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey]  = {}
+    end
+
+    MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].nRankType = nRankType
+    MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].nRankSubType = nRankSubType
+    MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].nServerKey = nServerKey
+
+    MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].uuid2rank = {}        -- 根据UUID获取名次   
+    MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].sendUuid2rank = {}    -- 根据UUID获取发送名次   
+    MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].rank2data = {}        -- 根据名次获取DATA
+    MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey].sendRank2data = {}    -- 根据名次获取发送DATA
+end
+
+-- 初始排行榜
+local function MiddleCommonRank_InitCacheData(nRankType, nRankSubType)
+   if not MIDDLE_COMMON_RANK[nRankType] then
+        MIDDLE_COMMON_RANK[nRankType] = {}
+   end
+
+   if not MIDDLE_COMMON_RANK[nRankType][nRankSubType] then
+        MIDDLE_COMMON_RANK[nRankType][nRankSubType] = {}
+   end
+end
+
+-- 加载排行榜
+local function MiddleCommonRank_LoadDBData()
+    local cnt = 0
+    LuaMongo.find(DB.db_middle_rank, nil)
+    local tNeedSortRank = {}
+    while true do
+        local data = {}
+        if not LuaMongo.next(data) then
+            break
+        end
+
+        cnt = cnt + 1
+        if cnt % 1000 == 0 then
+            _G.collectgarbage("step", 100000)
+        end
+        
+        if not tNeedSortRank[data.nRankType] then
+            tNeedSortRank[data.nRankType] = {}
+        end
+
+        if not tNeedSortRank[data.nRankType][data.nRankSubType] then
+            tNeedSortRank[data.nRankType][data.nRankSubType] = {}
+        end
+
+        if not tNeedSortRank[data.nRankType][data.nRankSubType][data.nServerKey] then
+            tNeedSortRank[data.nRankType][data.nRankSubType][data.nServerKey] = 1
+            MiddleCommonRank_ResertCacheData(data.nRankType, data.nRankSubType, data.nServerKey)
+        end
+
+        -- 先插入数据, 后排序
+        MiddleCommonRank_InsertCacheData(data)
+    end
+
+    for nRankType, v1 in pairs(tNeedSortRank) do
+        for nRankSubType, v2 in pairs(v1) do
+            for nServerKey, _ in pairs(v2) do
+                local bRet = MiddleCommonRank_SortAllRank(nRankType, nRankSubType, nServerKey)
+                if true == bRet then
+                    print("[MiddleCommonRank_LoadDBData] 排序成功 nRankType = "..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
+                else
+                    print("[MiddleCommonRank_LoadDBData] 排序失败 nRankType = "..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
+                end
+            end
+        end
+    end
+
+    for nRankType, v1 in pairs(MIDDLE_COMMON_RANK) do
+        for nRankSubType, v2 in pairs(v1) do
+            for nServerKey, tData in pairs(v2) do
+                MiddleCommonRank_UpdateRank(tData)
+            end
+        end
+    end
+end
+
+-- 根据类型+uuid从db中取data
+local function MiddleCommonRank_GetDBDataByUid(nRankType, nRankSubType, nServerKey, uuid)
+    -- MiddleRankQueryForData = {nRankType = 1, nRankSubType = 1, nServerKey = 1 ,uuid = 1}
+    MiddleRankQueryForData.nRankType = nRankType
+    MiddleRankQueryForData.nRankSubType = nRankSubType
+    MiddleRankQueryForData.nServerKey = nServerKey
+    MiddleRankQueryForData.uuid = uuid
+
+    local data = {}
+    LuaMongo.find(DB.db_middle_rank, CoomonQueryForData)
+    return LuaMongo.next(data) and data
+end
+
+-- 更新DB数据
+local function MiddleCommonRank_UpdateDBData(data)
+    local oldData = MiddleCommonRank_GetDBDataByUid(data.nRankType, data.nRankSubType, data.nServerKey, data.uuid)
+    if oldData then
+        MiddleRankQueryForData.nRankType = data.nRankType
+        MiddleRankQueryForData.nRankSubType = data.nRankSubType
+        MiddleRankQueryForData.nServerKey = data.nServerKey
+        MiddleRankQueryForData.uuid = data.uuid
+        LuaMongo.update(DB.db_middle_rank, MiddleRankQueryForData, data)
+    else
+        LuaMongo.insert(DB.db_middle_rank, data)
+    end
+end
+
+-- 设置排名数据
+local function MiddleCommonRank_SetRankInfo(data)
+    local tRankData = MiddleCommonRank_GetRankDataByType(data.nRankType, data.nRankSubType, data.nServerKey)
+    if not tRankData then
+        print("[MiddleCommonRank_SetRankInfo] 获取不到缓存的排行数据")
+        return
+    end
+
+    MiddleCommonRank_UpdateData(data.nRankType, data.nRankSubType, data.nServerKey, data)
+    MiddleCommonRank_UpdateRank(tRankData)
+    MiddleCommonRank_UpdateDBData(data)
+end
+
+-- 检查缓存
+local function MiddleCommonRank_CheckHaveCache(nRankType, nRankSubType, nServerKey)
+    if not MIDDLE_COMMON_RANK[nRankType] then
+        MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
+        print("[MiddleCommonRank_CheckHaveCache] 检查缓存 不存在对应 nRankType 缓存,重新创建 nRankType = "
+                    ..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
+        return
+    end
+
+    if not MIDDLE_COMMON_RANK[nRankType][nRankSubType] then
+        MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
+        print("[MiddleCommonRank_CheckHaveCache] 检查缓存 不存在对应 nRankSubType 缓存,重新创建 nRankType = "
+                    ..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
+        return
+    end
+
+    if not MIDDLE_COMMON_RANK[nRankType][nRankSubType][nServerKey] then
+        MiddleCommonRank_ResertCacheData(nRankType, nRankSubType, nServerKey)
+        print("[MiddleCommonRank_CheckHaveCache] 检查缓存 不存在对应 nServerKey 缓存,重新创建 nRankType = "
+                    ..nRankType.." nRankSubType = "..nRankSubType.." nServerKey = "..nServerKey)
+        return
+    end
+end
+
+-------------------------------------------------- 外部调用 -----------------------------------------
+-- 启动就初始化
+function MiddleCommonRank_InitAfterStart()
+    -- 不是中心服不用处理
+    if _G.is_middle ~= true then
+        return
+    end
+
+   -- 先初始化一下
+    MiddleCommonRank_InitCacheData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER)
+    MiddleCommonRank_InitCacheData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN)
+
+    -- 加载DB数据
+    MiddleCommonRank_LoadDBData()
+end
+
+-- 获取到跨服数据
+function MiddleCommonRank_ReceiveRankData(tMsgData)
+    if _G.is_middle ~= true then
+        return
+    end
+
+    local nConfServerID = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(tMsgData.nSrcServerID)
+    local nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nConfServerID)
+    local tDBData = MiddleCommonRank_GetDBDataByUid(tMsgData.nRankType, tMsgData.nRankSubType, nServerKey, tMsgData.uuid)
+    if not tDBData then
+        tDBData = {}
+    end
+
+    -- 检查缓存, 主要是 nConfServerID 这个对应的排行数据可能需要建立
+    MiddleCommonRank_CheckHaveCache(tMsgData.nRankType, tMsgData.nRankSubType, nServerKey)
+
+    tDBData.uuid = tMsgData.uuid
+    tDBData.name = tMsgData.name
+    tDBData.head = tMsgData.head
+    tDBData.headFrame = tMsgData.headFrame
+    tDBData.nSrcServerID = tMsgData.nSrcServerID
+    tDBData.nRankType = tMsgData.nRankType
+    tDBData.nRankSubType = tMsgData.nRankSubType
+    tDBData.nServerKey = nServerKey
+
+    -- 已经存在数据的用之前上榜的时间
+    tDBData.nTime = tDBData.nTime or os.time()
+
+    -- 排行的value值需要判断
+    tDBData.nValue = tDBData.nValue or 0
+
+    local nMinValue = MiddleCommonRank_GetMinValue(tMsgData.nRankType, tMsgData.nRankSubType)
+    if not nMinValue then
+        print("[MiddleCommonRank_ReceiveRankData] 获取不到对应的最小上榜条件")
+        return
+    end
+
+    local bUpRank = false
+    if CommonDefine.COMMONRANK_VALUE_REPLACE == tMsgData.nOperate then
+        -- 直接替换,对应nValue在普通服有存储,发上来都是最终的值,不满足条件可以不存
+        tDBData.nValue = tMsgData.nValue
+        if tDBData.nValue >= nMinValue then
+            bUpRank = true
+        end
+    elseif CommonDefine.COMMONRANK_VALUE_ADD == tMsgData.nOperate then
+        -- 直接增加的操作需要存库
+        tDBData.nValue = tDBData.nValue + tMsgData.nValue
+        bUpRank = true
+    end
+
+    if true == bUpRank then
+        MiddleCommonRank_SetRankInfo(tDBData)
+        print("[MiddleCommonRank_ReceiveRankData] 玩家上榜进行成功")
+    end
+end
+
+function MiddleCommonRank_QueryRankInfo(tMsgData)
+    if _G.is_middle ~= true then
+        return
+    end
+
+    local nRankType = tMsgData.nRankType
+    local nRankSubType = tMsgData.nRankSubType
+    local nServerKey = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(tMsgData.nSrcServerID)
+    nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nServerKey)
+    local nSrcFD = MiddleManager.getFDBySvrIndex(tMsgData.nSrcServerID)
+    if not nSrcFD then
+        print("[MiddleCommonRank_QueryRankInfo] 获取不到对应的 服务器的 fd nSrcServerID = "..tMsgData.nSrcServerID)
+        return
+    end
+
+    -- 检查缓存, 主要是 nServerKey 这个对应的排行数据可能需要建立
+    MiddleCommonRank_CheckHaveCache(tMsgData.nRankType, tMsgData.nRankSubType, nServerKey)
+
+    local tSendMsgData = InnerMsg.wl.WL_COMMERCE_QUERY_RANK_INFO
+    tSendMsgData.nRankType = nRankType
+    tSendMsgData.nRankSubType = nRankSubType
+    tSendMsgData.nServerKey = nServerKey
+    tSendMsgData.nBegin = 1
+    tSendMsgData.nEnd = 0
+    tSendMsgData.tRankData = {}
+    tSendMsgData.tRankData[0] = 0
+
+    local tRankCacheData = MiddleCommonRank_GetRankDataByType(nRankType, nRankSubType, nServerKey)
+    if not tRankCacheData or nil == _G.next(tRankCacheData) then
+        tSendMsgData.nEnd = 1
+    else
+        for nRank, v in ipairs(tRankCacheData.sendRank2data) do
+            tSendMsgData.tRankData[0] = tSendMsgData.tRankData[0] + 1
+            tSendMsgData.tRankData[tSendMsgData.tRankData[0]] = {
+                nRank = nRank,
+                tRankData = v,
+            }
+
+            if tSendMsgData.tRankData[0] >= CommonDefine.COMMONRANK_ONE_SEND_LEN then
+                InnerMsg.send(nSrcFD, tSendMsgData)
+                tSendMsgData.tRankData[0] = 0
+                tSendMsgData.nBegin = 0
+            end
+        end
+
+        if tSendMsgData.tRankData[0] > 0 then
+            tSendMsgData.nEnd = 1
+            InnerMsg.send(nSrcFD, tSendMsgData)
+        end
+    end
+end
+
+-- 请求服务器排行榜对应服务器排名
+function MiddleCommonRank_QueryServerRank(msg)
+    local nSrcFD = MiddleManager.getFDBySvrIndex(msg.nSrcServerID)
+    if not nSrcFD then
+        print("[MiddleCommonRank_QueryServerRank] 获取不到对应的 服务器的 fd nSrcServerID = "..msg.nSrcServerID)
+        return
+    end
+
+    local tMsgData = InnerMsg.wl.WL_COMMERCE_GET_SERVERRANK_PRIZE
+    tMsgData.nOperate = msg.nOperate
+
+    local nServerKey = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(msg.nSrcServerID)
+    nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nServerKey)
+
+    local tRankCacheData = MiddleCommonRank_GetRankDataByType(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE,
+                            CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER, nServerKey)
+    if not tRankCacheData then
+        tMsgData.nRank = MiddleCommonRank_GetMaxRankLen() + 1
+    else
+        for nRank, v in ipairs(tRankCacheData) do
+            if v.uuid == msg.nServerUuid then
+                tMsgData.nRank = nRank
+                break
+            end
+        end
+    end
+
+    if not tMsgData.nRank then
+        tMsgData.nRank = MiddleCommonRank_GetMaxRankLen() + 1
+    end
+
+    InnerMsg.send(nSrcFD, tMsgData)
+end
+
+-- 服务器发送全服邮件结束
+function MiddleCommonRank_ServerMailOk(msg)
+    -- 先获取对应配置ID,再获取最小的ID
+    local nConfServerID = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(msg.nSrcServerID)
+    local nServerKey, nMaxServerID = MiddleConnect.MiddleConnect_GetWarZoneServer(nConfServerID)
+
+    if not MIDDLE_SENDSERVER_MAIL[nServerKey] then
+        MIDDLE_SENDSERVER_MAIL[nServerKey] = {}
+    end
+
+    MIDDLE_SENDSERVER_MAIL[nServerKey][nConfServerID] = 1
+    
+    local bOK = true
+    for i = nServerKey, nMaxServerID, 1 do
+        if not MIDDLE_SENDSERVER_MAIL[nServerKey][i] then
+            bOK = false
+            break
+        end
+    end
+
+    -- 发送全服个人奖励
+    if true == bOK then
+        local tRankData = MiddleCommonRank_GetRankDataByType(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE,
+                        CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN, nServerKey)
+        if tRankData then
+            local tMsgData = InnerMsg.wl.WL_COMMERCE_SEND_HUMAN_PRIZE
+            for nRank, v in ipairs(tRankData) do
+                tMsgData.nRank = nRank
+                tMsgData.uuid = v.uuid
+                local nSrcFD = MiddleManager.getFDBySvrIndex(v.nSrcServerID)
+                if nSrcFD then
+                    InnerMsg.send(nSrcFD, tMsgData)
+                else
+                    print("[MiddleCommonRank_ServerMailOk] 获取不到对应服务器的FD nSrcServerID = "..v.nSrcServerID)
+                end
+            end
+        end
+    end
+end
+
+function MiddleCommonRank_ClearRank(msg)
+    local nConfServerID = MiddleConnect.MiddleConnect_TrueServerID2ConfServerID(msg.nSrcServerID)
+    local nServerKey = MiddleConnect.MiddleConnect_GetWarZoneServer(nConfServerID)
+
+    MiddleCommonRank_ResertCacheData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER, nServerKey)
+    MiddleCommonRank_ResertCacheData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN, nServerKey)
+
+    MiddleRankQueryForData.nRankType = CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE
+    MiddleRankQueryForData.nRankSubType = CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER
+    MiddleRankQueryForData.nServerKey = nServerKey
+
+    LuaMongo.find(DB.db_middle_rank, MiddleRankQueryForData)
+    local tData  = {}
+    if not LuaMongo.next(tData) then
+        return
+    end
+
+    LuaMongo.remove(DB.db_middle_rank, MiddleRankQueryForData)
+end

+ 1 - 2
script/module/middle/MiddleConnect.lua

@@ -26,7 +26,7 @@ local function questMiddleInfo()
 end
 
 -- 获取战区最小和最大服务器ID
-local function MiddleConnect_GetWarZoneServer(nSeverID)
+function MiddleConnect_GetWarZoneServer(nSeverID)
     local tWarZoneConf = WarZoneConf.group
     if not tWarZoneConf then
         return 0, 0
@@ -168,7 +168,6 @@ function LW_HELLO(fd, msg)
 
     msg = InnerMsg.wl.WL_HEARTBEAT
     InnerMsg.sendMsg(fd, msg)
-    
     -- 同步其它信息
     -- JjcLadderMiddle.sendWLMobaiCnt(fd)
 end

+ 1 - 1
script/module/role/RoleLogic.lua

@@ -20,7 +20,6 @@ local Util = require("common.Util")
 local FriendDBLogic = require("friend.FriendDBLogic")
 local HeroLogic = require("hero.HeroLogic")
 local UnionLogic = require("union.UnionLogic")
-local Msg = require("core.Msg")
 local RoleHeadLogic = require("role.RoleHeadLogic")
 local UnionExcel = require("excel.union")
 local FilterUtil = require("common.FilterUtil")
@@ -155,6 +154,7 @@ function makePlayInfo(net, uuid)
             net.defenceList[0] = net.defenceList[0] + 1
             local defenceNet = net.defenceList[net.defenceList[0]]
             HeroGrid.makeHeroSimple(defenceNet, heroGrid, heroGrid.bagIndex, FAKE_HUMAN)
+
             if i == CombatDefine.COMBAT_HERO_CNT then
                 net.yjUuid = uuid
             end

+ 18 - 8
script/module/serverCommerce/Handler.lua

@@ -1,40 +1,50 @@
-
+local CommerceActCharge = require("serverCommerce.ServerCommerceActCharge")
+local CommerceActShop = require("serverCommerce.ServerCommerceActShop")
+local CommerceActRank = require("serverCommerce.ServerCommerceActRank")
+local CommerceActTask =  require("serverCommerce.ServerCommerceActTask")
 
 -- 请求战区集结任务信息
 function CG_SERVEERCOMMERCE_ACT_TASKQUERY(human, msg)
-    
+    CommerceActTask.CommerceActTask_QueryTask(human, msg.nDay) 
 end
 
 -- 请求领取任务奖励
 function CG_SERVEERCOMMERCE_ACT_GETTASKPRIZE(human, msg)
-    
+    CommerceActTask.CommerceActTask_GetTaskPrize(human, msg.nDay) 
 end
 
--- 战区集结 - 领取任务积分奖励
-function CG_SERVEERCOMMERCE_ACT_GETTASKPOINTPRIZE(human, msg)
-    
+-- 请求任务积分信息
+function CG_SERVEERCOMMERCE_ACT_TASKPOINTQUERY(human, msg)
+    CommerceActTask.CommerceActTask_QueryTaskPoint(human)
 end
 
-function CG_SERVEERCOMMERCE_ACT_TASKPOINTQUERY(human, msg)
-    
+-- 战区集结 - 领取任务积分奖励
+function CG_SERVEERCOMMERCE_ACT_GETTASKPOINTPRIZE(human, msg)
+    CommerceActTask.CommerceActTask_GetTaskPointPrize(human)
 end
 
 ----------------------------------------- 连充豪礼协议请求开始 -------------------------------------
 -- 请求连充豪礼-信息
 function CG_SERVEERCOMMERCE_ACT_CHARGEQUERY(human, msg)
+    CommerceActCharge.CommerceActCharge_Query(human, msg.nMoney)
 end
 
 -- 请求领取连充豪礼
 function CG_SERVEERCOMMERCE_ACT_CHARGEGETPRIZE(human, msg)
+    CommerceActCharge.CommerceActCharge_GetPrize(human, msg.nMoney)
 end
 
 ----------------------------------------- 战区钜惠请求开始 -------------------------------------
 function CG_SERVEERCOMMERCE_ACT_SHOPQUERY(human, msg)
+    CommerceActShop.CommerceActShop_Query(human)
 end
 
 function CG_SERVEERCOMMERCE_ACT_SHOPGETPRIZE(human, msg)
+    CommerceActShop.CommerceActShop_GetPrize(human)
+
 end
 
 ----------------------------------------- 排行榜协议请求开始 -------------------------------------
 function CG_SERVEERCOMMERCE_ACT_RANK_QUERY(human, msg)
+    CommerceActRank.CommercerActRank_Query(human, msg.nRankType)
 end

+ 3 - 2
script/module/serverCommerce/Proto.lua

@@ -74,7 +74,8 @@ CG_SERVEERCOMMERCE_ACT_GETTASKPOINTPRIZE = {}
 CHARGEINFO = {
     {"nID",             1,      "int"},         -- 奖励编号
     {"nState",          1,      "byte"},        -- 0 不可领取 1 - 可领取 2- 已领取
-    {"nDay",            1,      "int"},           -- 天数
+    {"nDay",            1,      "int"},         -- 天数
+    {"nAllMoney",         1,        "int"},     -- 已累充金额
     {"item",            5,      ItemData},      -- 奖励信息
 }
 
@@ -87,7 +88,7 @@ CG_SERVEERCOMMERCE_ACT_CHARGEQUERY = {
 GC_SERVEERCOMMERCE_ACT_CHARGEQUERY = {
     {"nMoney",            1,       "int"},          -- 金额
     {"nChargeDay",        1,        "int"},         -- 已充值天数
-    {"list",              5,        CHARGEINFO},    -- 信息
+    {"list",              10,        CHARGEINFO},    -- 信息
 }
 
 -- 请求领取连充豪礼

+ 211 - 0
script/module/serverCommerce/ServerCommerceActCharge.lua

@@ -0,0 +1,211 @@
+--------------------------------
+-- 文件名       :   ServerCommerceActCharge.lua
+-- 文件说明     :   跨服商业-连充豪礼
+-- 创建时间     :   2025/03/31
+-- 创建人       :   FC
+--------------------------------
+
+local Util = require("common.Util")
+local Msg = require("core.Msg")
+local Grid = require("bag.Grid")
+local BagLogic = require("bag.BagLogic")
+local CommonDefine = require("common.CommonDefine")
+local ServerCommerceConf = require("excel.ServerCommerce")
+local ServerCommerceManager = require("serverCommerce.ServerCommerceManager")
+
+
+----------------------------------------- 内部处理开始 -------------------------------------
+-- 获取配置
+local function CommerceActCharge_GetCof()
+    return ServerCommerceConf.CommerceCharge
+end
+
+-- 初始化DB数据()
+function CreatDB(human)
+    if not human.db.ServerCommerce or not human.db.ServerCommerce.Charge then
+        print("[CommerceActCharge_CreatDB] 初始化数据失败 name = "..human.db.name)
+        return false
+    end
+
+    local tConf = CommerceActCharge_GetCof()
+    for _, v in ipairs(tConf) do
+        if not human.db.ServerCommerce.Charge[v.nMoney] then
+            human.db.ServerCommerce.Charge[v.nMoney] = {}
+        end
+       
+        if not human.db.ServerCommerce.Charge[v.nMoney][v.nDay] then
+            human.db.ServerCommerce.Charge[v.nMoney][v.nDay] = {
+                nBuyTime = 0,
+                nStatus = CommonDefine.COMMON_PRIZE_STATE_NOGET,
+                nAllMoney = 0,
+            }
+        else
+            print("[CommerceActCharge_CreateDB] 配置了重复的数据")
+            return false
+        end
+    end
+
+    return true
+end
+
+-- 获取天数数据
+local function CommerceActCharge_GetDBByDay(human, nMoney, nDay)
+    if not human.db.ServerCommerce.Charge[nMoney] then
+        return nil
+    end
+
+    if not human.db.ServerCommerce.Charge[nMoney][nDay] then
+        return nil
+    end
+
+    return human.db.ServerCommerce.Charge[nMoney][nDay]
+end
+
+-- 获取金钱对应数据
+local function CommerceActCharge_GetDBByMoney(human, nMoney)
+    if not human.db.ServerCommerce.Charge[nMoney] then
+        return nil
+    end
+
+    return human.db.ServerCommerce.Charge[nMoney]
+end
+
+-- 设置天数数据
+local function CommerceActCharge_SetDBByDay(human, nMoney, nDay, nTime)
+    human.db.ServerCommerce.Charge[nMoney][nDay].nBuyTime = nTime
+end
+
+-- 设置奖励状态
+local function CommerceActCharge_SetDBPrizeByDay(human, nMoney, nDay, nStatus)
+    human.db.ServerCommerce.Charge[nMoney][nDay].nStatus = nStatus
+end
+
+
+-- 设置天数数据
+local function CommerceActCharge_SetDBAllMoneyByDay(human, nMoney, nDay, nAddMoney)
+    human.db.ServerCommerce.Charge[nMoney][nDay].nAllMoney = human.db.ServerCommerce.Charge[nMoney][nDay].nAllMoney + nAddMoney
+end
+
+----------------------------------------- 客户端请求处理开始 -------------------------------------
+-- 请求数据
+function CommerceActCharge_Query(human, nMoney)
+    local tConf = CommerceActCharge_GetCof()
+    
+    local tMsgData = Msg.gc.GC_SERVEERCOMMERCE_ACT_CHARGEQUERY
+    tMsgData.nMoney = nMoney
+    local nChargeDay, nLen = 0, 0
+    for nID, v in ipairs(tConf) do
+        if v.nMoney == nMoney then
+            local tDayData = CommerceActCharge_GetDBByDay(human, nMoney, v.nDay)
+            if nil == tDayData then
+                print("[CommerceActCharge_Query] 不存在对应的数据")
+            else
+                nChargeDay = tDayData.nBuyTime ~= 0 and nChargeDay + 1 or nChargeDay
+                nLen = nLen + 1
+                tMsgData.list[0] = nLen
+                local tPrizeData = tMsgData.list[nLen]
+                tPrizeData.nID = nID
+                tPrizeData.nState = tDayData.nStatus
+                tPrizeData.nDay = v.nDay
+                tPrizeData.nAllMoney = tDayData.nAllMoney
+                tPrizeData.item[0] = #v.Prize
+
+                for nIndex, tItem in ipairs(v.Prize) do
+                    local nGoodsID = tItem[1]
+                    local nGoodsNum = tItem[2]
+
+                    Grid.makeItem(tPrizeData.item[nIndex], nGoodsID, nGoodsNum)
+                end
+            end
+        end
+    end
+
+    tMsgData.nChargeDay = nChargeDay
+    Msg.send(tMsgData, human.fd)
+end
+
+-- 请求领取奖励
+function CommerceActCharge_GetPrize(human, nMoney)
+    local tConf = CommerceActCharge_GetCof()
+
+    local tItem = {}
+    for nID, v in ipairs(tConf) do
+        if v.nMoney == nMoney then
+            local tDayData = CommerceActCharge_GetDBByDay(human, nMoney, v.nDay)
+            if tDayData then
+                if CommonDefine.COMMON_PRIZE_STATE_CANGET == tDayData.nState then
+                    CommerceActCharge_SetDBPrizeByDay(human, nMoney, v.nDay, CommonDefine.COMMON_PRIZE_STATE_GET)
+                    for _, tPrize in ipairs(v.Prize) do
+                        if not tItem[tPrize[1]]  then
+                            tItem[tPrize[1]] = 0
+                        end
+
+                        tItem[tPrize[1]] = tItem[tPrize[1]] + tPrize[2]
+                    end
+                end
+            end
+        end
+    end
+
+    local tPrize = {}
+    for nID, nNum in pairs(tItem) do
+        table.insert(tPrize, {nID, nNum})
+    end
+
+    BagLogic.addItemList(human, tPrize, "servercommerce")
+    CommerceActCharge_Query(human, nMoney)
+end
+
+----------------------------------------- 外部调用 -------------------------------------
+function isRed(human)
+    if not human.db.ServerCommerce or not human.db.ServerCommerce.Charge then
+        return false
+    end
+
+    local tConf = CommerceActCharge_GetCof()
+    for _, v in ipairs(tConf) do
+        local tDayData = CommerceActCharge_GetDBByDay(human, v.nMoney, v.nDay) 
+        if tDayData and tDayData.nStatus == CommonDefine.COMMON_PRIZE_STATE_CANGET then
+            return true
+        end
+    end
+
+    return false
+end
+
+function onCharge(human, price, funcID, buyID)
+    local tConf = CommerceActCharge_GetCof()
+    local nNowTime = os.time()
+    local bQuery = false
+    for _, v in ipairs(tConf) do
+        local nDay = v.nDay
+        local tDayData = CommerceActCharge_GetDBByDay(human, v.nMoney, nDay)
+        if v.nMoney == price then
+            if tDayData then
+                if tDayData.nBuyTime == 0 then
+                    CommerceActCharge_SetDBByDay(human, v.nMoney, nDay, nNowTime)
+                    CommerceActCharge_SetDBPrizeByDay(human, v.nMoney, nDay, CommonDefine.COMMON_PRIZE_STATE_CANGET)
+                    bQuery = true
+                    break
+                else
+                    if true == Util.isSameDayByTimes(tDayData.nBuyTime, nNowTime) then
+                        bQuery = true
+                        CommerceActCharge_SetDBAllMoneyByDay(human, v.nMoney, nDay, price)
+                        break
+                    end
+                end
+            else
+                print("[onCharge] 跨服商业活动充值获取不到DB数据 name = "..human.db.name.." price = "..price)
+            end
+        end
+
+        if tDayData and true == Util.isSameDayByTimes(tDayData.nBuyTime, nNowTime) then
+            bQuery = true
+            CommerceActCharge_SetDBAllMoneyByDay(human, v.nMoney, nDay, price)
+        end
+    end
+
+    if true == bQuery then
+        CommerceActCharge_Query(human, price)
+    end
+end

+ 15 - 3
script/module/serverCommerce/ServerCommerceActDefine.lua

@@ -9,10 +9,22 @@ COMMERCEACT_BEGINTIME = 0               -- 开启时间
 COMMERCEACT_ENDTIME = 23                -- 结束时间
 COMMERCEACT_LASTDAY = 7                 -- 持续时间
 COMMERCEACT_BEGINDELATTIME = 10 * 60    -- 延迟10分钟开始
-COMMERCEACT_INITSERVERTIME = 3 * 60     -- 普通服 起服请求活动是否开始
-COMMERCEACT_INITOPENDAY = 2 * 60        -- 中心服请求普通服开服时间
+COMMERCEACT_INITSERVERTIME = 3 * 60     -- 普通服 起服3分钟请求活动是否开始
+COMMERCEACT_INITOPENDAY = 2 * 60        -- 中心服2分钟后请求普通服开服时间
+COMMERCEACT_RANKUPDATE = 5 * 60         -- 普通服 5 分钟请求排行榜数据
+COMMERCEACT_ENDBATCH = 3                -- 结束批次
 
 COMMERCEACT_NOOPEN = 0                  -- 未开启
+COMMERCEACT_OPEN = 1                    -- 已开启
 
 COMMERCEACT_SERVEROPEN = 1              -- 起服请求
-COMMERCEACT_ZERO = 2                    -- 整点请求
+COMMERCEACT_ZERO = 2                    -- 整点请求
+
+COMMERCEACT_NEXTDAY = 2                 -- 下次活动间隔时间
+
+COMMERCEACT_SERVERMAILID = 7014         -- 服务器邮件ID
+COMMERCEACT_HUMANMAILID = 7015          -- 个人邮件ID
+
+-- 请求服务器排名操作类型
+COMMERCEACT_SENDSERVERMAIL = 1          -- 发送全服邮件奖励
+COMMERCEACT_GETSERVERRANK = 2           -- 获取排名

+ 424 - 56
script/module/serverCommerce/ServerCommerceActRank.lua

@@ -8,97 +8,465 @@
 local Msg = require("core.Msg")
 local Util = require("common.Util")
 local Lang = require("common.Lang")
-local CommonRankDB = require("common.CommonRankDB")
-local OpenServerRankDB = require("present.OpenServerRankDB")
+local CommonDB = require("common.CommonDB")
 local Broadcast = require("broadcast.Broadcast")
-local OpenAct = require("present.OpenAct")
-local YunYingLogic = require("yunying.YunYingLogic")
-local DrawCardLogic = require("drawCard.DrawCardLogic")
 local CommonDefine = require("common.CommonDefine")
+local Timer = require("core.Timer")
+local Config = require("Config")
+local Grid = require("bag.Grid")
+local ObjHuman = require("core.ObjHuman")
+local MailExcel = require("excel.mail")
+local MailManager = require("mail.MailManager")
+local RoleDBLogic = require("role.RoleDBLogic")
+local ServerCommerceMiddle = require("serverCommerce.ServerCommerceMiddle")
+local ServerCommerceDefine = require("serverCommerce.ServerCommerceActDefine")
+local ServerCommerceRankConf = require("excel.ServerCommerce").CommerceRank
+local ServerCommerceManager = require("serverCommerce.ServerCommerceManager")
 
---[[
-    local:
+-- 缓存的排行榜数据 
+local COMMERCE_RANK_CACHE = {}
 
-	public:
-    	query()					            -- 发送活动信息
-        onCharge()			                -- 充值回调
-        WeekActRank_ResetData(human)        -- 重置玩家身上的充值
-        WeekActRank_ResetDBData()           -- 重置排行榜数据
---]]
+-- 缓存的ServerKey
+local COMMERCE_RANK_SERVER_KEY = nil
+
+-- 缓存的服务器排名
+local COMMERCE_RANK_SERVER_RANK = nil
+
+-- 待发送全服奖励的玩家
+local COMMRCE_RANK_SERVERMAIL_HUMAN = nil
 
 ----------------------------------------- 内部处理开始 -------------------------------------
--- 重置
-function WeekActRank_ResetCharge(human)
-    -- if not human then
-    --     return
-    -- end
+function CommercerActRank_QueryRankInfo(nRankType, nRankSubType)
+    ServerCommerceMiddle.CommerveMiddle_QueryRankInfo(nRankType, nRankSubType)
+end
+
+-- 创建缓存
+local function CommercerActRank_CreateCache(nRankType, nRankSubType, nServerKey)
+    if not COMMERCE_RANK_CACHE then
+        COMMERCE_RANK_CACHE = {}
+    end
+
+    if not COMMERCE_RANK_CACHE[nRankType] then
+        COMMERCE_RANK_CACHE[nRankType] = {}
+    end
+
+    if not COMMERCE_RANK_CACHE[nRankType][nRankSubType] then
+        COMMERCE_RANK_CACHE[nRankType][nRankSubType] = {}
+    end
+
+    if not COMMERCE_RANK_CACHE[nRankType][nRankSubType][nServerKey] then
+        COMMERCE_RANK_CACHE[nRankType][nRankSubType][nServerKey] = {}
+    end
+end
 
-    -- human.db.nWeekCharge = 0
+-- 获取缓存的排行榜数据
+local function CommercerActRank_GetCacheRankData(nRankType, nRankSubType, nServerKey)
+    return COMMERCE_RANK_CACHE[nRankType][nRankSubType][nServerKey]
 end
 
--- 获取充值额度
-function WeekActRank_GetCharge(human)
-    -- if not human then
-    --     return 0
-    -- end
+local function CommercerActRank_GetCacheRankDataByRank(nRankType, nRankSubType, nServerKey, nRank)
+    return COMMERCE_RANK_CACHE[nRankType][nRankSubType][nServerKey][nRank]
+end
 
-    -- if not human.db.nWeekCharge then
-    --     WeekActRank_ResetCharge(human)
-    -- end
+-- 清空对应的排行榜
+local function CommercerActRank_ClearCache(nRankType, nRankSubType, nServerKey)
+    COMMERCE_RANK_CACHE[nRankType][nRankSubType][nServerKey] = {}
+end
 
-    -- return human.db.nWeekCharge
+-- 插入排行榜数据
+local function CommercerActRank_InsertRank(nRankType, nRankSubType, nServerKey, nRank, tRankInfo)
+    local tCacheRankData = CommercerActRank_GetCacheRankData(nRankType, nRankSubType, nServerKey)
+    tCacheRankData[nRank] = tRankInfo
 end
 
--- 设置充值额度
-function WeekActRank_GetCharge(human, nVal)
-    -- if not human or 0 >= nVal then
-    --     return
-    -- end
+local function CommercerActRank_GetRankInfoByUuid(nRankType, nRankSubType, uuid)
+    local tCacheRankData = CommercerActRank_GetCacheRankData(nRankType, nRankSubType, COMMERCE_RANK_SERVER_KEY)
+    if not tCacheRankData then
+        return nil, nil
+    end
 
-    -- if not human.db.nWeekCharge then
-    --     WeekActRank_ResetCharge(human)
-    -- end
+    local nGetRank, tGetRankInfo = nil, nil
+    for nRank, v in ipairs(tCacheRankData) do
+        if v.uuid == uuid then
+            nGetRank = nRank
+            tGetRankInfo = v
+            break
+        end
+    end
 
-    -- human.db.nWeekCharge = human.db.nWeekCharge + nVal
+    return nGetRank, tGetRankInfo
 end
 
 
+-- 包装自己名次数据
+local function CommercerActRank_WrapOwnerData(nRankType, nRankSubType, net, uuid)
+	local nRank, tRankInfo = CommercerActRank_GetRankInfoByUuid(nRankType, nRankSubType, uuid)
+
+	net.rank = nRank or -1
+	net.rankValue = tRankInfo and tRankInfo.nValue or 0
+
+ 	local len = 0
+ 	if nRank and tRankInfo then
+        for _, v in ipairs(ServerCommerceRankConf) do
+            if v.nRankType == nRankSubType then
+                if v.nOrder[1] <= nRank and v.nOrder[2] >= nRank then
+                    for index, itemInfo in ipairs(v.Prize) do
+                        len = len + 1
+                        Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
+                    end
+                    break
+                end
+            end
+        end
+ 	end
+
+	net.items[0] = len
+end
+
+-- 包装档位名次数据
+local function CommercerActRank_WrapRankList(nRankType, nRankSubType, net, nRank)
+	local tRankData = CommercerActRank_GetCacheRankDataByRank(nRankType, nRankSubType, COMMERCE_RANK_SERVER_KEY)
+	
+	if tRankData and tRankData ~= -1 then
+		net.uid = tRankData.uuid
+		net.name = tRankData.name
+		net.head = tRankData.head
+		net.rankValue = tRankData.nValue
+		net.headFrame = tRankData.headFrame
+	else
+		net.uid = "-1"
+		net.name = ""
+		net.head = -1
+		net.rankValue = 0
+		net.headFrame = -1
+	end
+
+    local len = 0
+    for _, v in ipairs(ServerCommerceRankConf) do
+        if v.nRankType == nRankSubType then
+            if v.nOrder[1] <= nRank and v.nOrder[2] >= nRank then
+                for index, itemInfo in ipairs(v.Prize) do
+                    len = len + 1
+                    Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
+                end
+                break
+            end
+        end
+    end
+ 	
+	net.items[0] = len
+end
 ----------------------------------------- 外部调用 -------------------------------------
-function WeekActRank_ResetData(human)
+function CommercerActRank_ResetData(human)
     if not human then
         return
     end
+
+    --CommercerActRank_ResetCharge(human)
+end
+
+-- 活动结束
+function CommercerActRank_End()
     
-    --WeekActRank_ResetCharge(human)
 end
 
-function WeekActRank_ResetDBData()
-    -- CommonRankDB.ResetData() 
+function ClearCache()
+    COMMERCE_RANK_CACHE = {}
+    COMMERCE_RANK_SERVER_KEY = nil
+    COMMERCE_RANK_SERVER_RANK = nil
+    COMMRCE_RANK_SERVERMAIL_HUMAN = nil
 end
 
--- 活动结束
-function WeekActRank_End()
-    CommonRankDB.onRewardSend(CommonDefine.COMMONRANK_TYPE_WEEKRANK)
+-- 玩家点数改变
+function CommercerActRank_HumanPointChange(human, nNowPoint)
+    ServerCommerceMiddle.CommerveMiddle_HumanPointChange(human, nNowPoint)
 end
 
--- 充值回调
-function onCharge(human, price, funcID, buyID)
-    CommonRankDB.onValueAdd(human, CommonDefine.COMMONRANK_TYPE_WEEKRANK, price)
+-- 服务器总点数改变
+function onAllPointChange()
+    local nNowPoint = CommonDB.GetCommerceActInfo_Point()
+    ServerCommerceMiddle.CommerveMiddle_ServerPointChange(nNowPoint)
 end
 
------------------------------------------ 外部调用 -------------------------------------
+-- 定时请求数据
+function CommercerActRank_CreateTime(nTime, nRankType, nRankSubType)
+    Timer.addLater(nTime, CommercerActRank_QueryRankInfo, nRankType, nRankSubType)
+end
+
+-- 起服活动开启 请求排行榜数据
+function CommercerActRank_InitServerQueryRank()
+    CommercerActRank_QueryRankInfo(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, 
+            CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER)
+
+    -- 延迟20秒请求 个人排行榜
+    Timer.addLater(20, CommercerActRank_QueryRankInfo,
+        CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN)
+end
+
+-- 获取到排行榜数据
+function CommercerActRank_GetRankInfo(tGetData)
+    local nRankType = tGetData.nRankType
+    local nRankSubType = tGetData.nRankSubType
+    local nServerKey = tGetData.nServerKey
+    local nBegin = tGetData.nBegin
+    local nEnd = tGetData.nEnd
+    local tRankData = tGetData.tRankData
+
+    CommercerActRank_CreateCache(nRankType, nRankSubType, nServerKey)
+
+    if COMMERCE_RANK_SERVER_KEY == nil then
+        print("[CommercerActRank_GetRankInfo] 设置 nServerKey = "..nServerKey)
+        COMMERCE_RANK_SERVER_KEY = nServerKey
+    else
+        if COMMERCE_RANK_SERVER_KEY ~= nServerKey then
+            print("[CommercerActRank_GetRankInfo] 一个战区的 nServerKey 为什么会改变")
+            COMMERCE_RANK_SERVER_KEY = nServerKey
+        end
+    end
+
+    if nBegin == 1 then
+        CommercerActRank_ClearCache(nRankType, nRankSubType, nServerKey)
+    end
+
+    local nAllLen = tRankData[0]
+    if 0 >= nAllLen then
+        return
+    else
+        for i = 1, nAllLen, 1 do
+            CommercerActRank_InsertRank(nRankType, nRankSubType, nServerKey, tRankData[i].nRank, tRankData[i].tRankData)
+        end
+    end
+
+    -- 结束重新创建定时器, 因为用一次就呗删除了
+    if nEnd == 1 then
+        local nTime = ServerCommerceDefine.COMMERCEACT_RANKUPDATE
+        CommercerActRank_CreateTime(nTime, nRankType, nRankSubType)
+    end
+end
+
+-- 获取到排名信息
+function CommercerActRank_GetServerRank(tData)
+    COMMERCE_RANK_SERVER_RANK = tData.nRank
+    if tData.nOperate == ServerCommerceDefine.COMMERCEACT_SENDSERVERMAIL then
+        CommercerActRank_SendServerRankPrize(tData)
+    else
+        CommercerActRank_SendServerMail2Human()
+    end
+end
+
+-- 发送服务器排行榜奖励
+function CommercerActRank_SendServerRankPrize(tData)
+    local nRank = tData.nRank
+    
+    local tPrize = nil
+    for _, v in ipairs(ServerCommerceRankConf) do
+        if v.nRankType == CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER then
+            if v.nOrder[1] <= nRank and v.nOrder[2] >= nRank then
+                tPrize = v.Prize
+                break
+            end
+        end
+    end
+
+    local szLogText = "[CommercerActRank_SendServerRankPrize] 发送服务器奖励 nRank = "..nRank
+
+    if not tPrize then
+        szLogText = szLogText .. "获取不到对应奖励"
+        ServerCommerceManager.CommerveManager_WriteLog(szLogText)
+        return
+    end
+
+    local nSendMail = ServerCommerceManager.CommerveManager_GetCommDBSendMail()
+    if true == nSendMail then
+        return
+    end
+
+    -- 设置当前发送邮件奖励
+    ServerCommerceManager.CommerveManager_SetCommDBSendMail()
+
+    -- 遍历在线玩家
+    local mailConfig = MailExcel.mail[ServerCommerceDefine.COMMERCEACT_SERVERMAILID]
+    local title = mailConfig.title
+    local senderName = mailConfig.senderName
+    local content = mailConfig.content   
+    for uuid, human in pairs(ObjHuman.onlineUuid) do
+        MailManager.add(MailManager.SYSTEM, uuid, 
+						        title, Util.format(content, rank), tPrize, senderName)
+        -- 设置该玩家已经发送邮件
+        ServerCommerceManager.CommerveManager_SetHumanSendServerMail(human, true)
+
+        -- 记录信息
+        ServerCommerceManager.CommerveManager_WriteLog(szLogText, human)
+    end
+
+    -- 告诉中心服全服邮件在线的处理完成
+    ServerCommerceMiddle.CommerceMiddle_TellServerMailOk()
+end
+
+-- 发送玩家邮件奖励
+function CommercerActRank_SendHumanRankPrize(tData)
+    local nRank, uuid = tData.nRank, tData.uuid
+
+    local tPrize = nil
+    for _, v in ipairs(ServerCommerceRankConf) do
+        if v.nRankType == CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN then
+            if v.nOrder[1] <= nRank and v.nOrder[2] >= nRank then
+                tPrize = v.Prize
+                break
+            end
+        end
+    end
+
+    local szLogText = "[CommercerActRank_SendHumanRankPrize] 发送个人奖励 nRank = "..nRank
+
+    if not tPrize then
+        szLogText = szLogText .. "获取不到对应奖励"
+        ServerCommerceManager.CommerveManager_WriteLog(szLogText)
+        return
+    end
+
+    local human = ObjHuman.onlineUuid[uuid]
+    local bNowSave = false
+    if not human then
+        human = RoleDBLogic.getDb(uuid)
+        bNowSave = true
+    end
+
+    if not human then
+        szLogText = szLogText.." 获取不到玩家DB数据信息 uuid = "..uuid
+        ServerCommerceManager.CommerveManager_WriteLog(szLogText)
+        return
+    end
+
+    local bSendMail = ServerCommerceManager.CommerveManager_GetHumanSendPlayerMail(human)
+    if true == bSendMail then
+        szLogText = szLogText .. "已经发送了邮件为什么又一次走到这里 name = "..human.db.name
+        ServerCommerceManager.CommerveManager_WriteLog(szLogText)
+        return
+    end
+
+    -- 设置发送了邮件奖励
+    ServerCommerceManager.CommerveManager_SetHumanSendPlayerMail(human, true)
+
+    -- 发奖励
+    local mailConfig = MailExcel.mail[ServerCommerceDefine.COMMERCEACT_HUMANMAILID]
+    local title = mailConfig.title
+    local senderName = mailConfig.senderName
+    local content = mailConfig.content
+    MailManager.add(MailManager.SYSTEM, uuid, 
+						        title, Util.format(content, rank), tPrize, senderName)
+
+    -- 写日志
+    szLogText = szLogText.."发送奖励成功"
+    ServerCommerceManager.CommerveManager_WriteLog(szLogText, human)
+
+    if true == bNowSave then
+        RoleDBLogic.saveRole(human.db)
+    end
+end
+
+-- 玩家登录发送玩家邮件奖励(全服邮件奖励)
+function CommercerActRank_SendServerMailHumanLogin(human)
+    if not COMMRCE_RANK_SERVERMAIL_HUMAN then
+        COMMRCE_RANK_SERVERMAIL_HUMAN = {}
+    end
+
+    table.insert(COMMRCE_RANK_SERVERMAIL_HUMAN, human.db._id)
+
+    -- 不存在请求一次排名
+    if not COMMERCE_RANK_SERVER_RANK then
+        ServerCommerceMiddle.CommerceMiddle_QueryServerRank(ServerCommerceDefine.COMMERCEACT_GETSERVERRANK)
+    else
+        CommercerActRank_SendServerMail2Human()
+    end
+end
+
+-- 发送活动结束后登录的的玩家(全服邮件奖励)
+function CommercerActRank_SendServerMail2Human()
+    if not COMMRCE_RANK_SERVERMAIL_HUMAN or not COMMERCE_RANK_SERVER_RANK then
+        return
+    end
+
+    local tPrize = nil
+    for _, v in ipairs(ServerCommerceRankConf) do
+        if v.nRankType == CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER then
+            if v.nOrder[1] <= COMMERCE_RANK_SERVER_RANK and v.nOrder[2] >= COMMERCE_RANK_SERVER_RANK then
+                tPrize = v.Prize
+                break
+            end
+        end
+    end
+
+    if not tPrize then
+        return
+    end
+
+    local mailConfig = MailExcel.mail[ServerCommerceDefine.COMMERCEACT_SERVERMAILID]
+    local title = mailConfig.title
+    local senderName = mailConfig.senderName
+    local content = mailConfig.content
+    for _, uuid in ipairs(COMMRCE_RANK_SERVERMAIL_HUMAN) do
+        
+        -- 设置该玩家已经发送邮件
+        local human = ObjHuman.onlineUuid[uuid]
+        if not human then
+            human = RoleDBLogic.getDb(uuid)
+        end
+
+        if human then
+            MailManager.add(MailManager.SYSTEM, uuid,
+						        title, Util.format(content, COMMERCE_RANK_SERVER_RANK), tPrize, senderName)
+
+            -- 记录信息
+            ServerCommerceManager.CommerveManager_WriteLog("[CommercerActRank_SendServerMail2Human] 玩家登录发送全服奖励邮件完成", human)
+        end
+    end
+
+    COMMRCE_RANK_SERVERMAIL_HUMAN = nil
+end
+
+-- 玩家登录活动结束发送个人排行榜邮件
+function CommercerActRank_SendHumanMailHumanLogin(human)
+    local tPrize, nRank = nil, 0
+    for _, v in ipairs(ServerCommerceRankConf) do
+        if v.nRankType == CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN then
+            if v.nOrder[1] >= nRank then
+                tPrize = v.Prize
+                nRank = v.nOrder[1]
+            end
+        end
+    end
+
+    local mailConfig = MailExcel.mail[ServerCommerceDefine.COMMERCEACT_HUMANMAILID]
+    local title = mailConfig.title
+    local senderName = mailConfig.senderName
+    local content = mailConfig.content
+    
+    local newcontent = string.gsub(content, "{1}", "21+")
+
+    MailManager.add(MailManager.SYSTEM, human.db_id,
+						        title, newcontent, tPrize, senderName)
+
+    -- 写日志
+    ServerCommerceManager.CommerveManager_WriteLog("[CommercerActRank_SendHumanMailHumanLogin] 玩家登录发送邮件完成", human)
+end
+
+----------------------------------------- 客户端请求 -------------------------------------
 
 -- 客户端请求
-function WeekActRank_Query(human)
-    local nRankType = CommonDefine.COMMONRANK_TYPE_WEEKRANK
-	local maxSendRank = CommonRankDB.getMaxSendRank(nRankType)
+function CommercerActRank_Query(human, nRankSubType)
+    local tMsgData = Msg.gc.GC_SERVEERCOMMERCE_ACT_RANK_QUERY
+    local maxSendRank = CommonDefine.COMMONRANK_SENDPRIZE_LEN
 
-	local msgRet = Msg.gc.GC_WEEKLOOP_ACT_RANK_QUERY
-	
-	CommonRankDB.wrapOwnerData(nRankType, msgRet.ownerData, human.db._id)
+    local uuid = human.db._id
+    if CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER == nRankSubType then
+        uuid = Config.NEW_SVR_INDEX
+    end
+
+    CommercerActRank_WrapOwnerData(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, nRankSubType, msgRet.ownerData, uuid)
 	
-    for rank = 1,maxSendRank do
-		CommonRankDB.wrapOpenServerRankList(nRankType, msgRet.list[rank], rank)
+    for rank = 1, maxSendRank do
+		CommercerActRank_WrapRankList(CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE, nRankSubType, msgRet.list[rank], rank)
 	end
     
 	msgRet.list[0] = maxSendRank

+ 233 - 0
script/module/serverCommerce/ServerCommerceActShop.lua

@@ -0,0 +1,233 @@
+--------------------------------
+-- 文件名       :   ServerCommerceActShop.lua
+-- 文件说明     :   跨服商业-战区钜惠
+-- 创建时间     :   2025/03/31
+-- 创建人       :   FC
+--------------------------------
+
+local Util = require("common.Util")
+local Msg = require("core.Msg")
+local Grid = require("bag.Grid")
+local BagLogic = require("bag.BagLogic")
+local BuyLogic = require("topup.BuyLogic")
+local CommonDefine = require("common.CommonDefine")
+local ServerCommerceConf = require("excel.ServerCommerce")
+local BuyConf = require("excel.buy")
+local CommonDB = require("common.CommonDB")
+local ObjHuman = require("core.ObjHuman")
+local ServerCommerceManager = require("serverCommerce.ServerCommerceManager")
+
+local COMMERCEACTFREEID = 1     -- 免费
+local COMMERCEACTPAYID  = 2     -- 付费
+
+----------------------------------------- 内部处理开始 -------------------------------------
+-- 获取配置
+local function CommerceActShop_GetCof()
+    return ServerCommerceConf.CommerceShop
+end
+
+function CreatDB(human)
+    if not human.db.ServerCommerce or not human.db.ServerCommerce.Shop then
+        print("[CommerceActShop_CreatDB] 初始化数据失败 name = "..human.db.name)
+        return false
+    end
+
+    local tConf = CommerceActShop_GetCof()
+    for nID, v in ipairs(tConf) do
+        human.db.ServerCommerce.Shop[nID] = 
+        {
+            [COMMERCEACTFREEID] = CommonDefine.COMMON_PRIZE_STATE_NOGET,
+            [COMMERCEACTPAYID] = CommonDefine.COMMON_PRIZE_STATE_NOGET
+        }
+    end
+
+    return true
+end
+
+-- 获取免费奖励状态
+local function CommerceActShop_GetFreeStatus(human, nID)
+    return human.db.ServerCommerce.Shop[nID][COMMERCEACTFREEID]
+end
+
+-- 设置免费奖励状态
+local function CommerceActShop_SetFreeStatus(human, nID, nStatus)
+    human.db.ServerCommerce.Shop[nID][COMMERCEACTFREEID] = nStatus
+end
+
+-- 获取付费奖励状态
+local function CommerceActShop_GetPayStatus(human, nID)
+    return human.db.ServerCommerce.Shop[nID][COMMERCEACTPAYID]
+end
+
+-- 设置付费奖励状态
+local function CommerceActShop_SetPayStatus(human, nID, nStatus)
+    human.db.ServerCommerce.Shop[nID][COMMERCEACTPAYID] = nStatus
+end
+
+
+----------------------------------------- 客户端请求处理开始 -------------------------------------
+-- 查询数据
+function CommerceActShop_Query(human)
+    local tConf = CommerceActShop_GetCof()
+    local tMsgData = Msg.gc.GC_SERVEERCOMMERCE_ACT_SHOPQUERY
+    tMsgData.nNowPoint = CommonDB.GetCommerceActInfo_Point()
+
+    tMsgData.list[0] = #tConf
+    local nLen = 1
+    for nID, v in ipairs(tConf) do
+        local tNodeData = tMsgData.list[nLen]
+        nLen = nLen + 1
+        tNodeData.nID = nID
+        tNodeData.nNeedPoint = v.nPoint
+        tNodeData.nFreeState = CommerceActShop_GetFreeStatus(human, nID)
+        tNodeData.nPayState = CommerceActShop_GetPayStatus(human, nID)
+
+        -- 免费物品
+        tNodeData.tFreeItem[0] = #v.FreePrize
+        for i, tData in ipairs(v.FreePrize) do
+            Grid.makeItem(tNodeData.tFreeItem[i], tData[1], tData[2])
+        end
+        
+        tNodeData.tPayItem[0] = #v.PayPrize
+        for i, tData in ipairs(v.PayPrize) do
+            Grid.makeItem(tNodeData.tPayItem[i], tData[1], tData[2])
+        end
+
+        -- 封装购买项物品
+        BuyLogic.fontBuyItem(human, tNodeData.buyItem, v.nBuyID)
+    end
+
+    Msg.send(tMsgData, human.fd)
+end
+
+-- 领取奖励
+function CommerceActShop_GetPrize(human)
+    local tConf = CommerceActShop_GetCof()
+
+    local tGoods = {}
+    for nID, v in ipairs(tConf) do
+        local nFreeState = CommerceActShop_GetFreeStatus(human, nID)
+        local nPayState = CommerceActShop_GetPayStatus(human, nID)
+        if CommonDefine.COMMON_PRIZE_STATE_CANGET == nFreeState then
+            CommerceActShop_SetFreeStatus(human, nID, CommonDefine.COMMON_PRIZE_STATE_GET)
+            for _, tData in ipairs(v.FreePrize) do
+                tGoods[tData[1]] = tGoods[tData[1]] or 0
+                tGoods[tData[1]] = tGoods[tData[1]] + tData[2]
+            end
+        end
+
+        if CommonDefine.COMMON_PRIZE_STATE_CANGET == nPayState then
+            CommerceActShop_SetPayStatus(human, nID, CommonDefine.COMMON_PRIZE_STATE_GET)
+            for _, tData in ipairs(v.FreePrize) do
+                tGoods[tData[1]] = tGoods[tData[1]] or 0
+                tGoods[tData[1]] = tGoods[tData[1]] + tData[2]
+            end
+        end
+    end
+
+    if nil ~= _G.next(tGoods) then
+        local tItem = {}
+        for nGoodsID, nGoodsNum in pairs(tGoods) do
+            table.insert(tItem, {nGoodsID, nGoodsNum})
+        end
+
+        BagLogic.addItemList(human, tItem, "servercommerce")
+        CommerceActShop_Query(human)
+    end
+end
+
+----------------------------------------- 外部调用 -------------------------------------
+-- 总积分改变
+function onAllPointChange()
+    local nNowPoint = CommonDB.GetCommerceActInfo_Point()
+    local tConf = CommerceActShop_GetCof()
+    
+    local tOKID = {}
+    for nID, v in ipairs(tConf) do
+        if nNowPoint >= v.nPoint then
+            table.insert(tOKID, nID)
+        end
+    end
+
+    for _, human in pairs(ObjHuman.onlineUuid) do
+        local bSendClient = false
+        for _, nID in ipairs(tOKID) do
+            local nStatus = CommerceActShop_GetFreeStatus(human, nID)
+            if CommonDefine.COMMON_PRIZE_STATE_NOGET ==  nStatus then
+                bSendClient = true
+                CommerceActShop_SetFreeStatus(human, nID, CommonDefine.COMMON_PRIZE_STATE_CANGET)
+            end
+        end
+
+        if true == bSendClient then
+            CommerceActShop_Query(human)
+        end
+    end
+end
+
+function onCharge(human, price, funcID, buyID)
+    local tConf = CommerceActShop_GetCof()
+    
+    local nChoseID = 0
+    for nID, v in ipairs(tConf) do
+        if v.nBuyID == buyID then
+            local nPayState = CommerceActShop_GetPayStatus(human, nID)
+            if CommonDefine.COMMON_PRIZE_STATE_NOGET == nPayState then
+                nChoseID = nID
+            else
+                print("[CommerceActShop_onCharge] 重复购买了 nBuyID = "..v.nBuyID)
+            end
+
+            break
+        end
+    end
+
+    local tBuyCfg = BuyConf.buy[buyID]
+    if not tBuyCfg then
+        print("[onCharge] 不存在对应的购买项配置 buyID = "..buyID)
+        return
+    else
+        local region = human.region or "CN"
+        local nPoint = tBuyCfg[region]
+        ServerCommerceManager.CommerveManager_AddServerPoint(nPoint)
+        ServerCommerceManager.CommerveManager_AddHumanPint(human, nPoint)
+    end
+
+    if nChoseID == 0 then
+        return
+    end
+
+    CommerceActShop_SetPayStatus(human, nChoseID, CommonDefine.COMMON_PRIZE_STATE_CANGET)
+   
+    CommerceActShop_Query(human)
+end
+
+-- 登录检测积分
+function onLogin(human)
+    local nNowPoint = CommonDB.GetCommerceActInfo_Point()
+    local tConf = CommerceActShop_GetCof()
+
+    for nID, v in ipairs(tConf) do
+        if nNowPoint >= v.nPoint then
+            local nStatus = CommerceActShop_GetFreeStatus(human, nID)
+            if CommonDefine.COMMON_PRIZE_STATE_NOGET ==  nStatus then
+                CommerceActShop_SetFreeStatus(human, nID, CommonDefine.COMMON_PRIZE_STATE_CANGET)
+            end
+        end
+    end
+end
+
+function isRed(human)
+    local tConf = CommerceActShop_GetCof()
+
+    for nID, v in ipairs(tConf) do
+        local nFreeStatus = CommerceActShop_GetFreeStatus(human, nID)
+        local nPayState = CommerceActShop_GetPayStatus(human, nID)
+        if CommonDefine.COMMON_PRIZE_STATE_CANGET == nFreeStatus or
+            CommonDefine.COMMON_PRIZE_STATE_CANGET == nPayState then
+            return true
+        end
+    end
+
+    return false
+end

+ 478 - 0
script/module/serverCommerce/ServerCommerceActTask.lua

@@ -0,0 +1,478 @@
+--------------------------------
+-- 文件名       :   ServerCommerceActShop.lua
+-- 文件说明     :   跨服商业-任务
+-- 创建时间     :   2025/04/08
+-- 创建人       :   FC
+--------------------------------
+
+local Util = require("common.Util")
+local Msg = require("core.Msg")
+local Grid = require("bag.Grid")
+local BagLogic = require("bag.BagLogic")
+local CommonDefine = require("common.CommonDefine")
+local ServerCommerceConf = require("excel.ServerCommerce")
+local ObjHuman = require("core.ObjHuman")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
+local ServerCommerceManager = require("serverCommerce.ServerCommerceManager")
+
+----------------------------------------- 内部处理开始 -------------------------------------
+-- 配置
+local function CommerceActTask_GetTaskCof()
+    return ServerCommerceConf.CommerceTask
+end
+
+local function CommerceActTask_GetTaskPointCof()
+    return ServerCommerceConf.CommerceTaskPoint
+end
+
+-- 订阅事件
+local function CommerceActTask_SubEvent(uuid, nEventType)
+    TriggerLogic.SubscribeEvent(nEventType, uuid, CommerceActTask_EventCallBack)
+end
+
+-- 创建DB数据
+function CreatDB(human)
+    if not human.db.ServerCommerce or not human.db.ServerCommerce.Task then
+        print("[CommerceActTask_CreatDB] 初始化数据失败 name = "..human.db.name)
+        return false
+    end
+
+    human.db.ServerCommerce.Task = {
+        nTime = os.time(),          -- 当前事件
+        nTaskPoint = 0,             -- 任务积分
+        TaskPrize = {},             -- 任务数据
+        TaskPointPrize = {},        -- 任务积分奖励
+    }
+
+    local tConf = CommerceActTask_GetTaskCof()
+    local tEvnetType = {}
+    local tDBTask = human.db.ServerCommerce.Task.TaskPrize
+    for nID, v in ipairs(tConf) do
+        if not tDBTask[v.nTaskType] then
+            tDBTask[v.nTaskType] = {
+                nFinishNum = 0,     -- 完成次数
+                taskStatus = {},    -- 任务状态
+            }
+        end
+
+        tDBTask.taskStatus[nID] = CommonDefine.COMMON_PRIZE_STATE_NOGET
+
+        if not tEvnetType[v.nTaskType] then
+            CommerceActTask_SubEvent(human.db._id, v.nTaskType)
+            tEvnetType[v.nTaskType] = 1
+        end
+    end
+
+    tConf = CommerceActTask_GetTaskPointCof()
+    local tDBTaskPointPrize = human.db.ServerCommerce.Task.TaskPointPrize
+    for nID, v in pairs(tConf) do
+        if not tDBTaskPointPrize[nID] then
+            tDBTaskPointPrize[nID] = CommonDefine.COMMON_PRIZE_STATE_NOGET
+        end
+    end
+
+    return true
+end
+
+-- 获取任务奖励DB数据
+local function CommerceActTask_GetTaskDB(human)
+    return human.db.ServerCommerce.Task
+end
+
+local function CommerceActTask_GetOpenTime(human)
+    return human.db.ServerCommerce.Task.nTime
+end
+
+-- 获取任务状态
+local function CommerceActTask_GetTaskStatus(human, nID, nTaskType)
+    local tDBData = CommerceActTask_GetTaskDB(human)
+
+    if not tDBData.TaskPrize[nTaskType] or not tDBData.TaskPrize[nTaskType].taskStatus[nID] then
+        return CommonDefine.COMMON_PRIZE_STATE_NOGET
+    end
+
+    return tDBData.TaskPrize[nTaskType].taskStatus[nID]
+end
+
+-- 设置任务状态
+local function CommerceActTask_SetTaskStatus(human, nID, nTaskType, nValue)
+    local tDBData = CommerceActTask_GetTaskDB(human)
+
+    tDBData.TaskPrize[nTaskType].taskStatus[nID] = nValue
+end
+
+-- 获取任务完成次数
+local function CommerceActTask_GetTaskFinishNum(human, nTaskType)
+    local tDBData = CommerceActTask_GetTaskDB(human)
+    if not tDBData.TaskPrize[nTaskType] then
+        return 0
+    end
+
+    return tDBData.TaskPrize[nTaskType].nFinishNum
+end
+
+-- 增加任务完成次数
+local function CommerceActTask_AddTaskFinishNum(human, nTaskType, nAddNum)
+    local tDBData = CommerceActTask_GetTaskDB(human)
+    if not tDBData.TaskPrize[nTaskType] then
+        return
+    end
+
+    tDBData.TaskPrize[nTaskType].nFinishNum = tDBData.TaskPrize[nTaskType].nFinishNum + nAddNum
+end
+
+-- 获取任务积分
+local function CommerceActTask_GetTaskPoint(human)
+    local tDBData = CommerceActTask_GetTaskDB(human)
+    return tDBData.nTaskPoint
+end
+
+-- 增加任务积分
+local function CommerceActTask_AddTaskPoint(human, nPoint)
+    local tDBData = CommerceActTask_GetTaskDB(human)
+    tDBData.nTaskPoint = tDBData.nTaskPoint + nPoint
+end
+
+-- 获取任务积分奖励状态
+local function CommerceActTask_GetTaskPointPrizeStatus(human, nID)
+    local tDBData = CommerceActTask_GetTaskDB(human)
+    if not tDBData.TaskPointPrize or not tDBData.TaskPointPrize[nID] then
+        return CommonDefine.COMMON_PRIZE_STATE_NOGET
+    end
+
+    return tDBData.TaskPointPrize[nID]
+end
+
+-- 设置 任务积分奖励状态
+local function CommerceActTask_SetTaskPointPrizeStatus(human, nID, nValue)
+    local tDBData = CommerceActTask_GetTaskDB(human)
+    tDBData.TaskPointPrize[nID] = nValue
+end
+
+-- 检查任务是否完成
+local function CommerceActTask_CheckTaskStatus(human, nTaskType)
+   local tConf = CommerceActTask_GetTaskCof()
+   local nNowFinishNum = CommerceActTask_GetTaskFinishNum(human, nTaskType)
+
+   local nDay
+   for nID, v in ipairs(tConf) do
+        if v.nTaskType == nTaskType then
+            if nNowFinishNum >= v.nValue then
+                local nState = CommerceActTask_GetTaskStatus(human, nID, nTaskType)
+                if CommonDefine.COMMON_PRIZE_STATE_NOGET == nState then
+                    CommerceActTask_SetTaskStatus(human, nID, v.nTaskType, CommonDefine.COMMON_PRIZE_STATE_CANGET)
+                    if not nDay then
+                        nDay = v.nDay
+                    end
+                end
+            else
+                break
+            end
+        end
+   end
+
+--    if nil ~= nDay then
+--         local nOpenTime = CommerceActTask_GetOpenTime(human)
+--         local nDiffDay = Util.diffDay(nOpenTime)
+--         if nDiffDay == nDay then
+--             CommerceActTask_QueryTask(human, nDay)
+--         end
+--    end
+end
+
+-- 检查任务点数奖励状态
+local function CommerceActTask_CheckTaskPointStatus(human)
+    local nNowPoint = CommerceActTask_GetTaskPoint()
+    local tConf = CommerceActTask_GetTaskPointCof()
+
+    local bSendClient = false
+    for nID, v in ipairs(tConf) do
+        if nNowPoint >= v.nPoint then
+            local nState = CommerceActTask_GetTaskPointPrizeStatus(human, nID)
+            if CommonDefine.COMMON_PRIZE_STATE_NOGET == nState then
+                bSendClient = true
+                CommerceActTask_SetTaskPointPrizeStatus(human, nID, CommonDefine.COMMON_PRIZE_STATE_CANGET)
+            end
+        else
+            break
+        end
+    end
+
+    if true == bSendClient then
+        CommerceActTask_QueryTaskPoint(human)
+    end
+end
+
+----------------------------------------回调处理---------------------------------------------------
+-- 事件回调通用处理
+local function CommerceActTask_EvnentCommon(nEventType, uuid, ...)
+    local human = ObjHuman.onlineUuid[uuid]
+    if not human then
+        return
+    end
+
+    local nLen = #arg
+    if nLen < 1 then
+        print("[CommerceActTask_EvnentCommon] 当前可变参数居然小于1了!! 确定是通用处理吗? nEventType = "..nEventType)
+        return
+    end
+
+    -- 次数作为参数
+    local nValue = arg[1]
+
+    -- 增加完成次数
+    CommerceActTask_AddTaskFinishNum(human, nEventType, nValue)
+
+    -- 检查任务状态
+    CommerceActTask_CheckTaskStatus(human, nEventType)
+end
+
+-- 事件-获得英雄处理
+local function CommerceActTask_EvnentGetHero(nEventType, uuid, ...)
+    local human = ObjHuman.onlineUuid[uuid]
+    if not human then
+        return
+    end
+
+    local nLen = #arg
+    if nLen < 2 then
+        print("[CommerceActTask_EvnentGetHero] 当前可变参数居然小于2了!! 确定是获得英雄处理吗? nEventType = "..nEventType)
+        return
+    end
+    
+    local nNum = arg[1]
+    local nStar = arg[2]
+
+    local bCheck = false
+    local tConf = CommerceActTask_GetTaskCof()
+    for nID, v in ipairs(tConf) do
+        if v.nTaskType == nEventType then
+            if not v.nTaskArgument then
+                print("[CommerceActTask_EvnentGetHero] 获得英雄但是没有获取到对应的配置参数要求")
+            else
+                local tTaskArgument = Util.split(v.nTaskArgument , "|")
+                if 2 ~= #tTaskArgument then
+                    print("[CommerceActTask_EvnentGetHero] 获取的任务 参数数量不正确")
+                else
+                    if nNum >= tTaskArgument[1] and nStar >= tTaskArgument[2] then
+                        CommerceActTask_AddTaskFinishNum(human, nEventType, 1)
+                        bCheck = true
+                    end
+                end
+            end
+        end
+    end
+
+    CommerceActTask_CheckTaskStatus(human, nEventType)
+end
+
+-- 事件处理
+local tEventHandler = nil
+-- 起服处理
+function Init()
+    tEventHandler = {
+        [TriggerDefine.EVENT_TYPE_SWEEP] = CommerceActTask_EvnentCommon,
+        [TriggerDefine.CHAT_TIMES] = CommerceActTask_EvnentCommon,
+        [TriggerDefine.FRIEND_COMBAT] = CommerceActTask_EvnentCommon,
+        [TriggerDefine.EVENT_TYPE_FINDSTAR] = CommerceActTask_EvnentCommon,
+        [TriggerDefine.EVENT_TYPE_FATESUMMON] = CommerceActTask_EvnentCommon,
+        [TriggerDefine.EVENT_TYPE_OPENBOX] = CommerceActTask_EvnentCommon,
+        [TriggerDefine.EVENT_TYPE_CHAMPIONSNUM] = CommerceActTask_EvnentCommon,
+        [TriggerDefine.EVENT_TYPE_GETHERO] = CommerceActTask_EvnentGetHero,
+        [TriggerDefine.EVENT_TYPE_SHOPBUY] = CommerceActTask_EvnentCommon,
+        [TriggerDefine.EVENT_TYPE_UNIONSKILLUP] = CommerceActTask_EvnentCommon,
+    }
+end
+
+----------------------------------------- 外部调用开始 -------------------------------------
+function CommerceActTask_EventCallBack(nEventType, uuid, ...)
+    if not tEventHandler or not tEventHandler[nEventType] then
+        ServerCommerceManager.CommerveManager_WriteLog("[CommerceActTask_EventCallBack] 不存在对应的回调处理函数 nEventType = "..nEventType)
+        return
+    end
+
+    print("[CommerceActTask_EventCallBack] 收到事件触发回调 nEventType = "..nEventType)
+    tEventHandler[nEventType](nEventType, uuid, ...)
+end
+
+----------------------------------------- 客户端请求 -------------------------------------
+-- 请求战区集结任务信息
+function CommerceActTask_QueryTask(human, nDay)
+    local tConf = CommerceActTask_GetTaskCof()
+    local tMsgData = Msg.gc.GC_SERVEERCOMMERCE_ACT_TASKQUERY
+    tMsgData.nDay = nDay
+    tMsgData.nNowPoint = CommerceActTask_GetTaskPoint(human)
+
+    local tListData = tMsgData.list
+    tListData[0] = 0
+    for nID, v in ipairs(tConf) do
+        if v.nDay == nDay then
+            tListData[0] = tListData[0] + 1
+            local tNode = tListData[tListData[0]]
+            tNode.nID = nID
+            tNode.nState = CommerceActTask_GetTaskStatus(human, nID, v.nTaskType)
+            tNode.nDay = v.nDay
+            tNode.nValue = v.nValue
+            tNode.nPoint = v.nPoint
+            tNode.Desc = v.szDes
+            tNode.item[0] = #v.Prize
+
+            for i, tItemData in ipairs(v.Prize) do
+                Grid.makeItem(tNode.item[i], tItemData[1], tItemData[2])
+            end
+        end
+    end
+
+    Msg.send(tMsgData, human.fd)
+end
+
+-- 请求领取任务奖励
+function CG_SERVEERCOMMERCE_ACT_GETTASKPRIZE(human, nDay)
+    local tConf = CommerceActTask_GetTaskCof()
+    local tGoods = {}
+    local nAddPoint = 0
+
+    for nID, v in ipairs(tConf) do
+        if v.nDay == nDay then
+            local nState = CommerceActTask_GetTaskStatus(human, nID, v.nTaskType)
+            if CommonDefine.COMMON_PRIZE_STATE_CANGET == nState then
+                for i, tItemData in ipairs(v.Prize) do
+                    if not tGoods[tItemData[1]] then
+                        tGoods[tItemData[1]] = 0
+                    end
+
+                    tGoods[tItemData[1]] = tGoods[tItemData[1]] + tItemData[2]
+                end
+
+                nAddPoint = nAddPoint + v.nPoint
+                CommerceActTask_SetTaskStatus(human, nID, v.nTaskType, CommonDefine.COMMON_PRIZE_STATE_GET)
+            end
+        end
+    end
+
+    if nil ~= _G.next(tGoods) then
+        local tItem = {}
+        for nID, nNum in pairs(tGoods) do
+            table.insert(tItem, {nID, nNum})
+        end
+
+        BagLogic.addItemList(human, tItem, "servercommerce")
+
+        -- 增加积分
+        CommerceActTask_AddTaskPoint(human, nAddPoint)
+
+        -- 检查积分奖励状态
+        CommerceActTask_CheckTaskPointStatus(human)
+
+        -- 增加全服积分
+        ServerCommerceManager.CommerveManager_AddServerPoint(nAddPoint)
+
+        -- 增加个人积分
+        ServerCommerceManager.CommerveManager_AddHumanPint(human, nAddPoint)
+
+        CommerceActTask_QueryTask(human, nDay)
+    end
+end
+
+-- 请求任务积分信息
+function CommerceActTask_QueryTaskPoint(human)
+    local tConf = CommerceActTask_GetTaskPointCof()
+
+    local tMsgData = Msg.gc.GC_SERVEERCOMMERCE_ACT_TASKPOINTQUERY
+    tMsgData.nNowPoint = CommerceActTask_GetTaskPoint(human)
+
+    local tListData = tMsgData.listPoint
+    tListData[0] = 0
+    for nID, v in ipairs(tConf) do
+        tListData[0] = tListData[0] + 1
+        local tNode = tListData[tListData[0]]
+        tNode.nID = nID
+        tNode.nNeedPoint = v.nPoint
+        tNode.nState = CommerceActTask_GetTaskPointPrizeStatus(human, nID)
+        tNode.item[0] = #v.Prize
+
+        for i, tItemData in ipairs(v.Prize) do
+            Grid.makeItem(tNode.item[i], tItemData[1], tItemData[2])
+        end
+    end
+
+    Msg.send(tMsgData, human.fd)
+end
+
+-- 战区集结 - 领取任务积分奖励
+function CommerceActTask_GetTaskPointPrize(human)
+    local tConf = CommerceActTask_GetTaskPointCof()
+
+    local tGoods = {}
+    for nID, v in ipairs(tConf) do
+        local nState = CommerceActTask_GetTaskPointPrizeStatus(human, nID)
+        if CommonDefine.COMMON_PRIZE_STATE_CANGET == nState then
+            for i, tItemData in ipairs(v.Prize) do
+                if not tGoods[tItemData[1]] then
+                    tGoods[tItemData[1]] = 0
+                end
+
+                tGoods[tItemData[1]] = tGoods[tItemData[1]] + tItemData[2]
+            end
+
+            CommerceActTask_SetTaskPointPrizeStatus(human, nID, CommonDefine.COMMON_PRIZE_STATE_GET)
+        end
+    end
+
+    if nil ~= _G.next(tGoods) then
+        local tItem = {}
+        for nID, nNum in pairs(tGoods) do
+            table.insert(tItem, {nID, nNum})
+        end
+
+        BagLogic.addItemList(human, tItem, "servercommerce")
+        CommerceActTask_QueryTaskPoint(human)
+    end
+end
+
+function isRed(human)
+    local tConf = CommerceActTask_GetTaskCof()
+
+    local nOpenTime = CommerceActTask_GetOpenTime(human)
+    local nDiffDay = Util.diffDay(nOpenTime) 
+    for nID, v in ipairs(tConf) do
+        if v.nDay <= nDiffDay then
+            local nState = CommerceActTask_GetTaskStatus(human, nID, v.nTaskType)
+            if CommonDefine.COMMON_PRIZE_STATE_CANGET == nState then
+                return true
+            end
+        end
+    end
+
+    tConf = CommerceActTask_GetTaskPointCof()
+    for nID, v in ipairs(tConf) do
+        local nState = CommerceActTask_GetTaskPointPrizeStatus(human, nID)
+        if CommonDefine.COMMON_PRIZE_STATE_CANGET == nState then
+            return true
+        end
+    end
+
+    return false
+end
+
+function onLogin(human)
+    local tConf = CommerceActTask_GetTaskCof()
+
+    local tTaskType = {}
+    for nID, v in ipairs(tConf) do
+        if not tTaskType[v.nTaskType] then
+            local nState = CommerceActTask_GetTaskStatus(human, nID, v.nTaskType)
+            -- 没有完成才订阅
+            if nState == CommonDefine.COMMON_PRIZE_STATE_NOGET then
+                tTaskType[v.nTaskType] = 1
+            end
+        end
+    end
+
+    -- 订阅事件
+    for nTaskType, v in pairs(tTaskType) do
+        CommerceActTask_SubEvent(human.db._id, nTaskType)
+        print("[onLogin] 玩家订阅了事件 nTaskType = "..nTaskType)
+    end
+end

+ 334 - 171
script/module/serverCommerce/ServerCommerceManager.lua

@@ -24,6 +24,8 @@ local ServerCommerceCof = require("excel.ServerCommerce")
 local ServerCommerceActDefine = require("serverCommerce.ServerCommerceActDefine")
 local Timer = require("core.Timer")
 local ServerCommerceMiddle = require("serverCommerce.ServerCommerceMiddle")
+local ServerCommerceActCharge = require("serverCommerce.ServerCommerceActCharge")
+local ServerCommerceActRank = require("serverCommerce.ServerCommerceActRank")
 
 -- 活动信息
 tCommerceActInfo = nil
@@ -32,6 +34,7 @@ tCommerceActInfo = nil
 --     nEendTime = nil,        -- 结束时间
 --     isRun = nil,            -- 是否在活动中
 --     nOpen = nil,            -- 是否打开
+--     nBatchID = nil,        -- 批次
 -- }
 
 -- 加载的模块
@@ -43,6 +46,35 @@ local function CommerceAct_SendData(tMsgData, fd)
     Msg.send(tMsgData, fd)
 end
 
+-- 创建玩家DB数据
+function CommerceAct_CreateHumanDB(human)
+    local nBatchID = 1
+    local tCommonDBData = CommonDB.GetCommerceActInfo()
+    if tCommonDBData and nil ~= _G.next(tCommonDBData) then
+        nBatchID = tCommonDBData.nBatchID
+    end
+    
+    human.db.ServerCommerce = 
+    {
+        nPoint = 0,         -- 当前玩家个人积分
+        Task = {},          -- 任务信息
+        Charge = {},        -- 连充豪礼
+        Shop = {},          -- 战区钜惠
+        nBatchID = nBatchID,       -- 批次
+        bSendPlayerMail = false,        -- 是否发送个人邮件
+        bSendServerMail = false,        -- 是否发送全服邮件
+    }
+
+    for nID, module in pairs(tCommerceActModuel) do
+        if module and module.CreatDB then
+            local bRet = module.CreatDB(human)
+            if false == bRet then
+                print("[CommerceAct_CreateHumanDB] nID 初始化DB 数据失败 nID = "..nID)
+            end
+        end
+    end
+end
+
 -- 下发活动数据
 function CommerceAct_SendActInfo(human)
     if not human or not tCommerceActInfo then
@@ -105,18 +137,15 @@ local function CommerceAct_BeginAllAct(human)
         return
     end
 
-    local nEndTime = tCommerceActInfo.nEendTime
-    
-    print("[CommerceAct_BeginAllAct] 所有活动初始化数据开始 ")
+    CommerceAct_CreateHumanDB(human)
 
+    print("[CommerceAct_BeginAllAct] 所有活动初始化数据开始 ")
 end
 
 -- 结束所有活动
 local function CommerceAct_EndAllAct(human)
     -- 各个子活动处理数据
     CommerceAct_HandleEndData(human)
-
-    CommerceAct_SetHumanEndMail(human, true)
 end
 
 -- 活动开始
@@ -125,128 +154,262 @@ local function CommerceAct_Begin()
         return
     end
 
+    for nID, module in pairs(tCommerceActModuel) do
+        if module and module.ClearCache then
+            module.ClearCache()
+        end
+    end
+
     -- 遍历在线玩家
     for uuid, human in pairs(ObjHuman.onlineUuid) do
         CommerceAct_BeginAllAct(human)
     end
-
-    -- 清理排行榜数据
-    -- weekLoopActRank.WeekActRank_ResetData()
 end
 
 -- 活动结束
 local function CommerceAct_End()
-    -- 遍历在线玩家
-    for uuid, human in pairs(ObjHuman.onlineUuid) do
-        CommerceAct_EndAllAct(human)
+    -- 排行榜结束
+    ServerCommerceMiddle.CommerceMiddle_QueryServerRank(ServerCommerceActDefine.COMMERCEACT_SENDSERVERMAIL)
+end
+
+-- 延迟向中心服请求数据
+local function CommerceAct_LaterTimeQuery(nOperate)
+    print("[CommerceAct_LaterTimeQuery] 延迟向中心服请求数据开始")
+    Timer.addLater(ServerCommerceActDefine.COMMERCEACT_INITSERVERTIME, CommerceAct_GetActOpen, nOperate)
+end
+
+-- 延迟10分钟开始
+local function CommerceAct_LaterBeginAct()
+    if not tCommerceActInfo then
+        return 
+    end
+
+    tCommerceActInfo.isRun = true
+    CommerceAct_Begin()
+end
+
+-- 检查活动是否过期
+local function CommerceAct_CheckActIsOverTime()
+    local tCommerceDBInfo = CommonDB.GetCommerceActInfo()
+    if not tCommerceDBInfo or nil == _G.next(tCommerceDBInfo) then
+        return true
+    end
+
+    local nEndTime = tCommerceDBInfo.nEndTime
+    local nNowTime = os.time()
+
+    return nNowTime >= nEndTime
+end
+
+-- 检查是否开启下一轮活动
+local function CommerceAct_CanOpenNext()
+    local tCommerceDBInfo = CommonDB.GetCommerceActInfo()
+    if not tCommerceDBInfo or nil == _G.next(tCommerceDBInfo) then
+        return true
     end
 
-    -- 排行榜直接处理
-    -- weekLoopActRank.WeekActRank_End()
+    local nDiffDay = Util.diffDay(tCommerceDBInfo.nEndTime)
+    if nDiffDay >= ServerCommerceActDefine.COMMERCEACT_NEXTDAY  then
+        return true
+    end
+    
+    return false
 end
 
--- 获取抽卡批次
-function CommerceAct_GetCardBatch()
+-- 创建通用DB数据
+local function CommerceAct_CreateCommonDB()
+    local nNowTime = os.time()
+    local tCommerceInfo = CommonDB.GetCommerceActInfo()
+    local nEndTime = nNowTime + ServerCommerceActDefine.COMMERCEACT_LASTDAY * 86400
+    local tEndDate = os.date("*t",nEndTime)
+    tEndDate.hour = ServerCommerceActDefine.COMMERCEACT_ENDTIME
+    tEndDate.min = 0
+    tEndDate.sec = 0
+    nEndTime = os.time(tEndDate)
+
+    local tDBData = {
+        nBeginTime = nNowTime,
+        nEndTime = nEndTime,
+        nPoint = 0,
+        nSendRankMail = false,
+    }
+
+    if not tCommerceInfo or nil == _G.next(tCommerceInfo) then
+        tDBData.nBatchID = 1
+    else
+        tDBData.nBatchID = tDBData.nBatchID + 1
+    end
 
+    CommonDB.SetCommerceActInfo(tDBData)
 end
 
--- 设置新的批次
-local function CommerceAct_SetCardBatch()
+-- 创建缓存数据
+local function CommerceAct_CreateCacheInfo(nOpen, bLater)
+    local tCommerceInfo = CommonDB.GetCommerceActInfo()
+    if not tCommerceInfo or nil == _G.next(tCommerceInfo)  then
+        print("[CommerceAct_CreateCacheInfo] 为什么会不存在数据\n")
+        return
+    end
+
+    tCommerceActInfo = {}
+    tCommerceActInfo.nStartTime = tCommerceInfo.nBeginTime
+    tCommerceActInfo.nEendTime = tCommerceInfo.nEndTime
+    tCommerceActInfo.isRun = bLater == true and false or true
+    tCommerceActInfo.nOpen = nOpen
+    tCommerceActInfo.nBatchID = tCommerceInfo.nBatchID
+
+    print("[CommerceAct_CreateCacheInfo] 创建缓存数据 nStartTime = "..tCommerceActInfo.nStartTime.." nEendTime = "..tCommerceActInfo.nEendTime
+                                    .." nOpen = "..tCommerceActInfo.nOpen.." nBatchID = "
+                                    ..tCommerceActInfo.nBatchID.." isRun = "..(tCommerceActInfo.isRun == true and 1 or 0))
+
+    if bLater == true then
+        Timer.addLater(ServerCommerceActDefine.COMMERCEACT_BEGINDELATTIME, CommerceAct_LaterBeginAct)
+    end
+end
 
+-- 清理排行榜数据
+local function CommerceAct_ClearRankInfo()
+    ServerCommerceMiddle.CommerceMiddle_ClearRank()
 end
 
-local function CommerceAct_ActCheckOpen_InitServer(nOpen)
+-- 起服初始化数据
+local function CommerceAct_ActCheckOpen_InitServer(nOpen, nOperate)
     if ServerCommerceActDefine.COMMERCEACT_NOOPEN ~= nOpen then
         local tCommerceInfo = CommonDB.GetCommerceActInfo()
-        local nNowTime = os.time()
-        local nBeginTime, nEndTime, isRun
+        -- 不存在数据
         if not tCommerceInfo or nil == _G.next(tCommerceInfo) then
-            nBeginTime = nNowTime
-            isRun = true
-            nEndTime = nNowTime + ServerCommerceActDefine.COMMERCEACT_LASTDAY * 86400
-            local tEndDate = os.date("*t",nEndTime)
-            tEndDate.hour = ServerCommerceActDefine.COMMERCEACT_ENDTIME
-            tEndDate.min = 0
-            tEndDate.sec = 0
-            nEndTime = os.time(tEndDate)
-            local tData = {
-                nBeginTime = nNowTime,
-                nEndTime = nEndTime,
-                nBatch = 1,
-            }
-            CommonDB.SetCommerceActInfo(tData)
-        else 
-            nBeginTime = tCommerceInfo.nBeginTime
-            nEndTime = tCommerceInfo.nEndTime
-            if nNowTime < tCommerceInfo.nEndTime then
-                isRun = true
-            else
-                isRun = false
+            print("[CommerceAct_ActCheckOpen_InitServer] 不存在commonDB数据开始创建")
+            CommerceAct_CreateCommonDB()
+        else
+            -- 存在数据检查是否结束
+            if true == CommerceAct_CheckActIsOverTime() then
+                local bOpenNext = CommerceAct_CanOpenNext()
+                if true == bOpenNext then
+                    -- 开启下一轮
+                    if tCommerceInfo.nBatch < ServerCommerceActDefine.COMMERCEACT_ENDBATCH then
+                        CommerveManager_WriteLog("[CommerveManager-onZeroAll] 当前条件满足开启下一轮活动")
+                        CommerceAct_CreateCommonDB()
+                        -- 清理排行榜数据
+                        CommerceAct_ClearRankInfo()
+                    end
+                end
             end
         end
 
-        tCommerceActInfo.nStartTime = nNowTime
-        tCommerceActInfo.nEendTime = nEndTime
-        tCommerceActInfo.isRun = isRun        
+        local bLater = nOperate == ServerCommerceActDefine.COMMERCEACT_ZERO and true or false
+    
+        CommerceAct_CreateCacheInfo(nOpen, bLater)
+        ServerCommerceActRank.CommercerActRank_InitServerQueryRank()
     end
 end
 
+-- 获取玩家当前点数
+local function CommerceAct_GetHumanPoint(human)
+    return human.db.ServerCommerce.nPoint
+end
+
+-- 设置玩家当前点数
+local function CommerceAct_SetHumanPoint(human, nValue)
+    human.db.ServerCommerce.nPoint = nValue
+end
+
 ----------------------------------------- 外部调用开始 -------------------------------------
 function onZeroAll(funcID)
     local nNowTime = os.time()
     local tDate = os.date("*t",nNowTime)
 
-    if ServerCommerceActDefine.COMMERCEACT_BEGINTIME == tDate.hour then
-        Timer.addLater(ServerCommerceActDefine.COMMERCEACT_BEGINDELATTIME, CommerceAct_GetActOpen, 
-                    ServerCommerceActDefine.COMMERCEACT_ZERO)
-    elseif ServerCommerceActDefine.COMMERCEACT_ENDTIME == tDate.hour then
-    
+    -- 活动未开启
+    if tDate.hour == ServerCommerceActDefine.COMMERCEACT_BEGINTIME then
+        -- 获取DB数据
+        local tCommerceDBInfo = CommonDB.GetCommerceActInfo()
+        if not tCommerceDBInfo or nil == _G.next(tCommerceDBInfo) then
+            CommerceAct_LaterTimeQuery(ServerCommerceActDefine.COMMERCEACT_ZERO)
+            return
+        end
+
+        -- 存在DB数据说明已经满足条件了
+        if true == CommerceAct_CheckActIsOverTime() then
+            local bOpenNext = CommerceAct_CanOpenNext()
+            if false == bOpenNext then
+                return
+            end
+
+            -- 开启下一轮
+            if tCommerceDBInfo.nBatch < ServerCommerceActDefine.COMMERCEACT_ENDBATCH then
+                CommerveManager_WriteLog("[CommerveManager-onZeroAll] 当前条件满足开启下一轮活动")
+                CommerceAct_CreateCommonDB()
+                -- 存在数据说明时间是满足的
+                CommerceAct_CreateCacheInfo(ServerCommerceActDefine.COMMERCEACT_OPEN, true)
+                -- 清理排行榜数据
+                CommerceAct_ClearRankInfo()
+            end
+        end
+    elseif tDate.hour == ServerCommerceActDefine.COMMERCEACT_ENDTIME then
+        if not tCommerceActInfo or tCommerceActInfo.nOpen == ServerCommerceActDefine.COMMERCEACT_NOOPEN then
+            return
+        end
+
+        local tCommerceDBInfo = CommonDB.GetCommerceActInfo()
+        if not tCommerceDBInfo or nil == _G.next(tCommerceDBInfo) then
+            print("[CommerceAct_onZeroAll] 存在缓存数据, 但是获取不到DB数据")
+            return
+        end
 
-        tCommerceActInfo = nil
+        local nEndTime = tCommerceDBInfo.nEndTime
+        if nEndTime <= nNowTime then
+            -- 活动结束处理
+            CommerceAct_End()
+            tCommerceActInfo.nSendRankMail = true
+        end
     end
 end
 
 -- 请求活动打开信息
 function CommerceAct_GetActOpen(nOperate)
+    print("[CommerceAct_GetActOpen] 开始向中心服请求活动数据")
     ServerCommerceMiddle.CommerceMiddle_IsActOpen(nOperate)
 end
 
 -- 中心服回复活动信息
 function CommerceAct_ActCheckOpen(nOpen, nOperate)
-    if not tCommerceActInfo then
-        tCommerceActInfo = {}
-    end
-
-    tCommerceActInfo.nOpen = nOpen
-    if ServerCommerceActDefine.COMMERCEACT_SERVEROPEN == nOperate then
-        CommerceAct_ActCheckOpen_InitServer(nOpen) 
-    else
-
-    end
+    print("[CommerceAct_ActCheckOpen] 收到活动信息开始处理 nOpen = "..nOpen.." nOperate ="..nOperate)
+    CommerceAct_ActCheckOpen_InitServer(nOpen, nOperate) 
 end
 
 -- 起服初始化
 function CommerceAct_Init()
+    if _G.is_middle == true then
+        -- 中心服起服获取信息
+        ServerCommerceMiddle.CommerceMiddle_InitServer()
+        return
+    end
+
     local nNowTime = os.time()
 
     for nID, v in pairs(ServerCommerceCof.CommerceAct) do
-        local moduleFn = load("return require(\"" .. v.moduleFn .. "\")")()
-        if moduleFn then
-            tCommerceActModuel[nID] = moduleFn
-            if moduleFn.Init then
-                local bRet = moduleFn.Init()
-                if false == bRet then
-                    print("[CommerceAct_Init] 初始化模块数据失败 nID ".. nID)
+        if v.moduleFn then
+            local moduleFn = load("return require(\"" .. v.moduleFn .. "\")")()
+            if moduleFn then
+                tCommerceActModuel[nID] = moduleFn
+                if moduleFn.Init then
+                    local bRet = moduleFn.Init()
+                    if false == bRet then
+                        print("[CommerceAct_Init] 初始化模块数据失败 nID ".. nID)
+                    end
                 end
+                print("[CommerceAct_Init] 加载模块成功 name = "..v.name)
+            else
+                print("[CommerceAct_Init] 加载模块失败 nID ".. nID)
             end
-            print("[CommerceAct_Init] 加载模块成功 name = "..v.name)
         else
-            print("[CommerceAct_Init] 加载模块失败 nID ".. nID)
+            print("[CommerceAct_Init] 未配置 name = "..v.name)
         end
     end
 
-    Timer.addLater(ServerCommerceActDefine.COMMERCEACT_INITSERVERTIME, CommerceAct_GetActOpen, 
-                    ServerCommerceActDefine.COMMERCEACT_SERVEROPEN)
+    print("[CommerceAct_Init] 延迟进行请求数据操作")
+    
+    -- 延迟向中心服请求数据
+    CommerceAct_LaterTimeQuery(ServerCommerceActDefine.COMMERCEACT_SERVEROPEN)
 end
 
 -- 是否还在活动期间
@@ -258,64 +421,65 @@ function CommerceAct_IsRun()
     return tCommerceActInfo.isRun
 end
 
-function CommerceAct_IsSend()
-    if not tCommerceActInfo then
-        return false
-    end
-
-    return tCommerceActInfo.nSend
-end
-
 -- 玩家登录
 function onLogin(human, funcID)
     if not human then
         return
     end
 
-
-    local nLastEndTime = CommerceAct_GetHumanEndTime(human)
-    local nState = CommerceAct_GetHumanEndMail(human)
-
-    local nSendMail = nState and 1 or 0
-    print("[onLogin] 玩家登录 nSendMail = "..nSendMail)
-
-    -- 未开始
-    if false == CommerceAct_IsRun() then
-        if true == nState or -1 >= nLastEndTime then
+    -- 下发活动基础数据
+    if true == CommerceAct_IsRun() then
+        local tCommonDBData = CommonDB.GetCommerceActInfo()
+        if not tCommonDBData or nil == _G.next(tCommonDBData) then
+            print("[onLogin] 玩家登录不存在对应的数据通用DB数据!!!!")
             return
         end
 
-        CommerceAct_EndAllAct(human)
+        -- 不存在数据直接创建
+        if not human.db.ServerCommerce then
+            CommerceAct_CreateHumanDB(human)
+        else
+            -- 用记在玩家身上的批次 和 CommonDB 中的数据比较
+            local nOldBatchID = human.db.ServerCommerce.nBatchID
+            local nNowBatchID = tCommonDBData.nBatchID
+            if nNowBatchID ~= nOldBatchID then
+                CommerceAct_CreateHumanDB(human)
+            end
+        end
         
-        return
-    end
+        CommerceAct_SendActInfo(human)
 
-    -- 当前活动开启,记录的结束时间比当前开始的时间都小说明是新活动
-    if nLastEndTime < tCommerceActInfo.nStartTime then
-        if false == nState then
-            -- 处理上一次的奖励数据
-            CommerceAct_HandleEndData(human)
+        for _, module in pairs(tCommerceActModuel) do
+            if module and module.onLogin then
+                module.onLogin(human)
+            end
+        end
+    else
+        -- 不在活动中
+        local tCommonDBData = CommonDB.GetCommerceActInfo()
+        if not tCommonDBData or nil == _G.next(tCommonDBData) then
+            print("[onLogin] 玩家登录不存在对应的数据通用DB数据!!!!")
+            return
         end
 
-        CommerceAct_BeginAllAct(human)
-        
-        return
-    end
-
-    -- 下发活动基础数据
-    if true == CommerceAct_IsRun() then
-        CommerceAct_SendActInfo(human)
-    end
-end
+        -- 不存在对应DB数据
+        if not human.db.ServerCommerce then
+            return
+        end
 
--- 英雄星级改变回调
-function onHeroStarChange(human, funcID, parameter, parameter2)
-    if not human or "table" ~= type(parameter) then
-        return
-    end
+        -- 未发送个人邮件都是未上榜的
+        local bSendPlayerMail = CommerveManager_GetHumanSendPlayerMail(human)
+        if false == bSendPlayerMail then
+            CommerveManager_SetHumanSendPlayerMail(human, true)
+            ServerCommerceActRank.CommercerActRank_SendHumanMailHumanLogin(human)
+        end
 
-    if false == CommerceAct_IsRun() then
-        return
+        -- 全服邮件
+        local bSendServerMail = CommerveManager_GetHumanSendServerMail(human)
+        if false == bSendServerMail and true == tCommonDBData.bSendServerMail then
+            CommerveManager_SetHumanSendServerMail(human, true)
+            ServerCommerceActRank.CommercerActRank_SendServerMailHumanLogin(human)
+        end
     end
 
 end
@@ -335,9 +499,9 @@ end
 
 function isRed(human, YYInfo, funcConfig)
     local bRet = false
-    for id, v in pairs(ServerCommerceCof.WeekLoopAct) do
-        if tCommerceActModuel[id] and tCommerceActModuel[id].isRed then
-            bRet = tCommerceActModuel[id].isRed(human)
+    for _, module in pairs(tCommerceActModuel) do
+        if module and module.isRed then
+            bRet = module.isRed(human)
             if true == bRet then
                 break
             end
@@ -347,9 +511,8 @@ function isRed(human, YYInfo, funcConfig)
     return bRet
 end
 
--- 消耗古玉回调
-function onDecZuanshi(human, funcID, parameter, parameter2)
-    if not human or "number" ~= type(parameter) then
+function onCharge(human, price, funcID, buyID)
+    if not human then
         return
     end
 
@@ -357,76 +520,76 @@ function onDecZuanshi(human, funcID, parameter, parameter2)
         return
     end
 
-    local nGuYu = math.abs(parameter)
-    if 0 >= nGuYu then
-        return
-    end
+    print("[onCharge] 跨服商业活动 玩家充值回调开始 name = "..human.db.name.." price = "..price)
 
+    for _, module in pairs(tCommerceActModuel) do
+        if module and module.onCharge then
+            module.onCharge(human, price, funcID, buyID)
+        end
+    end
 end
 
--- 高级召唤回调
-function onDrawCard(human, funcID, parameter, parameter2)
-    if not human or "number" ~= type(parameter) then
-        return
-    end
+-- 增加整个服务器的点数
+function CommerveManager_AddServerPoint(nAddPoint)
+    local tCommonDBData = CommonDB.GetCommerceActInfo()
+    local nNewPoint = tCommonDBData.nPoint + nAddPoint
+    CommonDB.SetCommerceActInfo_Point(nNewPoint)
 
-    if false == CommerceAct_IsRun() then
-        return
+    for _, module in pairs(tCommerceActModuel) do
+        if module and module.onAllPointChange then
+            module.onAllPointChange()
+        end
     end
-
-    print("[onDrawCard] 高级召唤回调 parameter = "..parameter)
-    
 end
 
--- 天命召唤回调
-function onTMDrawCard(human, funcID, parameter, parameter2)
-    if not human or "number" ~= type(parameter) then
-        return
-    end
+-- 增加个人积分
+function CommerveManager_AddHumanPint(human, nPoint)
+    local nNowPoint = CommerceAct_GetHumanPoint(human)
+    local nNewPoint = nNowPoint + nPoint
+    CommerceAct_SetHumanPoint(human ,nNewPoint)
+    ServerCommerceActRank.CommercerActRank_HumanPointChange(human, nNewPoint)
+end
 
-    if false == CommerceAct_IsRun() then
-        return
+-- 写日志
+function CommerveManager_WriteLog(szLogText, human)
+    if human then
+        szLogText = szLogText.." name = "..human.db.name.." id = "..human.db._id
     end
 
-    print("[onDrawCard] 天命召唤回调 parameter = "..parameter)
-
-    
+    Log.write(Log.LOGID_OSS_COMMON_ACT, szLogText)
 end
 
--- 寻星回调
-function onFindStar(human, funcID, parameter, parameter2)
-    if not human or "number" ~= type(parameter) then
+-- 设置全服发送邮件奖励
+function CommerveManager_SetCommDBSendMail()
+    local bSendMail = CommonDB.GetCommerceActInfo_SendServerMail()
+    if nil == bSendMail then
         return
     end
 
-    if false == CommerceAct_IsRun() then
-        return
-    end
-    
-    print("[onDrawCard] 寻星回调 parameter = "..parameter)
-
+    CommonDB.SetCommerceActInfo_SendServerMail(true)
 end
 
--- GM 命令
-function GMResetWeekAct(human)
-    if CommerceAct_IsRun() then
-        CommerceAct_EndAllAct(human)
-
-        CommerceAct_SetCardBatch()
-        CommerceAct_BeginAllAct(human)
-    end
+-- 获取全服发送邮件标识
+function CommerveManager_GetCommDBSendMail()
+    return CommonDB.GetCommerceActInfo_SendServerMail()
 end
 
-function onCharge(human, price, funcID, buyID)
-    if not human then
-        return
-    end
+-- 设置玩家已经获取了全服奖励邮件
+function CommerveManager_SetHumanSendServerMail(human, nValue)
+    human.db.ServerCommerce.bSendServerMail = nValue
+end
 
-    if false == CommerceAct_IsRun() then
-        return
-    end
+-- 获取玩家全服奖励邮件状态
+function CommerveManager_GetHumanSendServerMail(human)
+    return human.db.ServerCommerce.bSendServerMail
+end
 
-    print("[onCharge] 玩家充值回调开始 name = "..human.db.name.." price = "..price)
+-- 设置玩家已经获取了个人奖励邮件
+function CommerveManager_SetHumanSendPlayerMail(human, nValue)
+    human.db.ServerCommerce.bSendPlayerMail = nValue
+end
 
-    
-end
+-- 获取玩家全服奖励邮件状态
+function CommerveManager_GetHumanSendPlayerMail(human)
+    return human.db.ServerCommerce.bSendPlayerMail
+end

+ 110 - 3
script/module/serverCommerce/ServerCommerceMiddle.lua

@@ -6,21 +6,44 @@ local InnerMsg = require("core.InnerMsg")
 local Config = require("Config")
 local CommonDB = require("common.CommonDB")
 local Timer = require("core.Timer")
-local CommerceManger = require("serverCommerce.ServerCommerceManager")
+local CommonDefine = require("common.CommonDefine")
+local ServerCommerceManger = require("serverCommerce.ServerCommerceManager")
+local ServerCommerceActDefine = require("serverCommerce.ServerCommerceActDefine")
+local ServerCommerceRank = require("serverCommerce.ServerCommerceActRank")
 
 -- 缓存开服天数
 local tServerOpenDay = nil
 local SERVERCOMMERCEOPENDAY = 8     -- 活动开启要求天数
 
+-- 起服获取信息
+function CommerceMiddle_InitServer()
+    if _G.is_middle ~= true then 
+        return
+    end
+
+    Timer.addLater(ServerCommerceActDefine.COMMERCEACT_INITOPENDAY, CommerceMiddle_GetOpen)
+    print("[CommerceMiddle_InitServer] 起服定时去获取数据 nTime = "..ServerCommerceActDefine.COMMERCEACT_INITOPENDAY)
+end
+
 -- 获取(中心服主动去获取)
 function CommerceMiddle_GetOpen()
+    if _G.is_middle ~= true then 
+        return
+    end
+    print("[CommerceMiddle_GetOpen] 开始去获取服务器开启信息")
+    
     local tWarZoneConf = WarZoneConf.group
-    local tMsgData = InnerMsg.wl.WL_COMMERCE_QUERYOPENDAY
     for _, v in ipairs(tWarZoneConf) do
         local nFirstServerID = MiddleConnect.MiddleConnect_ConfServerID2TrueServerID(v.nMinServerID)
+        print("[CommerceMiddle_GetOpen] nMinServerID = "..v.nMinServerID.." nFirstServerID = "..nFirstServerID)
         local fd = MiddleManager.getFDBySvrIndex(nFirstServerID)
         if fd then
+            print("[CommerceMiddle_GetOpen] 中心服主动去获取数据 nFirstServerID = "..nFirstServerID)
+            local tMsgData = InnerMsg.wl.WL_COMMERCE_QUERYOPENDAY
             InnerMsg.sendMsg(fd, tMsgData)
+            print("[CommerceMiddle_GetOpen] 发送结束")
+        else
+            print("[CommerceMiddle_GetOpen] 中心服主动去获取数据, 但是获取不到fd nFirstServerID = "..nFirstServerID)
         end
     end
 end
@@ -35,6 +58,7 @@ function CommerceMiddle_SendOpenDay(fd, msg)
     end
 
     tServerOpenDay[nServerConfID] = nOpenDay
+    print("[CommerceMiddle_SendOpenDay] 回复开服天数 nServerConfID = "..nServerConfID.." nOpenDay = "..nOpenDay)
 end
 
 -- 请求开服天数
@@ -44,6 +68,7 @@ function CommerceMiddle_QueryOpenDay(fd, msg)
     tMsgData.nSrcServerID = Config.SVR_INDEX
 
     InnerMsg.sendMsg(0, tMsgData)
+    print("[CommerceMiddle_QueryOpenDay] 请求开服天数")
 end
 
 function CommerceMiddle_QueryOpenAct(fd, msg)
@@ -70,11 +95,61 @@ function CommerceMiddle_QueryOpenAct(fd, msg)
     tMsgData.nOpen = tServerOpenDay[nFirstServerID] >= SERVERCOMMERCEOPENDAY and 1 or 0
     tMsgData.nOperate = msg.nOperate
     InnerMsg.sendMsg(nSrcFD, tMsgData)
+
+    print("[CommerceMiddle_QueryOpenAct] 请求中心服活动是否开启 nOpen = "..tMsgData.nOpen)
 end
 
 
 function CommerceMiddle_SendOpenAct(fd, msg)
-    CommerceManger.CommerceAct_ActCheckOpen(msg.nOpen, msg.nOperate)
+    print("[CommerceMiddle_SendOpenAct] 获取到中心服发送的是否开服数据 nOpen = "..msg.nOpen)
+    ServerCommerceManger.CommerceAct_ActCheckOpen(msg.nOpen, msg.nOperate)
+end
+
+-- 发送玩家排行榜信息
+function CommerveMiddle_HumanPointChange(human, nPoint)
+    local tMsgData = InnerMsg.lw.LW_COMMERCE_RANK_POINT_CHANGE
+    tMsgData.uuid = human.db._id
+    tMsgData.name = human.db.name
+    tMsgData.head = human.db.head
+    tMsgData.headFrame = human.db.headFrame
+    tMsgData.nSrcServerID = Config.SVR_INDEX
+    tMsgData.nValue = nPoint
+    tMsgData.nRankType = CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE
+    tMsgData.nRankSubType = CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_HUMAN
+    tMsgData.nOperate = CommonDefine.COMMONRANK_VALUE_REPLACE
+
+    InnerMsg.sendMsg(0, tMsgData)
+end
+
+-- 服务器点数改变发送排行榜信息
+function CommerveMiddle_ServerPointChange(nPoint)
+    local tMsgData = InnerMsg.lw.LW_COMMERCE_RANK_POINT_CHANGE
+    tMsgData.uuid = Config.NEW_SVR_INDEX
+    tMsgData.name = "寻宝"..Config.NEW_SVR_INDEX.."服"
+    tMsgData.head = -1
+    tMsgData.headFrame = -1
+    tMsgData.nSrcServerID = Config.SVR_INDEX
+    tMsgData.nValue = nPoint
+    tMsgData.nRankType = CommonDefine.COMMONRANK_TYPE_SERVERCOMMERCE
+    tMsgData.nRankSubType = CommonDefine.COMMONRANK_SUB_TYPE_SERVERCOMMERCE_SERVER
+    tMsgData.nOperate = CommonDefine.COMMONRANK_VALUE_REPLACE
+
+    InnerMsg.sendMsg(0, tMsgData)
+end
+
+-- 请求排行榜数据
+function CommerveMiddle_QueryRankInfo(nRankType, nRankSubType)
+    local tMsgData = InnerMsg.lw.LW_COMMERCE_QUERY_RANK_INFO
+    tMsgData.nRankType = nRankType
+    tMsgData.nRankSubType = nRankSubType
+    tMsgData.nSrcServerID = Config.SVR_INDEX
+    
+    InnerMsg.sendMsg(0, tMsgData)
+end
+
+-- 获取到排行榜数据
+function CommerveMiddle_GetRankInfo(tData)
+    ServerCommerceRank.CommercerActRank_GetRankInfo(tData)
 end
 
 ------------------ 活动管理器操作 ------------------------
@@ -85,4 +160,36 @@ function CommerceMiddle_IsActOpen(nOperate)
     tMsgData.nOperate = nOperate
 
     InnerMsg.sendMsg(0, tMsgData)
+    print("[CommerceMiddle_IsActOpen] 普通服开始请求活动信息") 
 end
+
+-- 请求当前服务器排行最新的排名
+function CommerceMiddle_QueryServerRank(nOperate)
+    local tMsgData = InnerMsg.lw.LW_COMMERCE_QUERY_SERVER_RANK
+    tMsgData.nSrcServerID = Config.SVR_INDEX
+    tMsgData.nServerUuid = Config.NEW_SVR_INDEX
+    tMsgData.nOperate = nOperate
+    InnerMsg.sendMsg(0, tMsgData)
+end
+
+-- 获取到 当前服务器排行最新的排名
+function CommerceMiddle_GetServerRank(fd, msg)
+    ServerCommerceRank.CommercerActRank_GetServerRank(msg)
+end
+
+-- 通知中心服当前服务器在线全服玩家邮件结束
+function CommerceMiddle_TellServerMailOk()
+    local tMsgData = InnerMsg.lw.LW_COMMERCE_TELL_SERVER_MAILOK
+    tMsgData.nSrcServerID = Config.SVR_INDEX
+    InnerMsg.sendMsg(0, tMsgData)
+end
+
+function CommerceMiddle_GetHumanRank(msg)
+    ServerCommerceRank.CommercerActRank_SendHumanRankPrize(msg)
+end
+
+function CommerceMiddle_ClearRank()
+    local tMsgData = InnerMsg.lw.LW_COMMERCE_CLEAR_RANK
+    tMsgData.nSrcServerID = Config.SVR_INDEX
+    InnerMsg.sendMsg(0, tMsgData)
+end

+ 4 - 1
script/module/shop/ShopLogic.lua

@@ -21,6 +21,8 @@ local FuwenGrid = require("fuwen.FuwenGrid")
 local HeroGrowUp = require("absAct.HeroGrowUp")
 local YunYingLogic = require("yunying.YunYingLogic")
 local Config = require("Config")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 local function inServerIndex(svrIndexs)
 	for i = 1, #svrIndexs do
@@ -394,7 +396,8 @@ function buy(human, shopType, itemID, itemIndex, buyCnt)
     if shopType == ShopDefine.SHOP_TYPE_BLACKMARKET then
         ChengjiuLogic.onCallback(human,ChengjiuDefine.CJ_TASK_TYPE_4,1)
 	    HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE10, 1)
-        YunYingLogic.onCallBack(human, "onShopBuy",1)   
+        YunYingLogic.onCallBack(human, "onShopBuy",1)  
+	    TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_SHOPBUY, human.db._id, 1)
     end
 end
 

+ 5 - 0
script/module/treasurechest/TreasureChestLogic.lua

@@ -14,6 +14,9 @@ local CommonDefine = require("common.CommonDefine")
 local Grid = require("bag.Grid")
 local MainDianLogic = require("MaiDian.MaiDianLogic")
 local MaiDianDefine = require("MaiDian.MaiDianDefine")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
+
 -- 奖励缓存有序 key为宝箱类型
 local tCacheBoxPrize = nil
 
@@ -388,6 +391,8 @@ function TreasureChestLogic_Open(human, nBoxType, nBoxNum)
         TreasureChestLogic_AddAutoNum(human, nBoxType, nBoxNum)
     end
 
+    TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_OPENBOX, human.db._id, nBoxNum)
+
     TreasureChestLogic_Query(human)
 end
 

+ 18 - 10
script/module/trigger/TriggerDefine.lua

@@ -1,16 +1,24 @@
 
 
 --定义事件标识
-BATTLE_MOP_UP = 1            --冒险闯关扫荡
-LOSTTEMPLE_PASS = 2          --失落神庙通关
-YJTREASURE_PASS_LEVEL = 3    --遗迹探险层数
-FRIEND_COMBAT = 4            --好友切磋次数
-CHAT_TIMES = 5               --所有聊天频道发言次数
-MOZHU_CHALLENGE = 6         --魔王梼杌参数次数
-DRAWCALL_SERNIOR_CNT = 7      --高级召唤次数
-FUWEN_RECASTING = 8          --符文重铸次数
-UNION_DONATE = 9             --公会捐献次数
-ZHANBU_SYNTHESIS = 10         --占卜合成次数
+BATTLE_MOP_UP               = 1         --  冒险闯关扫荡
+LOSTTEMPLE_PASS             = 2         --  失落神庙通关
+YJTREASURE_PASS_LEVEL       = 3         --  遗迹探险层数
+FRIEND_COMBAT               = 4         --  好友切磋次数
+CHAT_TIMES                  = 5         --  所有聊天频道发言次数
+MOZHU_CHALLENGE             = 6         --  魔王梼杌参数次数
+DRAWCALL_SERNIOR_CNT        = 7         --  高级召唤次数
+FUWEN_RECASTING             = 8         --  符文重铸次数
+UNION_DONATE                = 9         --  公会捐献次数
+ZHANBU_SYNTHESIS            = 10        --  占卜合成次数
+EVENT_TYPE_SWEEP            = 11        --  挂机扫荡
+EVENT_TYPE_FINDSTAR         = 12        --  寻星
+EVENT_TYPE_FATESUMMON       = 13        --  天命召唤
+EVENT_TYPE_OPENBOX          = 14        --  开启宝箱
+EVENT_TYPE_CHAMPIONSNUM     = 15        --  参加冠军联赛
+EVENT_TYPE_GETHERO          = 16        --  获得英雄
+EVENT_TYPE_SHOPBUY          = 17        --  商店购买商品
+EVENT_TYPE_UNIONSKILLUP     = 18        --  公会技能升级
 
 
 --触发事件后, 新值与旧值相加

+ 116 - 57
script/module/trigger/TriggerLogic.lua

@@ -10,81 +10,140 @@ local moniterTbl = {}
 
 
 --检测触发事件是否正确
-local function checkTrigger(arg)
-    local errTag = nil
-    if type(arg) == "table" then
-        for _, tag in ipairs(arg) do
-            if not TriggerDefine.TRIGGERADDTB[tag] and not TriggerDefine.TRIGGERUPDATETB[tag] then
-                errTag = tag
-                break
-            end
-        end
-    else
-        if not TriggerDefine.TRIGGERADDTB[arg] and not TriggerDefine.TRIGGERUPDATETB[arg] then
-            errTag = arg
-        end
-    end
-
-    if errTag then
-        assert(false, string.format("注册事件不存在, tag = %s", errTag))
-    end
-    return true
-end
+-- local function checkTrigger(arg)
+--     local errTag = nil
+--     if type(arg) == "table" then
+--         for _, tag in ipairs(arg) do
+--             if not TriggerDefine.TRIGGERADDTB[tag] and not TriggerDefine.TRIGGERUPDATETB[tag] then
+--                 errTag = tag
+--                 break
+--             end
+--         end
+--     else
+--         if not TriggerDefine.TRIGGERADDTB[arg] and not TriggerDefine.TRIGGERUPDATETB[arg] then
+--             errTag = arg
+--         end
+--     end
+
+--     if errTag then
+--         assert(false, string.format("注册事件不存在, tag = %s", errTag))
+--     end
+--     return true
+-- end
 
 
 --注册订阅
-function RegisterMoniter(triggerArr, cbFunc)
-    checkTrigger(triggerArr)
-
-    local handler = #moniterTbl+1
-    moniterTbl[handler] = {
-        triggerArr = triggerArr,
-        cbFunc = cbFunc,
-    }
+-- function RegisterMoniter(triggerArr, cbFunc)
+--     checkTrigger(triggerArr)
+
+--     local handler = #moniterTbl+1
+--     moniterTbl[handler] = {
+--         triggerArr = triggerArr,
+--         cbFunc = cbFunc,
+--     }
+
+--     return handler
+-- end
+
+-- 注册事件
+-- 为每个玩家维护订阅表
+function SubscribeEvent(eventType, uuid, callback)
+    if not moniterTbl[uuid] then
+        moniterTbl[uuid] = {}
+    end
 
-    return handler
+    if not moniterTbl[uuid][eventType] then
+        moniterTbl[uuid][eventType] = {}
+    else
+        for i, funcCallBack in ipairs(moniterTbl[uuid][eventType]) do
+            if funcCallBack == callback then
+                print("[SubscribeEvent] 重复订阅消息 eventType = "..eventType)
+                return
+            end
+        end
+    end
+    
+    table.insert(moniterTbl[uuid][eventType], callback)
 end
 
---移除订阅
-function RemoveMoniter(handler)
-    if not handler then
-        return
+-- 发布订阅
+function PublishEvent(eventType, uuid, ...)
+    if moniterTbl[uuid] and moniterTbl[uuid][eventType] then
+        for i, callback in ipairs(moniterTbl[uuid][eventType]) do
+            pcall(callback, eventType, uuid, ...)
+        end
     end
-
-    table.remove(moniterTbl, handler)
 end
 
-
---广播
-function Broadcast(human, triggerTag, val, isAdd)
-    for tag, v in ipairs(moniterTbl) do
-        if table.find(v.triggerArr, triggerTag) then
-            local f = v.cbFunc
-            local res = pcall(f, human, triggerTag, val, isAdd)
-            if not res then
-                print(string.format("广播失败, handler = %s", tag))
+-- 取消订阅
+function UnsubscribeEvent(eventType, uuid, callback)
+    if moniterTbl[uuid] and moniterTbl[uuid][eventType] then
+        local tSubData = moniterTbl[uuid][eventType]
+        for i, cb in ipairs(tSubData) do
+            if cb == callback then
+                table.remove(tSubData, i)
+                break
             end
         end
+
+        if nil == _G.next(tSubData) then
+            moniterTbl[uuid][eventType] = nil
+        end
     end
 end
 
+-- 移除所有订阅(玩家下线)
+function RemoveAllscribeEvent(uuid)
+    moniterTbl[uuid] = nil
+end
 
---触发事件
-function Trigger(human, triggerTag, val)
-    local isAdd = false
-    if TriggerDefine.TRIGGERADDTB[triggerTag] then
-        isAdd = true
-    end
+function onLogout(human)
+    -- 这里应该先发下线事件,但是目前没有这种需要先不管
+    RemoveAllscribeEvent(human.db._id)
+    print("[TriggerLogic-onLogout] 玩家下线移除所有事件订阅 name = "..human.db.name)
+end
 
-    if not isAdd then
-        if not TriggerDefine.TRIGGERUPDATETB[triggerTag] then
-            assert(false, string.format("触发事件不存在, tag = %s", triggerTag))
-        end
-    end
 
+--移除订阅
+-- function RemoveMoniter(handler)
+--     if not handler then
+--         return
+--     end
+
+--     table.remove(moniterTbl, handler)
+-- end
 
-    Broadcast(human, triggerTag, val, isAdd)
-end
+
+--广播
+-- function Broadcast(human, triggerTag, val, isAdd)
+--     for tag, v in ipairs(moniterTbl) do
+--         if table.find(v.triggerArr, triggerTag) then
+--             local f = v.cbFunc
+--             local res = pcall(f, human, triggerTag, val, isAdd)
+--             if not res then
+--                 print(string.format("广播失败, handler = %s", tag))
+--             end
+--         end
+--     end
+-- end
+
+
+-- --触发事件
+-- function Trigger(human, triggerTag, val)
+--     local isAdd = false
+--     if TriggerDefine.TRIGGERADDTB[triggerTag] then
+--         isAdd = true
+--     end
+
+--     if not isAdd then
+--         if not TriggerDefine.TRIGGERUPDATETB[triggerTag] then
+--             assert(false, string.format("触发事件不存在, tag = %s", triggerTag))
+--         end
+--     end
+
+
+--     Broadcast(human, triggerTag, val, isAdd)
+-- end
 
 
 

+ 4 - 0
script/module/union/UnionTecLogic.lua

@@ -16,6 +16,8 @@ local Util = require("common.Util")
 local UnionLivenessLogic = require("union.UnionLivenessLogic")
 local UnionDefine = require("union.UnionDefine")
 local RoleDefine = require("role.RoleDefine")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 TEC_OCCU_CNT = 4
 TEC_TIER_CNT = 6
@@ -422,6 +424,8 @@ function techLvUp(human,occu,tier)
     RoleAttr.cleanHeroAttrCache(human)
     RoleAttr.doCalc(human)
     ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
+
+    TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_UNIONSKILLUP, human.db._id, 1)
 end
 
 function checkisFirstRest(human)

+ 4 - 1
script/module/xianzhi/XianzhiLogic.lua

@@ -22,7 +22,8 @@ local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
 local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
 local HeroGrowUp = require("absAct.HeroGrowUp")
 local YunYingLogic = require("yunying.YunYingLogic")
-
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 local xianzhiOutPutId = 126
 local xianzhiDelitem_Normal = 100
@@ -150,6 +151,8 @@ function zhaohuanDo(human, camp, cnt, skip)
     
     HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE2, cnt)
     YunYingLogic.onCallBack(human, "onTMDrawCard", cnt)   
+
+    TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_FATESUMMON, human.db._id, cnt)
 end
 
 -- 置换查询

+ 2 - 0
script/module/yunying/YunYingLogic.lua

@@ -39,6 +39,7 @@ local AbsReachRankDB = require("absAct.AbsReachRankDB")
 local OpenServerActPowerUp = require("present.OpenServerActPowerUp")
 local WeekendLoopActManger = require("WeekendLoopActivity.WeekendLoopActManager")
 local OpenServerActAddUpCharge = require("present.OpenServerActAddUpCharge")
+local ServerCommerceActManger = require("serverCommerce.ServerCommerceManager")
 
 ID2YYInfo = ID2YYInfo or { } -- 每个id是一个主界面上方运营活动大图标入口
 PANELID2OPENLV = PANELID2OPENLV or { }
@@ -187,6 +188,7 @@ function init()
     OpenServerActPowerUp.Init()
     WeekendLoopActManger.WeekLoopACT_Init()
     OpenServerActAddUpCharge.Init()
+    ServerCommerceActManger.CommerceAct_Init()
 end
 
 

+ 4 - 0
script/module/zhuanpan/ZhuanpanLogic.lua

@@ -15,6 +15,8 @@ local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
 local VipLogic = require("vip.VipLogic")
 local EquipLogic = require("equip.EquipLogic")
 local YunYingLogic = require("yunying.YunYingLogic")
+local TriggerDefine = require("trigger.TriggerDefine")
+local TriggerLogic = require("trigger.TriggerLogic")
 
 DEFAULT_ZHUANPAN_TYPE_NORMAL 		= 1     -- 基础转盘
 DEFAULT_ZHUANPAN_TYPE_GAOJI  		= 2     -- 高级转盘
@@ -422,6 +424,8 @@ function getReward(human, mainType, cnt)
     query(human, mainType)
 
     YunYingLogic.onCallBack(human, "onFindStar", cnt)
+
+	TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_FINDSTAR, human.db._id, cnt)
 end
 
 -- 购买许愿珠