From 6df9b52e1d68d4bb145fcf6d0520c2fbfed6cef1 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期二, 27 五月 2025 16:35:13 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/Mail/MailGlobalCell.cs                   |   50 +++++
 Main/Mail/MailInfoWin.cs                      |  154 +++++++++++++++++
 Main/Manager/GameSystemManager/MailManager.cs |    7 
 Main/Mail/MailWin.cs                          |  173 +++++++++++++++++++
 Main/Mail/MailGlobalCell.cs.meta              |   11 +
 Main/Mail/MailInfoAwardItemCell.cs.meta       |   11 +
 Main/Mail/MailInfoAwardItemCell.cs            |   26 ++
 Main/Mail/MailInfoWin.cs.meta                 |   11 +
 Main/Mail/MailWin.cs.meta                     |   12 +
 Main/Mail/MailPersonalCell.cs                 |   50 +++++
 Main/Mail/MailPersonalCell.cs.meta            |   12 +
 11 files changed, 515 insertions(+), 2 deletions(-)

diff --git a/Main/Mail/MailGlobalCell.cs b/Main/Mail/MailGlobalCell.cs
new file mode 100644
index 0000000..7da0aac
--- /dev/null
+++ b/Main/Mail/MailGlobalCell.cs
@@ -0,0 +1,50 @@
+锘縰sing UnityEngine;
+
+namespace vnxbqy.UI
+{
+    public class MailGlobalCell : CellView
+    {
+        [SerializeField] ButtonEx btnMail;
+        [SerializeField] ImageEx imgState;
+        [SerializeField] ImageEx imgRed;
+        [SerializeField] TextEx txtTitle;
+        [SerializeField] TextEx txtDate;
+        MailManager model { get { return MailManager.Instance; } }
+        string uuid = string.Empty;
+        public void Display(int index, CellView cellView)
+        {
+            MailCategory mailCategory = (MailCategory)cellView.info.Value.infoInt1;
+            var list = model.GetSortMailScrList(mailCategory);
+            if (list == null || index < 0 || index >= list.Count)
+                return;
+            uuid = list[index];
+            if (!model.TryGetMailData(uuid, out var mailData) || mailData == null)
+                return;
+            imgRed.SetActive(mailData.MailState == 1);
+            txtTitle.text = mailData.Title;
+            imgState.SetSprite(mailData.MailState == 2 || mailData.MailState == 3 ? "MailRead" : "MailNoRead");
+            if (mailData.Items != null)
+            {
+                txtDate.text = model.FormatCreateMailTime(mailData.CreateDateTime);
+            }
+            else
+            {
+                int expiryDay = model.GetMailExpiryDays(mailData.CreateDateTime, mailData.LimitDays);
+                txtDate.text = expiryDay > 0 ? Language.Get("Mail07", expiryDay) : model.FormatCreateMailTime(mailData.CreateDateTime);
+            }
+            btnMail.SetListener(OnClickButtonMail);
+        }
+
+        private void OnClickButtonMail()
+        {
+            model.nowUuid = uuid;
+            if (!model.TryGetMailData(uuid, out var mailData) || mailData == null)
+                return;
+            if (mailData.MailState == 1)
+            {
+                model.ReadMail(uuid);
+            }
+            UIManager.Instance.OpenWindow<MailInfoWin>();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/Mail/MailGlobalCell.cs.meta b/Main/Mail/MailGlobalCell.cs.meta
new file mode 100644
index 0000000..12c2cfe
--- /dev/null
+++ b/Main/Mail/MailGlobalCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: baaef1e2dac4e30499722be1d4c60bb4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Mail/MailInfoAwardItemCell.cs b/Main/Mail/MailInfoAwardItemCell.cs
new file mode 100644
index 0000000..5795352
--- /dev/null
+++ b/Main/Mail/MailInfoAwardItemCell.cs
@@ -0,0 +1,26 @@
+锘縰sing UnityEngine;
+
+namespace vnxbqy.UI
+{
+    public class MailInfoAwardItemCell : CellView
+    {
+        [SerializeField] ItemCell itemCell;
+        [SerializeField] ImageEx imgHave;
+        MailManager model { get { return MailManager.Instance; } }
+        public void Display(int index, CellView cellView)
+        {
+            int mailState = cellView.info.Value.infoInt1;//0-鏈煡锛�1-鏈锛�2-宸茶锛�3-宸查锛�
+            if (!model.TryGetMailData(model.nowUuid, out MailData mailData) || mailData == null || mailData.Items == null)
+                return;
+            if (index < 0 || index >= mailData.Items.Count)
+                return;
+            MailItemData data = mailData.Items[index];
+            itemCell.Init(new ItemCellModel((int)data.ItemID, true, (ulong)data.Count));
+            itemCell.button.SetListener(() => ItemTipUtility.Show((int)data.ItemID));
+            imgHave.SetActive(mailState == 3);
+
+            MailCategory mailCategory = (MailCategory)cellView.info.Value.infoInt1;
+            var list = model.GetSortMailScrList(mailCategory);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/Mail/MailInfoAwardItemCell.cs.meta b/Main/Mail/MailInfoAwardItemCell.cs.meta
new file mode 100644
index 0000000..51e1539
--- /dev/null
+++ b/Main/Mail/MailInfoAwardItemCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2b475cf66abe5c94fb8aa8664ef46141
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Mail/MailInfoWin.cs b/Main/Mail/MailInfoWin.cs
new file mode 100644
index 0000000..b93e4ea
--- /dev/null
+++ b/Main/Mail/MailInfoWin.cs
@@ -0,0 +1,154 @@
+锘縰sing UnityEngine;
+namespace vnxbqy.UI
+{
+    public class MailInfoWin : UIBase
+    {
+        [SerializeField] TextEx txtDate;
+        [SerializeField] TextEx txtTitle;
+        [SerializeField] Transform transNoAward;
+        [SerializeField] RichText txtNoAwardInfo;
+        [SerializeField] Transform transAward;
+        [SerializeField] RichText txtAwardInfo;
+        [SerializeField] ScrollerController scrAwardItem;
+        [SerializeField] TextEx txtExpiryDate;
+        [SerializeField] ButtonEx btnHave;
+        [SerializeField] ButtonEx btnDelete;
+        MailData nowMailData;
+        bool isHasAward = false;
+        MailManager model { get { return MailManager.Instance; } }
+
+        protected override void InitComponent()
+        {
+            base.InitComponent();
+            btnHave.SetListener(OnClickHaveButton);
+            btnDelete.SetListener(OnClickDeleteButton);
+        }
+
+        protected override void OnPreOpen()
+        {
+            scrAwardItem.OnRefreshCell += OnRefreshLowRewardCell;
+            model.OnUpdateMailListEvent += OnUpdateMailListEvent;
+            model.OnUpdateMailStateChangeEvent += OnUpdateMailStateChangeEvent;
+        }
+
+        protected override void OnOpen()
+        {
+            UpdateDataInfo();
+            Display();
+            CreateScrAward();
+        }
+
+        protected override void OnPreClose()
+        {
+            scrAwardItem.OnRefreshCell -= OnRefreshLowRewardCell;
+            model.OnUpdateMailListEvent -= OnUpdateMailListEvent;
+            model.OnUpdateMailStateChangeEvent -= OnUpdateMailStateChangeEvent;
+        }
+
+        private void OnClickHaveButton()
+        {
+            if (model.nowUuid == null || model.nowUuid == string.Empty)
+            {
+                Debug.Log("褰撳墠鏌ョ湅鐨勯偖浠舵病鏈塙UID");
+                return;
+            }
+            model.ClaimMail(model.nowUuid);
+        }
+        private void OnClickDeleteButton()
+        {
+            if (model.nowUuid == null || model.nowUuid == string.Empty)
+            {
+                Debug.Log("褰撳墠鏌ョ湅鐨勯偖浠舵病鏈塙UID");
+                return;
+            }
+            model.DeleteMail(model.nowUuid);
+            UIManager.Instance.CloseWindow<MailInfoWin>();
+            //閭欢鍒犻櫎鎴愬姛
+            SysNotifyMgr.Instance.ShowTip("Mail01");
+        }
+
+        private void OnUpdateMailStateChangeEvent()
+        {
+            UpdateDataInfo();
+            Display();
+            CreateScrAward();
+        }
+
+        private void OnUpdateMailListEvent()
+        {
+            UpdateDataInfo();
+            Display();
+            CreateScrAward();
+        }
+
+        private void OnRefreshLowRewardCell(ScrollerDataType type, CellView cell)
+        {
+            var _cell = cell.GetComponent<MailInfoAwardItemCell>();
+            _cell?.Display(cell.index, cell);
+        }
+
+        private void CreateScrAward()
+        {
+            scrAwardItem.Refresh();
+            if (isHasAward)
+            {
+                for (int i = 0; i < nowMailData.Items.Count; i++)
+                {
+                    CellInfo cellInfo = new CellInfo();
+                    cellInfo.infoInt1 = nowMailData.MailState;
+                    scrAwardItem.AddCell(ScrollerDataType.Header, i);
+                }
+            }
+            scrAwardItem.Restart();
+        }
+
+        private void Display()
+        {
+            if (nowMailData == null)
+                return;
+            transNoAward.SetActive(!isHasAward);
+            transAward.SetActive(isHasAward);
+            txtDate.text = model.FormatCreateMailTime(nowMailData.CreateDateTime);
+            
+            if (nowMailData.IsTemplateMail())
+            {
+                string key = nowMailData.GetTemplateKey();
+                if (MailConfig.HasKey(key))
+                {
+                    MailConfig config = MailConfig.Get(key);
+                    var templateParams = nowMailData.GetTemplateParams();
+                    string content = string.Format(config.Content, templateParams.ToArray());
+                    txtTitle.text = config.Title;
+                    txtNoAwardInfo.text = content;
+                    txtAwardInfo.text = content;
+                }
+                else
+                {
+                    txtTitle.text = nowMailData.Title;
+                    txtNoAwardInfo.text = nowMailData.Text;
+                    txtAwardInfo.text = nowMailData.Text;
+                }
+            }
+            else
+            {
+                txtTitle.text = nowMailData.Title;
+                txtNoAwardInfo.text = nowMailData.Text;
+                txtAwardInfo.text = nowMailData.Text;
+            }
+
+            int expiryDays = model.GetMailExpiryDays(nowMailData.CreateDateTime, nowMailData.LimitDays);
+            txtExpiryDate.text = expiryDays > 0 ? Language.Get("Mail07", expiryDays) : string.Empty;
+
+        }
+
+        private void UpdateDataInfo()
+        {
+            if (!model.TryGetMailData(model.nowUuid, out nowMailData))
+            {
+                UIManager.Instance.CloseWindow<MailInfoWin>();
+            }
+            isHasAward = nowMailData != null && nowMailData.Items != null;
+        }
+    }
+}
+
diff --git a/Main/Mail/MailInfoWin.cs.meta b/Main/Mail/MailInfoWin.cs.meta
new file mode 100644
index 0000000..6db9ea2
--- /dev/null
+++ b/Main/Mail/MailInfoWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 67c6caf988a88c548b2eaeb8bb069eca
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Mail/MailPersonalCell.cs b/Main/Mail/MailPersonalCell.cs
new file mode 100644
index 0000000..1dad912
--- /dev/null
+++ b/Main/Mail/MailPersonalCell.cs
@@ -0,0 +1,50 @@
+锘縰sing UnityEngine;
+
+namespace vnxbqy.UI
+{
+    public class MailPersonalCell : CellView
+    {
+        [SerializeField] ButtonEx btnMail;
+        [SerializeField] ImageEx imgState;
+        [SerializeField] ImageEx imgRed;
+        [SerializeField] TextEx txtTitle;
+        [SerializeField] TextEx txtDate;
+        MailManager model { get { return MailManager.Instance; } }
+        string uuid = string.Empty;
+        public void Display(int index, CellView cellView)
+        {
+            MailCategory mailCategory = (MailCategory)cellView.info.Value.infoInt1;
+            var list = model.GetSortMailScrList(mailCategory);
+            if (list == null || index < 0 || index >= list.Count)
+                return;
+            uuid = list[index];
+            if (!model.TryGetMailData(uuid, out var mailData) || mailData == null)
+                return;
+            imgRed.SetActive(mailData.MailState == 1);
+            txtTitle.text = mailData.Title;
+            imgState.SetSprite(mailData.MailState == 2 || mailData.MailState == 3 ? "MailRead" : "MailNoRead");
+            if (mailData.Items != null)
+            {
+                txtDate.text = model.FormatCreateMailTime(mailData.CreateDateTime);
+            }
+            else
+            {
+                int expiryDay = model.GetMailExpiryDays(mailData.CreateDateTime, mailData.LimitDays);
+                txtDate.text = expiryDay > 0 ? Language.Get("Mail07", expiryDay) : model.FormatCreateMailTime(mailData.CreateDateTime);
+            }
+            btnMail.SetListener(OnClickButtonMail);
+        }
+
+        private void OnClickButtonMail()
+        {
+            model.nowUuid = uuid;
+            if (!model.TryGetMailData(uuid, out var mailData) || mailData == null)
+                return;
+            if (mailData.MailState == 1)
+            {
+                model.ReadMail(uuid);
+            }
+            UIManager.Instance.OpenWindow<MailInfoWin>();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/Mail/MailPersonalCell.cs.meta b/Main/Mail/MailPersonalCell.cs.meta
new file mode 100644
index 0000000..2d0f7ba
--- /dev/null
+++ b/Main/Mail/MailPersonalCell.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 9b2f93157b0f88549b156091e0a828d8
+timeCreated: 1508570733
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Mail/MailWin.cs b/Main/Mail/MailWin.cs
new file mode 100644
index 0000000..91da8dd
--- /dev/null
+++ b/Main/Mail/MailWin.cs
@@ -0,0 +1,173 @@
+锘縰sing System;
+using UnityEngine;
+namespace vnxbqy.UI
+{
+    public class MailWin : UIBase
+    {
+        [SerializeField] Transform transPersonal;
+        [SerializeField] Transform transGlobal;
+        [SerializeField] ScrollerController scrPersonal;
+        [SerializeField] ScrollerController scrGlobal;
+        [SerializeField] ButtonEx btnDeleteRead;
+        [SerializeField] ButtonEx btnClaimAll;
+        [SerializeField] ToggleEx togTab0;
+        [SerializeField] RedpointBehaviour rpTab0;
+        [SerializeField] ToggleEx togTab1;
+        [SerializeField] RedpointBehaviour rpTab1;
+        [SerializeField] Transform transNoMail;
+        MailManager model { get { return MailManager.Instance; } }
+        protected override void InitComponent()
+        {
+            base.InitComponent();
+            btnDeleteRead.SetListener(OnDeleteRead);
+            btnClaimAll.SetListener(OnClaimAll);
+            togTab0.SetListener(OnTab0);
+            togTab1.SetListener(OnTab1);
+        }
+
+        protected override void OnPreOpen()
+        {
+            model.OnUpdateMailListEvent += OnUpdateMailListEvent;
+            model.OnUpdateMailStateChangeEvent += OnUpdateMailStateChangeEvent;
+            scrPersonal.OnRefreshCell += OnRefreshPersonalCell;
+            scrGlobal.OnRefreshCell += OnRefreshGlobalCell;
+            
+            rpTab0.redpointId = model.GetTabRedpointId(MailCategory.Personal);
+            rpTab1.redpointId = model.GetTabRedpointId(MailCategory.Global);
+            transNoMail.SetActive(false);
+        }
+
+        protected override void OnPreClose()
+        {
+            model.OnUpdateMailListEvent -= OnUpdateMailListEvent;
+            model.OnUpdateMailStateChangeEvent -= OnUpdateMailStateChangeEvent;
+            scrPersonal.OnRefreshCell -= OnRefreshPersonalCell;
+            scrGlobal.OnRefreshCell -= OnRefreshGlobalCell;
+        }
+
+        private void OnTab0(bool value)
+        {
+            if (value)
+            {
+                transPersonal.SetActive(true);
+                transGlobal.SetActive(false);
+                model.nowMailCategory = MailCategory.Personal;
+                CreatePersonalScr(model.nowMailCategory);
+            }
+        }
+
+        private void OnTab1(bool value)
+        {
+            if (value)
+            {
+                transPersonal.SetActive(false);
+                transGlobal.SetActive(true);
+                model.nowMailCategory = MailCategory.Global;
+                CreateGlobalScr(model.nowMailCategory);
+            }
+        }
+
+        protected override void OnOpen()
+        {
+            togTab0.isOn = true;
+            togTab1.isOn = false;
+            model.nowMailCategory = MailCategory.Personal;
+            CreatePersonalScr(model.nowMailCategory);
+        }
+
+        private void OnRefreshPersonalCell(ScrollerDataType type, CellView cell)
+        {
+            var _cell = cell.GetComponent<MailPersonalCell>();
+            _cell?.Display(cell.index, cell);
+        }
+
+        private void OnRefreshGlobalCell(ScrollerDataType type, CellView cell)
+        {
+            var _cell = cell.GetComponent<MailGlobalCell>();
+            _cell?.Display(cell.index, cell);
+        }
+
+        private void OnDeleteRead()
+        {
+            ConfirmCancel.ShowPopConfirm(
+                Language.Get("Mail101"),
+                Language.Get("Mail10"),
+                (bool isOk) =>
+                {
+                    if (isOk)
+                    {
+                        model.DeleteMail();
+                        //閭欢鍒犻櫎鎴愬姛
+                        SysNotifyMgr.Instance.ShowTip("Mail01");
+                    }
+                });
+        }
+
+        private void OnClaimAll()
+        {
+            if (!model.IsCanHaveMail())
+            {
+                SysNotifyMgr.Instance.ShowTip("Mail02");
+                return;
+            }
+            model.ClaimMail();
+        }
+
+        public void CreatePersonalScr(MailCategory mailCategory)
+        {
+            scrPersonal.Refresh();
+            var list = model.GetSortMailScrList(mailCategory);
+            if (list != null)
+            {
+                for (int i = 0; i < list.Count; i++)
+                {
+                    CellInfo cellInfo = new CellInfo();
+                    cellInfo.infoInt1 = (int)mailCategory;
+                    scrPersonal.AddCell(ScrollerDataType.Header, i, cellInfo);
+                }
+            }
+            scrPersonal.Restart();
+        }
+        public void CreateGlobalScr(MailCategory mailCategory)
+        {
+            scrGlobal.Refresh();
+            var list = model.GetSortMailScrList(mailCategory);
+            if (list != null)
+            {
+                for (int i = 0; i < list.Count; i++)
+                {
+                    CellInfo cellInfo = new CellInfo();
+                    cellInfo.infoInt1 = (int)mailCategory;
+                    scrGlobal.AddCell(ScrollerDataType.Header, i, cellInfo);
+                }
+            }
+            scrGlobal.Restart();
+        }
+
+        private void OnUpdateMailStateChangeEvent()
+        {
+            RefreshScr();
+        }
+
+        private void OnUpdateMailListEvent()
+        {
+            RefreshScr();
+        }
+
+        private void RefreshScr()
+        { 
+            var list = model.GetSortMailScrList(model.nowMailCategory);
+            if (list.IsNullOrEmpty())
+            {
+                transNoMail.SetActive(true);
+            }
+            else
+            {
+                transNoMail.SetActive(false);
+                scrPersonal.m_Scorller.RefreshActiveCellViews();
+                scrGlobal.m_Scorller.RefreshActiveCellViews();
+            }
+        }
+    }
+}
+
diff --git a/Main/Mail/MailWin.cs.meta b/Main/Mail/MailWin.cs.meta
new file mode 100644
index 0000000..38b2ed7
--- /dev/null
+++ b/Main/Mail/MailWin.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 19dce65856f34284e9a1e1a192e3e348
+timeCreated: 1501491107
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Manager/GameSystemManager/MailManager.cs b/Main/Manager/GameSystemManager/MailManager.cs
index 0c26623..bf933e8 100644
--- a/Main/Manager/GameSystemManager/MailManager.cs
+++ b/Main/Manager/GameSystemManager/MailManager.cs
@@ -241,10 +241,13 @@
             pack.ReqType = ReqType;
             GameNetSystem.Instance.SendInfo(pack);
         }
-        //娌℃湁涓�涓彲棰嗗彇鐨勯偖浠�
+        
+        //娌℃湁涓�涓彲棰嗗彇鐨勪釜浜洪偖浠�
         public bool IsCanHaveMail()
         {
-            return mailDataDict.Values.Any(mail =>
+            var personalMails = GetMailList(MailCategory.Personal);
+            return personalMails.Any(guid =>
+                mailDataDict.TryGetValue(guid, out var mail) &&
                 mail.MailState != 3 &&
                 mail.Items != null &&
                 mail.Items.Count > 0

--
Gitblit v1.8.0