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