local Msg = require("core.Msg")
local InnerMsg = require("core.InnerMsg")
local ObjHuman = require("core.ObjHuman")
local Util = require("common.Util")
local Config = require("Config")
local Lang = require("common.Lang")
local LuaMongo = _G.lua_mongo
local DB = require("common.DB")
local RoleDBLogic = require("role.RoleDBLogic")
local CombatLogic = require("combat.CombatLogic")
local CombatPosLogic = require("combat.CombatPosLogic")
local CombatDefine = require("combat.CombatDefine")
local UnionWarDBLogic = require("union.UnionWarDBLogic")
local UnionWarMiddleLogic = require("union.UnionWarMiddleLogic")
local HeroGrid = require("hero.HeroGrid")
local Grid = require("bag.Grid")
local BagLogic = require("bag.BagLogic")
local Broadcast = require("broadcast.Broadcast")
local RoleDefine = require("role.RoleDefine")
local UnionDBLogic = require("union.UnionDBLogic")
local RoleLogic = require("role.RoleLogic")
local MailManager = require("mail.MailManager")
local BattleLogic = require("battle.BattleLogic")
local MailDefine = require("mail.MailIdDefine")
local MailExcel = require("excel.mail").mail
local MonsterOutExcel = require("excel.monster").monsterOut
local UnionWarExcel = require("excel.unionWar")
local RobotExcel = UnionWarExcel.robot
local DefineConf = UnionWarExcel.define[1]
local LvExcel = UnionWarExcel.lv
local RankExcel = UnionWarExcel.rank
local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
local BillboardDB = require("billboard.BillboardDB")
local BillboardDefine = require("billboard.BillboardDefine")
local Broadcast = require("broadcast.Broadcast")
local Timer = require("core.Timer")
local MiddleConnect = require("middle.MiddleConnect")
local Config = require("Config")

--活动阶段
WDAY = {[1] = 1,[3] = 1,[5] = 1}
--获取公会战阶段
HOUR1 = {5,8}  --确认
HOUR2 = {8,12}  --匹配
HOUR3 = {12,20} --战斗
HOUR4 = {20,24} --结算

STATE0 = 0 --非活动阶段
STATE1 = 1 --确认
STATE2 = 2 --匹配
STATE3 = 3 --战斗
STATE4 = 4 --结算

UNION_STATE1 = 1 --匹配成功
UNION_STATE2 = 2 --确认不成功
UNION_STATE3 = 3 --匹配不成功

UNION_LV = 2 -- 公会等级条件
UNION_HUOYUE = 5 --功会活跃人数条件
HUOYUE_TIME = 86400
UNION_FEIXU_CNT = 5  -- 废墟可挑战次数

local function getLocalUnionWarData(localData,unionUuid)
    localData[unionUuid] = localData[unionUuid]  or {member = {},memberCnt = 0,star = 0,cnt = 0,exp = 0,lv = 0,rank = {}}
    return localData[unionUuid]
end

local function getLocalMemberData(unionWarData,uuid)
    unionWarData.member[uuid] = unionWarData.member[uuid] or {name = "",cnt = 0,shop = {{},{}},chengjiu = {{},{}}}
    return unionWarData.member[uuid]
end 

local function getUnionWarRankRewardID(rank)
    for k, v in ipairs(RankExcel) do
        if v.minRank <= rank and rank <= v.maxRank then
            return k
        end
    end
    return 0
end

local function getUnionWarData(human,memberData)
    if not human.db.unionWarData then
        human.db.unionWarData = {}
        human.db.unionWarData.shop = Util.copyTable(memberData.shop)
        human.db.unionWarData.upShopTime = memberData.upShopTime
        human.db.unionWarData.chengjiu = Util.copyTable(memberData.chengjiu)
        human.db.unionWarData.cnt = memberData.cnt
    end
    local now = os.time()
    if not human.db.unionWarData.upShopTime or human.db.unionWarData.upShopTime < now then
        human.db.unionWarData.upShopTime = Util.getWeekStartTime(now) + 86400 * 7 
        human.db.unionWarData.shop[1] = {}
    end
    return human.db.unionWarData
end

function fontFakeObj(objList)
    local fakeList = {}

    for i = 1, CombatDefine.COMBAT_HERO_CNT do
        local obj = objList[i]
        if obj then
            fakeList[i] = {}
            fakeList[i] = Util.copyTable(obj)
            local fake = fakeList[i]
            fake.beSkillList = nil
            fake.skillList = nil
            fake.beSkillListTemp = nil
            fake.attrs = nil
            fake.attrs2 = {}
            fake.attrs2[RoleDefine.HP] = obj.attrs[RoleDefine.HP]
            fake.attrs2[RoleDefine.DEF] = obj.attrs[RoleDefine.DEF]
            fake.attrs2[RoleDefine.ATK] = obj.attrs[RoleDefine.ATK]
            fake.attrs2[RoleDefine.SPEED] = obj.attrs[RoleDefine.SPEED]
            fake.attrs2[RoleDefine.ATK_RATE] = obj.attrs[RoleDefine.SPEED_RATE]
            fake.attrs2[RoleDefine.DEF_RATE] = obj.attrs[RoleDefine.SPEED_RATE]
            fake.attrs2[RoleDefine.HP_RATE] = obj.attrs[RoleDefine.SPEED_RATE]
            fake.attrs2[RoleDefine.SPEED_RATE] = obj.attrs[RoleDefine.SPEED_RATE]

   --         fake.attrsting = ""
    --        for k,v in pairs(obj.attrs) do
    --            fake.attrsting = fake.attrsting .. "|" .. k.. "," .. v
     --       end
        end
    end
    return fakeList
end

local function getData(data)
    if data.lv < UNION_LV then return end
    local unionData = {member = {}}
    local len = 0
    local huoyueCnt = 0
    local sortList = {}
    local localData = UnionWarDBLogic.getLocalData()
    local unionUuid = data._id    
    local now = os.time()

    local d = os.date("*t",now)
    d.hour = HOUR4[1]
    d.min = 0
    d.sec = 0 
    local boxEndTime = os.time(d) + 24 * 3600 

    local donateTime = Util.getDayStartTime(os.time())
    donateTime = donateTime - HUOYUE_TIME
    localData[unionUuid] = localData[unionUuid]  or {member = {},memberCnt = 0,star = 0,cnt = 0,exp = 0,lv = 0,rank = {}}
    localData[unionUuid].rank = {}
    if localData[unionUuid].box and localData[unionUuid].box.endTime and localData[unionUuid].box.endTime < now then  
        localData[unionUuid].isWin = nil
        localData[unionUuid].isMatch = nil
    end
    for k,v in pairs(data.member) do
        local db = RoleDBLogic.getDb(k)
        if db then
            if db.lastLoginTime and db.lastLoginTime >= donateTime then
                huoyueCnt = huoyueCnt + 1
            end
            local objList, helpList, rolebase,formation, jiban = CombatLogic.getHumanObjList({db = db},CombatDefine.COMBAT_TYPE3)
            if rolebase.zhandouli > 0 then
                len = len + 1
                local battleMonsterOutID = BattleLogic.getCombatMonsterOutID({db = db}, CombatDefine.DEFEND_SIDE)
                if not battleMonsterOutID then
                    battleMonsterOutID = 10001
                end
                unionData.member[k] = {objList = objList,helpList = helpList,formation = formation, jiban = jiban , rolebase = rolebase,name = db.name ,attackStar = 0,defendStar = 3,defendCnt = 0,attackCnt = 0, jifen = 0,log = {},battleMonsterOutID = battleMonsterOutID} --
                sortList[len] = {k,rolebase.zhandouli}
                localData[unionUuid].member[k] = localData[unionUuid].member[k] or {name = db.name,cnt = 0,shop = {{},{}},chengjiu = {{},{}}}
                localData[unionUuid].member[k].join = 1
                localData[unionUuid].member[k].post = v.post
                localData[unionUuid].member[k].rolebase = rolebase 
                localData[unionUuid].member[k].boxTime = boxEndTime
            end
        end
    end

    if len == 0 or huoyueCnt < UNION_HUOYUE then
        return
    end

    for k, v in pairs(localData[unionUuid].member) do
        if not data.member[k] then
            localData[unionUuid].member[k] = nil
        end
    end

    table.sort(sortList,function(a,b)
        return a[2] > b[2]
    end)

    for k,v in ipairs(sortList) do
        unionData.member[v[1]].index = k
        localData[unionUuid].rank[k] = {v[1],0,0}
    end

    unionData.memberCnt = len
    unionData.unionUuid = data._id
    unionData.name = data.name
    unionData.bannerID = data.bannerID
    unionData.lv = data.lv
    unionData.zhandouli = data.zhandouli
    unionData.svrName = Config.SVR_NAME
    unionData.svrIndex = Config.SVR_INDEX
    unionData.rank = BillboardDB.getRank(BillboardDefine.TYPE_UNION,data._id) or 0

    localData[unionUuid].memberCnt = len
    localData[unionUuid].star = 0
    return unionData
end

--重置公会战数据（资格确认）
fileds = {unionUuid = 1,name = 1,bannerID = 1,lv = 1,zhandouli = 1,member = 1}
local  ToMidUnionList = nil
function refreshData()
    print("   refreshData  refreshData  refreshData")
    ToMidUnionList = {}
    LuaMongo.find(DB.db_union,nil,fileds)
    local msgRet = InnerMsg.lw.LW_UNION_WAR_ADD
    msgRet.list = {}
    local len = 0
    local unionList = {}
    local unionUuid
    while true do 
        local data = {}
        if not LuaMongo.next(data) then
            break
        end
        unionList[#unionList + 1] = data
    end
    for k,data in ipairs(unionList) do
        local unionData = getData(data)
        if unionData then
            unionUuid = unionData.unionUuid
            local toLen = #ToMidUnionList + 1
            ToMidUnionList[toLen] = {}
            ToMidUnionList[toLen].member = {}
            ToMidUnionList[toLen].unionUuid = unionUuid
            ToMidUnionList[toLen].member = Util.copyTable(unionData.member)
            unionData.member = {}
            len = len + 1
            msgRet.list[len] = unionData
        end
        if len >= 5 then
            InnerMsg.sendMsg(0, msgRet)
            Util.cleanTable(msgRet.list)            
            len = 0
        end
    end

    if len >= 1 then
        InnerMsg.sendMsg(0, msgRet)
    end    
    UnionWarDBLogic.updateDB()
    print("  Timer.addLater(1, sendUnionToMid)   Timer.addLater(1, sendUnionToMid)")
    Timer.addLater(1, sendUnionToMid)
end

local function getSurCnt(member) 
    local len = 0
    if not member then return len end
    for _ in pairs(member) do
        len = len + 1
    end
    return len 
end

function sendUnionToMid()
    print("  sendUnionToMid , sendUnionToMid   ,  sendUnionToMid")
    if ToMidUnionList and #ToMidUnionList > 0 then
        print("  sendUnionToMid  sendUnionToMid  sendUnionToMid", #ToMidUnionList)
        local data = ToMidUnionList[#ToMidUnionList]
        if data and data.unionUuid then
            local msgRet = InnerMsg.lw.LW_UNION_WAR_MEMBER
            msgRet.unionUuid = data.unionUuid
            msgRet.list = {}
            Util.cleanTable(msgRet.list)    
            local len = 0
            local sendUuid = {}
            if #ToMidUnionList == 1 and getSurCnt(data.member) <= 10 then
                data.isEnd = 1
            end
            local isSend = false
            msgRet.isEnd = data.isEnd or 0
            for k,v in pairs(data.member) do
                len = len + 1
                msgRet.list[len] = {k,v}
                sendUuid[k] = 1
                if len >= 10 then
                   -- Util.printTable(msgRet)
                    InnerMsg.sendMsg(0, msgRet)
                    Util.cleanTable(msgRet.list)                   
                    isSend = true
                    break
                end
            end

            if not isSend then
          --      Util.printTable(msgRet)
                InnerMsg.sendMsg(0, msgRet)
                Util.cleanTable(msgRet.list)       
            end

            local surLen = 0
            for uuid in pairs(data.member) do
                if sendUuid[uuid] then
                    data.member[uuid] = nil
                else
                    surLen = surLen + 1 
                end               
            end
            print("  surLen  surLen  ", surLen)
            if surLen == 0 then
                ToMidUnionList[#ToMidUnionList] = nil
                print("  del   ToMidUnionList  !", #ToMidUnionList)
            end

            if #ToMidUnionList > 0 then
                Timer.addLater(1, sendUnionToMid)
            else
                ToMidUnionList = nil
            end           
        end
    end
end


-- 匹配完成  各个单服 将匹配上的 公会标记  用于红点
function middleUnionMatchFinish(msg)
    local localData = UnionWarDBLogic.getLocalData()
    for unionUuid in pairs(msg.list) do
        if localData[unionUuid] then
            localData[unionUuid].isMatch = true
            localData[unionUuid].matchTime = os.time()
        end
    end
end

function getState()
    local now = os.time()
    local d = os.date("*t",now)
    local wday = d.wday
    local h = d.hour
    -- 周一 周三 周五   公会战
    if WDAY[wday - 1] then
        if h >= HOUR1[1] and h < HOUR1[2] then
            return STATE1
        elseif h >= HOUR2[1] and h < HOUR2[2] then 
            return STATE2
        elseif h >= HOUR3[1] and h < HOUR3[2] then 
            return STATE3
        elseif h >= HOUR4[1] and h < HOUR4[2] then 
            return STATE4
        end
    end

    return STATE0
end

function getEndTime(actState)
    local now = os.time()
    local d = os.date("*t",now)
    if actState == STATE0 then       
        local wday = d.wday
        if wday < 6 then
            d.hour = HOUR2[2]
            local checkTime = os.time(d)
            return checkTime + 24 * 60 * 60 - now
        elseif wday == 6 then
            if actState < STATE3 then
                d.hour = HOUR2[2]
            else
                d.hour = HOUR3[2]
            end      
            d.min = 0
            d.sec = 0
            local checkTime = os.time(d)
            return checkTime - now
        else
            local Monday = Util.getWeekStartTime()
            return Monday + 24 * 60 * 60 * 7 + HOUR2[2] * 3600 - now
        end
    else
        if actState < STATE3 then
            d.hour = HOUR2[2]
        else
            d.hour = HOUR3[2]
        end      
        d.min = 0
        d.sec = 0
        local checkTime = os.time(d)
        return checkTime - now
    end
end

function getWarTime(human)
    local msgRet = Msg.gc.GC_UNION_WAR_TIME
    if MiddleConnect.IS_MIDDLE_CONNECT then
        local actState = getState()
        msgRet.actState = actState
        msgRet.time = getEndTime(actState)
        Msg.send(msgRet,human.fd)
    else
        msgRet.actState = 0
        msgRet.time = 0
        Msg.send(msgRet,human.fd)
    end
    
end

local function getChengjiuExcel(type)
    if type == 1 then
        return UnionWarExcel.chengjiu1
    else
        return UnionWarExcel.chengjiu2
    end
end

local function isDotChengjiu(human,localData,unionWarData,memberData,type)
    local ChengjiuExcel = getChengjiuExcel(type)
    if not memberData then
        --未参与公会战
        return
    end
    local getList,cnt
    local humanData = getUnionWarData(human,memberData)
    if type == 1 then
        cnt = humanData.cnt
        getList = humanData.chengjiu[1]
    else
        cnt = unionWarData.cnt
        getList = humanData.chengjiu[2]
    end
    for k, v in ipairs(ChengjiuExcel) do
        if not getList[k] and v.cnt <= cnt then
            return true
        end
    end
end

local function sendState(human,actState,unionState)
    local msgRet = Msg.gc.GC_UNION_WAR_STATE
    msgRet.actState = actState
    msgRet.unionState = unionState 
    msgRet.winState = 0
    msgRet.cjDot = 0
    msgRet.zgDot = 0
    msgRet.shopDot = 0
    msgRet.fightDot = 0
    msgRet.pipeiDot = 0
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData =  getLocalUnionWarData(localData,human.db.unionUuid)
    local memberData = getLocalMemberData(unionWarData,human.db._id)

    if unionWarData and memberData and isDotChengjiu(human,localData,unionWarData,memberData,1) or isDotChengjiu(human,localData,unionWarData,memberData,2) then
        msgRet.cjDot = 1
    end

    if unionWarData and isDotByBox(human, unionWarData) then
        msgRet.zgDot = 1
    end

    if unionWarData and isDotByShop(human, unionWarData) then
        msgRet.shopDot = 1
    end

    if unionWarData and isDotByCnt(human, unionWarData) then
        msgRet.fightDot = 1
    end

    if unionWarData and isDotByPiPei(human, unionWarData) then
        msgRet.pipeiDot = 1
    end

    if actState == STATE4 and unionState == UNION_STATE1 then        
        msgRet.winState = unionWarData.isWin and unionWarData.isWin or 0
    end
    Msg.send(msgRet,human.fd)
end

--请求：查询状态
--返回：状态，攻守双方成员
local function fontUnionWarTeam(net,data)
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = getLocalUnionWarData(localData,data.unionUuid)
    local rankData = unionWarData.rank
    local temp = {}
    for i = 1,3 do
        if rankData[i] then
            temp[rankData[i][1]] = i
        else
            break
        end
    end

    net.unionUuid = data.unionUuid
    net.name = data.name
    net.svrName = data.svrName or ""
    net.bannerID = data.bannerID
    net.star = data.star
    local len = 0
    for k,v in pairs(data.member) do
        len = len + 1
        net.list[len].index = v.index
        net.list[len].uuid = v.uuid
        net.list[len].name = v.name
        net.list[len].star = v.star
        net.list[len].zhandouli = v.zhandouli
        net.list[len].rank = temp[v.uuid] or 0
        local pos = RobotExcel[v.index].pos
        net.list[len].x = pos[1]
        net.list[len].y = pos[2]
    end
    net.list[0] = len
end

local function fontSimpleRank(net,unionUuid)
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = getLocalUnionWarData(localData,unionUuid)
    local memberList = unionWarData.member
    local len = 0
    local fields = {name = 1}
    local db
    for k,v in ipairs(unionWarData.rank) do
        len = len + 1
        net[len].rank = k
        db = RoleDBLogic.getDb(v[1], fields)
        net[len].name =  db and db.name or memberList[v[1]].name

        if len >= 3 then
            break
        end
    end
    net[0] = len
end

function onLogin(human)

end

function query(human,msg, actState)
    local msgRet = Msg.gc.GC_UNION_WAR_QUERY
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
    
    fontUnionWarTeam(msgRet.attacker,msg.attacker)
    fontUnionWarTeam(msgRet.defender,msg.defender)
    fontSimpleRank(msgRet.threeRank,msg.attacker.unionUuid)

    local now = os.time()
    local d = os.date("*t",now)
    d.hour = HOUR3[2]
    --[[
if actState == STATE2 then
        d.hour = HOUR2[2]
    else
        d.hour = HOUR3[2]
    end
    ]]
    
    d.min = 0
    d.sec = 0
    local checkTime = os.time(d)
    msgRet.leftTime = checkTime - now
    msgRet.cnt = msg.cnt
    msgRet.maxCnt = DefineConf.cnt
 --   Msg.trace(msgRet)
    Msg.send(msgRet,human.fd)
end

function CGQuery(human)
    
end

function WLQuery(human,msg)
    local actState = getState()
    sendState(human,actState,msg.state)
    if msg.state == UNION_STATE1 then
        query(human,msg, actState)
    end
end

-- 客户端 最多请求三次
-- 用于给 客户端  给予 停留在公会战界面  倒计时结束 公会战结果 查询更新
function CGEndQuery(human)
    local msgRet = Msg.gc.GC_UNION_WAR_END_STATE_QUERY
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData =  getLocalUnionWarData(localData,human.db.unionUuid)
    msgRet.winState = unionWarData.isWin and unionWarData.isWin or 0
    Msg.send(msgRet,human.fd)
end

local function fontBufferNet(msgRet, lv)   
    msgRet.maxBuff = #UnionWarExcel.buff
    local config = UnionWarExcel.buff[lv]

    msgRet.nowAttr[0] = 0
    msgRet.nextAttr[0] = 0

    if config then
        for k, v in ipairs(config.attr) do
            local net = msgRet.nowAttr[k]
            net.key = v[1]
            net.value = v[2]
        end
        msgRet.nowAttr[0] = #config.attr   
    end
    
    
    if lv + 1 <= msgRet.maxBuff then
        local nextConfig = UnionWarExcel.buff[lv + 1]
        for k, v in ipairs(nextConfig.attr) do
            local net = msgRet.nextAttr[k]
            net.key = v[1]
            net.value = v[2]
        end
        msgRet.nextAttr[0] = #nextConfig.attr  
    end
    
end

-- BUF 请求
function CGBuffQuery(human)
    local msgRet = Msg.gc.GC_UNION_WAR_BUFF
    msgRet.buffLv = 0
    fontBufferNet(msgRet, 0)
    if human then
        Msg.send(msgRet,human.fd)
    end

    local actState = getState()
    if actState > STATE1 then
        local msgRet =  InnerMsg.lw.LW_UNION_WAR_BUFF_QUERY
        msgRet.uuid = human.db._id
        msgRet.unionUuid = human.db.unionUuid

        InnerMsg.sendMsg(0, msgRet)
    end
end

function WLBuffQuery(human, msg)
    local msgRet = Msg.gc.GC_UNION_WAR_BUFF
    msgRet.buffLv = msg.buffLv
    fontBufferNet(msgRet, msg.buffLv)
    if human and human.fd then
        Msg.send(msgRet,human.fd)
    else
        local localData = UnionWarDBLogic.getLocalData()
        local unionWarData = getLocalUnionWarData(localData, msg.unionUuid)
        if not unionWarData  or not unionWarData.member then return end 
        for uuid,_ in pairs(unionWarData.member) do
            local human = ObjHuman.onlineUuid[uuid]
            if human and human.fd then
                Msg.send(msgRet,human.fd)
            end           
        end
    end
end

--请求：公会成员信息
--返回：公会成员信息
function CGInfo(human,unionUuid,targetUuid)
    local msgRet =  InnerMsg.lw.LW_UNION_WAR_INFO
    msgRet.uuid = human.db._id
    msgRet.attackUnionUuid = human.db.unionUuid
    msgRet.unionUuid = unionUuid
    msgRet.targetUuid = targetUuid
    InnerMsg.sendMsg(0, msgRet)
end

-- 封装 英雄
local function fontHeroList(net,data)
    local len = 0
    local monsterOutID = data.monsterOutID
    if monsterOutID then
        for k,v in ipairs(MonsterOutExcel[monsterOutID].member) do
            if v[1] > 0 then
                len = len + 1
                HeroGrid.makeHeroSimpleByMonsterID(net[len],v[1],{lv = v[2]})
            end
        end
    else
        for i = 1,CombatDefine.COMBAT_HERO_CNT do
            local obj = data.objList[i]
            if obj then
                len = len + 1
                HeroGrid.makeHeroSimpleByID(net[len],obj.id, obj.bagIndex,{lv = obj.lv,star = obj.star})
            end
        end
    end
    net[0] = len
end

function getDiff(robotConf,diff,monsterOutID, isFeixu)
    if isFeixu then
        diff = 3
        return robotConf.rate[diff],0,robotConf.jifen2
    else
        return robotConf.rate[diff],robotConf.star[diff],robotConf.jifen1[diff]
    end
   
end
-- 玩家信息
function WLInfo(human,msg)
    local msgRet = Msg.gc.GC_UNION_WAR_INFO
    local target = msg.target

    msgRet.cnt = msg.cnt
    msgRet.maxCnt = DefineConf.cnt
    msgRet.unionUuid = msg.unionUuid
    msgRet.uuid = target.uuid
    msgRet.index = msg.index
    msgRet.star = target.defendStar
    msgRet.zhandouli = target.zhandouli
    msgRet.defendCnt = target.defendCnt
    msgRet.canFight = msg.canFight
    msgRet.feixuCnt = target.loseBuff
    local len = 0

    local monsterOutID = target.monsterOutID
    if monsterOutID then
        msgRet.isRobot = 1
    else
        msgRet.isRobot = 0
    end
    local robotConf = RobotExcel[target.index]
    local diffList = robotConf.diff
    local isFeixu = target.defendStar <= 0
    if isFeixu then
        diffList = {3}
    end
    for k,v in ipairs(diffList) do
        len = len + 1
        local net = msgRet.diffList[len]
        net.diff = v
        net.rate,net.star,net.jifen = getDiff(robotConf,k,monsterOutID)
        local len1 = 0
        for k1,v1 in ipairs(robotConf.item[v]) do
            len1 = len1 + 1
            Grid.makeItem(net.item[len1], v1[1], v1[2])
        end
        net.item[0] = len1

    end
    msgRet.diffList[0] = len
  --  Util.printTable(target)
    fontHeroList(msgRet.list,target)
    Msg.send(msgRet,human.fd)
end

--请求：匹配列表
--返回：匹配列表

function CGMatch(human)
    local msgRet =  InnerMsg.lw.LW_UNION_WAR_MATCH
    msgRet.uuid = human.db._id
    msgRet.unionUuid = human.db.unionUuid
    InnerMsg.sendMsg(0, msgRet)
end

function WLMatch(human,msg)
    local msgRet = Msg.gc.GC_UNION_WAR_MATCH
    local len = 0
    for k,v in ipairs(msg.list) do
        len = len + 1
        local net = msgRet.list[len]
        net.nameLeft = v[1][1]
        net.rankLeft = v[1][3] or 0
        net.nameRight = v[2][1]
        net.rankRight = v[2][3] or 0
        net.svrNameLeft = v[3][3] 
        net.svrNameRight = v[3][4]
        if len >= 60 then
            break
        end  
    end
    msgRet.list[0] = len
    Msg.send(msgRet,human.fd)

    if human.db.unionUuid then
        local localData = UnionWarDBLogic.getLocalData()
        local unionWarData =  getLocalUnionWarData(localData,human.db.unionUuid)
        if unionWarData then 
            local memberData = getLocalMemberData(unionWarData,human.db._id)
            local humanData = getUnionWarData(human,memberData)
        
            local actState = getState()
        
            if actState >= STATE2 and not Util.isSameDay(humanData.pipeiLook) then
                humanData.pipeiLook = os.time()
                RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006)
            end        
        end
    end
end

--请求：日志
--返回：日志
function CGAtkLog(human, type)
    local msgRet =  InnerMsg.lw.LW_UNION_WAR_ATKLOG
    msgRet.uuid = human.db._id
    msgRet.type = type
    msgRet.unionUuid = human.db.unionUuid
    InnerMsg.sendMsg(0, msgRet)  
end

function WLAtkLog(human, msg)
    local msgRet = Msg.gc.GC_UNION_WAR_ATKLOG
    msgRet.type = msg.type
    local len = 0
    for k,v in ipairs(msg.list) do
        len = len + 1
        local net = msgRet.list[len]
        net.upTime = v[1]
        net.ret = v[2] and 1 or 0
        net.name = v[3]
        net.defName = v[4]
        net.star = v[5]
        net.jifen = v[6]
        net.unionUuid = v[7]
        net.atkUnionStar = v[8] or 0
        net.buffLv = v[9] and v[9] or 0
    end
    msgRet.list[0] = len
 --   Msg.trace(msgRet)
    Msg.send(msgRet,human.fd)
end

--请求 防守日志
--返回 防守日志
function CGDefLog(human,uuid, unionUuid)
    local msgRet = InnerMsg.lw.LW_UNION_WAR_DEFLOG
    msgRet.uuid = human.db._id
    msgRet.unionUuid = human.db.unionUuid
    msgRet.defendUuid = uuid
    msgRet.defendUnion = unionUuid
    InnerMsg.sendMsg(0, msgRet)
end

function WLDefLog(human,msg)
    local msgRet = Msg.gc.GC_UNION_WAR_DEFLOG
    msgRet.zhandouli = msg.defender.zhandouli
    fontHeroList(msgRet.heroList,msg.defender)
    local len = 0
    for k,v in ipairs(msg.list) do
        len = len + 1
        local net = msgRet.logList[len]
        net.id = 0
        net.name = v.name
        net.zhandouli = v.zhandouli
        net.diff = v.diff
        net.result = v.result
        net.time = v.upTime
        local formationConfig = CombatPosLogic.getFormationConfig(v.formation)
        net.formation = formationConfig.name
        net.videoIndex = v.videoIndex
        fontHeroList(net.list,v.target)
    end
    msgRet.logList[0] = len
    --Msg.trace(msgRet)
    Msg.send(msgRet,human.fd)
end

function CGVideo(human, videoIndex)
    local msgRet = InnerMsg.lw.LW_UNION_WAR_VIDEO
    msgRet.uuid = human.db._id
    msgRet.unionUuid = human.db.unionUuid
    msgRet.index = videoIndex
    InnerMsg.sendMsg(0, msgRet)   
end

function WLVideo(human,msg)
    CombatLogic.repeatCombat(human, msg.combatInfo)
end

--请求：挑战
--返回：挑战失败原因或者战斗帧
function fight(human,args)
    local actState = getState()
    if actState ~= STATE3 then
        return Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_END)
    end
    local msgRet =  InnerMsg.lw.LW_UNION_WAR_FIGHT
    msgRet.unionUuid = human.db.unionUuid
    msgRet.attackUuid = human.db._id
    msgRet.defendUuid = args[1]
    msgRet.diff = args[2]
    InnerMsg.sendMsg(0, msgRet)
    print("================fight",   msgRet.diff)
end

function sendfightErr(human, msg)
    if msg.state == UnionWarMiddleLogic.FIGHT2 then
        Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_TILI)
    elseif msg.state == UnionWarMiddleLogic.FIGHT3 then  
        Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_ING)
    elseif msg.state == UnionWarMiddleLogic.FIGHT4 then  
        Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_BEING)
    elseif msg.state == UnionWarMiddleLogic.FIGHT5 then  
        Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_STAR)
    elseif msg.state == UnionWarMiddleLogic.FIGHT6 then  
        Broadcast.sendErr(human, Lang.UNION_WAR_FIGHT_ERR_ZIGE)
    end
end

function WLFight(human,msg)
    print("================wlfight",msg.state,UnionWarMiddleLogic.FIGHT1)
    if msg.state ~= UnionWarMiddleLogic.FIGHT1 then
        sendfightErr(human, msg)      
        return 
    end
    human.unionWar = {}
    human.unionWar.target = Util.copyTable(msg.defender)
    human.unionWar.diff = msg.diff
    human.unionWar.name = msg.name
    CombatLogic.combatBegin(human,1001, {}, CombatDefine.COMBAT_TYPE12)
end

function getCombatObjList(human, side)
    if side == CombatDefine.ATTACK_SIDE then
        return CombatLogic.getHumanObjList(human,CombatDefine.COMBAT_TYPE1)
    else
        local target = human.unionWar.target
        local diff = human.unionWar.diff
        local rate = RobotExcel[target.index].rate[diff]
        for k,v in pairs(target.objList) do
            v.attrs[RoleDefine.ATK] = v.attrs[RoleDefine.ATK] * rate/10000
            v.attrs[RoleDefine.DEF] = v.attrs[RoleDefine.DEF] * rate/10000
            v.attrs[RoleDefine.HP] = v.attrs[RoleDefine.HP] * rate/10000
        end
        return target.objList, target.helpList, target.rolebase,target.formation, target.jiban
    end
end

--挑战结束回调
function onFightEnd(human,ret, combatType, cbParam, combatInfo)
    local msgRet = InnerMsg.lw.LW_UNION_WAR_FIGHT_END
    msgRet.upTime = os.time()
    msgRet.uuid = human.db._id
    msgRet.unionUuid = human.db.unionUuid
    msgRet.combatInfo = combatInfo
    InnerMsg.sendMsg(0, msgRet)
    combatInfo.endStatus = CombatLogic.COMBAT_END_STATUS1
    human.unionWar =  human.unionWar or {}
    human.unionWar.combatInfo = combatInfo
end

function WLFightEnd(human,msg)
    local msgRet = Msg.gc.GC_UNION_WAR_FIGHT_END
    msgRet.diff = msg.diff
    msgRet.unionStar = msg.unionStar
    msgRet.defendStar = msg.defender.defendStar
    msgRet.defendUuid = msg.defender.uuid or ""
    msgRet.defIndex = msg.defender.index
    msgRet.cnt = msg.cnt

    local combatInfo = msg.combatInfo
    local target = msg.defender
    local diff = msg.diff
    local isFeixu = msg.isFeixu == 1 and true or false
    local robotConf = RobotExcel[target.index]
    local rate,star,jifen = getDiff(robotConf, diff,target.monsterOutID, isFeixu)
    combatInfo.endParam = rate.."|"..star.."|"..msg.defUnionName 
    combatInfo.rewardItem = robotConf.item[diff]
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = localData[human.db.unionUuid]
    local rankData = unionWarData.rank
    local addStar = msg.addStar
    local memberData = unionWarData.member[human.db._id]
    if combatInfo.isWin then        
        if memberData then
            memberData.cnt = memberData.cnt + 1
            local chengjiuData = getUnionWarData(human,memberData)
            chengjiuData.cnt = chengjiuData.cnt + 1     
        end
    else
        combatInfo.rewardItem = robotConf.item2[diff]
        jifen = 1
        addStar = 0
    end

    if memberData then
        local humanData = getUnionWarData(human,memberData)
        humanData.fightCnt = humanData.fightCnt or 0
        humanData.fightCnt = msg.cnt
        humanData.fightTime = os.time()
    end
   
    
    -- 玩家增加 公会战积分 星级
    for k,v in ipairs(rankData) do
        if v[1] == human.db._id then
            v[2] = v[2] + jifen
            v[3] = v[3] + addStar
            break
        end
    end

    table.sort(rankData,function(a,b)
        return a[2] > b[2]
    end)
    UnionWarDBLogic.updateDB()

    fontSimpleRank(msgRet.threeRank, human.db.unionUuid)
    Msg.send(msgRet,human.fd)
    
    for k,v in ipairs(combatInfo.rewardItem) do
        BagLogic.addItem(human, v[1], v[2], "unionWar")
    end

    CombatLogic.sendCombatFinish(human,combatInfo)
    human.unionWar = nil

    RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006)
end

-- 通知参与公会战的在线玩家场景更新 星级 同步
function WLFightTongzhi(msg)
    local msgRet = Msg.gc.GC_UNION_WAR_SCENE_INFO
    msgRet.unionUuid = msg.atkUnion
    msgRet.unionStar = msg.atkUnionStar
    msgRet.defendUuid = msg.defUuid
    msgRet.defendStar = msg.defStar
    msgRet.defIndex = msg.defIndex
    msgRet.targetUnion = msg.defUnion
    local ToUuid = msg.unionUuid
    fontSimpleRank(msgRet.threeRank, ToUuid)  
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = getLocalUnionWarData(localData, ToUuid)
    for uuid,_ in pairs(unionWarData.member) do
        if uuid ~= msg.atkUuid then
            local human = ObjHuman.onlineUuid[uuid]
            if human then
                Msg.send(msgRet,human.fd)
            end
        end
    end
end

--请求：开箱子
--返回：开箱子
function CGBox(human)
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData =  getLocalUnionWarData(localData,human.db.unionUuid)
    local boxData = unionWarData.box
    local msgRet = Msg.gc.GC_UNION_WAR_BOX
    msgRet.leftTime = 0
    msgRet.isWin = 1
    local len = 0
    local now = os.time()
    if boxData and now < boxData.endTime then
        msgRet.leftTime = boxData.endTime - now
        msgRet.isWin = unionWarData.isWin
        for k,v in ipairs(boxData.list) do
            len = len + 1
            local net = msgRet.list[len]
            if v[3] then
                net.isOpen = 1
                net.name = unionWarData.member[v[3]].name
                Grid.makeItem(net.item[1],v[1],v[2])
                net.item[0] = 1

                if net.name == "" then
                    local fake = {}
                    RoleLogic.getRoleBaseByUuid(v[3], fake)
                    net.name = fake and fake.name or ""
                end
            else
                net.isOpen = 2
                net.name = ""
                net.item[0] = 0
            end
        end
    end
    msgRet.list[0] = len
 --   Msg.trace(msgRet)
    Msg.send(msgRet,human.fd)
end

-- 战果宝箱领取
function CGBoxGet(human,ind)
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData =  getLocalUnionWarData(localData,human.db.unionUuid)
    local boxData = unionWarData.box
    if not boxData then
        return
    end
    if not unionWarData.member[human.db._id] then
        return
    end

    local now = os.time()
    if now > boxData.endTime then
        Broadcast.sendErr(human, Lang.UNION_WAR_BOX_TIME_ERR) 
        return 
    end

    if not unionWarData.member[human.db._id].boxTime then
        Broadcast.sendErr(human, Lang.UNION_WAR_BOX_TIME_ERR_2)  
        return 
    end

    if unionWarData.member[human.db._id].boxTime < boxData.endTime then
        Broadcast.sendErr(human, Lang.UNION_WAR_BOX_TIME_ERR_2)  
        return 
    end

    if not boxData.list[ind] then
        return
    end

    if boxData.list[ind][3] then
        Broadcast.sendErr(human, Lang.UNION_WAR_BOX_NOT_ERR) 
        return
    end

    for k,v in ipairs(boxData.list) do
        if v[3] == human.db._id then
            Broadcast.sendErr(human, Lang.UNION_WAR_BOX_GET_ERR)
            return
        end
    end

    boxData.list[ind][3] = human.db._id
    local itemID = boxData.list[ind][1]
    local itemCnt = boxData.list[ind][2]

    BagLogic.cleanMomentItemList()
    BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, itemID, itemCnt)
    BagLogic.addMomentItemList(human, "unionWar")
    local msgRet = Msg.gc.GC_UNION_WAR_BOX_GET
    msgRet.ind = ind
    local net = msgRet.box
    net.isOpen = 1
    net.name = unionWarData.member[human.db._id].name
    Grid.makeItem(net.item[1],itemID, itemCnt)
    net.item[0] = 1 
    Msg.send(msgRet,human.fd)

    RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006)
    updateRed(human)
end

-- 公会战结束
function actFinish(msg)
    local localData = UnionWarDBLogic.getLocalData()
    local now = os.time()
    local d = os.date("*t",now)
    d.hour = HOUR4[1]
    d.min = 0
    d.sec = 0
    local endTime = os.time(d) + 24 * 3600
    local boxItem
    local perExp = DefineConf.perExp
    local randMax
    for k,v in ipairs(msg.list) do
        if v[4] == Config.SVR_INDEX then
            local unionWarData = localData[v[1]]
            if unionWarData then
                if v[3] == 1 then
                   boxItem = DefineConf.boxItem
                else
                    boxItem = DefineConf.boxItem2
                end
                randMax = #boxItem
                unionWarData.isWin = v[3]
                unionWarData.star = v[2]
                Util.initTable(unionWarData.box)
                unionWarData.box = {endTime = endTime,list = {}}
                for i = 1,unionWarData.memberCnt do
                    local r = math.random(1,randMax)
                    unionWarData.box.list[i] = {boxItem[r][1],boxItem[r][2]}
                end

                if v[3] == 1 then
                    unionWarData.exp = unionWarData.exp + unionWarData.memberCnt * perExp
                    unionWarData.cnt = unionWarData.cnt + 1        
                    unionWarData.lv = LvExcel[#LvExcel].lv   
                    for k,v in ipairs(LvExcel) do
                        if unionWarData.exp < v.exp then
                            unionWarData.lv = v.lv - 1
                            break
                        end
                    end
                end
            end
        end
    end
    UnionWarDBLogic.updateDB()

    local localData = UnionWarDBLogic.getLocalData()
    local title = MailExcel[MailDefine.MAIL_ID_UNION_WAR].title
    local content = MailExcel[MailDefine.MAIL_ID_UNION_WAR].content
    local senderName = MailExcel[MailDefine.MAIL_ID_UNION_WAR].senderName

    for unionUuid,unionWarData in pairs(localData) do
        for k,v in ipairs(unionWarData.rank) do
            if v[2] == 0 then
                break
            end
            local rankID = getUnionWarRankRewardID(k)
            local conf = RankExcel[rankID]
            if not conf then
                break
            end
            MailManager.add(MailManager.SYSTEM, v[1], title, Util.format(content, k, v[2]) , conf.item, senderName)  
        end
    end
end

--0 不可领取 1 可以领取 2 已经领取
CHENGJIU_STATE0 = 0
CHENGJIU_STATE1 = 1
CHENGJIU_STATE2 = 2
function CGChengjiu(human,type)
    local ChengjiuExcel = getChengjiuExcel(type)
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
    local memberData = getLocalMemberData(unionWarData,human.db._id)
    local humanData = getUnionWarData(human,memberData)
    local getList,cnt
    if type == 1 then
        cnt = humanData.cnt
        getList = humanData.chengjiu[1]
    else
        cnt = unionWarData.cnt
        getList = humanData.chengjiu[2]
    end
    local msgRet = Msg.gc.GC_UNION_WAR_CHENGJIU
    msgRet.type = type
    local len = 0
    for k, v in ipairs(ChengjiuExcel) do
        len = len + 1
        local net = msgRet.list[len]
        net.id = k
        net.title = v.title or ""
        net.maxCnt = v.cnt
        net.cnt = cnt
        if getList[k] then
            net.state = CHENGJIU_STATE2
        elseif v.cnt <= cnt then
            net.state = CHENGJIU_STATE1
        else
            net.state = CHENGJIU_STATE0
        end
        local len1 = 0
        for k1,v1 in ipairs(v.item) do
            len1 = len1 + 1
            Grid.makeItem(net.item[len1],v1[1],v1[2])
        end
        net.item[0] = len1
    end
    msgRet.list[0] = len

    Msg.send(msgRet,human.fd)
end

function chegnjiuFinishGm(human, type)
    local ChengjiuExcel = getChengjiuExcel(type)
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = localData[human.db.unionUuid]
    local memberData = getLocalMemberData(unionWarData,human.db._id)
    if not memberData then
        --未参与公会战
        return
    end
    local humanData = getUnionWarData(human,memberData)
    if type == 1 then
        humanData.cnt =  humanData.cnt or 0 
        humanData.cnt =  humanData.cnt + 10
    else
        unionWarData.cnt = unionWarData.cnt + 10
    end
    UnionWarDBLogic.updateDB()
end

function CGChengjiuGet(human,type,id)
    local ChengjiuExcel = getChengjiuExcel(type)
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
    local memberData = getLocalMemberData(unionWarData,human.db._id)
    if not memberData then
        --未参与公会战
        return
    end
    local humanData = getUnionWarData(human,memberData)
    local getList,cnt
    if type == 1 then
        cnt = humanData.cnt
        getList = humanData.chengjiu[1]
    else
        cnt = unionWarData.cnt
        getList = humanData.chengjiu[2]
    end
    if getList[id] then
        --已经领取
        return
    end
    local conf = ChengjiuExcel[id]
    if cnt < conf.cnt then
        --未达成成就
        return
    end

    getList[id] = 1

 --   Util.printTable(conf.item)
    BagLogic.addItemList(human, conf.item, "unionWar")

    local msgRet = Msg.gc.GC_UNION_WAR_CHENGJIU_GET
    msgRet.type = type
    msgRet.id = id
    Msg.send(msgRet,human.fd)

    RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006)
    updateRed(human)
end


local function getShopExcel(type)
    if type == 1 then
        return UnionWarExcel.shop1
    else
        return UnionWarExcel.shop2
    end
end

function upWarShopLv(human, lv)
    local localData = UnionWarDBLogic.getLocalData() 
    local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
    if not unionWarData then return end 
    unionWarData.lv = lv
  
end

function CGShop(human,type)
    local ShopExcel = getShopExcel(type)
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
    local memberData = getLocalMemberData(unionWarData,human.db._id)
    local humanData = getUnionWarData(human,memberData)
    local buyList
    if type == 1 then
        buyList = humanData.shop[1]
    else
        buyList = humanData.shop[2]
    end


    local msgRet = Msg.gc.GC_UNION_WAR_SHOP_QUERY
    msgRet.type = type
    local lv = unionWarData.lv
    msgRet.shopLv = lv
    msgRet.exp = unionWarData.exp
    local nextShopConf = LvExcel[unionWarData.lv + 1]
    msgRet.maxExp = nextShopConf and nextShopConf.exp or 0
    local len = 0
    for k,v in pairs(ShopExcel) do
        if v.lv <= lv + 1 then
            len = len + 1
            local net = msgRet.list[len]
            net.id = k
            net.cnt = buyList[k] or 0
            net.maxCnt = v.limit
            net.needLv = v.lv
            Grid.makeItem(net.item,v.item[1],v.item[2])
            net.cost = v.cost
            net.discount = v.discount
        end
        
    end
    msgRet.list[0] = len
    Msg.send(msgRet,human.fd)
end

function CGBuy(human,type,id,buyCnt)
    local ShopExcel = getShopExcel(type)
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
    local memberData = getLocalMemberData(unionWarData,human.db._id)
    local humanData = getUnionWarData(human,memberData)
    local buyList
    if type == 1 then
        buyList = humanData.shop[1]
    else
        buyList = humanData.shop[2]
    end

    local conf = ShopExcel[id]

    if conf.lv > unionWarData.lv then
        --等级不够
        return
    end

    buyCnt = buyCnt or 1
    local cnt = buyList[id] or 0

    if conf.limit > 0 and cnt + buyCnt > conf.limit then
        --达到限购次数
        return
    end

    if not ObjHuman.checkRMB(human, conf.cost * buyCnt) then
        return
    end
    cnt = cnt + buyCnt
    buyList[id] = cnt
    ObjHuman.decZuanshi(human, -conf.cost * buyCnt, "unionWar")
    BagLogic.cleanMomentItemList()
    BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, conf.item[1],conf.item[2] * buyCnt)
    BagLogic.addMomentItemList(human,  "unionWar")

    local msgRet = Msg.gc.GC_UNION_WAR_SHOP_BUY
    msgRet.type = type
    msgRet.id = id
    msgRet.cnt = cnt
    Msg.send(msgRet,human.fd)
    RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1006)

    updateRed(human)
end

function CGRank(human)
    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData = getLocalUnionWarData(localData,human.db.unionUuid)
    local memberList = unionWarData.member
    local msgRet = Msg.gc.GC_UNION_WAR_RANK
    local len = 0
    for k,v in ipairs(unionWarData.rank) do
        len = len + 1
        local net = msgRet.list[len]
        net.uuid = v[1]
        net.rank = k
        local member = memberList[v[1]]
        RoleLogic.makeRoleBase(member.rolebase,net.roleBase)
        net.job = member.post
        local rankID = getUnionWarRankRewardID(k)
        local len1 = 0
        for k1,v1 in ipairs(RankExcel[rankID].item) do
            len1 = len1 + 1
            Grid.makeItem(net.items[len1],v1[1],v1[2])
        end
        net.items[0] = len1
        net.jifen = v[2]
        net.star = v[3]            
    end
    msgRet.list[0] = len
    Msg.send(msgRet,human.fd)
end

function auto(str)
    print(" auto   1111")
    local Gm = require("chat.Gm")
    local CreateRole = require("role.CreateRole")
    local memberCnt = 30
    local now = os.time()
    local union = UnionDBLogic.getUnionByName(str)
    local teamUuidStr = ""
    local teamHide = {[0] = memberCnt}
    for i = 1, memberCnt do
        local account = str .. string.format("%02d", i)
        local db = RoleDBLogic.getDbByAccount(account, Config.NEW_SVR_INDEX)
        if not db then
            db = CreateRole.creatFakeDb(account, Config.NEW_SVR_INDEX)
            db.lastLoginTime = os.time()
            db.lastLogoutTime = os.time() 
        end
        local human = {}
        human.db = db
   --     ObjHuman.exPand(human)
        Gm.d3.god(human)
        if not union then
            union = UnionDBLogic.addUnion(human, str, 1, "")
        end
        if not union then return end
        if not db.unionUuid then
            db.unionUuid = union._id
            UnionDBLogic.addUnionMember(union, human.db._id)
        end
        CombatPosLogic.setCombatByUnionWarGm(human, CombatDefine.COMBAT_TYPE3)
        union.member[human.db._id].lastDonateTime = now
        ObjHuman.save(human)
    end
    union.lv = UNION_LV 
    UnionDBLogic.updateUnionData(union)
end

local UNION_RANKREWARD_STATE = nil
function CGRankReward(human)
    local msgRet = Msg.gc.GC_UNION_WAR_RANK_REWARD
    if not UNION_RANKREWARD_STATE then
        for k, v in ipairs(RankExcel) do
            local net = msgRet.list[k]
            net.id = k
            net.minRank = v.minRank
            net.maxRank = v.maxRank
            for j, h in ipairs(v.item) do
                Grid.makeItem(net.items[j],  h[1], h[2])
            end
            net.items[0] = #v.item
        end
        msgRet.list[0] = #RankExcel
    end
    Msg.send(msgRet, human.fd) 
end


function isDotByBox(human, unionWarData)
    local now = os.time()
    
    if not unionWarData then
        local localData = UnionWarDBLogic.getLocalData()
        unionWarData =  getLocalUnionWarData(localData,human.db.unionUuid)
    end
    if not unionWarData then return end 

    local boxData = unionWarData.box
     if not unionWarData.member[human.db._id] then
        return
    end
    if not boxData or not boxData.endTime then return end 
    if now > boxData.endTime then
        return 
    end

    -- 检测 有没有领过
    for k,v in ipairs(boxData.list) do
        if v[3] == human.db._id then
            return
        end
    end
    return true
end

function isDotByShop(human, unionWarData)
    local memberData = getLocalMemberData(unionWarData,human.db._id)
    local humanData = getUnionWarData(human,memberData)
    local buyList
    for type = 1 , 2 do
        if type == 1 then
            buyList = humanData.shop[1]
        else
            buyList = humanData.shop[2]
        end
        local lv = unionWarData.lv
        local len = 0
        local ShopExcel = getShopExcel(type)
        for k,v in pairs(ShopExcel) do
            if v.lv <= lv and not buyList[k] then
                return true
            end            
        end
    end  
end

function isDotByCnt(human, unionWarData)
    local actState = getState()
    if actState == STATE3 and unionWarData.isMatch and Util.isSameDay(unionWarData.matchTime) then
        local memberData = getLocalMemberData(unionWarData,human.db._id)
        local humanData = getUnionWarData(human,memberData)
        if not humanData.fightCnt then 
            return true
        end
        if Util.isSameDay(humanData.fightTime)  then
            if  humanData.fightCnt and humanData.fightCnt < UnionWarExcel.define[1].cnt then
                return true
            end
        else
            return true
        end
    end
end

function isDotByPiPei(human, unionWarData)
    local memberData = getLocalMemberData(unionWarData,human.db._id)
    local humanData = getUnionWarData(human,memberData)

    local actState = getState()

    if actState >= STATE2 and actState < STATE4 and unionWarData.isMatch then
        if not Util.isSameDay(humanData.pipeiLook) then
            return true
        end
       
    end
end

function isDot(human)
    if not human.db.unionUuid then
        return
    end
    -- local localData = UnionWarDBLogic.getLocalData()
    -- local unionWarData =  getLocalUnionWarData(localData,human.db.unionUuid)
    -- if not unionWarData then return end
    -- -- 成就
    -- local memberData = getLocalMemberData(unionWarData,human.db._id)
    -- if isDotChengjiu(human,localData,unionWarData,memberData,1) or isDotChengjiu(human,localData,unionWarData,memberData,2) then
    --     return true
    -- end

    -- if isDotByBox(human, unionWarData) then
    --     return true
    -- end

    -- if isDotByShop(human, unionWarData) then
    --     return true
    -- end

    -- if isDotByCnt(human, unionWarData) then
    --     return true
    -- end

    -- if isDotByPiPei(human, unionWarData) then
    --     return true
    -- end
end


-- 更新界面 红点
function updateRed(human)
    local msgRet = Msg.gc.GC_UNION_WAR_RED
    msgRet.cjDot = 0
    msgRet.zgDot = 0
    msgRet.shopDot = 0
    msgRet.fightDot = 0
    msgRet.pipeiDot = 0

    local localData = UnionWarDBLogic.getLocalData()
    local unionWarData =  getLocalUnionWarData(localData,human.db.unionUuid)
    local memberData = getLocalMemberData(unionWarData,human.db._id)

    if not memberData then 
        Msg.send(msgRet,human.fd)
        return 
    end

    if unionWarData and memberData and isDotChengjiu(human,localData,unionWarData,memberData,1) or isDotChengjiu(human,localData,unionWarData,memberData,2) then
        msgRet.cjDot = 1
    end

    if unionWarData and isDotByBox(human, unionWarData) then
        msgRet.zgDot = 1
    end

    if unionWarData and isDotByShop(human, unionWarData) then
        msgRet.shopDot = 1
    end

    if unionWarData and isDotByCnt(human, unionWarData) then
        msgRet.fightDot = 1
    end

    if unionWarData and isDotByPiPei(human, unionWarData) then
        msgRet.pipeiDot = 1
    end

    Msg.send(msgRet,human.fd)
end