From 0f930dcf30365ccddaada8393a9e889bab4d0547 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期一, 26 五月 2025 10:53:28 +0800
Subject: [PATCH] 59 子 【常规】邮件系统 / 【常规】邮件系统-客户端 预提交MailModel解除报错

---
 Main/Mail/MailModel.cs      |  258 +++++++++++++++++++++++++++++++++++++++++++++++++++
 Main/Mail/MailModel.cs.meta |   11 ++
 2 files changed, 269 insertions(+), 0 deletions(-)

diff --git a/Main/Mail/MailModel.cs b/Main/Mail/MailModel.cs
new file mode 100644
index 0000000..9138ec5
--- /dev/null
+++ b/Main/Mail/MailModel.cs
@@ -0,0 +1,258 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using vnxbqy.UI;
+
+public class MailModel : ManagerBase<MailModel>
+{
+    /// <summary>
+    /// 閭欢鏁版嵁瀛楀吀锛屽瓨鍌ㄦ墍鏈夐偖浠惰鎯�
+    /// Key: 閭欢GUID(鍞竴鏍囪瘑)
+    /// Value: 閭欢璇︾粏鏁版嵁(MailData缁撴瀯浣�)
+    /// </summary>
+    Dictionary<string, MailData> mailDataDict = new Dictionary<string, MailData>();
+    public MailCategory nowMailCategory = MailCategory.Personal;
+    public Redpoint parentRedpoint = new Redpoint(MainRedDot.MailRepoint);
+    public Redpoint tabRedpoint0;
+    public Redpoint tabRedpoint1;
+    public event Action OnUpdateMailListEvent;// 鏇存柊閭欢鍒楄〃鏁版嵁
+    public event Action OnUpdateMailStateChangeEvent;// 鏇存柊閭欢鐘舵�佸彉鏇�
+
+    public readonly string dateFormat = "yyyy-MM-dd";
+    public override void Init()
+    {
+        tabRedpoint0 = new Redpoint(MainRedDot.MailRepoint, GetTabRedpointId(MailCategory.Personal));
+        tabRedpoint1 = new Redpoint(MainRedDot.MailRepoint, GetTabRedpointId(MailCategory.Global));
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
+    }
+
+    public void OnBeforePlayerDataInitializeEvent()
+    {
+        mailDataDict.Clear();
+    }
+
+    public bool HasNoReadMail(MailCategory category)
+    {
+        var list = GetMailList(category);
+        if (list.IsNullOrEmpty())
+            return false;
+
+        foreach (var guid in list)
+        {
+            if (mailDataDict.TryGetValue(guid, out var mailData) && mailData.MailState == 1)
+                return true;
+        }
+        return false;
+    }
+
+    public int GetTabRedpointId(MailCategory type)
+    {
+        return MainRedDot.MailRepoint * 10 + (int)type;
+    }
+
+    public void UpdatePersonalRedPoint()
+    {
+        if (tabRedpoint0 == null)
+            return;
+        tabRedpoint0.state = RedPointState.None;
+        if (HasNoReadMail(MailCategory.Personal))
+        {
+            tabRedpoint0.state = RedPointState.Simple;
+        }
+    }
+
+    public void UpdateGlobalRedPoint()
+    {
+        if (tabRedpoint1 == null) return;
+        tabRedpoint1.state = RedPointState.None;
+        if (HasNoReadMail(MailCategory.Global))
+        {
+            tabRedpoint1.state = RedPointState.Simple;
+        }
+    }
+
+    /// <summary>
+    /// 鏇存柊閭欢绾㈢偣鎻愮ず鐘舵��
+    /// </summary>
+    public void UpdateRedPoint()
+    {
+        UpdatePersonalRedPoint();
+        UpdateGlobalRedPoint();
+    }
+
+    public bool TryGetMailData(string uuid, out MailData mailData)
+    {
+        return mailDataDict.TryGetValue(uuid, out mailData);
+    }
+
+    // // 閭欢鏄惁鏈夋晥
+    // public bool IsMailLimit(DateTime CreateDateTime, int limitDays)
+    // {
+    //     TimeSpan timeSpan = TimeUtility.ServerNow - CreateDateTime;
+    //     double totalDays = timeSpan.TotalDays;
+    //     return totalDays > limitDays;
+    // }
+
+    public List<string> GetMailList(MailCategory mailCategory)
+    {
+        var result = new List<string>();
+        foreach (var kvp in mailDataDict)
+        {
+            if (kvp.Value.Category == mailCategory)
+            {
+                result.Add(kvp.Key);
+            }
+        }
+        return result;
+    }
+
+    public List<string> GetSortMailScrList(MailCategory mailCategory)
+    {
+        List<string> resList = GetMailList(mailCategory);
+        return resList.OrderByDescending(guid => mailDataDict[guid].CreateDateTime).ToList();
+    }
+
+    /// <summary>
+    /// 鏇存柊閭欢鍒楄〃鏁版嵁
+    /// </summary>
+    /// <param name="vNetData">浠庢湇鍔″櫒鎺ユ敹鐨勯偖浠跺垪琛ㄦ暟鎹寘</param>
+    public void UpdateMailList(HA362_tagMCMailList vNetData)
+    {
+        if (vNetData == null) return;
+
+        // 鏇存柊閭欢鏁版嵁瀛楀吀
+        foreach (var mail in vNetData.MailList)
+        {
+            var category = vNetData.IsServerMail == 1 ? MailCategory.Global : MailCategory.Personal;
+            var mailData = new MailData();
+
+            mailData.Category = category;
+            mailData.GUID = mail.GUID;
+            mailData.Type = mail.Type;
+            mailData.CreateTime = mail.CreateTime;
+            mailData.CreateDateTime = Convert.ToDateTime(UIHelper.GetTime(mail.CreateTime));
+            mailData.LimitDays = mail.LimitDays;
+            mailData.Title = mail.Title;
+            mailData.Text = mail.Text;
+            mailData.MailState = mail.MailState;
+
+            mailData.Items = mail.Items?.Select(i => new MailItemData
+            {
+                ItemID = i.ItemID,
+                Count = i.Count,
+                IsBind = i.IsBind,
+                UserData = i.UserData
+            }).ToList();
+            mailDataDict[mail.GUID] = mailData;
+        }
+
+        UpdateRedPoint();
+        OnUpdateMailListEvent?.Invoke();
+    }
+
+    /// <summary>
+    /// 鏇存柊閭欢鐘舵�佸彉鏇�
+    /// </summary>
+    /// <param name="vNetData">浠庢湇鍔″櫒鎺ユ敹鐨勯偖浠剁姸鎬佸彉鏇存暟鎹寘</param>
+    public void UpdateMailStateChange(HA363_tagMCMailStateChange vNetData)
+    {
+        if (vNetData == null || vNetData.MailList == null) return;
+
+        foreach (var stateChange in vNetData.MailList)
+        {
+            if (mailDataDict.TryGetValue(stateChange.GUID, out var mailData))
+            {
+                if (stateChange.MailState == 4)
+                {
+                    mailDataDict.Remove(stateChange.GUID);
+                    continue;
+                }
+                mailData.MailState = stateChange.MailState;
+                mailDataDict[stateChange.GUID] = mailData;
+            }
+        }
+
+        UpdateRedPoint();
+        OnUpdateMailStateChangeEvent?.Invoke();
+    }
+
+
+    /// <summary>
+    /// 闃呰閭欢
+    /// </summary>
+    /// <param name="GUID">閭欢GUID</param>
+    public void ReadMail(string GUID)
+    {
+        if (string.IsNullOrEmpty(GUID))
+        {
+            Debug.LogError("闃呰閭欢GUID涓嶈兘涓虹┖");
+            return;
+        }
+        SendRequestMail(GUID, 0);
+    }
+
+    /// <summary>
+    /// 棰嗗彇閭欢
+    /// </summary>
+    /// <param name="GUID">閭欢GUID锛屼负绌烘椂鎵归噺棰嗗彇鎵�鏈夐偖浠�</param>
+    public void ClaimMail(string GUID = null)
+    {
+        SendRequestMail(GUID, 1);
+    }
+
+    /// <summary>
+    /// 鍒犻櫎閭欢
+    /// </summary>
+    /// <param name="GUID">閭欢GUID锛屼负绌烘椂鎵归噺鍒犻櫎宸查鍙栨垨鏃犵墿鍝佺殑宸茶閭欢</param>
+    public void DeleteMail(string GUID = null)
+    {
+        SendRequestMail(GUID, 2);
+    }
+
+    /// <summary>
+    /// 鍙戦�侀偖浠惰姹傚埌鏈嶅姟鍣�
+    /// </summary>
+    /// <param name="GUID">閭欢GUID</param>
+    /// <param name="ReqType">璇锋眰绫诲瀷 0-璁剧疆宸茶锛�1-棰嗗彇閭欢锛�2-鍒犻櫎閭欢</param>
+    public void SendRequestMail(string GUID, byte ReqType)
+    {
+        CA537_tagCMRequestMail pack = new CA537_tagCMRequestMail();
+        pack.GUID = GUID;
+        pack.ReqType = ReqType;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+}
+
+public enum MailCategory
+{
+    Personal = 0,  // 涓汉閭欢
+    Global = 1     // 鍏ㄦ湇閭欢
+}
+
+public class MailItemData
+{
+    public uint ItemID;        //鐗╁搧ID
+    public uint Count;        //鏁伴噺
+    public byte IsBind;        //鏄惁缁戝畾
+    public string UserData;        //鑷畾涔夋暟鎹�	
+}
+
+public class MailData
+{
+    public MailCategory Category;
+    public string GUID;        //閭欢GUID
+    public byte Type;        //閭欢绫诲瀷锛屾殏鏃堕粯璁�0
+    public string CreateTime;        //鍒涘缓鏃堕棿
+    public DateTime CreateDateTime;
+    public byte LimitDays;        //鏈夋晥澶╂暟
+    public string Title;        //鏍囬
+    public string Text;        //鍐呭
+    public byte MailState;        //閭欢鐘舵�侊細 0-鏈煡锛�1-鏈锛�2-宸茶锛�3-宸查锛�
+    public List<MailItemData> Items;        //鐗╁搧淇℃伅
+}
\ No newline at end of file
diff --git a/Main/Mail/MailModel.cs.meta b/Main/Mail/MailModel.cs.meta
new file mode 100644
index 0000000..ba445cb
--- /dev/null
+++ b/Main/Mail/MailModel.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5891ab4254cba5c4fa49e6bbb28b94d3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

--
Gitblit v1.8.0