最后------------

---
---  Author: 【苏可欣】
---  AuthorID: 【384576】
---  CreateTime: 【2025-3-10 18:25:51】
--- 【FSync】
--- 【读书报告分享-新】
---

local class = require("middleclass")
local WBElement = require("mworld/worldBaseElement")

---@class fsync_140e0912_7f18_41e5_ac05_ba118e5e8121 : WorldBaseElement
local FsyncElement = class("fsync_140e0912-7f18-41e5-ac05-ba118e5e8121", WBElement)

local Fsync_Example_KEY = "_Example__Key_"
local TAG = "读书报告分享-新"
local readBookReport = "982691742386825/assets/Prefabs/ShareReadBookReport.prefab"
local PageId = "activity_center_share_readbook_report"

---@param worldElement CS.Tal.framesync.WorldElement
function FsyncElement:initialize(worldElement)
    FsyncElement.super.initialize(self, worldElement)
    ---@type PageMonitorService
    self.pageMonitorService = CourseEnv.BaseBusinessManager:GetPageMonitorService()
    self:RegisterDownloadUaddress(readBookReport)
    self.isInCountdown = true
    -- self.hasCollectedReward = false -- 初始化为false,表示未领取奖励

    -- 弹幕相关变量初始化
    self.barrageRangeRectWidth = 0
    self.barragePool = {}         -- 对象池
    self.activeBarrages = {}      -- 激活的弹幕
    self.barrageSpeed = 150       -- 弹幕移动速度
    self.isBarrageRunning = false -- 弹幕系统运行状态
    self.currentFriendIndex = 1   -- 当前使用的friend索引

    --订阅KEY消息

    self:InitEvent()
    --订阅KEY消息
    self:SubscribeMsgKey(Fsync_Example_KEY)
end

function FsyncElement:InitBarrage()
    -- 获取弹幕区域宽度并初始化弹幕系统
    local barrageRangeRect = self.barrageRange:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.barrageRangeRectWidth = barrageRangeRect.rect.width
    local barrageRect = self.barrage:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.barrageRect = barrageRect

    if self.shareInfo and self.shareInfo.friends and #self.shareInfo.friends > 0 and (self.shareInfo.reportStatus == 2 or self.shareInfo.reportStatus == 3) and self.shareInfo.count > 0 then
        -- 清空现有对象池
        self.barragePool = {}
        self.activeBarrages = {}
        self.currentFriendIndex = 1

        -- 开始弹幕滚动
        self:StartBarrageSystem()
    end
end

-- 创建空弹幕实例(不绑定数据)
function FsyncElement:CreateBarrageInstance()
    local barrageInstance = GameObject.Instantiate(self.barrage.gameObject)
    barrageInstance.name = "barrage" .. (#self.barragePool + #self.activeBarrages + 1)
    barrageInstance.transform:SetParent(self.barrageRange)

    local rectTransform = barrageInstance:GetComponent(typeof(CS.UnityEngine.RectTransform))
    rectTransform.localScale = CS.UnityEngine.Vector3.one

    -- 初始位置在右边界外
    rectTransform.anchoredPosition = CS.UnityEngine.Vector2(self.barrageRangeRectWidth, 0)
    barrageInstance.gameObject:SetActive(false)

    local barrage = {
        instance = barrageInstance,
        rectTransform = rectTransform,
        width = 0, -- 宽度会在设置数据时更新
        isActive = false
    }
    return barrage
end

-- 设置弹幕数据
function FsyncElement:SetBarrageData(barrage, friend)
    if not barrage or not friend then return end
    local barrageRectTransform = barrage.instance:GetComponent(typeof(CS.UnityEngine.RectTransform))
    local headMask = barrageRectTransform.transform:Find("headMask")
    local head = headMask:Find("head")
    local headImage = head:GetComponent(typeof(CS.UnityEngine.UI.Image))
    local nameText = barrageRectTransform.transform:Find("name"):GetComponent(typeof(CS.TMPro.TextMeshProUGUI))

    -- 加载头像
    if friend.avatar and friend.avatar ~= "" then
        self.httpService:LoadNetWorkTexture(friend.avatar, function(texture)
            if headImage then
                headImage.sprite = texture
            end
        end)
    end

    -- 设置名称
    if nameText then
        nameText.text = friend.name
    end

    -- -- 设置位置和大小
    local headRectTransform = headImage:GetComponent(typeof(CS.UnityEngine.RectTransform))
    headRectTransform.anchoredPosition = CS.UnityEngine.Vector2(0, 0)

    local nameRectTransform = nameText:GetComponent(typeof(CS.UnityEngine.RectTransform))
    -- 设置锚点为左居中
    nameRectTransform.anchorMin = CS.UnityEngine.Vector2(0, 0.5)
    nameRectTransform.anchorMax = CS.UnityEngine.Vector2(0, 0.5)
    nameRectTransform.pivot = CS.UnityEngine.Vector2(0, 0.5) -- 设置轴心点也为左居中
    nameRectTransform.sizeDelta = CS.UnityEngine.Vector2(nameText.preferredWidth, nameRectTransform.rect.height)
    nameRectTransform.anchoredPosition = CS.UnityEngine.Vector2(4 + headRectTransform.rect.width + 8, 0)

    -- 更新宽度
    barrageRectTransform.sizeDelta = CS.UnityEngine.Vector2(4 + headRectTransform.rect.width + 8 + nameText.preferredWidth + 8 + self.barrageTextTransform.rect.width + 16 + 70,self.barrageRect.rect.height)
    barrage.width = 4 + headRectTransform.rect.width + 8 + nameText.preferredWidth + 8 +self.barrageTextTransform.rect.width + 16
    return barrage
end

-- 从对象池获取弹幕并设置数据
function FsyncElement:GetBarrageFromPool()
    if not self.shareInfo or not self.shareInfo.friends or #self.shareInfo.friends == 0 then
        return nil
    end

    local barrage = nil
    -- 检查对象池中是否有可复用的弹幕
    if #self.barragePool > 0 then
        -- 从对象池中取出一个弹幕
        barrage = table.remove(self.barragePool, 1)
    else
        -- 对象池为空,创建新的弹幕实例
        barrage = self:CreateBarrageInstance()
        if not barrage then
            g_LogError("创建弹幕实例失败")
            return nil
        end
    end

    -- 获取当前friend数据
    local friend = self.shareInfo.friends[self.currentFriendIndex]



    -- 更新friend索引,循环使用
    self.currentFriendIndex = self.currentFriendIndex + 1
    if self.currentFriendIndex > #self.shareInfo.friends then
        self.currentFriendIndex = 1
    end

    -- 激活弹幕
    barrage.isActive = true
    barrage.instance.gameObject:SetActive(true)
    -- 设置弹幕数据
    self:SetBarrageData(barrage, friend)
    barrage.rectTransform.anchoredPosition = CS.UnityEngine.Vector2(self.barrageRangeRectWidth, 0)
    table.insert(self.activeBarrages, barrage)

    return barrage
end

-- 回收弹幕到对象池
function FsyncElement:RecycleBarrage(barrage)
    if not barrage then return end

    -- 设置为非活动状态
    barrage.isActive = false
    barrage.rectTransform.anchoredPosition = CS.UnityEngine.Vector2(self.barrageRangeRectWidth, 0)
    barrage.instance.gameObject:SetActive(false)

    -- 放回对象池
    table.insert(self.barragePool, barrage)

    -- 从激活列表中移除
    for i, active in ipairs(self.activeBarrages) do
        if active == barrage then
            table.remove(self.activeBarrages, i)
            break
        end
    end
end

-- 开始弹幕系统
function FsyncElement:StartBarrageSystem()
    g_Log(TAG,"开始弹幕系统 判断是否正在运行isBarrageRunning",self.isBarrageRunning)
    if self.isBarrageRunning then return end
    self.isBarrageRunning = true

    -- 初始化第一个弹幕
    local firstBarrage = self:GetBarrageFromPool()
    if not firstBarrage then return end

    -- 注册更新函数
    self.barrageUpdateTimer = self.commonService:RegisterGlobalTimer(0, function()
        self:UpdateBarrages()
    end, true)
end

-- 更新弹幕位置
function FsyncElement:UpdateBarrages()
    if not self.isBarrageRunning then return end

    local deltaTime = 0.02 -- 固定帧率时间
    local lastBarrage = self.activeBarrages[#self.activeBarrages]

    -- 更新所有激活的弹幕位置
    for i = #self.activeBarrages, 1, -1 do
        local barrage = self.activeBarrages[i]
        local currentPos = barrage.rectTransform.anchoredPosition
        local newX = currentPos.x - self.barrageSpeed * 1

        -- 如果弹幕移出左边界,回收到对象池
        if newX <= -1 * barrage.rectTransform.sizeDelta.x * 2 then
            g_Log(TAG,"弹幕移出左边界,回收到对象池")
            self:RecycleBarrage(barrage)
        else
            -- 使用插值平滑移动弹幕
            local targetPosition = CS.UnityEngine.Vector2(newX, currentPos.y)
            barrage.rectTransform.anchoredPosition = CS.UnityEngine.Vector2.Lerp(currentPos, targetPosition, 0.03)
        end
    end

    -- 检查是否需要生成新弹幕
    if lastBarrage then
        local lastBarrageRightEdge = lastBarrage.rectTransform.anchoredPosition.x + lastBarrage.width
        if lastBarrageRightEdge <= self.barrageRangeRectWidth - 60 - 70 then
            local newBarrage = self:GetBarrageFromPool()
            -- 新弹幕已经在GetBarrageFromPool中设置了位置和数据
        end
    elseif #self.activeBarrages == 0 then
        -- 如果没有活动的弹幕,重新开始
        local newBarrage = self:GetBarrageFromPool()
    end
end

-- 停止弹幕系统
function FsyncElement:StopBarrageSystem()

    self.isBarrageRunning = false
    g_Log(TAG,"停止弹幕系统 判断是否正在运行isBarrageRunning",self.isBarrageRunning)
    if self.barrageUpdateTimer then
        self.commonService:UnregisterGlobalTimer(self.barrageUpdateTimer)
        self.barrageUpdateTimer = nil
    end
    -- 回收所有活动的弹幕
    for i = #self.activeBarrages, 1, -1 do
        self:RecycleBarrage(self.activeBarrages[i])
    end

    -- 清空对象池中的所有弹幕
    for _, barrage in ipairs(self.barragePool) do
        if barrage and barrage.instance then
            GameObject.Destroy(barrage.instance)
        end
    end

    self.barragePool = {}
    self.activeBarrages = {}
end

function FsyncElement:InitEvent()
    --监听打开事件
    self.observerService:Watch("ActivityCenter_Open_Canvas", function(key, value)
        local data = value[0]
        self.show = data.show
        self.root = data.root

        if self.show == "shareReadBook" then
            self.isCurrIndex = true
            g_Log(TAG,"触发打开读书报告分享页面")
            self:GetShareInfo(function(success, shareInfo)
                if success then
                    self.shareInfo = shareInfo
                    g_Log(TAG, "self.shareInfo.reportStatus 触发打开读书报告分享页面", self.shareInfo.reportStatus)
                    self:LoadingReadBookPage()
                end
            end)
        else
            self.isCurrIndex = false
            self:ClosePanel()
        end
    end)

    self.observerService:Watch("ActivityCenter_Close_Canvas", function(key, value)
        g_Log(TAG, "关闭读书报告分享页面")
        self:ClosePanel(true)
    end)
end

function FsyncElement:LoadingReadBookPage()
    -- 停止之前可能正在运行的弹幕系统
    -- self:StopBarrageSystem()
    if self.readBookPanel and self.readBookPanel.gameObject.activeSelf == false then
        self.readBookPanel.gameObject:SetActive(true)
        -- 如果面板已存在但被隐藏,重新显示时也要更新倒计时
        if self.shareInfo then
            -- self:InitCountDown()
            -- 如果符合条件,重新初始化弹幕系统
            self:SetViewByShareInfo()
            if (self.shareInfo.reportStatus == 2 or self.shareInfo.reportStatus == 3) and self.shareInfo.count > 0 and #self.shareInfo.friends > 0 then
                self:InitBarrage()
            end
        end

        return
    end
    if self.readBookPanel and self.readBookPanel.gameObject.activeSelf == true then
        return
    end
    self.pageMonitorService:recordPageOpen(PageId, "读书报告分享")
    self:LoadRemoteUaddress(readBookReport, function(success, prefab)
        if self.readBookPanel then
            self.readBookPanel.gameObject:SetActive(true)
            return
        end
        if not self.isCurrIndex then
            return
        end


        if success and prefab then
            if self.prefab then
                ResourceManager:ReleaseObject(self.prefab)
                self.prefab = nil
            end
            -- g_Log(TAG, "读书报告分享动态下载成功")
            local obj = GameObject.Instantiate(prefab)
            self.prefab = prefab
            self.objRoot = obj
            self.readBookPanel = obj.transform:FindChildWithName("Root")
            self.readBookPanel:SetParent(self.root)
            self.dialogContentRect = self.readBookPanel:GetComponent(typeof(CS.UnityEngine.RectTransform))
            self.dialogContentRect.localPosition = CS.UnityEngine.Vector3(0, 0, 0)
            self.dialogContentRect.anchorMax = CS.UnityEngine.Vector2(1, 1)
            self.dialogContentRect.anchorMin = CS.UnityEngine.Vector2(0, 0)
            self.dialogContentRect.localScale = CS.UnityEngine.Vector3(1, 1, 1)
            -- self.dialogContentRect.anchorMax = CS.UnityEngine.Vector2(0.5, 0.5)
            -- self.dialogContentRect.anchorMin = CS.UnityEngine.Vector2(0.5, 0.5)
            -- self.dialogContentRect.anchoredPosition = CS.UnityEngine.Vector2.zero
            self:InitReadBookView()
            self.commonService:StartCoroutine(function()
                self.commonService:Yield(self.commonService:WaitUntil(function()
                    return self.shareInfo
                end))
                local param_one = "0"
                if self.shareInfo.reportStatus == 2 then
                    param_one = "1"
                end
                self:reportData("activity_center_share_readbook_report_show", "读书报告分享显示", { param_one = param_one }, "0")

                -- 确保倒计时初始化
                -- self:InitCountDown()
            end)
            self.pageMonitorService:recordPageLoadComplete(PageId)
        end
    end, true)
end

function FsyncElement:InitReadBookView()
    -- 根据图片中的节点层级结构初始化UI元素
    self.root0 = self.readBookPanel
    -- Bg背景
    self.bg = self.root0:Find("Bg")

    -- ContentPanel内容面板
    self.contentPanel = self.root0:Find("ContentPanel")
    self.title = self.contentPanel:Find("Title")

    -- BarrageRange弹幕区域
    self.barrageRange = self.contentPanel:Find("BarrageRange")
    -- Barrage弹幕实例
    self.barrage = self.barrageRange:Find("Barrage")
    -- BarrageInfo信息
    self.barrageHeadmask = self.barrage:Find("headMask")
    self.barrageHead = self.barrageHeadmask:Find("head")
    self.barrageName = self.barrage:Find("name")
    self.barrageText = self.barrage:Find("text")

    -- 获取必要的组件
    self.barrageHeadImage = self.barrageHead:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.barrageNameText = self.barrageName:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.barrageTextTransform = self.barrageText:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.barrage.gameObject:SetActive(false)

    -- RightBackImage右侧背景图
    self.rightBackImage = self.contentPanel:Find("RightBackImage")

    -- Jewels宝石区域
    self.jewels = self.rightBackImage:Find("Jewels")
    -- AwardNum奖励数量区域
    self.awardNum = self.jewels:Find("AwardNum")
    -- AwardInfo奖励信息
    self.awardInfo = self.awardNum:Find("AwardInfo")
    self.awardPlus = self.awardInfo:Find("Award+")
    self.awardNum0 = self.awardInfo:Find("AwardNum0")
    self.awardNum0Image = self.awardNum0:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.awardNum1 = self.awardInfo:Find("AwardNum1")
    self.awardNum1Image = self.awardNum1:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.awardNum2 = self.awardInfo:Find("AwardNum2")
    self.awardNum2Image = self.awardNum2:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.awardNum3 = self.awardInfo:Find("AwardNum3")
    self.awardNum3Image = self.awardNum3:GetComponent(typeof(CS.UnityEngine.UI.Image))

    -- HasShare已分享区域
    self.hasShare = self.jewels:Find("HasShare")
    -- HasShareInfo分享信息
    self.hasShareInfo = self.hasShare:Find("HasShareInfo")
    self.text0 = self.hasShareInfo:Find("text0")
    -- NumInfo数字信息
    self.hasShareNumInfo = self.hasShareInfo:Find("NumInfo")
    self.hasShareNum0 = self.hasShareNumInfo:Find("num0")
    self.hasShareNum0Image = self.hasShareNum0:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.hasShareNum1 = self.hasShareNumInfo:Find("num1")
    self.hasShareNum1Image = self.hasShareNum1:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.hasShareNum2 = self.hasShareNumInfo:Find("num2")
    self.hasShareNum2Image = self.hasShareNum2:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.hasShareNum3 = self.hasShareNumInfo:Find("num3")
    self.hasShareNum3Image = self.hasShareNum3:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.hasShareDiamond4 = self.hasShareInfo:Find("diamond4")

    -- 右侧标题区域
    self.rightStartShareTitle = self.contentPanel:Find("RightStartShareTitle")
    -- 标题信息区域
    self.rightStartShareInfo = self.rightStartShareTitle:Find("Info")
    self.rightStartShareTitleTitle0 = self.rightStartShareTitle:Find("title0")
    self.rightStartShareTitleTitle1 = self.rightStartShareInfo:Find("title1")
    self.rightStartShareTitleGap2 = self.rightStartShareInfo:Find("Gap2")
    self.rightStartShareTitleNum2 = self.rightStartShareInfo:Find("num2")
    self.rightStartShareTitleNum2Image = self.rightStartShareTitleNum2:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.rightStartShareTitleNum21 = self.rightStartShareInfo:Find("num2_1")
    self.rightStartShareTitleNum21Image = self.rightStartShareTitleNum21:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.rightStartShareTitleGap3 = self.rightStartShareInfo:Find("Gap3")
    self.rightStartShareTitleDiamond1 = self.rightStartShareInfo:Find("diamond1")
    self.rightStartShareTitleTitle2 = self.rightStartShareInfo:Find("title2")
    self.rightStartShareTitleGap1 = self.rightStartShareInfo:Find("Gap1")

    self.rightStartShareTitleNum3 = self.rightStartShareInfo:Find("num3")
    self.rightStartShareTitleNum3Image = self.rightStartShareTitleNum3:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.rightStartShareTitleNum4 = self.rightStartShareInfo:Find("num4")
    self.rightStartShareTitleNum4Image = self.rightStartShareTitleNum4:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.rightStartShareTitleNum5 = self.rightStartShareInfo:Find("num5")
    self.rightStartShareTitleNum5Image = self.rightStartShareTitleNum5:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.rightStartShareTitleNum6 = self.rightStartShareInfo:Find("num6")
    self.rightStartShareTitleNum6Image = self.rightStartShareTitleNum6:GetComponent(typeof(CS.UnityEngine.UI.Image))


    self.rightStartShareTitleGap0 = self.rightStartShareInfo:Find("Gap0")
    self.rightStartShareTitleDiamond2 = self.rightStartShareInfo:Find("diamond2")

    self.rightShareSuccessTitle = self.contentPanel:Find("RightShareSuccessTitle")
    self.rightShareSuccessTitleNum2 = self.rightShareSuccessTitle:Find("num2")
    self.rightShareSuccessTitleNum2Image = self.rightShareSuccessTitleNum2:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.rightWaitCollectTitle = self.contentPanel:Find("RightWaitCollectTitle")
    self.rightEndTitle = self.contentPanel:Find("RightEndTitle")

    -- 底部区域
    self.bottomStartShareTmp = self.rightBackImage:Find("BottomStartShareTmp")
    self.bottomStartShareTmpText1 = self.bottomStartShareTmp:Find("text1")
    self.bottomStartShareTmpText1Text = self.bottomStartShareTmpText1:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomStartShareTmpText2 = self.bottomStartShareTmp:Find("text2")
    self.bottomStartShareTmpText2Text = self.bottomStartShareTmpText2:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomStartShareNum1 = self.bottomStartShareTmp:Find("num1")
    self.bottomStartShareNum1Text = self.bottomStartShareNum1:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomStartShareNum1Rect = self.bottomStartShareNum1:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.bottomStartShareNum2 = self.bottomStartShareTmp:Find("num2")
    self.bottomStartShareNum2Text = self.bottomStartShareNum2:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomStartShareNum2Rect = self.bottomStartShareNum2:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.bottomStartShareNum3 = self.bottomStartShareTmp:Find("num3")
    self.bottomStartShareNum3Text = self.bottomStartShareNum3:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomStartShareNum3Rect = self.bottomStartShareNum3:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.bottomStartShareTmpRect = self.bottomStartShareTmp:GetComponent(typeof(CS.UnityEngine.RectTransform))

    -- 底部分享成功区域
    self.bottomShareSuccessTmp = self.rightBackImage:Find("BottomShareSuccessTmp")
    self.bottomShareSuccessTmpText1 = self.bottomShareSuccessTmp:Find("text1")
    self.bottomShareSuccessTmpText1Text = self.bottomShareSuccessTmpText1:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomShareSuccessTmpText2 = self.bottomShareSuccessTmp:Find("text2")
    self.bottomShareSuccessTmpText2Text = self.bottomShareSuccessTmpText2:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomShareSuccessNum1 = self.bottomShareSuccessTmp:Find("num1")
    self.bottomShareSuccessNum1Text = self.bottomShareSuccessNum1:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomShareSuccessNum1Rect = self.bottomShareSuccessNum1Text:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.bottomShareSuccessNum2 = self.bottomShareSuccessTmp:Find("num2")
    self.bottomShareSuccessNum2Text = self.bottomShareSuccessNum2:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomShareSuccessNum2Rect = self.bottomShareSuccessNum2Text:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.bottomShareSuccessTmpRect = self.bottomShareSuccessTmp:GetComponent(typeof(CS.UnityEngine.RectTransform))

    -- 底部等待收集区域
    self.bottomWaitCollectTitle = self.rightBackImage:Find("BottomWaitCollectTitle")
    self.bottomWaitCollectTitleText1 = self.bottomWaitCollectTitle:Find("text1")
    self.bottomWaitCollectTitleText1Text = self.bottomWaitCollectTitleText1:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomWaitCollectTitleText2 = self.bottomWaitCollectTitle:Find("text2")
    self.bottomWaitCollectTitleText2Text = self.bottomWaitCollectTitleText2:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomWaitNum1 = self.bottomWaitCollectTitle:Find("num1")
    self.bottomWaitNum1Text = self.bottomWaitNum1:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomWaitNum1Rect = self.bottomWaitNum1:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.bottomWaitNum2 = self.bottomWaitCollectTitle:Find("num2")
    self.bottomWaitNum2Text = self.bottomWaitNum2:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomWaitNum2Rect = self.bottomWaitNum2:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.bottomWaitCollectTitleRect = self.bottomWaitCollectTitle:GetComponent(typeof(CS.UnityEngine.RectTransform))

    -- 底部结束区域
    self.bottomEndTitle = self.rightBackImage:Find("BottomEndTitle")
    self.bottomEndTitleRect = self.bottomEndTitle:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.bottomEndText1 = self.bottomEndTitle:Find("text1")
    self.bottomEndText1Text = self.bottomEndText1:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomEndText2 = self.bottomEndTitle:Find("text2")
    self.bottomEndText2Text = self.bottomEndText2:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomEndNum1 = self.bottomEndTitle:Find("num1")
    self.bottomEndNum1Text = self.bottomEndNum1:GetComponent(typeof(CS.TMPro.TextMeshProUGUI))
    self.bottomEndNum1Rect = self.bottomEndNum1:GetComponent(typeof(CS.UnityEngine.RectTransform))

    -- 其他区域
    self.bottomNoView = self.rightBackImage:Find("BottomNoView")
    self.bottomNoViewRect = self.bottomNoView:GetComponent(typeof(CS.UnityEngine.RectTransform))
    self.bottomEndNoView = self.rightBackImage:Find("BottomEndNoView")
    self.bottomEndNoViewRect = self.bottomEndNoView:GetComponent(typeof(CS.UnityEngine.RectTransform))


    -- 倒计时区域
    self.countDown = self.rightBackImage:Find("CountDown")
    self.daynum = self.countDown:Find("daynum")
    self.hournum0 = self.countDown:Find("hournum0")
    self.hournum1 = self.countDown:Find("hournum1")
    self.minutenum0 = self.countDown:Find("minutenum0")
    self.minutenum1 = self.countDown:Find("minutenum1")
    self.daytext = self.countDown:Find("daytext")
    self.hourtext = self.countDown:Find("hourtext")
    self.minutetext = self.countDown:Find("minutetext")
    self.text0 = self.countDown:Find("text0")
    self.getEndLabel = self.rightBackImage:Find("GetEndLabel")
    self.endLabel = self.rightBackImage:Find("EndLabel")

    -- 中途分享按钮
    self.halfwayShare = self.contentPanel:Find("HalfwayShare")
    if self.halfwayShare then
        self.halfwayShareBtn = self.halfwayShare:GetComponent(typeof(CS.UnityEngine.UI.Button))
        self.commonService:AddEventListener(self.halfwayShareBtn, "onClick", function()
            -- 防止短时间内重复点击
            if self.clickTime and os.time() - self.clickTime < 2 then
                return
            end
            self.clickTime = os.time()

            -- 埋点上报
            self:reportData("activity_center_share_readbook_report_click", "读课文分享点击", {}, "0")
            self:ShareReadBookReport()

            --协程等待一帧
            self.commonService:YieldSeconds(1)
            --等待大于三秒时再分享
            if os.time() - self.clickTime > 3 then
                g_Log(TAG,"等待大于三秒时再分享")
                self:ShareReadBook(function(success)
                    if success then
    
                    end
                    if not success then
                        self.observerService:Fire("ABCZONE_COMMON_TOAST", { content = "分享失败,请稍后再试" })
                    end
                end)
            end

        end)
    end

    -- 获取按钮区域
    self.getBtn = self.rightBackImage:Find("GetBtn")
    -- GetBtn信息区域
    self.getBtnInfo = self.getBtn:Find("Info")
    self.text1 = self.getBtnInfo:Find("text1")
    -- NumInfo数字信息区域
    self.getBtnNum1 = self.getBtnInfo:Find("num1")
    self.getBtnNum1Image = self.getBtnNum1:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.getBtnNum2 = self.getBtnInfo:Find("num2")
    self.getBtnNum2Image = self.getBtnNum2:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.getBtnNum3 = self.getBtnInfo:Find("num3")
    self.getBtnNum3Image = self.getBtnNum3:GetComponent(typeof(CS.UnityEngine.UI.Image))
    self.getBtnDiamond6 = self.getBtnInfo:Find("diamond6")
    if self.getBtn then
        self.getBtnButton = self.getBtn:GetComponent(typeof(CS.UnityEngine.UI.Button))
        self.commonService:AddEventListener(self.getBtnButton, "onClick", function()
            -- 添加标记,表示已经领取了奖励
            -- self.hasCollectedReward = true
            self:AwardPrizes(function(success)
                if success then
                    -- self:SetViewByShareInfo()
                    g_Log(TAG,"点击了领取按钮,获取分享信息")
                    self:GetShareInfo(function(success, shareInfo)
                        if success then
                           self.shareInfo = shareInfo
                           g_Log(TAG,"点击了领取按钮,获取分享信息")
                           g_Log(TAG,"self.shareInfo.reportStatus",self.shareInfo.reportStatus)
                           self:SetViewByShareInfo()
                        end
                    end)
                    self.observerService:Fire("RE_ACTIVE_CENTER",{})
                else
                    self.getBtnButton.interactable = true
                end
            end)
            -- 禁用按钮,防止重复点击
            self.getBtnButton.interactable = false
        end)
    end

    self.btnText1 = self.getBtn:Find("text1")
    self.btnNum1 = self.getBtn:Find("num1")
    self.btnNum2 = self.getBtn:Find("num2")
    self.btnNum3 = self.getBtn:Find("num3")
    self.btnDiamond6 = self.getBtn:Find("diamond6")

    -- 左侧内容和右侧副标题
    self.leftContent = self.root:Find("LeftContent")

    -- 图表区域
    self.cutDiagram = self.root0:Find("CutDiagram")
    for i = 0, 9 do
        -- 直接存储sprite组件而不是transform引用
        self["cutDiagram" .. i] = self.cutDiagram:Find(tostring(i)):GetComponent(typeof(CS.UnityEngine.UI.Image))
        self["cutDiagramRed" .. i] = self.cutDiagram:Find("red" .. i):GetComponent(typeof(CS.UnityEngine.UI.Image))
        self["cutDiagramSmall" .. i] = self.cutDiagram:Find("small" .. i):GetComponent(typeof(CS.UnityEngine.UI.Image))
        self["cutDiagramMedium" .. i] = self.cutDiagram:Find("medium" .. i):GetComponent(typeof(CS.UnityEngine.UI.Image))
    end

    -- 分享按钮
    self.share = self.rightBackImage:Find("Share")
    self.shareButton = self.share:GetComponent(typeof(CS.UnityEngine.UI.Button))
    self.commonService:AddEventListener(self.shareButton, "onClick", function()
        -- g_Log(TAG,"读课文分享新-----点击")
        if self.clickTime and os.time() - self.clickTime < 2 then
            return
        end
        self.clickTime = os.time()
        self:reportData("activity_center_share_readbook_report_click", "读课文分享点击", {}, "0")
        if not self.shareInfo then
            g_Log(TAG,"未获取到分享信息,请稍后再试")
            self.observerService:Fire("ABCZONE_COMMON_TOAST", { content = "未获取到分享信息,请稍后再试" })
            self:GetShareInfo(function(success, shareInfo)
                self.shareButton.interactable = true
                if success then
                    self.shareInfo = shareInfo
                    self:SetViewByShareInfo()
                end
            end)

            return
        end
        self:ShareReadBookReport()
        --协程等待一帧
        self.commonService:YieldSeconds(1)
        --等待大于三秒时再分享
        if os.time() - self.clickTime > 3 then
            g_Log(TAG,"等待大于三秒时再分享")
            self:ShareReadBook(function(success)
                if success then
                    -- self.commonService:StartCoroutine(function()
                    --     self.commonService:YieldSeconds(2)
                    --     self.shareInfo.reportStatus = 2
                    --     self:SetViewByShareInfo()
                        self.shareButton.interactable = false
                    -- end)
                else
                    self.observerService:Fire("ABCZONE_COMMON_TOAST", { content = "分享失败,请稍后再试" })
                    self.shareButton.interactable = true
                end
            end)
        end

    end)

    self:SetViewByShareInfo()
end

-- 更新红色数字图片显示
function FsyncElement:UpdateNumberImage(targetImage, number)
    if not targetImage or not self.redImages then
        return
    end

    -- 处理大于9的数字(主要是天数可能大于9)
    if number > 9 then
        -- 如果是天数,我们只显示个位数,或者可以考虑其他处理方式
        -- 这里简单处理为显示9
        number = 9
    end
    -- 确保number在0-9范围内
    number = math.max(0, math.min(9, number))
    -- 获取目标Image组件
    local image = targetImage:GetComponent(typeof(CS.UnityEngine.UI.Image))
    if not image then
        return
    end
    -- 获取对应数字的red图片
    local redImage = self.redImages[number]
    if not redImage then
        return
    end
    -- 复制sprite到目标Image
    image.sprite = redImage.sprite
end

-- 更新奖励数量显示
function FsyncElement:UpdateAwardNum()
    if not self.shareInfo or not self.shareInfo.count then
        return
    end

    -- 计算奖励值 = 查看人数 * 5
    local awardValue = self.shareInfo.count * self.shareInfo.reward_unit
    -- 确保奖励值不超过最大奖励
    if self.shareInfo.maxRewards and awardValue > self.shareInfo.maxRewards then
        awardValue = self.shareInfo.maxRewards
    end
    -- 将奖励值转换为字符串,然后分解为个位数
    local awardStr = tostring(awardValue)
    local digits = {}
    -- 从字符串中提取每一位数字
    for i = 1, #awardStr do
        digits[i] = tonumber(string.sub(awardStr, i, i))
    end

    -- 根据位数更新显示
    if #digits == 1 then
        -- 只有个位数
        if self.awardNum3 and self.awardNum3.gameObject then
            if self["cutDiagram" .. digits[1]] then
                -- 直接使用sprite属性
                self.awardNum3Image.sprite = self["cutDiagram" .. digits[1]].sprite
            end
            self.awardNum3.gameObject:SetActive(true)
        end
        if self.awardNum2 and self.awardNum2.gameObject then
            self.awardNum2.gameObject:SetActive(false)
        end
        if self.awardNum1 and self.awardNum1.gameObject then
            self.awardNum2.gameObject:SetActive(false)
        end
        if self.awardNum0 and self.awardNum0.gameObject then
            self.awardNum0.gameObject:SetActive(false)
        end
    elseif #digits == 2 then
        -- 十位和个位
        if self.awardNum3 and self.awardNum3.gameObject then
            -- 直接使用sprite属性
            if self["cutDiagram" .. digits[2]] then
                self.awardNum3Image.sprite = self["cutDiagram" .. digits[2]].sprite
            end
            self.awardNum3.gameObject:SetActive(true)
        end
        if self.awardNum2 and self.awardNum2.gameObject then
            -- 直接使用sprite属性
            if self["cutDiagram" .. digits[1]] then
                self.awardNum2Image.sprite = self["cutDiagram" .. digits[1]].sprite
            end
            self.awardNum2.gameObject:SetActive(true)
        end
        if self.awardNum1 and self.awardNum1.gameObject then
            self.awardNum1.gameObject:SetActive(false)
        end
        if self.awardNum0 and self.awardNum0.gameObject then
            self.awardNum0.gameObject:SetActive(false)
        end
    elseif #digits == 3 then
        -- 百位、十位和个位
        if self.awardNum3 and self.awardNum3.gameObject then
            if self["cutDiagram" .. digits[3]] then
                self.awardNum3Image.sprite = self["cutDiagram" .. digits[3]].sprite
            end
            self.awardNum3.gameObject:SetActive(true)
        end
        if self.awardNum2 and self.awardNum2.gameObject then
            -- 直接使用sprite属性
            if self["cutDiagram" .. digits[2]] then
                self.awardNum2Image.sprite = self["cutDiagram" .. digits[2]].sprite
            end
            self.awardNum2.gameObject:SetActive(true)
        end
        if self.awardNum1 and self.awardNum1.gameObject then
            -- 直接使用sprite属性
            if self["cutDiagram" .. digits[1]] then
                self.awardNum1Image.sprite = self["cutDiagram" .. digits[1]].sprite
            end
            self.awardNum1.gameObject:SetActive(true)
        end
        if self.awardNum0 and self.awardNum0.gameObject then
            self.awardNum0.gameObject:SetActive(false)
        end
    elseif #digits == 4 then
        -- 千位、百位、十位和个位
        if self.awardNum4 and self.awardNum4.gameObject then
            if self["cutDiagram" .. digits[4]] then
                self.awardNum4Image.sprite = self["cutDiagram" .. digits[4]].sprite
            end
            self.awardNum4.gameObject:SetActive(true)
        end
        if self.awardNum3 and self.awardNum3.gameObject then
            if self["cutDiagram" .. digits[3]] then
                self.awardNum3Image.sprite = self["cutDiagram" .. digits[3]].sprite
            end
            self.awardNum3.gameObject:SetActive(true)
        end
        if self.awardNum2 and self.awardNum2.gameObject then
            if self["cutDiagram" .. digits[2]] then
                self.awardNum2Image.sprite = self["cutDiagram" .. digits[2]].sprite
            end
            self.awardNum2.gameObject:SetActive(true)
        end
        if self.awardNum1 and self.awardNum1.gameObject then
            if self["cutDiagram" .. digits[1]] then
                self.awardNum1Image.sprite = self["cutDiagram" .. digits[1]].sprite
            end
            self.awardNum1.gameObject:SetActive(true)
        end
        if self.awardNum0 and self.awardNum0.gameObject then
            self.awardNum0.gameObject:SetActive(false)
        end
    end


    -- 显示加号
    if self.awardPlus and self.awardPlus.gameObject then
        self.awardPlus.gameObject:SetActive(true)
    end
end

-- 添加更新最大奖励显示的函数
function FsyncElement:UpdateMaxRewardsDisplay()
    if not self.shareInfo or not self.shareInfo.maxRewards then
        return
    end
    -- 获取最大奖励值
    local maxRewards = self.shareInfo.maxRewards
    -- 将最大奖励值转换为字符串,然后分解为个位数
    local rewardsStr = tostring(maxRewards)
    local digits = {}
    -- 从字符串中提取每一位数字
    for i = 1, #rewardsStr do
        digits[i] = tonumber(string.sub(rewardsStr, i, i))
    end

    -- 根据位数更新显示
    if #digits == 1 then
        -- 只有个位数
        -- 直接使用sprite
        if self["cutDiagramSmall" .. digits[1]] and self["cutDiagramMedium" .. digits[1]] then
            self.hasShareNum3Image.sprite = self["cutDiagramSmall" .. digits[1]].sprite
            self.rightStartShareTitleNum6Image.sprite = self["cutDiagramMedium" .. digits[1]].sprite
        end
        self.hasShareNum3.gameObject:SetActive(true)
        self.rightStartShareTitleNum6.gameObject:SetActive(true)
        self.hasShareNum2.gameObject:SetActive(false)
        self.rightStartShareTitleNum5.gameObject:SetActive(false)
        self.hasShareNum1.gameObject:SetActive(false)
        self.rightStartShareTitleNum4.gameObject:SetActive(false)
        self.hasShareNum0.gameObject:SetActive(false)
        self.rightStartShareTitleNum3.gameObject:SetActive(false)

    elseif #digits == 2 then
        -- 十位和个位
        -- 直接使用sprite
        if self["cutDiagramSmall" .. digits[2]] and self["cutDiagramMedium" .. digits[2]] then
            self.hasShareNum3Image.sprite = self["cutDiagramSmall" .. digits[2]].sprite
            self.rightStartShareTitleNum6Image.sprite = self["cutDiagramMedium" .. digits[2]].sprite
        end
        self.hasShareNum3.gameObject:SetActive(true)
        self.rightStartShareTitleNum6.gameObject:SetActive(true)
                -- 直接使用sprite
        if self["cutDiagramSmall" .. digits[1]] and self["cutDiagramMedium" .. digits[1]] then
            self.hasShareNum2Image.sprite = self["cutDiagramSmall" .. digits[1]].sprite
            self.rightStartShareTitleNum5Image.sprite = self["cutDiagramMedium" .. digits[1]].sprite
        end
        self.hasShareNum2.gameObject:SetActive(true)
        self.rightStartShareTitleNum5.gameObject:SetActive(true)
        self.rightStartShareTitleNum4.gameObject:SetActive(false)
        self.hasShareNum1.gameObject:SetActive(false)
        self.rightStartShareTitleNum3.gameObject:SetActive(false)
        self.hasShareNum0.gameObject:SetActive(false)   

    elseif #digits == 3 then
        -- 百位、十位和个位
        -- 直接使用sprite
        if self["cutDiagramSmall" .. digits[3]] and self["cutDiagramMedium" .. digits[3]] then
            self.hasShareNum3Image.sprite = self["cutDiagramSmall" .. digits[3]].sprite
            self.rightStartShareTitleNum6Image.sprite = self["cutDiagramMedium" .. digits[3]].sprite
        end
        self.hasShareNum3.gameObject:SetActive(true)
        self.rightStartShareTitleNum6.gameObject:SetActive(true)

        if self["cutDiagramSmall" .. digits[2]] and self["cutDiagramMedium" .. digits[2]] then
            self.hasShareNum2Image.sprite = self["cutDiagramSmall" .. digits[2]].sprite
            self.rightStartShareTitleNum5Image.sprite = self["cutDiagramMedium" .. digits[2]].sprite
        end
        self.hasShareNum2.gameObject:SetActive(true)
        self.rightStartShareTitleNum5.gameObject:SetActive(true)

        if self["cutDiagramSmall" .. digits[1]] and self["cutDiagramMedium" .. digits[1]] then
            self.hasShareNum1Image.sprite = self["cutDiagramSmall" .. digits[1]].sprite
            self.rightStartShareTitleNum4Image.sprite = self["cutDiagramMedium" .. digits[1]].sprite
        end
        self.hasShareNum1.gameObject:SetActive(true)
        self.rightStartShareTitleNum4.gameObject:SetActive(true)

        self.rightStartShareTitleNum3.gameObject:SetActive(false)
        self.hasShareNum0.gameObject:SetActive(false)
    elseif #digits == 4 then
        -- 千位、百位、十位和个位
        -- 直接使用sprite
        if self["cutDiagramSmall" .. digits[4]] and self["cutDiagramMedium" .. digits[4]] then
            self.hasShareNum3Image.sprite = self["cutDiagramSmall" .. digits[4]].sprite
            self.rightStartShareTitleNum6Image.sprite = self["cutDiagramMedium" .. digits[4]].sprite
        end
        self.hasShareNum3.gameObject:SetActive(true)
        self.rightStartShareTitleNum6.gameObject:SetActive(true)

        if self["cutDiagramSmall" .. digits[3]] and self["cutDiagramMedium" .. digits[3]] then
            self.hasShareNum2Image.sprite = self["cutDiagramSmall" .. digits[3]].sprite
            self.rightStartShareTitleNum5Image.sprite = self["cutDiagramMedium" .. digits[3]].sprite
        end
        self.hasShareNum2.gameObject:SetActive(true)
        self.rightStartShareTitleNum5.gameObject:SetActive(true)

        if self["cutDiagramSmall" .. digits[2]] and self["cutDiagramMedium" .. digits[2]] then
            self.hasShareNum1Image.sprite = self["cutDiagramSmall" .. digits[2]].sprite
            self.rightStartShareTitleNum4Image.sprite = self["cutDiagramMedium" .. digits[2]].sprite
        end
        self.hasShareNum1.gameObject:SetActive(true)
        self.rightStartShareTitleNum4.gameObject:SetActive(true)

        if self["cutDiagramSmall" .. digits[1]] and self["cutDiagramMedium" .. digits[1]] then
            self.hasShareNum0Image.sprite = self["cutDiagramSmall" .. digits[1]].sprite
            self.rightStartShareTitleNum3Image.sprite = self["cutDiagramMedium" .. digits[1]].sprite
        end
        self.hasShareNum0.gameObject:SetActive(true)
        self.rightStartShareTitleNum3.gameObject:SetActive(true)
    end
end

-- 更新获取按钮上的数字显示
function FsyncElement:UpdateGetBtnNumbers()
    if not self.shareInfo or not self.shareInfo.count then
        return
    end

    -- 计算奖励值 = 查看人数 * 5
    local awardValue = self.shareInfo.count * self.shareInfo.reward_unit
    -- 确保奖励值不超过最大奖励
    if self.shareInfo.maxRewards and awardValue > self.shareInfo.maxRewards then
        awardValue = self.shareInfo.maxRewards
    end


    -- 将奖励值转换为字符串,然后分解为个位数
    local awardStr = tostring(awardValue)
    local digits = {}

    -- 从字符串中提取每一位数字
    for i = 1, #awardStr do
        digits[i] = tonumber(string.sub(awardStr, i, i))
    end

    -- 根据位数更新显示
    if #digits == 1 then
        -- 只有个位数
        if self.getBtnNum3 and self.getBtnNum3.gameObject then
            -- 直接使用sprite
            if self["cutDiagramSmall" .. digits[1]] then
                self.getBtnNum3Image.sprite = self["cutDiagramSmall" .. digits[1]].sprite
            end
            self.getBtnNum3.gameObject:SetActive(true)
        end
        if self.getBtnNum2 and self.getBtnNum2.gameObject then
            self.getBtnNum2.gameObject:SetActive(false)
        end
        if self.getBtnNum1 and self.getBtnNum1.gameObject then
            self.getBtnNum1.gameObject:SetActive(false)
        end
    elseif #digits == 2 then
        -- 十位和个位
        if self.getBtnNum3 and self.getBtnNum3.gameObject then
            -- 直接使用sprite
            if self["cutDiagramSmall" .. digits[2]] then
                self.getBtnNum3Image.sprite = self["cutDiagramSmall" .. digits[2]].sprite
            end
            self.getBtnNum3.gameObject:SetActive(true)
        end
        if self.getBtnNum2 and self.getBtnNum2.gameObject then
            -- 直接使用sprite
            if self["cutDiagramSmall" .. digits[1]] then
                self.getBtnNum2Image.sprite = self["cutDiagramSmall" .. digits[1]].sprite
            end
            self.getBtnNum2.gameObject:SetActive(true)
        end
        if self.getBtnNum1 and self.getBtnNum1.gameObject then
            self.getBtnNum1.gameObject:SetActive(false)
        end
    elseif #digits == 3 then
        -- 百位、十位和个位
        if self.getBtnNum3 and self.getBtnNum3.gameObject then
            -- 直接使用sprite
            if self["cutDiagramSmall" .. digits[3]] then
                self.getBtnNum3Image.sprite = self["cutDiagramSmall" .. digits[3]].sprite
            end
            self.getBtnNum3.gameObject:SetActive(true)
        end
        if self.getBtnNum2 and self.getBtnNum2.gameObject then
            -- 直接使用sprite
            if self["cutDiagramSmall" .. digits[2]] then
                self.getBtnNum2Image.sprite = self["cutDiagramSmall" .. digits[2]].sprite
            end
            self.getBtnNum2.gameObject:SetActive(true)
        end
        if self.getBtnNum1 and self.getBtnNum1.gameObject then
            -- 直接使用sprite
            if self["cutDiagramSmall" .. digits[1]] then
                self.getBtnNum1Image.sprite = self["cutDiagramSmall" .. digits[1]].sprite
            end
            self.getBtnNum1.gameObject:SetActive(true)
        end
    end
    -- 显示钻石图标
    if self.getBtnDiamond6 and self.getBtnDiamond6.gameObject then
        self.getBtnDiamond6.gameObject:SetActive(true)
    end
end

function FsyncElement:SetViewByShareInfo()
    self.commonService:StartCoroutine(function()
        self.commonService:Yield(self.commonService:WaitUntil(function()
            return self.shareInfo
        end))

        -- 隐藏所有UI元素
        self:HideAllUIElements()

        -- 获取查看人数
        local viewCount = self.shareInfo.count

        if self.shareInfo.reportStatus == 2 then
            g_Log(TAG,"self.shareInfo.reportStatus ==2 已分享状态")
            -- 已分享状态
            if self.isInCountdown then
                -- 倒计时中
                if viewCount > 0 then
                    self:StopBarrageSystem()
                    self:InitBarrage()
                    -- 有人查看

                    -- 设置右侧分享成功标题为显示
                    if self.rightShareSuccessTitle and self.rightShareSuccessTitle.gameObject then
                        -- 直接使用sprite
                        self.rightShareSuccessTitleNum2Image.sprite = self
                            ["cutDiagramSmall" .. self.shareInfo.reward_unit].sprite
                        self.rightShareSuccessTitle.gameObject:SetActive(true)
                    end
                    -- 设置标签为显示
                    if self.hasShare and self.hasShare.gameObject then
                        self:UpdateMaxRewardsDisplay()
                        self.hasShare.gameObject:SetActive(true)
                    end
                    -- 设置奖励数量为显示
                    if self.awardNum and self.awardNum.gameObject then
                        -- 更新奖励数量显示
                        self:UpdateAwardNum()
                        self.awardNum.gameObject:SetActive(true)
                    end
                    -- 设置底部分享成功模板为显示
                    if self.bottomShareSuccessTmp and self.bottomShareSuccessTmp.gameObject then
                        self.bottomShareSuccessNum1Text.text = self.shareInfo.count
                        if self.shareInfo.count * self.shareInfo.reward_unit <= self.shareInfo.maxRewards then
                            self.bottomShareSuccessNum2Text.text = self.shareInfo.count * self.shareInfo.reward_unit
                        else
                            self.bottomShareSuccessNum2Text.text = self.shareInfo.maxRewards
                        end
                        self.bottomShareSuccessTmp.gameObject:SetActive(true)
                    end
                    -- 设置倒计时为显示
                    if self.countDown and self.countDown.gameObject then
                        self:InitCountDown()
                        self.countDown.gameObject:SetActive(true)
                    end

                    if self.halfwayShare and self.halfwayShare.gameObject then
                        self.halfwayShare.gameObject:SetActive(true)
                    end
                else
                    -- 无人查看
                    -- 设置右侧分享成功标题为显示
                    if self.rightShareSuccessTitle and self.rightShareSuccessTitle.gameObject then
                        -- 直接使用sprite
                        self.rightShareSuccessTitleNum2Image.sprite = self
                            ["cutDiagramSmall" .. self.shareInfo.reward_unit].sprite
                        self.rightShareSuccessTitle.gameObject:SetActive(true)
                    end

                    -- 设置已分享区域为显示
                    if self.hasShare and self.hasShare.gameObject then
                        self:UpdateMaxRewardsDisplay()
                        self.hasShare.gameObject:SetActive(true)
                    end

                    -- 设置底部无人查看视图为显示
                    if self.bottomNoView and self.bottomNoView.gameObject then
                        self.bottomNoView.gameObject:SetActive(true)
                    end

                    -- 设置倒计时为显示
                    if self.countDown and self.countDown.gameObject then
                        self:InitCountDown()
                        self.countDown.gameObject:SetActive(true)
                    end

                    if self.halfwayShare and self.halfwayShare.gameObject then
                        self.halfwayShare.gameObject:SetActive(true)
                    end
                end
            else
                -- 倒计时结束
                g_Log(TAG,"倒计时结束,获取分享信息")
                self:GetShareInfo(function(success, shareInfo)
                    self.shareButton.interactable = true
                    if success then
                        self.shareInfo = shareInfo
                    end
                end)

                if viewCount > 0 then
                    -- -- 有人查看
                    self:StopBarrageSystem()
                    self:InitBarrage()
                    -- 设置等待领取UI状态
                    if self.rightWaitCollectTitle and self.rightWaitCollectTitle.gameObject then
                        self.rightWaitCollectTitle.gameObject:SetActive(true)
                    end

                    -- 设置奖励数量为显示
                    if self.awardNum and self.awardNum.gameObject then
                        -- 更新奖励数量显示
                        self:UpdateAwardNum()
                        self.awardNum.gameObject:SetActive(true)
                    end

                    if self.hasShare and self.hasShare.gameObject then
                        self:UpdateMaxRewardsDisplay()
                        self.hasShare.gameObject:SetActive(true)
                    end

                    -- 设置底部等待领取标题为显示
                    if self.bottomWaitCollectTitle and self.bottomWaitCollectTitle.gameObject then
                        self.bottomWaitNum1Text.text = self.shareInfo.count
                        if self.shareInfo.count * self.shareInfo.reward_unit <= self.shareInfo.maxRewards then
                            self.bottomWaitNum2Text.text = self.shareInfo.count * self.shareInfo.reward_unit
                        else
                            self.bottomWaitNum2Text.text = self.shareInfo.maxRewards
                        end
                        -- self.bottomWaitCollectTitleRect.sizeDelta = CS.UnityEngine.Vector2(
                        -- self.bottomWaitCollectTitleText1Text.preferredWidth+self.bottomWaitCollectTitleText2Text.preferredWidth+self.bottomWaitNum1Text.preferredWidth+self.bottomWaitNum2Text.preferredWidth+22, self.bottomWaitCollectTitleRect.rect.height)
                        self.bottomWaitCollectTitle.gameObject:SetActive(true)
                    end

                    -- 设置领取按钮为显示
                    if self.getBtn and self.getBtn.gameObject then
                        -- 更新获取按钮上的数字显示
                        self:UpdateGetBtnNumbers()
                        self.getBtn.gameObject:SetActive(true)
                    end
                else
                    -- 无人查看
                    -- 设置结束标签为显示
                    if self.endLabel and self.endLabel.gameObject then
                        self.endLabel.gameObject:SetActive(true)
                    end

                    -- 设置右侧结束标题为显示
                    if self.rightEndTitle and self.rightEndTitle.gameObject then
                        self.rightEndTitle.gameObject:SetActive(true)
                    end

                    -- 设置底部结束无人查看视图为显示
                    if self.bottomEndNoView and self.bottomEndNoView.gameObject then
                        self.bottomEndNoView.gameObject:SetActive(true)
                    end
                end
            end
        elseif self.shareInfo.reportStatus == 3 then
            -- 已领取状态
            self:StopBarrageSystem()
            self:InitBarrage()
            g_Log(TAG,"self.shareInfo.reportStatus == 3 已领取状态")
            if self.rightEndTitle and self.rightEndTitle.gameObject then
                self.rightEndTitle.gameObject:SetActive(true)
            end
            -- 设置奖励数量为显示
            if self.awardNum and self.awardNum.gameObject then
                self:UpdateAwardNum()
                self.awardNum.gameObject:SetActive(true)
            end
            -- 设置底部结束标题为显示
            if self.bottomEndTitle and self.bottomEndTitle.gameObject then
                self.bottomEndNum1Text.text = self.shareInfo.count
                -- self.bottomEndTitleRect.sizeDelta = CS.UnityEngine.Vector2(
                -- self.bottomEndText1Text.preferredWidth+self.bottomEndText2Text.preferredWidth+self.bottomEndNum1Text.preferredWidth, self.bottomEndTitleRect.rect.height)
                self.bottomEndTitle.gameObject:SetActive(true)
            end
            -- 设置获取结束标签为显示
            if self.getEndLabel and self.getEndLabel.gameObject then
                self.getEndLabel.gameObject:SetActive(true)
            end
            return
        elseif self.shareInfo.reportStatus == 1 or self.shareInfo.reportStatus == 0 then
            -- 未分享状态
            -- 设置右侧开始分享标题为显示
            if self.rightStartShareTitle and self.rightStartShareTitle.gameObject then
                -- 直接使用sprite
                -- 获取最大奖励值
                local reward_unit = self.shareInfo.reward_unit
                -- 将最大奖励值转换为字符串,然后分解为个位数
                local reward_unit = tostring(reward_unit)
                local digits = {}
                -- 从字符串中提取每一位数字
                for i = 1, #reward_unit do
                    digits[i] = tonumber(string.sub(reward_unit, i, i))
                end
                if #digits == 1 then
                    self.rightStartShareTitleNum21Image.sprite = self["cutDiagramMedium" .. digits[1]].sprite
                    self.rightStartShareTitleNum21.gameObject:SetActive(true)
                    self.rightStartShareTitleNum2.gameObject:SetActive(false)
                elseif #digits == 2 then
                    self.rightStartShareTitleNum21Image.sprite = self["cutDiagramMedium" .. digits[2]].sprite
                    self.rightStartShareTitleNum21.gameObject:SetActive(true)
                    self.rightStartShareTitleNum2Image.sprite = self["cutDiagramMedium" .. digits[1]].sprite
                    self.rightStartShareTitleNum2.gameObject:SetActive(true)
                end
                -- 更新最大奖励显示
                self:UpdateMaxRewardsDisplay()
                self.rightStartShareTitle.gameObject:SetActive(true)
            end
            -- 设置已分享区域为显示
            if self.hasShare and self.hasShare.gameObject then
                -- 更新最大奖励显示
                self:UpdateMaxRewardsDisplay()
                self.hasShare.gameObject:SetActive(true)
            end
            -- 设置底部开始分享模板为显示
            if self.bottomStartShareTmp and self.bottomStartShareTmp.gameObject then
                self.bottomStartShareNum2Text.text = self.shareInfo.reward_unit
                self.bottomStartShareNum3Text.text = self.shareInfo.maxRewards

                -- self.bottomStartShareTmpRect.sizeDelta = CS.UnityEngine.Vector2(
                -- self.bottomStartShareTmpText1Text.preferredWidth+self.bottomStartShareTmpText2Text.preferredWidth+self.bottomStartShareNum1Text.preferredWidth+self.bottomStartShareNum2Text.preferredWidth+self.bottomStartShareNum3Text.preferredWidth+22*2, self.bottomStartShareTmpRect.rect.height)
                self.bottomStartShareTmp.gameObject:SetActive(true)
            end
            -- 设置分享按钮为显示
            if self.share and self.share.gameObject then
                self.share.gameObject:SetActive(true)
            end

            -- elseif self.shareInfo.reportStatus == 0 then
            --     -- 不可分享状态
        end
    end)
end

function FsyncElement:ClosePanel(needDestroy)
    self:StopBarrageSystem()
    if self.readBookPanel and self.readBookPanel.gameObject.activeSelf == true then
        self.readBookPanel.gameObject:SetActive(false)
    end
    if needDestroy and self.readBookPanel then
        self:DestroyView()
    end
end

-- 隐藏所有UI元素
function FsyncElement:HideAllUIElements()
    -- 隐藏右侧标题区域
    if self.rightStartShareTitle and self.rightStartShareTitle.gameObject then
        self.rightStartShareTitle.gameObject:SetActive(false)
    end
    if self.rightShareSuccessTitle and self.rightShareSuccessTitle.gameObject then
        self.rightShareSuccessTitle.gameObject:SetActive(false)
    end
    if self.rightWaitCollectTitle and self.rightWaitCollectTitle.gameObject then
        self.rightWaitCollectTitle.gameObject:SetActive(false)
    end
    if self.rightEndTitle and self.rightEndTitle.gameObject then
        self.rightEndTitle.gameObject:SetActive(false)
    end

    -- 隐藏底部区域
    if self.bottomStartShareTmp and self.bottomStartShareTmp.gameObject then
        self.bottomStartShareTmp.gameObject:SetActive(false)
    end
    if self.bottomShareSuccessTmp and self.bottomShareSuccessTmp.gameObject then
        self.bottomShareSuccessTmp.gameObject:SetActive(false)
    end
    if self.bottomWaitCollectTitle and self.bottomWaitCollectTitle.gameObject then
        self.bottomWaitCollectTitle.gameObject:SetActive(false)
    end
    if self.bottomEndTitle and self.bottomEndTitle.gameObject then
        self.bottomEndTitle.gameObject:SetActive(false)
    end
    if self.bottomNoView and self.bottomNoView.gameObject then
        self.bottomNoView.gameObject:SetActive(false)
    end
    if self.bottomEndNoView and self.bottomEndNoView.gameObject then
        self.bottomEndNoView.gameObject:SetActive(false)
    end
    if self.halfwayShare and self.halfwayShare.gameObject then
        self.halfwayShare.gameObject:SetActive(false)
    end

    -- 隐藏奖励相关区域
    if self.awardNum and self.awardNum.gameObject then
        self.awardNum.gameObject:SetActive(false)
    end
    if self.awardPlus and self.awardPlus.gameObject then
        self.awardPlus.gameObject:SetActive(false)
    end
    if self.awardNum0 and self.awardNum0.gameObject then
        self.awardNum0.gameObject:SetActive(false)
    end
    if self.awardNum1 and self.awardNum1.gameObject then
        self.awardNum1.gameObject:SetActive(false)
    end
    if self.awardNum2 and self.awardNum2.gameObject then
        self.awardNum2.gameObject:SetActive(false)
    end

    -- 隐藏已分享区域
    if self.hasShare and self.hasShare.gameObject then
        self.hasShare.gameObject:SetActive(false)
    end

    -- 隐藏倒计时区域
    if self.countDown and self.countDown.gameObject then
        self.countDown.gameObject:SetActive(false)
    end
    if self.endLabel and self.endLabel.gameObject then
        self.endLabel.gameObject:SetActive(false)
    end
    if self.getEndLabel and self.getEndLabel.gameObject then
        self.getEndLabel.gameObject:SetActive(false)
    end

    -- 隐藏按钮区域
    if self.getBtn and self.getBtn.gameObject then
        self.getBtn.gameObject:SetActive(false)
    end
    if self.share and self.share.gameObject then
        self.share.gameObject:SetActive(false)
    end

    if self.halfwayShare and self.halfwayShare.gameObject then
        self.halfwayShare.gameObject:SetActive(false)
    end

    -- 隐藏最大奖励数字
    if self.num3 and self.num3.gameObject then
        self.num3.gameObject:SetActive(false)
    end
    if self.num4 and self.num4.gameObject then
        self.num4.gameObject:SetActive(false)
    end
    if self.num5 and self.num5.gameObject then
        self.num5.gameObject:SetActive(false)
    end
end

function FsyncElement:DestroyView()
    -- 移除按钮监听
    if self.shareButton then
        self.shareButton.onClick:RemoveAllListeners()
    end
    if self.halfwayShareBtn then
        self.halfwayShareBtn.onClick:RemoveAllListeners()
    end
    if self.getBtnButton then
        self.getBtnButton.onClick:RemoveAllListeners()
    end

    -- 取消倒计时定时器
    if self.countDownTimerId then
        self.commonService:UnregisterGlobalTimer(self.countDownTimerId)
        self.countDownTimerId = nil
    end

    -- 清理弹幕相关
    -- self:StopBarrageSystem()

    -- 清理弹幕对象池
    for _, barrage in ipairs(self.barragePool or {}) do
        if barrage.instance then
            CS.UnityEngine.GameObject.DestroyImmediate(barrage.instance)
        end
    end

    self.barragePool = {}
    self.activeBarrages = {}

    -- 清理redImages引用
    if self.redImages then
        for i = 0, 9 do
            self.redImages[i] = nil
        end
        self.redImages = nil
    end

    -- 销毁根物体
    if self.objRoot then
        CS.UnityEngine.GameObject.DestroyImmediate(self.objRoot)
        self.objRoot = nil
    end
    if self.readBookPanel then
        CS.UnityEngine.GameObject.DestroyImmediate(self.readBookPanel.gameObject)
        self.readBookPanel = nil
    end
    -- 清理面板引用
    self.dialogContentRect = nil
    -- 释放预制体资源
    if self.prefab then
        ResourceManager:ReleaseObject(self.prefab)
        self.prefab = nil
    end
    self.pageMonitorService:recordPageClose(PageId)

    -- 重置状态变量
    self.isBarrageRunning = false
    self.isInCountdown = true
    -- self.hasCollectedReward = false
end

function FsyncElement:ShareReadBookReport()
    local image = "https://static0.xesimg.com/next-studio-pub/app/1736943865007/zQsexNIiSJTCdgnwr9AZ.png"
    self.content = {
        title = self.shareInfo.title,
        -- contentDesc = self.shareInfo.contentDesc,
        url = self.shareInfo.url,
        imageType = "network",
        image = image,
        thumbImageUrl = image,
        previewImageUrl = image
    }
    local param = { type = "WeChatTimeline", contentType = "web", content = self.content }
    APIBridge.RequestAsync('app.api.share.shareToNative', param, function(res)
        if res then
            g_Log(TAG, "分享微信朋友圈,回调--->" .. table.dump(res))
        end
    end)
end

-- 收到/恢复IRC消息
-- @param key  订阅的消息key
-- @param value  消息集合体
-- @param isResume  是否为恢复消息
function FsyncElement:ReceiveMessage(key, value, isResume)
    -- TODO:
end

-- 发送KEY-VALUE 消息
-- @param key 自定义/协议key
-- @param body  table 消息体
function FsyncElement:SendCustomMessage(key, body)
    self:SendMessage(key, body)
end

-- 自己avatar对象创建完成
-- @param avatar 对应自己的Fsync_avatar对象
function FsyncElement:SelfAvatarCreated(avatar)

end

-- 自己avatar对象人物模型加载完成ba
-- @param avatar 对应自己的Fsync_avatar对象
function FsyncElement:SelfAvatarPrefabLoaded(avatar)

end

-- avatar对象创建完成,包含他人和自己
-- @param avatar 对应自己的Fsync_avatar对象
function FsyncElement:AvatarCreated(avatar)

end

------------------------蓝图组件相应方法---------------------------------------------
--是否是异步恢复如果是需要改成true
function FsyncElement:LogicMapIsAsyncRecorver()
    return false
end

--开始恢复方法(断线重连的时候用)
function FsyncElement:LogicMapStartRecover()
    FsyncElement.super:LogicMapStartRecover()
    --TODO
end

--结束恢复方法 (断线重连的时候用)
function FsyncElement:LogicMapEndRecover()
    FsyncElement.super:LogicMapEndRecover(self)
    --TODO
end

--所有的组件恢复完成
function FsyncElement:LogicMapAllComponentRecoverComplete()
end

--收到Trigger事件
function FsyncElement:OnReceiveTriggerEvent(interfaceId)
end

--收到GetData事件
function FsyncElement:OnReceiveGetDataEvent(interfaceId)
    return nil
end

------------------------蓝图组件相应方法End---------------------------------------------

---接口请求
function FsyncElement:ShareReadBook(callback)
    self.domain = "https://app.chuangjing.com/abc-api"
    local url = self.domain .. "/v3/article-share/do"
    if App.IsStudioClient then
        url = "https://yapi.xesv5.com/mock/2041/v3/article-share/do"
    end
    local params = {
    }
    local success = function(resp)
        if resp and resp ~= "" then
            local msg = nil
            if type(resp) == "string" then
                msg = self.jsonService:decode(resp)
            end
            if msg and msg.code == 0 then
                local data = msg.data
                if data and type(data) == "table" then
                    -- callback(true)
                    callback(data.result)
                end
            end
        else
            callback(false)
        end
    end
    local fail = function(err)
        callback(false)
    end
    self:HttpRequest(url, params, success, fail)
end

function FsyncElement:AwardPrizes(callback)
    self.domain = "https://app.chuangjing.com/abc-api"
    local url = self.domain .. "/v3/article-share/reward"
    if App.IsStudioClient then
        url = "https://yapi.xesv5.com/mock/2041/v3/article-share/reward"
    end
    local params = {
    }
    local success = function(resp)
        if resp and resp ~= "" then
            local msg = nil
            if type(resp) == "string" then
                msg = self.jsonService:decode(resp)
            end
            if msg and msg.code == 0 then
                local data = msg.data
                if data and type(data) == "table" then
                    self.rewardNum = data.count
                    callback(true)
                end
            end
        end
    end
    local fail = function(err)
        callback(false)
    end
    self:HttpRequest(url, params, success, fail)
end

---获取分享信息
function FsyncElement:GetShareInfo(callback)
    -- if self.shareInfo and self.requestTime and os.time() - self.requestTime < 30 then
    --     callback(true, self.shareInfo)
    --     return
    -- end
    self.requestTime = os.time()
    self.domain = "https://app.chuangjing.com/abc-api"
    local url = self.domain .. "/v3/article-share/info"
    if App.IsStudioClient then
        url = "https://yapi.xesv5.com/mock/2041/v3/article-share/info"
    end
    local params = {
    }
    local success = function(resp)
        if resp and resp ~= "" then
            local msg = nil
            if type(resp) == "string" then
                msg = self.jsonService:decode(resp)
            end
            if msg and msg.code == 0 then
                local data = msg.data
                if data and type(data) == "table" then
                    local shareInfo = {
                        reward_unit = data.reward_unit,
                        userId = data.userId,
                        reportStatus = data.report_status, --2:已分享 1:未分享
                        bookId = data.book_id,
                        levelNo = data.level_no,
                        title = data.title,
                        -- contentDesc = data.contentDesc,
                        url = data.url,
                        maxRewards = data.max_rewards, -- 最大奖励
                        endTime = data.end_time,       -- 剩余时间
                        count = data.count,            -- 查看人数
                        friends = data.friends         -- 好友列表
                    }

                    -- 确保maxRewards是数字
                    if shareInfo.maxRewards and type(shareInfo.maxRewards) == "string" then
                        shareInfo.maxRewards = tonumber(shareInfo.maxRewards) or 0
                    elseif not shareInfo.maxRewards then
                        shareInfo.maxRewards = 0
                    end

                    g_Log(TAG,
                        string.format("获取分享信息成功: maxRewards=%d, count=%d", shareInfo.maxRewards, shareInfo.count or 0))

                    self.shareInfo = shareInfo

                    -- 初始化cachedFriends如果它是nil
                    callback(true, shareInfo)
                end
            end
        else
            callback(false)
        end
    end
    local fail = function(err)
        callback(false)
    end
    self:HttpRequest(url, params, success, fail)
end

function FsyncElement:HttpRequest(url, params, success, fail)
    if App.IsStudioClient then
        self.httpService:PostForm(url, params, {}, success, fail)
    else
        APIBridge.RequestAsync('api.httpclient.request', {
            ["url"] = url,
            ["headers"] = {
                ["Content-Type"] = "application/json"
            },
            ["data"] = params
        }, function(res)
            if res ~= nil and res.responseString ~= nil and res.isSuccessed then
                local resp = res.responseString
                success(resp)
            else
                fail(res)
            end
        end)
    end
end

---埋点方法
function FsyncElement:reportData(event, label, value, action)
    if not App.IsStudioClient then
        NextStudioComponentStatisticsAPI.ComponentStatisticsWithParam(event, "84169", "Special-Interaction", label,
            action, value)
    end
end

function FsyncElement:InitCountDown()
    -- self.commonService:StartCoroutine(function()
    --     self.commonService:Yield(self.commonService:WaitUntil(function()
    --         return self.shareInfo
    --     end))
    g_Log(TAG,"初始化倒计时")
    if self.shareInfo then
        -- 解析接口返回的endTime字段,格式如:"2天23小时59分"
        local days, hours, minutes = 0, 0, 0

        if self.shareInfo.endTime and self.shareInfo.endTime ~= "" then
            local endTimeStr = self.shareInfo.endTime
            -- 解析天数
            local daysStr = string.match(endTimeStr, "(%d+)天")
            if daysStr then
                days = tonumber(daysStr) or 0
            end
            -- 解析小时
            local hoursStr = string.match(endTimeStr, "(%d+)小时") or string.match(endTimeStr, "(%d+)时")
            if hoursStr then
                hours = tonumber(hoursStr) or 0
            end
            -- 解析分钟
            local minutesStr = string.match(endTimeStr, "(%d+)分")
            if minutesStr then
                minutes = tonumber(minutesStr) or 0
            end
            g_Log(TAG, string.format("解析倒计时: %d天%02d时%02d分", days, hours, minutes))
        else
            g_Log(TAG, "倒计时字符串为空或不存在")
        end

        -- 预加载red0~red9图片
        self.redImages = {}
        for i = 0, 9 do
            -- 直接存储Image组件的sprite
            self.redImages[i] = self["cutDiagramRed" .. i]
        end

        -- 更新倒计时显示,显示的分钟数比实际剩余时间多一分钟
        local function updateCountdownDisplay(remainDays, remainHours, remainMinutes, remainSeconds)
            -- 调整显示的分钟数,如果秒数大于0,则分钟数+1
            local displayMinutes = remainMinutes
            if remainSeconds > 0 then
                displayMinutes = remainMinutes + 1
                -- 处理进位
                if displayMinutes == 60 then
                    displayMinutes = 0
                    remainHours = remainHours + 1
                    if remainHours == 24 then
                        remainHours = 0
                        remainDays = remainDays + 1
                    end
                end
            end

            -- 更新天数显示
            self:UpdateNumberImage(self.daynum, remainDays)

            -- 更新小时显示(两位数)
            local hourTens = math.floor(remainHours / 10)
            local hourOnes = remainHours % 10
            self:UpdateNumberImage(self.hournum0, hourTens)
            self:UpdateNumberImage(self.hournum1, hourOnes)

            -- 更新分钟显示(两位数)
            local minuteTens = math.floor(displayMinutes / 10)
            local minuteOnes = displayMinutes % 10
            self:UpdateNumberImage(self.minutenum0, minuteTens)
            self:UpdateNumberImage(self.minutenum1, minuteOnes)

            -- 记录日志
            g_Log(TAG, string.format("倒计时更新: 实际剩余时间=%d天%02d小时%02d分%02d秒, 显示=%d天%02d小时%02d分",
                remainDays, remainHours, remainMinutes, remainSeconds, remainDays, remainHours, displayMinutes))
        end

        -- 倒计时结束时更新UI状态
        local function onCountdownFinished()
            g_Log(TAG, "倒计时结束,更新UI状态")
            --解决闪烁问题
            self.isInCountdown = false
            -- 隐藏倒计时UI
            if self.countDown and self.countDown.gameObject then
                self.countDown.gameObject:SetActive(false)
            end
            -- 更新UI显示
            self:SetViewByShareInfo()
        end
        g_Log(TAG,"计算总秒数 和判断是否在倒计时中self.isInCountdown",self.isInCountdown)
        -- 计算总秒数
        local totalSeconds = days * 86400 + hours * 3600 + minutes * 60
        local endTime = os.time() + totalSeconds

        -- 立即检查是否应该显示倒计时
        if totalSeconds > 0 and self.shareInfo.reportStatus == 2 and self.isInCountdown then
            -- 显示倒计时UI
            if self.countDown and self.countDown.gameObject then
                self.countDown.gameObject:SetActive(true)
            end
            
            -- 注册全局定时器,每秒更新一次倒计时(改为每秒更新以获得更流畅的体验)
            self.countDownTimerId = self.commonService:RegisterGlobalTimer(1, function()
                -- g_Log(TAG,"计算总秒数 和判断是否在倒计时中self.isInCountdown",self.isInCountdown)

                local now = os.time()
                local diff = endTime - now

                if diff <= 0 then
                    -- 倒计时结束
                    g_Log(TAG, "倒计时结束注销定时器self.countDownTimerId",self.countDownTimerId)
                    self.commonService:UnregisterGlobalTimer(self.countDownTimerId)
                    self.countDownTimerId = nil
                    self.isInCountdown = false
                    onCountdownFinished()
                    return
                end

                local remainDays = math.floor(diff / 86400)
                local remainHours = math.floor((diff % 86400) / 3600)
                local remainMinutes = math.floor((diff % 3600) / 60)
                local remainSeconds = diff % 60

                -- 只有当秒数为0或者分钟或更高单位变化时才更新UI显示
                -- 或者当秒数变化导致显示的分钟数变化时也更新UI
                local displayMinutes = remainMinutes
                if remainSeconds > 0 then
                    displayMinutes = remainMinutes + 1
                end

                if remainSeconds == 0 or (not self.lastRemainingMinutes) or self.lastRemainingMinutes ~= remainMinutes or
                    (not self.lastRemainingHours) or self.lastRemainingHours ~= remainHours or
                    (not self.lastRemainingDays) or self.lastRemainingDays ~= remainDays or
                    (not self.lastDisplayMinutes) or self.lastDisplayMinutes ~= displayMinutes then
                    -- 更新UI显示
                    updateCountdownDisplay(remainDays, remainHours, remainMinutes, remainSeconds)
                    -- 记录当前时间,用于下次比较
                    self.lastRemainingMinutes = remainMinutes
                    self.lastRemainingHours = remainHours
                    self.lastRemainingDays = remainDays
                    self.lastDisplayMinutes = displayMinutes
                end
            end, true)
        else
            -- 不需要显示倒计时,确保倒计时UI被隐藏
            if self.countDown and self.countDown.gameObject then
                self.countDown.gameObject:SetActive(false)
            end

            -- 如果不是倒计时状态,可能是已经结束或者未开始
            if self.shareInfo.reportStatus == 2 or self.shareInfo.reportStatus == 3 then
                -- 已分享状态但不在倒计时中,说明倒计时已结束
                onCountdownFinished()
            end
        end
    end
    -- end)
end

-- 脚本释放
function FsyncElement:Exit()
    self:StopBarrageSystem()
    -- 清理对象池
    for _, barrage in ipairs(self.barragePool) do
        if barrage.instance then
            GameObject.Destroy(barrage.instance)
        end
    end
    self.barragePool = {}
    self.activeBarrages = {}

    -- 取消倒计时定时器
    if self.countDownTimerId then
        self.commonService:UnregisterGlobalTimer(self.countDownTimerId)
        self.countDownTimerId = nil
    end

    FsyncElement.super.Exit(self)
end

return FsyncElement