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